From d97aae789a840084bcf5935d0c0cad51f136db80 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:53:25 +0000 Subject: [PATCH 1/2] Add shared agent-first UI and isolated Electron desktop client --- README.md | 7 +- THIRD_PARTY_NOTICES.md | 31 + bun.lock | 274 +++++++++ docs/PLANNING.md | 4 +- docs/plans/codex-ui/001_ui_plan.md | 2 + .../codex-ui/003_clipboard_attachment.md | 2 + docs/plans/codex-ui/004_electron_stack.md | 2 + docs/plans/codex-ui/006_agent_list_mobile.md | 2 + docs/plans/codex-ui/007_sidebar_comparison.md | 2 + docs/plans/codex-ui/010_implementation.md | 126 +++++ docs/plans/codex-ui/010_ui_desktop.png | Bin 0 -> 121410 bytes docs/plans/codex-ui/010_ui_mobile.png | Bin 0 -> 48589 bytes docs/plans/codex-ui/010_ui_models.png | Bin 0 -> 125002 bytes docs/plans/codex-ui/010_ui_task_layout.png | Bin 0 -> 131841 bytes package.json | 2 +- packages/lina-client/package.json | 7 + packages/lina-client/src/agent-list.ts | 224 ++++++++ .../src}/attachment-draft.ts | 10 +- packages/lina-client/src/attachment-queue.ts | 300 ++++++++++ .../client => lina-client/src}/connection.ts | 2 +- .../src}/context-model.ts | 0 .../client => lina-client/src}/draft.ts | 0 .../src}/durable-model.ts | 2 +- .../src}/execution-model.ts | 0 .../client => lina-client/src}/model.ts | 2 +- packages/lina-client/src/navigation-state.ts | 44 ++ packages/lina-client/src/platform.ts | 13 + .../client => lina-client/src}/preferences.ts | 2 +- packages/lina-client/src/protocol.ts | 79 +++ .../src}/search-model.ts | 0 packages/lina-client/src/task-drafts.ts | 98 ++++ packages/lina-client/src/task-types.ts | 38 ++ packages/lina-desktop/.gitignore | 3 + packages/lina-desktop/README.md | 216 +++++++ packages/lina-desktop/biome.json | 5 + packages/lina-desktop/forge.config.cjs | 21 + packages/lina-desktop/package.json | 26 + packages/lina-desktop/scripts/build.ts | 27 + .../lina-desktop/scripts/bundle-assets.ts | 50 ++ packages/lina-desktop/scripts/qa-node.ts | 65 +++ packages/lina-desktop/src/broker.ts | 163 ++++++ packages/lina-desktop/src/bundled-assets.ts | 41 ++ packages/lina-desktop/src/config.ts | 97 ++++ packages/lina-desktop/src/http-proxy.ts | 98 ++++ packages/lina-desktop/src/main.ts | 100 ++++ packages/lina-desktop/src/preload.ts | 13 + packages/lina-desktop/src/routes.ts | 92 +++ packages/lina-desktop/src/session.ts | 71 +++ packages/lina-desktop/src/socket-proxy.ts | 92 +++ packages/lina-desktop/src/window-policy.ts | 57 ++ packages/lina-desktop/src/window.ts | 160 ++++++ packages/lina-desktop/test/assets.test.ts | 41 ++ packages/lina-desktop/test/broker.test.ts | 344 ++++++++++++ packages/lina-desktop/test/config.test.ts | 92 +++ packages/lina-desktop/test/lifecycle.test.ts | 118 ++++ .../lina-desktop/test/node-runtime.test.ts | 29 + packages/lina-desktop/test/preload.test.ts | 148 +++++ packages/lina-desktop/test/session.test.ts | 50 ++ .../lina-desktop/test/web-contract.test.ts | 101 ++++ .../lina-desktop/test/window-policy.test.ts | 53 ++ packages/lina-desktop/tsconfig.build.json | 5 + packages/lina-desktop/tsconfig.json | 9 + .../lina-runtime/src/fleet/agent-summaries.ts | 134 +++++ packages/lina-runtime/src/fleet/server.ts | 7 +- packages/lina-ui/SOURCES.md | 25 + packages/lina-ui/THIRD_PARTY_LICENSES.txt | 309 ++++++++++ .../{lina-web => lina-ui}/client/activity.css | 0 .../client/agent-editor.ts | 0 packages/lina-ui/client/agent-list.ts | 75 +++ .../client/agent-templates.ts | 0 .../{lina-web => lina-ui}/client/agents.css | 138 +++-- .../{lina-web => lina-ui}/client/agents.ts | 316 ++++++----- packages/{lina-web => lina-ui}/client/app.ts | 0 packages/lina-ui/client/attachments.css | 28 + packages/lina-ui/client/attachments.ts | 284 ++++++++++ .../{lina-web => lina-ui}/client/base.css | 11 +- .../{lina-web => lina-ui}/client/chat.css | 39 +- .../lina-ui/client/clipboard-attachments.ts | 31 + .../client/companion.css | 92 +-- .../lina-ui/client/components/action-menu.tsx | 137 +++++ .../lina-ui/client/components/agent-list.tsx | 253 +++++++++ packages/lina-ui/client/components/icons.tsx | 24 + .../client/components/model-combobox.tsx | 132 +++++ packages/lina-ui/client/components/mount.ts | 17 + .../client/components/settings-tabs.tsx | 71 +++ .../client/components/task-layout-control.tsx | 28 + .../client/components/theme-controls.tsx | 32 ++ .../lina-ui/client/components/ui/avatar.tsx | 21 + .../lina-ui/client/components/ui/button.tsx | 22 + .../lina-ui/client/components/ui/combobox.tsx | 34 ++ .../client/components/ui/dropdown-menu.tsx | 41 ++ .../lina-ui/client/components/ui/tabs.tsx | 19 + .../client/composer-size.ts | 0 packages/lina-ui/client/composer.css | 124 ++++ .../client/context-view.ts | 2 +- .../{lina-web => lina-ui}/client/context.css | 0 packages/lina-ui/client/controls.css | 125 +++++ packages/lina-ui/client/conversation-app.ts | 531 ++++++++++++++++++ .../client/conversation-draft.ts | 0 .../client/conversation-editor.ts | 0 .../client/execution-view.ts | 16 +- .../client/execution.css | 57 +- .../{lina-web => lina-ui}/client/favicon.svg | 0 .../client/hub-settings.css | 8 +- .../client/hub-settings.ts | 0 .../{lina-web => lina-ui}/client/icon-192.png | Bin .../{lina-web => lina-ui}/client/icon-512.png | Bin .../{lina-web => lina-ui}/client/index.html | 38 +- .../{lina-web => lina-ui}/client/intro-api.ts | 0 .../{lina-web => lina-ui}/client/intro-app.ts | 2 +- .../client/intro-connection.ts | 0 .../client/intro-model.ts | 0 .../client/intro-types.ts | 0 .../client/intro-view.ts | 0 .../{lina-web => lina-ui}/client/intro.css | 110 ++-- .../client/markdown-inline.ts | 0 .../client/markdown-parser.ts | 0 .../client/markdown-types.ts | 0 .../{lina-web => lina-ui}/client/markdown.css | 0 .../{lina-web => lina-ui}/client/markdown.ts | 0 .../{lina-web => lina-ui}/client/mind-view.ts | 0 .../lina-ui/client/model-combobox-types.ts | 26 + packages/lina-ui/client/model-combobox.ts | 40 ++ .../client/model-settings.ts | 122 ++-- packages/lina-ui/client/navigation.css | 228 ++++++++ packages/lina-ui/client/navigation.ts | 308 ++++++++++ .../client/onboarding-api.ts | 0 .../client/onboarding-model.ts | 0 .../client/onboarding-navigation.ts | 0 .../client/onboarding-types.ts | 0 .../client/onboarding.css | 146 +++-- .../client/onboarding.ts | 0 .../{lina-web => lina-ui}/client/presence.ts | 0 packages/{lina-web => lina-ui}/client/pwa.css | 113 ++-- packages/{lina-web => lina-ui}/client/pwa.ts | 16 +- packages/lina-ui/client/reading-position.ts | 92 +++ .../{lina-web => lina-ui}/client/recovery.css | 0 .../{lina-web => lina-ui}/client/recovery.ts | 4 +- .../{lina-web => lina-ui}/client/render.ts | 19 +- .../client/responsive.css | 28 +- .../client/search-view.ts | 7 +- .../{lina-web => lina-ui}/client/search.css | 44 +- packages/lina-ui/client/settings-dom.ts | 41 ++ .../client/settings-navigation.css | 127 ++--- packages/lina-ui/client/settings-tab-model.ts | 2 + packages/lina-ui/client/settings-tabs.ts | 56 ++ .../{lina-web => lina-ui}/client/settings.css | 106 ++-- .../{lina-web => lina-ui}/client/settings.ts | 9 +- .../client/sidebar-resize.ts | 2 +- .../{lina-web => lina-ui}/client/sidebar.css | 298 ++++++++-- .../{lina-web => lina-ui}/client/styles.css | 2 + packages/lina-ui/client/task-list.ts | 123 ++++ .../{lina-web => lina-ui}/client/task-view.ts | 330 +++++++---- .../{lina-web => lina-ui}/client/tasks.css | 130 ++++- .../client/theme-boot.ts | 0 .../client/theme-controls.ts | 33 +- .../{lina-web => lina-ui}/client/theme.ts | 0 packages/lina-ui/client/tokens.css | 69 +++ .../client/tool-label.ts | 0 .../{lina-web => lina-ui}/client/tool-view.ts | 2 +- packages/lina-ui/client/tsconfig.json | 10 + packages/lina-ui/package.json | 16 + packages/lina-web/DESIGN.md | 37 +- packages/lina-web/client/attachments.ts | 222 -------- packages/lina-web/client/composer.css | 88 --- packages/lina-web/client/conversation-app.ts | 288 ---------- packages/lina-web/client/model-combobox.ts | 285 ---------- packages/lina-web/client/navigation.ts | 198 ------- .../lina-web/client/settings-tab-model.ts | 22 - packages/lina-web/client/settings-tabs.ts | 57 -- packages/lina-web/client/tokens.css | 52 -- packages/lina-web/client/tsconfig.json | 6 - packages/lina-web/scripts/qa-pwa.ts | 2 +- packages/lina-web/src/assets.ts | 17 +- packages/lina-web/src/protocol.ts | 80 +-- packages/lina-web/src/server.ts | 2 +- packages/lina-web/test/agent-draft.test.ts | 2 +- packages/lina-web/test/agent-editor.test.ts | 2 +- packages/lina-web/test/agent-list.test.ts | 312 ++++++++++ .../lina-web/test/attachment-draft.test.ts | 5 +- .../lina-web/test/attachment-queue.test.ts | 241 ++++++++ .../test/clipboard-attachments.test.ts | 398 +++++++++++++ packages/lina-web/test/connection.test.ts | 4 +- packages/lina-web/test/context-model.test.ts | 4 +- .../lina-web/test/conversation-editor.test.ts | 2 +- packages/lina-web/test/draft.test.ts | 2 +- packages/lina-web/test/durable-model.test.ts | 2 +- .../lina-web/test/execution-model.test.ts | 2 +- .../lina-web/test/fixtures/codex-only-ui.ts | 2 +- .../lina-web/test/fixtures/model-combobox.ts | 55 ++ packages/lina-web/test/fixtures/ui-desktop.ts | 469 ++++++++++++++++ packages/lina-web/test/hub-ui.test.ts | 50 +- .../lina-web/test/intro-connection.test.ts | 2 +- packages/lina-web/test/intro-flow.test.ts | 6 +- packages/lina-web/test/intro-starter.test.ts | 7 +- packages/lina-web/test/markdown.test.ts | 2 +- packages/lina-web/test/mind-view.test.ts | 6 +- packages/lina-web/test/model-combobox.test.ts | 271 --------- .../lina-web/test/model-settings-ui.test.ts | 106 ++-- packages/lina-web/test/model-settings.test.ts | 2 +- packages/lina-web/test/model.test.ts | 2 +- .../lina-web/test/navigation-state.test.ts | 49 ++ .../test/onboarding-controller.test.ts | 6 +- .../lina-web/test/onboarding-model.test.ts | 6 +- packages/lina-web/test/preferences.test.ts | 18 +- packages/lina-web/test/presence.test.ts | 2 +- packages/lina-web/test/protocol.test.ts | 2 +- packages/lina-web/test/pwa-assets.test.ts | 2 + packages/lina-web/test/search-model.test.ts | 2 +- .../lina-web/test/shared-renderer.test.ts | 14 + packages/lina-web/test/task-drafts.test.ts | 64 +++ packages/lina-web/test/task-ui.browser.mjs | 159 ++++++ packages/lina-web/test/task-ui.test.ts | 321 ++++++++++- packages/lina-web/test/theme.test.ts | 2 +- packages/lina-web/test/tool-label.test.ts | 2 +- packages/lina-web/test/tool-view.test.ts | 4 +- scripts/qa/ui-agent-list.mjs | 447 +++++++++++++++ scripts/qa/ui-components.mjs | 113 ++++ scripts/qa/ui-design.mjs | 176 ++++++ scripts/qa/ui-desktop.mjs | 314 +++++++++++ scripts/qa/ui-model-combobox.mjs | 528 +++++++++++++++++ scripts/qa/ui-navigation-regressions.mjs | 168 ++++++ scripts/qa/ui-settings-islands.mjs | 394 +++++++++++++ scripts/qa/ui-task-layout.mjs | 134 +++++ scripts/qa/ui-task-restart.mjs | 66 +++ tsconfig.json | 3 +- 226 files changed, 13210 insertions(+), 2642 deletions(-) create mode 100644 docs/plans/codex-ui/010_implementation.md create mode 100644 docs/plans/codex-ui/010_ui_desktop.png create mode 100644 docs/plans/codex-ui/010_ui_mobile.png create mode 100644 docs/plans/codex-ui/010_ui_models.png create mode 100644 docs/plans/codex-ui/010_ui_task_layout.png create mode 100644 packages/lina-client/package.json create mode 100644 packages/lina-client/src/agent-list.ts rename packages/{lina-web/client => lina-client/src}/attachment-draft.ts (87%) create mode 100644 packages/lina-client/src/attachment-queue.ts rename packages/{lina-web/client => lina-client/src}/connection.ts (98%) rename packages/{lina-web/client => lina-client/src}/context-model.ts (100%) rename packages/{lina-web/client => lina-client/src}/draft.ts (100%) rename packages/{lina-web/client => lina-client/src}/durable-model.ts (99%) rename packages/{lina-web/client => lina-client/src}/execution-model.ts (100%) rename packages/{lina-web/client => lina-client/src}/model.ts (97%) create mode 100644 packages/lina-client/src/navigation-state.ts create mode 100644 packages/lina-client/src/platform.ts rename packages/{lina-web/client => lina-client/src}/preferences.ts (98%) create mode 100644 packages/lina-client/src/protocol.ts rename packages/{lina-web/client => lina-client/src}/search-model.ts (100%) create mode 100644 packages/lina-client/src/task-drafts.ts create mode 100644 packages/lina-client/src/task-types.ts create mode 100644 packages/lina-desktop/.gitignore create mode 100644 packages/lina-desktop/README.md create mode 100644 packages/lina-desktop/biome.json create mode 100644 packages/lina-desktop/forge.config.cjs create mode 100644 packages/lina-desktop/package.json create mode 100644 packages/lina-desktop/scripts/build.ts create mode 100644 packages/lina-desktop/scripts/bundle-assets.ts create mode 100644 packages/lina-desktop/scripts/qa-node.ts create mode 100644 packages/lina-desktop/src/broker.ts create mode 100644 packages/lina-desktop/src/bundled-assets.ts create mode 100644 packages/lina-desktop/src/config.ts create mode 100644 packages/lina-desktop/src/http-proxy.ts create mode 100644 packages/lina-desktop/src/main.ts create mode 100644 packages/lina-desktop/src/preload.ts create mode 100644 packages/lina-desktop/src/routes.ts create mode 100644 packages/lina-desktop/src/session.ts create mode 100644 packages/lina-desktop/src/socket-proxy.ts create mode 100644 packages/lina-desktop/src/window-policy.ts create mode 100644 packages/lina-desktop/src/window.ts create mode 100644 packages/lina-desktop/test/assets.test.ts create mode 100644 packages/lina-desktop/test/broker.test.ts create mode 100644 packages/lina-desktop/test/config.test.ts create mode 100644 packages/lina-desktop/test/lifecycle.test.ts create mode 100644 packages/lina-desktop/test/node-runtime.test.ts create mode 100644 packages/lina-desktop/test/preload.test.ts create mode 100644 packages/lina-desktop/test/session.test.ts create mode 100644 packages/lina-desktop/test/web-contract.test.ts create mode 100644 packages/lina-desktop/test/window-policy.test.ts create mode 100644 packages/lina-desktop/tsconfig.build.json create mode 100644 packages/lina-desktop/tsconfig.json create mode 100644 packages/lina-runtime/src/fleet/agent-summaries.ts create mode 100644 packages/lina-ui/SOURCES.md create mode 100644 packages/lina-ui/THIRD_PARTY_LICENSES.txt rename packages/{lina-web => lina-ui}/client/activity.css (100%) rename packages/{lina-web => lina-ui}/client/agent-editor.ts (100%) create mode 100644 packages/lina-ui/client/agent-list.ts rename packages/{lina-web => lina-ui}/client/agent-templates.ts (100%) rename packages/{lina-web => lina-ui}/client/agents.css (64%) rename packages/{lina-web => lina-ui}/client/agents.ts (52%) rename packages/{lina-web => lina-ui}/client/app.ts (100%) create mode 100644 packages/lina-ui/client/attachments.css create mode 100644 packages/lina-ui/client/attachments.ts rename packages/{lina-web => lina-ui}/client/base.css (80%) rename packages/{lina-web => lina-ui}/client/chat.css (86%) create mode 100644 packages/lina-ui/client/clipboard-attachments.ts rename packages/{lina-web => lina-ui}/client/companion.css (73%) create mode 100644 packages/lina-ui/client/components/action-menu.tsx create mode 100644 packages/lina-ui/client/components/agent-list.tsx create mode 100644 packages/lina-ui/client/components/icons.tsx create mode 100644 packages/lina-ui/client/components/model-combobox.tsx create mode 100644 packages/lina-ui/client/components/mount.ts create mode 100644 packages/lina-ui/client/components/settings-tabs.tsx create mode 100644 packages/lina-ui/client/components/task-layout-control.tsx create mode 100644 packages/lina-ui/client/components/theme-controls.tsx create mode 100644 packages/lina-ui/client/components/ui/avatar.tsx create mode 100644 packages/lina-ui/client/components/ui/button.tsx create mode 100644 packages/lina-ui/client/components/ui/combobox.tsx create mode 100644 packages/lina-ui/client/components/ui/dropdown-menu.tsx create mode 100644 packages/lina-ui/client/components/ui/tabs.tsx rename packages/{lina-web => lina-ui}/client/composer-size.ts (100%) create mode 100644 packages/lina-ui/client/composer.css rename packages/{lina-web => lina-ui}/client/context-view.ts (97%) rename packages/{lina-web => lina-ui}/client/context.css (100%) create mode 100644 packages/lina-ui/client/controls.css create mode 100644 packages/lina-ui/client/conversation-app.ts rename packages/{lina-web => lina-ui}/client/conversation-draft.ts (100%) rename packages/{lina-web => lina-ui}/client/conversation-editor.ts (100%) rename packages/{lina-web => lina-ui}/client/execution-view.ts (87%) rename packages/{lina-web => lina-ui}/client/execution.css (73%) rename packages/{lina-web => lina-ui}/client/favicon.svg (100%) rename packages/{lina-web => lina-ui}/client/hub-settings.css (87%) rename packages/{lina-web => lina-ui}/client/hub-settings.ts (100%) rename packages/{lina-web => lina-ui}/client/icon-192.png (100%) rename packages/{lina-web => lina-ui}/client/icon-512.png (100%) rename packages/{lina-web => lina-ui}/client/index.html (51%) rename packages/{lina-web => lina-ui}/client/intro-api.ts (100%) rename packages/{lina-web => lina-ui}/client/intro-app.ts (99%) rename packages/{lina-web => lina-ui}/client/intro-connection.ts (100%) rename packages/{lina-web => lina-ui}/client/intro-model.ts (100%) rename packages/{lina-web => lina-ui}/client/intro-types.ts (100%) rename packages/{lina-web => lina-ui}/client/intro-view.ts (100%) rename packages/{lina-web => lina-ui}/client/intro.css (72%) rename packages/{lina-web => lina-ui}/client/markdown-inline.ts (100%) rename packages/{lina-web => lina-ui}/client/markdown-parser.ts (100%) rename packages/{lina-web => lina-ui}/client/markdown-types.ts (100%) rename packages/{lina-web => lina-ui}/client/markdown.css (100%) rename packages/{lina-web => lina-ui}/client/markdown.ts (100%) rename packages/{lina-web => lina-ui}/client/mind-view.ts (100%) create mode 100644 packages/lina-ui/client/model-combobox-types.ts create mode 100644 packages/lina-ui/client/model-combobox.ts rename packages/{lina-web => lina-ui}/client/model-settings.ts (89%) create mode 100644 packages/lina-ui/client/navigation.css create mode 100644 packages/lina-ui/client/navigation.ts rename packages/{lina-web => lina-ui}/client/onboarding-api.ts (100%) rename packages/{lina-web => lina-ui}/client/onboarding-model.ts (100%) rename packages/{lina-web => lina-ui}/client/onboarding-navigation.ts (100%) rename packages/{lina-web => lina-ui}/client/onboarding-types.ts (100%) rename packages/{lina-web => lina-ui}/client/onboarding.css (61%) rename packages/{lina-web => lina-ui}/client/onboarding.ts (100%) rename packages/{lina-web => lina-ui}/client/presence.ts (100%) rename packages/{lina-web => lina-ui}/client/pwa.css (63%) rename packages/{lina-web => lina-ui}/client/pwa.ts (94%) create mode 100644 packages/lina-ui/client/reading-position.ts rename packages/{lina-web => lina-ui}/client/recovery.css (100%) rename packages/{lina-web => lina-ui}/client/recovery.ts (96%) rename packages/{lina-web => lina-ui}/client/render.ts (91%) rename packages/{lina-web => lina-ui}/client/responsive.css (80%) rename packages/{lina-web => lina-ui}/client/search-view.ts (96%) rename packages/{lina-web => lina-ui}/client/search.css (71%) create mode 100644 packages/lina-ui/client/settings-dom.ts rename packages/{lina-web => lina-ui}/client/settings-navigation.css (64%) create mode 100644 packages/lina-ui/client/settings-tab-model.ts create mode 100644 packages/lina-ui/client/settings-tabs.ts rename packages/{lina-web => lina-ui}/client/settings.css (64%) rename packages/{lina-web => lina-ui}/client/settings.ts (96%) rename packages/{lina-web => lina-ui}/client/sidebar-resize.ts (98%) rename packages/{lina-web => lina-ui}/client/sidebar.css (55%) rename packages/{lina-web => lina-ui}/client/styles.css (94%) create mode 100644 packages/lina-ui/client/task-list.ts rename packages/{lina-web => lina-ui}/client/task-view.ts (80%) rename packages/{lina-web => lina-ui}/client/tasks.css (50%) rename packages/{lina-web => lina-ui}/client/theme-boot.ts (100%) rename packages/{lina-web => lina-ui}/client/theme-controls.ts (51%) rename packages/{lina-web => lina-ui}/client/theme.ts (100%) create mode 100644 packages/lina-ui/client/tokens.css rename packages/{lina-web => lina-ui}/client/tool-label.ts (100%) rename packages/{lina-web => lina-ui}/client/tool-view.ts (97%) create mode 100644 packages/lina-ui/client/tsconfig.json create mode 100644 packages/lina-ui/package.json delete mode 100644 packages/lina-web/client/attachments.ts delete mode 100644 packages/lina-web/client/composer.css delete mode 100644 packages/lina-web/client/conversation-app.ts delete mode 100644 packages/lina-web/client/model-combobox.ts delete mode 100644 packages/lina-web/client/navigation.ts delete mode 100644 packages/lina-web/client/settings-tab-model.ts delete mode 100644 packages/lina-web/client/settings-tabs.ts delete mode 100644 packages/lina-web/client/tokens.css delete mode 100644 packages/lina-web/client/tsconfig.json create mode 100644 packages/lina-web/test/agent-list.test.ts create mode 100644 packages/lina-web/test/attachment-queue.test.ts create mode 100644 packages/lina-web/test/clipboard-attachments.test.ts create mode 100644 packages/lina-web/test/fixtures/model-combobox.ts create mode 100644 packages/lina-web/test/fixtures/ui-desktop.ts delete mode 100644 packages/lina-web/test/model-combobox.test.ts create mode 100644 packages/lina-web/test/navigation-state.test.ts create mode 100644 packages/lina-web/test/shared-renderer.test.ts create mode 100644 packages/lina-web/test/task-drafts.test.ts create mode 100644 packages/lina-web/test/task-ui.browser.mjs create mode 100644 scripts/qa/ui-agent-list.mjs create mode 100644 scripts/qa/ui-components.mjs create mode 100644 scripts/qa/ui-design.mjs create mode 100644 scripts/qa/ui-desktop.mjs create mode 100644 scripts/qa/ui-model-combobox.mjs create mode 100644 scripts/qa/ui-navigation-regressions.mjs create mode 100644 scripts/qa/ui-settings-islands.mjs create mode 100644 scripts/qa/ui-task-layout.mjs create mode 100644 scripts/qa/ui-task-restart.mjs diff --git a/README.md b/README.md index b8189d0..b918720 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,8 @@ Codex 작업은 설치된 스킬과 플러그인을 사용합니다. 에이전 첨부 파일, API 응답을 캐시하지 않습니다. 공개 호스팅, macOS·iOS 네이티브 실행 파일, 앱 자체의 계정 관리는 이번 구현 범위에 포함하지 않습니다. +공통 화면은 메신저형 에이전트 목록, 모바일 목록·대화 전환, 파일 선택·붙여넣기 큐를 제공합니다. [구현·검증 범위](docs/plans/codex-ui/010_implementation.md)와 [Electron 실행 안내](packages/lina-desktop/README.md)를 참고하세요. 실제 모델·다른 OS 연결 검증은 소스 테스트와 구분합니다. + ## 디렉터리 구성 - `packages/lina-codex`: Codex RPC, 세션 상태 반영, 권한, 작업 상태의 영속 관리. @@ -165,7 +167,10 @@ Codex 작업은 설치된 스킬과 플러그인을 사용합니다. 에이전 - `packages/lina-core`: 대화·요청의 영속 처리 규약, 원문 보관, 컨텍스트 저장. - `packages/lina-history`: 비공개 체크포인트 명세, 데이터 객체, 검증, 복구 준비. - `packages/lina-runtime`: 앱·에이전트 집합 컨트롤러와 Codex 실행 구성. -- `packages/lina-web`: 브라우저 작업 화면과 동일 출처 게이트웨이. +- `packages/lina-client`: 공통 대화 상태·명령·초안·탐색 계약. +- `packages/lina-ui`: 웹과 Electron이 함께 사용하는 화면과 디자인 토큰. +- `packages/lina-web`: 동일 출처 게이트웨이와 웹/PWA 자산. +- `packages/lina-desktop`: 동봉 화면과 제한된 서버 연결을 제공하는 Electron 앱. - `packages/lina-memory`: 내장·Honcho 메모리와 접근 범위를 제한한 OpenViking 파일 클라이언트. - `packages/lina-channels`: 채널 연동. - `data/personas`: 작성된 페르소나와 출처 기록. diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 74b33dd..13ef20d 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -69,3 +69,34 @@ Apache-2.0 to the extent of the rights held. That statement covers the identifie assets; it does not relicense external software or imply rights in other images. [The publication checklist](docs/PUBLICATION.md) tracks artifact notices, source privacy review, and the separate activation steps. + + +## shadcn/ui component source + +The UI components in `packages/lina-ui/client/components/ui/` adapt the +Base UI `base-nova` registry patterns retrieved on 2026-09-07 from +https://ui.shadcn.com/r/styles/base-nova/. Lina replaces Tailwind classes with +its shared semantic CSS tokens and keeps named exports. Base UI and React +remain pinned package dependencies in `packages/lina-ui/package.json`. + +MIT License + +Copyright (c) 2023 shadcn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bun.lock b/bun.lock index 3b2392e..b0097a6 100644 --- a/bun.lock +++ b/bun.lock @@ -22,6 +22,10 @@ "@types/ws": "^8.18.1", }, }, + "packages/lina-client": { + "name": "@lina/client", + "version": "0.1.0", + }, "packages/lina-codex": { "name": "@lina/codex", "version": "0.1.0", @@ -33,6 +37,15 @@ "name": "@lina/core", "version": "0.1.0", }, + "packages/lina-desktop": { + "name": "@lina/desktop", + "version": "0.1.0", + "devDependencies": { + "@electron-forge/cli": "8.0.0-alpha.10", + "@electron-forge/maker-zip": "8.0.0-alpha.10", + "electron": "44.2.0", + }, + }, "packages/lina-history": { "name": "@lina/history", "version": "0.1.0", @@ -60,12 +73,31 @@ "@types/ws": "^8.18.1", }, }, + "packages/lina-ui": { + "name": "@lina/ui", + "version": "0.1.0", + "dependencies": { + "@base-ui/react": "1.8.0", + "react": "19.2.8", + "react-dom": "19.2.8", + }, + "devDependencies": { + "@types/react": "19.2.18", + "@types/react-dom": "19.2.7", + }, + }, "packages/lina-web": { "name": "@lina/web", "version": "0.1.0", }, }, "packages": { + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@base-ui/react": ["@base-ui/react@1.8.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "0.4.0", "@floating-ui/react-dom": "^2.1.9", "@floating-ui/utils": "^0.2.12", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q=="], + + "@base-ui/utils": ["@base-ui/utils@0.4.0", "", { "dependencies": { "@babel/runtime": "^7.29.7", "@floating-ui/utils": "^0.2.12", "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw=="], + "@biomejs/biome": ["@biomejs/biome@2.5.12", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.12", "@biomejs/cli-darwin-x64": "2.5.12", "@biomejs/cli-linux-arm64": "2.5.12", "@biomejs/cli-linux-arm64-musl": "2.5.12", "@biomejs/cli-linux-x64": "2.5.12", "@biomejs/cli-linux-x64-musl": "2.5.12", "@biomejs/cli-win32-arm64": "2.5.12", "@biomejs/cli-win32-x64": "2.5.12" }, "bin": { "biome": "bin/biome" } }, "sha512-Lw4VHZRebrReBBnlHa12JQjnIBm3JJAA55PDB9LbBVBF0q4RYphm6KfmIjqtPhf61MxZ5Q9KoK8R8x+7per5Aw=="], "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lCRY1rwgNeWNgTr4DI/u6ZwXTRwRLHAvbaio1YLLGS+4r1nhvB2ssyPqIpfUSmRveNfv0fn/N58C7CAdK2XVrg=="], @@ -96,12 +128,62 @@ "@discordjs/ws": ["@discordjs/ws@1.2.3", "", { "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" } }, "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw=="], + "@electron-forge/cli": ["@electron-forge/cli@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/core": "8.0.0-alpha.10", "@electron-forge/core-utils": "8.0.0-alpha.10", "@electron-forge/shared-types": "8.0.0-alpha.10", "@electron/get": "^5.0.0", "commander": "^11.1.0", "debug": "^4.3.1", "listr2": "^7.0.2", "semver": "^7.2.1" }, "bin": { "electron-forge": "dist/electron-forge.js", "electron-forge-vscode-nix": "script/vscode.sh", "electron-forge-vscode-win": "script/vscode.cmd" } }, "sha512-3fkKH50xTVN1A+UhsX6BzwFfP7JVTadIrA3Cs4jpR7Yl/PChH4w/cyi99LNnZnVAypiywkOkqrQU9t+1SZy1YA=="], + + "@electron-forge/core": ["@electron-forge/core@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/core-utils": "8.0.0-alpha.10", "@electron-forge/maker-base": "8.0.0-alpha.10", "@electron-forge/plugin-base": "8.0.0-alpha.10", "@electron-forge/publisher-base": "8.0.0-alpha.10", "@electron-forge/shared-types": "8.0.0-alpha.10", "@electron-forge/tracer": "8.0.0-alpha.10", "@electron/get": "^5.0.0", "@electron/packager": "^20.0.1", "debug": "^4.3.1", "graceful-fs": "^4.2.11", "jiti": "^2.4.2", "listr2": "^7.0.2" } }, "sha512-sg52Ay0vy9ShC7G4CL9fsfzcUC4yAI9HdP7D18tdmbPwZJ6DLqDLKT/pFw297V7IjX4AYlpsW/71yPEqadDm3w=="], + + "@electron-forge/core-utils": ["@electron-forge/core-utils@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/shared-types": "8.0.0-alpha.10", "@electron/rebuild": "^4.0.1", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "graceful-fs": "^4.2.11", "semver": "^7.2.1" } }, "sha512-edL4xReqbWStPhdhgSEE55AXXLtJLxMRtHEghulmZlf4UaSfS86zwSBtqDwYcUB1cd9LpcEm3GKKek/awOJB0A=="], + + "@electron-forge/maker-base": ["@electron-forge/maker-base@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/shared-types": "8.0.0-alpha.10", "which": "^6.0.0" } }, "sha512-aZ7YlU785r/1VPy0h1HHy1VEiufqMX0fd4tzHcAWwDfZguajfhnGioPfgCaEVKBWyAgV3v7Pge2FkL7YcRsxsQ=="], + + "@electron-forge/maker-zip": ["@electron-forge/maker-zip@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/core-utils": "8.0.0-alpha.10", "@electron-forge/maker-base": "8.0.0-alpha.10", "@electron-forge/shared-types": "8.0.0-alpha.10", "cross-zip": "^4.0.0" } }, "sha512-I3N9FI8xJW7f+Ld05f2hSSuukfI2Oh9vKN7HWSPmM8+7PqN4Dwigp7DRv/s3HPFwrMdayDJKm/2me5rvXh32DQ=="], + + "@electron-forge/plugin-base": ["@electron-forge/plugin-base@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/shared-types": "8.0.0-alpha.10" } }, "sha512-AoL+VuuFVLgqeRzO0dLvrx4f2t1nMeHQ1YKj/EoqAQ6uU7D4HS2D4FNEXyxTQFVrNj4OqSte7U3sqGenc327XA=="], + + "@electron-forge/publisher-base": ["@electron-forge/publisher-base@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/shared-types": "8.0.0-alpha.10" } }, "sha512-UjGRM13jVr1oq+HLayJAUiQcfxvs8LyTQYm5sazxlfG9LO9UJAI/2jbNic/OXYehr5xGrJSCMXDTm/cCy5LfZQ=="], + + "@electron-forge/shared-types": ["@electron-forge/shared-types@8.0.0-alpha.10", "", { "dependencies": { "@electron-forge/tracer": "8.0.0-alpha.10", "@electron/packager": "^20.0.1", "@electron/rebuild": "^4.0.1", "listr2": "^7.0.2" } }, "sha512-JdwOXHXXjh1L1rgLcQJfyCX8cHgvognmuol/udDUIx9/JzMc+AZhNnsFN8JriRYunYaFrVLTHe0H8f8GQXO/LA=="], + + "@electron-forge/tracer": ["@electron-forge/tracer@8.0.0-alpha.10", "", { "dependencies": { "chrome-trace-event": "^1.0.3" } }, "sha512-aoW9P+KoTtO0KQaISdJXi3sVB5k12P1kA6pK0NsgJTEbsB2i5O6c8zfor/U5eJUeb9GAVscAIHKShYuUycgZqg=="], + + "@electron-internal/extract-zip": ["@electron-internal/extract-zip@1.0.5", "", {}, "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA=="], + + "@electron/asar": ["@electron/asar@4.3.0", "", { "dependencies": { "glob": "^13.0.2", "minimatch": "^10.0.1" }, "bin": { "asar": "bin/asar.mjs" } }, "sha512-k/FFC/NQoTykGBi/Ga4L4KorsAKDdkK0LfNVG90eUG6vPVpJaL3iR9V1ZLbzBAF3QpojK5DcaGOdQOheKZv4JQ=="], + + "@electron/get": ["@electron/get@5.1.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^3.0.0", "graceful-fs": "^4.2.11", "progress": "^2.0.3", "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "optionalDependencies": { "undici": "^7.24.4" } }, "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA=="], + + "@electron/notarize": ["@electron/notarize@3.1.1", "", { "dependencies": { "debug": "^4.4.0", "promise-retry": "^2.0.1" } }, "sha512-uQQSlOiJnqRkTL1wlEBAxe90nVN/Fc/hEmk0bqpKk8nKjV1if/tXLHKUPePtv9Xsx90PtZU8aidx5lAiOpjkQQ=="], + + "@electron/osx-sign": ["@electron/osx-sign@2.7.0", "", { "dependencies": { "debug": "^4.3.4", "isbinaryfile": "^4.0.8", "plist": "^3.0.5", "semver": "^7.7.1" }, "bin": { "electron-osx-flat": "bin/electron-osx-flat.mjs", "electron-osx-sign": "bin/electron-osx-sign.mjs" } }, "sha512-9DGhNqKMl6ibkhUoXbN7OHX2gZznfY10L3ZwG0u6r667Kfb6kec4JEfFTXftoqzmOfZ+OzwDbr4p/nKBMHnz0g=="], + + "@electron/packager": ["@electron/packager@20.3.0", "", { "dependencies": { "@electron-internal/extract-zip": "^1.0.1", "@electron/asar": "^4.0.1", "@electron/get": "^5.0.0", "@electron/notarize": "^3.1.0", "@electron/osx-sign": "^2.2.0", "@electron/universal": "^3.0.1", "@electron/windows-sign": "^2.0.2", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.4.1", "filenamify": "^6.0.0", "galactus": "^2.0.2", "graceful-fs": "^4.2.11", "junk": "^4.0.1", "plist": "^3.1.0", "resedit": "^2.0.3", "semver": "^7.7.2", "yargs-parser": "^22.0.0" }, "bin": { "electron-packager": "bin/electron-packager.mjs" } }, "sha512-3MvgJgy6YJ5ti0oGGBKrWKdYwpTaoRrhranMDgHSQ6i5t56yZV9IRDyoXTuqBp97LiKqnZeAMe2wTcF/9+fP5g=="], + + "@electron/rebuild": ["@electron/rebuild@4.2.0", "", { "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.1.1", "node-abi": "^4.2.0", "node-api-version": "^0.2.1", "node-gyp": "^12.2.0", "read-binary-file-arch": "^1.0.6" }, "bin": { "electron-rebuild": "lib/cli.js" } }, "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ=="], + + "@electron/universal": ["@electron/universal@3.0.6", "", { "dependencies": { "@electron/asar": "^4.0.0", "debug": "^4.3.1", "plist": "^3.1.0" } }, "sha512-MonS1kfkZdSEkLZI0pdR/TCx8ecxwRSFm7sORfwIkDI9UaIbHnk4Mgeqq+Ob9qDQRV8LZ9+hHCmimpA9BRcNxw=="], + + "@electron/windows-sign": ["@electron/windows-sign@2.0.6", "", { "dependencies": { "debug": "^4.3.4", "graceful-fs": "^4.2.11", "postject": "^1.0.0-alpha.6" }, "bin": { "electron-windows-sign": "bin/electron-windows-sign.mjs" } }, "sha512-ESWgNkFsXFH06I5EB2uHv3hmZA3yF4j9GTB77W74x3b5KZNItxggNzuADw41HUy6mhnC2K+E2mT0Xgc4YKu3IQ=="], + + "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@lina/channels": ["@lina/channels@workspace:packages/lina-channels"], + "@lina/client": ["@lina/client@workspace:packages/lina-client"], + "@lina/codex": ["@lina/codex@workspace:packages/lina-codex"], "@lina/core": ["@lina/core@workspace:packages/lina-core"], + "@lina/desktop": ["@lina/desktop@workspace:packages/lina-desktop"], + "@lina/history": ["@lina/history@workspace:packages/lina-history"], "@lina/memory": ["@lina/memory@workspace:packages/lina-memory"], @@ -110,8 +192,12 @@ "@lina/runtime": ["@lina/runtime@workspace:packages/lina-runtime"], + "@lina/ui": ["@lina/ui@workspace:packages/lina-ui"], + "@lina/web": ["@lina/web@workspace:packages/lina-web"], + "@malept/cross-spawn-promise": ["@malept/cross-spawn-promise@2.0.0", "", { "dependencies": { "cross-spawn": "^7.0.1" } }, "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg=="], + "@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="], "@sapphire/shapeshift": ["@sapphire/shapeshift@4.0.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg=="], @@ -120,28 +206,190 @@ "@types/node": ["@types/node@26.4.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA=="], + "@types/react": ["@types/react@19.2.18", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w=="], + + "@types/react-dom": ["@types/react-dom@19.2.7", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="], + "@xmldom/xmldom": ["@xmldom/xmldom@0.9.12", "", {}, "sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A=="], + + "abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="], + + "ansi-escapes": ["ansi-escapes@5.0.0", "", { "dependencies": { "type-fest": "^1.0.2" } }, "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA=="], + + "ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], + + "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], + "bun-types": ["bun-types@1.4.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-iIKw23BspnQQYd3prITOBxeUsxBHnwzX6YJfGMuNOZzeNcMmVqzIIVGRm1l69ogaPQmb4wB6BN8mA5bE9YuC5Q=="], + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + + "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], + + "cli-truncate": ["cli-truncate@3.1.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" } }, "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "cross-zip": ["cross-zip@4.0.1", "", {}, "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "discord-api-types": ["discord-api-types@0.38.55", "", {}, "sha512-ytuaRTzdnHUCXJ6KjL9MrItQX0xKncBKEeYI1Bst4+ud47eejH3cG6gaesYakjpPcUhh68XYS2YwGq3mmujFsA=="], "discord.js": ["discord.js@14.27.0", "", { "dependencies": { "@discordjs/builders": "^1.14.1", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", "@discordjs/rest": "^2.6.2", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.5", "discord-api-types": "^0.38.49", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "^6.27.0" } }, "sha512-qHbFlFG2N7y3LjPySYsL6A1+BnX6bkTVgo842EX0CqVPk/KTMwZkojPHEXKsQUpWZNyz5BISNHK1cPpQw0+m4A=="], + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electron": ["electron@44.2.0", "", { "dependencies": { "@electron-internal/extract-zip": "^1.0.1", "@electron/get": "^5.0.0", "@types/node": "^24.9.0" }, "bin": { "electron": "cli.js", "install-electron": "install.js" } }, "sha512-oK1icjhapp3xsUZycO9WZaLmd3hJnA7ieobC4mpdtO1pEN+PPGWpA3m1Mgzzuc1wzSD2Wai4zcH4yfpGJqxFMA=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "filename-reserved-regex": ["filename-reserved-regex@3.0.0", "", {}, "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw=="], + + "filenamify": ["filenamify@6.0.0", "", { "dependencies": { "filename-reserved-regex": "^3.0.0" } }, "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ=="], + + "flora-colossus": ["flora-colossus@3.0.2", "", { "dependencies": { "debug": "^4.4.1" } }, "sha512-Jk78K/Tzt6saxQPGChlJw69xuFGpWyTSAS8EdU0h/FyXwD2K46yNOXmo6nRHcZ9ooekyBAzMkwmiGNt7wOC5zg=="], + + "galactus": ["galactus@2.0.2", "", { "dependencies": { "debug": "^4.4.1", "flora-colossus": "^3.0.2" } }, "sha512-HmKyTFGomdAchz4umx8MwBnrnfFmdpwiTyGA4ZOF7rya2Lmgbc9qate4yweInL+0gUBVImhaz12SBGpW3SY4Yg=="], + + "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="], + + "isbinaryfile": ["isbinaryfile@4.0.10", "", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], + + "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "junk": ["junk@4.0.1", "", {}, "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ=="], + + "listr2": ["listr2@7.0.2", "", { "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^5.0.1", "rfdc": "^1.3.0", "wrap-ansi": "^8.1.0" } }, "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g=="], + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="], + "log-update": ["log-update@5.0.1", "", { "dependencies": { "ansi-escapes": "^5.0.0", "cli-cursor": "^4.0.0", "slice-ansi": "^5.0.0", "strip-ansi": "^7.0.1", "wrap-ansi": "^8.0.1" } }, "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw=="], + + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + "magic-bytes.js": ["magic-bytes.js@1.13.1", "", {}, "sha512-x5sn4UX2k5gCWlcfmoFwG4TPie8+dctESyqOBdhB5p6MsgWXdBKGmt9nXPObj/JI50TTL928lc5Yt1WntMn1bw=="], + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-abi": ["node-abi@4.35.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-ymk4aIzxdPopw2giv8Fs1Ec6vybGkjmyxUwVqhkI4MCy2tVfXdkOGGWieWVjL0THgH+7a8lRdevyupoYj3Js/Q=="], + + "node-api-version": ["node-api-version@0.2.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], + + "node-gyp": ["node-gyp@12.4.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw=="], + + "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "pe-library": ["pe-library@1.0.1", "", {}, "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg=="], + + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + + "plist": ["plist@3.1.1", "", { "dependencies": { "@xmldom/xmldom": "^0.9.10", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA=="], + + "postject": ["postject@1.0.0-alpha.6", "", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], + + "proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "react": ["react@19.2.8", "", {}, "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw=="], + + "react-dom": ["react-dom@19.2.8", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.8" } }, "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ=="], + + "read-binary-file-arch": ["read-binary-file-arch@1.0.6", "", { "dependencies": { "debug": "^4.3.4" }, "bin": { "read-binary-file-arch": "cli.js" } }, "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg=="], + + "resedit": ["resedit@2.0.3", "", { "dependencies": { "pe-library": "^1.0.1" } }, "sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA=="], + + "reselect": ["reselect@5.3.0", "", {}, "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg=="], + + "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], + + "tar": ["tar@7.5.22", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], + "typebox": ["typebox@1.3.18", "", {}, "sha512-/wYPoDqxWZSxV/XD8Eskzr3YluXC9CaWJOuUYMkj+lLVLkyeEIQKzHvMuS/IRc3OLTIBC32LAtHgXo/WFEOMHQ=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -150,12 +398,38 @@ "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + "zod": ["zod@4.5.4", "", {}, "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA=="], "@discordjs/rest/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], "@discordjs/ws/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], + + "@electron/get/undici": ["undici@7.29.1", "", {}, "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "electron/@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="], + + "node-gyp/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "postject/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "electron/@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], } } diff --git a/docs/PLANNING.md b/docs/PLANNING.md index a4912cc..d8e66b5 100644 --- a/docs/PLANNING.md +++ b/docs/PLANNING.md @@ -6,10 +6,10 @@ | 기획 | 문서 | 현재 상태 | | --- | --- | --- | -| Codex 디자인 언어, Electron과 웹 공통 화면 | [UI 개편](plans/codex-ui/001_ui_plan.md), [Electron](plans/codex-ui/004_electron_stack.md), [디자인 기준](../packages/lina-web/DESIGN.md) | 방향 확정, UI 전면 개편과 Electron 패키징은 후속 구현 | +| Codex 디자인 언어, Electron과 웹 공통 화면 | [UI 개편](plans/codex-ui/001_ui_plan.md), [Electron](plans/codex-ui/004_electron_stack.md), [디자인 기준](../packages/lina-web/DESIGN.md) | 공통 화면·토큰·Electron 동봉 빌드 구현. [검증 범위](plans/codex-ui/010_implementation.md) | | 메신저형 에이전트 목록과 모바일 탐색 | [에이전트 목록](plans/codex-ui/006_agent_list_mobile.md), [작업 목록 배치](plans/codex-ui/007_sidebar_comparison.md) | 기본 한 목록 열, 넓은 창의 선택적 작업 열, 모바일 전체 화면 전환 | | 연속 메시지와 중간 사용자 입력 | [대화 전달](plans/codex-ui/002_conversation_delivery.md) | 공개된 발화와 미공개 후보를 나누는 엔진·저장 계약 설계 | -| 이미지·파일 붙여넣기 | [첨부 계획](plans/codex-ui/003_clipboard_attachment.md) | 공통 첨부 큐와 플랫폼별 검증이 필요한 계획 | +| 이미지·파일 붙여넣기 | [첨부 계획](plans/codex-ui/003_clipboard_attachment.md) | 파일 선택·붙여넣기 공통 큐 구현, Chromium 검증. 다른 OS·브라우저는 별도 검증 | | 전용 컴퓨터의 공통 계약 | [컴퓨터·실행·입력 소유권](plans/platform/001_runtime_contracts.md) | API·저장 계약 제안, 독립 GUI 입력은 아직 미검증 | | 프로바이더 선택과 로컬 모델 큐레이션 | [모델 온보딩](plans/platform/005_model_onboarding.md) | 제시 순서·큐레이션 요구 보존, 현재 연결은 Codex + OpenCodex | | 설치 구성과 전체 상태 버전관리 | [리팩터링 요구](plans/platform/008_refactor_preparation.md) | 홈·패키지 분리·로컬 체크포인트 구현, 자동 이력·선택 복원·외부 내보내기는 후속 | diff --git a/docs/plans/codex-ui/001_ui_plan.md b/docs/plans/codex-ui/001_ui_plan.md index 041756a..c79ba5e 100644 --- a/docs/plans/codex-ui/001_ui_plan.md +++ b/docs/plans/codex-ui/001_ui_plan.md @@ -1,5 +1,7 @@ # Lina UI 개편 계획 +> 구현 전 설계와 당시 코드 조사 기록입니다. 현재 구현·검증·남은 연결은 [구현 기록](010_implementation.md)을 따릅니다. + 상태: 제품 설계. Electron·메신저형 목록·연속 발화는 후속 구현이며 현재 기능은 [기획 목록](../../PLANNING.md)을 따른다. **Codex의 디자인 언어를 전면 채택하고, 에이전트와의 지속 대화를 탐색의 중심에 둡니다.** 화면을 바꿔도 대화·초안·작업이 이어져야 합니다. 근거와 코드 확보 범위는 [조사 문서](000_source_research.md)에 정리했습니다. 데스크톱은 Electron, 웹/PWA는 같은 렌더러를 사용합니다. [스택과 전환 계획](004_electron_stack.md), [디자인 적용 기준](005_codex_design_language.md)이 각각 구현 경계와 시각 검수의 기준입니다. diff --git a/docs/plans/codex-ui/003_clipboard_attachment.md b/docs/plans/codex-ui/003_clipboard_attachment.md index 8e9fdb5..3528fe0 100644 --- a/docs/plans/codex-ui/003_clipboard_attachment.md +++ b/docs/plans/codex-ui/003_clipboard_attachment.md @@ -1,5 +1,7 @@ # 이미지·파일 붙여넣기 첨부 +> 구현 전 설계와 당시 코드 조사 기록입니다. 현재 구현·검증·남은 연결은 [구현 기록](010_implementation.md)을 따릅니다. + 2026-09-07 사용자 피드백 5 반영. 기획과 현재 코드 검사만 수행했습니다. 실제 OS 클립보드를 사용한 브라우저·모바일 검증은 아직 수행하지 않았습니다. ## 1. 현재 지원 범위 diff --git a/docs/plans/codex-ui/004_electron_stack.md b/docs/plans/codex-ui/004_electron_stack.md index 03af2d9..5ce9c38 100644 --- a/docs/plans/codex-ui/004_electron_stack.md +++ b/docs/plans/codex-ui/004_electron_stack.md @@ -1,5 +1,7 @@ # Electron과 웹 공통 스택 +> 구현 전 설계와 당시 코드 조사 기록입니다. 현재 구현·검증·남은 연결은 [구현 기록](010_implementation.md)을 따릅니다. + 2026-09-07 사용자 선택 반영. 데스크톱은 Electron으로 정하고, 웹은 동일한 화면 코드를 브라우저에서 실행합니다. 이번 변경은 스택·전환 기획이며 패키지 설치나 앱 구현을 수행한 것은 아닙니다. ## 1. 스택 결정 diff --git a/docs/plans/codex-ui/006_agent_list_mobile.md b/docs/plans/codex-ui/006_agent_list_mobile.md index ace92a4..d75bf21 100644 --- a/docs/plans/codex-ui/006_agent_list_mobile.md +++ b/docs/plans/codex-ui/006_agent_list_mobile.md @@ -1,5 +1,7 @@ # 에이전트 목록과 모바일 탐색 +> 구현 전 설계와 당시 코드 조사 기록입니다. 현재 구현·검증·남은 연결은 [구현 기록](010_implementation.md)을 따릅니다. + 2026-09-07 추가 피드백 반영. 사용자는 Telegram·Grok Bot·카카오톡처럼 익숙한 에이전트 선택 경험과 모바일 전환을 요청했습니다. Codex의 색·타이포·입력창·메뉴 규칙 안에 메신저형 목록과 탐색을 적용합니다. 이 문서는 기획이며 앱 구현 결과가 아닙니다. ## 1. 변경하는 결정 diff --git a/docs/plans/codex-ui/007_sidebar_comparison.md b/docs/plans/codex-ui/007_sidebar_comparison.md index 52fa2a5..b3c6304 100644 --- a/docs/plans/codex-ui/007_sidebar_comparison.md +++ b/docs/plans/codex-ui/007_sidebar_comparison.md @@ -1,5 +1,7 @@ # 에이전트와 Codex 작업 목록 배치 비교 +> 구현 전 설계와 당시 코드 조사 기록입니다. 현재 구현·검증·남은 연결은 [구현 기록](010_implementation.md)을 따릅니다. + 2026-09-07. 사용자는 사이드바를 위아래로 나눌지, 작업용 열을 추가할지 비교해 달라고 요청했습니다. 아래 권장안은 메신저형 에이전트 목록과 모바일 전환을 함께 고려한 설계 판단입니다. 아직 구현·사용성 시험 결과는 없습니다. ## 1. 권장안 diff --git a/docs/plans/codex-ui/010_implementation.md b/docs/plans/codex-ui/010_implementation.md new file mode 100644 index 0000000..a6077b0 --- /dev/null +++ b/docs/plans/codex-ui/010_implementation.md @@ -0,0 +1,126 @@ +# UI 및 데스크톱 구현·검증 + +웹과 Electron이 같은 화면을 사용하도록 분리하고, 에이전트 중심 탐색과 +Codex 계열 디자인을 적용했다. 기존 대화·설정·온보딩을 유지하면서 모바일 +전환, 파일 붙여넣기, 작업 보기와 데스크톱 연결을 구현했다. + +## 구현 범위 + +| 소유 패키지 | 책임 | +| --- | --- | +| `lina-client` | 대화 상태·연결·프로토콜, 에이전트 요약, 초안·읽기 위치, 첨부 큐, 탐색 | +| `lina-ui` | 공통 renderer, 디자인 토큰, React/Base UI 컴포넌트와 기존 컨트롤러 연결 | +| `lina-web` | 동일 출처 게이트웨이, 공통 화면의 production 빌드와 웹/PWA 자산 | +| `lina-desktop` | 동봉 renderer, 제한된 loopback broker, 프로필·세션 격리와 OS 연결 경계 | + +에이전트 목록은 이름·최근 대화·시간·읽지 않음·확인 요청·진행 상태를 표시한다. +목록 필터와 순서를 유지하며 대상을 바꿔도 초안·첨부·읽기 위치가 섞이지 않는다. +요약은 저장된 공개 대화에서 읽고, 목록 조회만으로 실행 엔진을 열지 않는다. + +화면은 중립 표면·공통 글자·간격·버튼·아이콘 크기를 쓴다. React 19.2.8, +React DOM 19.2.8, Base UI 1.8.0을 추가했다. shadcn base-nova의 Button, +Avatar, DropdownMenu, Tabs, Combobox 구성을 Lina 토큰/CSS로 조정했다. +[소스 출처](../../../packages/lina-ui/SOURCES.md)와 +[포함 라이선스](../../../packages/lina-ui/THIRD_PARTY_LICENSES.txt)를 보존한다. +Tailwind나 별도 웹 서버는 추가하지 않았다. + +React는 각 view host 안의 컨트롤을 소유한다. 기존 대화·입력기·첨부 큐는 +기존 컨트롤러가 계속 소유한다. 목록 알림, 메뉴 동작, 설정 탭, 모델 검색은 +명시적 메서드/콜백으로 연결한다. 모델 설정 컨트롤러에는 콤보박스 팩토리를 +주입해 서버 테스트에 브라우저 타입이 섞이지 않게 했다. + +모바일은 에이전트 목록 → 대화 → 뒤로가기 흐름을 제공한다. 상단 사이드바 +아이콘은 접기만 담당한다. 작업 탭 안의 이름 있는 `나란히 보기` 버튼이 별도 +작업 열을 열고, 같은 버튼이 `나란히 보기 종료`로 바뀐다. 실제 남는 폭이 +부족하면 이 선택지를 숨긴다. 목록·필터·초안과 키보드 포커스를 보존한다. + +파일 선택과 붙여넣기는 같은 큐를 쓴다. PNG의 clipboard items/files가 다른 +메타데이터를 내놓아도 중복 업로드하지 않는다. 실패 시 명시적으로 재시도하며, +준비되지 않은 첨부를 빼고 전송하거나 붙여넣기만으로 자동 전송하지 않는다. + +## 데스크톱 + +Electron 44.2.0, Forge CLI/ZIP maker 8.0.0-alpha.10을 추가했다. 선택한 Forge +버전은 설치된 중첩 의존성까지 감사했다. 앱은 실행 엔진을 시작하지 않고 +독립적으로 실행 중인 Lina 웹 게이트웨이에 연결한다. + +같은 production renderer를 ASAR에 동봉한다. main의 loopback broker는 임시 +HttpOnly 인증, 정확한 Host/Origin, 메서드·경로 허용 목록과 프로필의 서버 +바인딩을 확인한다. renderer에는 Node 권한을 주지 않고 preload도 제한한다. +프로필과 세션 경로를 별도로 지정할 수 있다. 인증 실패 중 TCP reset과 창 닫기 +취소의 연결 유지도 회귀 검사했다. [실행·패키징 안내](../../../packages/lina-desktop/README.md). + +## 화면 증거 + +아래 PNG는 합성 데이터로 실제 웹 UI를 실행해 캡처한 결과다. 개인 대화, +실모델 출력이나 Electron GUI 실행 증거가 아니다. 화면 안의 로고·아이콘은 +저장소의 기존 UI 자산이며, 모의 대화·프로필은 QA fixture가 제공한다. + +![데스크톱](010_ui_desktop.png) + +![모바일 에이전트 목록](010_ui_mobile.png) + +![역할별 모델 검색](010_ui_models.png) + +![작업 나란히 보기](010_ui_task_layout.png) + +## 검증 + +구현 후보에서 전체 테스트 1,353개, 타입 검사, lint와 CI build가 통과했다. +이후 작업 보기 UX 변경은 관련 테스트 32개와 실제 Chromium 회귀 10개로 +재검증했다. PR 후보의 최신 dev 통합과 CI 결과는 PR의 Verification 기록을 따른다. + +| 실제 UI 검사 | 증명한 범위 | +| --- | --- | +| `ui-desktop.mjs` | A→B→A 초안·첨부·읽기 위치, PNG 붙여넣기→업로드→명시적 전송→재조회, 한글 Undo, 작업 복원, 모바일·실패 복구 | +| `ui-navigation-regressions.mjs` | 모바일 뒤로가기·검색, 늦은 선택 취소, 저장소 차단·연결 단절 중 읽기 위치 | +| `ui-agent-list.mjs` | 목록 노드/포커스, 터치 취소, 표시 우선순위, 아바타 실패, 오류 알림 복구 | +| `ui-settings-islands.mjs` | 탭 방향·키보드·패널 유지, 테마 저장/시스템 변경과 저장소 실패 | +| `ui-model-combobox.mjs` | 검색·선택·disabled, Escape, dialog 내부 표시, 폭/스크롤/하단 배치, 실제 설정 저장 계약 | +| `ui-components.mjs` | 메뉴 키보드 진입, 이동, Tab/Shift+Tab, Escape, 반복 클릭, 바깥 클릭과 dialog 포커스 | +| `ui-task-layout.mjs` | 작업 탭의 보기 선택, 상태 이름, 실제 가용 폭, 모바일, 재배치와 복원 | +| `ui-design.mjs` | 320/390/768/1024/1440px, 버튼 정렬, 설정 탭과 다크/라이트 표면·잘림 | + +메뉴 Tab 종료와 PNG 중복 첨부처럼 브라우저에서 발견한 오류는 실패를 먼저 +기록하고 고쳤다. Bun의 minify만으로 React 개발 코드가 포함되는 오류도 +production 정의와 자산 테스트로 막았다. 의존성/소스 라이선스는 JS에 포함해 +웹과 Electron 양쪽 결과물에 보존한다. + +## 격리와 재현 + +Bun과 별도로 Playwright/Chromium이 준비된 개발 환경에서 저장소 루트 기준으로 +실행한다. 실제 사용자 서버 대신 합성 fixture를 사용한다. + +```sh +# 별도 터미널: 루트/DB/첨부를 새 임시 디렉터리에 만드는 검증 서버 +LINA_QA_WEB_PORT=18140 LINA_QA_UPSTREAM_PORT=18142 \ + bun packages/lina-web/test/fixtures/ui-desktop.ts + +LINA_QA_URL=http://127.0.0.1:18140 node scripts/qa/ui-desktop.mjs +LINA_QA_URL=http://127.0.0.1:18140 node scripts/qa/ui-navigation-regressions.mjs +LINA_QA_URL=http://127.0.0.1:18140 node scripts/qa/ui-components.mjs +LINA_QA_URL=http://127.0.0.1:18140 node scripts/qa/ui-task-layout.mjs +bun scripts/qa/ui-agent-list.mjs +bun scripts/qa/ui-settings-islands.mjs +bun scripts/qa/ui-model-combobox.mjs +``` + +Playwright 모듈과 실행 파일은 `LINA_QA_PLAYWRIGHT_MODULE`, `LINA_QA_CHROMIUM`, +결과 디렉터리는 `LINA_QA_OUTPUT`으로 지정한다. `LINA_QA_FIRST_USER=1` fixture와 +`LINA_QA_INTRO_URL`로 처음 시작 화면을 검증할 수 있다. 화면 캡처용 모의 대화는 +`LINA_QA_PRESENTATION=1`로 선택한다. 작업이 시작한 검증 서버는 종료했다. + +## 남은 검증과 연결 + +- Electron GUI는 호스트 sandbox 조건 때문에 미검증이다. 정상 sandbox 환경의 + GUI·재시작·OS 파일 대화상자·알림·프로토콜 실행을 확인해야 한다. +- macOS/Windows 패키징·서명, 업데이트 배포, 물리 모바일 IME/OS 파일 복사는 + 별도 검증 범위다. Linux ZIP 생성은 출시/설치 검증을 뜻하지 않는다. +- 실모델과 외부 이미지 서비스의 생성·편집 품질은 모의 서버 결과로 주장하지 + 않는다. 새 이미지/세계관 엔진은 해당 작업이 소유하며 기존 공개 계약을 쓴다. +- 연속 발화·중간 입력의 엔진 정책은 [별도 설계](002_conversation_delivery.md)다. +- 기존 `render.ts ↔ attachments.ts` 참조는 남아 있다. 새 컴포넌트 경로는 + 순환하지 않으며, 기존 첨부 렌더링의 추가 분리는 이번 범위에 포함하지 않았다. + +PR 공개와 dev/main 머지, 배포는 별도 작업이다. 이 변경은 사용자 데이터나 +실행 중 서비스를 변경하지 않는다. diff --git a/docs/plans/codex-ui/010_ui_desktop.png b/docs/plans/codex-ui/010_ui_desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..1e265986ead2e5c4512053fbbc25d16917d79ab6 GIT binary patch literal 121410 zcmcG#WmueD5G4p9f#3uUorRlC)SL@U{^@b_Pi6bN6AwWSvAxlb#C_zEJ$$^4`Ie7aD@<}o7cmWg?8kD4n zpo&Mv$ttRV@_su%NIZg@vmtxDctp+y+EQ@DE~fwfAjxr+EF4K8JFo> z?70wRr@t%WVJdRAdK+NeDx_L9gyQhv7l_ zSXV+(p;#bF19%WDceji2_%b;PhJ8Q3tUZV|xrS+&mjLb021SA$k*Z)kU#ZJ(w_v9QaU@AWtK)sr&2G72iIp2s-ZZNV1%|`^Om27DLoxPB{m#ny#u_Z@{*Du0sl5Lli!O|P$@B)3nUyGfV}GvjNw2*Tx9sHJdD~}O>n|w7PrLIe za8~p$+y0%E#bWIQ9bVf@*_{FQwVQCFXl=Cz>GmCisT4&E%fv6&5isCp58pF${pWbi zN6oXx(3&I^;skdG885r3{n0IZ5D+Myjw65DZT@GV8zB)B`_hE~M&o{sGp6;u;FJdc zil=R2aEfO4>S`trm;74&kH@N7V}CZ^M|}HFeky${x1NW^`46M(H@6dO+7JCVi-;I; zNdtXkH8JpdkBiczlU9Mm4B^M`ep;yRShSbbw*?>Lqi1H&;#&h{-u^O*Swi>hb}USj zFsm4riNf6O{j&)#gm0&_K`bOBBy@D+aTcL{Ta?WF{QO2)Q6JgZk~B9H)%8BcjCUa` zdWziW3G&6YHk}7-c(#Eni2{FYLadi^t4aQv6qCRr$ zvalH17lXYYQ-GZPwDgLfG%*@Kl3aI!tDk%xuh$wer zm&m^94{46s2H;O7ZM`ZkBno;OzqJdV(CV>@`d*h=)zHn-k2{8-#f;Ntk;#5!-6opm?vUNRSDSrJn6GP$3xRZM;XQGD#u&Ty}s=B+qvT}{CHwe zUKbnPFck9yTrMSKO9VcYUo>d<&?}t8#nki+Yow$Zk`Vv&LgX#4gNo96@L1;Mrj?kC z^FxojG1>#{F^rkrI1v2O$*%THx0Y=I%BFL?2A;zUu-mP+u&$hpXL7Ip*gHI=LVJ7T z#p_xBlMnD<@?{QCDyi>h(bSV#VbQLoD;@fYfypVWN&ycSx98WFm`9aAT|%|o!@zSK zfi6Q%Ol1?UEi(-dhefE%R=c~Ts(c|k$tkC2 z@>DLxBCzQ2OG?rk1BY&wn!mqqpDqr_cf}D7)?kXxHIuV*T_26JGcZ92c=Ipb2dr&= z=QG|4`(GmSMd(e(|8TX-_|^XsF#o^64*x&GlK(B!SYV)w!w?o0zP`S;wzihkzZ8>8CuPPuja$FN4FC2hCqA+nK`w_l zx6-C!8b-MAr2N%hEm0NMW;rw~ehb|^BE*&Ur#tXsJTTdgS)M`Y)7C}B-N+>YeLSy! zgG410gZnpnxzwKKiZUxNHI}%E^N@(Yff|B#bE<6J$X8Ri-OmoEi?I;;UY=~^5%{vf zbK3Tw_1Yc+QTa-$s@x6r+Y~pY{Rvmra(A8p{HI)|=AXeOzeMTbm(IeIf28+-e9w<+ zp39@}e4c#H{4?!aw{cnc?UrnX*x?*IG-#vMEv}9^RnC9yjO{Z%>$+@XHng= z*UPpy*N%1oNEeuAkq(50?tPt8?CSOm@7=zf)ZB&(V!ui(;p}dbCtT?(LMQ0>ZqJ0~ zH<>_1Dpg*lgPZ)T4Zhcu)P5M1WcBaS^7#2U^PQO4Ovc%{&b4Lg?BQ~IB>L|Z^dWy`t?m{w+eHu1SAH{{qmPfcq#&RLvapaG~J)m;3 z-c}Q`$mPwB$D_1eHcv{T`*asBXYaV2hq2i&2K%gMUFw9qzZ=ox0g^4Obo%=be*b7< z;FyIBx@|GIQ_C!Jg`bF*x6`j^v#g9WoYa|3E8-p5M}rBu5R=ia^}{RWzV5D!&+LE8 zFgC4jQfrwnQ3TDE+b1(^w7xra}iVKjV}TR3!bcj!H0N9mrTq%asJ15A-#?>oxNB^=ThK$ zX+Q7h=bvHsTFEPwZ8@n-#^V{q9Y3E5{beo^VuNdaWHC0=C6rfFS9B@t-R$(7M5;z( zQdxtY^Xn~=pX25fm*eSgSaiA4yu)8!ff{+(pNrD1L|D{JoRr-o#xLHAP@2B9Gs8wXM8Fy2TKnNB6R2joexz z=}ZUS7`oehL*6?!Of5TGnlC=F!op(NK{@Q+I0}cv1v{HckCbmV`ktNz&W}KEIiZUn zT6)(^Hn=QaTw1n!b6VU`0OOBqUA?o#Luc}p zG4|BK?Y*(|0(B084uwx!*PcA_+g7l_>B&-^SsYo#RP8FR%fGe}fzic$mH@S~dLA$* z4UVi&(Q*FcNCzeXY9uIij0gN!&rfBrVo07t5Po4?$*G{DDwsi}tt28w+pJv}{L zU0ppqAV+y%B9nXnB-$gtCmGb35P$X`7r>R`fBv*=lMAC9FX+5EI=gQ=Eh}0ftTF@V zoTxRSZj>~Rj#{^Lwsyb1YNkf_`Q?mkQJNjq4L1+a;_l2l72kSQk)AoK+`$~;Zl&&b zKNJ*S4t+EGzvTFp^1K|hN5{wDhXH=jfjGYxBzH^M(^OSWG~G+c6%OeD?xjP}z{AxD zeddy)vZ~_TW1d`u2WVpXhY28SxpH*uVnhP0HPcHUCTHte}q z_y#;xm>dFPI`o`hw`6$*vj_Tj#dz@C3L{4o$)+&m*4AE~t+u{~Y6-&oM?|z=GeDq* z1N#5K8@LM}|7_w5VP=;Dh48#!Wc>b>_eT9IAE2OCTObJ@4D+6tvoo{o^eFPH4TQgh z#w0%^NJ8@D-Mu|ANcwM*`HksgX=|&uwDbsM?jprVp&d~E_HaOh64F~QmckDYCBSb8 zP~yv;*uFf2qzEf3GEiP${l7tm{}$?|Z(5%JWky;49aI2x*Qa74BBJ}VRcjj?0w$BU z&<;p{G0zS9^a9%3*S*2Wq>xZK#PmF7z`z4R2T&XVU*&&K<0QUt2nr#e4+j7l%7cS4 z+{kY)$AZxX#{LhPa)8X29pjY;b-}>M@0{iLX!&Xb>aUXyxYPXt>yY0({M4aiLUDNg zx4)mkVQdPjm{3Gmd;6%b)T$BxeZ0{f2nV?#p@=>|W4>zrOV0!#dhig11g1VfZ73S~ zA>?Afxdi>?fpofdo#3Im@`JxPO=A7)Z|?g?;YnW@C?dGg36ebubm;1@f4`g|s)(tD z33b6?;D^n~ANw`{>-EL&k!{c-dBFt?grukA|IhCRo#8`WJiO<^Bt_4`X#0~Kb!omV zWo*EW%4nb+O`LnmR(=0AmaZ->3NwYDd6nMmrv3Oezz#L=>IxO%>OSuQl#7Tx>azEp z7`p>}GBZ|M_wuw2P{<2FyQ8g0mcU@QmqWTda=cH-zB&E2DA?{BMp>1!2#;9cC&x1} z+K@iIj^eOK#?WbtuIsaW0kbBz-so1O-`PGtYVWMR&itJ7<}h77#LfS}r!yx9>RmQ^ zP+R7OTPR|&rC&|PO3%old}*D$9iNURzplZ}1{A*UQFr$8(b*}B8fy4Tb!oofi zCPwx@IRQrnzyGeWP+)bc;*DxhEkGb0U$@RwFA+#F>@vz*A|Q4i3-%|0x~;eoI{`$D6(qw;&6RYpJb*!nSfL03}}WPU?GHg zrqmVHECd=*7L{h;nGfp4O81cDh05hJ5Z3}1=O3{uH5_x|$mOyc)=zFSCF9>jM?a+V zGkKRg)U#Jj&hVCt0_Wrh{kzxK<$KL5qv}F7E+$1j!dq`6aY|3iSuEX|c5t{%0AV5E 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 z zAb^ad1se4jEM|Y&r-%V*3q49BRf-PoJ-P?75!xA}4FIo(GE=78t%KbZgdwJ~vVC8H zv%k zBF?uzem>Zm?EO)k)9)LOfAQs%ZRj-7(DWE_nrV-y$!+#wW)11aVdLkfK^_hUeIsIm z*bOa4vH8vO&CQ?s1dYpaa{dWr2%52^ecUV_ja7MpSQ_7M*v?SJ>IvH{24CC1`%f+a zkX=Rh0=0lkX85F3YicG=WdGamhX4Ydn&xJ`?WC%D-%wWu|`9XhFH*-)Q4|#98 z>b%s)k=;P64Io~KY1mbe2s&=MIXI}QY8-7vp?+_&VZvwSlkP=L&E9`d{)*;P!fU?! z_|eS`6UzzCcgK4xPCt-tT(3ihYLQMM=xKFzpabq5QMFP{ z0023#{$L5gu)VS4`#aSSHO!#quDf|TbQjvKE`hkwqUq8~N)I3wk;$$C$@#9Xt{#@P zgPNr{X&QKE#4iL)lCQ@L!M;^BHQi+CalZc5@S|jF4k>=OJruRCr-y-^ogTz~fv=C0o^P=*)y za`-_lnR{1(No~X=mWd%`84R=K{LP>DidRRhQtb^m(tqWai*AghyfQ!jUPYivyFq*| zdH0z%!i)JgN9)0KS`}1xxAckG?+A*$gAfHSb&QWR#I#u?UGx7!rZl1q^Y(sVv!cgJ z#CD>Y9>qFGfd;R4%fBZ~5-eF!!2B-M*x;(vEz8+>_AFk56~iNPhL3uPp`eFgER;BI zlQ3R&It5RU{*lyh)`i=pd8F$>HfQ?Ovn%f$2H9$>fjHl60#auaoFPGI-t|-Je%*RD zCH-BCMk5ku*T5I5fC&7+_zcQ}QTI-XG%k2{Rx7$!oIU*ktkc0I>7^grkz7feLHgBX z7^n2IP|b3{hHrBR?8*Sbkg^3>M z2-e`oX>|66*WhsW#9Oc+4G3Mas2>~&oSpMGW_|*@Un;{?O%1fFa!-NG#_3U^!5JDz zbSJpcV!90Ph%`G2G?l}KOy?g3yseXL%SOUCNRRxf#3}mauxrq<+QEPoT`eJraf3w% z^PWWShonQ0`&n%8fsqJztM2Dam|r&>V7{>BhzM{B%IQw&VOYJt@EyQCp3)Jn9D^)k*faVzDKi0|Os{@Lyp5}< ze&7Eisouwl=o^Li@T{(!LlA^I$$B_P*|uV74+BNH6LxljBl&_5$JF*9izkU8$JN26 zqq;PYk z0a6xGG4svC9`S<-X*^>j%8%Yh$kcIxn(1$UGQBslolfqTLR0MT5Jj-hAK5DPz5aX5 z&syvy`;*Ct3L#A8i$x39^3x{rtf;&q@V|6qQ9uFepkAk%=|&xXS;Ws zc|?7`{f5Jg51r6gAu$g)yglJ*gOfKS9iN+z>7T8I;}t&Opp1x+HnYMMB%TH;6b|*r zT@C8+*iNA5?XGejNV^Ose3aR_F8}1xuU|SIm2Yt!6+pquu}sccUqwvocOIvh5qz)t zO+h87ib}m?#&4JOpX?>1U=XCf`;IQq{myiHLu_$OWxO3jziG@l2@xh8eJTDrqdVIya98wqJt6b-X|5a&d|)AVA9Z5(aVAt_(Ny%l&zzx{)*}>O@F5mu8B6R zQL0 zIn-tK;Pv$_-;;#eo*3%oHG~lP2waQJHWW>|mt_H=90(GMU-IIJZ4S#M z9|HZTYCm_(@b1HEJsztSLp7ezERX2{9_UY4=+$}h6TAHV}k8J5{B=v7Q*nf&|UwMjX zwmt&$4m{ek{?KB5c;JlWM*6%RMZzGEkDFVSg%CZkdnNUl++HmYrFh2Bs(`mz;i~R! zq85w2yi2?`K zESenpX-t?WUCwLj$|~)KcNwMMt7vJp(u=Yh7gC$c@*B!KmZnVt|C+!msxI@(&$zoV z>p4YU#c~npG=1Oh+N!SqE}23%Mk-h+Piy#F7j*n4Pa`8|^b`~_X{{ZUOkpS%%dDNv z3NdOOkmQ+bL?v{&{v~hb?9z1;A}<-{aL;P$C)Zzpvd65d8;&&z;(gTcZfe}XhJT6< zs)38hS@5>nk#_Oi>=Ritclm$gAYOgXU>6Luen)Yftq7DAT2w!5UgBE6GY^xEqr(Ud zZ{sh*bkN(=&)q}TdmUA?k!bJ*_U+vHY}qUYla9N>!i}z(r)J!Q*e)RhjjKF4$e^}N zg4cocS>i_({A|q1?T~2CIlsPdK_C9ij~O|B9;maCFm^U69p4JvK`&s+>%nm3bsB)K z%CwB;Sb{Qy%>pqAU3FgnfWqybtG|}hXgrew0Nu1*5uCrl_$C04f}+HZvef$HCm{X=739vIJ;>LR6zC zPkDY4ht%?m*2+`jhGNO$+WplLn0%I4`4_6Q@5C>9=Q-<2GPLKH {N^%)~oo;;!c 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 Z2om16*NU2vNzmqym3%8vA!gwJzW_NTiWUF> literal 0 HcmV?d00001 diff --git a/docs/plans/codex-ui/010_ui_task_layout.png b/docs/plans/codex-ui/010_ui_task_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..a3076305ed86e44b5641024d9ac838593753cbd8 GIT binary patch literal 131841 zcmcG$Wl$YW|1G*9AxMG;cnAc7TX2VsySux)>&An-6WoHkyL)hVhu|(7m$S+9zUThy ze7SY2?wJo%7rSSsyQimn{nlE)36Yf+K}7h10000G#Y6?=0RWgR0N~v|95m!V1=wS` z000U=Ops5}HSKs6kr!QMjpZq)S4I$5x4vJU51)@he-uGDz*HcVm>k=$oe>@% z3Jng9(CxXt#E>Cbk~H~u({9@9W@AeWIso89=F9u7(dh^i3eqN@0vVmRw!Iw_!vq_D z3y^PrF+tERD1v2SRm9_=?ulYZW9#>tg%vM&7ipDXf`y^B1BBWfmM`cE~V0zR^L0W`R2mvAiq ztt7+pKYHrKuwiQ8fzaoY;3l3YpUpz6kv$Vfv-G{w;FtI7%l1GNKAkQgZh)PWbAD!~ zHtEmZ%k$&T&JG9!YOq-+1?cv~Qz#_G?X;Y=6a8(2RyLKpq%2y;LYv5|=Urx|jXD-s zTh&KVG^Sh_@uM_5Xm_Nl>fZVJ+hmgrJ!^#b z&@_q5`d@d;#o|cmOW4`iq6c6dnk~f_o6W0#U)JUd_Vi090rh$T?R}vJ>+31i;O8n2 z=!tZH{%lcyTAR0~>@#So&BQ71^^XomY`Y6tFMpx)pBQ;<##SLlbAVx*);CzPTz#=>p6;?(5|fyYuqO2yJU{%N*OX*+Ohh6sl>*u)7|WDE^#~(Pha^ckmcn9o zD)7@$8d^+c_Jtz%Z2#H0D|nl-8 (H9sBQyR&&xzhJlx3Ar5blX&&{i};GMTCcZT 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 +export type PublicListMessage = Pick< + TimelineEntry, + "entryId" | "seq" | "text" | "timestamp" +> & { role: "user" | "assistant" }; +export interface AgentConversationSummary { + agentId: string; + available: boolean; + sessionId: string | null; + revision: number; + latestMessage: PublicListMessage | null; + confirmationCount: number | null; + running: boolean | null; +} +type Cursor = { sessionId: string; seq: number }; +type CursorStorage = { + getItem(key: string): string | null; + setItem(key: string, value: string): void; +}; +const cursorKey = (id: string) => `lina.seen.v1.${id}`; + +export function publicMessagePreview(message: { + role: "user" | "assistant"; + text: string; +}): string { + const attachment = new AttachmentDraft(); + attachment.value = message.text; + const text = attachment.text.trim(); + const preview = /^```|^~~~/.test(text) + ? "코드 답변" + : text || attachment.refs.map((ref) => ref.name).join(", "); + return `${message.role === "user" ? "나: " : ""}${preview.replace(/\s+/g, " ").slice(0, 160)}`; +} + +/** Input must be the public snapshot, never an engine transcript. */ +export function summaryFromSnapshot( + snapshot: SessionSnapshot, + confirmationCount: number | null = null, +): AgentConversationSummary { + let latestMessage: PublicListMessage | null = null; + for (const entry of snapshot.messages) { + if ( + (entry.role === "user" || entry.role === "assistant") && + (!latestMessage || entry.seq > latestMessage.seq) + ) { + latestMessage = { + entryId: entry.entryId, + seq: entry.seq, + role: entry.role, + text: entry.text, + timestamp: entry.timestamp, + }; + } + } + return { + agentId: snapshot.botId, + available: true, + sessionId: snapshot.sessionId, + revision: snapshot.revision, + latestMessage, + confirmationCount, + running: snapshot.state === "running", + }; +} + +/** Shared projection: server order, public summaries, device drafts and observed cursors. */ +export class AgentListModel { + private profiles: AgentListProfile[] = []; + private readonly summaries = new Map(); + private readonly unavailable = new Set(); + private readonly drafts = new Map(); + private readonly seen = new Map(); + private filter = ""; + status: "loading" | "ready" | "error" = "loading"; + constructor( + private currentId: string, + private readonly storage?: CursorStorage, + ) {} + + replace(profiles: AgentListProfile[]): void { + this.profiles = profiles; + this.status = "ready"; + const ids = new Set(profiles.map((profile) => profile.id)); + for (const id of this.summaries.keys()) + if (!ids.has(id)) this.summaries.delete(id); + for (const profile of profiles) { + if (this.seen.has(profile.id)) continue; + try { + const value: unknown = JSON.parse( + this.storage?.getItem(cursorKey(profile.id)) ?? "null", + ); + if ( + value && + typeof value === "object" && + "sessionId" in value && + typeof value.sessionId === "string" && + "seq" in value && + typeof value.seq === "number" && + Number.isSafeInteger(value.seq) && + value.seq >= 0 + ) + this.seen.set(profile.id, { + sessionId: value.sessionId, + seq: value.seq, + }); + } catch { + /* Storage is optional; unknown history is never marked unread. */ + } + } + } + summary(id: string): AgentConversationSummary | undefined { + return this.summaries.get(id); + } + setCurrent(id: string): void { + this.currentId = id; + } + setFilter(value: string): void { + this.filter = value.trim().toLocaleLowerCase(); + } + setDraft(id: string, value: string): void { + this.drafts.set(id, value); + } + fail(): void { + this.status = "error"; + } + summariesFailed(): void { + for (const profile of this.profiles) this.unavailable.add(profile.id); + } + updateSummary(summary: AgentConversationSummary): void { + if (!summary.available) { + this.unavailable.add(summary.agentId); + return; + } + const previous = this.summaries.get(summary.agentId); + if ( + previous?.sessionId === summary.sessionId && + previous.revision > summary.revision + ) + return; + this.summaries.set(summary.agentId, summary); + this.unavailable.delete(summary.agentId); + } + /** Call only for messages actually visible in the foreground conversation. */ + markVisible(agentId: string, sessionId: string, seq: number): void { + const summary = this.summaries.get(agentId); + if ( + !summary || + summary.sessionId !== sessionId || + !Number.isSafeInteger(seq) || + seq < 0 || + seq > (summary.latestMessage?.seq ?? 0) + ) + return; + const previous = this.seen.get(agentId); + const cursor = { + sessionId, + seq: + previous?.sessionId === sessionId ? Math.max(seq, previous.seq) : seq, + }; + this.seen.set(agentId, cursor); + try { + this.storage?.setItem(cursorKey(agentId), JSON.stringify(cursor)); + } catch { + /* Keep the cursor in memory. */ + } + } + rows() { + return this.profiles + .filter((profile) => + `${profile.name} ${profile.role}` + .toLocaleLowerCase() + .includes(this.filter), + ) + .map((profile) => { + const summary = this.summaries.get(profile.id); + const message = summary?.latestMessage; + const draft = this.drafts.get(profile.id)?.trim(); + const cursor = this.seen.get(profile.id); + const confirmationCount = summary?.confirmationCount ?? null; + const summaryUnavailable = this.unavailable.has(profile.id); + const preview = + confirmationCount && confirmationCount > 0 + ? `확인 필요 · ${confirmationCount}건` + : draft + ? `초안: ${publicMessagePreview({ role: "assistant", text: draft })}` + : message + ? publicMessagePreview(message) + : summaryUnavailable + ? "대화 요약을 불러오지 못했어요" + : summary + ? "대화를 시작해보세요" + : "대화 요약을 불러오는 중…"; + return { + ...profile, + selected: profile.id === this.currentId, + preview, + timestamp: message?.timestamp ?? null, + sessionId: summary?.sessionId ?? null, + messageSequence: message?.seq ?? null, + confirmationCount, + summaryUnavailable, + running: summary?.running === true, + unread: Boolean( + message?.role === "assistant" && + cursor?.sessionId === summary?.sessionId && + message && + cursor && + message.seq > cursor.seq, + ), + }; + }); + } +} +export type AgentListRow = ReturnType[number]; diff --git a/packages/lina-web/client/attachment-draft.ts b/packages/lina-client/src/attachment-draft.ts similarity index 87% rename from packages/lina-web/client/attachment-draft.ts rename to packages/lina-client/src/attachment-draft.ts index d113473..7180be5 100644 --- a/packages/lina-web/client/attachment-draft.ts +++ b/packages/lina-client/src/attachment-draft.ts @@ -1,4 +1,5 @@ export type DraftAttachment = { id: string; name: string; sessionId: string }; +export const MAX_DRAFT_ATTACHMENTS = 4; const UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; const LINE = new RegExp( `^\\[([^\\[\\]<>\\x00-\\x1f\\\\/]{1,120})\\]\\(/api/attachments/(${UUID})\\?sessionId=(${UUID})\\)$`, @@ -42,7 +43,7 @@ export class AttachmentDraft { lines.pop(); if (lines.at(-1) === "") lines.pop(); } - if (refs.length > 4) { + if (refs.length > MAX_DRAFT_ATTACHMENTS) { this.text = value; this.items = []; } else { @@ -55,7 +56,7 @@ export class AttachmentDraft { value, }; } - add(ref: DraftAttachment): void { + add(ref: DraftAttachment, index = this.items.length): void { if ( this.items.some( (item) => item.id === ref.id && item.sessionId === ref.sessionId, @@ -64,9 +65,10 @@ export class AttachmentDraft { return; if (!LINE.test(attachmentLink(ref))) throw new Error("유효하지 않은 첨부파일"); - if (this.items.length >= 4) throw new Error("첨부 한도 초과 · 최대 4개"); + if (this.items.length >= MAX_DRAFT_ATTACHMENTS) + throw new Error("첨부 한도 초과 · 최대 4개"); const previous = this.items; - this.items = [...previous, ref]; + this.items = [...previous.slice(0, index), ref, ...previous.slice(index)]; if (this.value.length > 16000) { this.items = previous; throw new Error("첨부 공간 부족 · 메시지 길이 줄이기"); diff --git a/packages/lina-client/src/attachment-queue.ts b/packages/lina-client/src/attachment-queue.ts new file mode 100644 index 0000000..32662ee --- /dev/null +++ b/packages/lina-client/src/attachment-queue.ts @@ -0,0 +1,300 @@ +import { + type AttachmentDraft, + type DraftAttachment, + MAX_DRAFT_ATTACHMENTS, +} from "./attachment-draft.ts"; + +// Client admission mirrors the server's current byte limit; server still validates bytes. +export const ATTACHMENT_UPLOAD_MAX_BYTES = 2 * 1024 * 1024; +export type AttachmentSource = "picker" | "paste"; +type Item = { + key: string; + name: string; + owner: string; + source: AttachmentSource; +}; +type LocalItem = Item & { + file: File; + state: "pending" | "uploading" | "error"; + error?: string; +}; +export type AttachmentQueueItem = + | LocalItem + | (Item & { state: "ready"; ref: DraftAttachment }); +type Upload = ( + file: File, + owner: string, + signal: AbortSignal, +) => Promise; +type Options = { + session: () => string | undefined; + text: () => string; + changed: () => void; + notice: (message: string) => void; + upload?: Upload; +}; +type Flight = { + item: LocalItem; + generation: number; + controller: AbortController; +}; + +/** In-memory file queue. Only ready refs enter the existing serializable draft. */ +export class AttachmentQueue { + private entries: AttachmentQueueItem[] = []; + private active: Flight | undefined; + private generation = 0; + private sequence = 0; + private owner: string | undefined; + private online = false; + constructor( + private readonly draft: AttachmentDraft, + private readonly options: Options, + ) { + this.owner = options.session(); + } + get items(): readonly AttachmentQueueItem[] { + return this.entries; + } + get busy(): boolean { + return this.active !== undefined; + } + get blocked(): boolean { + return this.entries.some( + (item) => item.state !== "ready" || item.owner !== this.options.session(), + ); + } + reset(value: string): void { + this.generation++; + this.cancel(); + this.owner = this.options.session(); + this.draft.value = value; + this.entries = this.draft.refs.map((ref) => ({ + key: this.key(), + name: ref.name, + owner: ref.sessionId, + source: "picker", + state: "ready", + ref, + })); + // The value setter's caller owns persistence and its update cycle. + } + update(online: boolean): void { + const owner = this.options.session(); + const changedOwner = owner !== this.owner; + const disconnected = this.online && !online; + this.online = online; + if (changedOwner || disconnected) { + this.owner = owner; + this.generation++; + for (const item of this.entries) { + if ( + item.state === "ready" || + (!changedOwner && item.state !== "uploading") + ) + continue; + item.state = "error"; + item.error = changedOwner + ? "대화가 바뀌었어요 · 제외 후 다시 첨부" + : "연결이 끊겼어요 · 연결 후 재시도"; + } + this.cancel(); + } + this.pump(); + } + addFiles(files: readonly File[], source: AttachmentSource): void { + this.update(this.online); + if (!files.length) return; + const owner = this.owner; + if (!owner) { + this.options.notice("대화 연결 후 파일을 다시 첨부해 주세요."); + return; + } + if (files.length + this.entries.length > MAX_DRAFT_ATTACHMENTS) { + this.options.notice( + `첨부 한도 초과 · 최대 4개 · 이번 ${files.length}개는 추가되지 않았어요.`, + ); + return; + } + for (const input of files) { + const file = namedFile(input); + this.entries.push({ + key: this.key(), + name: file.name || "이름 없는 파일", + owner, + source, + state: "pending", + file, + }); + } + this.pump(); + this.options.changed(); + } + retry(key: string): void { + this.update(this.online); + const item = this.entries.find((item) => item.key === key); + if (item?.state !== "error") return; + if (item.owner !== this.owner) { + this.options.notice( + "다른 대화의 파일이에요 · 제외 후 다시 첨부해 주세요.", + ); + return; + } + if (!this.online) { + this.options.notice("연결 후 다시 시도해 주세요."); + return; + } + item.state = "pending"; + delete item.error; + this.pump(); + this.options.changed(); + } + remove(key: string): void { + const item = this.entries.find((item) => item.key === key); + if (!item) return; + this.entries = this.entries.filter((item) => item.key !== key); + if (item.state === "ready") this.draft.remove(item.ref.id); + if (this.active?.item === item) this.cancel(); + this.pump(); + this.options.changed(); + } + private key(): string { + return `attachment-${++this.sequence}`; + } + private cancel(): void { + const previous = this.active; + this.active = undefined; + previous?.controller.abort(); + } + private pump(): void { + if (this.active || !this.online) return; + const item = this.entries.find( + (item): item is LocalItem => + item.state === "pending" && item.owner === this.owner, + ); + if (!item) return; + item.state = "uploading"; + const flight = { + item, + generation: this.generation, + controller: new AbortController(), + }; + this.active = flight; + void this.upload(flight); + } + private current(flight: Flight): boolean { + return ( + this.active === flight && + this.generation === flight.generation && + this.options.session() === flight.item.owner + ); + } + private async upload(flight: Flight): Promise { + const { item } = flight; + try { + if (item.file.size > ATTACHMENT_UPLOAD_MAX_BYTES) + throw Error("파일 크기 초과 · 최대 2 MiB"); + const ref = await (this.options.upload ?? uploadAttachment)( + item.file, + item.owner, + flight.controller.signal, + ); + if (!this.current(flight)) return; + if (ref.sessionId !== item.owner) + throw Error("첨부 결과 미확인 · 재시도 또는 제외해 주세요."); + this.draft.text = this.options.text(); + const index = this.entries.indexOf(item); + this.draft.add( + ref, + this.entries.slice(0, index).filter((item) => item.state === "ready") + .length, + ); + this.entries[index] = { + key: item.key, + name: ref.name, + owner: item.owner, + source: item.source, + state: "ready", + ref, + }; + } catch (error) { + if (!this.current(flight)) return; + item.state = "error"; + item.error = + error instanceof Error + ? error.message + : "첨부 실패 · 재시도 또는 제외해 주세요."; + } finally { + if (this.active === flight) { + this.active = undefined; + this.update(this.online); + this.options.changed(); + } + } + } +} + +function namedFile(file: File): File { + if (file.name?.trim() && !["image", "blob"].includes(file.name)) return file; + const extension = + file.type === "image/png" + ? "png" + : file.type === "image/jpeg" + ? "jpg" + : undefined; + return extension + ? new File([file], `clipboard-${crypto.randomUUID()}.${extension}`, { + type: file.type, + lastModified: file.lastModified, + }) + : file; +} + +async function uploadAttachment( + file: File, + owner: string, + signal: AbortSignal, +): Promise { + let response: Response; + try { + response = await fetch("/api/attachments", { + method: "POST", + headers: { + "X-Lina-Session": owner, + "X-Lina-Filename": encodeURIComponent(file.name), + "Content-Type": "application/octet-stream", + }, + body: file, + signal: AbortSignal.any([signal, AbortSignal.timeout(30000)]), + redirect: "error", + }); + } catch { + throw Error("첨부 결과 미확인 · 연결 확인 후 재시도 또는 제외해 주세요."); + } + if (!response.ok) { + if (response.status === 413) throw Error("파일 크기 초과 · 최대 2 MiB"); + if (response.status === 507) + throw Error("첨부 저장 공간 부족 · 공간 확보 후 재시도"); + if (response.status >= 500) + throw Error("첨부 저장소 오류 · 서버 상태 확인 후 재시도"); + throw Error( + "첨부 실패 · 파일명·형식·이미지 크기를 확인해 주세요. PNG·JPEG·PDF·DOCX·XLSX·텍스트 지원", + ); + } + let meta: unknown; + try { + meta = await response.json(); + } catch { + throw Error("첨부 결과 미확인 · 재시도 또는 제외해 주세요."); + } + if ( + typeof meta !== "object" || + !meta || + !("id" in meta) || + typeof meta.id !== "string" || + !("name" in meta) || + typeof meta.name !== "string" + ) + throw Error("첨부 결과 미확인 · 재시도 또는 제외해 주세요."); + return { id: meta.id, name: meta.name, sessionId: owner }; +} diff --git a/packages/lina-web/client/connection.ts b/packages/lina-client/src/connection.ts similarity index 98% rename from packages/lina-web/client/connection.ts rename to packages/lina-client/src/connection.ts index 6232c0f..4fd69e3 100644 --- a/packages/lina-web/client/connection.ts +++ b/packages/lina-client/src/connection.ts @@ -1,6 +1,6 @@ import type { ContextClient } from "../../lina-core/src/context-wire.ts"; import type { ChatCommand, WireClient } from "../../lina-core/src/wire.ts"; -import { parseServerFrame, type ServerFrame } from "../src/protocol.ts"; +import { parseServerFrame, type ServerFrame } from "./protocol.ts"; export type ConnectionEvents = { readonly frame: (frame: ServerFrame) => void; diff --git a/packages/lina-web/client/context-model.ts b/packages/lina-client/src/context-model.ts similarity index 100% rename from packages/lina-web/client/context-model.ts rename to packages/lina-client/src/context-model.ts diff --git a/packages/lina-web/client/draft.ts b/packages/lina-client/src/draft.ts similarity index 100% rename from packages/lina-web/client/draft.ts rename to packages/lina-client/src/draft.ts diff --git a/packages/lina-web/client/durable-model.ts b/packages/lina-client/src/durable-model.ts similarity index 99% rename from packages/lina-web/client/durable-model.ts rename to packages/lina-client/src/durable-model.ts index 417e2da..4c339d9 100644 --- a/packages/lina-web/client/durable-model.ts +++ b/packages/lina-client/src/durable-model.ts @@ -3,8 +3,8 @@ import type { SessionSnapshot, TimelineEntry, } from "../../lina-core/src/protocol.ts"; -import type { ServerFrame } from "../src/protocol.ts"; import { type ChatMessage, ChatModel } from "./model.ts"; +import type { ServerFrame } from "./protocol.ts"; type Expanded = { text: string; diff --git a/packages/lina-web/client/execution-model.ts b/packages/lina-client/src/execution-model.ts similarity index 100% rename from packages/lina-web/client/execution-model.ts rename to packages/lina-client/src/execution-model.ts diff --git a/packages/lina-web/client/model.ts b/packages/lina-client/src/model.ts similarity index 97% rename from packages/lina-web/client/model.ts rename to packages/lina-client/src/model.ts index 79871ac..692c7a3 100644 --- a/packages/lina-web/client/model.ts +++ b/packages/lina-client/src/model.ts @@ -1,5 +1,5 @@ import type { ToolMetadata } from "../../lina-core/src/protocol.ts"; -import { MAX_CHAT_LENGTH, type ServerFrame } from "../src/protocol.ts"; +import { MAX_CHAT_LENGTH, type ServerFrame } from "./protocol.ts"; export type MessageStatus = | "pending" diff --git a/packages/lina-client/src/navigation-state.ts b/packages/lina-client/src/navigation-state.ts new file mode 100644 index 0000000..5d69daf --- /dev/null +++ b/packages/lina-client/src/navigation-state.ts @@ -0,0 +1,44 @@ +export type Screen = "agents" | "conversation" | "tasks" | "settings"; +export type NavigationState = { + screen: Screen; + agentId: string; + taskId?: string; +}; +const AGENT_ID = /^[a-z][a-z0-9-]{0,47}$/; + +export function parseNavigation(href: string): NavigationState { + const query = new URL(href).searchParams; + const id = query.get("agent"); + const valid = id !== null && AGENT_ID.test(id); + const screen = query.get("screen"); + const task = query.get("task"); + if (task && /^[a-zA-Z0-9_-]{1,128}$/.test(task)) + return { agentId: valid ? id : "lina", screen: "tasks", taskId: task }; + return { + agentId: valid ? id : "lina", + screen: + screen === "agents" || + screen === "tasks" || + screen === "settings" || + screen === "conversation" + ? screen + : valid + ? "conversation" + : "agents", + }; +} + +export function navigationUrl(state: NavigationState): string { + return `/?agent=${encodeURIComponent(state.agentId)}&screen=${state.screen}${state.taskId ? `&task=${encodeURIComponent(state.taskId)}` : ""}`; +} + +export function navigationLayout( + width: number, + expandedTasks: boolean, + sidebarWidth: number, +): "mobile" | "single" | "dual" { + if (width < 768) return "mobile"; + return expandedTasks && width >= Math.max(1440, sidebarWidth + 280 + 720 + 32) + ? "dual" + : "single"; +} diff --git a/packages/lina-client/src/platform.ts b/packages/lina-client/src/platform.ts new file mode 100644 index 0000000..7eb2c5f --- /dev/null +++ b/packages/lina-client/src/platform.ts @@ -0,0 +1,13 @@ +/** Both browser and desktop broker expose the same origin-scoped resource contract. */ +export function socketUrl(origin: string, path: string): string { + const url = new URL(path, origin); + if ( + url.origin !== new URL(origin).origin || + !["http:", "https:"].includes(url.protocol) + ) + throw new Error("Invalid Lina socket origin"); + url.protocol = url.protocol === "https:" ? "wss:" : "ws:"; + return url.href; +} + +export type DesktopPlatform = { readonly platform: "desktop" }; diff --git a/packages/lina-web/client/preferences.ts b/packages/lina-client/src/preferences.ts similarity index 98% rename from packages/lina-web/client/preferences.ts rename to packages/lina-client/src/preferences.ts index 45fef20..241d7d1 100644 --- a/packages/lina-web/client/preferences.ts +++ b/packages/lina-client/src/preferences.ts @@ -1,6 +1,6 @@ export const SIDEBAR_MIN_WIDTH = 200; export const SIDEBAR_MAX_WIDTH = 420; -export const SIDEBAR_DEFAULT_WIDTH = 256; +export const SIDEBAR_DEFAULT_WIDTH = 304; export function normalizeSidebarWidth(value: unknown): number { return typeof value === "number" && Number.isFinite(value) ? Math.max( diff --git a/packages/lina-client/src/protocol.ts b/packages/lina-client/src/protocol.ts new file mode 100644 index 0000000..223aba2 --- /dev/null +++ b/packages/lina-client/src/protocol.ts @@ -0,0 +1,79 @@ +export const MAX_CHAT_LENGTH = 16_000; +export type ChatFrame = { + readonly type: "chat"; + readonly id: string; + readonly text: string; +}; +export type ServerFrame = + | ContextServer + | ControlServer + | WireServer + | { readonly type: "ack"; readonly id: string } + | { readonly type: "error"; readonly message: string } + | { readonly type: "agent-text" | "agent-thinking"; readonly text: string } + | { readonly type: "agent-status"; readonly state: "running" | "idle" }; + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function record(raw: unknown): Record | undefined { + if (typeof raw !== "string" || raw.length > 1_048_576) return; + try { + const value: unknown = JSON.parse(raw); + if (isRecord(value)) return value; + } catch { + /* Invalid network frames carry no trusted data. */ + } + return; +} + +export function parseChat(raw: unknown): ChatFrame | undefined { + const value = parseWireClient(raw); + return value?.type === "chat" ? value : undefined; +} + +export function parseServerFrame(raw: unknown): ServerFrame | undefined { + const context = parseContextServer(raw); + if (context) return context; + const control = parseControlServer(raw); + if (control) return control; + const durable = parseWireServer(raw); + if (durable) return durable; + const value = record(raw); + if (value === undefined) return; + const { type, id, message, text, state } = value; + switch (type) { + case "ack": + return typeof id === "string" && id.length > 0 + ? { type: "ack", id } + : undefined; + case "error": + return typeof message === "string" + ? { type: "error", message } + : undefined; + case "agent-text": + case "agent-thinking": + return typeof text === "string" ? { type, text } : undefined; + case "agent-status": + return state === "idle" || state === "running" + ? { type: "agent-status", state } + : undefined; + default: + return; + } +} + +import { + type ContextServer, + parseContextServer, +} from "../../lina-core/src/context-wire.ts"; +import { + type ControlServer, + parseControlServer, +} from "../../lina-core/src/control-wire.ts"; +import { + parseWireClient, + parseWireServer, + type WireServer, +} from "../../lina-core/src/wire.ts"; diff --git a/packages/lina-web/client/search-model.ts b/packages/lina-client/src/search-model.ts similarity index 100% rename from packages/lina-web/client/search-model.ts rename to packages/lina-client/src/search-model.ts diff --git a/packages/lina-client/src/task-drafts.ts b/packages/lina-client/src/task-drafts.ts new file mode 100644 index 0000000..3c36c80 --- /dev/null +++ b/packages/lina-client/src/task-drafts.ts @@ -0,0 +1,98 @@ +export type TaskDraft = { input: string; owner?: string }; +export type TaskStorage = { + getItem(key: string): string | null; + setItem(key: string, value: string): void; + removeItem(key: string): void; +}; +const key = (id: string) => `lina.task-draft.v1.${id}`; +const SCOPE = "lina.task-scope.v1"; + +/** Device state only; failed writes keep the live draft and block destructive departure. */ +export class TaskDraftStore { + private readonly cache = new Map(); + private readonly dirty = new Set(); + private readonly stored = new Set(); + private selectedScope: "selected" | "all"; + constructor(private readonly storage?: TaskStorage) { + try { + this.selectedScope = + storage?.getItem(SCOPE) === "all" ? "all" : "selected"; + } catch { + this.selectedScope = "selected"; + } + } + get(id: string): TaskDraft | undefined { + if (this.cache.has(id)) return this.cache.get(id); + let draft: TaskDraft | undefined; + try { + const raw = this.storage?.getItem(key(id)); + const value: unknown = + raw && raw.length <= 262144 ? JSON.parse(raw) : null; + if ( + value && + typeof value === "object" && + "input" in value && + typeof value.input === "string" && + value.input.length <= 65536 + ) { + const owner = "owner" in value ? value.owner : undefined; + if ( + owner === undefined || + (typeof owner === "string" && /^[a-z][a-z0-9-]{0,47}$/.test(owner)) + ) + draft = { input: value.input, ...(owner ? { owner } : {}) }; + } + } catch { + /* Untrusted optional device state cannot replace validated server data. */ + } + if (draft) this.stored.add(id); + this.cache.set(id, draft); + return draft; + } + set(id: string, draft: TaskDraft): boolean { + this.get(id); + if (!draft.input && !draft.owner) return this.delete(id); + this.cache.set(id, { ...draft }); + this.dirty.add(id); + return this.persist(id); + } + delete(id: string): boolean { + if (!this.get(id) && !this.dirty.has(id)) return true; + this.cache.set(id, undefined); + if (!this.stored.has(id)) { + this.dirty.delete(id); + return true; + } + this.dirty.add(id); + return this.persist(id); + } + private persist(id: string): boolean { + if (!this.storage) return false; + try { + const draft = this.cache.get(id); + if (draft) this.storage.setItem(key(id), JSON.stringify(draft)); + else this.storage.removeItem(key(id)); + if (draft) this.stored.add(id); + else this.stored.delete(id); + this.dirty.delete(id); + return true; + } catch { + return false; + } + } + flush(): boolean { + for (const id of this.dirty) this.persist(id); + return this.dirty.size === 0; + } + scope(): "selected" | "all" { + return this.selectedScope; + } + setScope(scope: "selected" | "all"): void { + this.selectedScope = scope; + try { + this.storage?.setItem(SCOPE, scope); + } catch { + /* The selected filter remains in memory. */ + } + } +} diff --git a/packages/lina-client/src/task-types.ts b/packages/lina-client/src/task-types.ts new file mode 100644 index 0000000..be31a0d --- /dev/null +++ b/packages/lina-client/src/task-types.ts @@ -0,0 +1,38 @@ +export type TaskApproval = { + id: string; + method: string; + params: unknown; + createdAt: string; +}; + +export type ApprovalDecision = + | "accept" + | "decline" + | "cancel" + | "acceptForSession"; + +export type TaskRecord = { + id: string; + threadId: string | null; + ownerAgentId: string; + title: string; + cwd: string; + status: string; + revision: number; + updatedAt: string; + model: string | null; + pendingApprovals: TaskApproval[]; +}; + +export function taskStatusLabel(status: string): string { + if (status === "inProgress" || status === "running") return "진행 중"; + if (status === "waiting_approval") return "확인 대기"; + if (status === "waiting_input") return "입력 대기"; + if (status === "needs_attention") return "확인 필요"; + if (status === "creating") return "만드는 중"; + if (status === "completed") return "완료"; + if (status === "interrupted") return "중단됨"; + if (status === "failed") return "실패"; + if (status === "queued" || status === "idle") return "대기"; + return status; +} diff --git a/packages/lina-desktop/.gitignore b/packages/lina-desktop/.gitignore new file mode 100644 index 0000000..8c559c7 --- /dev/null +++ b/packages/lina-desktop/.gitignore @@ -0,0 +1,3 @@ +dist/ +out/ +.qa/ diff --git a/packages/lina-desktop/README.md b/packages/lina-desktop/README.md new file mode 100644 index 0000000..633daa5 --- /dev/null +++ b/packages/lina-desktop/README.md @@ -0,0 +1,216 @@ +# Lina desktop + +An Electron client for an independently running Lina web server. The app bundles +exactly the renderer built by `lina-web/src/assets.ts`; it does not start an +execution engine, web development server, or Bun at runtime. + +## Build and run + +From the repository root, install the committed workspace lockfile with lifecycle +scripts disabled, then build or package: + +```sh +bun install --frozen-lockfile --ignore-scripts +bun run --cwd packages/lina-desktop build +bun run --cwd packages/lina-desktop package +bun run --cwd packages/lina-desktop make +``` + +`package` produces the application directory under `out/`; `make` additionally +produces a ZIP for the current platform. Neither command publishes, signs, installs +an OS service, or changes a running Lina server. Forge downloads Electron as part +of packaging; no trusted install hook is added. Use Node >=22.12 for Forge. + +Linux example, connecting to an explicitly selected Lina web gateway: + +```sh +LINA_DESKTOP_SERVER_URL=http://127.0.0.1:18140 \ +LINA_DESKTOP_PORT=18141 \ +LINA_DESKTOP_USER_DATA=/tmp/lina-desktop-example/desktop \ +packages/lina-desktop/out/Lina-linux-x64/lina-desktop +``` + +For development, `bun run --cwd packages/lina-desktop start` uses an already +provisioned Electron binary. An ignored install script is not permission to turn +on dependency hooks. Packaging provides a separate executable without such a hook. + +| Setting | Meaning | +| --- | --- | +| `LINA_DESKTOP_SERVER_URL` | Required exact `http://127.0.0.1:PORT` or `http://[::1]:PORT`; points to Lina **web**, not the intervention socket | +| `LINA_DESKTOP_PORT` | Stable broker port, default `43127`; QA reserves `18141` | +| `LINA_DESKTOP_USER_DATA` | Absolute isolated profile path; default `$LINA_HOME/desktop` or `~/.lina/desktop` | +| `LINA_DESKTOP_EXTERNAL_ORIGINS` | Comma-separated exact HTTPS origins allowed in the OS browser; default `https://github.com`; an empty value denies all | + +The app never falls back to another broker port. `connection.json` binds the +profile to its configured server and broker port. Reusing a profile with either +changed is rejected; use a separate profile to avoid mixing old drafts with a +different server. Electron session data lives in the profile's `sessions/` +directory and the `persist:lina-desktop` partition. The server setting must be +provided on each launch; it is not inferred from open ports or renderer input. + +## Transport and process boundary + +The renderer uses its ordinary same-origin fetch and `/ws` contracts: + +```text +shared renderer → authenticated 127.0.0.1 broker → pinned Lina web gateway + Electron main existing Host/Origin checks +``` + +The existing server creates browser assets with Bun. A `file://` renderer would +break its same-origin API, attachment and WS paths, while loading remote server +HTML would make the desktop shell unavailable offline. This package instead +writes the existing `loadWebAssets()` output to a checksummed disk manifest and +serves it from main's loopback broker. Only web/PWA metadata and service-worker +files are omitted. Shared model/parser code remains owned by `lina-client` and +Lina web; no copied engine or wire model lives in this package. + +`src/config.ts` validates operator configuration; `session.ts` owns the ephemeral +credential and persistent profile binding; `routes.ts` is the desktop egress +allowlist; `broker.ts`, `http-proxy.ts`, and `socket-proxy.ts` implement Node +transport; `window.ts` owns Electron/OS policy. Bun-dependent build code stays in +`scripts/`. Runtime code only imports Node builtins and Electron. + +The broker accepts only a main-generated 256-bit credential installed directly +with `session.cookies.set` before navigation. No HTTP route issues or returns it. +The cookie is host-only, HttpOnly, SameSite=Strict, and session-only; it rotates +on every main-process start. `secure: false` is intentional for the literal +loopback HTTP origin. Cookies have no port boundary, so Electron blocks requests +to every other origin before networking; the broker separately validates exact +Host and Origin. The cookie is never forwarded upstream or exposed by preload. + +HTTP forwarding validates raw path, method, query, and bounded bodies. It allows +only the existing attachment, agent, model, hub, task, onboarding and intro +contracts. It sets upstream Host/Origin for the pinned destination, rejects all +redirects, and forwards only required metadata. Upstream Set-Cookie and Location +are dropped. Attachment authorization and domain schemas still run on Lina. + +WS forwarding validates the cookie, exact Origin, `/ws?agent=...`, handshake +version/key and upstream accept value. It does not follow redirects or negotiate +extensions/subprotocols. Node streams provide backpressure; the existing Lina web +gateway retains frame parsing and payload limits. At most eight desktop tunnels +are accepted. Closing the window/app closes transport; it does not stop server +work. HTTP failures return 502; existing shared-renderer retry and WS reconnect +behavior can recover while bundled assets remain available. + +## OS surface + +The window enables `sandbox`, `contextIsolation`, and `webSecurity`, disables Node +integration/webviews, denies permission requests and foreign navigation, and +installs the normal Edit/View/Window menus. One instance owns each profile. +macOS keeps the app alive when its window closes and reopens it on activation; +other platforms quit when all windows close. Quitting flushes browser storage and +closes broker connections. + +Preload exposes only: + +```ts +window.linaDesktop = { + platform: "desktop", + openExternal(url: string): Promise, + notify(input: { title: string; body: string }): Promise +} +``` + +Every OS IPC call checks the owning webContents and main frame, validates input, +and uses a dedicated channel. There is no general IPC, file-path read, shell +command, credential, or transport API. Shared UI uses the marker to skip PWA +registration. Native file inputs and ordinary attachment downloads keep their +existing browser behavior; validated attachment downloads use the native save +dialog. Notifications accept only bounded title/body text. The existing “Codex에서 열기” +control opens only `codex://threads/` with 1–128 ASCII letters, digits, +underscores or hyphens. Validation checks the raw URI before normalization; +commands, nested/encoded paths, credentials, ports, query and fragment are denied. +This opens the registered OS handler for that existing thread and never creates +another task. A missing/broken handler produces a native error dialog and rejects +an IPC request. HTTPS links still require exact allowlisted origins; register the +OpenCodex hub's HTTPS origin, including a nondefault port, explicitly when needed. App updates, signing, +IME/paste qualification and additional native OS capabilities need separate proof. + +## Threat model and verification + +Assets are local conversations/drafts, uploaded files and the broker credential. +Entry points are HTTP/WS headers and paths, renderer IPC, navigation, downloads and +operator configuration. A hostile website or forged local browser request must +not reach Lina through the desktop broker, learn its token, select another +upstream, or gain arbitrary OS capabilities. The explicitly configured Lina web +service and the OS account running main are trusted. This is not isolation from +a malicious process already able to read that account's memory/profile files. + +Must-pass checks cover missing/duplicate/wrong cookies, Host/Origin mismatch, +cross-port requests, path/query/method rejection, redirects and invalid WS +handshakes, metadata preservation, body bounds, offline recovery, profile binding, +IPC sender/subframe rejection, and the absence of broad preload capabilities. +Tests use real loopback servers and explicit events, with no sleep or provider +calls. `web-contract.test.ts` traverses the actual unchanged Lina web gateway; +`node-runtime.test.ts` builds and runs the broker in a separate Node process. + +```sh +bun test packages/lina-desktop/test +bun run --cwd packages/lina-desktop typecheck +bunx --no-install biome check packages/lina-desktop --diagnostic-level=warn +bun run --cwd packages/lina-desktop package +bun scripts/ci/audit.ts +``` + +Runtime TypeScript uses DOM + Electron's referenced Node declarations. Build/tests +use the repository's Bun configuration in `tsconfig.build.json`. The root compiler +must exclude this package and call its separate check, avoiding Electron's DOM +fetch declarations leaking into Bun server source. + +## Version evidence and qualification + +Checked 2026-09-07: [Electron stable releases](https://releases.electronjs.org/?channel=stable) +listed **44.2.0**, also verified against installed package metadata and the Linux +artifact's `version` file. [Forge 8.0.0-alpha.10](https://github.com/electron/forge/releases/tag/v8.0.0-alpha.10) +is explicitly a **prerelease**. Its official change list replaces extract-zip, +and its registry metadata moves to packager 20/rebuild 4. It is selected because +the latest stable Forge 7.11.2 introduced failing repository audit findings in +extract-zip 2.0.1, tar 6.2.1 and tmp 0.0.33. The +[extract-zip advisory](https://github.com/advisories/GHSA-jmr9-qjv8-65gv) +has no fixed version under that package name. No audit finding is suppressed. The final installed graph used packager **20.3.0**, +rebuild **4.2.0**, electron-internal/extract-zip **1.0.5**, and tar **7.5.22**; +extract-zip and tmp were absent. `bun scripts/ci/audit.ts` passed both the lockfile +check (135 packages) and installed-package check (129 names). No root overrides +were needed. Obsolete Forge 7 store entries were preserved outside `node_modules` +after checking the new lockfile and reachable dependency links; this avoids stale +packages contaminating the installed inventory without changing audit policy. +Forge 8 `package` and `make` both completed on Linux x64. The executable basename +was verified as `out/Lina-linux-x64/lina-desktop`; ZIP output is +`out/make/zip/linux/x64/Lina-linux-x64-0.1.0.zip`. + +Quit cleanup runs on `will-quit`, after all windows have closed, so a renderer +that vetoes closing for an unfinished upload retains its transport. +`lifecycle.test.ts` exercises the compiled main entry with controlled Electron +boundaries; this does not replace the remaining graphical acceptance. See the +[app lifecycle](https://www.electronjs.org/docs/latest/api/app#event-will-quit). + +Security API references: [Electron security](https://www.electronjs.org/docs/latest/tutorial/security), +[cookie API](https://www.electronjs.org/docs/latest/api/cookies), and +[session API](https://www.electronjs.org/docs/latest/api/session). + +Initial RED runs failed on the absent `config.ts`, `broker.ts`, bundle writer and +`window-policy.ts` before their implementation. A later real contract RED returned +405 for onboarding draft PATCH; fixing that route and memory refresh POST restored +the transport suite. The Codex thread link test then failed with “Only HTTPS links +without credentials are allowed”; the strict thread exception passed the same +positive/negative test. An OS-handler failure initially produced no dialog; the +shared native-error boundary made that regression pass. + +The native Node regression also reproduced an unhandled `write ECONNRESET` when +an unauthenticated upgrade peer called `resetAndDestroy()` immediately after its +write. No upstream connection is reached on that path, isolating the fault to the +rejection socket after Node removes its HTTP error listener. `rejectUpgrade` now +installs its error listener before every rejection write. Repeating those TCP +resets and then a successful authenticated HTTP request passes in Node and the +packaged Electron Node runtime. Scope-local verification results are recorded in the executor +handoff; repeat them after shared-renderer or dependency changes. + +The first Linux graphical launch reached Chromium but aborted because the +`chrome-sandbox` helper lacked root ownership/mode 4755. `unshare -Ur true` also +failed with `Operation not permitted` on this host. No sandbox flag, host policy, +or privileged permission was changed. Therefore Linux graphical UI, browser +storage across a real Electron restart, OS dialogs and notifications are **not yet +qualified here**. The packaged Electron executable did run the compiled broker +successfully with `ELECTRON_RUN_AS_NODE=1`; that proves its Node transport runtime, +not the sandboxed renderer. macOS/Windows launch and packaging remain untested. diff --git a/packages/lina-desktop/biome.json b/packages/lina-desktop/biome.json new file mode 100644 index 0000000..63b7d67 --- /dev/null +++ b/packages/lina-desktop/biome.json @@ -0,0 +1,5 @@ +{ + "root": false, + "extends": "//", + "files": { "includes": ["**", "!**/dist", "!**/out", "!**/.qa"] } +} diff --git a/packages/lina-desktop/forge.config.cjs b/packages/lina-desktop/forge.config.cjs new file mode 100644 index 0000000..d50aad6 --- /dev/null +++ b/packages/lina-desktop/forge.config.cjs @@ -0,0 +1,21 @@ +// Forge is a development tool. The packaged application contains only dist + package metadata. +module.exports = { + packagerConfig: { + asar: true, + name: "Lina", + executableName: "lina-desktop", + appBundleId: "app.lina.desktop", + prune: true, + ignore: (path) => + path !== "" && + path !== "/package.json" && + path !== "/dist" && + !path.startsWith("/dist/"), + }, + makers: [ + { + name: "@electron-forge/maker-zip", + platforms: ["darwin", "linux", "win32"], + }, + ], +}; diff --git a/packages/lina-desktop/package.json b/packages/lina-desktop/package.json new file mode 100644 index 0000000..ec3f756 --- /dev/null +++ b/packages/lina-desktop/package.json @@ -0,0 +1,26 @@ +{ + "name": "@lina/desktop", + "productName": "Lina", + "version": "0.1.0", + "private": true, + "description": "Bundled Lina desktop client; connects to an independently running Lina web server", + "license": "Apache-2.0", + "author": "Lina contributors", + "main": "dist/main.cjs", + "scripts": { + "build": "bun scripts/build.ts", + "start": "electron .", + "package": "bun run build && electron-forge package", + "make": "bun run build && electron-forge make", + "test": "bun test test", + "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.build.json" + }, + "devDependencies": { + "electron": "44.2.0", + "@electron-forge/cli": "8.0.0-alpha.10", + "@electron-forge/maker-zip": "8.0.0-alpha.10" + }, + "config": { + "forge": "./forge.config.cjs" + } +} diff --git a/packages/lina-desktop/scripts/build.ts b/packages/lina-desktop/scripts/build.ts new file mode 100644 index 0000000..34d6a38 --- /dev/null +++ b/packages/lina-desktop/scripts/build.ts @@ -0,0 +1,27 @@ +import { mkdir, rm } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { loadWebAssets } from "../../lina-web/src/assets.ts"; +import { writeBundle } from "./bundle-assets.ts"; + +const root = new URL("../", import.meta.url); +const out = fileURLToPath(new URL("dist/", root)); +const assets = await loadWebAssets(); +// Only generated package output is replaced; userData and sessions are elsewhere. +await rm(out, { recursive: true, force: true }); +await mkdir(out, { recursive: true }); +await writeBundle(fileURLToPath(new URL("dist/assets/", root)), assets); +for (const entry of ["main", "preload"]) { + const result = await Bun.build({ + entrypoints: [fileURLToPath(new URL(`src/${entry}.ts`, root))], + outdir: out, + naming: `${entry}.cjs`, + target: "node", + format: "cjs", + external: ["electron"], + }); + if (!result.success) + throw new AggregateError(result.logs, `Desktop ${entry} build failed`); +} +console.log( + `Desktop main, preload and bundled shared renderer built in ${out}`, +); diff --git a/packages/lina-desktop/scripts/bundle-assets.ts b/packages/lina-desktop/scripts/bundle-assets.ts new file mode 100644 index 0000000..d8492b2 --- /dev/null +++ b/packages/lina-desktop/scripts/bundle-assets.ts @@ -0,0 +1,50 @@ +import { createHash } from "node:crypto"; +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import type { WebAssets } from "../../lina-web/src/server.ts"; + +/** Shared browser output is the sole renderer source; only PWA metadata is omitted. */ +export async function writeBundle( + directory: string, + assets: WebAssets, +): Promise { + await mkdir(directory, { recursive: true }); + const html = assets.html.replace(/]*\brel="manifest"[^>]*>/gi, ""); + const files = new Map([ + ["/", { body: html, mime: "text/html; charset=utf-8" }], + [ + "/app.js", + { body: assets.script, mime: "text/javascript; charset=utf-8" }, + ], + ["/styles.css", { body: assets.css, mime: "text/css; charset=utf-8" }], + [ + "/theme.js", + { + body: assets.themeScript ?? "", + mime: "text/javascript; charset=utf-8", + }, + ], + ["/favicon.svg", { body: assets.icon, mime: "image/svg+xml" }], + ]); + const manifest: Array<{ url: string; file: string; mime: string }> = []; + const all = new Map( + files, + ); + for (const [url, value] of assets.pwa?.files ?? []) { + if (!url.endsWith(".html") && !url.endsWith(".webmanifest")) + all.set(url, value); + } + for (const [url, value] of all) { + const body = + typeof value.body === "string" + ? Buffer.from(value.body) + : Buffer.from(value.body); + const file = `${createHash("sha256").update(body).digest("hex")}.bin`; + await writeFile(join(directory, file), body); + manifest.push({ url, file, mime: value.mime }); + } + await writeFile( + join(directory, "manifest.json"), + `${JSON.stringify({ format: 1, rendererVersion: assets.pwa?.version, files: manifest }, null, 2)}\n`, + ); +} diff --git a/packages/lina-desktop/scripts/qa-node.ts b/packages/lina-desktop/scripts/qa-node.ts new file mode 100644 index 0000000..77c683f --- /dev/null +++ b/packages/lina-desktop/scripts/qa-node.ts @@ -0,0 +1,65 @@ +import assert from "node:assert/strict"; +import { once } from "node:events"; +import { createServer } from "node:http"; +import { connect } from "node:net"; +import { startBroker } from "../src/broker.ts"; +import { createBrokerSession } from "../src/session.ts"; + +// Executed as compiled Node code, independent of Bun's node:http compatibility layer. +const upstream = createServer((req, res) => { + res.setHeader("content-type", "application/json"); + res.end( + JSON.stringify({ + origin: req.headers.origin, + cookie: req.headers.cookie ?? null, + }), + ); +}); +upstream.listen(0, "127.0.0.1"); +await once(upstream, "listening"); +const address = upstream.address(); +assert(address && typeof address !== "string"); +const serverOrigin = `http://127.0.0.1:${address.port}`; +const session = createBrokerSession(); +const broker = await startBroker({ + port: 0, + serverOrigin, + session, + assets: new Map([["/", { body: Buffer.from("bundled"), mime: "text/html" }]]), +}); +try { + // An unauthenticated peer can reset immediately after writing the upgrade. + // Native Node emits an asynchronous write error while sending the rejection. + for (let attempt = 0; attempt < 16; attempt++) { + await new Promise((resolve, reject) => { + const socket = connect(Number(new URL(broker.origin).port), "127.0.0.1"); + socket.once("error", reject); + socket.once("close", () => resolve()); + socket.once("connect", () => + socket.write( + `GET /ws HTTP/1.1\r\nHost: ${new URL(broker.origin).host}\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\n\r\n`, + () => socket.resetAndDestroy(), + ), + ); + }); + } + assert.equal((await fetch(broker.origin)).status, 403); + const response = await fetch(`${broker.origin}/api/agents`, { + headers: { + origin: broker.origin, + cookie: `lina_desktop=${session.cookie(broker.origin).value}`, + }, + }); + assert.equal(response.status, 200); + assert.deepEqual(await response.json(), { + origin: serverOrigin, + cookie: null, + }); + console.log( + "Node desktop broker: TCP reset survival, auth, upstream Host/Origin, secret stripping PASS", + ); +} finally { + await broker.close(); + upstream.closeAllConnections(); + await new Promise((resolve) => upstream.close(() => resolve())); +} diff --git a/packages/lina-desktop/src/broker.ts b/packages/lina-desktop/src/broker.ts new file mode 100644 index 0000000..e5874e4 --- /dev/null +++ b/packages/lina-desktop/src/broker.ts @@ -0,0 +1,163 @@ +import { createServer, type IncomingMessage } from "node:http"; +import type { Socket } from "node:net"; +import { serverOrigin } from "./config.ts"; +import { proxyHttp } from "./http-proxy.ts"; +import { apiStatus, requestUrl, socketPath } from "./routes.ts"; +import type { BrokerSession } from "./session.ts"; +import { proxySocket, rejectUpgrade } from "./socket-proxy.ts"; + +export type BundledAsset = { readonly body: Buffer; readonly mime: string }; +export type BundledAssets = ReadonlyMap; +const SECURITY = { + "cache-control": "no-store", + "x-content-type-options": "nosniff", + "x-frame-options": "DENY", + "referrer-policy": "no-referrer", + "cross-origin-resource-policy": "same-origin", + "content-security-policy": + "default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' blob:; connect-src 'self'; base-uri 'none'; frame-ancestors 'none'; form-action 'self'; worker-src 'none'", +}; + +function trusted( + request: IncomingMessage, + origin: string, + session: BrokerSession, + active: boolean, +): boolean { + for (const name of ["host", "origin", "cookie"]) { + if ( + request.rawHeaders.filter( + (_, i) => i % 2 === 0 && request.rawHeaders[i]?.toLowerCase() === name, + ).length > 1 + ) + return false; + } + if ( + request.headers.host !== new URL(origin).host || + !session.authorizes(request.headers.cookie) + ) + return false; + const supplied = request.headers.origin; + if (supplied !== undefined) return supplied === origin; + return ( + !active || + (request.method === "GET" && + request.headers["sec-fetch-site"] === "same-origin") + ); +} + +export async function startBroker(options: { + port: number; + serverOrigin: string; + session: BrokerSession; + assets: BundledAssets; +}) { + const targetOrigin = serverOrigin( + `${options.serverOrigin}${new URL(options.serverOrigin).port ? "" : ":80"}`, + ); + let origin = ""; + const sockets = new Set(); + let upgrades = 0; + const server = createServer({ maxHeaderSize: 16_384 }, (req, res) => { + for (const [key, value] of Object.entries(SECURITY)) + res.setHeader(key, value); + const fail = (status: number, message: string) => { + res.writeHead(status); + res.end(message); + req.resume(); + }; + const url = requestUrl(req.url, origin); + if (!url) { + fail(400, "Invalid path"); + return; + } + const api = url.pathname.startsWith("/api/"); + if (!trusted(req, origin, options.session, api)) { + fail(403, "Forbidden"); + return; + } + if (api) { + const status = apiStatus(url, req.method ?? ""); + if (status !== 0) { + fail(status ?? 404, "Unsupported request"); + return; + } + res.setHeader( + "content-security-policy", + "default-src 'none'; frame-ancestors 'none'; sandbox", + ); + void proxyHttp( + req, + res, + new URL(url.pathname + url.search, targetOrigin), + ); + return; + } + if (req.method !== "GET" && req.method !== "HEAD") { + fail(405, "Method not allowed"); + return; + } + const asset = options.assets.get(url.pathname); + if (!asset || (url.search && url.pathname !== "/")) { + fail(404, "Not found"); + return; + } + res.setHeader("content-type", asset.mime); + res.end(req.method === "HEAD" ? undefined : asset.body); + }); + server.headersTimeout = 15_000; + server.requestTimeout = 90_000; + server.keepAliveTimeout = 5_000; + server.maxConnections = 64; + server.on("connection", (socket) => { + sockets.add(socket); + socket.on("close", () => sockets.delete(socket)); + }); + server.on("upgrade", (req, socket, head) => { + const url = requestUrl(req.url, origin); + if ( + !trusted(req, origin, options.session, true) || + req.headers.origin !== origin + ) { + rejectUpgrade(socket, 403); + return; + } + if (!url || req.method !== "GET" || !socketPath(url)) { + rejectUpgrade(socket, 400); + return; + } + if (upgrades >= 8) { + rejectUpgrade(socket, 429); + return; + } + upgrades++; + socket.once("close", () => { + upgrades--; + }); + proxySocket( + req, + socket, + head, + new URL(url.pathname + url.search, targetOrigin), + ); + }); + await new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(options.port, "127.0.0.1", () => { + server.removeListener("error", reject); + resolve(); + }); + }); + const address = server.address(); + if (!address || typeof address === "string") + throw Error("Missing desktop broker port"); + origin = `http://127.0.0.1:${address.port}`; + return { + origin, + close: () => + new Promise((resolve) => { + server.close(() => resolve()); + for (const socket of sockets) socket.destroy(); + }), + }; +} diff --git a/packages/lina-desktop/src/bundled-assets.ts b/packages/lina-desktop/src/bundled-assets.ts new file mode 100644 index 0000000..e24e2df --- /dev/null +++ b/packages/lina-desktop/src/bundled-assets.ts @@ -0,0 +1,41 @@ +import { createHash } from "node:crypto"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; +import type { BundledAsset, BundledAssets } from "./broker.ts"; + +export async function loadBundle(directory: string): Promise { + const manifest: unknown = JSON.parse( + await readFile(join(directory, "manifest.json"), "utf8"), + ); + if ( + !manifest || + typeof manifest !== "object" || + !("format" in manifest) || + manifest.format !== 1 || + !("files" in manifest) || + !Array.isArray(manifest.files) + ) + throw Error("Invalid desktop bundle manifest"); + const assets = new Map(); + for (const item of manifest.files) { + if ( + !item || + typeof item !== "object" || + typeof item.url !== "string" || + !/^\/(?:[a-zA-Z0-9/_.-]+)?$/.test(item.url) || + item.url.includes("..") || + typeof item.file !== "string" || + !/^[a-f0-9]{64}\.bin$/.test(item.file) || + typeof item.mime !== "string" || + /[\r\n]/.test(item.mime) || + assets.has(item.url) + ) + throw Error("Invalid desktop bundle entry"); + const body = await readFile(join(directory, item.file)); + if (`${createHash("sha256").update(body).digest("hex")}.bin` !== item.file) + throw Error("Desktop bundle checksum mismatch"); + assets.set(item.url, { body, mime: item.mime }); + } + if (!assets.has("/")) throw Error("Desktop bundle is missing its page"); + return assets; +} diff --git a/packages/lina-desktop/src/config.ts b/packages/lina-desktop/src/config.ts new file mode 100644 index 0000000..cf9f877 --- /dev/null +++ b/packages/lina-desktop/src/config.ts @@ -0,0 +1,97 @@ +import { homedir } from "node:os"; +import { isAbsolute, join } from "node:path"; + +export type DesktopConfig = { + readonly serverOrigin: string; + readonly brokerPort: number; + readonly userData: string; + readonly sessionData: string; + readonly externalOrigins: readonly string[]; +}; +const DEFAULT_BROKER_PORT = 43127; + +function port(raw: string): number { + if (!/^[1-9]\d{0,4}$/.test(raw) || Number(raw) > 65535) + throw Error("Desktop port must be an integer from 1 to 65535."); + return Number(raw); +} + +/** Reject DNS and noncanonical IP spellings before URL normalization. */ +export function serverOrigin(raw: string): string { + const match = /^http:\/\/(127\.0\.0\.1|\[::1\]):([1-9]\d{0,4})\/?$/.exec(raw); + if (!match?.[2]) + throw Error( + "LINA_DESKTOP_SERVER_URL must be http://127.0.0.1:PORT or http://[::1]:PORT.", + ); + port(match[2]); + return new URL(raw).origin; +} + +function httpsUrl(raw: unknown): URL { + if (typeof raw !== "string" || raw.length > 4096 || /[\s\\]/u.test(raw)) + throw Error("Invalid external link."); + const url = new URL(raw); + if (url.protocol !== "https:" || url.username || url.password) + throw Error("Only HTTPS links without credentials are allowed."); + return url; +} + +export function externalUrl(raw: unknown, origins: readonly string[]): string { + // Match the raw form: URL normalization must not turn traversal into a thread link. + if ( + typeof raw === "string" && + /^codex:\/\/threads\/[a-zA-Z0-9_-]{1,128}$/.test(raw) + ) + return raw; + const url = httpsUrl(raw); + if (!origins.includes(url.origin)) + throw Error("External site is not allowed."); + return url.href; +} + +export function desktopConfig( + env: Record, +): DesktopConfig { + const upstream = env["LINA_DESKTOP_SERVER_URL"]; + if (!upstream) + throw Error( + "Set LINA_DESKTOP_SERVER_URL to your Lina web server's loopback HTTP origin.", + ); + const origin = serverOrigin(upstream); + const brokerPort = port( + env["LINA_DESKTOP_PORT"] ?? String(DEFAULT_BROKER_PORT), + ); + if (Number(new URL(origin).port || 80) === brokerPort) + throw Error("Lina server and desktop broker must use different ports."); + const userData = + env["LINA_DESKTOP_USER_DATA"] ?? + join(env["LINA_HOME"] ?? join(homedir(), ".lina"), "desktop"); + if (!isAbsolute(userData)) + throw Error("Desktop data directory must be absolute."); + const externalOrigins = ( + env["LINA_DESKTOP_EXTERNAL_ORIGINS"] ?? "https://github.com" + ) + .split(",") + .filter(Boolean) + .map((value) => { + const url = httpsUrl(value); + if ( + url.pathname !== "/" || + url.search || + url.hash || + url.hostname === "localhost" || + /^[\d[]/.test(url.hostname) + ) + throw Error( + "External allowlist entries must be exact public HTTPS origins.", + ); + return url.origin; + }); + return { + serverOrigin: origin, + brokerPort, + userData, + sessionData: join(userData, "sessions"), + externalOrigins, + }; +} diff --git a/packages/lina-desktop/src/http-proxy.ts b/packages/lina-desktop/src/http-proxy.ts new file mode 100644 index 0000000..5800ef9 --- /dev/null +++ b/packages/lina-desktop/src/http-proxy.ts @@ -0,0 +1,98 @@ +import { type IncomingMessage, request, type ServerResponse } from "node:http"; + +const UPLOAD_LIMIT = 2_097_152; +const RESPONSE_LIMIT = UPLOAD_LIMIT + 65_536; +const HEADERS = [ + "content-type", + "x-lina-session", + "x-lina-filename", + "x-lina-revision", +]; + +async function bounded( + stream: IncomingMessage, + limit: number, +): Promise { + const chunks: Buffer[] = []; + let size = 0; + for await (const value of stream) { + const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value); + size += chunk.length; + if (size > limit) throw new RangeError("Body too large"); + chunks.push(chunk); + } + return Buffer.concat(chunks, size); +} + +export async function proxyHttp( + incoming: IncomingMessage, + outgoing: ServerResponse, + target: URL, +): Promise { + const upload = + target.pathname === "/api/attachments" || + target.pathname.endsWith("/avatar"); + const limit = upload ? UPLOAD_LIMIT : 65_536; + if (Number(incoming.headers["content-length"] ?? 0) > limit) { + outgoing.writeHead(413); + outgoing.end("Request too large"); + incoming.resume(); + return; + } + const cancel = new AbortController(); + const signal = AbortSignal.any([cancel.signal, AbortSignal.timeout(85_000)]); + const disconnect = () => { + if (!outgoing.writableFinished) cancel.abort(); + }; + outgoing.once("close", disconnect); + const abortRead = () => incoming.destroy(); + signal.addEventListener("abort", abortRead, { once: true }); + try { + const body = await bounded(incoming, limit); + signal.removeEventListener("abort", abortRead); + const headers: Record = { + origin: target.origin, + "sec-fetch-site": "same-origin", + "accept-encoding": "identity", + }; + for (const key of HEADERS) { + const value = incoming.headers[key]; + if (typeof value === "string" && value.length <= 1024) + headers[key] = value; + } + headers["content-length"] = String(body.length); + const response = await new Promise((resolve, reject) => { + const req = request( + target, + { method: incoming.method, headers, signal }, + resolve, + ); + req.on("error", reject); + req.end(body); + }); + const status = response.statusCode ?? 502; + if (status >= 300 && status < 400) { + response.destroy(); + throw Error("Redirect rejected"); + } + const result = await bounded(response, RESPONSE_LIMIT); + for (const key of ["content-type", "content-disposition", "retry-after"]) { + const value = response.headers[key]; + if (typeof value === "string") outgoing.setHeader(key, value); + } + outgoing.writeHead(status); + outgoing.end(result); + } catch (error) { + if (!outgoing.destroyed) { + outgoing.writeHead(error instanceof RangeError ? 413 : 502); + outgoing.end( + error instanceof RangeError + ? "Body too large" + : "Lina unavailable. Retry when the server is connected.", + ); + } + } finally { + signal.removeEventListener("abort", abortRead); + outgoing.removeListener("close", disconnect); + } +} diff --git a/packages/lina-desktop/src/main.ts b/packages/lina-desktop/src/main.ts new file mode 100644 index 0000000..a7b8263 --- /dev/null +++ b/packages/lina-desktop/src/main.ts @@ -0,0 +1,100 @@ +import { mkdirSync } from "node:fs"; +import { join } from "node:path"; +import { + app, + type BrowserWindow, + dialog, + Menu, + type MenuItemConstructorOptions, + session, +} from "electron"; +import { startBroker } from "./broker.ts"; +import { loadBundle } from "./bundled-assets.ts"; +import { desktopConfig } from "./config.ts"; +import { bindProfile, createBrokerSession } from "./session.ts"; +import { createWindow, installOsHandlers, prepareSession } from "./window.ts"; + +app.setName("Lina"); +app.enableSandbox(); + +async function start(): Promise { + const config = desktopConfig(process.env); + mkdirSync(config.userData, { recursive: true, mode: 0o700 }); + mkdirSync(config.sessionData, { recursive: true, mode: 0o700 }); + app.setPath("userData", config.userData); + app.setPath("sessionData", config.sessionData); + if (!app.requestSingleInstanceLock()) { + app.quit(); + return; + } + await bindProfile(config); + await app.whenReady(); + const credential = createBrokerSession(); + const broker = await startBroker({ + port: config.brokerPort, + serverOrigin: config.serverOrigin, + session: credential, + assets: await loadBundle(join(__dirname, "assets")), + }); + const desktopSession = session.fromPartition("persist:lina-desktop"); + await prepareSession(desktopSession, broker.origin); + await desktopSession.cookies.set(credential.cookie(broker.origin)); + let window: BrowserWindow | undefined; + const showWindow = () => { + if (!window || window.isDestroyed()) + window = createWindow( + desktopSession, + broker.origin, + config.externalOrigins, + ); + else { + if (window.isMinimized()) window.restore(); + window.show(); + window.focus(); + } + }; + installOsHandlers(() => window, broker.origin, config.externalOrigins); + const menu: MenuItemConstructorOptions[] = [ + ...(process.platform === "darwin" + ? [{ role: "appMenu" as const }] + : [{ label: "Lina", submenu: [{ role: "quit" as const }] }]), + { role: "editMenu" }, + { + label: "보기", + submenu: [ + { role: "reload" }, + { type: "separator" }, + { role: "resetZoom" }, + { role: "zoomIn" }, + { role: "zoomOut" }, + { role: "togglefullscreen" }, + ], + }, + { role: "windowMenu" }, + ]; + Menu.setApplicationMenu(Menu.buildFromTemplate(menu)); + app.on("second-instance", showWindow); + app.on("activate", showWindow); + app.on("window-all-closed", () => { + if (process.platform !== "darwin") app.quit(); + }); + let stopping = false; + // A renderer may veto window close to preserve an upload or unsaved draft. + // Keep its transport alive until Electron confirms every window has closed. + app.on("will-quit", (event) => { + if (stopping) return; + event.preventDefault(); + stopping = true; + desktopSession.flushStorageData(); + void broker.close().finally(() => app.quit()); + }); + showWindow(); +} +void start().catch(async (error: unknown) => { + await app.whenReady(); + dialog.showErrorBox( + "Lina desktop could not start", + error instanceof Error ? error.message : "Desktop startup failed.", + ); + app.exit(1); +}); diff --git a/packages/lina-desktop/src/preload.ts b/packages/lina-desktop/src/preload.ts new file mode 100644 index 0000000..0028938 --- /dev/null +++ b/packages/lina-desktop/src/preload.ts @@ -0,0 +1,13 @@ +import { contextBridge, ipcRenderer } from "electron"; + +// Never expose ipcRenderer, Node primitives, filesystem paths or transport secrets. +contextBridge.exposeInMainWorld( + "linaDesktop", + Object.freeze({ + platform: "desktop", + openExternal: (url: string): Promise => + ipcRenderer.invoke("lina:open-external", url), + notify: (input: { title: string; body: string }): Promise => + ipcRenderer.invoke("lina:notify", input), + }), +); diff --git a/packages/lina-desktop/src/routes.ts b/packages/lina-desktop/src/routes.ts new file mode 100644 index 0000000..5fd7996 --- /dev/null +++ b/packages/lina-desktop/src/routes.ts @@ -0,0 +1,92 @@ +const AGENT = "[a-z][a-z0-9-]{0,47}"; +const UUID = + "[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"; +const TASK = "[a-zA-Z0-9_-]{1,128}"; +// Transport allowlist mirrors Lina web management paths. Domain validation stays on Lina. +const ROUTES: ReadonlyArray = [ + [/^\/api\/agents$/, ["GET", "POST"]], + [new RegExp(`^/api/agents/${AGENT}$`), ["GET", "PATCH"]], + [new RegExp(`^/api/agents/${AGENT}/mind$`), ["GET"]], + [new RegExp(`^/api/agents/${AGENT}/conversation$`), ["GET", "PATCH"]], + [ + new RegExp( + `^/api/agents/${AGENT}/(?:avatar|revert|memory|mind/retract|conversation/preferences/reset)$`, + ), + ["POST"], + ], + [/^\/api\/avatars\/[a-f0-9]{64}$/, ["GET"]], + [/^\/api\/models$/, ["GET"]], + [/^\/api\/models\/settings$/, ["PATCH"]], + [/^\/api\/models\/test$/, ["POST"]], + [/^\/api\/hub\/status$/, ["GET"]], + [/^\/api\/hub\/refresh$/, ["POST"]], + [/^\/api\/tasks$/, ["GET", "POST"]], + [new RegExp(`^/api/tasks/${TASK}$`), ["GET"]], + [ + new RegExp(`^/api/tasks/${TASK}/(?:messages|interrupt|owner|approval)$`), + ["POST"], + ], + [/^\/api\/onboarding(?:\/entry)?$/, ["GET"]], + [/^\/api\/onboarding\/user$/, ["PATCH"]], + [/^\/api\/onboarding\/(?:drafts|interview|preview)$/, ["POST"]], + [new RegExp(`^/api/onboarding/drafts/${UUID}$`), ["PATCH"]], + [new RegExp(`^/api/onboarding/drafts/${UUID}/(?:answer|apply)$`), ["POST"]], + [new RegExp(`^/api/onboarding/rooms/${UUID}$`), ["GET"]], + [/^\/api\/agents\/birth$/, ["POST"]], + [new RegExp(`^/api/agents/${AGENT}/intro$`), ["GET", "POST"]], + [ + new RegExp( + `^/api/agents/${AGENT}/intro/(?:turn|finish|choose|mode|restart)$`, + ), + ["POST"], + ], +]; +const FILE = new RegExp(`^/api/attachments/${UUID}(?:/preview|/meta)?$`); + +export function requestUrl( + raw: string | undefined, + origin: string, +): URL | undefined { + if ( + !raw || + raw.length > 8192 || + !raw.startsWith("/") || + raw.startsWith("//") || + /[\\\s#]/u.test(raw) + ) + return; + const path = raw.split("?")[0] ?? ""; + if ( + path.includes("%") || + path.split("/").some((part) => part === "." || part === "..") + ) + return; + const url = new URL(raw, origin); + return url.origin === origin ? url : undefined; +} + +/** undefined = unknown route, otherwise HTTP rejection status or 0 (allowed). */ +export function apiStatus(url: URL, method: string): number | undefined { + if (url.pathname === "/api/attachments") + return url.search ? 400 : method === "POST" ? 0 : 405; + if (FILE.test(url.pathname)) { + if (method !== "GET") return 405; + return url.searchParams.size === 1 && + new RegExp(`^${UUID}$`).test(url.searchParams.get("sessionId") ?? "") + ? 0 + : 400; + } + const matches = ROUTES.filter(([pattern]) => pattern.test(url.pathname)); + if (!matches.length) return; + if (url.search) return 400; + return matches.some(([, methods]) => methods.includes(method)) ? 0 : 405; +} + +export function socketPath(url: URL): boolean { + return ( + url.pathname === "/ws" && + (url.searchParams.size === 0 || + (url.searchParams.size === 1 && + new RegExp(`^${AGENT}$`).test(url.searchParams.get("agent") ?? ""))) + ); +} diff --git a/packages/lina-desktop/src/session.ts b/packages/lina-desktop/src/session.ts new file mode 100644 index 0000000..fdb9212 --- /dev/null +++ b/packages/lina-desktop/src/session.ts @@ -0,0 +1,71 @@ +import { randomBytes, timingSafeEqual } from "node:crypto"; +import { mkdir, readFile, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import type { DesktopConfig } from "./config.ts"; + +export function createBrokerSession() { + const secret = randomBytes(32).toString("hex"); + return { + cookie(origin: string) { + return { + url: origin, + name: "lina_desktop", + value: secret, + path: "/", + httpOnly: true, + sameSite: "strict" as const, + secure: false, + }; + }, + authorizes(header: string | undefined): boolean { + const values = (header ?? "") + .split(";") + .map((part) => part.trim()) + .filter((part) => part.startsWith("lina_desktop=")); + const value = values[0]?.slice("lina_desktop=".length); + return ( + values.length === 1 && + value !== undefined && + /^[a-f0-9]{64}$/.test(value) && + timingSafeEqual(Buffer.from(value), Buffer.from(secret)) + ); + }, + }; +} +export type BrokerSession = ReturnType; + +/** A stable origin is also the renderer's draft/localStorage identity. */ +export async function bindProfile(config: DesktopConfig): Promise { + await mkdir(config.userData, { recursive: true, mode: 0o700 }); + await mkdir(config.sessionData, { recursive: true, mode: 0o700 }); + const file = join(config.userData, "connection.json"); + const binding = { + serverOrigin: config.serverOrigin, + brokerPort: config.brokerPort, + }; + try { + await writeFile(file, `${JSON.stringify(binding)}\n`, { + flag: "wx", + mode: 0o600, + }); + } catch (error) { + if ( + !(error instanceof Error) || + !("code" in error) || + error.code !== "EEXIST" + ) + throw error; + const saved: unknown = JSON.parse(await readFile(file, "utf8")); + if ( + !saved || + typeof saved !== "object" || + !("serverOrigin" in saved) || + !("brokerPort" in saved) || + saved.serverOrigin !== binding.serverOrigin || + saved.brokerPort !== binding.brokerPort + ) + throw Error( + "Desktop profile belongs to a different server or broker port. Choose a separate LINA_DESKTOP_USER_DATA directory.", + ); + } +} diff --git a/packages/lina-desktop/src/socket-proxy.ts b/packages/lina-desktop/src/socket-proxy.ts new file mode 100644 index 0000000..ff426a4 --- /dev/null +++ b/packages/lina-desktop/src/socket-proxy.ts @@ -0,0 +1,92 @@ +import { createHash } from "node:crypto"; +import { type IncomingMessage, request } from "node:http"; +import type { Duplex } from "node:stream"; + +export function rejectUpgrade(socket: Duplex, status: number): void { + // HTTP removes its socket error handler on upgrade. A peer may reset before + // this rejection is written, including on paths that never create a tunnel. + socket.once("error", () => socket.destroy()); + socket.end( + `HTTP/1.1 ${status} Rejected\r\nConnection: close\r\nContent-Length: 0\r\n\r\n`, + ); +} + +/** Node streams enforce backpressure; Lina web remains the wire parser/limit owner. */ +export function proxySocket( + incoming: IncomingMessage, + client: Duplex, + head: Buffer, + target: URL, +): void { + const key = incoming.headers["sec-websocket-key"]; + if ( + incoming.headers.upgrade?.toLowerCase() !== "websocket" || + incoming.headers["sec-websocket-version"] !== "13" || + typeof key !== "string" || + !/^[A-Za-z0-9+/]{22}==$/.test(key) || + incoming.headers["sec-websocket-protocol"] + ) { + rejectUpgrade(client, 400); + return; + } + const expected = createHash("sha1") + .update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`) + .digest("base64"); + const upstream = request(target, { + headers: { + origin: target.origin, + connection: "Upgrade", + upgrade: "websocket", + "sec-websocket-version": "13", + "sec-websocket-key": key, + }, + }); + let peer: Duplex | undefined; + const deadline = setTimeout( + () => upstream.destroy(Error("Handshake timeout")), + 10_000, + ); + const dispose = () => { + clearTimeout(deadline); + peer?.destroy(); + upstream.destroy(); + }; + client.once("close", dispose); + client.once("error", dispose); + upstream.once("error", () => { + clearTimeout(deadline); + if (!peer && !client.destroyed) rejectUpgrade(client, 502); + else client.destroy(); + }); + upstream.once("response", (response) => { + response.destroy(); + clearTimeout(deadline); + rejectUpgrade(client, 502); + }); + upstream.once("upgrade", (response, socket, initial) => { + clearTimeout(deadline); + if ( + client.destroyed || + response.statusCode !== 101 || + response.headers.upgrade?.toLowerCase() !== "websocket" || + response.headers["sec-websocket-accept"] !== expected || + response.headers["sec-websocket-extensions"] || + response.headers["sec-websocket-protocol"] + ) { + socket.destroy(); + rejectUpgrade(client, 502); + return; + } + peer = socket; + socket.once("error", () => client.destroy()); + socket.once("close", () => client.destroy()); + client.write( + `HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: ${expected}\r\n\r\n`, + ); + if (initial.length) client.write(initial); + if (head.length) socket.write(head); + client.pipe(socket); + socket.pipe(client); + }); + upstream.end(); +} diff --git a/packages/lina-desktop/src/window-policy.ts b/packages/lina-desktop/src/window-policy.ts new file mode 100644 index 0000000..293f7d2 --- /dev/null +++ b/packages/lina-desktop/src/window-policy.ts @@ -0,0 +1,57 @@ +import { apiStatus, socketPath } from "./routes.ts"; + +function localUrl(raw: string, origin: string): URL | undefined { + try { + const url = new URL(raw); + return url.origin === origin && !url.username && !url.password + ? url + : undefined; + } catch { + return; + } +} +export function windowUrl(raw: string, origin: string): boolean { + return localUrl(raw, origin)?.pathname === "/"; +} +export function rendererRequest(raw: string, origin: string): boolean { + if (localUrl(raw, origin)) return true; + try { + const url = new URL(raw); + return ( + url.protocol === "ws:" && + !url.username && + !url.password && + url.host === new URL(origin).host && + socketPath(url) + ); + } catch { + return false; + } +} +export function downloadUrl(raw: string, origin: string): boolean { + const url = localUrl(raw, origin); + return ( + !!url && + url.pathname.startsWith("/api/attachments/") && + apiStatus(url, "GET") === 0 + ); +} +export function notificationInput(raw: unknown): { + title: string; + body: string; +} { + if ( + !raw || + typeof raw !== "object" || + Object.keys(raw).some((key) => key !== "title" && key !== "body") || + !("title" in raw) || + !("body" in raw) || + typeof raw.title !== "string" || + typeof raw.body !== "string" || + !raw.title.trim() || + raw.title.length > 100 || + raw.body.length > 500 + ) + throw Error("Invalid notification"); + return { title: raw.title, body: raw.body }; +} diff --git a/packages/lina-desktop/src/window.ts b/packages/lina-desktop/src/window.ts new file mode 100644 index 0000000..ac1ae73 --- /dev/null +++ b/packages/lina-desktop/src/window.ts @@ -0,0 +1,160 @@ +import { basename, join } from "node:path"; +import { + BrowserWindow, + dialog, + type IpcMainInvokeEvent, + ipcMain, + Notification, + type Session, + shell, +} from "electron"; +import { externalUrl } from "./config.ts"; +import { + downloadUrl, + notificationInput, + rendererRequest, + windowUrl, +} from "./window-policy.ts"; + +async function openOsLink( + window: BrowserWindow, + raw: unknown, + origins: readonly string[], +): Promise { + try { + await shell.openExternal(externalUrl(raw, origins)); + } catch { + if (!window.isDestroyed()) + await dialog.showMessageBox(window, { + type: "error", + message: "연결된 앱에서 링크를 열지 못했습니다.", + detail: + typeof raw === "string" && raw.startsWith("codex:") + ? "Codex 앱이 설치되어 있고 링크를 열도록 연결되어 있는지 확인해주세요." + : "허용된 HTTPS 사이트와 기본 브라우저 설정을 확인해주세요.", + }); + throw Error("External link could not be opened."); + } +} + +export async function prepareSession( + session: Session, + origin: string, +): Promise { + await session.setProxy({ mode: "direct" }); + session.setPermissionRequestHandler((_contents, _permission, callback) => + callback(false), + ); + session.setPermissionCheckHandler(() => false); + session.on("will-download", (event, item, contents) => { + if ( + !contents || + !windowUrl(contents.getURL(), origin) || + !item.getURLChain().every((url) => downloadUrl(url, origin)) + ) { + event.preventDefault(); + return; + } + item.setSaveDialogOptions({ + title: "첨부 파일 저장", + defaultPath: basename(item.getFilename()), + }); + }); + // Cookies are not port-scoped. Deny every other origin before any network request. + session.webRequest.onBeforeRequest((details, callback) => + callback({ cancel: !rendererRequest(details.url, origin) }), + ); +} + +export function createWindow( + session: Session, + origin: string, + externalOrigins: readonly string[], +): BrowserWindow { + const window = new BrowserWindow({ + title: "Lina", + width: 1280, + height: 860, + minWidth: 680, + minHeight: 520, + backgroundColor: "#181818", + show: false, + webPreferences: { + session, + preload: join(__dirname, "preload.cjs"), + contextIsolation: true, + sandbox: true, + nodeIntegration: false, + nodeIntegrationInWorker: false, + nodeIntegrationInSubFrames: false, + webSecurity: true, + allowRunningInsecureContent: false, + webviewTag: false, + }, + }); + const open = (raw: string) => { + void openOsLink(window, raw, externalOrigins).catch(() => { + // The native error dialog already reported this navigation failure. + }); + }; + window.webContents.setWindowOpenHandler(({ url }) => { + void open(url); + return { action: "deny" }; + }); + window.webContents.on("will-navigate", (event, url) => { + if (!windowUrl(url, origin)) { + event.preventDefault(); + void open(url); + } + }); + window.webContents.on("will-redirect", (event) => event.preventDefault()); + window.webContents.on("will-attach-webview", (event) => + event.preventDefault(), + ); + window.webContents.on("render-process-gone", () => { + void dialog.showMessageBox(window, { + type: "error", + message: "화면이 종료되었습니다.", + detail: "Lina 서버의 작업은 계속됩니다. 앱을 다시 열어주세요.", + }); + }); + window.once("ready-to-show", () => window.show()); + void window.loadURL(origin).catch(() => { + dialog.showErrorBox( + "Lina", + "동봉 화면을 열지 못했습니다. 앱을 다시 실행해주세요.", + ); + }); + return window; +} + +export function installOsHandlers( + current: () => BrowserWindow | undefined, + origin: string, + externalOrigins: readonly string[], +): void { + const authorize = (event: IpcMainInvokeEvent) => { + const window = current(); + if ( + !window || + window.isDestroyed() || + event.sender !== window.webContents || + event.senderFrame !== window.webContents.mainFrame || + !event.senderFrame || + !windowUrl(event.senderFrame.url, origin) + ) + throw Error("Unauthorized desktop request"); + return window; + }; + ipcMain.handle("lina:open-external", async (event, raw: unknown) => { + const window = authorize(event); + await openOsLink(window, raw, externalOrigins); + }); + ipcMain.handle("lina:notify", (event, raw: unknown) => { + authorize(event); + const input = notificationInput(raw); + if (!Notification.isSupported()) return false; + new Notification(input).show(); + return true; + }); +} diff --git a/packages/lina-desktop/test/assets.test.ts b/packages/lina-desktop/test/assets.test.ts new file mode 100644 index 0000000..0628836 --- /dev/null +++ b/packages/lina-desktop/test/assets.test.ts @@ -0,0 +1,41 @@ +import { expect, test } from "bun:test"; +import { mkdir, mkdtemp, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { writeBundle } from "../scripts/bundle-assets.ts"; +import { loadBundle } from "../src/bundled-assets.ts"; + +test("disk bundle survives without Bun/web source and preserves versioned asset URLs", async () => { + const qa = fileURLToPath(new URL("../.qa/", import.meta.url)); + await mkdir(qa, { recursive: true }); + const dir = await mkdtemp(join(qa, "bundle-")); + await writeBundle(dir, { + html: '', + script: "console.log('shared renderer')", + css: "body{}", + icon: "", + pwa: { + version: "rev", + worker: "worker", + manifest: "{}", + files: new Map([ + [ + "/assets/rev/app.js", + { body: "shared-code", mime: "text/javascript" }, + ], + ]), + }, + }); + const bundle = await loadBundle(dir); + expect(bundle.get("/")?.body.toString()).not.toContain('rel="manifest"'); + expect(bundle.get("/assets/rev/app.js")?.body.toString()).toBe("shared-code"); + expect(bundle.has("/sw.js")).toBe(false); + await writeFile( + join(dir, "manifest.json"), + JSON.stringify({ + format: 1, + files: [{ url: "/", file: "../../package.json", mime: "text/html" }], + }), + ); + await expect(loadBundle(dir)).rejects.toThrow(); +}); diff --git a/packages/lina-desktop/test/broker.test.ts b/packages/lina-desktop/test/broker.test.ts new file mode 100644 index 0000000..0a79c14 --- /dev/null +++ b/packages/lina-desktop/test/broker.test.ts @@ -0,0 +1,344 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test"; +import { createHash, randomBytes } from "node:crypto"; +import { once } from "node:events"; +import { createServer, type IncomingHttpHeaders, request } from "node:http"; +import { createAccessPolicy } from "../../lina-web/src/access.ts"; +import { startBroker } from "../src/broker.ts"; +import { createBrokerSession } from "../src/session.ts"; + +const assets = new Map([ + ["/", { body: Buffer.from("bundled Lina"), mime: "text/html" }], +]); +const uuid = "01234567-89ab-4cde-8fab-0123456789ab"; +const pending: Array<() => Promise> = []; +afterEach(async () => { + for (const close of pending.splice(0).reverse()) await close(); +}); + +async function fixture() { + const seen: Array<{ + path: string; + headers: IncomingHttpHeaders; + body: string; + }> = []; + const upstream = createServer(async (req, res) => { + let body = ""; + for await (const chunk of req) body += chunk.toString(); + seen.push({ path: req.url ?? "", headers: req.headers, body }); + const access = createAccessPolicy(); + if ( + !access.allowsSocket( + req.headers.host ?? null, + String(req.headers.origin ?? ""), + ) + ) { + res.writeHead(403); + res.end(); + return; + } + if (req.url === "/api/models") { + res.writeHead(302, { location: "http://127.0.0.1:1/private" }); + res.end(); + return; + } + res.writeHead(200, { + "content-type": "application/json", + "set-cookie": "upstream=leaked", + "content-disposition": "attachment; filename=test.txt", + }); + res.end(JSON.stringify({ path: req.url, body })); + }); + upstream.listen(0, "127.0.0.1"); + await once(upstream, "listening"); + const addr = upstream.address(); + if (!addr || typeof addr === "string") throw Error("No upstream port"); + const origin = `http://127.0.0.1:${addr.port}`; + const session = createBrokerSession(); + const broker = await startBroker({ + port: 0, + serverOrigin: origin, + assets, + session, + }); + pending.push(async () => { + upstream.closeAllConnections(); + await new Promise((resolve) => upstream.close(() => resolve())); + }); + pending.push(broker.close); + const cookie = `lina_desktop=${session.cookie(broker.origin).value}`; + const auth = { cookie, origin: broker.origin }; + return { upstream, origin, seen, broker, cookie, auth }; +} + +function raw( + origin: string, + path: string, + headers: Record, + method = "GET", + body?: string, +) { + return new Promise<{ + status: number; + headers: IncomingHttpHeaders; + body: string; + }>((resolve, reject) => { + const req = request(origin, { path, method, headers }, (res) => { + let text = ""; + res.on("data", (chunk) => { + text += chunk.toString(); + }); + res.on("end", () => + resolve({ + status: res.statusCode ?? 0, + headers: res.headers, + body: text, + }), + ); + res.on("error", reject); + }); + req.on("error", reject); + req.end(body); + }); +} + +describe("main-owned loopback broker", () => { + let f: Awaited>; + beforeEach(async () => { + f = await fixture(); + }); + test("never issues credentials from root; bundled UI loads without upstream", async () => { + const anonymous = await raw(f.broker.origin, "/", {}); + expect(anonymous.status).toBe(403); + expect(anonymous.headers["set-cookie"]).toBeUndefined(); + const page = await raw(f.broker.origin, "/?agent=lina", { + cookie: f.cookie, + }); + expect(page.status).toBe(200); + expect(page.body).toContain("bundled Lina"); + expect(page.body).not.toContain(f.cookie); + expect(page.headers["content-security-policy"]).toContain( + "worker-src 'none'", + ); + expect(f.seen.length).toBe(0); + }); + test("rejects missing session, forged Host, hostile/missing Origin and cross-port same-site", async () => { + for (const headers of [ + { origin: f.broker.origin }, + { ...f.auth, host: "evil.test" }, + { ...f.auth, origin: "http://evil.test" }, + { ...f.auth, origin: "null" }, + { ...f.auth, origin: "http://127.0.0.1:9999" }, + { cookie: f.cookie }, + { cookie: f.cookie, "sec-fetch-site": "same-site" }, + ]) { + expect((await raw(f.broker.origin, "/api/agents", headers)).status).toBe( + 403, + ); + } + expect( + ( + await raw(f.broker.origin, "/", { + ...f.auth, + origin: "https://evil.test", + }) + ).status, + ).toBe(403); + expect(f.seen.length).toBe(0); + }); + test("forwards exact contracts and metadata with pinned server Host/Origin and strips cookies", async () => { + const upload = await raw( + f.broker.origin, + "/api/attachments", + { + ...f.auth, + "x-lina-session": uuid, + "x-lina-filename": "note.txt", + "content-type": "application/octet-stream", + authorization: "do-not-forward", + "x-forwarded-host": "evil.test", + }, + "POST", + "attachment bytes", + ); + expect(upload.status).toBe(200); + expect(upload.headers["set-cookie"]).toBeUndefined(); + expect(upload.headers["content-disposition"]).toBe( + "attachment; filename=test.txt", + ); + expect(f.seen[0]?.headers).toMatchObject({ + host: new URL(f.origin).host, + origin: f.origin, + "x-lina-session": uuid, + "x-lina-filename": "note.txt", + }); + expect(f.seen[0]?.headers.cookie).toBeUndefined(); + expect(f.seen[0]?.headers.authorization).toBeUndefined(); + expect(f.seen[0]?.headers["x-forwarded-host"]).toBeUndefined(); + expect(f.seen[0]?.body).toBe("attachment bytes"); + const file = await raw( + f.broker.origin, + `/api/attachments/${uuid}/preview?sessionId=${uuid}`, + { cookie: f.cookie, "sec-fetch-site": "same-origin" }, + ); + expect(file.status).toBe(200); + for (const [path, method] of [ + ["/api/tasks", "POST"], + ["/api/tasks/native_1/approval", "POST"], + ["/api/onboarding/user", "PATCH"], + [`/api/onboarding/drafts/${uuid}`, "PATCH"], + ["/api/agents/lina/memory", "POST"], + ["/api/onboarding/entry", "GET"], + [`/api/onboarding/rooms/${uuid}`, "GET"], + ["/api/agents/lina/intro/turn", "POST"], + ["/api/agents/lina/conversation", "PATCH"], + ] as const) { + expect( + ( + await raw( + f.broker.origin, + path, + f.auth, + method, + method === "GET" ? undefined : "{}", + ) + ).status, + ).toBe(200); + } + }); + test("rejects unknown endpoints, traversal, query injection, unsupported methods and redirects", async () => { + for (const path of [ + "/api/private", + "/api/agents/../models", + "/api/%61gents", + "/api/agents?target=http://evil.test", + "//evil.test/api/agents", + "http://evil.test/api/agents", + `/api/attachments/${uuid}?sessionId=${uuid}&sessionId=${uuid}`, + "/sw.js", + ]) { + expect( + (await raw(f.broker.origin, path, f.auth)).status, + ).toBeGreaterThanOrEqual(400); + } + expect( + (await raw(f.broker.origin, "/api/agents", f.auth, "DELETE")).status, + ).toBe(405); + expect( + (await raw(f.broker.origin, "/api/models", f.auth, "POST", "{}")).status, + ).toBe(405); + expect(f.seen.length).toBe(0); + const redirect = await raw(f.broker.origin, "/api/models", f.auth); + expect(redirect.status).toBe(502); + expect(redirect.headers.location).toBeUndefined(); + expect(f.seen.length).toBe(1); + }); + test("bounds uploads before reaching upstream", async () => { + expect( + ( + await raw( + f.broker.origin, + "/api/attachments", + { ...f.auth, "content-length": "2097153" }, + "POST", + ) + ).status, + ).toBe(413); + expect(f.seen.length).toBe(0); + }); + test("returns recoverable failure offline, keeps assets available and resumes on next request", async () => { + await new Promise((resolve) => f.upstream.close(() => resolve())); + expect((await raw(f.broker.origin, "/api/agents", f.auth)).status).toBe( + 502, + ); + expect((await raw(f.broker.origin, "/", { cookie: f.cookie })).status).toBe( + 200, + ); + f.upstream.listen(Number(new URL(f.origin).port), "127.0.0.1"); + await once(f.upstream, "listening"); + expect((await raw(f.broker.origin, "/api/agents", f.auth)).status).toBe( + 200, + ); + }); + test("WS rejects non-upgrade responses and a forged upstream handshake", async () => { + const headers = { + ...f.auth, + connection: "Upgrade", + upgrade: "websocket", + "sec-websocket-version": "13", + "sec-websocket-key": randomBytes(16).toString("base64"), + }; + expect((await raw(f.broker.origin, "/ws", headers)).status).toBe(502); + f.upstream.once("upgrade", (_req, socket) => { + socket.end( + "HTTP/1.1 101 Switching Protocols\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Accept: forged\r\n\r\n", + ); + }); + expect((await raw(f.broker.origin, "/ws", headers)).status).toBe(502); + }); + + test("busy stable port fails without allocating a different renderer origin", async () => { + await expect( + startBroker({ + port: Number(new URL(f.broker.origin).port), + serverOrigin: f.origin, + assets, + session: createBrokerSession(), + }), + ).rejects.toThrow(); + expect((await raw(f.broker.origin, "/", { cookie: f.cookie })).status).toBe( + 200, + ); + }); + + test("WS requires cookie + exact Origin, validates path, and pins upstream handshake", async () => { + const headers = { + ...f.auth, + connection: "Upgrade", + upgrade: "websocket", + "sec-websocket-version": "13", + "sec-websocket-key": randomBytes(16).toString("base64"), + }; + for (const [path, override] of [ + ["/ws", { origin: "https://evil.test" }], + ["/ws", { cookie: "" }], + ["/ws?agent=lina&target=evil", {}], + ["/api/agents", {}], + ] as const) { + expect( + (await raw(f.broker.origin, path, { ...headers, ...override })).status, + ).toBeGreaterThanOrEqual(400); + } + const handshake = new Promise((resolve) => + f.upstream.once("upgrade", (req, socket) => { + resolve(req.headers); + const accept = createHash("sha1") + .update( + `${req.headers["sec-websocket-key"]}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`, + ) + .digest("base64"); + socket.write( + `HTTP/1.1 101 Switching Protocols\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Accept: ${accept}\r\n\r\n`, + ); + socket.on("data", (data) => socket.write(data)); + socket.on("end", () => socket.end()); + }), + ); + await new Promise((resolve, reject) => { + const req = request(f.broker.origin, { path: "/ws?agent=lina", headers }); + req.on("error", reject); + req.on("upgrade", (_res, socket) => { + socket.once("data", (data) => { + expect(data.toString()).toBe("tunnel bytes"); + socket.destroy(); + resolve(); + }); + socket.write("tunnel bytes"); + }); + req.end(); + }); + const forwarded = await handshake; + expect(forwarded.origin).toBe(f.origin); + expect(forwarded.host).toBe(new URL(f.origin).host); + expect(forwarded.cookie).toBeUndefined(); + }); +}); diff --git a/packages/lina-desktop/test/config.test.ts b/packages/lina-desktop/test/config.test.ts new file mode 100644 index 0000000..171954f --- /dev/null +++ b/packages/lina-desktop/test/config.test.ts @@ -0,0 +1,92 @@ +import { describe, expect, test } from "bun:test"; +import { resolve } from "node:path"; +import { desktopConfig, externalUrl, serverOrigin } from "../src/config.ts"; + +describe("desktop configuration boundary", () => { + test("requires an explicit server and literal loopback pin", () => { + expect(() => desktopConfig({})).toThrow(); + for (const url of [ + "https://127.0.0.1:3000", + "http://localhost:3000", + "http://127.1:3000", + "http://2130706433:3000", + "http://127.0.0.1.evil:3000", + "http://127.0.0.1:3000/api", + "http://127.0.0.1:3000/?url=evil", + "http://x@127.0.0.1:3000", + "http://127.0.0.1:0", + "http://127.0.0.1:3000/#x", + ]) { + expect(() => serverOrigin(url)).toThrow(); + } + expect(serverOrigin("http://127.0.0.1:3000/")).toBe( + "http://127.0.0.1:3000", + ); + expect(serverOrigin("http://[::1]:3000")).toBe("http://[::1]:3000"); + }); + test("keeps broker origin and storage stable; supports isolated QA configuration", () => { + const env = { + LINA_DESKTOP_SERVER_URL: "http://127.0.0.1:18140", + LINA_HOME: resolve("packages/lina-desktop/.qa/home"), + }; + const a = desktopConfig(env); + expect(a).toEqual(desktopConfig(env)); + expect(a.brokerPort).toBe(43127); + expect(a.userData).toBe(resolve("packages/lina-desktop/.qa/home/desktop")); + const b = desktopConfig({ + ...env, + LINA_DESKTOP_PORT: "18141", + LINA_DESKTOP_USER_DATA: resolve("packages/lina-desktop/.qa/isolated"), + }); + expect(b.brokerPort).toBe(18141); + expect(b.sessionData).toBe( + resolve("packages/lina-desktop/.qa/isolated/sessions"), + ); + for (const port of ["0", "-1", "65536", "1.2", " 18141", "18140"]) + expect(() => + desktopConfig({ ...env, LINA_DESKTOP_PORT: port }), + ).toThrow(); + }); + test("external links require exact HTTPS allowlisted origins", () => { + const allow = ["https://github.com"]; + expect(externalUrl("https://github.com/electron/electron", allow)).toBe( + "https://github.com/electron/electron", + ); + for (const url of [ + "https://github.com.evil/", + "https://github.com:444/", + "https://user@github.com/", + "file:///etc/passwd", + "javascript:alert(1)", + "https://127.0.0.1/", + "http://github.com/", + "https://github.com/\nfoo", + ]) + expect(() => externalUrl(url, allow)).toThrow(); + }); + test("Codex links allow only a canonical existing thread id", () => { + const good = "codex://threads/019b1234-5678-7000-abcd-0123456789ab"; + expect(externalUrl(good, [])).toBe(good); + expect(externalUrl("codex://threads/native_task-1", [])).toBe( + "codex://threads/native_task-1", + ); + for (const url of [ + "codex://commands/run", + "codex://threads", + "codex://threads/", + "codex://threads/a/../b", + "codex://threads/%2e%2e", + "codex://threads/a%2fb", + "codex://threads/a?x=1", + "codex://threads/a#x", + "codex://user@threads/a", + "codex://threads:80/a", + "codex://threads/a/", + "codex://threads/a\\b", + "codex://threads/..", + "codex://threads/" + "a".repeat(129), + "other://threads/a", + ]) + expect(() => externalUrl(url, [])).toThrow(); + }); +}); diff --git a/packages/lina-desktop/test/lifecycle.test.ts b/packages/lina-desktop/test/lifecycle.test.ts new file mode 100644 index 0000000..7d8b904 --- /dev/null +++ b/packages/lina-desktop/test/lifecycle.test.ts @@ -0,0 +1,118 @@ +import { expect, test } from "bun:test"; +import { mkdtempSync, rmSync } from "node:fs"; +import { createRequire } from "node:module"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { runInNewContext } from "node:vm"; + +test("a cancelled window close keeps the broker alive; accepted quit closes it once", async () => { + const root = mkdtempSync(join(tmpdir(), "lina-quit-test-")); + const handlers = new Map< + string, + (event: { preventDefault(): void }) => void + >(); + let closed = 0, + flushed = 0, + quit = 0; + const ready = Promise.withResolvers(); + const ended = Promise.withResolvers(); + const app = { + setName() {}, + enableSandbox() {}, + setPath() {}, + requestSingleInstanceLock: () => true, + whenReady: async () => {}, + on: (name: string, handler: (event: { preventDefault(): void }) => void) => + handlers.set(name, handler), + quit() { + quit++; + ended.resolve(); + }, + exit: (code: number) => ready.reject(new Error(`Startup failed: ${code}`)), + }; + const fake = { + app, + Menu: { + buildFromTemplate: (value: unknown) => value, + setApplicationMenu() {}, + }, + dialog: { + showErrorBox: (_title: string, message: string) => + ready.reject(new Error(message)), + }, + session: { + fromPartition: () => ({ + cookies: { set: async () => {} }, + flushStorageData() { + flushed++; + }, + }), + }, + }; + const stubs: Record = { + "broker.ts": + "export async function startBroker(){return {origin:'http://127.0.0.1:43127',close:globalThis.closeBroker}}", + "bundled-assets.ts": "export async function loadBundle(){return new Map()}", + "session.ts": + "export async function bindProfile(){};export function createBrokerSession(){return {cookie(){return {}}}}", + "window.ts": + "export async function prepareSession(){};export function installOsHandlers(){};export function createWindow(){globalThis.windowReady();return {}}", + }; + try { + const built = await Bun.build({ + entrypoints: [new URL("../src/main.ts", import.meta.url).pathname], + target: "node", + format: "cjs", + external: ["electron"], + plugins: [ + { + name: "lifecycle-boundaries", + setup(builder) { + builder.onLoad( + { filter: /\/(broker|bundled-assets|session|window)\.ts$/ }, + ({ path }) => ({ + contents: stubs[path.split("/").at(-1) ?? ""] ?? "", + loader: "js", + }), + ); + }, + }, + ], + }); + expect(built.success).toBe(true); + const require = createRequire(import.meta.url); + runInNewContext((await built.outputs[0]?.text()) ?? "", { + require: (id: string) => (id === "electron" ? fake : require(id)), + module: { exports: {} }, + exports: {}, + __dirname: root, + URL, + process: { + platform: "linux", + env: { + LINA_DESKTOP_SERVER_URL: "http://127.0.0.1:18140", + LINA_DESKTOP_USER_DATA: root, + }, + }, + windowReady: () => ready.resolve(), + closeBroker: async () => { + closed++; + }, + }); + await ready.promise; + // Electron emits before-quit before asking windows to close. A renderer + // may veto there; will-quit is only emitted after all windows have closed. + handlers.get("before-quit")?.({ preventDefault() {} }); + expect(closed).toBe(0); + expect(flushed).toBe(0); + handlers.get("will-quit")?.({ preventDefault() {} }); + await ended.promise; + expect(closed).toBe(1); + expect(flushed).toBe(1); + expect(quit).toBe(1); + handlers.get("will-quit")?.({ preventDefault() {} }); + expect(closed).toBe(1); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/packages/lina-desktop/test/node-runtime.test.ts b/packages/lina-desktop/test/node-runtime.test.ts new file mode 100644 index 0000000..3373e43 --- /dev/null +++ b/packages/lina-desktop/test/node-runtime.test.ts @@ -0,0 +1,29 @@ +import { expect, test } from "bun:test"; +import { mkdir } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; + +test("native Node broker survives rejected upgrade TCP resets", async () => { + const root = new URL("../", import.meta.url); + const outdir = fileURLToPath(new URL(".qa/node/", root)); + await mkdir(outdir, { recursive: true }); + const build = await Bun.build({ + entrypoints: [fileURLToPath(new URL("scripts/qa-node.ts", root))], + target: "node", + format: "esm", + outdir, + naming: "broker.mjs", + }); + expect(build.success).toBe(true); + const process = Bun.spawn(["node", `${outdir}/broker.mjs`], { + stdout: "pipe", + stderr: "pipe", + }); + const [status, output, errors] = await Promise.all([ + process.exited, + new Response(process.stdout).text(), + new Response(process.stderr).text(), + ]); + expect(errors).toBe(""); + expect(status).toBe(0); + expect(output).toContain("PASS"); +}); diff --git a/packages/lina-desktop/test/preload.test.ts b/packages/lina-desktop/test/preload.test.ts new file mode 100644 index 0000000..fbb47ab --- /dev/null +++ b/packages/lina-desktop/test/preload.test.ts @@ -0,0 +1,148 @@ +import { expect, test } from "bun:test"; +import { fileURLToPath } from "node:url"; +import { runInNewContext } from "node:vm"; + +test("compiled sandbox preload exposes only marker and named OS capabilities", async () => { + const output = await Bun.build({ + entrypoints: [fileURLToPath(new URL("../src/preload.ts", import.meta.url))], + target: "node", + format: "cjs", + external: ["electron"], + }); + expect(output.success).toBe(true); + let exposed: Record = {}; + const calls: unknown[][] = []; + runInNewContext((await output.outputs[0]?.text()) ?? "", { + require(name: string) { + expect(name).toBe("electron"); + return { + contextBridge: { + exposeInMainWorld(name: string, value: Record) { + expect(name).toBe("linaDesktop"); + exposed = value; + }, + }, + ipcRenderer: { + invoke(...args: unknown[]) { + calls.push(args); + return Promise.resolve(); + }, + }, + }; + }, + }); + expect(Object.keys(exposed).sort()).toEqual([ + "notify", + "openExternal", + "platform", + ]); + expect(exposed["platform"]).toBe("desktop"); + expect(Object.isFrozen(exposed)).toBe(true); + // VM exports are untyped; assert the public functions before invoking them. + const open = exposed["openExternal"], + notify = exposed["notify"]; + if (typeof open !== "function" || typeof notify !== "function") + throw Error("Missing OS methods"); + await open("https://github.com/"); + await notify({ title: "Lina", body: "Done" }); + expect(calls).toEqual([ + ["lina:open-external", "https://github.com/"], + ["lina:notify", { title: "Lina", body: "Done" }], + ]); +}); + +test("main IPC rejects another window and same-origin child frames before OS access", async () => { + const output = await Bun.build({ + entrypoints: [fileURLToPath(new URL("../src/window.ts", import.meta.url))], + target: "node", + format: "cjs", + external: ["electron"], + }); + expect(output.success).toBe(true); + const handlers = new Map< + string, + (event: unknown, input: unknown) => Promise + >(); + const opened: string[] = []; + let failOpen = false; + const dialogs: unknown[] = []; + const exports: Record = {}; + const module = { exports }; + runInNewContext((await output.outputs[0]?.text()) ?? "", { + module, + exports, + URL, + require(name: string) { + if (name === "node:path") + return { + basename: (s: string) => s, + join: (...s: string[]) => s.join("/"), + }; + if (name !== "electron") throw Error(`Unexpected runtime import ${name}`); + return { + ipcMain: { + handle: ( + name: string, + action: (event: unknown, input: unknown) => Promise, + ) => handlers.set(name, action), + }, + dialog: { + showMessageBox: async (_window: unknown, options: unknown) => { + dialogs.push(options); + }, + }, + shell: { + openExternal: async (url: string) => { + if (failOpen) throw Error("No OS handler"); + opened.push(url); + }, + }, + }; + }, + }); + const install = module.exports["installOsHandlers"]; + if (typeof install !== "function") throw Error("Missing IPC registration"); + const mainFrame = { url: "http://127.0.0.1:18141/" }; + const contents = { mainFrame }; + install( + () => ({ isDestroyed: () => false, webContents: contents }), + "http://127.0.0.1:18141", + ["https://github.com"], + ); + const open = handlers.get("lina:open-external"); + if (!open) throw Error("Missing handler"); + for (const event of [ + { sender: {}, senderFrame: mainFrame }, + { sender: contents, senderFrame: { ...mainFrame } }, + { sender: contents, senderFrame: null }, + ]) + await expect(open(event, "https://github.com/")).rejects.toThrow(); + await expect( + open({ sender: contents, senderFrame: mainFrame }, "file:///etc/passwd"), + ).rejects.toThrow(); + expect(opened).toEqual([]); + await open( + { sender: contents, senderFrame: mainFrame }, + "https://github.com/electron", + ); + expect(opened).toEqual(["https://github.com/electron"]); + await open( + { sender: contents, senderFrame: mainFrame }, + "codex://threads/native_1", + ); + expect(opened).toEqual([ + "https://github.com/electron", + "codex://threads/native_1", + ]); + failOpen = true; + await expect( + open( + { sender: contents, senderFrame: mainFrame }, + "codex://threads/native_1", + ), + ).rejects.toThrow(); + expect(dialogs.at(-1)).toMatchObject({ + type: "error", + message: "연결된 앱에서 링크를 열지 못했습니다.", + }); +}); diff --git a/packages/lina-desktop/test/session.test.ts b/packages/lina-desktop/test/session.test.ts new file mode 100644 index 0000000..fb1729e --- /dev/null +++ b/packages/lina-desktop/test/session.test.ts @@ -0,0 +1,50 @@ +import { expect, test } from "bun:test"; +import { mkdir, mkdtemp, readFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { desktopConfig } from "../src/config.ts"; +import { bindProfile, createBrokerSession } from "../src/session.ts"; + +test("session secret stays in main and is installed as a host-only HttpOnly strict cookie", async () => { + const first = createBrokerSession(), + second = createBrokerSession(); + expect(first.authorizes(undefined)).toBe(false); + expect(first.authorizes("lina_desktop=incorrect")).toBe(false); + const cookie = first.cookie("http://127.0.0.1:18141"); + expect(cookie).toMatchObject({ + url: "http://127.0.0.1:18141", + name: "lina_desktop", + httpOnly: true, + sameSite: "strict", + path: "/", + }); + expect(cookie).not.toHaveProperty("domain"); + expect(cookie).not.toHaveProperty("expirationDate"); + expect(cookie.value.length).toBe(64); + expect(first.authorizes(`lina_desktop=${cookie.value}`)).toBe(true); + expect( + first.authorizes( + `lina_desktop=${cookie.value}; lina_desktop=${cookie.value}`, + ), + ).toBe(false); + expect(second.authorizes(`lina_desktop=${cookie.value}`)).toBe(false); +}); + +test("profile restart preserves binding and rejects mixing server/port with old drafts", async () => { + const qa = fileURLToPath(new URL("../.qa/", import.meta.url)); + await mkdir(qa, { recursive: true }); + const dir = await mkdtemp(resolve(qa, "profile-")); + const config = desktopConfig({ + LINA_DESKTOP_SERVER_URL: "http://127.0.0.1:18140", + LINA_DESKTOP_PORT: "18141", + LINA_DESKTOP_USER_DATA: dir, + }); + await bindProfile(config); + const before = await readFile(resolve(dir, "connection.json"), "utf8"); + await bindProfile(config); + expect(await readFile(resolve(dir, "connection.json"), "utf8")).toBe(before); + await expect( + bindProfile({ ...config, serverOrigin: "http://127.0.0.1:19140" }), + ).rejects.toThrow(); + await expect(bindProfile({ ...config, brokerPort: 19141 })).rejects.toThrow(); +}); diff --git a/packages/lina-desktop/test/web-contract.test.ts b/packages/lina-desktop/test/web-contract.test.ts new file mode 100644 index 0000000..8bab753 --- /dev/null +++ b/packages/lina-desktop/test/web-contract.test.ts @@ -0,0 +1,101 @@ +import { expect, test } from "bun:test"; +import { startWebServer } from "../../lina-web/src/server.ts"; +import { startBroker } from "../src/broker.ts"; +import { createBrokerSession } from "../src/session.ts"; + +test("actual Lina web keeps its origin checks while HTTP and WS cross the desktop bridge", async () => { + const runtime = Bun.serve({ + port: 0, + hostname: "127.0.0.1", + fetch(request, server) { + if (new URL(request.url).pathname === "/" && server.upgrade(request)) + return; + return Response.json({ received: new URL(request.url).pathname }); + }, + websocket: { + open(socket) { + socket.send(JSON.stringify({ type: "agent-status", state: "idle" })); + }, + message(socket, raw) { + const frame = JSON.parse(String(raw)); + if (frame.type === "ping") + socket.send( + JSON.stringify({ + type: "pong", + sessionId: frame.sessionId, + nonce: frame.nonce, + }), + ); + }, + }, + }); + const web = startWebServer({ + port: 0, + upstream: `ws://127.0.0.1:${runtime.port}`, + assets: { html: "web-only", script: "", css: "", icon: "" }, + }); + const upstream = `http://127.0.0.1:${web.port}`; + const session = createBrokerSession(); + const broker = await startBroker({ + port: 0, + serverOrigin: upstream, + session, + assets: new Map([ + ["/", { body: Buffer.from("desktop-only"), mime: "text/html" }], + ]), + }); + const headers = { + Origin: broker.origin, + Cookie: `lina_desktop=${session.cookie(broker.origin).value}`, + }; + let socket: WebSocket | undefined; + try { + expect( + ( + await fetch(`${upstream}/api/tasks`, { + headers: { Origin: broker.origin }, + }) + ).status, + ).toBe(403); + const response = await fetch(`${broker.origin}/api/tasks`, { headers }); + expect(response.status).toBe(200); + expect(await response.json()).toEqual({ received: "/api/tasks" }); + expect(await (await fetch(broker.origin, { headers })).text()).toBe( + "desktop-only", + ); + socket = new WebSocket(`${broker.origin.replace("http:", "ws:")}/ws`, { + headers, + }); + const active = socket; + await new Promise((resolve, reject) => { + active.addEventListener("error", () => + reject(Error("Desktop WS failed")), + ); + active.addEventListener("message", (event) => { + const frame = JSON.parse(String(event.data)); + if (frame.type === "agent-status") { + expect(frame.state).toBe("idle"); + active.send( + JSON.stringify({ + type: "ping", + sessionId: "scope", + nonce: "probe", + }), + ); + } else { + expect(frame).toEqual({ + type: "pong", + sessionId: "scope", + nonce: "probe", + }); + resolve(); + } + }); + }); + } finally { + socket?.close(); + await broker.close(); + await web.stop(true); + await runtime.stop(true); + } +}); diff --git a/packages/lina-desktop/test/window-policy.test.ts b/packages/lina-desktop/test/window-policy.test.ts new file mode 100644 index 0000000..6e84465 --- /dev/null +++ b/packages/lina-desktop/test/window-policy.test.ts @@ -0,0 +1,53 @@ +import { expect, test } from "bun:test"; +import { + downloadUrl, + notificationInput, + rendererRequest, + windowUrl, +} from "../src/window-policy.ts"; + +const origin = "http://127.0.0.1:18141"; +test("renderer cannot reach another loopback port or navigate into API content", () => { + expect(windowUrl(`${origin}/?agent=lina`, origin)).toBe(true); + for (const url of [ + "http://127.0.0.1:18140/", + `${origin}/api/agents`, + "file:///etc/passwd", + `${origin}.evil/`, + ]) + expect(windowUrl(url, origin)).toBe(false); + expect(rendererRequest(`${origin}/api/agents`, origin)).toBe(true); + expect(rendererRequest("ws://127.0.0.1:18141/ws?agent=lina", origin)).toBe( + true, + ); + for (const url of [ + "ws://127.0.0.1:18140/ws", + "https://example.com/", + "http://localhost:18141/", + "ws://127.0.0.1:18141/api/agents", + ]) + expect(rendererRequest(url, origin)).toBe(false); +}); +test("downloads remain scoped attachment URLs; notifications have bounded plain text", () => { + const id = "01234567-89ab-4cde-8fab-0123456789ab"; + expect( + downloadUrl(`${origin}/api/attachments/${id}?sessionId=${id}`, origin), + ).toBe(true); + for (const url of [ + `${origin}/api/agents`, + `${origin}/api/attachments/${id}`, + "file:///etc/passwd", + ]) + expect(downloadUrl(url, origin)).toBe(false); + expect(notificationInput({ title: "Lina", body: "작업 완료" })).toEqual({ + title: "Lina", + body: "작업 완료", + }); + for (const value of [ + null, + { title: "", body: "x" }, + { title: "x", body: "x", icon: "/etc/passwd" }, + { title: "x", body: "x".repeat(501) }, + ]) + expect(() => notificationInput(value)).toThrow(); +}); diff --git a/packages/lina-desktop/tsconfig.build.json b/packages/lina-desktop/tsconfig.build.json new file mode 100644 index 0000000..01b3471 --- /dev/null +++ b/packages/lina-desktop/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.json", + "include": ["scripts", "test"], + "exclude": ["node_modules", "dist", "out"] +} diff --git a/packages/lina-desktop/tsconfig.json b/packages/lina-desktop/tsconfig.json new file mode 100644 index 0000000..89ac852 --- /dev/null +++ b/packages/lina-desktop/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "types": [] + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "out"] +} diff --git a/packages/lina-runtime/src/fleet/agent-summaries.ts b/packages/lina-runtime/src/fleet/agent-summaries.ts new file mode 100644 index 0000000..61a3635 --- /dev/null +++ b/packages/lina-runtime/src/fleet/agent-summaries.ts @@ -0,0 +1,134 @@ +import { lstatSync } from "node:fs"; +import { join } from "node:path"; +import { DatabaseSync } from "node:sqlite"; +import { isDeepStrictEqual } from "node:util"; +import { + type AgentConversationSummary, + type PublicListMessage, + summaryFromSnapshot, +} from "../../../lina-client/src/agent-list.ts"; +import { + checkedDirectory, + checkedRegular, + readRegular, +} from "../../../lina-core/src/attachments/filesystem.ts"; +import { CONVERSATION_FILTER } from "../../../lina-core/src/conversation.ts"; +import { PREVIEW_MAX_CHARS } from "../../../lina-core/src/protocol.ts"; +import { validateBinding } from "../../../lina-core/src/session-binding.ts"; +import { type AgentFleet, validAgentId } from "./manager.ts"; + +function emptySummary( + agentId: string, + available: boolean, +): AgentConversationSummary { + return { + agentId, + available, + sessionId: null, + revision: 0, + latestMessage: null, + confirmationCount: null, + running: null, + }; +} + +/** Reads one committed public row. Never starts a room, initializes a store or replays an engine. */ +function storedSummary( + root: string, + agentId: string, +): AgentConversationSummary { + const directory = agentId === "lina" ? root : join(root, "agents", agentId); + const path = join(directory, "state.sqlite"); + const manifest = join(directory, "binding.json"); + const exists = (file: string) => + Boolean(lstatSync(file, { throwIfNoEntry: false })); + if (!exists(path) && !exists(manifest)) return emptySummary(agentId, true); + checkedDirectory(directory, false); + checkedRegular(path); + for (const suffix of ["-wal", "-shm", "-journal"]) + checkedRegular(`${path}${suffix}`, false); + const binding = validateBinding( + JSON.parse(new TextDecoder().decode(readRegular(manifest, 65536))), + ); + if (binding.botId !== agentId) throw Error("Foreign summary binding"); + const db = new DatabaseSync(path, { readOnly: true }); + try { + db.exec("BEGIN"); + if (db.prepare("PRAGMA user_version").get()?.["user_version"] !== 1) + throw Error("Unknown summary schema"); + const saved = db + .prepare("SELECT value FROM meta WHERE key = 'binding'") + .get()?.["value"]; + if ( + typeof saved !== "string" || + !isDeepStrictEqual(JSON.parse(saved), binding) + ) + throw Error("Foreign summary store"); + const revision = Number( + db.prepare("SELECT value FROM meta WHERE key = 'revision'").get()?.[ + "value" + ], + ); + if (!Number.isSafeInteger(revision) || revision < 0) + throw Error("Invalid summary revision"); + // This predicate is the public conversation's existing storage projection. + const row = db + .prepare( + `SELECT entry_id, seq, role, substr(text, 1, ?) AS text, timestamp FROM entries WHERE session_id = ? AND (${CONVERSATION_FILTER}) ORDER BY seq DESC LIMIT 1`, + ) + .get(PREVIEW_MAX_CHARS, binding.sessionId); + let latestMessage: PublicListMessage | null = null; + if (row) { + if ( + typeof row["entry_id"] !== "string" || + typeof row["seq"] !== "number" || + (row["role"] !== "user" && row["role"] !== "assistant") || + typeof row["text"] !== "string" || + typeof row["timestamp"] !== "string" + ) + throw Error("Invalid public summary"); + latestMessage = { + entryId: row["entry_id"], + seq: row["seq"], + role: row["role"], + text: row["text"], + timestamp: row["timestamp"], + }; + } + return { + ...emptySummary(agentId, true), + sessionId: binding.sessionId, + revision, + latestMessage, + }; + } finally { + db.close(); + } +} + +export function agentSummaries( + fleet: Pick, +): AgentConversationSummary[] { + return fleet.agents.list().map(({ id }) => { + try { + if (!validAgentId(id)) throw Error("Invalid agent"); + const app = fleet.opened(id); + if (app) { + const snapshot = app.runtime.snapshot(); + const control = app.execution.snapshot(); + const count = + control.sessionId === snapshot.sessionId + ? control.approvals.filter( + (approval) => + approval.state === "pending" && + approval.expiresAt > Date.now(), + ).length + : null; + return summaryFromSnapshot(snapshot, count); + } + return storedSummary(fleet.root, id); + } catch { + return emptySummary(id, false); + } + }); +} diff --git a/packages/lina-runtime/src/fleet/server.ts b/packages/lina-runtime/src/fleet/server.ts index 49be34c..87ae114 100644 --- a/packages/lina-runtime/src/fleet/server.ts +++ b/packages/lina-runtime/src/fleet/server.ts @@ -10,6 +10,7 @@ import { import { inspectContent } from "../../../lina-core/src/attachments/validation.ts"; import { HonchoClient } from "../../../lina-memory/src/honcho/client.ts"; import { defaultConversation } from "../persona/conversation.ts"; +import { agentSummaries } from "./agent-summaries.ts"; import { companionRoutes } from "./companion-routes.ts"; import { introRoutes } from "./intro-routes.ts"; import { type AgentFleet, validAgentId } from "./manager.ts"; @@ -112,7 +113,11 @@ export async function startFleetServer( (primary ?? fleet.opened(primaryId))?.binding.sessionId ?? null, }); if (url.pathname === "/api/agents" && request.method === "GET") - return response({ agents: fleet.summary(), presets: fleet.presets }); + return response({ + agents: fleet.summary(), + summaries: agentSummaries(fleet), + presets: fleet.presets, + }); if (url.pathname === "/api/agents" && request.method === "POST") { const value = await json(request), preset = diff --git a/packages/lina-ui/SOURCES.md b/packages/lina-ui/SOURCES.md new file mode 100644 index 0000000..b9ceda3 --- /dev/null +++ b/packages/lina-ui/SOURCES.md @@ -0,0 +1,25 @@ +# UI component provenance + +Lina adapts shadcn/ui's MIT-licensed `base-nova` component compositions, retrieved +on 2026-09-07, to named exports and the existing semantic CSS tokens. Base UI owns +interactive behavior; no Tailwind framework or shadcn CLI runtime is bundled. + +The registry response has no immutable Git revision field. These SHA-256 digests +pin the exact retrieved snapshots; they must not be presented as an upstream Git +commit. Button, dropdown-menu, tabs and avatar patterns informed the local +wrappers. The input snapshot was inspected but not copied as a separate component. +Combobox uses the installed Base UI 1.8.0 API and its own Lina adapter. + +| Registry snapshot | SHA-256 | +| --- | --- | +| [input.json](https://ui.shadcn.com/r/styles/base-nova/input.json) | `bbad1bba130ac9750a61844eeb8f043e8a710846e07689fa85398b80a46c2741` | +| [button.json](https://ui.shadcn.com/r/styles/base-nova/button.json) | `9ba7e870178813f0552b818a913a2792fb500c779e36395740b4973e3025d427` | +| [tabs.json](https://ui.shadcn.com/r/styles/base-nova/tabs.json) | `b4552a0329dd9a6e2bfaf03405c133874df5a4930c7bb3dd84c9ab5c45b89402` | +| [avatar.json](https://ui.shadcn.com/r/styles/base-nova/avatar.json) | `bbcabf0121fb2ff93a8522f8f80b74631e732a31399b1b7991c0b8c3167e2172` | +| [dropdown-menu.json](https://ui.shadcn.com/r/styles/base-nova/dropdown-menu.json) | `335c59dba30145f434a9cc9ccb0438a3c5e2afe857fc11b029de1ecb415224d7` | + +Runtime versions are pinned in `package.json` and the workspace `bun.lock`. +React 19.2.8, React DOM 19.2.8 and Base UI 1.8.0 are new dependencies of this UI +package. `THIRD_PARTY_LICENSES.txt` preserves their distributed licenses, relevant +transitive dependency licenses and the shadcn MIT notice. `lina-web/src/assets.ts` +includes these notices in the JS served on web and bundled into Electron. diff --git a/packages/lina-ui/THIRD_PARTY_LICENSES.txt b/packages/lina-ui/THIRD_PARTY_LICENSES.txt new file mode 100644 index 0000000..545a720 --- /dev/null +++ b/packages/lina-ui/THIRD_PARTY_LICENSES.txt @@ -0,0 +1,309 @@ +Lina shared renderer: included UI source and runtime dependency licenses. +Versions match bun.lock; update this file when UI dependencies change. + +shadcn/ui base-nova registry (retrieved 2026-09-07) +MIT License + +Copyright (c) 2023 shadcn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +react@19.2.8 +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +react-dom@19.2.8 +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +scheduler@0.27.0 +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +@base-ui/react@1.8.0 +MIT License + +Copyright (c) 2019 Material-UI SAS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +@babel/runtime@7.29.7 +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@floating-ui/react-dom@2.1.9 +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@floating-ui/dom@1.8.0 +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@floating-ui/core@1.8.0 +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@floating-ui/utils@0.2.12 +MIT License + +Copyright (c) 2021-present Floating UI contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +use-sync-external-store@1.6.0 +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +@base-ui/utils@0.4.0 +MIT License + +Copyright (c) 2019 Material-UI SAS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +reselect@5.3.0 +The MIT License (MIT) + +Copyright (c) 2015-2018 Reselect Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/lina-web/client/activity.css b/packages/lina-ui/client/activity.css similarity index 100% rename from packages/lina-web/client/activity.css rename to packages/lina-ui/client/activity.css diff --git a/packages/lina-web/client/agent-editor.ts b/packages/lina-ui/client/agent-editor.ts similarity index 100% rename from packages/lina-web/client/agent-editor.ts rename to packages/lina-ui/client/agent-editor.ts diff --git a/packages/lina-ui/client/agent-list.ts b/packages/lina-ui/client/agent-list.ts new file mode 100644 index 0000000..eb5bdcd --- /dev/null +++ b/packages/lina-ui/client/agent-list.ts @@ -0,0 +1,75 @@ +import { createElement } from "react"; +import type { + AgentListModel, + AgentListRow, +} from "../../lina-client/src/agent-list.ts"; +import { + AgentList, + type AgentListActions, + AgentListStatus, +} from "./components/agent-list.tsx"; +import { mountView } from "./components/mount.ts"; + +export function agentAvatar( + profile: Pick, +): HTMLSpanElement { + const avatar = document.createElement("span"); + avatar.className = "avatar"; + avatar.setAttribute("aria-hidden", "true"); + const fallback = () => { + avatar.textContent = Array.from(profile.name.trim())[0] ?? "?"; + }; + fallback(); + if (profile.avatarId) { + const img = document.createElement("img"); + img.src = `/api/avatars/${encodeURIComponent(profile.avatarId)}`; + img.alt = ""; + img.loading = "lazy"; + img.addEventListener("error", fallback, { once: true }); + avatar.replaceChildren(img); + } + return avatar; +} + +export function createAgentListView( + model: AgentListModel, + list: HTMLElement, + status: HTMLElement, + actions: AgentListActions, +) { + const listView = mountView(list); + const statusView = mountView(status); + status.setAttribute("role", "status"); + status.setAttribute("aria-live", "polite"); + const renderStatus = (copy: string, retry: boolean) => { + statusView.render( + createElement(AgentListStatus, { copy, retry, onRetry: actions.retry }), + ); + status.hidden = !copy; + }; + const render = () => { + const rows = model.rows(); + const filter = document.getElementById("agent-filter"); + const filtered = filter instanceof HTMLInputElement && filter.value.trim(); + const unavailable = rows.some((row) => row.summaryUnavailable); + const copy = + model.status === "error" + ? "에이전트 목록을 불러오지 못했어요. 다시 시도해주세요." + : model.status === "loading" + ? "에이전트를 불러오는 중…" + : !rows.length + ? filtered + ? "이름이나 역할이 일치하는 에이전트가 없어요." + : "아직 에이전트가 없어요. 추가 버튼으로 시작해보세요." + : unavailable + ? "일부 대화 요약을 새로 불러오지 못했어요." + : ""; + listView.render(createElement(AgentList, { rows, actions })); + renderStatus(copy, model.status === "error" || unavailable); + list.setAttribute("aria-busy", String(model.status === "loading")); + }; + return Object.assign(render, { + // Transient navigation errors share React's status root. Rendering the model clears them. + notice: (message: string) => renderStatus(message, false), + }); +} diff --git a/packages/lina-web/client/agent-templates.ts b/packages/lina-ui/client/agent-templates.ts similarity index 100% rename from packages/lina-web/client/agent-templates.ts rename to packages/lina-ui/client/agent-templates.ts diff --git a/packages/lina-web/client/agents.css b/packages/lina-ui/client/agents.css similarity index 64% rename from packages/lina-web/client/agents.css rename to packages/lina-ui/client/agents.css index f6fc70a..1693e17 100644 --- a/packages/lina-web/client/agents.css +++ b/packages/lina-ui/client/agents.css @@ -6,13 +6,10 @@ .agents-heading .section-label { margin: 0; } -.agents-heading .icon-button { - font-size: 24px; -} .avatar img { width: 100%; height: 100%; - border-radius: 10px; + border-radius: var(--control-radius); object-fit: cover; } .avatar:has(img) { @@ -39,39 +36,17 @@ min-width: 32px; min-height: 40px; } -.agent-actions { - position: fixed; - z-index: 20; - min-width: 170px; - padding: 6px; - background: var(--surface-raised); - border: 1px solid var(--line-strong); - border-radius: 9px; -} -.agent-actions button { - width: 100%; - background: none; - border: 0; - color: var(--text); - padding: 12px; - border-radius: 5px; - text-align: left; - font-size: 0.85rem; -} -.agent-actions button:hover { - background: var(--selection); -} .agent-form { - padding: 20px; + padding: 8px 24px 24px; display: flex; flex-direction: column; - gap: 18px; + gap: 16px; } .agent-form label { display: flex; flex-direction: column; gap: 8px; - font-size: 0.85rem; + font-size: 0.875rem; } .agent-form input, .agent-form textarea, @@ -79,18 +54,23 @@ background: var(--input-bg); color: var(--text); border: 1px solid var(--input-border); - border-radius: 7px; - padding: 9px; + border-radius: var(--control-radius); + padding: 7px 11px; width: 100%; + min-width: 0; font: inherit; + line-height: 20px; } .agent-form textarea { min-height: 80px; resize: vertical; max-height: 280px; + padding: 10px 12px; + line-height: 1.6; } +.agent-form input, .agent-form select { - min-height: 40px; + min-height: 36px; } .agent-portrait { display: flex; @@ -101,23 +81,20 @@ width: 88px; height: 88px; object-fit: cover; - border-radius: 20px; + border-radius: var(--menu-radius); } .agent-form summary { cursor: pointer; - font-size: 0.85rem; -} -.agent-form details label { - margin-top: 14px; + font-size: 0.875rem; } .agent-hint { color: var(--muted); - font-size: 0.75rem; + font-size: 0.8125rem; line-height: 1.7; margin-top: 8px; } #agent-growth { - font-size: 0.8rem; + font-size: 0.8125rem; line-height: 1.7; padding-top: 12px; } @@ -125,7 +102,6 @@ margin: 14px 0 4px; } .agent-change { - border-top: 1px solid var(--line); margin-top: 10px; padding-top: 10px; display: flex; @@ -134,7 +110,7 @@ } #current-agent-settings { padding-left: 10px; - font-size: 0.72rem; + font-size: 0.8125rem; } #open-conversation-settings { align-self: flex-start; @@ -144,13 +120,13 @@ max-height: min(760px, calc(100dvh - 24px)); } .conversation-form { - padding: 20px; + padding: 8px 24px 24px; overflow-y: auto; } .conversation-form > label, .conversation-example label { display: block; - font-size: 0.85rem; + font-size: 0.875rem; margin: 14px 0 7px; } .conversation-form textarea { @@ -160,11 +136,24 @@ background: var(--input-bg); color: var(--text); border: 1px solid var(--input-border); - border-radius: 7px; - padding: 9px; + border-radius: var(--control-radius); + padding: 10px 12px; font: inherit; + line-height: 1.6; resize: vertical; } +.agent-form :is(input, textarea, select):focus-visible, +.conversation-form textarea:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; +} +.agent-form :is(input, textarea, select):disabled, +.conversation-form textarea:disabled { + opacity: 0.55; +} +.agent-form details label { + margin-top: 16px; +} .conversation-form #conversation-style { max-height: 220px; } @@ -177,32 +166,29 @@ } .conversation-example-heading h3, .conversation-preferences-section h3 { - font-size: 0.9rem; + font-size: 0.875rem; margin: 22px 0 8px; } .conversation-example { - border: 1px solid var(--line); - border-radius: 9px; - padding: 8px 12px 12px; - margin: 10px 0; + border: 0; + padding: 0; + margin: 16px 0; + min-width: 0; } .conversation-example legend { - padding: 0 5px; + padding: 0; color: var(--muted); - font-size: 0.75rem; + font-size: 0.8125rem; } .conversation-example .text-button { margin-top: 8px; } .conversation-preferences-section { - border-top: 1px solid var(--line); margin-top: 24px; - padding-top: 2px; } .conversation-preference { - border-bottom: 1px solid var(--line); padding: 10px 0; - font-size: 0.82rem; + font-size: 0.875rem; } .conversation-preference p, .conversation-empty { @@ -212,15 +198,45 @@ .conversation-actions { display: flex; justify-content: flex-end; - gap: 10px; - margin-top: 22px; + align-items: center; + flex-wrap: wrap; + gap: 8px; + margin-top: 24px; +} +.agent-form > button[type="submit"] { + align-self: flex-end; +} +.agent-form > button[type="submit"], +.conversation-actions button[type="submit"] { + background: var(--button-bg); + color: var(--button-text); +} +.agent-form > button[type="submit"]:hover:not(:disabled), +.conversation-actions button[type="submit"]:hover:not(:disabled) { + background: var(--button-hover); +} +@media (max-width: 767px) { + .agent-form, + .conversation-form { + padding: 8px 16px 20px; + } + .agent-form input, + .agent-form select { + min-height: 44px; + } + .agent-form input, + .agent-form select, + .agent-form textarea, + .conversation-form textarea { + font-size: 1rem; + } + .agent-actions button { + min-height: 44px; + } } @media (max-width: 480px) { .conversation-dialog { width: calc(100vw - 16px); max-height: calc(100dvh - 16px); } - .conversation-form { - padding: 16px; - } } diff --git a/packages/lina-web/client/agents.ts b/packages/lina-ui/client/agents.ts similarity index 52% rename from packages/lina-web/client/agents.ts rename to packages/lina-ui/client/agents.ts index 1e171a5..e8973cc 100644 --- a/packages/lina-web/client/agents.ts +++ b/packages/lina-ui/client/agents.ts @@ -1,10 +1,17 @@ -import type { - AgentInput, - AgentProfile, - Dynamics, -} from "../../lina-core/src/agents/types.ts"; +import { createElement } from "react"; +import { + type AgentConversationSummary, + AgentListModel, + type AgentListProfile, + summaryFromSnapshot, +} from "../../lina-client/src/agent-list.ts"; +import { browserDraftStore } from "../../lina-client/src/draft.ts"; +import type { SessionSnapshot } from "../../lina-core/src/protocol.ts"; import { agentRequest, createAgentEditor } from "./agent-editor.ts"; +import { createAgentListView } from "./agent-list.ts"; import { createTemplatePicker } from "./agent-templates.ts"; +import { createActionMenu } from "./components/action-menu.tsx"; +import { MindIcon, SettingsIcon } from "./components/icons.tsx"; import { createConversationEditor } from "./conversation-editor.ts"; import { displayName } from "./intro-model.ts"; import { @@ -15,11 +22,20 @@ import { } from "./mind-view.ts"; import { element, setText } from "./render.ts"; -type Summary = AgentProfile & { state: string; dynamics: Dynamics }; -export function createAgents(currentId: string, preserve: () => boolean) { +export function createAgents( + initialId: string, + preserve: () => boolean, + onSelect?: (agentId: string) => void | Promise, +) { + let currentId = initialId; const list = element("other-agents", HTMLDivElement), - primary = element("open-lina", HTMLButtonElement), - menu = element("agent-actions", HTMLDivElement); + primary = document.getElementById("open-lina"); + const status = element("agent-list-status", HTMLElement); + const filter = element("agent-filter", HTMLInputElement); + const model = new AgentListModel(currentId, { + getItem: (key) => localStorage.getItem(key), + setItem: (key, value) => localStorage.setItem(key, value), + }); const mind = createMindView(); const mindDialog = element("mind-dialog", HTMLDialogElement); const mindStatus = element("mind-status", HTMLParagraphElement); @@ -141,29 +157,30 @@ export function createAgents(currentId: string, preserve: () => boolean) { mindRecords.before(retractHint); for (const button of mindDialog.querySelectorAll("[data-close]")) button.addEventListener("click", () => mindDialog.close()); - let agents: Summary[] = [], - signature = "", - selectedId = currentId, - anchor: HTMLElement = primary; - const navigate = (id: string) => { - if (id === currentId) { - element("message", HTMLTextAreaElement).focus(); - return; + let agents: AgentListProfile[] = [], + selectedId = currentId; + let navigationGeneration = 0; + const navigate = async (id: string) => { + if (id !== currentId && !preserve()) return; + const mine = ++navigationGeneration; + try { + if (id !== "lina" && id !== currentId) { + const state = (await agentRequest( + `/api/agents/${encodeURIComponent(id)}/intro`, + )) as { room?: { id: string; status: string } }; + if (mine !== navigationGeneration) return; + if (state.room && state.room.status !== "done") { + location.assign(`/?onboarding=${encodeURIComponent(state.room.id)}`); + return; + } + } + if (onSelect) await onSelect(id); + else if (id !== currentId) + location.assign(`/?agent=${encodeURIComponent(id)}`); + } catch { + if (mine !== navigationGeneration) return; + renderList.notice("대화를 열지 못했어요. 에이전트를 다시 선택해주세요."); } - if (!preserve()) return; - const target = `/?agent=${encodeURIComponent(id)}`; - if (id !== "lina") { - void agentRequest(`/api/agents/${id}/intro`) - .then((value) => { - const state = value as { room?: { id: string; status: string } }; - location.assign( - state.room && state.room.status !== "done" - ? `/?onboarding=${state.room.id}` - : target, - ); - }) - .catch(() => location.assign(target)); - } else location.assign(target); }; const conversationEditor = createConversationEditor(); const editor = createAgentEditor( @@ -178,51 +195,33 @@ export function createAgents(currentId: string, preserve: () => boolean) { ); }, ); - const openMenu = (id: string, element: HTMLElement) => { - selectedId = id; - const drawer = document.getElementById("sidebar-drawer"); - if (drawer instanceof HTMLDialogElement && drawer.open) drawer.close(); - anchor = - window.innerWidth < 768 - ? (document.getElementById("open-sidebar") as HTMLElement) - : element; - const r = element.getBoundingClientRect(); - menu.hidden = false; - menu.style.left = `${Math.min(r.right, window.innerWidth - 180)}px`; - menu.style.top = `${Math.min(r.top, window.innerHeight - 100)}px`; - menu.querySelector("button")?.focus(); - }; - element("edit-agent", HTMLButtonElement).addEventListener("click", () => { - menu.hidden = true; - void editor.open(selectedId, anchor); + const menu = createActionMenu({ + id: "agent-actions", + label: "에이전트 메뉴", + align: "end", + items: [ + { + id: "edit-agent", + label: "프로필 및 설정", + icon: createElement(SettingsIcon), + run: (opener) => void editor.open(selectedId, opener), + }, + { + id: "open-mind", + label: "마음 상태 보기", + icon: createElement(MindIcon), + run: (opener) => void openMind(selectedId, opener), + }, + ], }); - element("open-mind", HTMLButtonElement).addEventListener("click", () => { - menu.hidden = true; - void openMind(selectedId, anchor); - }); - menu.addEventListener("keydown", (event) => { - if (event.key === "Escape") { - event.preventDefault(); - menu.hidden = true; - anchor.focus(); - } - }); - document.addEventListener("pointerdown", (event) => { - if (event.target instanceof Node && !menu.contains(event.target)) - menu.hidden = true; - }); - const avatar = (profile: AgentProfile) => { - const value = document.createElement("span"); - value.className = "avatar"; - if (profile.avatarId) { - const img = document.createElement("img"); - img.src = `/api/avatars/${profile.avatarId}`; - img.alt = ""; - value.append(img); - } else value.textContent = profile.name.slice(0, 1); - return value; + const closeMenu = () => menu.close(); + const openMenu = (id: string, opener: HTMLElement) => { + selectedId = id; + menu.open(opener); }; - primary.addEventListener("contextmenu", (event) => { + window.addEventListener("resize", closeMenu); + primary?.addEventListener("click", () => void navigate(currentId)); + primary?.addEventListener("contextmenu", (event) => { event.preventDefault(); openMenu(currentId, primary); }); @@ -234,76 +233,115 @@ export function createAgents(currentId: string, preserve: () => boolean) { element("add-agent", HTMLButtonElement).addEventListener("click", (event) => { if (preserve()) templates.open(event.currentTarget as HTMLButtonElement); }); - async function refresh() { - try { - const data = (await agentRequest("/api/agents")) as { - agents: Summary[]; - presets: AgentInput[]; - }; - agents = data.agents; - const current = agents.find((a) => a.id === currentId); - if (current) { - document.title = `${displayName(current.name)} · Lina`; - setText( - element("chat-agent-name", HTMLElement), - displayName(current.name), - ); - setText( - primary.querySelector("strong") ?? primary, - displayName(current.name), - ); - const old = primary.querySelector(".avatar"); - if (old) old.replaceWith(avatar(current)); - primary.setAttribute("aria-label", `${current.name} 대화`); + const renderList = createAgentListView(model, list, status, { + select: (id) => void navigate(id), + menu: openMenu, + retry: () => void refresh(), + }); + const updateLabels = () => { + const current = agents.find((agent) => agent.id === currentId); + if (!current) return; + document.title = `${displayName(current.name)} · Lina`; + setText(element("chat-agent-name", HTMLElement), displayName(current.name)); + element("current-agent-settings", HTMLButtonElement).setAttribute( + "aria-label", + `${current.name} 프로필과 설정`, + ); + }; + const loadedDrafts = new Set(); + let inFlight: Promise | undefined; + function refresh(): Promise { + if (inFlight) return inFlight; + inFlight = (async () => { + try { + const data = (await agentRequest("/api/agents")) as { + agents: AgentListProfile[]; + summaries?: AgentConversationSummary[]; + }; + agents = data.agents; + model.replace(agents); + for (const profile of agents) { + if (loadedDrafts.has(profile.id)) continue; + model.setDraft( + profile.id, + browserDraftStore(() => localStorage, profile.id).draft(), + ); + loadedDrafts.add(profile.id); + } + if (data.summaries) + for (const summary of data.summaries) model.updateSummary(summary); + else model.summariesFailed(); + updateLabels(); + } catch { + model.fail(); } - const next = JSON.stringify( - agents.map((a) => [a.id, a.name, a.role, a.avatarId, a.state]), - ); - if (signature === next) return; - signature = next; - list.replaceChildren( - ...agents - .filter((a) => a.id !== currentId) - .map((profile) => { - const row = document.createElement("div"); - row.className = "agent-row"; - const button = document.createElement("button"); - button.type = "button"; - button.className = "agent-link"; - button.setAttribute("aria-label", `${profile.name} 대화`); - button.append(avatar(profile)); - const copy = document.createElement("span"); - copy.className = "agent-copy sidebar-label"; - const title = document.createElement("strong"); - title.textContent = displayName(profile.name); - const sub = document.createElement("small"); - sub.textContent = - profile.state === "running" ? "작업 중" : profile.role; - copy.append(title, sub); - button.append(copy); - button.addEventListener("click", () => navigate(profile.id)); - button.addEventListener("contextmenu", (event) => { - event.preventDefault(); - openMenu(profile.id, button); - }); - const more = document.createElement("button"); - more.type = "button"; - more.className = "agent-more sidebar-label"; - more.textContent = "···"; - more.setAttribute("aria-label", `${profile.name} 메뉴`); - more.addEventListener("click", () => openMenu(profile.id, more)); - row.append(button, more); - return row; - }), - ); - } catch { - /* Legacy isolated fixtures can omit management APIs. Conversation stays usable. */ - } + renderList(); + })().finally(() => { + inFlight = undefined; + }); + return inFlight; } + filter.addEventListener("input", () => { + model.setFilter(filter.value); + renderList(); + }); + const updateDraft = (id: string, text: string) => { + loadedDrafts.add(id); + model.setDraft(id, text); + renderList(); + }; + document.getElementById("message")?.addEventListener("input", (event) => { + if (event.target instanceof HTMLTextAreaElement) + updateDraft(currentId, event.target.value); + }); + window.addEventListener("storage", () => { + for (const profile of agents) + model.setDraft( + profile.id, + browserDraftStore(() => localStorage, profile.id).draft(), + ); + renderList(); + }); + renderList(); void refresh(); const interval = setInterval(() => { if (!document.hidden) void refresh(); }, 15000); window.addEventListener("pagehide", () => clearInterval(interval)); - return { refresh }; + return { + refresh, + cancelNavigation() { + navigationGeneration++; + }, + updateDraft, + setCurrent(id: string) { + navigationGeneration++; + currentId = id; + model.setCurrent(id); + closeMenu(); + updateLabels(); + renderList(); + }, + updateSummary(summary: AgentConversationSummary) { + model.updateSummary(summary); + renderList(); + }, + updateSnapshot(snapshot: SessionSnapshot, confirmationCount?: number) { + const previous = model.summary(snapshot.botId); + model.updateSummary( + summaryFromSnapshot( + snapshot, + confirmationCount ?? + (previous?.sessionId === snapshot.sessionId + ? previous.confirmationCount + : null), + ), + ); + renderList(); + }, + markVisible(agentId: string, sessionId: string, seq: number) { + if (!document.hidden) model.markVisible(agentId, sessionId, seq); + renderList(); + }, + }; } diff --git a/packages/lina-web/client/app.ts b/packages/lina-ui/client/app.ts similarity index 100% rename from packages/lina-web/client/app.ts rename to packages/lina-ui/client/app.ts diff --git a/packages/lina-ui/client/attachments.css b/packages/lina-ui/client/attachments.css new file mode 100644 index 0000000..69d4704 --- /dev/null +++ b/packages/lina-ui/client/attachments.css @@ -0,0 +1,28 @@ +#draft-files .file-chip { + flex-wrap: wrap; + max-width: min(100%, 360px); +} +#draft-files .attachment-name { + flex: 1 1 100px; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#draft-files .attachment-status { + flex: 1 0 100%; + order: 1; + overflow-wrap: anywhere; + word-break: keep-all; + color: var(--muted); +} +#draft-files .file-chip button { + flex: 0 0 auto; + min-width: 24px; + white-space: nowrap; +} +#draft-files .file-chip img, +#draft-files .file-chip canvas { + flex: 0 0 40px; + object-fit: contain; +} diff --git a/packages/lina-ui/client/attachments.ts b/packages/lina-ui/client/attachments.ts new file mode 100644 index 0000000..33b65fa --- /dev/null +++ b/packages/lina-ui/client/attachments.ts @@ -0,0 +1,284 @@ +import { + AttachmentDraft, + attachmentHref, + type DraftAttachment, + MAX_DRAFT_ATTACHMENTS, +} from "../../lina-client/src/attachment-draft.ts"; +import { + ATTACHMENT_UPLOAD_MAX_BYTES, + AttachmentQueue, + type AttachmentQueueItem, + type AttachmentSource, +} from "../../lina-client/src/attachment-queue.ts"; +import { installClipboardAttachments } from "./clipboard-attachments.ts"; +import { element } from "./render.ts"; + +export function createAttachments( + input: HTMLTextAreaElement, + session: () => string | undefined, + changed: () => void, + notice: (text: string) => void, +) { + const draft = new AttachmentDraft(); + const list = element("draft-files", HTMLDivElement); + const picker = element("file-picker", HTMLInputElement); + const button = element("attach-file", HTMLButtonElement); + let connected = false, + signature = ""; + const queue = new AttachmentQueue(draft, { + session, + text: () => input.value, + notice, + changed: () => { + render(); + changed(); + }, + }); + list.setAttribute("aria-label", "첨부 파일"); + list.setAttribute("aria-live", "polite"); + const render = () => { + const next = JSON.stringify([session(), connected, queue.items]); + if (signature !== next) { + signature = next; + list.replaceChildren(); + list.hidden = queue.items.length === 0; + for (const item of queue.items) { + const row = + item.state === "ready" + ? fileChip(item.ref, session()) + : pendingChip(item); + row.setAttribute("data-attachment-state", item.state); + if (item.state === "ready" && item.owner === session()) { + const status = document.createElement("span"); + status.className = "attachment-status"; + status.textContent = "준비됨"; + row.append(status); + if (/\.(png|jpe?g)$/i.test(item.name)) { + const image = document.createElement("img"); + image.src = attachmentHref(item.ref, "/preview"); + image.alt = `${item.name} 썸네일`; + image.width = image.height = 40; + image.addEventListener("error", () => { + image.hidden = true; + }); + row.append(image); + } + } + if (item.state === "error") { + const retry = document.createElement("button"); + retry.type = "button"; + retry.textContent = "재시도"; + retry.setAttribute("aria-label", `${item.name} 첨부 재시도`); + retry.disabled = !connected || item.owner !== session(); + retry.addEventListener("click", () => { + queue.retry(item.key); + input.focus(); + }); + row.append(retry); + } + const remove = document.createElement("button"); + remove.type = "button"; + remove.textContent = "×"; + remove.setAttribute("aria-label", `${item.name} 첨부 제외`); + remove.addEventListener("click", () => { + queue.remove(item.key); + input.focus(); + }); + row.append(remove); + list.append(row); + } + } + button.disabled = + !connected || !session() || queue.items.length >= MAX_DRAFT_ATTACHMENTS; + }; + const port = { + get value() { + draft.text = input.value; + return draft.value; + }, + set value(text: string) { + queue.reset(text); + input.value = draft.text; + render(); + }, + }; + const addFiles = ( + files: readonly File[], + source: AttachmentSource = "picker", + ) => queue.addFiles(files, source); + const openPicker = () => picker.click(); + const picked = () => { + const files = Array.from(picker.files ?? []); + picker.value = ""; + addFiles(files, "picker"); + }; + button.addEventListener("click", openPicker); + picker.addEventListener("change", picked); + const removePaste = installClipboardAttachments(input, (files) => + addFiles(files, "paste"), + ); + return { + port, + addFiles, + get busy() { + return queue.busy; + }, + get blocked() { + return queue.blocked; + }, + update(online: boolean) { + connected = online; + queue.update(online); + render(); + }, + dispose() { + queue.update(false); + removePaste(); + button.removeEventListener("click", openPicker); + picker.removeEventListener("change", picked); + }, + }; +} + +function pendingChip( + item: Exclude, +): HTMLElement { + const row = document.createElement("span"); + row.className = "file-chip"; + const name = document.createElement("span"); + name.className = "attachment-name"; + name.textContent = item.name; + name.title = item.name; + const status = document.createElement("span"); + status.className = "attachment-status"; + status.textContent = + item.state === "error" + ? (item.error ?? "첨부 실패") + : item.state === "pending" + ? "대기 중" + : "첨부 중…"; + if (item.state === "error") status.setAttribute("role", "alert"); + row.append(name, status); + if ( + ["image/png", "image/jpeg"].includes(item.file.type) && + item.file.size <= ATTACHMENT_UPLOAD_MAX_BYTES && + typeof createImageBitmap === "function" + ) { + // Canvas keeps local thumbnails within the existing self-only image CSP. + const canvas = document.createElement("canvas"); + canvas.width = canvas.height = 40; + canvas.setAttribute("role", "img"); + canvas.setAttribute("aria-label", `${item.name} 썸네일`); + row.append(canvas); + void createImageBitmap(item.file) + .then((bitmap) => { + try { + if (!canvas.isConnected) return; + const context = canvas.getContext("2d"); + const scale = Math.min(40 / bitmap.width, 40 / bitmap.height); + context?.drawImage( + bitmap, + 0, + 0, + bitmap.width * scale, + bitmap.height * scale, + ); + } finally { + bitmap.close(); + } + }) + .catch(() => { + canvas.hidden = true; + }); + } + return row; +} +function fileChip( + ref: DraftAttachment, + sessionId: string | undefined, +): HTMLElement { + const row = document.createElement("span"); + row.className = "file-chip"; + if (ref.sessionId !== sessionId) { + row.textContent = `${ref.name} · ${sessionId ? "다른 대화의 첨부" : "연결 후 확인"}`; + return row; + } + const link = document.createElement("a"); + link.href = attachmentHref(ref); + link.textContent = ref.name; + link.title = ref.name; + link.download = ref.name; + const preview = document.createElement("button"); + preview.type = "button"; + preview.textContent = "미리보기"; + preview.addEventListener("click", () => void showPreview(ref)); + row.append(link, preview); + return row; +} +export function renderUserBody( + container: Element, + text: string, + sessionId: string | undefined, +): void { + const draft = new AttachmentDraft(); + draft.value = text; + container.replaceChildren(document.createTextNode(draft.text)); + if (draft.refs.length) { + const files = document.createElement("div"); + files.className = "message-files"; + files.append(...draft.refs.map((ref) => fileChip(ref, sessionId))); + container.append(files); + } +} +async function showPreview(ref: DraftAttachment): Promise { + const dialog = document.createElement("dialog"); + dialog.className = "file-preview"; + dialog.setAttribute("aria-label", `${ref.name} 미리보기`); + const title = document.createElement("strong"); + title.textContent = ref.name; + const close = document.createElement("button"); + close.type = "button"; + close.textContent = "닫기"; + close.addEventListener("click", () => dialog.close()); + const body = document.createElement("div"); + body.textContent = "불러오는 중"; + dialog.append(title, close, body); + document.body.append(dialog); + dialog.addEventListener("close", () => dialog.remove(), { once: true }); + dialog.showModal(); + try { + const response = await fetch(attachmentHref(ref, "/preview"), { + signal: AbortSignal.timeout(10000), + redirect: "error", + }); + if (!response.ok) throw new Error("미리보기 실패"); + const mime = response.headers.get("Content-Type") ?? ""; + if (mime.startsWith("image/png") || mime.startsWith("image/jpeg")) { + const image = document.createElement("img"); + image.alt = ref.name; + // Same-origin URL, not a data/blob URL; server validates format and dimensions. + image.src = attachmentHref(ref, "/preview"); + image.addEventListener( + "error", + () => { + body.textContent = "이미지 표시 실패 · 다운로드 가능"; + }, + { once: true }, + ); + body.replaceChildren(image); + await response.body?.cancel(); + } else if (mime.startsWith("text/plain")) { + const text = await response.text(); + const pre = document.createElement("pre"); + pre.textContent = + text.slice(0, 8192) + + (text.length > 8192 ? "\n… 전체 내용은 다운로드로 확인" : ""); + body.replaceChildren(pre); + } else { + await response.body?.cancel(); + throw new Error("미리보기 미지원"); + } + } catch (error) { + body.textContent = error instanceof Error ? error.message : "미리보기 실패"; + } +} diff --git a/packages/lina-web/client/base.css b/packages/lina-ui/client/base.css similarity index 80% rename from packages/lina-web/client/base.css rename to packages/lina-ui/client/base.css index b4c915c..0124d64 100644 --- a/packages/lina-web/client/base.css +++ b/packages/lina-ui/client/base.css @@ -1,7 +1,7 @@ :root { font-family: - -apple-system, BlinkMacSystemFont, "Segoe UI", "Apple SD Gothic Neo", - "Noto Sans CJK KR", sans-serif; + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + "Apple SD Gothic Neo", "Noto Sans CJK KR", "Noto Sans KR", sans-serif; color: var(--text); background: var(--app-bg); font-synthesis: none; @@ -11,10 +11,12 @@ } body { margin: 0; - font-size: 0.9375rem; + font-size: var(--font-ui); + line-height: 1.5; } button, input, +select, textarea { font: inherit; } @@ -39,7 +41,7 @@ input:focus-visible, summary:focus-visible, textarea:focus-visible { outline: 2px solid var(--accent); - outline-offset: 4px; + outline-offset: 2px; } body [hidden] { display: none; @@ -64,7 +66,6 @@ h3 { min(420px, 45vw) ) minmax(0, 1fr); height: 100dvh; - max-width: 1600px; margin: auto; background: var(--surface-main); } diff --git a/packages/lina-web/client/chat.css b/packages/lina-ui/client/chat.css similarity index 86% rename from packages/lina-web/client/chat.css rename to packages/lina-ui/client/chat.css index b945f35..dc20c2f 100644 --- a/packages/lina-web/client/chat.css +++ b/packages/lina-ui/client/chat.css @@ -5,16 +5,16 @@ flex-direction: column; } .chat-header { - min-height: 76px; - padding: 17px 28px; + min-height: 56px; + padding: 8px 24px; display: flex; align-items: center; justify-content: space-between; - gap: 16px; - border-bottom: 1px solid var(--line); + gap: 8px; + flex-shrink: 0; } h1 { - font-size: 1.2rem; + font-size: var(--font-ui); font-weight: 600; } .connection-controls { @@ -47,14 +47,15 @@ h1 { } .text-button { border: 0; - padding: 9px; + padding: 6px 10px; + min-height: var(--control-size); background: transparent; color: var(--accent); - font-size: 0.72rem; - border-radius: 6px; + font-size: var(--font-caption); + border-radius: var(--control-radius); } .text-button:hover { - background: var(--tint); + background: var(--hover); } .notice { margin: 16px 30px 0; @@ -71,7 +72,7 @@ h1 { min-height: 0; overflow-y: auto; overscroll-behavior: contain; - scrollbar-gutter: stable; + scrollbar-gutter: stable both-edges; } .welcome { min-height: 100%; @@ -129,25 +130,25 @@ h1 { background: var(--tint); } .messages { - max-width: 820px; + max-width: var(--conversation-width); margin: auto; - padding: 26px 30px 10px; + padding: 24px 24px 12px; } .message { - margin-bottom: 27px; + margin-bottom: 28px; } .message-body { white-space: pre-wrap; word-break: keep-all; overflow-wrap: anywhere; - line-height: 1.8; + line-height: 1.75; font-size: var(--chat-text-size, 0.9375rem); margin-left: 0; } .message.user .message-body { background: var(--surface-raised); - padding: 13px 16px; - border-radius: 9px; + padding: 10px 16px; + border-radius: 18px; } .message-footer { display: flex; @@ -175,12 +176,8 @@ h1 { max-width: 85%; margin-left: auto; } -.message.user .message-body { - border-radius: 16px 16px 4px 16px; - padding: 10px 15px; -} .message.assistant { - max-width: 95%; + max-width: 100%; } .message.user .message-footer { justify-content: flex-end; diff --git a/packages/lina-ui/client/clipboard-attachments.ts b/packages/lina-ui/client/clipboard-attachments.ts new file mode 100644 index 0000000..8b7d92e --- /dev/null +++ b/packages/lina-ui/client/clipboard-attachments.ts @@ -0,0 +1,31 @@ +type ClipboardData = Pick; + +/** Snapshot one collection per event; Chromium wrappers may differ in lastModified. */ +export function clipboardFiles(data: ClipboardData): File[] { + const items = Array.from(data.items).flatMap((item) => { + if (item.kind !== "file") return []; + const file = item.getAsFile(); + return file ? [file] : []; + }); + return items.length ? items : Array.from(data.files); +} + +export function installClipboardAttachments( + input: HTMLTextAreaElement, + addFiles: (files: File[]) => void, +): () => void { + const paste = (event: ClipboardEvent) => { + if (event.defaultPrevented || !event.clipboardData) return; + const files = clipboardFiles(event.clipboardData); + if (!files.length) return; + const text = event.clipboardData.getData("text/plain"); + event.preventDefault(); + if (text) { + input.setRangeText(text, input.selectionStart, input.selectionEnd, "end"); + input.dispatchEvent(new Event("input", { bubbles: true })); + } + addFiles(files); + }; + input.addEventListener("paste", paste); + return () => input.removeEventListener("paste", paste); +} diff --git a/packages/lina-web/client/companion.css b/packages/lina-ui/client/companion.css similarity index 73% rename from packages/lina-web/client/companion.css rename to packages/lina-ui/client/companion.css index 1b927cc..5c02725 100644 --- a/packages/lina-web/client/companion.css +++ b/packages/lina-ui/client/companion.css @@ -10,19 +10,19 @@ gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--line); - font-size: 0.82rem; + font-size: var(--font-ui); } .model-role-row select { min-width: 0; padding: 7px; border: 1px solid var(--input-border); - border-radius: 6px; + border-radius: var(--control-radius); background: var(--input-bg); color: var(--text); } .model-effective { color: var(--muted); - font-size: 0.72rem; + font-size: var(--font-caption); line-height: 1.6; padding-top: 10px; } @@ -32,14 +32,14 @@ margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line); - font-size: 0.82rem; + font-size: var(--font-ui); } .model-trial select, .model-trial textarea { width: 100%; padding: 8px; border: 1px solid var(--input-border); - border-radius: 6px; + border-radius: var(--control-radius); background: var(--input-bg); color: var(--text); resize: vertical; @@ -94,79 +94,81 @@ align-items: start; padding: 12px 0; border-bottom: 1px solid var(--line); - font-size: 0.82rem; + font-size: var(--font-ui); } .model-config-row > label { - padding-top: 12px; + padding-top: 8px; } .model-config-row select, .model-combobox input { width: 100%; min-width: 0; - min-height: 42px; + min-height: 36px; border: 1px solid var(--input-border); - border-radius: 8px; + border-radius: var(--control-radius); background: var(--input-bg); color: var(--text); font: inherit; - padding: 9px; + padding: 7px 10px; } .model-combobox { min-width: 0; position: relative; } -.model-combobox[data-open="true"] { - z-index: 4; -} .model-combobox input { padding-right: 22px; background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%); background-position: - calc(100% - 13px) 18px, - calc(100% - 9px) 18px; + calc(100% - 13px) 16px, + calc(100% - 9px) 16px; background-size: 4px 4px; background-repeat: no-repeat; text-overflow: ellipsis; } +.model-combobox-positioner { + z-index: 60; + width: var(--anchor-width); + max-width: calc(100vw - 16px); + outline: none; +} +.model-combobox-popup { + max-height: var(--available-height); + overflow: hidden; + padding: 4px; + border: 1px solid var(--line); + border-radius: var(--menu-radius); + background: var(--surface-raised); + color: var(--text); + box-shadow: 0 8px 32px #0003; + outline: none; +} .model-combobox-list { - position: absolute; - left: 0; - right: 0; - top: calc(100% + 5px); - z-index: 4; - max-height: min(220px, 40dvh); + max-height: min(260px, calc(var(--available-height) - 10px)); overflow: auto; overscroll-behavior: contain; - padding: 4px; - border: 1px solid var(--input-border); - border-radius: 10px; - background: var(--input-bg); -} -.model-combobox[data-placement="above"] .model-combobox-list { - top: auto; - bottom: calc(100% + 5px); -} -.model-combobox-list[hidden] { - display: none; } .model-combobox-list [role="option"] { - padding: 11px 9px; - min-height: 42px; - border-radius: 6px; - cursor: pointer; + padding: 8px 10px; + min-height: 36px; + border-radius: var(--control-radius); + cursor: default; overflow-wrap: anywhere; - line-height: 1.5; + line-height: 20px; } .model-combobox-list [role="option"]:hover, -.model-combobox-list [data-active="true"] { - background: color-mix(in srgb, var(--accent) 18%, var(--input-bg)); +.model-combobox-list [data-highlighted] { + background: var(--selection); } .model-combobox-list [aria-selected="true"] { color: var(--accent); font-weight: 600; } +.model-combobox-popup .agent-hint { + margin: 0; + padding: 8px; +} .model-combobox input:focus-visible, .model-config-row select:focus-visible { outline: 2px solid var(--accent); @@ -180,7 +182,7 @@ grid-column: 2 / -1; margin: 0; color: var(--muted); - font-size: 0.72rem; + font-size: var(--font-caption); line-height: 1.5; } .model-row-hint:empty { @@ -219,6 +221,14 @@ } .model-role-row select { width: 100%; - min-height: 42px; + min-height: 36px; font: inherit; } + +@media (max-width: 767px) { + .model-config-row select, + .model-combobox input, + .model-combobox-list [role="option"] { + min-height: 44px; + } +} diff --git a/packages/lina-ui/client/components/action-menu.tsx b/packages/lina-ui/client/components/action-menu.tsx new file mode 100644 index 0000000..524d2a7 --- /dev/null +++ b/packages/lina-ui/client/components/action-menu.tsx @@ -0,0 +1,137 @@ +import { createRef, type ReactNode } from "react"; +import { flushSync } from "react-dom"; +import { mountView } from "./mount.ts"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, +} from "./ui/dropdown-menu.tsx"; + +interface Action { + id: string; + label: string; + icon?: ReactNode; + shortcut?: string; + run(opener: HTMLElement): void; +} + +/** Existing controllers own triggers; this adapter owns the entire menu subtree. */ +export function createActionMenu(options: { + id: string; + label: string; + items: Action[]; + side?: "top" | "bottom"; + align?: "start" | "end"; +}) { + const host = document.createElement("div"); + host.dataset["uiHost"] = options.id; + document.body.append(host); + const view = mountView(host); + const actionsRef = createRef<{ close(): void; unmount(): void }>(); + let anchor: HTMLElement | null = null; + let opened = false; + let restoreFocus = false; + const render = () => + view.render( + { + // The trigger belongs to the controller, so Base UI does not know it. + // Let its click toggle once instead of outside-press closing then reopening. + if ( + details.reason === "outside-press" && + details.event.target instanceof Node && + anchor?.contains(details.event.target) + ) { + details.cancel(); + return; + } + if (!next) restoreFocus = details.reason === "escape-key"; + opened = next; + anchor?.setAttribute("aria-expanded", String(next)); + render(); + }} + > + { + if (event.key !== "Tab") return; + // External triggers have no Base UI focus guard. Resume the + // browser's native Tab/Shift+Tab order at the actual opener. + close(); + flushSync(() => actionsRef.current?.unmount()); + if (anchor?.isConnected) anchor.focus({ preventScroll: true }); + }} + finalFocus={() => + restoreFocus && anchor?.isConnected ? anchor : false + } + > + {options.items.map((item) => ( + } + onClick={() => { + const opener = anchor; + close(); + if (opener) item.run(opener); + }} + > + {item.icon} + {item.label} + {item.shortcut && {item.shortcut}} + + ))} + + , + ); + function close() { + restoreFocus = false; + opened = false; + anchor?.setAttribute("aria-expanded", "false"); + render(); + } + function open(opener: HTMLElement, edge: "first" | "last" = "first") { + anchor?.setAttribute("aria-expanded", "false"); + anchor = opener; + opened = true; + restoreFocus = false; + opener.setAttribute("aria-haspopup", "menu"); + opener.setAttribute("aria-controls", options.id); + opener.setAttribute("aria-expanded", "true"); + render(); + const item = edge === "first" ? options.items[0] : options.items.at(-1); + if (item) document.getElementById(item.id)?.focus({ preventScroll: true }); + } + const bindings: Array<() => void> = []; + render(); + return { + open, + close, + bindTrigger(trigger: HTMLElement) { + const click = () => (opened ? close() : open(trigger)); + const keydown = (event: KeyboardEvent) => { + if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return; + event.preventDefault(); + open(trigger, event.key === "ArrowUp" ? "last" : "first"); + }; + trigger.addEventListener("click", click); + trigger.addEventListener("keydown", keydown); + bindings.push(() => { + trigger.removeEventListener("click", click); + trigger.removeEventListener("keydown", keydown); + }); + }, + destroy() { + for (const unbind of bindings) unbind(); + view.destroy(); + host.remove(); + }, + }; +} diff --git a/packages/lina-ui/client/components/agent-list.tsx b/packages/lina-ui/client/components/agent-list.tsx new file mode 100644 index 0000000..f40c098 --- /dev/null +++ b/packages/lina-ui/client/components/agent-list.tsx @@ -0,0 +1,253 @@ +import type { KeyboardEvent, PointerEvent } from "react"; +import { useCallback, useEffect, useRef } from "react"; +import type { AgentListRow } from "../../../lina-client/src/agent-list.ts"; +import { Avatar } from "./ui/avatar.tsx"; +import { Button } from "./ui/button.tsx"; + +export type AgentListActions = { + select(id: string): void; + menu(id: string, opener: HTMLElement): void; + retry(): void; +}; + +const LONG_PRESS_MS = 550; +const PRESS_MOVE_TOLERANCE = 10; + +function messageTime(timestamp: string | null): string { + if (!timestamp) return ""; + const date = new Date(timestamp); + if (!Number.isFinite(date.getTime())) return ""; + const today = new Date(); + if (date.toDateString() === today.toDateString()) + return date.toLocaleTimeString("ko-KR", { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }); + today.setDate(today.getDate() - 1); + return date.toDateString() === today.toDateString() + ? "어제" + : date.toLocaleDateString("ko-KR", { + month: "numeric", + day: "numeric", + ...(date.getFullYear() !== today.getFullYear() + ? { year: "2-digit" } + : {}), + }); +} + +function AgentRow({ + row, + actions, + onNavigate, + linkRef, +}: { + row: AgentListRow; + actions: AgentListActions; + onNavigate(event: KeyboardEvent): void; + linkRef(node: HTMLButtonElement | null): void; +}) { + const more = useRef(null); + const longPressed = useRef(false); + const press = useRef<{ + timer: ReturnType; + controller: AbortController; + pointerId: number; + x: number; + y: number; + } | null>(null); + const cancelPress = useCallback(() => { + if (!press.current) return; + clearTimeout(press.current.timer); + press.current.controller.abort(); + press.current = null; + }, []); + useEffect(() => cancelPress, [cancelPress]); + const openMenu = () => { + cancelPress(); + if (more.current) actions.menu(row.id, more.current); + }; + const startPress = (event: PointerEvent) => { + cancelPress(); + longPressed.current = false; + if (event.pointerType !== "touch" || !event.isPrimary) return; + const controller = new AbortController(); + // Scroll events do not bubble. Capture also catches a scrollable ancestor. + event.currentTarget.ownerDocument.addEventListener("scroll", cancelPress, { + capture: true, + signal: controller.signal, + }); + press.current = { + controller, + pointerId: event.pointerId, + x: event.clientX, + y: event.clientY, + timer: setTimeout(() => { + longPressed.current = true; + openMenu(); + }, LONG_PRESS_MS), + }; + }; + const contextKeys = (event: KeyboardEvent) => { + if ( + event.key === "ContextMenu" || + (event.shiftKey && event.key === "F10") + ) { + event.preventDefault(); + openMenu(); + } + }; + const time = messageTime(row.timestamp); + const confirmation = (row.confirmationCount ?? 0) > 0; + return ( + // The wrapper shares context-menu shortcuts between its two native buttons. + // biome-ignore lint/a11y/noStaticElementInteractions: keyboard activation lives on the descendant buttons. +

+ ); +} + +export function AgentList({ + rows, + actions, +}: { + rows: AgentListRow[]; + actions: AgentListActions; +}) { + const links = useRef(new Map()); + const navigate = (event: KeyboardEvent, index: number) => { + if (!["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) return; + event.preventDefault(); + const next = + event.key === "Home" + ? 0 + : event.key === "End" + ? rows.length - 1 + : Math.max( + 0, + Math.min( + rows.length - 1, + index + (event.key === "ArrowDown" ? 1 : -1), + ), + ); + const row = rows[next]; + if (row) links.current.get(row.id)?.focus(); + }; + return rows.map((row, index) => ( + navigate(event, index)} + linkRef={(node) => { + if (node) links.current.set(row.id, node); + else links.current.delete(row.id); + }} + /> + )); +} + +export function AgentListStatus({ + copy, + retry, + onRetry, +}: { + copy: string; + retry: boolean; + onRetry(): void; +}) { + return ( + <> + {copy} + + + ); +} diff --git a/packages/lina-ui/client/components/icons.tsx b/packages/lina-ui/client/components/icons.tsx new file mode 100644 index 0000000..a0cc33d --- /dev/null +++ b/packages/lina-ui/client/components/icons.tsx @@ -0,0 +1,24 @@ +export function SettingsIcon() { + return ( + + ); +} +export function KeyboardIcon() { + return ( + + ); +} +export function MindIcon() { + return ( + + ); +} diff --git a/packages/lina-ui/client/components/model-combobox.tsx b/packages/lina-ui/client/components/model-combobox.tsx new file mode 100644 index 0000000..28bc85f --- /dev/null +++ b/packages/lina-ui/client/components/model-combobox.tsx @@ -0,0 +1,132 @@ +import { type Ref, useImperativeHandle, useRef, useState } from "react"; +import type { ModelChoice } from "../model-combobox-types.ts"; +import { + Combobox, + ComboboxContent, + ComboboxEmpty, + ComboboxInput, + ComboboxItem, + ComboboxList, +} from "./ui/combobox.tsx"; + +interface Selection { + items: ModelChoice[]; + value: string; + label: string; + disabled: boolean; +} +export interface ModelComboboxHandle { + input: HTMLInputElement | null; + set(selection: Selection): void; + disable(disabled: boolean): void; + close(): void; +} + +const normalize = (text: string) => + text.trim().replace(/\s+/g, " ").toLocaleLowerCase(); +function matches(item: ModelChoice, query: string) { + const text = normalize(`${item.label} ${item.search ?? ""}`); + return normalize(query) + .split(" ") + .every((part) => text.includes(part)); +} + +export function ModelCombobox({ + id, + label, + onChange, + ref, +}: { + id: string; + label: string; + onChange(value: string): void; + ref: Ref; +}) { + const input = useRef(null); + const [selection, setSelection] = useState({ + items: [], + value: "", + label: "모델 선택…", + disabled: false, + }); + const [open, setOpen] = useState(false); + const [query, setQuery] = useState(null); + const close = () => { + setOpen(false); + setQuery(null); + }; + useImperativeHandle(ref, () => ({ + input: input.current, + set(next) { + setSelection(next); + if (next.disabled) close(); + }, + disable(disabled) { + setSelection((current) => ({ ...current, disabled })); + if (disabled) close(); + }, + close, + })); + // Retain catalog order until searching; concrete models precede inheritance matches. + const items = query?.trim() + ? [...selection.items].sort( + (a, b) => Number(!!a.inherited) - Number(!!b.inherited), + ) + : selection.items; + const dialog = input.current?.closest("dialog"); + return ( + item.value === value.value} + inputValue={query ?? selection.label} + onInputValueChange={(value, details) => { + if (details.reason === "input-change") setQuery(value); + }} + onValueChange={(item) => { + // Editing the query must not clear the model or select inheritance. + if (!item) return; + setSelection((current) => ({ + ...current, + value: item.value, + label: item.label, + })); + onChange(item.value); + }} + open={open} + onOpenChange={(nextOpen) => { + setOpen(nextOpen); + if (!nextOpen) setQuery(null); + }} + disabled={selection.disabled} + > + + + +

검색 결과가 없습니다.

+
+ + {(item: ModelChoice) => ( + + {item.label} + + )} + +
+
+ ); +} diff --git a/packages/lina-ui/client/components/mount.ts b/packages/lina-ui/client/components/mount.ts new file mode 100644 index 0000000..2682259 --- /dev/null +++ b/packages/lina-ui/client/components/mount.ts @@ -0,0 +1,17 @@ +import type { ReactNode } from "react"; +import { flushSync } from "react-dom"; +import { createRoot } from "react-dom/client"; + +/** The controller owns the host; React alone owns all descendants. */ +export function mountView(host: HTMLElement) { + const root = createRoot(host); + return { + render(node: ReactNode) { + // Legacy callers may query/focus the view immediately after this call. + flushSync(() => root.render(node)); + }, + destroy() { + root.unmount(); + }, + }; +} diff --git a/packages/lina-ui/client/components/settings-tabs.tsx b/packages/lina-ui/client/components/settings-tabs.tsx new file mode 100644 index 0000000..d2d30e0 --- /dev/null +++ b/packages/lina-ui/client/components/settings-tabs.tsx @@ -0,0 +1,71 @@ +import { SETTINGS_TABS, type SettingsTab } from "../settings-tab-model.ts"; +import { SettingsIcon } from "./icons.tsx"; +import { Tabs, TabsList, TabsTrigger } from "./ui/tabs.tsx"; + +const labels: Record = { + general: "일반", + connections: "프로바이더 연결", + models: "역할별 모델", +}; + +function SettingsTabIcon({ tab }: { tab: SettingsTab }) { + if (tab === "general") return ; + return ( + + ); +} + +export function SettingsTabsView({ + value, + orientation, + label, + select, +}: { + value: SettingsTab; + orientation: "horizontal" | "vertical"; + label: string; + select: (tab: SettingsTab) => void; +}) { + return ( + { + const tab = SETTINGS_TABS.find((id) => id === next); + if (tab) select(tab); + }} + render={ + + } + style={{ + flexDirection: orientation === "vertical" ? "column" : "row", + }} + > + {SETTINGS_TABS.map((tab) => ( + + + {labels[tab]} + + ))} + + ); +} diff --git a/packages/lina-ui/client/components/task-layout-control.tsx b/packages/lina-ui/client/components/task-layout-control.tsx new file mode 100644 index 0000000..1098f65 --- /dev/null +++ b/packages/lina-ui/client/components/task-layout-control.tsx @@ -0,0 +1,28 @@ +import { Button } from "./ui/button.tsx"; + +/** A secondary task action, separate from the global sidebar control. */ +export function TaskLayoutControl({ + active, + onToggle, +}: { + active: boolean; + onToggle(): void; +}) { + return ( + + ); +} diff --git a/packages/lina-ui/client/components/theme-controls.tsx b/packages/lina-ui/client/components/theme-controls.tsx new file mode 100644 index 0000000..2fbda7b --- /dev/null +++ b/packages/lina-ui/client/components/theme-controls.tsx @@ -0,0 +1,32 @@ +import type { Theme } from "../theme.ts"; +import { Button } from "./ui/button.tsx"; + +const choices: { value: Theme; label: string }[] = [ + { value: "dark", label: "다크" }, + { value: "light", label: "라이트" }, + { value: "system", label: "시스템" }, +]; + +export function ThemeControlsView({ + preference, + select, +}: { + preference: Theme; + select: (theme: Theme) => void; +}) { + return ( + <> + {choices.map(({ value, label }) => ( + + ))} + + ); +} diff --git a/packages/lina-ui/client/components/ui/avatar.tsx b/packages/lina-ui/client/components/ui/avatar.tsx new file mode 100644 index 0000000..98d7342 --- /dev/null +++ b/packages/lina-ui/client/components/ui/avatar.tsx @@ -0,0 +1,21 @@ +import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"; + +/** Base UI owns image loading and fallback visibility; Lina owns the geometry. */ +export function Avatar({ + src, + fallback, +}: { + src?: string | undefined; + fallback: string; +}) { + return ( + + ); +} diff --git a/packages/lina-ui/client/components/ui/button.tsx b/packages/lina-ui/client/components/ui/button.tsx new file mode 100644 index 0000000..2d080f5 --- /dev/null +++ b/packages/lina-ui/client/components/ui/button.tsx @@ -0,0 +1,22 @@ +import { Button as ButtonPrimitive } from "@base-ui/react/button"; + +/** shadcn base-nova Button, with Lina's shared CSS tokens instead of Tailwind. */ +export function Button({ + className = "", + variant = "ghost", + size = "default", + ...props +}: ButtonPrimitive.Props & { + variant?: "default" | "secondary" | "ghost" | "outline" | "destructive"; + size?: "default" | "icon"; +}) { + return ( + + ); +} diff --git a/packages/lina-ui/client/components/ui/combobox.tsx b/packages/lina-ui/client/components/ui/combobox.tsx new file mode 100644 index 0000000..55c750e --- /dev/null +++ b/packages/lina-ui/client/components/ui/combobox.tsx @@ -0,0 +1,34 @@ +import { Combobox as Primitive } from "@base-ui/react/combobox"; + +/** shadcn-style composition; Base UI owns widget interactions and positioning. */ +export const Combobox = Primitive.Root; +export const ComboboxInput = Primitive.Input; +export const ComboboxList = Primitive.List; +export const ComboboxItem = Primitive.Item; +export const ComboboxEmpty = Primitive.Empty; + +export function ComboboxContent({ + container, + collisionBoundary, + ...props +}: Primitive.Popup.Props & + Pick & + Pick) { + return ( + + + + + + ); +} diff --git a/packages/lina-ui/client/components/ui/dropdown-menu.tsx b/packages/lina-ui/client/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..bc7cfe7 --- /dev/null +++ b/packages/lina-ui/client/components/ui/dropdown-menu.tsx @@ -0,0 +1,41 @@ +import { Menu } from "@base-ui/react/menu"; + +/** Adapted from shadcn base-nova; behavior stays in Base UI, skin in controls.css. */ +export const DropdownMenu = Menu.Root; + +export function DropdownMenuContent({ + anchor, + side = "bottom", + align = "start", + ...props +}: Menu.Popup.Props & + Pick) { + return ( + + + + + + ); +} + +export function DropdownMenuItem(props: Menu.Item.Props) { + return ( + + ); +} diff --git a/packages/lina-ui/client/components/ui/tabs.tsx b/packages/lina-ui/client/components/ui/tabs.tsx new file mode 100644 index 0000000..21f6c37 --- /dev/null +++ b/packages/lina-ui/client/components/ui/tabs.tsx @@ -0,0 +1,19 @@ +import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"; + +/** shadcn base-nova Tabs slots, styled with Lina's existing CSS. */ +export function Tabs({ + orientation = "horizontal", + ...props +}: TabsPrimitive.Root.Props) { + return ( + + ); +} + +export function TabsList(props: TabsPrimitive.List.Props) { + return ; +} + +export function TabsTrigger(props: TabsPrimitive.Tab.Props) { + return ; +} diff --git a/packages/lina-web/client/composer-size.ts b/packages/lina-ui/client/composer-size.ts similarity index 100% rename from packages/lina-web/client/composer-size.ts rename to packages/lina-ui/client/composer-size.ts diff --git a/packages/lina-ui/client/composer.css b/packages/lina-ui/client/composer.css new file mode 100644 index 0000000..d016b22 --- /dev/null +++ b/packages/lina-ui/client/composer.css @@ -0,0 +1,124 @@ +.composer-area { + display: flex; + flex-direction: column; + min-height: 0; + padding: 12px 24px 24px; + width: 100%; + max-width: var(--conversation-width); + align-self: center; +} +.composer { + flex-shrink: 0; + border: 1px solid transparent; + border-radius: var(--composer-radius); + padding: 12px; + background: var(--surface-raised); +} +.composer:focus-within { + border-color: var(--line-strong); +} +textarea { + display: block; + width: 100%; + border: none; + outline: none; + resize: none; + min-height: 44px; + max-height: none; + background: transparent; + color: inherit; + font-size: var(--chat-text-size, 0.9375rem); + line-height: 1.7; +} +#message { + padding: 2px 4px 8px; +} +textarea:focus-visible { + outline: none; +} +textarea::placeholder { + color: var(--muted); +} +.composer-bottom { + display: flex; + gap: 4px; + align-items: center; + margin-top: 8px; +} +#attach-file, +:is(#send, #task-send) { + display: inline-grid; + place-items: center; + flex-shrink: 0; + width: var(--control-size); + height: var(--control-size); + min-height: var(--control-size); + padding: 0; + border: 0; + border-radius: 50%; +} +#attach-file { + background: transparent; + color: var(--text); +} +#attach-file:hover:not(:disabled) { + background: var(--hover); +} +#attach-file:disabled { + opacity: 0.5; +} +#composer-model { + display: inline-flex; + align-items: center; + gap: 6px; + margin-left: auto; + min-height: var(--control-size); + padding: 4px 8px; + color: var(--muted); + font-size: var(--font-caption); +} +#composer-model svg { + width: 14px; + height: 14px; +} +:is(#send, #task-send) { + margin-left: 4px; + color: var(--button-text); + background: var(--button-bg); +} +:is(#send, #task-send):hover:not(:disabled) { + background: var(--button-hover); +} +:is(#send, #task-send):disabled { + background: var(--disabled-bg); + color: var(--muted); +} +.work-panels { + min-height: 0; + max-height: 40dvh; + overflow: auto; +} +.execution-bar { + flex-shrink: 0; +} +.composer-expand { + color: var(--muted); + white-space: nowrap; +} +.intro-active #send { + margin-left: auto; +} +@media (max-width: 767px) { + .composer-area { + padding: 8px 12px max(12px, env(safe-area-inset-bottom)); + } + .composer { + padding: 10px; + } + .composer-bottom { + margin-top: 4px; + } + #message { + font-size: max(16px, var(--chat-text-size, 16px)); + } +} diff --git a/packages/lina-web/client/context-view.ts b/packages/lina-ui/client/context-view.ts similarity index 97% rename from packages/lina-web/client/context-view.ts rename to packages/lina-ui/client/context-view.ts index a5427ae..e12dc34 100644 --- a/packages/lina-web/client/context-view.ts +++ b/packages/lina-ui/client/context-view.ts @@ -1,8 +1,8 @@ +import type { ContextModel } from "../../lina-client/src/context-model.ts"; import type { ContextClient, ContextSnapshot, } from "../../lina-core/src/context-wire.ts"; -import type { ContextModel } from "./context-model.ts"; import { element, setText } from "./render.ts"; const STATUS: Record = { diff --git a/packages/lina-web/client/context.css b/packages/lina-ui/client/context.css similarity index 100% rename from packages/lina-web/client/context.css rename to packages/lina-ui/client/context.css diff --git a/packages/lina-ui/client/controls.css b/packages/lina-ui/client/controls.css new file mode 100644 index 0000000..3508d97 --- /dev/null +++ b/packages/lina-ui/client/controls.css @@ -0,0 +1,125 @@ +/* Shared shadcn/Base UI skin. All surfaces use the same semantic design tokens. */ +.ui-tabs-list { + display: flex; + gap: inherit; + width: 100%; + min-width: 0; +} +.ui-button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + min-height: var(--control-size); + padding: 6px 10px; + border: 1px solid transparent; + border-radius: var(--control-radius); + background: transparent; + color: var(--text); + font: inherit; + font-weight: 500; + line-height: 20px; + white-space: nowrap; + user-select: none; +} +.ui-button:hover, +.ui-button[aria-expanded="true"] { + background: var(--selection); +} +.ui-button[data-variant="default"] { + background: var(--button-bg); + color: var(--button-text); +} +.ui-button[data-variant="default"]:hover { + background: var(--button-hover); +} +.ui-button[data-variant="secondary"] { + background: var(--surface-raised); +} +.ui-button[data-variant="outline"] { + border-color: var(--line-strong); +} +.ui-button[data-variant="destructive"] { + color: var(--danger); +} +.ui-button[data-size="icon"] { + width: var(--control-size); + height: var(--control-size); + padding: 0; + flex-shrink: 0; +} +.ui-button:disabled, +.ui-button[data-disabled] { + opacity: 0.45; + cursor: not-allowed; +} +:is(.ui-button, .ui-menu-item) svg { + width: var(--icon-size); + height: var(--icon-size); + fill: none; + stroke: currentColor; + stroke-width: 1.6; + stroke-linecap: round; + stroke-linejoin: round; + flex-shrink: 0; + pointer-events: none; +} +.ui-menu-positioner { + z-index: 50; + outline: none; + isolation: isolate; +} +.ui-menu { + min-width: 224px; + max-width: min(320px, calc(100vw - 16px)); + max-height: var(--available-height); + overflow-y: auto; + overscroll-behavior: contain; + padding: 6px; + border: 1px solid var(--line); + border-radius: var(--menu-radius); + background: var(--surface-raised); + color: var(--text); + box-shadow: 0 8px 32px #0003; + outline: none; +} +.ui-menu-item { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + min-height: 36px; + padding: 8px 10px; + border: 0; + border-radius: var(--control-radius); + background: transparent; + color: inherit; + font: inherit; + font-weight: 400; + line-height: 20px; + text-align: left; + cursor: default; + outline: none; + user-select: none; +} +.ui-menu-item[data-highlighted] { + background: var(--selection); +} +.ui-menu-item svg, +.ui-menu-item kbd { + color: var(--muted); +} +.ui-menu-item kbd { + margin-left: auto; + font: inherit; + font-size: var(--font-caption); +} +.ui-menu-item:focus-visible { + outline: 1px solid var(--line-strong); + outline-offset: -1px; +} +@media (max-width: 767px) { + .ui-menu-item { + min-height: var(--control-size); + } +} diff --git a/packages/lina-ui/client/conversation-app.ts b/packages/lina-ui/client/conversation-app.ts new file mode 100644 index 0000000..775679b --- /dev/null +++ b/packages/lina-ui/client/conversation-app.ts @@ -0,0 +1,531 @@ +import { Connection } from "../../lina-client/src/connection.ts"; +import { ContextModel } from "../../lina-client/src/context-model.ts"; +import { browserDraftStore } from "../../lina-client/src/draft.ts"; +import { DurableChatModel } from "../../lina-client/src/durable-model.ts"; +import { ExecutionModel } from "../../lina-client/src/execution-model.ts"; +import { + type DesktopPlatform, + socketUrl, +} from "../../lina-client/src/platform.ts"; +import { shouldSend } from "../../lina-client/src/preferences.ts"; +import type { SessionSnapshot } from "../../lina-core/src/protocol.ts"; +import { createAgents } from "./agents.ts"; +import { createAttachments } from "./attachments.ts"; +import { createComposerSizing } from "./composer-size.ts"; +import { createExecutionView } from "./execution-view.ts"; +import { createNavigation } from "./navigation.ts"; +import { activityStatus, elapsedText } from "./presence.ts"; +import { installPwa } from "./pwa.ts"; +import { + captureReadingPosition, + loadReadingPosition, + type ReadingPosition, + restoreReadingPosition, + saveReadingPosition, +} from "./reading-position.ts"; +import { PendingRecovery } from "./recovery.ts"; +import { createRenderer, element, setText } from "./render.ts"; +import { createSearch } from "./search-view.ts"; +import { createSettings } from "./settings.ts"; +import { installTasks } from "./task-view.ts"; + +const NAVIGATION_DRAFT_NOTICE = + "첨부가 준비되고 초안이 저장된 뒤 이동할 수 있습니다."; + +export function startConversationApp(initialNotice = "") { + const settings = createSettings(); + const queryAgent = new URL(location.href).searchParams.get("agent") ?? "lina"; + let agentId = /^[a-z][a-z0-9-]{0,47}$/.test(queryAgent) ? queryAgent : "lina"; + + let model = new DurableChatModel(); + let execution = new ExecutionModel(); + let context = new ContextModel(); + let drafts = browserDraftStore(() => window.localStorage, agentId); + let publicSnapshot: SessionSnapshot | undefined; + let subscribing = false; + const input = element("message", HTMLTextAreaElement); + const send = element("send", HTMLButtonElement); + element("composer-model", HTMLButtonElement).addEventListener( + "click", + (event) => + settings.openForAgent(agentId, event.currentTarget as HTMLButtonElement), + ); + const composerSizing = createComposerSizing(input); + const notice = element("notice", HTMLDivElement); + const reconnect = element("reconnect", HTMLButtonElement); + const earlier = element("earlier", HTMLButtonElement); + const latest = element("latest", HTMLButtonElement); + let detail = initialNotice; + const attachments = createAttachments( + input, + () => model.sessionId, + () => { + recovery.edited(); + const saved = drafts.saveDraft(attachments.port.value); + if (saved && !attachments.blocked && detail === NAVIGATION_DRAFT_NOTICE) + detail = ""; + update(); + }, + (message) => { + detail = message; + update(); + }, + ); + const textPort = attachments.port; + const restore = (text: string): void => { + textPort.value = text; + recovery.edited(); + drafts.saveDraft(text); + input.focus(); + if (text.length > 16000) detail = "메시지 길이 초과 · 최대 16,000자"; + update(); + }; + let recovery = new PendingRecovery(drafts, textPort, restore, (message) => { + detail = message; + }); + const render = createRenderer( + () => model, + restore, + (id) => { + const message = model.messages.find((item) => item.id === id); + if ( + model.sessionId && + message?.sourceId && + typeof message.nextOffset === "number" + ) + connection.command({ + type: "entry", + sessionId: model.sessionId, + entryId: message.sourceId, + offset: message.nextOffset, + }); + }, + () => model.sessionId, + ); + + const renderExecution = createExecutionView( + () => execution, + (frame) => connection.command(frame), + update, + ); + + const search = createSearch((frame) => connection.command(frame)); + const tasks = installTasks({ + ownerAgentId: agentId, + onOpen: (id) => renderNavigation.taskOpened(id), + onShowList: () => renderNavigation.taskClosed(), + }); + void tasks.refresh(); + const readingPositions = new Map(); + const rememberPosition = () => { + if ( + !model.sessionId || + !element("conversation-scroll", HTMLDivElement).clientHeight + ) + return; + const position = captureReadingPosition(); + readingPositions.set(`${agentId}:${model.sessionId}`, position); + saveReadingPosition(agentId, model.sessionId, position); + }; + const preserve = () => { + if ( + attachments.blocked || + !tasks.canLeave() || + (textPort.value && !drafts.saveDraft(textPort.value)) + ) { + detail = NAVIGATION_DRAFT_NOTICE; + update(); + return false; + } + rememberPosition(); + if (detail === NAVIGATION_DRAFT_NOTICE) detail = ""; + return true; + }; + const views = new Map< + string, + { + model: DurableChatModel; + execution: ExecutionModel; + context: ContextModel; + position: ReadingPosition; + selection: [number, number]; + } + >(); + let pendingPosition: ReadingPosition | undefined; + let lastHistoryCursor: number | null = null; + let restoreSession: string | undefined; + const agents = createAgents(agentId, preserve, (id) => { + renderNavigation.navigate(id); + }); + const activate = (id: string) => { + if (id === agentId) return true; + connection.stop(); + views.set(agentId, { + model, + execution, + context, + position: element("conversation-scroll", HTMLDivElement).clientHeight + ? captureReadingPosition() + : ((model.sessionId + ? (readingPositions.get(`${agentId}:${model.sessionId}`) ?? + loadReadingPosition(agentId, model.sessionId)) + : undefined) ?? { id: null, offset: 0, bottom: true }), + selection: [input.selectionStart, input.selectionEnd], + }); + agentId = id; + publicSnapshot = undefined; + lastHistoryCursor = null; + restoreSession = undefined; + const saved = views.get(id); + model = saved?.model ?? new DurableChatModel(); + execution = saved?.execution ?? new ExecutionModel(); + context = saved?.context ?? new ContextModel(); + subscribing = false; + detail = ""; + drafts = browserDraftStore(() => window.localStorage, id); + recovery = new PendingRecovery(drafts, textPort, restore, (message) => { + detail = message; + }); + input.setSelectionRange( + ...(saved?.selection ?? [input.value.length, input.value.length]), + ); + pendingPosition = saved?.position; + search.connect(false, undefined); + element("search-dialog", HTMLDialogElement).close(); + agents.setCurrent(id); + void tasks.setOwner(id); + connection = makeConnection(); + update(); + if (pendingPosition && restoreReadingPosition(pendingPosition)) + pendingPosition = undefined; + connection.connect(); + return true; + }; + const renderNavigation = createNavigation( + settings, + (opener) => search.open(opener), + { + activate, + cancelSelection: () => agents.cancelNavigation(), + preserve, + changed: () => update(), + openTask: (id) => { + void tasks.open(id); + }, + closeTask: () => tasks.closeDetail(), + showTasks: () => { + void tasks.refresh(); + }, + }, + ); + + const presence = element("presence", HTMLDivElement); + const presenceLabel = element("presence-label", HTMLSpanElement); + const elapsed = element("presence-elapsed", HTMLSpanElement); + let elapsedTimer: ReturnType | undefined; + function renderPresence(): void { + if (elapsedTimer) clearTimeout(elapsedTimer); + const status = activityStatus({ + connected: model.connected, + running: model.running, + pending: model.pendingId !== undefined, + requestStartedAt: model.requestStartedAt( + execution.state?.cancelRequestId, + ), + control: execution.connected ? execution.state : undefined, + contextBusy: context.state?.busy === true, + }); + presence.hidden = !status; + presence.dataset["moving"] = String(status?.moving === true); + setText(presenceLabel, status?.label ?? ""); + const time = elapsedText(status?.startedAt, Date.now()); + setText(elapsed, time ? `· ${time}` : ""); + if (status?.moving && status.startedAt) + elapsedTimer = setTimeout(renderPresence, 1000); + } + + function restorePosition(): void { + if (!pendingPosition) return; + if (restoreReadingPosition(pendingPosition)) { + pendingPosition = undefined; + return; + } + if ( + model.connected && + model.hasEarlier && + model.beforeCursor !== null && + model.beforeCursor !== lastHistoryCursor && + model.sessionId + ) { + lastHistoryCursor = model.beforeCursor; + connection.command({ + type: "history", + sessionId: model.sessionId, + before: model.beforeCursor, + }); + } + } + + function markVisible(): void { + if ( + pendingPosition || + !publicSnapshot || + document.hidden || + model.hasNewer || + document.querySelector("dialog[open]") + ) + return; + const scroll = element("conversation-scroll", HTMLDivElement); + if ( + !scroll.clientHeight || + scroll.scrollHeight - scroll.scrollTop - scroll.clientHeight >= 80 + ) + return; + const latest = publicSnapshot.messages.findLast( + (item) => item.role === "assistant" || item.role === "user", + ); + if (latest) + agents.markVisible(agentId, publicSnapshot.sessionId, latest.seq); + } + + function update(): void { + composerSizing.update(); + agents.updateDraft(agentId, textPort.value); + attachments.update(model.connected); + render(); + renderNavigation(model); + search.connect(model.connected, model.sessionId); + renderExecution(); + context.connected = model.connected; + context.running = model.running; + + element("welcome", HTMLElement).hidden = + model.messages.length > 0 || model.running; + send.disabled = + !model.connected || + attachments.blocked || + !model.sessionId || + model.pendingId !== undefined || + execution.state?.cancelling === true || + context.state?.busy === true || + textPort.value.length > 16000 || + textPort.value.trim().length === 0; + const state = element("connection-status", HTMLSpanElement); + setText(state, model.connected ? "연결됨" : "연결 대기"); + state.hidden = model.connected; + renderPresence(); + requestAnimationFrame(() => { + restorePosition(); + markVisible(); + }); + state.className = `connection-status${model.connected ? " online" : ""}`; + element("agent-dot", HTMLSpanElement).className = + `agent-dot${model.connected ? " online" : ""}`; + reconnect.hidden = model.connected; + const shownDetail = + textPort.value.length > 16000 + ? "메시지 길이 초과 · 최대 16,000자" + : detail; + notice.hidden = shownDetail.length === 0; + setText(notice, shownDetail); + earlier.hidden = !model.hasEarlier; + earlier.disabled = !model.connected; + latest.hidden = !model.hasNewer; + latest.disabled = !model.connected; + } + + const makeConnection = () => + new Connection( + socketUrl( + location.origin, + `/ws${agentId === "lina" ? "" : `?agent=${agentId}`}`, + ), + { + frame(frame) { + if (frame.type === "agent-status" && !subscribing) { + subscribing = true; + connection.command({ type: "subscribe", version: 2 }); + } + search.receive(frame); + const reading = captureReadingPosition(); + if ( + !pendingPosition && + model.messages.length && + !reading.bottom && + element("conversation-scroll", HTMLDivElement).clientHeight && + ["snapshot", "history", "entry-text"].includes(frame.type) + ) + pendingPosition = reading; + const previousSession = model.sessionId; + model.receive(frame); + if ( + frame.type === "snapshot" && + previousSession && + previousSession !== frame.snapshot.sessionId + ) + pendingPosition = undefined; + if ( + frame.type === "snapshot" && + restoreSession !== frame.snapshot.sessionId + ) { + restoreSession = frame.snapshot.sessionId; + pendingPosition = + pendingPosition ?? loadReadingPosition(agentId, restoreSession); + } + if (frame.type === "snapshot") { + publicSnapshot = frame.snapshot; + agents.updateSnapshot(frame.snapshot); + } + if (frame.type === "snapshot") context.bindSession(model.sessionId); + if (frame.type === "context-state" || frame.type === "context-error") + context.receive(frame); + if (frame.type === "snapshot") execution.bindSession(model.sessionId); + if (frame.type === "control-state" || frame.type === "control-error") + execution.receive(frame, model.sessionId); + if (frame.type === "snapshot") detail = ""; + if (frame.type === "control-state" && publicSnapshot) + agents.updateSnapshot( + publicSnapshot, + frame.state.approvals.filter((item) => item.state === "pending") + .length, + ); + recovery.receive(frame, model.sessionId); + update(); + if (pendingPosition && restoreReadingPosition(pendingPosition)) + pendingPosition = undefined; + }, + disconnected() { + subscribing = false; + model.disconnect(); + execution.disconnect(); + context.disconnect(); + recovery.disconnected(); + update(); + }, + notice(message) { + detail = message; + update(); + }, + }, + ); + + let connection = makeConnection(); + element("conversation-scroll", HTMLDivElement).addEventListener( + "scroll", + () => { + markVisible(); + if ( + !pendingPosition && + model.sessionId && + element("conversation-scroll", HTMLDivElement).clientHeight + ) + rememberPosition(); + }, + ); + document.addEventListener("visibilitychange", markVisible); + renderNavigation.start(); + const resizeViewport = () => { + document.documentElement.style.setProperty( + "--visible-height", + `${window.visualViewport?.height ?? window.innerHeight}px`, + ); + }; + window.visualViewport?.addEventListener("resize", resizeViewport); + resizeViewport(); + element("composer", HTMLFormElement).addEventListener("submit", (event) => { + event.preventDefault(); + const text = textPort.value.trim(); + if (send.disabled || !model.sessionId) return; + const request = recovery.prepare(text, model.sessionId); + if (!request) { + update(); + return; + } + const { id } = request; + if (!model.send(id, text)) return; + recovery.sent(request); + textPort.value = ""; + drafts.saveDraft(""); + if ( + !connection.send({ type: "chat", sessionId: model.sessionId, id, text }) + ) { + model.disconnect(); + textPort.value = text; + drafts.saveDraft(text); + } + update(); + input.focus(); + }); + input.addEventListener("input", () => { + recovery.edited(); + drafts.saveDraft(textPort.value); + update(); + }); + earlier.addEventListener("click", () => { + if (model.sessionId && model.beforeCursor !== null) + connection.command({ + type: "history", + sessionId: model.sessionId, + before: model.beforeCursor, + }); + }); + latest.addEventListener("click", () => { + pendingPosition = undefined; + lastHistoryCursor = null; + model.showLatest(); + connection.command({ type: "subscribe", version: 2 }); + const scroll = element("conversation-scroll", HTMLDivElement); + scroll.scrollTop = scroll.scrollHeight; + }); + input.addEventListener("keydown", (event) => { + if (!shouldSend(event, settings.preferences.sendKey)) return; + event.preventDefault(); + if (!send.disabled) element("composer", HTMLFormElement).requestSubmit(); + }); + for (const button of document.querySelectorAll( + "[data-prompt]", + )) { + button.addEventListener("click", () => + restore(button.getAttribute("data-prompt") ?? ""), + ); + } + reconnect.addEventListener("click", () => { + detail = ""; + connection.connect(); + }); + window.addEventListener("beforeunload", (event) => { + if (!preserve()) { + event.preventDefault(); + event.returnValue = ""; + } + }); + window.addEventListener("pagehide", () => { + connection.stop(); + if (elapsedTimer) clearTimeout(elapsedTimer); + tasks.close(); + }); + window.addEventListener("pageshow", (event) => { + if (event.persisted) connection.resume(); + }); + connection.connect(); + + const desktop = (window as Window & { linaDesktop?: DesktopPlatform }) + .linaDesktop; + if (desktop?.platform !== "desktop") + installPwa( + () => drafts, + () => textPort.value, + ); + else + element("install-heading", HTMLElement) + .closest("section") + ?.setAttribute("hidden", ""); + window.addEventListener("offline", () => { + connection.connect(); + update(); + }); + window.addEventListener("online", () => { + connection.connect(); + update(); + }); +} diff --git a/packages/lina-web/client/conversation-draft.ts b/packages/lina-ui/client/conversation-draft.ts similarity index 100% rename from packages/lina-web/client/conversation-draft.ts rename to packages/lina-ui/client/conversation-draft.ts diff --git a/packages/lina-web/client/conversation-editor.ts b/packages/lina-ui/client/conversation-editor.ts similarity index 100% rename from packages/lina-web/client/conversation-editor.ts rename to packages/lina-ui/client/conversation-editor.ts diff --git a/packages/lina-web/client/execution-view.ts b/packages/lina-ui/client/execution-view.ts similarity index 87% rename from packages/lina-web/client/execution-view.ts rename to packages/lina-ui/client/execution-view.ts index 19b8ed1..0392e86 100644 --- a/packages/lina-web/client/execution-view.ts +++ b/packages/lina-ui/client/execution-view.ts @@ -1,25 +1,35 @@ +import type { ExecutionModel } from "../../lina-client/src/execution-model.ts"; import type { ControlClient } from "../../lina-core/src/control-wire.ts"; -import type { ExecutionModel } from "./execution-model.ts"; import { element, setText } from "./render.ts"; import { approvalDescriptor, toolLabel } from "./tool-label.ts"; export function createExecutionView( - model: ExecutionModel, + source: ExecutionModel | (() => ExecutionModel), send: (frame: ControlClient) => boolean, changed: () => void, ) { + const getModel = () => (typeof source === "function" ? source() : source); + let bound = getModel(); const approvals = element("approval-list", HTMLDivElement); const stop = element("cancel-run", HTMLButtonElement); const error = element("execution-error", HTMLParagraphElement); const approvalNodes = new Map(); const dispatch = (frame: ControlClient | undefined) => { if (!frame) return; + const model = getModel(); model.sent(frame); if (!send(frame)) model.failed(); changed(); }; - stop.addEventListener("click", () => dispatch(model.cancelCommand())); + stop.addEventListener("click", () => dispatch(getModel().cancelCommand())); return () => { + const model = getModel(); + if (bound !== model) { + approvals.replaceChildren(); + approvalNodes.clear(); + bound = model; + error.hidden = true; + } const state = model.state; if (!state) { approvals.replaceChildren(); diff --git a/packages/lina-web/client/execution.css b/packages/lina-ui/client/execution.css similarity index 73% rename from packages/lina-web/client/execution.css rename to packages/lina-ui/client/execution.css index c691d54..7ffbd94 100644 --- a/packages/lina-web/client/execution.css +++ b/packages/lina-ui/client/execution.css @@ -1,10 +1,11 @@ .execution-bar { display: flex; align-items: center; - justify-content: space-between; + justify-content: flex-start; gap: 10px; - margin-bottom: 8px; - padding: 6px 2px; + margin-bottom: 4px; + min-height: 36px; + padding: 4px; font-size: 0.75rem; } .execution-error { @@ -14,11 +15,14 @@ margin: 7px 0; } .approval-request { - border-left: 2px solid var(--accent); - padding: 12px; - margin: 10px 0; - background: var(--surface-raised); - border-radius: 6px; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + column-gap: 16px; + border: 1px solid var(--line); + padding: 14px 16px; + margin: 0 0 8px; + background: var(--surface-sidebar); + border-radius: 16px; } .approval-request strong { font-size: 0.8rem; @@ -33,7 +37,8 @@ color: var(--text); } .approval-input { - margin-bottom: 10px; + margin-bottom: 0; + grid-column: 1 / -1; } .approval-input > summary { cursor: pointer; @@ -52,6 +57,10 @@ } .approval-buttons { display: flex; + grid-column: 2; + grid-row: 1 / 3; + align-items: center; + justify-content: flex-end; gap: 8px; } .approval-buttons button[data-decision="allow"] { @@ -60,21 +69,16 @@ border-color: var(--button-bg); } -.execution-bar { - min-height: 42px; - justify-content: flex-start; - margin-bottom: 6px; -} .presence-mark { - flex: 0 0 28px; - height: 28px; + flex: 0 0 20px; + height: 24px; display: grid; place-items: center; border-radius: 9px; - background: var(--selection); + background: transparent; color: var(--accent); font: - italic 23px Georgia, + italic 20px Georgia, serif; letter-spacing: -0.12em; padding-right: 4px; @@ -99,11 +103,12 @@ #cancel-run, .approval-buttons button { border: 0; - border-radius: 6px; - background: var(--surface-raised); + border-radius: var(--control-radius); + background: transparent; color: var(--text); - padding: 8px 12px; - min-height: 36px; + padding: 6px 12px; + min-height: var(--control-size); + font-size: var(--font-caption); flex-shrink: 0; } .approval-buttons button:disabled { @@ -138,3 +143,11 @@ max-height: 120px; } } + +#cancel-run:hover, +.approval-buttons button:hover { + background: var(--hover); +} +.approval-buttons button[data-decision="allow"]:hover { + background: var(--button-hover); +} diff --git a/packages/lina-web/client/favicon.svg b/packages/lina-ui/client/favicon.svg similarity index 100% rename from packages/lina-web/client/favicon.svg rename to packages/lina-ui/client/favicon.svg diff --git a/packages/lina-web/client/hub-settings.css b/packages/lina-ui/client/hub-settings.css similarity index 87% rename from packages/lina-web/client/hub-settings.css rename to packages/lina-ui/client/hub-settings.css index 8e90f25..69ccc2b 100644 --- a/packages/lina-web/client/hub-settings.css +++ b/packages/lina-ui/client/hub-settings.css @@ -1,11 +1,12 @@ .hub-card { display: grid; gap: 12px; - padding: 4px 0 8px; + padding: 0; } .hub-actions { display: flex; flex-wrap: wrap; + align-items: center; gap: 8px; justify-content: flex-end; } @@ -23,7 +24,7 @@ } #hub-summary { margin: 4px 0 0; - font-size: 0.78rem; + font-size: 0.8125rem; line-height: 1.7; color: var(--muted); overflow-wrap: anywhere; @@ -43,4 +44,7 @@ .hub-card .setting-row { align-items: flex-start; } + .hub-actions { + width: 100%; + } } diff --git a/packages/lina-web/client/hub-settings.ts b/packages/lina-ui/client/hub-settings.ts similarity index 100% rename from packages/lina-web/client/hub-settings.ts rename to packages/lina-ui/client/hub-settings.ts diff --git a/packages/lina-web/client/icon-192.png b/packages/lina-ui/client/icon-192.png similarity index 100% rename from packages/lina-web/client/icon-192.png rename to packages/lina-ui/client/icon-192.png diff --git a/packages/lina-web/client/icon-512.png b/packages/lina-ui/client/icon-512.png similarity index 100% rename from packages/lina-web/client/icon-512.png rename to packages/lina-ui/client/icon-512.png diff --git a/packages/lina-web/client/index.html b/packages/lina-ui/client/index.html similarity index 51% rename from packages/lina-web/client/index.html rename to packages/lina-ui/client/index.html index e69ae66..ceeda20 100644 --- a/packages/lina-web/client/index.html +++ b/packages/lina-ui/client/index.html @@ -4,7 +4,7 @@ - + Lina · 나의 에이전트 @@ -17,13 +17,13 @@
-
-

Lina

연결 중
+
+

Lina

연결 중
@@ -54,30 +54,30 @@
-
Enter로 보내기 · Shift + Enter로 줄바꿈
+
Enter로 보내기 · Shift + Enter로 줄바꿈
- +

설정

Lina를 나에게 맞게

-
-

편안하게, 내 방식으로

이 기기의 화면과 입력 방식을 조정하세요.

화면

화면 모드
글자 크기
+
+

편안하게, 내 방식으로

이 기기의 화면과 입력 방식을 조정하세요.

화면

화면 모드
글자 크기

입력

메시지 보내기

설치 및 업데이트

Lina 웹앱 설치

홈 화면이나 Dock에 추가해, 브라우저 탭 없이 별도 창으로 열 수 있습니다. 설치 후에도 같은 Lina 서버에 연결해 기존 대화를 이어갑니다.

설치 방법

브라우저 메뉴에서 앱 설치를 선택하세요. iPhone·iPad에서는 공유 메뉴의 홈 화면에 추가를 선택하세요.

웹앱 업데이트

이 기기의 Lina 화면을 최신 버전으로 바꿉니다. 새 버전을 확인한 뒤 적용하면, 작성 중인 내용을 저장하고 화면을 새로고침합니다. 대화 기록은 유지됩니다.

업데이트

- +
-

작업

+

작업

키보드 단축키

대화 검색
⌘ K
설정
⌘ ,
줄바꿈
Shift + Enter
닫기
Esc

대화 검색

- -

마음 상태

-

에이전트 설정

캐릭터 프로필과 외형

필요할 때만 대화에서 참고하는 설정입니다.

현재 기분과 함께 쌓은 변화

-

대화 방식

Lina가 어떤 식으로 대화하면 좋은지 알려주세요. 나중에 다시 바꿀 수 있어요.

대화 예시

배운 대화 선호

-

에이전트 추가

+ +

마음 상태

+

에이전트 설정

캐릭터 프로필과 외형

필요할 때만 대화에서 참고하는 설정입니다.

현재 기분과 함께 쌓은 변화

+

대화 방식

Lina가 어떤 식으로 대화하면 좋은지 알려주세요. 나중에 다시 바꿀 수 있어요.

대화 예시

배운 대화 선호

+

에이전트 추가

@@ -87,7 +87,7 @@

나를 알려주세요

초안 - +
@@ -95,7 +95,7 @@

나를 알려주세요

- +
diff --git a/packages/lina-web/client/intro-api.ts b/packages/lina-ui/client/intro-api.ts similarity index 100% rename from packages/lina-web/client/intro-api.ts rename to packages/lina-ui/client/intro-api.ts diff --git a/packages/lina-web/client/intro-app.ts b/packages/lina-ui/client/intro-app.ts similarity index 99% rename from packages/lina-web/client/intro-app.ts rename to packages/lina-ui/client/intro-app.ts index 98e3247..9f56ff0 100644 --- a/packages/lina-web/client/intro-app.ts +++ b/packages/lina-ui/client/intro-app.ts @@ -1,3 +1,4 @@ +import { shouldSend } from "../../lina-client/src/preferences.ts"; import { createComposerSizing } from "./composer-size.ts"; import { introRequest, isOnboardingAbort } from "./intro-api.ts"; import { checkIntroConnection } from "./intro-connection.ts"; @@ -29,7 +30,6 @@ import { renderTranscript, } from "./intro-view.ts"; import { createChatAgent } from "./onboarding-navigation.ts"; -import { shouldSend } from "./preferences.ts"; import { element, setText } from "./render.ts"; import { createSettings } from "./settings.ts"; diff --git a/packages/lina-web/client/intro-connection.ts b/packages/lina-ui/client/intro-connection.ts similarity index 100% rename from packages/lina-web/client/intro-connection.ts rename to packages/lina-ui/client/intro-connection.ts diff --git a/packages/lina-web/client/intro-model.ts b/packages/lina-ui/client/intro-model.ts similarity index 100% rename from packages/lina-web/client/intro-model.ts rename to packages/lina-ui/client/intro-model.ts diff --git a/packages/lina-web/client/intro-types.ts b/packages/lina-ui/client/intro-types.ts similarity index 100% rename from packages/lina-web/client/intro-types.ts rename to packages/lina-ui/client/intro-types.ts diff --git a/packages/lina-web/client/intro-view.ts b/packages/lina-ui/client/intro-view.ts similarity index 100% rename from packages/lina-web/client/intro-view.ts rename to packages/lina-ui/client/intro-view.ts diff --git a/packages/lina-web/client/intro.css b/packages/lina-ui/client/intro.css similarity index 72% rename from packages/lina-web/client/intro.css rename to packages/lina-ui/client/intro.css index 8395caf..0193a4e 100644 --- a/packages/lina-web/client/intro.css +++ b/packages/lina-ui/client/intro.css @@ -18,14 +18,11 @@ body:is(.intro-active, .boot-pending) .workspace { .intro-toolbar, .intro-panel, .intro-changes { - width: min(100%, 760px); + width: min(100%, var(--conversation-width)); margin: 0 auto; padding: 16px 24px; box-sizing: border-box; } -.intro-toolbar { - border-bottom: 1px solid var(--line); -} .intro-setup { margin-top: 16px; } @@ -34,7 +31,7 @@ body:is(.intro-active, .boot-pending) .workspace { } .intro-setup button { margin: 8px 8px 0 0; - min-height: 44px; + min-height: 36px; } .intro-kicker { font-size: 13px; @@ -42,7 +39,7 @@ body:is(.intro-active, .boot-pending) .workspace { margin: 0 0 12px; } .intro-progress { - font-size: 12px; + font-size: 13px; color: var(--muted); line-height: 1.7; margin: 12px 0; @@ -53,15 +50,23 @@ body:is(.intro-active, .boot-pending) .workspace { flex-wrap: wrap; } .intro-modes button { - border: 1px solid var(--line-strong); - border-radius: 8px; + border: 0; + border-radius: var(--control-radius); padding: 8px 12px; + min-height: 36px; + line-height: 20px; + font-size: 0.875rem; + background: transparent; + color: var(--muted); } .intro-modes button[aria-pressed="true"] { - border-color: var(--accent); background: var(--selection); color: var(--text); } +.intro-modes button:hover:not(:disabled) { + background: var(--surface-raised); + color: var(--text); +} .intro-summary { margin-top: 16px; font-size: 13px; @@ -100,8 +105,10 @@ body:is(.intro-active, .boot-pending) .workspace { } .intro-lead { - font-size: 17px; + font-size: 16px; + font-weight: 500; margin: 12px 0; + text-wrap: balance; } .intro-share { display: flex; @@ -111,10 +118,17 @@ body:is(.intro-active, .boot-pending) .workspace { font-size: 13px; color: var(--muted); } +.intro-share input { + width: 16px; + height: 16px; + flex-shrink: 0; + margin: 0; + accent-color: var(--accent); +} .intro-choices { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; + grid-template-columns: minmax(0, 1fr); + gap: 4px; } .intro-later { color: var(--muted); @@ -123,10 +137,10 @@ body:is(.intro-active, .boot-pending) .workspace { word-break: keep-all; } .template-dialog { - max-width: 620px; + width: min(620px, calc(100vw - 24px)); } .template-content { - padding: 24px; + padding: 8px 24px 24px; overflow-y: auto; } .template-description { @@ -136,33 +150,38 @@ body:is(.intro-active, .boot-pending) .workspace { } .template-list { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; + grid-template-columns: minmax(0, 1fr); + gap: 4px; margin-top: 16px; } .template-choice { display: flex; flex-direction: column; - gap: 8px; - padding: 16px; - min-height: 76px; + gap: 4px; + padding: 12px; + min-height: 60px; text-align: left; color: var(--text); - background: var(--surface-raised); - border: 1px solid var(--line-strong); - border-radius: 10px; + background: transparent; + border: 0; + border-radius: var(--control-radius); + font-size: 0.875rem; + line-height: 1.6; cursor: pointer; } .template-choice span { color: var(--muted); font-size: 13px; + word-break: keep-all; + overflow-wrap: anywhere; + text-wrap: balance; } .template-choice strong { word-break: keep-all; overflow-wrap: anywhere; } -.template-choice:hover { - border-color: var(--accent); +.template-choice:hover:not(:disabled) { + background: var(--selection); } .template-choice:disabled { opacity: 0.6; @@ -171,24 +190,39 @@ body:is(.intro-active, .boot-pending) .workspace { .intro-choice { display: flex; flex-direction: column; - gap: 8px; + gap: 4px; text-align: left; min-width: 0; - padding: 16px; - border: 1px solid var(--line-strong); - border-radius: 10px; - background: var(--surface-raised); + padding: 12px; + border: 0; + border-radius: var(--control-radius); + background: transparent; color: var(--text); + font-size: 0.875rem; + line-height: 1.6; cursor: pointer; } -.intro-choice:hover { - border-color: var(--accent); +.intro-choice:hover:not(:disabled) { + background: var(--selection); +} +.intro-choice:disabled { + opacity: 0.55; +} +.intro-choice strong, +.template-choice strong { + font-weight: 500; +} +.intro-choice strong { + word-break: keep-all; + overflow-wrap: anywhere; } .intro-choice small { color: var(--muted); line-height: 1.5; word-break: keep-all; overflow-wrap: anywhere; + font-size: 13px; + text-wrap: balance; } .intro-legacy { margin: 14px 0; @@ -226,6 +260,11 @@ body:is(.intro-active, .boot-pending) .workspace { width: 100%; } @media (max-width: 767px) { + .intro-setup button, + .intro-modes button, + .intro-share { + min-height: 44px; + } .intro-toolbar > a, .intro-panel > a { display: inline-flex; @@ -242,13 +281,11 @@ body:is(.intro-active, .boot-pending) .workspace { } .intro-toolbar, .intro-panel, - .intro-changes { + .intro-changes, + .template-content { padding-left: 16px; padding-right: 16px; } - .intro-choices { - grid-template-columns: 1fr; - } .intro-review { grid-template-columns: 1fr; gap: 4px; @@ -256,9 +293,6 @@ body:is(.intro-active, .boot-pending) .workspace { .intro-review dd { margin-bottom: 12px; } - .intro-entry-link { - font-size: 11px; - } .intro-active .connection-status { display: none; } diff --git a/packages/lina-web/client/markdown-inline.ts b/packages/lina-ui/client/markdown-inline.ts similarity index 100% rename from packages/lina-web/client/markdown-inline.ts rename to packages/lina-ui/client/markdown-inline.ts diff --git a/packages/lina-web/client/markdown-parser.ts b/packages/lina-ui/client/markdown-parser.ts similarity index 100% rename from packages/lina-web/client/markdown-parser.ts rename to packages/lina-ui/client/markdown-parser.ts diff --git a/packages/lina-web/client/markdown-types.ts b/packages/lina-ui/client/markdown-types.ts similarity index 100% rename from packages/lina-web/client/markdown-types.ts rename to packages/lina-ui/client/markdown-types.ts diff --git a/packages/lina-web/client/markdown.css b/packages/lina-ui/client/markdown.css similarity index 100% rename from packages/lina-web/client/markdown.css rename to packages/lina-ui/client/markdown.css diff --git a/packages/lina-web/client/markdown.ts b/packages/lina-ui/client/markdown.ts similarity index 100% rename from packages/lina-web/client/markdown.ts rename to packages/lina-ui/client/markdown.ts diff --git a/packages/lina-web/client/mind-view.ts b/packages/lina-ui/client/mind-view.ts similarity index 100% rename from packages/lina-web/client/mind-view.ts rename to packages/lina-ui/client/mind-view.ts diff --git a/packages/lina-ui/client/model-combobox-types.ts b/packages/lina-ui/client/model-combobox-types.ts new file mode 100644 index 0000000..053bdc9 --- /dev/null +++ b/packages/lina-ui/client/model-combobox-types.ts @@ -0,0 +1,26 @@ +import type { SettingsDocument, SettingsNode } from "./settings-dom.ts"; + +export interface ModelChoice { + value: string; + label: string; + search?: string; + inherited?: boolean; +} +export interface ModelComboboxAdapter { + root: SettingsNode; + input: SettingsNode; + close(): void; + set( + items: ModelChoice[], + value: string, + label: string, + disabled?: boolean, + ): void; + disable(disabled: boolean): void; +} +export type ModelComboboxFactory = ( + doc: SettingsDocument, + id: string, + label: string, + change: (value: string) => void, +) => ModelComboboxAdapter; diff --git a/packages/lina-ui/client/model-combobox.ts b/packages/lina-ui/client/model-combobox.ts new file mode 100644 index 0000000..49b9d59 --- /dev/null +++ b/packages/lina-ui/client/model-combobox.ts @@ -0,0 +1,40 @@ +import { createElement, createRef } from "react"; +import { flushSync } from "react-dom"; +import { + ModelCombobox, + type ModelComboboxHandle, +} from "./components/model-combobox.tsx"; +import { mountView } from "./components/mount.ts"; +import type { ModelComboboxAdapter } from "./model-combobox-types.ts"; +import type { SettingsDocument, SettingsNode } from "./settings-dom.ts"; + +/** Browser boundary: controller tests inject a factory instead of emulating React's DOM. */ +export function createModelCombobox( + doc: SettingsDocument, + id: string, + label: string, + change: (value: string) => void, +): ModelComboboxAdapter { + const root = doc.createElement("div"); + root.className = "model-combobox"; + const ref = createRef(); + // SettingsDocument is structural; this production adapter requires the real DOM. + const view = mountView(root as unknown as HTMLElement); + view.render( + createElement(ModelCombobox, { id, label, onChange: change, ref }), + ); + const handle = () => { + if (!ref.current) throw Error("Model combobox is not mounted"); + return ref.current; + }; + const input = handle().input; + if (!input) throw Error("Model combobox input is not mounted"); + return { + root, + input: input as unknown as SettingsNode, + close: () => flushSync(() => handle().close()), + set: (items, value, label, disabled = false) => + flushSync(() => handle().set({ items, value, label, disabled })), + disable: (disabled) => flushSync(() => handle().disable(disabled)), + }; +} diff --git a/packages/lina-web/client/model-settings.ts b/packages/lina-ui/client/model-settings.ts similarity index 89% rename from packages/lina-web/client/model-settings.ts rename to packages/lina-ui/client/model-settings.ts index 61af7c5..1159883 100644 --- a/packages/lina-web/client/model-settings.ts +++ b/packages/lina-ui/client/model-settings.ts @@ -11,51 +11,17 @@ import type { } from "../../lina-runtime/src/models/types.ts"; import { MODEL_ROLES } from "../../lina-runtime/src/models/types.ts"; import { agentRequest, type RequestFn } from "./agent-editor.ts"; -import { createModelCombobox, type ModelChoice } from "./model-combobox.ts"; +import type { + ModelChoice, + ModelComboboxFactory, +} from "./model-combobox-types.ts"; +import type { SettingsDocument, SettingsNode } from "./settings-dom.ts"; + +// Existing task and hub controllers consume these structural DOM contracts. +export type { SettingsDocument, SettingsNode } from "./settings-dom.ts"; export { MODEL_ROLES }; -/** The browser DOM and the structural test fixture share this small surface. */ -export interface SettingsNode { - id: string; - className: string; - type: string; - min: string; - max: string; - step: string; - value: string; - checked?: boolean; - disabled: boolean; - textContent: string | null; - append(...nodes: SettingsNode[]): void; - replaceChildren(...nodes: SettingsNode[]): void; - before(...nodes: SettingsNode[]): void; - after(...nodes: SettingsNode[]): void; - querySelectorAll(selector: string): Iterable; - hidden: boolean; - setAttribute(name: string, value: string): void; - removeAttribute(name: string): void; - contains(node: unknown): boolean; - select?(): void; - scrollIntoView?(options?: { block: "nearest" }): void; - addEventListener( - type: string, - listener: (event: { - key?: string; - relatedTarget?: unknown; - preventDefault(): void; - stopPropagation(): void; - }) => unknown, - ): void; - checkValidity(): boolean; - reportValidity(): boolean; - focus(): void; -} -export interface SettingsDocument { - location: { href: string }; - getElementById(id: string): SettingsNode | null; - createElement(tag: string): SettingsNode; -} function browserDocument(): SettingsDocument { const doc = (globalThis as { document?: SettingsDocument }).document; if (!doc) throw Error("Model settings require a document"); @@ -82,6 +48,7 @@ function profileLabel(p: ModelProfile, catalog: CatalogModel[]) { export function installModelSettings( dialog: { open: boolean }, + combobox: ModelComboboxFactory, doc: SettingsDocument = browserDocument(), request: RequestFn = agentRequest, ) { @@ -109,7 +76,7 @@ export function installModelSettings( loading = false, testing = false; let trialId = ""; - const trialCombo = createModelCombobox( + const trialCombo = combobox( doc, "model-trial", "연결 테스트 모델", @@ -155,7 +122,7 @@ export function installModelSettings( const rows = new Map< RowRole, { - combo: ReturnType; + combo: ReturnType; reason: SettingsNode; hint: SettingsNode; } @@ -246,43 +213,38 @@ export function installModelSettings( const title = doc.createElement("label"); title.textContent = label; title.setAttribute("for", `model-${role}-input`); - const combo = createModelCombobox( - doc, - `model-${role}`, - `${label} 모델`, - (value) => { - if (loading || !model.draft) return; - if (!value) { - const draft = model.draft; - const bound = - role === "default" - ? draft.defaultProfileId - : scope.value - ? draft.agentRoles[scope.value]?.[role] - : draft.roles[role]; - if (!bound) return; - model.edit((s) => bind(s, role, "")); - changed(); - return; - } - const item = model.snapshot?.catalog.find( - (m) => - m.authenticated && keyOf(m) === value && modelSupportsRole(m, role), - ); - if (!item) return; - model.edit((s) => { - const previous = getProfile(s, role); - const p = ensureProfile( - s, - item, - role === "default" ? (previous?.reasoning ?? "low") : "low", - previous, - ); - bind(s, role, p.id); - }); + const combo = combobox(doc, `model-${role}`, `${label} 모델`, (value) => { + if (loading || !model.draft) return; + if (!value) { + const draft = model.draft; + const bound = + role === "default" + ? draft.defaultProfileId + : scope.value + ? draft.agentRoles[scope.value]?.[role] + : draft.roles[role]; + if (!bound) return; + model.edit((s) => bind(s, role, "")); changed(); - }, - ); + return; + } + const item = model.snapshot?.catalog.find( + (m) => + m.authenticated && keyOf(m) === value && modelSupportsRole(m, role), + ); + if (!item) return; + model.edit((s) => { + const previous = getProfile(s, role); + const p = ensureProfile( + s, + item, + role === "default" ? (previous?.reasoning ?? "low") : "low", + previous, + ); + bind(s, role, p.id); + }); + changed(); + }); const reason = doc.createElement("select"); reason.id = `model-${role}-reasoning`; reason.setAttribute("aria-label", `${label} 추론 수준`); diff --git a/packages/lina-ui/client/navigation.css b/packages/lina-ui/client/navigation.css new file mode 100644 index 0000000..11540f1 --- /dev/null +++ b/packages/lina-ui/client/navigation.css @@ -0,0 +1,228 @@ +.workspace { + grid-template-rows: minmax(0, 1fr); +} +.sidebar { + min-height: 0; +} +.list-switch { + display: flex; + align-items: center; + gap: 4px; + padding: 8px 8px 12px; + border-bottom: 1px solid var(--line); +} +.list-switch button { + min-height: var(--control-size); + padding: 6px 10px; + border: 0; + border-radius: 8px; + background: transparent; + color: var(--muted); +} +.list-switch button[aria-pressed="true"] { + color: var(--text); + background: var(--selection); +} +/* Layout controls belong to the task list, with visible action names. */ +.task-list-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + margin: 4px 8px 8px; +} +.task-list-toolbar #task-reload { + margin: 0 0 0 auto; + padding: 6px 8px; +} +.task-list-toolbar .ui-button { + font-weight: 400; + color: var(--muted); +} +.task-list-toolbar .ui-button:hover, +.task-list-toolbar .ui-button[aria-pressed="true"] { + color: var(--text); +} +.task-column { + position: relative; + width: 280px; + min-width: 0; + background: var(--surface-sidebar); + border-right: 1px solid var(--line); + overflow-y: auto; +} +.task-column .tasks-heading { + min-height: 56px; + padding: 8px 12px; +} +.task-column .tasks-heading .section-label { + font-size: var(--font-ui); + font-weight: 500; + color: var(--text); +} +.mobile-navigation { + display: none; +} +html[data-layout="dual"] .workspace { + grid-template-columns: var(--sidebar-width) 280px minmax(0, 1fr); +} +html[data-layout="single"] #task-pane { + flex: 1; +} +#task-pane { + min-width: 0; +} +.sidebar-content { + min-height: 0; +} +[hidden] { + display: none !important; +} +@media (min-width: 768px) { + #close-sidebar { + display: none; + } + html[data-sidebar-collapsed="true"] .list-switch { + flex-direction: column; + padding: 4px; + } + html[data-sidebar-collapsed="true"] .sidebar .task-list-toolbar { + display: none; + } + html[data-sidebar-collapsed="true"] .agent-filter-field { + display: none; + } +} +@media (max-width: 767px) { + .workspace { + display: block; + height: var(--visible-height, 100dvh); + padding-bottom: calc(60px + env(safe-area-inset-bottom)); + } + .sidebar, + html[data-sidebar-collapsed="true"] .sidebar { + display: flex; + width: 100%; + height: 100%; + border: 0; + } + .sidebar .sidebar-label, + html[data-sidebar-collapsed="true"] .sidebar-label { + display: initial; + } + .sidebar-content { + overflow-y: auto; + flex: 1; + } + .sidebar .account-area, + #collapse-sidebar, + #close-sidebar, + #sidebar-resizer, + .sidebar-search, + .list-switch { + display: none; + } + .sidebar-top { + min-height: 56px; + padding-top: env(safe-area-inset-top); + } + .main { + height: 100%; + } + html[data-screen="agents"] .main, + html[data-screen="tasks"] .main, + html[data-screen="settings"] .main { + display: none; + } + html[data-screen="conversation"] .sidebar { + display: none; + } + html[data-screen="conversation"] .workspace { + padding-bottom: 0; + } + #open-sidebar { + display: inline-flex; + } + .mobile-navigation { + position: fixed; + bottom: 0; + inset-inline: 0; + display: flex; + padding: 4px 8px calc(4px + env(safe-area-inset-bottom)); + min-height: 60px; + background: var(--surface-sidebar); + border-top: 1px solid var(--line); + } + .mobile-navigation button { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 4px; + min-height: 52px; + border: 0; + background: transparent; + color: var(--muted); + font: inherit; + font-size: var(--font-caption); + border-radius: var(--control-radius); + } + .mobile-navigation button[aria-pressed="true"] { + color: var(--text); + background: transparent; + font-weight: 600; + } + html[data-screen="conversation"] .mobile-navigation, + .intro-active .mobile-navigation, + .boot-pending .mobile-navigation { + display: none; + } + .settings-dialog, + .task-dialog, + .search-dialog { + width: 100%; + max-width: 100%; + height: var(--visible-height, 100dvh); + max-height: var(--visible-height, 100dvh); + margin: 0; + border-radius: 0; + } +} +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + animation-duration: 0s !important; + transition-duration: 0s !important; + } +} + +.intro-active #composer-model { + display: none; +} +@media (max-width: 767px) { + .intro-active .workspace { + padding-bottom: 0; + } +} +html[data-layout="dual"][data-sidebar-collapsed="true"] .workspace { + grid-template-columns: 76px 280px minmax(0, 1fr); +} + +#mobile-search { + display: none; +} +@media (max-width: 767px) { + #mobile-search { + display: inline-grid; + margin-left: auto; + } + #current-agent-settings { + margin-left: 0; + } +} +.intro-active #mobile-search { + display: none; +} diff --git a/packages/lina-ui/client/navigation.ts b/packages/lina-ui/client/navigation.ts new file mode 100644 index 0000000..4cc2af8 --- /dev/null +++ b/packages/lina-ui/client/navigation.ts @@ -0,0 +1,308 @@ +import { createElement } from "react"; +import type { ChatModel } from "../../lina-client/src/model.ts"; +import { + type NavigationState, + navigationLayout, + navigationUrl, + parseNavigation, + type Screen, +} from "../../lina-client/src/navigation-state.ts"; +import { createActionMenu } from "./components/action-menu.tsx"; +import { KeyboardIcon, SettingsIcon } from "./components/icons.tsx"; +import { mountView } from "./components/mount.ts"; +import { TaskLayoutControl } from "./components/task-layout-control.tsx"; +import { element, setText } from "./render.ts"; +import type { createSettings } from "./settings.ts"; +import { installSidebarResize } from "./sidebar-resize.ts"; + +export function createNavigation( + settings: ReturnType, + openSearch: (opener: HTMLElement) => void, + options: { + activate: (agentId: string) => boolean; + preserve: () => boolean; + showTasks: () => void; + openTask: (id: string) => void; + closeTask: () => void; + changed: () => void; + cancelSelection: () => void; + }, +) { + installSidebarResize(settings); + const sidebar = element("sidebar", HTMLElement), + workspace = sidebar.parentElement; + if (!workspace) throw Error("Missing workspace"); + const open = element("open-sidebar", HTMLButtonElement), + collapse = element("collapse-sidebar", HTMLButtonElement); + const account = element("account-button", HTMLButtonElement), + search = element("open-search", HTMLButtonElement), + shortcuts = element("shortcuts-dialog", HTMLDialogElement); + const mobile = matchMedia("(max-width: 767px)"), + mac = /Mac|iPhone|iPad/.test(navigator.platform), + modifier = mac ? "⌘" : "Ctrl"; + setText(element("search-shortcut", HTMLElement), `${modifier} K`); + setText(element("modifier-send-label", HTMLElement), `${modifier} + Enter`); + for (const label of shortcuts.querySelectorAll( + "[data-shortcut]", + )) + setText(label, `${modifier} ${label.dataset["shortcut"]?.toUpperCase()}`); + const closeMenu = () => accountMenu.close(); + let state = parseNavigation(location.href); + let previousScreen: Screen = + state.screen === "settings" ? "agents" : state.screen; + let extraTasks = false; + try { + extraTasks = localStorage.getItem("lina.tasks-column.v1") === "true"; + } catch { + /* Storage is optional. */ + } + const agentPane = element("agent-pane", HTMLElement); + const taskPane = element("task-pane", HTMLElement); + const column = element("task-column", HTMLElement); + const layoutHost = element("task-layout-control", HTMLElement); + const layoutView = mountView(layoutHost); + const content = element("sidebar-content", HTMLDivElement); + const root = document.documentElement; + const apply = () => { + const available = + navigationLayout( + window.innerWidth, + true, + sidebar.getBoundingClientRect().width, + ) === "dual"; + const layout = navigationLayout( + window.innerWidth, + extraTasks, + sidebar.getBoundingClientRect().width, + ); + root.dataset["layout"] = layout; + root.dataset["screen"] = state.screen; + root.dataset["list"] = state.screen === "tasks" ? "tasks" : "agents"; + column.hidden = layout !== "dual"; + const parent = layout === "dual" ? column : content; + if (taskPane.parentElement !== parent) parent.append(taskPane); + agentPane.hidden = layout !== "dual" && state.screen === "tasks"; + taskPane.hidden = layout !== "dual" && state.screen !== "tasks"; + for (const button of document.querySelectorAll( + "[data-screen]", + )) + button.setAttribute( + "aria-pressed", + String( + button.dataset["screen"] === + (state.screen === "conversation" ? "agents" : state.screen), + ), + ); + layoutHost.hidden = !available; + layoutView.render( + createElement(TaskLayoutControl, { + active: layout === "dual", + onToggle: toggleTasks, + }), + ); + }; + function toggleTasks() { + extraTasks = !extraTasks; + try { + localStorage.setItem("lina.tasks-column.v1", String(extraTasks)); + } catch { + /* The current view still works when storage is unavailable. */ + } + apply(); + if (extraTasks) options.showTasks(); + // Moving the pane must not lose keyboard focus. If the task pane closes, + // return to the selected list tab rather than an invisible control. + const target = taskPane.hidden + ? document.querySelector( + '.list-switch [aria-pressed="true"]', + ) + : layoutHost.querySelector("button"); + target?.focus({ preventScroll: true }); + } + const go = (next: NavigationState, replace = false) => { + options.cancelSelection(); + if (!options.preserve() || !options.activate(next.agentId)) { + history.replaceState(state, "", navigationUrl(state)); + return false; + } + closeMenu(); + if (next.screen !== "settings") previousScreen = next.screen; + const taskChanged = state.taskId !== next.taskId; + state = next; + if (next.screen !== "settings") + element("settings-dialog", HTMLDialogElement).close(); + history[replace ? "replaceState" : "pushState"]( + state, + "", + navigationUrl(state), + ); + apply(); + options.changed(); + if (taskChanged) { + if (state.taskId) options.openTask(state.taskId); + else options.closeTask(); + } + if (state.screen === "tasks") options.showTasks(); + if (state.screen === "settings") + settings.open(element("mobile-settings", HTMLButtonElement)); + return true; + }; + const closeDrawer = () => closeMenu(); + const opener = () => (mobile.matches ? open : account); + const prepare = () => { + options.cancelSelection(); + const target = opener(); + closeMenu(); + closeDrawer(); + return target; + }; + const openSettings = () => { + const target = prepare(); + shortcuts.close(); + settings.open(target); + }; + const showSearch = () => { + const target = mobile.matches + ? element("mobile-search", HTMLButtonElement) + : search; + prepare(); + shortcuts.close(); + element("settings-dialog", HTMLDialogElement).close(); + openSearch(target); + }; + const accountMenu = createActionMenu({ + id: "account-menu", + label: "내 설정 메뉴", + side: "top", + items: [ + { + id: "open-settings", + label: "설정", + icon: createElement(SettingsIcon), + shortcut: `${modifier} ,`, + run: openSettings, + }, + { + id: "open-shortcuts", + label: "키보드 단축키", + icon: createElement(KeyboardIcon), + run: () => { + const target = prepare(); + shortcuts.showModal(); + shortcuts.addEventListener("close", () => target.focus(), { + once: true, + }); + }, + }, + ], + }); + accountMenu.bindTrigger(account); + for (const button of shortcuts.querySelectorAll("[data-close]")) + button.addEventListener("click", () => shortcuts.close()); + shortcuts.addEventListener("click", (event) => { + if (event.target === shortcuts) { + const r = shortcuts.getBoundingClientRect(); + if ( + event.clientX < r.left || + event.clientX > r.right || + event.clientY < r.top || + event.clientY > r.bottom + ) + shortcuts.close(); + } + }); + search.addEventListener("click", showSearch); + element("mobile-search", HTMLButtonElement).addEventListener( + "click", + showSearch, + ); + open.addEventListener("click", () => { + if (go({ agentId: state.agentId, screen: "agents" })) + element("agent-filter", HTMLInputElement).blur(); + }); + for (const button of document.querySelectorAll( + "[data-screen]", + )) + button.addEventListener("click", () => + go({ + agentId: state.agentId, + screen: button.dataset["screen"] as Screen, + }), + ); + window.addEventListener("popstate", () => + go(parseNavigation(location.href), true), + ); + window.addEventListener("resize", apply); + new ResizeObserver(apply).observe(sidebar); + element("settings-dialog", HTMLDialogElement).addEventListener( + "close", + () => { + if (state.screen === "settings") + go({ ...state, screen: previousScreen }, true); + }, + ); + history.replaceState(state, "", navigationUrl(state)); + apply(); + const updateCollapse = () => { + collapse.setAttribute( + "aria-expanded", + String(!settings.preferences.sidebarCollapsed), + ); + collapse.setAttribute( + "aria-label", + settings.preferences.sidebarCollapsed + ? "사이드바 펼치기" + : "사이드바 접기", + ); + collapse.title = collapse.getAttribute("aria-label") ?? ""; + }; + collapse.addEventListener("click", () => { + settings.update({ + sidebarCollapsed: !settings.preferences.sidebarCollapsed, + }); + updateCollapse(); + }); + updateCollapse(); + document.addEventListener("keydown", (event) => { + if (event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) + return; + if (event.key.toLowerCase() === "k" || event.code === "KeyK") { + event.preventDefault(); + showSearch(); + } + if (event.key === ",") { + event.preventDefault(); + element("search-dialog", HTMLDialogElement).close(); + openSettings(); + } + }); + const render = (_model: ChatModel) => {}; + return Object.assign(render, { + navigate(agentId: string) { + return go({ agentId, screen: "conversation" }); + }, + taskOpened(id: string) { + options.cancelSelection(); + if (state.taskId === id) return; + state = { agentId: state.agentId, screen: "tasks", taskId: id }; + history.pushState(state, "", navigationUrl(state)); + apply(); + }, + taskClosed() { + if (state.taskId) { + state = { agentId: state.agentId, screen: "tasks" }; + history.replaceState(state, "", navigationUrl(state)); + } + apply(); + }, + get state() { + return state; + }, + start() { + if (state.taskId) options.openTask(state.taskId); + if (state.screen === "tasks") options.showTasks(); + if (state.screen === "settings") + settings.open(element("mobile-settings", HTMLButtonElement)); + }, + }); +} diff --git a/packages/lina-web/client/onboarding-api.ts b/packages/lina-ui/client/onboarding-api.ts similarity index 100% rename from packages/lina-web/client/onboarding-api.ts rename to packages/lina-ui/client/onboarding-api.ts diff --git a/packages/lina-web/client/onboarding-model.ts b/packages/lina-ui/client/onboarding-model.ts similarity index 100% rename from packages/lina-web/client/onboarding-model.ts rename to packages/lina-ui/client/onboarding-model.ts diff --git a/packages/lina-web/client/onboarding-navigation.ts b/packages/lina-ui/client/onboarding-navigation.ts similarity index 100% rename from packages/lina-web/client/onboarding-navigation.ts rename to packages/lina-ui/client/onboarding-navigation.ts diff --git a/packages/lina-web/client/onboarding-types.ts b/packages/lina-ui/client/onboarding-types.ts similarity index 100% rename from packages/lina-web/client/onboarding-types.ts rename to packages/lina-ui/client/onboarding-types.ts diff --git a/packages/lina-web/client/onboarding.css b/packages/lina-ui/client/onboarding.css similarity index 61% rename from packages/lina-web/client/onboarding.css rename to packages/lina-ui/client/onboarding.css index 177e58e..2c801a4 100644 --- a/packages/lina-web/client/onboarding.css +++ b/packages/lina-ui/client/onboarding.css @@ -10,10 +10,14 @@ display: none; } .onboarding-dialog .dialog-header { - align-items: flex-start; + align-items: center; + flex-wrap: wrap; +} +.onboarding-dialog .dialog-header > div:first-child { + min-width: 0; } .onboarding-kicker { - font-size: 0.72rem; + font-size: 0.8125rem; color: var(--muted); margin-bottom: 4px; text-wrap: balance; @@ -23,22 +27,24 @@ align-items: center; gap: 8px; flex-shrink: 0; + margin-left: auto; } .onboarding-save-state { - font-size: 0.75rem; + font-size: 0.8125rem; color: var(--muted); white-space: nowrap; } .onboarding-progress { - padding: 10px 32px 0; - font-size: 0.82rem; + padding: 8px 24px 0; + font-size: 0.875rem; color: var(--muted); text-wrap: balance; } .onboarding-body { - padding: 24px 32px 12px; + padding: 20px 24px 12px; overflow-y: auto; - min-height: 280px; + overscroll-behavior: contain; + min-height: 0; display: flex; flex-direction: column; gap: 16px; @@ -48,38 +54,46 @@ .onboarding-question, .onboarding-progress-copy { line-height: 1.7; - text-wrap: pretty; + text-wrap: balance; + overflow-wrap: anywhere; max-width: 42rem; } .onboarding-disclaimer { color: var(--muted); - font-size: 0.85rem; + font-size: 0.875rem; } .onboarding-stale { color: var(--warning); - font-size: 0.85rem; + font-size: 0.875rem; line-height: 1.7; } .onboarding-field { display: flex; flex-direction: column; gap: 6px; - font-size: 0.85rem; + font-size: 0.875rem; } .onboarding-field textarea, .onboarding-field input { background: var(--input-bg); color: var(--text); border: 1px solid var(--input-border); - border-radius: 7px; - padding: 10px; + border-radius: var(--control-radius); + padding: 7px 11px; width: 100%; font: inherit; - min-height: 44px; + min-height: 36px; + line-height: 20px; } .onboarding-field textarea { min-height: 4.5rem; resize: vertical; + padding: 10px 12px; + line-height: 1.6; +} +.onboarding-field :is(input, textarea):focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; } .onboarding-review { list-style: none; @@ -94,7 +108,7 @@ flex-direction: column; gap: 4px; padding-bottom: 12px; - border-bottom: 1px solid var(--line); + overflow-wrap: anywhere; } .onboarding-blank { color: var(--muted); @@ -105,7 +119,7 @@ gap: 10px; } .onboarding-section h3 { - font-size: 0.9rem; + font-size: 0.875rem; } .onboarding-agent-row, .onboarding-scene { @@ -118,29 +132,41 @@ display: flex; align-items: center; gap: 8px; - min-height: 44px; - font-size: 0.85rem; + min-height: 36px; + font-size: 0.875rem; +} +.onboarding-share input { + width: 16px; + height: 16px; + margin: 0; + flex-shrink: 0; + accent-color: var(--accent); } .onboarding-choice { text-align: left; - background: var(--surface-raised); + background: transparent; color: var(--text); - border: 1px solid var(--line-strong); - border-radius: 12px; - padding: 16px 18px; - min-height: 72px; + border: 0; + border-radius: var(--control-radius); + padding: 12px; + min-height: 60px; + font-size: 0.875rem; display: flex; flex-direction: column; gap: 6px; } .onboarding-choice small { color: var(--muted); - font-size: 0.8rem; + font-size: 0.8125rem; text-wrap: balance; } -.onboarding-choice:hover { +.onboarding-choice:hover:not(:disabled) { background: var(--selection); } +.onboarding-choice:disabled, +.onboarding-chapter:disabled { + opacity: 0.55; +} .onboarding-chapters { display: flex; gap: 8px; @@ -148,23 +174,29 @@ padding-bottom: 4px; } .onboarding-chapter { - border: 1px solid var(--line); - background: var(--surface-raised); - color: var(--text); - border-radius: 999px; + border: 0; + background: transparent; + color: var(--muted); + border-radius: var(--control-radius); padding: 8px 12px; - min-height: 44px; + min-height: 36px; + font-size: 0.875rem; display: flex; flex-direction: column; align-items: flex-start; white-space: nowrap; } .onboarding-chapter[aria-current="true"] { - border-color: var(--accent); + background: var(--selection); + color: var(--text); +} +.onboarding-chapter:hover:not(:disabled) { + background: var(--surface-raised); + color: var(--text); } .onboarding-chapter small { color: var(--muted); - font-size: 0.7rem; + font-size: 0.8125rem; } .onboarding-answers { margin: 0; @@ -175,21 +207,34 @@ } .onboarding-proposal { margin: 0; - padding: 14px 16px; - border-left: 3px solid var(--accent); - background: var(--surface-raised); - border-radius: 0 8px 8px 0; + padding: 12px 0; + line-height: 1.7; + overflow-wrap: anywhere; } .onboarding-footer { display: flex; justify-content: space-between; + align-items: center; + flex-wrap: wrap; gap: 12px; - padding: 16px 32px 20px; - border-top: 1px solid var(--line); + padding: 12px 24px 20px; + flex-shrink: 0; position: sticky; bottom: 0; background: var(--surface-main); } +#onboarding-primary { + margin-left: auto; + background: var(--button-bg); + color: var(--button-text); +} +#onboarding-primary:hover:not(:disabled) { + background: var(--button-hover); +} +#onboarding-status { + margin: 0; + padding: 8px 24px; +} .onboarding-transcript { display: flex; flex-direction: column; @@ -200,8 +245,9 @@ .onboarding-assistant { margin: 0; padding: 10px 12px; - border-radius: 10px; + border-radius: var(--control-radius); line-height: 1.6; + overflow-wrap: anywhere; } .onboarding-user { background: var(--selection); @@ -209,29 +255,29 @@ max-width: 90%; } .onboarding-assistant { - background: var(--surface-raised); + padding-inline: 0; max-width: 90%; } -@media (max-width: 390px) { - .onboarding-dialog { - width: calc(100vw - 12px); - max-height: calc(100dvh - 12px); - } +@media (max-width: 767px) { .onboarding-body, .onboarding-footer, - .onboarding-progress { + .onboarding-progress, + #onboarding-status { padding-left: 16px; padding-right: 16px; } - .onboarding-footer { - flex-wrap: wrap; - } .onboarding-footer .secondary-button, .onboarding-footer .text-button, .onboarding-choice, - .onboarding-chapter { + .onboarding-chapter, + .onboarding-share, + .onboarding-field input { min-height: 44px; } + .onboarding-field input, + .onboarding-field textarea { + font-size: 1rem; + } } @media (prefers-reduced-motion: reduce) { .onboarding-dialog * { diff --git a/packages/lina-web/client/onboarding.ts b/packages/lina-ui/client/onboarding.ts similarity index 100% rename from packages/lina-web/client/onboarding.ts rename to packages/lina-ui/client/onboarding.ts diff --git a/packages/lina-web/client/presence.ts b/packages/lina-ui/client/presence.ts similarity index 100% rename from packages/lina-web/client/presence.ts rename to packages/lina-ui/client/presence.ts diff --git a/packages/lina-web/client/pwa.css b/packages/lina-ui/client/pwa.css similarity index 63% rename from packages/lina-web/client/pwa.css rename to packages/lina-ui/client/pwa.css index 0e25e9a..62491c8 100644 --- a/packages/lina-web/client/pwa.css +++ b/packages/lina-ui/client/pwa.css @@ -1,14 +1,3 @@ -#attach-file { - background: none; - border: 0; - padding: 8px 0; - font-size: 0.75rem; - color: var(--muted); - white-space: nowrap; -} -#attach-file:disabled { - opacity: 0.55; -} #draft-files, .message-files { display: flex; @@ -16,15 +5,21 @@ gap: 6px; margin: 8px 0; } +#draft-files { + flex-wrap: nowrap; + overflow-x: auto; +} .file-chip { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 8px; - padding: 4px 8px; - border: 1px solid var(--line); - border-radius: 6px; - font-size: 0.75rem; + padding: 4px 10px; + border: 0; + border-radius: var(--control-radius); + background: var(--surface-raised); + font-size: 0.8125rem; + line-height: 20px; max-width: 100%; white-space: normal; } @@ -36,31 +31,60 @@ border: 0; background: transparent; color: var(--muted); - padding: 5px 3px; - font-size: 0.7rem; + padding: 4px; + min-width: 28px; + min-height: 28px; + border-radius: var(--control-radius); + font-size: 0.8125rem; +} +.file-chip button:hover:not(:disabled) { + color: var(--text); + background: var(--selection); +} +#draft-files .file-chip { + flex: 0 0 auto; + flex-wrap: nowrap; +} +#draft-files .file-chip a { + max-width: 160px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .file-preview { max-width: min(640px, calc(100vw - 24px)); width: 100%; max-height: 80dvh; - border: 1px solid var(--line-strong); - border-radius: 12px; - padding: 20px; - color: var(--text); - background: var(--surface-main); + padding: 16px 24px 24px; } -.file-preview::backdrop { - background: #0008; +.file-preview[open] { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 16px; +} +.file-preview > strong { + align-self: center; + font-weight: 500; + font-size: 0.875rem; + overflow-wrap: anywhere; } .file-preview > button { - float: right; background: none; - color: var(--accent); + color: var(--muted); border: 0; - padding: 5px 10px; + border-radius: var(--control-radius); + padding: 8px 12px; + min-height: 36px; + font-size: 0.875rem; +} +.file-preview > button:hover { + color: var(--text); + background: var(--surface-raised); } .file-preview > div { - margin-top: 20px; + grid-column: 1 / -1; + min-width: 0; + min-height: 0; overflow: auto; } .file-preview img { @@ -75,16 +99,13 @@ overflow-wrap: anywhere; } @media (max-width: 767px) { - #attach-file, .file-chip button, - .file-chip a { + .file-chip a, + .file-preview > button { min-height: 44px; display: inline-flex; align-items: center; } - .composer-bottom { - justify-content: space-between; - } .chat-header { gap: 6px; } @@ -94,6 +115,12 @@ .chat-header h1 { font-size: 1rem; } + .file-preview { + padding: 12px 16px 20px; + } + .markdown-copy-button { + min-height: 44px; + } } @media (max-width: 360px) { .connection-status { @@ -108,23 +135,3 @@ flex-wrap: wrap; } } - -#draft-files { - flex-wrap: nowrap; - overflow-x: auto; -} -#draft-files .file-chip { - flex: 0 0 auto; - flex-wrap: nowrap; -} -#draft-files .file-chip a { - max-width: 160px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -@media (max-width: 767px) { - .markdown-copy-button { - min-height: 44px; - } -} diff --git a/packages/lina-web/client/pwa.ts b/packages/lina-ui/client/pwa.ts similarity index 94% rename from packages/lina-web/client/pwa.ts rename to packages/lina-ui/client/pwa.ts index 3980404..e87ba84 100644 --- a/packages/lina-web/client/pwa.ts +++ b/packages/lina-ui/client/pwa.ts @@ -1,9 +1,12 @@ -import type { DraftStore } from "./draft.ts"; +import type { DraftStore } from "../../lina-client/src/draft.ts"; import { element, setText } from "./render.ts"; type InstallEvent = Event & { prompt(): Promise<{ outcome: string }> }; /** Only an explicit update click may reload; activation alone never clears input. */ -export function installPwa(drafts: DraftStore, fullText: () => string): void { +export function installPwa( + draftSource: DraftStore | (() => DraftStore), + fullText: () => string, +): void { const install = element("install-app", HTMLButtonElement), update = element("update-app", HTMLButtonElement), status = element("app-install-status", HTMLParagraphElement), @@ -46,7 +49,14 @@ export function installPwa(drafts: DraftStore, fullText: () => string): void { }); const persist = () => { const text = fullText(); - if (drafts.saveDraft(text) || !text) return true; + if ( + (typeof draftSource === "function" + ? draftSource() + : draftSource + ).saveDraft(text) || + !text + ) + return true; setText(updateStatus, "입력 저장 실패 · 내용 복사 후 새로고침"); return false; }; diff --git a/packages/lina-ui/client/reading-position.ts b/packages/lina-ui/client/reading-position.ts new file mode 100644 index 0000000..bc6b529 --- /dev/null +++ b/packages/lina-ui/client/reading-position.ts @@ -0,0 +1,92 @@ +export type ReadingPosition = { + id: string | null; + offset: number; + bottom: boolean; +}; + +export function captureReadingPosition(): ReadingPosition { + const scroll = document.getElementById("conversation-scroll"); + if (!scroll) return { id: null, offset: 0, bottom: true }; + const top = scroll.getBoundingClientRect().top; + const node = Array.from( + scroll.querySelectorAll("[data-message-id]"), + ).find((item) => item.getBoundingClientRect().bottom > top); + return { + id: node?.dataset["messageId"] ?? null, + offset: node ? node.getBoundingClientRect().top - top : 0, + bottom: + !node || + scroll.scrollHeight - scroll.scrollTop - scroll.clientHeight < 80, + }; +} + +export function restoreReadingPosition(position: ReadingPosition): boolean { + const scroll = document.getElementById("conversation-scroll"); + if (!scroll || !scroll.clientHeight) return false; + if (position.bottom) { + scroll.scrollTop = scroll.scrollHeight; + return true; + } + const node = Array.from( + scroll.querySelectorAll("[data-message-id]"), + ).find((item) => item.dataset["messageId"] === position.id); + if (!node) return false; + scroll.scrollTop += + node.getBoundingClientRect().top - + scroll.getBoundingClientRect().top - + position.offset; + return true; +} + +export function saveReadingPosition( + agentId: string, + sessionId: string, + position: ReadingPosition, +): void { + try { + localStorage.setItem( + `lina.reading.v1.${agentId}`, + JSON.stringify({ sessionId, position }), + ); + } catch { + /* Keep in-memory restoration. */ + } +} +export function loadReadingPosition( + agentId: string, + sessionId: string, +): ReadingPosition | undefined { + try { + const value: unknown = JSON.parse( + localStorage.getItem(`lina.reading.v1.${agentId}`) ?? "null", + ); + if ( + !value || + typeof value !== "object" || + !("sessionId" in value) || + value.sessionId !== sessionId || + !("position" in value) + ) + return; + const position = value.position; + if ( + position && + typeof position === "object" && + "id" in position && + (typeof position.id === "string" || position.id === null) && + "offset" in position && + typeof position.offset === "number" && + Number.isFinite(position.offset) && + "bottom" in position && + typeof position.bottom === "boolean" + ) + return { + id: position.id, + offset: position.offset, + bottom: position.bottom, + }; + } catch { + /* Corrupted optional device state does not block conversation. */ + } + return; +} diff --git a/packages/lina-web/client/recovery.css b/packages/lina-ui/client/recovery.css similarity index 100% rename from packages/lina-web/client/recovery.css rename to packages/lina-ui/client/recovery.css diff --git a/packages/lina-web/client/recovery.ts b/packages/lina-ui/client/recovery.ts similarity index 96% rename from packages/lina-web/client/recovery.ts rename to packages/lina-ui/client/recovery.ts index 8c3136d..a7755be 100644 --- a/packages/lina-web/client/recovery.ts +++ b/packages/lina-ui/client/recovery.ts @@ -1,5 +1,5 @@ -import type { ServerFrame } from "../src/protocol.ts"; -import type { DraftStore, PendingSend } from "./draft.ts"; +import type { DraftStore, PendingSend } from "../../lina-client/src/draft.ts"; +import type { ServerFrame } from "../../lina-client/src/protocol.ts"; import { element } from "./render.ts"; /** Unconfirmed sends stay separate from authoritative server history. */ diff --git a/packages/lina-web/client/render.ts b/packages/lina-ui/client/render.ts similarity index 91% rename from packages/lina-web/client/render.ts rename to packages/lina-ui/client/render.ts index 9a1e655..6446cd4 100644 --- a/packages/lina-web/client/render.ts +++ b/packages/lina-ui/client/render.ts @@ -1,6 +1,10 @@ +import type { + ChatMessage, + ChatModel, + MessageStatus, +} from "../../lina-client/src/model.ts"; import { renderUserBody } from "./attachments.ts"; import { renderMarkdown } from "./markdown.ts"; -import type { ChatMessage, ChatModel, MessageStatus } from "./model.ts"; export function element( id: string, @@ -29,17 +33,25 @@ const STATUS: Record = { }; export function createRenderer( - model: ChatModel, + source: ChatModel | (() => ChatModel), restore: (text: string) => void, expand?: (id: string) => void, sessionId: () => string | undefined = () => undefined, ) { const messages = element("messages", HTMLDivElement); const scroll = element("conversation-scroll", HTMLDivElement); + const getModel = () => (typeof source === "function" ? source() : source); + let bound = getModel(); const nodes = new Map(); const rendered = new WeakMap(); return () => { + const model = getModel(); + if (bound !== model) { + messages.replaceChildren(); + nodes.clear(); + bound = model; + } const follow = scroll.scrollHeight - scroll.scrollTop - scroll.clientHeight < 120; element("welcome", HTMLElement).hidden = model.messages.length > 0; @@ -117,9 +129,10 @@ function messageNode( ): HTMLElement { const article = document.createElement("article"); article.className = `message ${message.role}`; + article.dataset["messageId"] = message.id; article.setAttribute( "aria-label", - message.role === "assistant" ? "Lina" : "나", + message.role === "assistant" ? "에이전트 메시지" : "나", ); const body = document.createElement("div"); body.className = "message-body"; diff --git a/packages/lina-web/client/responsive.css b/packages/lina-ui/client/responsive.css similarity index 80% rename from packages/lina-web/client/responsive.css rename to packages/lina-ui/client/responsive.css index edce18f..4ebb800 100644 --- a/packages/lina-web/client/responsive.css +++ b/packages/lina-ui/client/responsive.css @@ -28,9 +28,12 @@ .main { flex: 1; } + .conversation-scroll { + scrollbar-gutter: auto; + } .chat-header { - min-height: 68px; - padding: 12px 18px; + min-height: 60px; + padding: max(8px, env(safe-area-inset-top)) 8px 8px; } .breadcrumb { display: none; @@ -59,7 +62,7 @@ } .suggestions button { min-height: 44px; - font-size: 0.66rem; + font-size: 0.8125rem; padding: 10px; } .suggestions button span { @@ -68,21 +71,6 @@ .messages { padding: 24px 16px 4px; } - .composer-area { - padding: 8px 16px calc(12px + env(safe-area-inset-bottom)); - } - .composer { - padding: 12px; - } - #composer-hint { - display: none; - } - .composer-bottom { - justify-content: flex-end; - } - #send { - min-height: 44px; - } .text-button { min-height: 44px; } @@ -103,10 +91,6 @@ } @media (max-width: 767px) { - .chat-header { - min-height: 60px; - padding: 10px 16px; - } .message.assistant { max-width: 100%; } diff --git a/packages/lina-web/client/search-view.ts b/packages/lina-ui/client/search-view.ts similarity index 96% rename from packages/lina-web/client/search-view.ts rename to packages/lina-ui/client/search-view.ts index 77812a9..47d1b42 100644 --- a/packages/lina-web/client/search-view.ts +++ b/packages/lina-ui/client/search-view.ts @@ -1,8 +1,11 @@ -import type { ServerFrame } from "../src/protocol.ts"; +import type { ServerFrame } from "../../lina-client/src/protocol.ts"; +import { + type SearchCommand, + SearchModel, +} from "../../lina-client/src/search-model.ts"; import { renderUserBody } from "./attachments.ts"; import { renderMarkdown } from "./markdown.ts"; import { element, setText } from "./render.ts"; -import { type SearchCommand, SearchModel } from "./search-model.ts"; export function createSearch(send: (frame: SearchCommand) => boolean) { const model = new SearchModel(), dialog = element("search-dialog", HTMLDialogElement), diff --git a/packages/lina-web/client/search.css b/packages/lina-ui/client/search.css similarity index 71% rename from packages/lina-web/client/search.css rename to packages/lina-ui/client/search.css index 5656921..811b191 100644 --- a/packages/lina-web/client/search.css +++ b/packages/lina-ui/client/search.css @@ -4,8 +4,8 @@ } .search-form { display: flex; - gap: 10px; - margin: 18px 20px 8px; + gap: 8px; + margin: 8px 24px; } .search-form input { min-width: 0; @@ -13,29 +13,30 @@ background: var(--input-bg); color: var(--text); border: 1px solid var(--input-border); - border-radius: 8px; - padding: 10px 12px; - font-size: 0.9rem; + border-radius: var(--control-radius); + padding: 7px 11px; + min-height: 36px; + line-height: 20px; + font-size: 0.875rem; } .search-form input::placeholder { color: var(--muted); } .search-status { - padding: 8px 20px; + padding: 8px 24px; color: var(--muted); - font-size: 0.8rem; + font-size: 0.8125rem; min-height: 32px; } .search-results { - padding: 0 10px 14px; + padding: 0 12px 16px; } .search-result { display: block; width: 100%; - padding: 14px 12px; + padding: 12px; border: 0; - border-bottom: 1px solid var(--line); - border-radius: 8px; + border-radius: var(--control-radius); background: transparent; color: var(--text); text-align: left; @@ -46,9 +47,9 @@ } .search-result-meta { display: block; - font-size: 0.74rem; + font-size: 0.8125rem; color: var(--muted); - margin-bottom: 7px; + margin-bottom: 4px; } .search-result-text { display: -webkit-box; @@ -57,17 +58,18 @@ overflow: hidden; overflow-wrap: anywhere; line-height: 1.7; - font-size: 0.88rem; + font-size: 0.875rem; white-space: pre-wrap; } .search-pages { display: flex; justify-content: space-between; - border-top: 1px solid var(--line); - padding: 8px 14px; + align-items: center; + gap: 8px; + padding: 8px 24px 16px; } .search-detail { - padding: 0 20px 20px; + padding: 0 24px 24px; } .search-detail article { font-size: var(--chat-text-size, 0.9375rem); @@ -87,6 +89,14 @@ } .search-form input { font-size: 16px; + min-height: 44px; + } + .search-status, + .search-pages { + padding-inline: 16px; + } + .search-results { + padding-inline: 4px; } .search-detail { padding: 0 16px 16px; diff --git a/packages/lina-ui/client/settings-dom.ts b/packages/lina-ui/client/settings-dom.ts new file mode 100644 index 0000000..2521761 --- /dev/null +++ b/packages/lina-ui/client/settings-dom.ts @@ -0,0 +1,41 @@ +/** The browser DOM and the structural test fixture share this small surface. */ +export interface SettingsNode { + id: string; + className: string; + type: string; + min: string; + max: string; + step: string; + value: string; + checked?: boolean; + disabled: boolean; + textContent: string | null; + append(...nodes: SettingsNode[]): void; + replaceChildren(...nodes: SettingsNode[]): void; + before(...nodes: SettingsNode[]): void; + after(...nodes: SettingsNode[]): void; + querySelectorAll(selector: string): Iterable; + hidden: boolean; + setAttribute(name: string, value: string): void; + removeAttribute(name: string): void; + contains(node: unknown): boolean; + select?(): void; + scrollIntoView?(options?: { block: "nearest" }): void; + addEventListener( + type: string, + listener: (event: { + key?: string; + relatedTarget?: unknown; + preventDefault(): void; + stopPropagation(): void; + }) => unknown, + ): void; + checkValidity(): boolean; + reportValidity(): boolean; + focus(): void; +} +export interface SettingsDocument { + location: { href: string }; + getElementById(id: string): SettingsNode | null; + createElement(tag: string): SettingsNode; +} diff --git a/packages/lina-web/client/settings-navigation.css b/packages/lina-ui/client/settings-navigation.css similarity index 64% rename from packages/lina-web/client/settings-navigation.css rename to packages/lina-ui/client/settings-navigation.css index d342a61..eeb8674 100644 --- a/packages/lina-web/client/settings-navigation.css +++ b/packages/lina-ui/client/settings-navigation.css @@ -1,21 +1,20 @@ #settings-dialog { width: min(920px, calc(100vw - 48px)); max-height: calc(100dvh - 48px); - border-radius: 18px; overflow: hidden; } #settings-dialog .dialog-header { position: relative; - padding: 17px 24px; } .settings-heading-copy { display: flex; align-items: baseline; gap: 14px; + min-width: 0; } .settings-heading-copy p { margin: 0; - font-size: 0.76rem; + font-size: 0.8125rem; color: var(--muted); } .settings-workspace { @@ -26,24 +25,24 @@ .settings-navigation { display: flex; flex-direction: column; - gap: 5px; - padding: 20px 12px; + gap: 4px; + padding: 16px 12px; background: var(--surface-sidebar); - border-right: 1px solid var(--line); } .settings-navigation button { display: flex; align-items: center; - gap: 10px; - min-height: 44px; + gap: 8px; + min-height: 36px; border: 0; - border-radius: 8px; + border-radius: var(--control-radius); background: transparent; color: var(--muted); font: inherit; - font-size: 0.84rem; + font-size: 0.875rem; text-align: left; - padding: 10px 12px; + padding: 8px 10px; + line-height: 20px; cursor: pointer; white-space: nowrap; } @@ -54,12 +53,11 @@ .settings-navigation button[aria-selected="true"] { color: var(--text); background: var(--surface-raised); - box-shadow: inset 3px 0 0 var(--accent); - font-weight: 600; + font-weight: 500; } .settings-navigation svg { - width: 18px; - height: 18px; + width: 16px; + height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; @@ -73,7 +71,7 @@ overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; - padding: 28px 30px 24px; + padding: 24px; } .settings-panel { min-width: 0; @@ -82,57 +80,49 @@ display: none; } .settings-page-header { - margin-bottom: 24px; + margin-bottom: 20px; } .settings-page-header h3 { - font-size: 1.2rem; + font-size: 1rem; font-weight: 600; - letter-spacing: -0.025em; - margin: 0 0 7px; + margin: 0 0 8px; text-wrap: balance; } .settings-page-header p { - font-size: 0.82rem; + font-size: 0.875rem; line-height: 1.7; color: var(--muted); margin: 0; text-wrap: balance; } .settings-panel > section { - margin: 0 0 26px; + margin: 0 0 16px; } .settings-panel > section > h3 { - margin: 0 0 3px; - font-size: 0.78rem; + margin: 0 0 4px; + font-size: 0.8125rem; font-weight: 500; color: var(--muted); } -.settings-panel .setting-row { - padding: 15px 0; -} .settings-panel .model-actions { position: sticky; bottom: -24px; background: var(--surface-main); - padding: 14px 0; - border-top: 1px solid var(--line); + padding: 12px 0; + align-items: center; z-index: 1; } -.settings-panel .model-combobox[data-open="true"] { - z-index: 4; -} .settings-panel .model-trial { - margin-top: 22px; + margin-top: 24px; } .settings-connection-link { display: flex; align-items: center; justify-content: space-between; gap: 16px; - border-bottom: 1px solid var(--line); - margin-bottom: 20px; - padding: 0 0 14px; - font-size: 0.8rem; + margin-bottom: 24px; + padding: 0; + font-size: 0.8125rem; color: var(--muted); } .settings-connection-link button { @@ -144,9 +134,12 @@ } @media (max-width: 767px) { #settings-dialog { - width: calc(100vw - 20px); - max-height: calc(100dvh - 24px); - border-radius: 14px; + width: 100%; + max-height: var(--visible-height, 100dvh); + } + #settings-dialog[open] { + display: flex; + flex-direction: column; } #settings-dialog .dialog-header { padding: 12px 16px; @@ -157,71 +150,47 @@ .settings-workspace { display: flex; flex-direction: column; - height: calc(100dvh - 100px); + flex: 1; + min-height: 0; + height: auto; } .settings-navigation { flex-direction: row; - flex-wrap: wrap; - gap: 3px; + flex-wrap: nowrap; + gap: 4px; padding: 8px; - border-right: 0; - border-bottom: 1px solid var(--line); flex-shrink: 0; } .settings-navigation button { - flex: 1 1 0; + flex: 1 1 auto; justify-content: center; - padding: 9px 5px; + min-height: 44px; + padding: 8px; gap: 6px; - font-size: 0.74rem; + font-size: 0.8125rem; min-width: 0; - white-space: normal; + white-space: nowrap; word-break: keep-all; line-height: 1.25; text-align: center; } - .settings-navigation button[aria-selected="true"] { - box-shadow: inset 0 -2px 0 var(--accent); - } - .settings-navigation svg { - width: 16px; - height: 16px; - } .settings-content { - padding: 22px 16px; + padding: 20px 16px; flex: 1; } - .settings-page-header { - margin-bottom: 20px; - } - .settings-page-header h3 { - font-size: 1.08rem; - } .settings-panel .model-actions { - bottom: -22px; + bottom: -20px; } - .settings-panel .setting-row { - gap: 10px; - } -} -@media (max-width: 390px) { - .settings-navigation button { - font-size: 0.7rem; - gap: 4px; - padding: 8px 3px; + .settings-connection-link { + flex-wrap: wrap; + gap: 8px; } } @media (max-width: 360px) { .settings-navigation svg { display: none; } - .settings-navigation button { - font-size: 0.68rem; - } .settings-content { padding-inline: 12px; } - .settings-connection-link { - align-items: flex-start; - } } diff --git a/packages/lina-ui/client/settings-tab-model.ts b/packages/lina-ui/client/settings-tab-model.ts new file mode 100644 index 0000000..f1b9193 --- /dev/null +++ b/packages/lina-ui/client/settings-tab-model.ts @@ -0,0 +1,2 @@ +export const SETTINGS_TABS = ["general", "connections", "models"] as const; +export type SettingsTab = (typeof SETTINGS_TABS)[number]; diff --git a/packages/lina-ui/client/settings-tabs.ts b/packages/lina-ui/client/settings-tabs.ts new file mode 100644 index 0000000..292f3f9 --- /dev/null +++ b/packages/lina-ui/client/settings-tabs.ts @@ -0,0 +1,56 @@ +import { createElement } from "react"; +import { mountView } from "./components/mount.ts"; +import { SettingsTabsView } from "./components/settings-tabs.tsx"; +import { SETTINGS_TABS, type SettingsTab } from "./settings-tab-model.ts"; + +export function installSettingsTabs( + root: HTMLElement, + changed: (tab: SettingsTab) => void, +) { + let current: SettingsTab = "general"; + const navigation = root.querySelector(".settings-navigation"); + if (!navigation) throw Error("Missing settings navigation"); + const panels = SETTINGS_TABS.map((id) => { + const panel = root.querySelector(`#settings-panel-${id}`); + if (!panel) throw Error("Missing settings panel"); + panel.hidden = id !== current; + return { id, panel }; + }); + const label = navigation.getAttribute("aria-label") ?? "설정 유형"; + // The host stays controller-owned; the single tablist is rendered inside it. + navigation.removeAttribute("role"); + navigation.removeAttribute("aria-label"); + navigation.removeAttribute("aria-orientation"); + const view = mountView(navigation); + const mobile = window.matchMedia("(max-width: 767px)"); + const render = () => + view.render( + createElement(SettingsTabsView, { + value: current, + orientation: mobile.matches ? "horizontal" : "vertical", + label, + select, + }), + ); + const select = (id: SettingsTab, focus = false) => { + if (id !== current) + root + .querySelector(".settings-content") + ?.scrollTo({ top: 0 }); + current = id; + // Content panels remain owned by the existing settings controllers. + for (const item of panels) item.panel.hidden = item.id !== id; + render(); + if (focus) + navigation.querySelector(`#settings-tab-${id}`)?.focus(); + changed(id); + }; + mobile.addEventListener("change", render); + render(); + return { + select, + get current() { + return current; + }, + }; +} diff --git a/packages/lina-web/client/settings.css b/packages/lina-ui/client/settings.css similarity index 64% rename from packages/lina-web/client/settings.css rename to packages/lina-ui/client/settings.css index b1ee27c..bde6fe5 100644 --- a/packages/lina-web/client/settings.css +++ b/packages/lina-ui/client/settings.css @@ -1,12 +1,14 @@ dialog { color: var(--text); background: var(--surface-main); - border: 1px solid var(--line-strong); - border-radius: 14px; + border: 0; + border-radius: var(--menu-radius); + box-shadow: 0 16px 64px #0005; padding: 0; + overscroll-behavior: contain; } dialog::backdrop { - background: #0007; + background: #0008; } .settings-dialog { width: min(520px, calc(100vw - 32px)); @@ -21,21 +23,31 @@ dialog::backdrop { align-items: center; justify-content: space-between; gap: 16px; - padding: 16px 20px; - border-bottom: 1px solid var(--line); + padding: 16px 24px; + flex-shrink: 0; } .dialog-header h2 { font-size: 1rem; font-weight: 600; } +.dialog-header .icon-button { + width: 36px; + height: 36px; + padding: 8px; + border-radius: var(--control-radius); +} +.dialog-header .icon-button svg { + width: 16px; + height: 16px; +} .settings-body { padding: 8px 24px 20px; } .settings-body section { - padding-top: 18px; + padding-top: 16px; } .settings-body h3 { - font-size: 0.76rem; + font-size: 0.8125rem; color: var(--muted); font-weight: 500; margin-bottom: 10px; @@ -46,20 +58,28 @@ dialog::backdrop { justify-content: space-between; gap: 16px; border: 0; - border-bottom: 1px solid var(--line); - padding: 12px 0; + padding: 8px 0; margin: 0; min-width: 0; - font-size: 0.86rem; + min-height: 52px; + font-size: 0.875rem; +} +.setting-row > div:first-child { + min-width: 0; +} +.setting-row > button { + flex-shrink: 0; } .setting-row strong { font-size: inherit; font-weight: 400; } .setting-row p { - font-size: 0.78rem; + font-size: 0.8125rem; color: var(--muted); - line-height: 1.7; + line-height: 1.6; + margin-top: 4px; + overflow-wrap: anywhere; } .setting-options { border: 0; @@ -70,19 +90,19 @@ dialog::backdrop { gap: 12px; flex-wrap: wrap; justify-content: flex-end; - margin-left: auto; } .setting-options label { display: flex; align-items: center; - gap: 6px; + gap: 8px; cursor: pointer; - min-height: 32px; + min-height: 36px; } .setting-options input { accent-color: var(--accent); - width: 15px; - height: 15px; + width: 16px; + height: 16px; + flex-shrink: 0; margin: 0; } .stacked { @@ -92,45 +112,61 @@ dialog::backdrop { .theme-switch { display: flex; gap: 2px; - padding: 3px; + padding: 0; border: 0; - border-radius: 8px; + border-radius: var(--control-radius); background: var(--surface-sidebar); margin: 0; min-width: 0; } .theme-switch button { border: 0; - border-radius: 5px; + border-radius: var(--control-radius); background: transparent; color: var(--muted); - padding: 7px 9px; - min-height: 32px; - font-size: 0.78rem; + padding: 8px 12px; + min-height: 36px; + font-size: 0.875rem; + line-height: 20px; white-space: nowrap; } +.theme-switch button:hover { + color: var(--text); +} .theme-switch button[aria-pressed="true"] { background: var(--surface-raised); color: var(--text); } .secondary-button { - border: 1px solid var(--line-strong); - border-radius: 7px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + border: 0; + border-radius: var(--control-radius); background: var(--surface-raised); color: var(--text); padding: 8px 12px; min-height: 36px; - font-size: 0.78rem; + font-size: 0.875rem; + line-height: 20px; white-space: nowrap; } -.secondary-button:hover { +.secondary-button:hover:not(:disabled) { background: var(--selection); } .secondary-button:disabled { opacity: 0.55; } +.primary-button { + background: var(--button-bg); + color: var(--button-text); +} +.primary-button:hover:not(:disabled) { + background: var(--button-hover); +} .install-help { - font-size: 0.78rem; + font-size: 0.8125rem; line-height: 1.8; margin: 10px 0; color: var(--muted); @@ -142,7 +178,7 @@ dialog::backdrop { margin-top: 8px; } .settings-status { - font-size: 0.78rem; + font-size: 0.8125rem; color: var(--warning); line-height: 1.7; margin-top: 12px; @@ -153,14 +189,14 @@ dialog::backdrop { .shortcut-list { margin: 0; padding: 8px 24px 24px; - font-size: 0.85rem; + font-size: 0.875rem; } .shortcut-list div { display: flex; align-items: center; justify-content: space-between; - padding: 16px 0; - border-bottom: 1px solid var(--line); + padding: 12px 0; + gap: 16px; } .shortcut-list dd { margin: 0; @@ -179,7 +215,11 @@ dialog::backdrop { padding: 4px 18px 20px; } .dialog-header { - padding: 10px 16px; + padding: 12px 16px; + } + .dialog-header .icon-button { + width: 44px; + height: 44px; } .setting-row { gap: 10px; diff --git a/packages/lina-web/client/settings.ts b/packages/lina-ui/client/settings.ts similarity index 96% rename from packages/lina-web/client/settings.ts rename to packages/lina-ui/client/settings.ts index 5d951a2..91c82de 100644 --- a/packages/lina-web/client/settings.ts +++ b/packages/lina-ui/client/settings.ts @@ -1,10 +1,11 @@ -import { installHubSettings } from "./hub-settings.ts"; -import { installModelSettings } from "./model-settings.ts"; import { type Preferences, readPreferences, savePreferences, -} from "./preferences.ts"; +} from "../../lina-client/src/preferences.ts"; +import { installHubSettings } from "./hub-settings.ts"; +import { createModelCombobox } from "./model-combobox.ts"; +import { installModelSettings } from "./model-settings.ts"; import { element, setText } from "./render.ts"; import { installSettingsTabs } from "./settings-tabs.ts"; import { installThemeControls } from "./theme-controls.ts"; @@ -19,7 +20,7 @@ export function createSettings() { } catch {} let preferences = readPreferences(storage), returnFocus: HTMLElement | undefined; - const models = installModelSettings(dialog); + const models = installModelSettings(dialog, createModelCombobox); let modelsLoaded = false, hubLoaded = false; const hub = installHubSettings(dialog, { diff --git a/packages/lina-web/client/sidebar-resize.ts b/packages/lina-ui/client/sidebar-resize.ts similarity index 98% rename from packages/lina-web/client/sidebar-resize.ts rename to packages/lina-ui/client/sidebar-resize.ts index 71e010c..d83ff36 100644 --- a/packages/lina-web/client/sidebar-resize.ts +++ b/packages/lina-ui/client/sidebar-resize.ts @@ -2,7 +2,7 @@ import { SIDEBAR_DEFAULT_WIDTH, SIDEBAR_MAX_WIDTH, SIDEBAR_MIN_WIDTH, -} from "./preferences.ts"; +} from "../../lina-client/src/preferences.ts"; import { element } from "./render.ts"; import type { createSettings } from "./settings.ts"; export function installSidebarResize( diff --git a/packages/lina-web/client/sidebar.css b/packages/lina-ui/client/sidebar.css similarity index 55% rename from packages/lina-web/client/sidebar.css rename to packages/lina-ui/client/sidebar.css index a13753e..252a505 100644 --- a/packages/lina-web/client/sidebar.css +++ b/packages/lina-ui/client/sidebar.css @@ -2,10 +2,10 @@ position: relative; background: var(--surface-sidebar); color: var(--text); - border-right: 1px solid var(--line); + border-right: 0; display: flex; flex-direction: column; - padding: 20px 12px 14px; + padding: 12px 8px; min-width: 0; } .sidebar-top { @@ -13,15 +13,15 @@ align-items: center; justify-content: space-between; gap: 8px; - margin-bottom: 22px; + margin-bottom: 8px; } .brand { display: flex; align-items: center; gap: 10px; padding: 0 10px; - font-size: 1.25rem; - font-weight: 650; + font-size: 1rem; + font-weight: 600; letter-spacing: -0.02em; } .brand-mark { @@ -45,11 +45,11 @@ display: inline-grid; place-items: center; flex-shrink: 0; - width: 36px; - height: 36px; - padding: 8px; + width: var(--control-size); + height: var(--control-size); + padding: 6px; border: 0; - border-radius: 7px; + border-radius: var(--control-radius); background: transparent; color: var(--muted); } @@ -58,8 +58,8 @@ color: var(--text); } svg { - width: 20px; - height: 20px; + width: var(--icon-size); + height: var(--icon-size); fill: none; stroke: currentColor; stroke-width: 1.7; @@ -72,17 +72,17 @@ svg { align-items: center; gap: 10px; width: 100%; - padding: 10px; - border: 1px solid var(--line); - border-radius: 8px; - background: var(--input-bg); + padding: 8px 10px; + border: 0; + border-radius: var(--control-radius); + background: transparent; color: var(--muted); text-align: left; - font-size: 0.82rem; - min-height: 42px; + font-size: var(--font-ui); + min-height: 36px; } .sidebar-search:hover { - border-color: var(--line-strong); + background: var(--hover); color: var(--text); } .sidebar-search kbd { @@ -92,7 +92,7 @@ svg { white-space: nowrap; } .sidebar-content { - margin-top: 28px; + margin-top: 4px; min-height: 0; overflow-y: auto; } @@ -110,7 +110,7 @@ svg { padding: 12px 10px; border: 0; border-radius: 9px; - background: var(--selection); + background: transparent; color: var(--text); text-align: left; } @@ -161,7 +161,8 @@ svg { .account-area { position: relative; margin-top: auto; - padding-top: 20px; + padding-top: 8px; + border-top: 1px solid var(--line); } .account { display: flex; @@ -195,41 +196,6 @@ svg { margin-left: auto; width: 16px; } -.account-menu { - position: absolute; - z-index: 8; - bottom: calc(100% - 12px); - left: 0; - min-width: 232px; - padding: 6px; - border: 1px solid var(--line-strong); - border-radius: 11px; - background: var(--surface-raised); -} -.account-menu button { - display: flex; - align-items: center; - gap: 10px; - width: 100%; - padding: 12px 10px; - border: 0; - border-radius: 7px; - background: transparent; - color: var(--text); - font-size: 0.84rem; - text-align: left; - min-height: 44px; -} -.account-menu button:hover, -.account-menu button:focus-visible { - background: var(--selection); -} -.account-menu kbd { - margin-left: auto; - color: var(--muted); - font: inherit; - font-size: 0.72rem; -} #close-sidebar, #open-sidebar { display: none; @@ -237,7 +203,18 @@ svg { .chat-title { display: flex; align-items: center; - gap: 10px; + gap: 8px; + min-width: 0; + flex: 1; +} +#chat-agent-name { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +#current-agent-settings { + margin-left: auto; } .sidebar-drawer { margin: 0; @@ -280,9 +257,6 @@ svg { } } @media (max-width: 767px) { - .workspace > .sidebar { - display: none; - } #open-sidebar, #close-sidebar { display: inline-grid; @@ -295,7 +269,7 @@ svg { height: 44px; } .sidebar-top { - margin-bottom: 18px; + margin-bottom: 8px; } } @@ -338,3 +312,205 @@ svg { display: none; } } + +/* One stable messenger row for every agent, including the active conversation. */ +.agent-filter-field { + display: flex; + align-items: center; + gap: 8px; + margin: 4px 8px 12px; + padding: 0 10px; + border: 1px solid transparent; + border-radius: var(--control-radius); + background: var(--surface-raised); + color: var(--muted); +} +.agent-filter-field:focus-within { + border-color: var(--muted); +} +.agent-filter-field svg { + width: 16px; + height: 16px; +} +#agent-filter { + width: 100%; + min-width: 0; + min-height: 36px; + padding: 6px 0; + border: 0; + outline: none; + background: transparent; + color: var(--text); + font-size: var(--font-caption); +} +#agent-filter::placeholder { + color: var(--muted); +} +#agent-list-status { + padding: 0 12px 8px; + font-size: var(--font-caption); + line-height: 1.6; + color: var(--muted); +} +#other-agents { + padding: 2px 0 8px; +} +#other-agents .agent-row { + margin: 0; + min-height: 64px; + border-radius: var(--control-radius); + align-items: stretch; +} +#other-agents .agent-row:hover { + background: var(--hover); +} +#other-agents .agent-row.selected { + background: var(--selection); +} +#other-agents .agent-link { + min-width: 0; + flex: 1; + width: auto; + padding: 10px 0 10px 10px; + gap: 10px; + background: transparent; +} +#other-agents .agent-link:hover { + background: transparent; +} +#other-agents .avatar { + width: 40px; + height: 40px; + border-radius: 50%; + padding: 0; + color: var(--text); + background: var(--surface-raised); + font-weight: 500; + line-height: 1; + font-family: inherit; + font-size: 1rem; + font-style: normal; + letter-spacing: normal; + overflow: hidden; +} +#other-agents .avatar img { + border-radius: inherit; +} +#other-agents .agent-copy { + overflow: hidden; +} +#other-agents .agent-line { + display: flex; + align-items: center; + gap: 6px; + min-width: 0; +} +#other-agents strong { + min-width: 0; + flex: 1; + font-size: 0.875rem; + font-weight: 500; + line-height: 1.5; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +#other-agents time { + flex-shrink: 0; + font-size: 0.6875rem; + font-variant-numeric: tabular-nums; + color: var(--muted); +} +#other-agents small { + flex: 1; + min-width: 0; + font-size: 0.75rem; + line-height: 1.5; + margin-top: 3px; +} +#other-agents .unread strong { + font-weight: 650; +} +#other-agents .unread small { + color: var(--text); +} +#other-agents .needs-confirmation small { + color: var(--warning); +} +#other-agents .agent-unread { + width: 6px; + height: 6px; + flex-shrink: 0; + border-radius: 50%; + background: var(--text); +} +#other-agents .agent-working { + flex-shrink: 0; + font-size: 0.625rem; + color: var(--muted); +} +#other-agents .agent-more { + align-self: center; + min-width: 36px; + width: 36px; + min-height: 32px; + padding: 4px; + border-radius: var(--control-radius); + display: grid; + place-items: center; +} +#other-agents .agent-more:hover { + color: var(--text); + background: var(--surface-raised); +} +#other-agents button:focus-visible { + outline-offset: -2px; +} +#agent-actions { + min-width: 200px; + max-width: calc(100vw - 16px); + border-radius: var(--menu-radius); + padding: 4px; +} +#agent-actions button { + min-height: 40px; + padding: 10px 12px; + border-radius: var(--control-radius); +} +#agent-actions button:focus-visible { + outline-offset: -2px; + background: var(--selection); +} +.chat-header #current-agent-settings { + padding: 6px; +} +@media (max-width: 767px) { + #agent-filter { + min-height: 44px; + font-size: 16px; + } + #other-agents .agent-row { + min-height: 76px; + } + #other-agents .avatar { + width: 48px; + height: 48px; + } + #other-agents .agent-more { + min-width: 48px; + width: 48px; + min-height: 48px; + } + #other-agents .agent-link { + padding: 10px 0 10px 10px; + } + #other-agents strong { + font-size: 0.9375rem; + } + #other-agents small { + font-size: 0.8125rem; + } + #agent-actions button { + min-height: 48px; + } +} diff --git a/packages/lina-web/client/styles.css b/packages/lina-ui/client/styles.css similarity index 94% rename from packages/lina-web/client/styles.css rename to packages/lina-ui/client/styles.css index b167354..650db6e 100644 --- a/packages/lina-web/client/styles.css +++ b/packages/lina-ui/client/styles.css @@ -1,5 +1,6 @@ @import "./tokens.css"; @import "./base.css"; +@import "./controls.css"; @import "./sidebar.css"; @import "./chat.css"; @import "./composer.css"; @@ -20,6 +21,7 @@ @import "./tasks.css"; @import "./onboarding.css"; @import "./intro.css"; +@import "./navigation.css"; .intro-entry-link { font-size: 12px; diff --git a/packages/lina-ui/client/task-list.ts b/packages/lina-ui/client/task-list.ts new file mode 100644 index 0000000..2127d6a --- /dev/null +++ b/packages/lina-ui/client/task-list.ts @@ -0,0 +1,123 @@ +import { + type TaskRecord, + taskStatusLabel, +} from "../../lina-client/src/task-types.ts"; +import type { SettingsDocument, SettingsNode } from "./model-settings.ts"; + +export type TaskListScope = "selected" | "all"; +export type TaskAgent = { id: string; name: string }; + +export function parseTaskAgents(value: unknown): TaskAgent[] { + if ( + !value || + typeof value !== "object" || + !("agents" in value) || + !Array.isArray(value.agents) + ) + return []; + return value.agents.flatMap((item: unknown) => { + if ( + !item || + typeof item !== "object" || + !("id" in item) || + typeof item.id !== "string" || + !/^[a-z][a-z0-9-]{0,47}$/.test(item.id) + ) + return []; + return [ + { + id: item.id, + name: + "name" in item && typeof item.name === "string" && item.name.trim() + ? item.name + : item.id, + }, + ]; + }); +} + +/** Renders the same list node after the shell moves it between columns/screens. */ +export function createTaskList(options: { + document: SettingsDocument; + list: SettingsNode; + status: SettingsNode; + onOpen: (id: string, opener: SettingsNode) => Promise; + onScope: (scope: TaskListScope) => Promise; +}) { + const { document: doc, list, status } = options; + let filter = doc.getElementById("task-scope"); + if (!filter) { + filter = doc.createElement("select"); + filter.id = "task-scope"; + status.before(filter); + } + filter.className = "task-scope"; + filter.setAttribute("aria-label", "작업 담당 범위"); + const selected = doc.createElement("option"); + selected.value = "selected"; + const all = doc.createElement("option"); + all.value = "all"; + all.textContent = "전체 에이전트"; + filter.replaceChildren(selected, all); + const scopeNode = filter; + scopeNode.addEventListener("change", () => + options.onScope(scopeNode.value === "all" ? "all" : "selected"), + ); + let signature = ""; + return { + render( + tasks: TaskRecord[], + ownerId: string, + scope: TaskListScope, + agents: TaskAgent[], + selectedId: string | null, + ) { + const names = new Map(agents.map((agent) => [agent.id, agent.name])); + selected.textContent = `담당: ${names.get(ownerId) ?? ownerId}`; + scopeNode.value = scope; + const visible = tasks.filter( + (task) => scope === "all" || task.ownerAgentId === ownerId, + ); + const rows = visible.map((task) => ({ + task, + owner: names.get(task.ownerAgentId) ?? "담당 미지정", + })); + const next = JSON.stringify([rows, selectedId]); + if (next === signature) return visible.length; + signature = next; + const active = ( + doc as SettingsDocument & { activeElement?: SettingsNode } + ).activeElement; + const focusId = active && list.contains(active) ? active.id : undefined; + const scroll = (list as SettingsNode & { scrollTop?: number }).scrollTop; + list.replaceChildren(); + for (const { task, owner } of rows) { + const button = doc.createElement("button"); + button.type = "button"; + button.id = `task-open-${task.id}`; + button.className = "task-link"; + button.setAttribute( + "aria-current", + task.id === selectedId ? "true" : "false", + ); + const title = doc.createElement("span"); + title.className = "task-link-title"; + title.textContent = task.title; + const meta = doc.createElement("span"); + meta.className = "task-link-meta"; + meta.textContent = `${owner} · ${taskStatusLabel(task.status)}${task.pendingApprovals.length ? ` · 확인 요청 ${task.pendingApprovals.length}개` : ""}`; + button.append(title, meta); + button.setAttribute( + "aria-label", + `${task.title} · ${meta.textContent}`, + ); + button.addEventListener("click", () => options.onOpen(task.id, button)); + list.append(button); + } + if (focusId) doc.getElementById(focusId)?.focus(); + if (scroll !== undefined) + (list as SettingsNode & { scrollTop: number }).scrollTop = scroll; + return visible.length; + }, + }; +} diff --git a/packages/lina-web/client/task-view.ts b/packages/lina-ui/client/task-view.ts similarity index 80% rename from packages/lina-web/client/task-view.ts rename to packages/lina-ui/client/task-view.ts index 53a5f75..151ca1d 100644 --- a/packages/lina-web/client/task-view.ts +++ b/packages/lina-ui/client/task-view.ts @@ -1,5 +1,31 @@ +import { + TaskDraftStore, + type TaskStorage, +} from "../../lina-client/src/task-drafts.ts"; +import { + type ApprovalDecision, + type TaskApproval, + type TaskRecord, + taskStatusLabel, +} from "../../lina-client/src/task-types.ts"; + +export { + type ApprovalDecision, + type TaskApproval, + type TaskRecord, + taskStatusLabel, +} from "../../lina-client/src/task-types.ts"; + import { agentRequest, type RequestFn } from "./agent-editor.ts"; import type { SettingsDocument, SettingsNode } from "./model-settings.ts"; +import { + createTaskList, + parseTaskAgents, + type TaskAgent, + type TaskListScope, +} from "./task-list.ts"; + +export type { TaskListScope } from "./task-list.ts"; type TaskNode = SettingsNode & { open?: boolean; @@ -19,32 +45,6 @@ const RUNNING = new Set([ "needs_attention", ]); -export type TaskApproval = { - id: string; - method: string; - params: unknown; - createdAt: string; -}; - -export type ApprovalDecision = - | "accept" - | "decline" - | "cancel" - | "acceptForSession"; - -export type TaskRecord = { - id: string; - threadId: string | null; - ownerAgentId: string; - title: string; - cwd: string; - status: string; - revision: number; - updatedAt: string; - model: string | null; - pendingApprovals: TaskApproval[]; -}; - export type HistoryRow = { kind: "user" | "assistant" | "status" | "tool" | "error"; text: string; @@ -239,19 +239,6 @@ export function compactThreadHistory(thread: TaskThread | null): HistoryRow[] { return rows; } -export function taskStatusLabel(status: string): string { - if (status === "inProgress" || status === "running") return "진행 중"; - if (status === "waiting_approval") return "확인 대기"; - if (status === "waiting_input") return "입력 대기"; - if (status === "needs_attention") return "확인 필요"; - if (status === "creating") return "만드는 중"; - if (status === "completed") return "완료"; - if (status === "interrupted") return "중단됨"; - if (status === "failed") return "실패"; - if (status === "queued" || status === "idle") return "대기"; - return status; -} - export function approvalMethodLabel(method: string): string { if (method.includes("commandExecution") || method === "execCommandApproval") return "명령 실행"; @@ -330,12 +317,25 @@ function message(error: unknown, fallback: string): string { return error instanceof Error && error.message ? error.message : fallback; } +function browserTaskStorage(): TaskStorage | undefined { + try { + return (globalThis as { localStorage?: TaskStorage }).localStorage; + } catch { + return undefined; + } +} + export function installTasks(options: { ownerAgentId: string; + storage?: TaskStorage; document?: SettingsDocument; request?: RequestFn; hidden?: () => boolean; scheduler?: (tick: () => void) => () => void; + scope?: TaskListScope; + onShowList?: () => void; + onOpen?: (id: string) => void; + onScopeChange?: (scope: TaskListScope, ownerAgentId: string) => void; }) { const doc = options.document ?? browserDocument(); const request = options.request ?? agentRequest; @@ -368,6 +368,9 @@ export function installTasks(options: { const interrupt = find("task-interrupt"); const owner = find("task-owner"); const handover = find("task-handover"); + const drafts = new TaskDraftStore( + options.storage ?? (options.document ? undefined : browserTaskStorage()), + ); let generation = 0, busy = false, tasks: TaskRecord[] = [], @@ -380,7 +383,38 @@ export function installTasks(options: { stopped = false, liveGate: Promise | undefined, liveQueued = false, - listSignature = ""; + detailVisible = false, + listLoading = false, + ownerAgentId = options.ownerAgentId, + scope: TaskListScope = options.scope ?? drafts.scope(); + let agents: TaskAgent[] = []; + const saveDraft = () => { + if (!selectedId || mode !== "detail") return; + const editedOwner = detail + ? owner.value !== detail.task.ownerAgentId + ? owner.value + : undefined + : drafts.get(selectedId)?.owner; + const saved = drafts.set(selectedId, { + input: input.value, + ...(editedOwner ? { owner: editedOwner } : {}), + }); + const storageError = + "작업 초안을 저장하지 못했습니다. 내용을 복사하거나 저장소를 확인해주세요."; + if (!saved && !options.document) errorNode.textContent = storageError; + else if (saved && errorNode.textContent === storageError) + errorNode.textContent = ""; + }; + const listView = createTaskList({ + document: doc, + list, + status, + onOpen: (id, opener) => { + returnFocus = opener; + return openTask(id); + }, + onScope: (next) => setScope(next), + }); openLink.setAttribute("target", "_blank"); openLink.setAttribute("rel", "noopener noreferrer"); openLink.textContent = "Codex에서 열기"; @@ -388,15 +422,18 @@ export function installTasks(options: { const current = detail?.task; const running = !!current && RUNNING.has(current.status); add.disabled = busy; - reload.disabled = busy; + reload.disabled = listLoading; createSubmit.disabled = busy; - send.disabled = busy || mode !== "detail" || !input.value.trim(); + send.disabled = + busy || !current || mode !== "detail" || !input.value.trim(); interrupt.disabled = busy || !running; handover.disabled = busy || !current; for (const node of approvals.querySelectorAll("button")) node.disabled = busy; }; const showDialog = () => { + detailVisible = true; + dialog.hidden = false; if (dialog.open) return; if (dialog.showModal) dialog.showModal(); else dialog.open = true; @@ -427,46 +464,50 @@ export function installTasks(options: { } reload.focus(); }; + const revealList = () => { + const surface = (doc.getElementById("task-pane") ?? + doc.getElementById("tasks-dialog")) as TaskNode | null; + if (surface) { + surface.hidden = false; + if (surface.showModal && !surface.open) surface.showModal(); + } + options.onShowList?.(); + }; const dismiss = () => { + if (!detailVisible) return; + detailVisible = false; + saveDraft(); generation++; listSeq++; detailSeq++; busy = false; + listLoading = false; + dialog.hidden = true; controls(); + revealList(); + renderList(); restoreFocus(); }; const hideDialog = () => { - if (!dialog.open) return; - if (dialog.close) dialog.close(); - else { - dialog.open = false; - dismiss(); - } + if (!detailVisible) return; + if (dialog.open && dialog.close) dialog.close(); + else dialog.open = false; + dismiss(); }; - const renderList = () => { - const signature = JSON.stringify( - tasks.map((task) => [task.id, task.title, task.status]), + const renderList = () => + listView.render( + tasks, + ownerAgentId, + scope, + agents, + dialog.open ? selectedId : null, ); - if (signature === listSignature) return; - listSignature = signature; - const active = (doc as SettingsDocument & { activeElement?: TaskNode }) - .activeElement; - const focusId = active && list.contains(active) ? active.id : undefined; - list.replaceChildren(); - for (const task of tasks) { - const button = doc.createElement("button"); - button.type = "button"; - button.id = `task-open-${task.id}`; - button.className = "task-link sidebar-label"; - button.textContent = `${task.title} · ${taskStatusLabel(task.status)}`; - button.setAttribute("aria-label", task.title); - button.addEventListener("click", () => { - returnFocus = button; - return openTask(task.id); - }); - list.append(button); + const fetchAgents = async () => { + try { + return parseTaskAgents(await request("/api/agents")); + } catch { + return agents; } - if (focusId) doc.getElementById(focusId)?.focus(); }; const renderHistory = (thread: TaskThread | null) => { history.replaceChildren(); @@ -512,7 +553,10 @@ export function installTasks(options: { } heading.textContent = current.title; taskStatus.textContent = taskStatusLabel(current.status); - meta.textContent = `${current.ownerAgentId} · ${current.cwd} · ${current.model} · r${current.revision}`; + const ownerName = + agents.find((agent) => agent.id === current.ownerAgentId)?.name ?? + "담당 미지정"; + meta.textContent = `${ownerName} · ${current.cwd} · ${current.model} · r${current.revision}`; const href = current.threadId ? taskDeepLink(current.threadId) : ""; openLink.hidden = !href; openLink.setAttribute("href", href); @@ -542,8 +586,8 @@ export function installTasks(options: { const button = doc.createElement("button"); button.type = "button"; button.className = - decision === "accept" || decision === "decline" - ? "secondary-button" + decision === "accept" + ? "secondary-button primary-button" : "text-button"; button.textContent = label; button.disabled = busy; @@ -557,59 +601,40 @@ export function installTasks(options: { approvals.append(card); } }; - const loadAgents = async (selected: string) => { + const loadAgents = (selected: string, draftOwner?: string) => { owner.replaceChildren(); - let rows: Array<{ id: string; name: string }> = [ - { id: options.ownerAgentId, name: options.ownerAgentId }, - ]; - try { - const value = asRecord(await request("/api/agents")); - const agents = value?.["agents"]; - if (Array.isArray(agents)) - rows = agents.flatMap((item) => { - const rec = asRecord(item); - if (!rec) return []; - const id = rec["id"]; - if (typeof id !== "string" || !/^[a-z][a-z0-9-]{0,47}$/.test(id)) - return []; - const name = rec["name"]; - return [ - { - id, - name: typeof name === "string" && name.trim() ? name : id, - }, - ]; - }); - } catch { - /* Keep the current owner so handover remains possible. */ - } - if (!rows.some((row) => row.id === selected)) - rows.unshift({ id: selected, name: selected }); + const rows = agents.some((row) => row.id === selected) + ? [...agents] + : [{ id: selected, name: selected }, ...agents]; + if (draftOwner && !rows.some((row) => row.id === draftOwner)) + rows.push({ id: draftOwner, name: draftOwner }); for (const row of rows) { const option = doc.createElement("option"); option.value = row.id; option.textContent = row.name; owner.append(option); } - owner.value = selected; + owner.value = draftOwner ?? selected; }; const refresh = async (quiet = false) => { const mine = ++listSeq; if (!quiet) { - generation++; - busy = true; + listLoading = true; controls(); status.textContent = "작업 목록을 불러오는 중…"; } try { - const next = parseTaskList(await request("/api/tasks")); - if (mine !== listSeq) return; - tasks = next; - renderList(); - if (!quiet || !tasks.length) - status.textContent = tasks.length - ? "" - : "작업이 없습니다. 새 작업을 추가하세요."; + const [value, directory] = await Promise.all([ + request("/api/tasks"), + fetchAgents(), + ]); + if (mine !== listSeq || stopped) return; + tasks = parseTaskList(value); + agents = directory; + const count = renderList(); + status.textContent = count + ? "" + : "작업이 없습니다. 새 작업을 추가하세요."; } catch (error) { if (mine !== listSeq) return; if (quiet) return; @@ -617,13 +642,16 @@ export function installTasks(options: { renderList(); status.textContent = message(error, "작업 목록을 불러오지 못했습니다."); } finally { - if (!quiet && mine === listSeq) { - busy = false; + if (mine === listSeq) { + listLoading = false; controls(); } } }; const openCreate = () => { + saveDraft(); + busy = false; + input.value = ""; generation++; detailSeq++; mode = "create"; @@ -640,24 +668,33 @@ export function installTasks(options: { title.focus(); }; const openTask = async (id: string) => { + if (stopped || !TASK_ID.test(id)) return; + saveDraft(); const mine = ++generation; const load = ++detailSeq; busy = true; mode = "detail"; selectedId = id; + input.value = drafts.get(id)?.input ?? ""; + owner.replaceChildren(); detail = null; renderDetail(); errorNode.textContent = ""; taskStatus.textContent = "불러오는 중…"; showDialog(); + renderList(); + options.onOpen?.(id); controls(); try { - const next = parseTaskDetail( - await request(`/api/tasks/${encodeURIComponent(id)}`), - ); + const [value, directory] = await Promise.all([ + request(`/api/tasks/${encodeURIComponent(id)}`), + fetchAgents(), + ]); + const next = parseTaskDetail(value); if (mine !== generation || load !== detailSeq) return; detail = next; - await loadAgents(next.task.ownerAgentId); + agents = directory; + loadAgents(next.task.ownerAgentId, drafts.get(id)?.owner); if (mine !== generation || load !== detailSeq) return; renderDetail(); } catch (error) { @@ -683,6 +720,10 @@ export function installTasks(options: { const ownerEdited = !!detail && ownerDraft !== detail.task.ownerAgentId; detail = { task, thread }; selectedId = task.id; + loadAgents( + task.ownerAgentId, + preserveDraft && ownerEdited && ownerDraft ? ownerDraft : undefined, + ); tasks = tasks.map((item) => (item.id === task.id ? task : item)); if (!tasks.some((item) => item.id === task.id)) tasks = [task, ...tasks]; renderList(); @@ -764,7 +805,7 @@ export function installTasks(options: { requestId: string; model?: string; } = { - ownerAgentId: options.ownerAgentId, + ownerAgentId, title: nextTitle, cwd: nextCwd, prompt: nextPrompt, @@ -778,7 +819,8 @@ export function installTasks(options: { detail = created; mode = "detail"; selectedId = created.task.id; - await loadAgents(created.task.ownerAgentId); + loadAgents(created.task.ownerAgentId); + options.onOpen?.(created.task.id); if (mine !== generation) return; tasks = [ created.task, @@ -821,6 +863,7 @@ export function installTasks(options: { applyDetail(value); if (mine !== generation) return; input.value = ""; + drafts.delete(current.id); } catch (error) { if (mine !== generation) return; errorNode.textContent = message(error, "메시지를 보내지 못했습니다."); @@ -923,16 +966,51 @@ export function installTasks(options: { } } }; + const showList = async () => { + if (stopped) return; + if (dialog.open) hideDialog(); + else revealList(); + await refresh(); + }; + const changeScope = async () => { + saveDraft(); + generation++; + listSeq++; + detailSeq++; + busy = false; + listLoading = false; + if (dialog.open) hideDialog(); + renderList(); + options.onScopeChange?.(scope, ownerAgentId); + await refresh(); + }; + const setOwner = async (id: string) => { + if (stopped || id === ownerAgentId) return; + ownerAgentId = id; + await changeScope(); + }; + const setScope = async (next: TaskListScope) => { + if (stopped || next === scope) return; + scope = next; + drafts.setScope(next); + await changeScope(); + }; add.addEventListener("click", openCreate); reload.addEventListener("click", () => void refresh()); createSubmit.addEventListener("click", () => void createTask()); send.addEventListener("click", () => void sendMessage()); interrupt.addEventListener("click", () => void interruptTask()); handover.addEventListener("click", () => void handoverTask()); - input.addEventListener("input", () => controls()); + input.addEventListener("input", () => { + saveDraft(); + controls(); + }); + owner.addEventListener("change", saveDraft); const closer = doc.getElementById("task-close"); closer?.addEventListener("click", () => hideDialog()); - dialog.addEventListener("close", () => dismiss()); + dialog.addEventListener("close", () => { + if (!dialog.open) dismiss(); + }); createForm.addEventListener("submit", (event) => { event.preventDefault(); void createTask(); @@ -963,7 +1041,17 @@ export function installTasks(options: { return { refresh, sync, + setOwner, + setScope, + showList, + open: openTask, + closeDetail: hideDialog, + canLeave() { + saveDraft(); + return drafts.flush(); + }, close() { + saveDraft(); closeLive(); }, }; diff --git a/packages/lina-web/client/tasks.css b/packages/lina-ui/client/tasks.css similarity index 50% rename from packages/lina-web/client/tasks.css rename to packages/lina-ui/client/tasks.css index f813fb4..6a7f87b 100644 --- a/packages/lina-web/client/tasks.css +++ b/packages/lina-ui/client/tasks.css @@ -1,5 +1,18 @@ .tasks-nav { - margin-top: 28px; + min-width: 0; +} +.task-scope { + display: block; + width: calc(100% - 16px); + min-width: 0; + margin: 4px 8px 0; + padding: 8px; + border: 1px solid var(--line-strong); + border-radius: var(--control-radius); + background: var(--input-bg); + color: var(--text); + font: inherit; + font-size: var(--font-ui); } .tasks-heading { display: flex; @@ -11,7 +24,7 @@ } #tasks-status { margin: 8px 10px 0; - font-size: 0.74rem; + font-size: var(--font-caption); line-height: 1.6; color: var(--muted); word-break: keep-all; @@ -30,16 +43,36 @@ .task-link { display: block; width: 100%; - padding: 10px; + padding: 12px; border: 0; - border-radius: 8px; + border-radius: var(--control-radius); background: transparent; color: var(--text); text-align: left; - font-size: 0.82rem; + font-size: var(--font-ui); line-height: 1.45; overflow-wrap: anywhere; } +.task-link-title, +.task-link-meta { + display: block; +} +.task-link-title { + font-weight: 500; +} +.task-link-meta { + margin-top: 4px; + color: var(--muted); + font-size: var(--font-caption); +} +.task-link[aria-current="true"] { + background: var(--selection); +} +.task-link:focus-visible, +.task-scope:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; +} .task-link:hover, .task-link:focus-visible { background: var(--surface-raised); @@ -51,7 +84,7 @@ .task-body { display: grid; gap: 12px; - padding: 16px 20px 22px; + padding: 20px 24px 24px; overflow-y: auto; } .task-meta, @@ -64,8 +97,8 @@ } .task-history { display: grid; - gap: 10px; - padding-top: 8px; + gap: 20px; + padding: 16px 0; border-top: 1px solid var(--line); } .task-row { @@ -76,6 +109,11 @@ } .task-row-user { color: var(--text); + background: var(--surface-raised); + border-radius: 16px; + padding: 10px 14px; + margin-left: auto; + max-width: 90%; } .task-row-assistant { color: var(--text); @@ -97,7 +135,7 @@ .task-chat label { display: grid; gap: 6px; - font-size: 0.82rem; + font-size: var(--font-ui); } .task-create input, .task-create textarea, @@ -106,31 +144,82 @@ width: 100%; min-width: 0; border: 1px solid var(--input-border); - border-radius: 8px; + border-radius: var(--control-radius); background: var(--input-bg); color: var(--text); font: inherit; - padding: 9px; + padding: 8px 10px; + min-height: 36px; } .task-chat-actions { display: flex; + justify-content: flex-end; flex-wrap: wrap; gap: 8px; } +.task-composer { + padding: 12px; + border: 1px solid transparent; + border-radius: var(--composer-radius); + background: var(--surface-raised); +} +.task-composer:focus-within { + border-color: var(--line-strong); +} +.task-composer #task-input { + border: 0; + padding: 0 4px 8px; + background: transparent; +} +.task-owner-row { + display: flex; + align-items: flex-end; + gap: 12px; + margin-top: 8px; +} +.task-owner-row label { + min-width: 0; + flex: 1; +} +.task-owner-row button { + flex-shrink: 0; +} #task-open-codex[hidden], #task-create[hidden], #task-chat[hidden] { display: none; } @media (min-width: 768px) { - :root[data-sidebar-collapsed="true"] #task-list, - :root[data-sidebar-collapsed="true"] #tasks-status, - :root[data-sidebar-collapsed="true"] #task-reload { + :root[data-sidebar-collapsed="true"] .sidebar #task-list, + :root[data-sidebar-collapsed="true"] .sidebar #tasks-status, + :root[data-sidebar-collapsed="true"] .sidebar #task-reload, + :root[data-sidebar-collapsed="true"] .sidebar #task-scope { display: none; } + #task-column .tasks-heading .sidebar-label, + #task-column #task-reload, + #task-column #tasks-status:not(:empty) { + display: revert; + } } @media (max-width: 767px) { + .task-dialog { + width: 100%; + max-width: 100%; + height: 100dvh; + max-height: 100dvh; + margin: 0; + border: 0; + border-radius: 0; + } + .task-dialog .dialog-header { + padding-top: max(16px, env(safe-area-inset-top)); + } + .task-body { + padding-bottom: max(22px, env(safe-area-inset-bottom)); + } .task-link, + .task-scope, .task-chat-actions button, .task-create button { min-height: 44px; @@ -145,8 +234,9 @@ display: grid; gap: 8px; padding: 12px; - border: 1px solid var(--line-strong); - border-radius: 10px; + border: 1px solid var(--line); + background: var(--surface-sidebar); + border-radius: 16px; } .task-approval-details { margin: 0; @@ -160,6 +250,7 @@ } .task-approval-actions { display: flex; + justify-content: flex-end; flex-wrap: wrap; gap: 8px; } @@ -168,3 +259,10 @@ min-height: 44px; } } + +@media (max-width: 767px) { + .task-create input, + .task-chat select { + min-height: 44px; + } +} diff --git a/packages/lina-web/client/theme-boot.ts b/packages/lina-ui/client/theme-boot.ts similarity index 100% rename from packages/lina-web/client/theme-boot.ts rename to packages/lina-ui/client/theme-boot.ts diff --git a/packages/lina-web/client/theme-controls.ts b/packages/lina-ui/client/theme-controls.ts similarity index 51% rename from packages/lina-web/client/theme-controls.ts rename to packages/lina-ui/client/theme-controls.ts index df647b1..a6779bd 100644 --- a/packages/lina-web/client/theme-controls.ts +++ b/packages/lina-ui/client/theme-controls.ts @@ -1,24 +1,27 @@ -import { readTheme, resolveTheme, saveTheme } from "./theme.ts"; +import { createElement } from "react"; +import { mountView } from "./components/mount.ts"; +import { ThemeControlsView } from "./components/theme-controls.tsx"; +import { readTheme, resolveTheme, saveTheme, type Theme } from "./theme.ts"; + export function installThemeControls(failed: () => void = () => {}): void { - const buttons = document.querySelectorAll( - "[data-theme-choice]", - ); let storage: Storage | undefined; try { storage = window.localStorage; } catch {} let preference = readTheme(storage); const system = matchMedia("(prefers-color-scheme: dark)"); + // Each host keeps its accessible label and attributes; React owns its choices. + const views = Array.from( + document.querySelectorAll(".theme-switch"), + mountView, + ); const apply = () => { document.documentElement.dataset["theme"] = resolveTheme( preference, system.matches, ); - for (const button of buttons) - button.setAttribute( - "aria-pressed", - String(button.dataset["themeChoice"] === preference), - ); + for (const view of views) + view.render(createElement(ThemeControlsView, { preference, select })); document .querySelector('meta[name="theme-color"]') ?.setAttribute( @@ -28,13 +31,11 @@ export function installThemeControls(failed: () => void = () => {}): void { .trim(), ); }; - for (const button of buttons) - button.addEventListener("click", () => { - const next = button.dataset["themeChoice"]; - preference = next === "light" || next === "system" ? next : "dark"; - apply(); - if (!saveTheme(storage, preference)) failed(); - }); + const select = (next: Theme) => { + preference = next; + apply(); + if (!saveTheme(storage, preference)) failed(); + }; system.addEventListener("change", () => { if (preference === "system") apply(); }); diff --git a/packages/lina-web/client/theme.ts b/packages/lina-ui/client/theme.ts similarity index 100% rename from packages/lina-web/client/theme.ts rename to packages/lina-ui/client/theme.ts diff --git a/packages/lina-ui/client/tokens.css b/packages/lina-ui/client/tokens.css new file mode 100644 index 0000000..e040068 --- /dev/null +++ b/packages/lina-ui/client/tokens.css @@ -0,0 +1,69 @@ +:root { + color-scheme: dark; + --space-unit: 0.25rem; + --control-radius: 8px; + --control-size: 32px; + --icon-size: 18px; + --font-ui: 0.875rem; + --font-caption: 0.75rem; + --composer-radius: 22px; + --conversation-width: 832px; + --menu-radius: 16px; + --app-bg: #181818; + --surface-main: #181818; + --surface-sidebar: #212121; + --surface-inspector: #212121; + --surface-raised: #2b2b2b; + --input-bg: #2b2b2b; + --input-border: #626262; + --text: #ededed; + --muted: #a3a3a3; + --line: #ffffff0f; + --line-strong: #555555; + --accent: #dddddd; + --accent-hover: #ffffff; + --selection: #ffffff0f; + --hover: #ffffff09; + --button-bg: #eeeeee; + --button-text: #242424; + --button-hover: #ffffff; + --disabled-bg: #393939; + --success: #a0c6ad; + --warning: #e8b680; + --danger: #f0a5a1; + --focus-ring: #dddddd20; + --tint: var(--surface-raised); + --rail-text: var(--muted); +} +:root[data-theme="light"] { + color-scheme: light; + --app-bg: #eeeeee; + --surface-main: #ffffff; + --surface-sidebar: #f5f5f5; + --surface-inspector: #fafafa; + --surface-raised: #eeeeee; + --input-bg: #ffffff; + --input-border: #858585; + --text: #242424; + --muted: #666666; + --line: #e2e2e2; + --line-strong: #b5b5b5; + --accent: #303030; + --accent-hover: #101010; + --selection: #e6e6e6; + --hover: #00000006; + --button-bg: #242424; + --button-text: #ffffff; + --button-hover: #101010; + --disabled-bg: #e6e6e6; + --success: #326649; + --warning: #875922; + --danger: #a03935; + --focus-ring: #24242418; +} +@media (max-width: 767px) { + :root { + --control-size: 44px; + --icon-size: 20px; + } +} diff --git a/packages/lina-web/client/tool-label.ts b/packages/lina-ui/client/tool-label.ts similarity index 100% rename from packages/lina-web/client/tool-label.ts rename to packages/lina-ui/client/tool-label.ts diff --git a/packages/lina-web/client/tool-view.ts b/packages/lina-ui/client/tool-view.ts similarity index 97% rename from packages/lina-web/client/tool-view.ts rename to packages/lina-ui/client/tool-view.ts index 2c795f7..4703ae2 100644 --- a/packages/lina-web/client/tool-view.ts +++ b/packages/lina-ui/client/tool-view.ts @@ -1,4 +1,4 @@ -import type { ChatMessage } from "./model.ts"; +import type { ChatMessage } from "../../lina-client/src/model.ts"; import { toolSummary } from "./tool-label.ts"; /** Structural subset of DOM elements used here; real DOM elements satisfy it. */ diff --git a/packages/lina-ui/client/tsconfig.json b/packages/lina-ui/client/tsconfig.json new file mode 100644 index 0000000..5cf4b41 --- /dev/null +++ b/packages/lina-ui/client/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "types": [] + }, + "include": ["./**/*.ts", "./**/*.tsx", "../../lina-client/src/*.ts"], + "exclude": [] +} diff --git a/packages/lina-ui/package.json b/packages/lina-ui/package.json new file mode 100644 index 0000000..582795f --- /dev/null +++ b/packages/lina-ui/package.json @@ -0,0 +1,16 @@ +{ + "name": "@lina/ui", + "version": "0.1.0", + "private": true, + "type": "module", + "license": "Apache-2.0", + "dependencies": { + "@base-ui/react": "1.8.0", + "react": "19.2.8", + "react-dom": "19.2.8" + }, + "devDependencies": { + "@types/react": "19.2.18", + "@types/react-dom": "19.2.7" + } +} diff --git a/packages/lina-web/DESIGN.md b/packages/lina-web/DESIGN.md index 96f4c89..7c9e700 100644 --- a/packages/lina-web/DESIGN.md +++ b/packages/lina-web/DESIGN.md @@ -1,6 +1,6 @@ # Lina visual direction -Codex 디자인 언어, Electron/웹 공통 렌더러, 메신저형 에이전트 목록과 모바일 탐색은 목표 방향이며 이미 구현된 상태가 아닙니다. 외부 주장은 재검증하지 않았습니다. +공통 화면과 디자인 토큰은 `../lina-ui/client`에 있습니다. 메신저형 목록·모바일 탐색·붙여넣기 큐와 Electron 동봉 빌드를 구현했습니다. 2026-09-07 사용자가 제공한 Codex 앱 화면을 기준으로 표면의 밝기 순서, 버튼 정렬, 메뉴와 입력창을 재검수했습니다. 실제 검증 범위와 남은 플랫폼 연결은 [구현 기록](../../docs/plans/codex-ui/010_implementation.md)을 따릅니다. 특정 Codex 버전과의 픽셀 단위 일치를 보증하지 않습니다. The product direction is to adopt the Codex design language across surfaces, typography, spacing, icons, menus, the @@ -9,7 +9,7 @@ and scale for visual verification. Keep Lina's agent-centric navigation and conv identity. Desktop targets Electron; web/PWA shares the same renderer and tokens. The plan specifies a messenger-style agent list and mobile navigation. Apply Codex styling to photo/name/recent-message rows; use full-screen mobile lists and optional desktop task columns. -This describes the target design; the implementation has not yet been migrated. +Web and desktop builds now consume the same renderer; native platform acceptance is recorded separately. ## First setup and agent creation @@ -32,16 +32,18 @@ This utility surface does not need generated concept art, gradients or ornamenta ## Token ownership -`client/tokens.css` owns color values for both modes. Components use semantic tokens +[`../lina-ui/client/tokens.css`](../lina-ui/client/tokens.css) owns color values for both modes. Components use semantic tokens for main/sidebar/elevated surfaces, text, muted text, borders, focus/selection, buttons and status. This document describes their roles rather than duplicating numeric values. -Dark: charcoal surfaces with enough separation between navigation, conversation and -input; off-white text and readable muted labels. Light: white and light neutral gray +Dark: the conversation is the darkest surface, the sidebar is one step lighter, +and the composer and menus are raised neutral surfaces. Use off-white text and readable muted labels. Light: white and light neutral gray surfaces with black text. Selection uses the Codex neutral surface treatment; focus and semantic status colors remain accessible and are verified separately. Primary send/action buttons use high-contrast neutral treatment. +The composer has a shared horizontal control axis: attachment on the left, model settings and a round arrow send control on the right. Task message input uses the same surface and send control. Icon geometry comes from SVG rather than font glyphs; mobile keeps at least 44px action targets. Form actions align to the end of their group. Mobile settings tabs stay on one line, dropping redundant icons at the narrowest width. Border emphasis belongs to form fields and keyboard focus; ordinary navigation and the chat header remain quiet. + Use platform system fonts with Korean fallbacks, modest font weights, a consistent spacing scale and restrained radii. Avoid simulated window traffic lights or controls without behavior. Existing history, draft recovery and source expansion remain usable. @@ -122,3 +124,28 @@ height follows content; long drafts expose a temporary expand/reduce action. Bou height by the visible viewport and fit complete text rows. Preserve draft/selection, and keep Stop and required approvals reachable. Installation/update descriptions explain the web-app benefit and the explicit apply/reload behavior only in settings. + +### Common component ownership + +`lina-ui/client/components/ui/` is the shared shadcn/Base UI component source. +`controls.css` applies Lina's tokens to Button and DropdownMenu; component classes +retain agent-first geometry. The wrappers adapt the upstream base-nova patterns, +without adding Tailwind or another build pipeline. Base UI owns focus, keyboard +navigation, disabled semantics and floating placement inside the component. + +Imperative controllers mount a view into a dedicated host and pass values/actions. +They must not mutate that host's children. In particular, list notices use the +list view API, menu actions use callbacks, settings panels are controlled separately +from the React tab navigation, and combobox updates use its adapter methods. +Conversation history, composer drafts, attachment queues and transport stay in +existing controllers/models. Adding a component does not change their ownership. + + +### Task layout control + +The top sidebar icon only collapses navigation. Agent/task tabs only choose a +list. The task toolbar owns the labeled `나란히 보기` / `나란히 보기 종료` action, +using the common Button. Show it only when the actual sidebar width plus the task +and reading columns fit. One control opens and closes the extra column; preserve +list nodes, drafts, filters and focus across reparenting. Narrow screens fall back +to the ordinary task list while retaining the user's wide-screen preference. diff --git a/packages/lina-web/client/attachments.ts b/packages/lina-web/client/attachments.ts deleted file mode 100644 index cdc464c..0000000 --- a/packages/lina-web/client/attachments.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { - AttachmentDraft, - attachmentHref, - type DraftAttachment, -} from "./attachment-draft.ts"; -import { element, setText } from "./render.ts"; -export function createAttachments( - input: HTMLTextAreaElement, - session: () => string | undefined, - changed: () => void, - notice: (text: string) => void, -) { - const draft = new AttachmentDraft(); - const list = element("draft-files", HTMLDivElement); - const picker = element("file-picker", HTMLInputElement), - button = element("attach-file", HTMLButtonElement); - let uploading = false, - connected = false, - signature = ""; - const render = () => { - const next = JSON.stringify([session(), draft.refs]); - if (signature !== next) { - signature = next; - list.replaceChildren(); - list.hidden = !draft.refs.length; - for (const ref of draft.refs) { - const row = fileChip(ref, session()); - const remove = document.createElement("button"); - remove.type = "button"; - remove.textContent = "×"; - remove.setAttribute("aria-label", `${ref.name} 첨부 제외`); - remove.addEventListener("click", () => { - draft.remove(ref.id); - render(); - changed(); - }); - row.append(remove); - list.append(row); - } - } - button.disabled = !connected || uploading || draft.refs.length >= 4; - setText(button, uploading ? "첨부 중…" : "파일 첨부"); - }; - const port = { - get value() { - draft.text = input.value; - return draft.value; - }, - set value(text: string) { - draft.value = text; - input.value = draft.text; - render(); - }, - }; - button.addEventListener("click", () => picker.click()); - picker.addEventListener("change", () => { - const files = Array.from(picker.files ?? []); - picker.value = ""; - if (!files.length) return; - if (!connected || uploading) return; - if (files.length + draft.refs.length > 4) { - notice("첨부 한도 초과 · 최대 4개"); - return; - } - const owner = session(); - if (!owner) return; - uploading = true; - render(); - changed(); - void (async () => { - for (const file of files) { - try { - if (file.size > 2097152) throw new Error("파일 크기 초과 · 최대 2MB"); - if (!connected || session() !== owner) - throw new Error("연결 확인 후 파일 다시 선택"); - const response = await fetch("/api/attachments", { - method: "POST", - headers: { - "X-Lina-Session": owner, - "X-Lina-Filename": encodeURIComponent(file.name), - "Content-Type": "application/octet-stream", - }, - body: file, - signal: AbortSignal.timeout(30000), - redirect: "error", - }); - if (!response.ok) { - if (response.status === 413) - throw new Error("파일 크기 초과 · 최대 2MB"); - if (response.status >= 500 && response.status !== 507) - throw new Error("첨부 저장소 오류 · 서버 상태 확인 필요"); - if (response.status === 507) throw new Error("첨부 저장 공간 부족"); - throw new Error( - "첨부 실패 · 텍스트·이미지·PDF·DOCX·XLSX 형식과 파일명 확인", - ); - } - const meta: unknown = await response.json(); - if ( - typeof meta !== "object" || - !meta || - !("id" in meta) || - typeof meta.id !== "string" || - !("name" in meta) || - typeof meta.name !== "string" || - session() !== owner - ) - throw new Error("첨부 결과 미확인 · 자동 재전송 안 함"); - draft.text = input.value; - draft.add({ id: meta.id, name: meta.name, sessionId: owner }); - render(); - changed(); - } catch (error) { - notice(error instanceof Error ? error.message : "첨부 결과 미확인"); - break; - } - } - })().finally(() => { - uploading = false; - render(); - changed(); - }); - }); - return { - port, - get busy() { - return uploading; - }, - update(online: boolean) { - connected = online; - render(); - }, - }; -} -function fileChip( - ref: DraftAttachment, - sessionId: string | undefined, -): HTMLElement { - const row = document.createElement("span"); - row.className = "file-chip"; - if (ref.sessionId !== sessionId) { - row.textContent = `${ref.name} · ${sessionId ? "다른 대화의 첨부" : "연결 후 확인"}`; - return row; - } - const link = document.createElement("a"); - link.href = attachmentHref(ref); - link.textContent = ref.name; - link.title = ref.name; - link.download = ref.name; - const preview = document.createElement("button"); - preview.type = "button"; - preview.textContent = "미리보기"; - preview.addEventListener("click", () => void showPreview(ref)); - row.append(link, preview); - return row; -} -export function renderUserBody( - container: Element, - text: string, - sessionId: string | undefined, -): void { - const draft = new AttachmentDraft(); - draft.value = text; - container.replaceChildren(document.createTextNode(draft.text)); - if (draft.refs.length) { - const files = document.createElement("div"); - files.className = "message-files"; - files.append(...draft.refs.map((ref) => fileChip(ref, sessionId))); - container.append(files); - } -} -async function showPreview(ref: DraftAttachment): Promise { - const dialog = document.createElement("dialog"); - dialog.className = "file-preview"; - dialog.setAttribute("aria-label", `${ref.name} 미리보기`); - const title = document.createElement("strong"); - title.textContent = ref.name; - const close = document.createElement("button"); - close.type = "button"; - close.textContent = "닫기"; - close.addEventListener("click", () => dialog.close()); - const body = document.createElement("div"); - body.textContent = "불러오는 중"; - dialog.append(title, close, body); - document.body.append(dialog); - dialog.addEventListener("close", () => dialog.remove(), { once: true }); - dialog.showModal(); - try { - const response = await fetch(attachmentHref(ref, "/preview"), { - signal: AbortSignal.timeout(10000), - redirect: "error", - }); - if (!response.ok) throw new Error("미리보기 실패"); - const mime = response.headers.get("Content-Type") ?? ""; - if (mime.startsWith("image/png") || mime.startsWith("image/jpeg")) { - const image = document.createElement("img"); - image.alt = ref.name; - // Same-origin URL, not a data/blob URL; server validates format and dimensions. - image.src = attachmentHref(ref, "/preview"); - image.addEventListener( - "error", - () => { - body.textContent = "이미지 표시 실패 · 다운로드 가능"; - }, - { once: true }, - ); - body.replaceChildren(image); - await response.body?.cancel(); - } else if (mime.startsWith("text/plain")) { - const text = await response.text(); - const pre = document.createElement("pre"); - pre.textContent = - text.slice(0, 8192) + - (text.length > 8192 ? "\n… 전체 내용은 다운로드로 확인" : ""); - body.replaceChildren(pre); - } else { - await response.body?.cancel(); - throw new Error("미리보기 미지원"); - } - } catch (error) { - body.textContent = error instanceof Error ? error.message : "미리보기 실패"; - } -} diff --git a/packages/lina-web/client/composer.css b/packages/lina-web/client/composer.css deleted file mode 100644 index 85d2a65..0000000 --- a/packages/lina-web/client/composer.css +++ /dev/null @@ -1,88 +0,0 @@ -.composer-area { - display: flex; - flex-direction: column; - min-height: 0; - padding: 10px 30px 18px; - width: 100%; - max-width: 820px; - align-self: center; -} -.composer { - flex-shrink: 0; - border: 1px solid var(--input-border); - border-radius: 16px; - padding: 15px 15px 12px; - background: var(--input-bg); - box-shadow: none; -} -.composer:focus-within { - border-color: var(--accent); - box-shadow: 0 0 0 2px var(--focus-ring); -} -textarea { - display: block; - width: 100%; - border: none; - outline: none; - resize: none; - min-height: 44px; - max-height: none; - background: transparent; - color: inherit; - font-size: 0.86rem; - line-height: 1.7; -} -textarea:focus-visible { - outline: none; -} -textarea::placeholder { - color: var(--muted); -} -.composer-bottom { - display: flex; - justify-content: space-between; - gap: 12px; - align-items: center; - margin-top: 6px; -} -#composer-hint { - font-size: 0.65rem; - color: var(--muted); - line-height: 1.5; -} -#send { - border: 0; - border-radius: 8px; - padding: 10px 14px; - color: var(--button-text); - background: var(--button-bg); - min-height: 36px; - white-space: nowrap; - font-size: 0.75rem; -} -#send span { - margin-left: 10px; - font-size: 0.95rem; -} -#send:hover:not(:disabled) { - background: var(--button-hover); -} -#send:disabled { - background: var(--disabled-bg); - color: var(--muted); -} - -.work-panels { - min-height: 0; - max-height: 50dvh; - overflow: auto; -} -.execution-bar { - flex-shrink: 0; -} - -.composer-expand { - margin-left: auto; - color: var(--muted); - white-space: nowrap; -} diff --git a/packages/lina-web/client/conversation-app.ts b/packages/lina-web/client/conversation-app.ts deleted file mode 100644 index a71512b..0000000 --- a/packages/lina-web/client/conversation-app.ts +++ /dev/null @@ -1,288 +0,0 @@ -import { createAgents } from "./agents.ts"; -import { createAttachments } from "./attachments.ts"; -import { createComposerSizing } from "./composer-size.ts"; -import { Connection } from "./connection.ts"; -import { ContextModel } from "./context-model.ts"; -import { browserDraftStore } from "./draft.ts"; -import { DurableChatModel } from "./durable-model.ts"; -import { ExecutionModel } from "./execution-model.ts"; -import { createExecutionView } from "./execution-view.ts"; -import { createNavigation } from "./navigation.ts"; -import { shouldSend } from "./preferences.ts"; -import { activityStatus, elapsedText } from "./presence.ts"; -import { installPwa } from "./pwa.ts"; -import { PendingRecovery } from "./recovery.ts"; -import { createRenderer, element, setText } from "./render.ts"; -import { createSearch } from "./search-view.ts"; -import { createSettings } from "./settings.ts"; -import { installTasks } from "./task-view.ts"; - -export function startConversationApp(initialNotice = "") { - const settings = createSettings(); - const queryAgent = new URL(location.href).searchParams.get("agent") ?? "lina"; - const agentId = /^[a-z][a-z0-9-]{0,47}$/.test(queryAgent) - ? queryAgent - : "lina"; - - const model = new DurableChatModel(); - const execution = new ExecutionModel(); - const context = new ContextModel(); - const drafts = browserDraftStore(() => window.localStorage, agentId); - let subscribing = false; - const input = element("message", HTMLTextAreaElement); - const send = element("send", HTMLButtonElement); - const composerSizing = createComposerSizing(input); - const notice = element("notice", HTMLDivElement); - const reconnect = element("reconnect", HTMLButtonElement); - const earlier = element("earlier", HTMLButtonElement); - const latest = element("latest", HTMLButtonElement); - let detail = initialNotice; - const attachments = createAttachments( - input, - () => model.sessionId, - () => { - recovery.edited(); - drafts.saveDraft(attachments.port.value); - update(); - }, - (message) => { - detail = message; - update(); - }, - ); - const textPort = attachments.port; - const restore = (text: string): void => { - textPort.value = text; - recovery.edited(); - drafts.saveDraft(text); - input.focus(); - if (text.length > 16000) detail = "메시지 길이 초과 · 최대 16,000자"; - update(); - }; - const recovery = new PendingRecovery(drafts, textPort, restore, (message) => { - detail = message; - }); - const render = createRenderer( - model, - restore, - (id) => { - const message = model.messages.find((item) => item.id === id); - if ( - model.sessionId && - message?.sourceId && - typeof message.nextOffset === "number" - ) - connection.command({ - type: "entry", - sessionId: model.sessionId, - entryId: message.sourceId, - offset: message.nextOffset, - }); - }, - () => model.sessionId, - ); - - const renderExecution = createExecutionView( - execution, - (frame) => connection.command(frame), - update, - ); - - const search = createSearch((frame) => connection.command(frame)); - const tasks = installTasks({ ownerAgentId: agentId }); - void tasks.refresh(); - createAgents(agentId, () => { - if ( - attachments.busy || - (textPort.value && !drafts.saveDraft(textPort.value)) - ) { - detail = "초안을 저장한 뒤 에이전트를 바꿔주세요."; - update(); - return false; - } - return true; - }); - const renderNavigation = createNavigation(settings, (opener) => - search.open(opener), - ); - - const presence = element("presence", HTMLDivElement); - const presenceLabel = element("presence-label", HTMLSpanElement); - const elapsed = element("presence-elapsed", HTMLSpanElement); - let elapsedTimer: ReturnType | undefined; - function renderPresence(): void { - if (elapsedTimer) clearTimeout(elapsedTimer); - const status = activityStatus({ - connected: model.connected, - running: model.running, - pending: model.pendingId !== undefined, - requestStartedAt: model.requestStartedAt( - execution.state?.cancelRequestId, - ), - control: execution.connected ? execution.state : undefined, - contextBusy: context.state?.busy === true, - }); - presence.hidden = !status; - presence.dataset["moving"] = String(status?.moving === true); - setText(presenceLabel, status?.label ?? ""); - const time = elapsedText(status?.startedAt, Date.now()); - setText(elapsed, time ? `· ${time}` : ""); - if (status?.moving && status.startedAt) - elapsedTimer = setTimeout(renderPresence, 1000); - } - - function update(): void { - composerSizing.update(); - attachments.update(model.connected); - render(); - renderNavigation(model); - search.connect(model.connected, model.sessionId); - renderExecution(); - context.connected = model.connected; - context.running = model.running; - - element("welcome", HTMLElement).hidden = - model.messages.length > 0 || model.running; - send.disabled = - !model.connected || - attachments.busy || - !model.sessionId || - model.pendingId !== undefined || - execution.state?.cancelling === true || - context.state?.busy === true || - textPort.value.length > 16000 || - textPort.value.trim().length === 0; - const state = element("connection-status", HTMLSpanElement); - setText(state, model.connected ? "연결됨" : "연결 대기"); - state.hidden = model.connected; - renderPresence(); - state.className = `connection-status${model.connected ? " online" : ""}`; - element("agent-dot", HTMLSpanElement).className = - `agent-dot${model.connected ? " online" : ""}`; - reconnect.hidden = model.connected; - const shownDetail = - textPort.value.length > 16000 - ? "메시지 길이 초과 · 최대 16,000자" - : detail; - notice.hidden = shownDetail.length === 0; - setText(notice, shownDetail); - earlier.hidden = !model.hasEarlier; - earlier.disabled = !model.connected; - latest.hidden = !model.hasNewer; - latest.disabled = !model.connected; - } - - const connection = new Connection( - `${location.protocol === "https:" ? "wss:" : "ws:"}//${location.host}/ws${agentId === "lina" ? "" : `?agent=${agentId}`}`, - { - frame(frame) { - if (frame.type === "agent-status" && !subscribing) { - subscribing = true; - connection.command({ type: "subscribe", version: 2 }); - } - search.receive(frame); - model.receive(frame); - if (frame.type === "snapshot") context.bindSession(model.sessionId); - if (frame.type === "context-state" || frame.type === "context-error") - context.receive(frame); - if (frame.type === "snapshot") execution.bindSession(model.sessionId); - if (frame.type === "control-state" || frame.type === "control-error") - execution.receive(frame, model.sessionId); - if (frame.type === "snapshot") detail = ""; - recovery.receive(frame, model.sessionId); - update(); - }, - disconnected() { - subscribing = false; - model.disconnect(); - execution.disconnect(); - context.disconnect(); - recovery.disconnected(); - update(); - }, - notice(message) { - detail = message; - update(); - }, - }, - ); - - element("composer", HTMLFormElement).addEventListener("submit", (event) => { - event.preventDefault(); - const text = textPort.value.trim(); - if (send.disabled || !model.sessionId) return; - const request = recovery.prepare(text, model.sessionId); - if (!request) { - update(); - return; - } - const { id } = request; - if (!model.send(id, text)) return; - recovery.sent(request); - textPort.value = ""; - drafts.saveDraft(""); - if ( - !connection.send({ type: "chat", sessionId: model.sessionId, id, text }) - ) { - model.disconnect(); - textPort.value = text; - drafts.saveDraft(text); - } - update(); - input.focus(); - }); - input.addEventListener("input", () => { - recovery.edited(); - drafts.saveDraft(textPort.value); - update(); - }); - earlier.addEventListener("click", () => { - if (model.sessionId && model.beforeCursor !== null) - connection.command({ - type: "history", - sessionId: model.sessionId, - before: model.beforeCursor, - }); - }); - latest.addEventListener("click", () => { - model.showLatest(); - connection.command({ type: "subscribe", version: 2 }); - const scroll = element("conversation-scroll", HTMLDivElement); - scroll.scrollTop = scroll.scrollHeight; - }); - input.addEventListener("keydown", (event) => { - if (!shouldSend(event, settings.preferences.sendKey)) return; - event.preventDefault(); - if (!send.disabled) element("composer", HTMLFormElement).requestSubmit(); - }); - for (const button of document.querySelectorAll( - "[data-prompt]", - )) { - button.addEventListener("click", () => - restore(button.getAttribute("data-prompt") ?? ""), - ); - } - reconnect.addEventListener("click", () => { - detail = ""; - connection.connect(); - }); - window.addEventListener("pagehide", () => { - connection.stop(); - if (elapsedTimer) clearTimeout(elapsedTimer); - tasks.close(); - }); - window.addEventListener("pageshow", (event) => { - if (event.persisted) connection.resume(); - }); - connection.connect(); - - installPwa(drafts, () => textPort.value); - window.addEventListener("offline", () => { - connection.connect(); - update(); - }); - window.addEventListener("online", () => { - connection.connect(); - update(); - }); -} diff --git a/packages/lina-web/client/model-combobox.ts b/packages/lina-web/client/model-combobox.ts deleted file mode 100644 index 4bf5ed0..0000000 --- a/packages/lina-web/client/model-combobox.ts +++ /dev/null @@ -1,285 +0,0 @@ -import type { SettingsDocument, SettingsNode } from "./model-settings.ts"; - -export interface ModelChoice { - value: string; - label: string; - search?: string; - inherited?: boolean; -} -export interface ComboboxBox { - top: number; - bottom: number; -} -export interface ComboboxListFit { - placement: "above" | "below"; - maxHeight: number; -} -type Measurable = { - getBoundingClientRect?: () => ComboboxBox; - closest?: (selector: string) => Measurable | null; - querySelector?: (selector: string) => Measurable | null; - style?: { maxHeight: string }; -}; - -export const COMBOBOX_LIST_GAP = 5; -export const COMBOBOX_LIST_MAX = 220; -const PREFER_BELOW = 120; - -/** Keep the popup inside a clip (dialog/scrollport), flipping above sticky actions when needed. */ -export function fitComboboxList(args: { - input: ComboboxBox; - clip: ComboboxBox; - obstacle?: ComboboxBox | null; - gap?: number; - max?: number; - preferBelow?: number; -}): ComboboxListFit { - const gap = args.gap ?? COMBOBOX_LIST_GAP; - const max = args.max ?? COMBOBOX_LIST_MAX; - const preferBelow = args.preferBelow ?? PREFER_BELOW; - const belowLimit = - args.obstacle && args.obstacle.top < args.clip.bottom - ? Math.min(args.clip.bottom, args.obstacle.top) - : args.clip.bottom; - const below = Math.max(0, belowLimit - args.input.bottom - gap); - const above = Math.max(0, args.input.top - args.clip.top - gap); - const placement = below >= preferBelow || below >= above ? "below" : "above"; - return { - placement, - maxHeight: Math.max( - 0, - Math.min(max, placement === "below" ? below : above), - ), - }; -} - -export function placedComboboxList( - input: ComboboxBox, - fit: ComboboxListFit, - gap = COMBOBOX_LIST_GAP, -): ComboboxBox { - if (fit.placement === "below") { - const top = input.bottom + gap; - return { top, bottom: top + fit.maxHeight }; - } - const bottom = input.top - gap; - return { top: bottom - fit.maxHeight, bottom }; -} - -/** Editable combobox. DOM focus stays on the input while arrows move the active option. */ -export function createModelCombobox( - doc: SettingsDocument, - id: string, - label: string, - change: (value: string) => void, -) { - const root = doc.createElement("div"); - root.className = "model-combobox"; - const input = doc.createElement("input"); - input.id = `${id}-input`; - input.type = "text"; - input.setAttribute("role", "combobox"); - input.setAttribute("aria-label", label); - input.setAttribute("aria-autocomplete", "list"); - input.setAttribute("aria-expanded", "false"); - input.setAttribute("aria-controls", `${id}-list`); - input.setAttribute("autocomplete", "off"); - input.setAttribute("placeholder", "모델 검색…"); - const list = doc.createElement("div"); - list.id = `${id}-list`; - list.className = "model-combobox-list"; - list.setAttribute("role", "listbox"); - list.setAttribute("aria-label", `${label} 목록`); - list.hidden = true; - const empty = doc.createElement("p"); - empty.id = `${id}-empty`; - empty.className = "agent-hint"; - empty.setAttribute("role", "status"); - empty.hidden = true; - root.append(input, list, empty); - list.addEventListener("mousedown", (e) => e.preventDefault()); - let choices: ModelChoice[] = [], - selected = "", - display = "모델 선택…", - opened = false, - query = "", - active = -1; - let matched: ModelChoice[] = [], - nodes: SettingsNode[] = []; - const listStyle = (list as SettingsNode & Measurable).style; - const normalize = (v: string) => - v.trim().replace(/\s+/g, " ").toLocaleLowerCase(); - const highlight = () => { - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i]; - if (!node) continue; - node.setAttribute("data-active", String(i === active)); - } - const node = nodes[active]; - if (node) { - input.setAttribute("aria-activedescendant", node.id); - node.scrollIntoView?.({ block: "nearest" }); - } else input.removeAttribute("aria-activedescendant"); - }; - const clearPlacement = () => { - root.removeAttribute("data-open"); - root.removeAttribute("data-placement"); - if (listStyle) listStyle.maxHeight = ""; - }; - const place = () => { - if (!opened) return; - root.setAttribute("data-open", "true"); - const host = input as SettingsNode & Measurable; - const inputBox = host.getBoundingClientRect?.(); - const clipEl = - host.closest?.(".settings-content") ?? host.closest?.("dialog"); - const clipBox = clipEl?.getBoundingClientRect?.(); - if (!inputBox || !clipBox) return; - const obstacle = (host.closest?.("dialog") ?? clipEl) - ?.querySelector?.(".model-actions") - ?.getBoundingClientRect?.(); - const fit = fitComboboxList({ - input: inputBox, - clip: clipBox, - obstacle: obstacle ?? null, - }); - root.setAttribute("data-placement", fit.placement); - if (listStyle) listStyle.maxHeight = `${Math.floor(fit.maxHeight)}px`; - }; - const close = () => { - opened = false; - list.hidden = true; - empty.hidden = true; - input.setAttribute("aria-expanded", "false"); - input.removeAttribute("aria-activedescendant"); - input.value = display; - clearPlacement(); - }; - const commit = (item: ModelChoice) => { - selected = item.value; - display = item.label; - close(); - change(item.value); - }; - const render = () => { - const needle = normalize(query); - matched = choices.filter( - (c) => - !needle || - needle - .split(" ") - .every((part) => - normalize(`${c.label} ${c.search ?? ""}`).includes(part), - ), - ); - if (needle) - matched.sort((a, b) => Number(!!a.inherited) - Number(!!b.inherited)); - list.replaceChildren(); - nodes = []; - // Only configured models are supplied; all matches remain keyboard reachable. - for (const [i, item] of matched.entries()) { - const node = doc.createElement("div"); - node.id = `${id}-option-${i}`; - node.setAttribute("role", "option"); - node.setAttribute("aria-selected", String(item.value === selected)); - node.textContent = item.label; - node.addEventListener("mousedown", (e) => e.preventDefault()); - node.addEventListener("click", () => commit(item)); - list.append(node); - nodes.push(node); - } - empty.hidden = matched.length > 0; - empty.textContent = matched.length ? "" : "검색 결과가 없습니다."; - active = -1; - highlight(); - place(); - }; - const open = () => { - if (input.disabled || opened) return; - opened = true; - query = ""; - list.hidden = false; - input.setAttribute("aria-expanded", "true"); - render(); - input.select?.(); - }; - input.addEventListener("focus", open); - input.addEventListener("click", () => { - open(); - input.select?.(); - }); - input.addEventListener("input", () => { - if (input.disabled) return; - query = input.value; - opened = true; - list.hidden = false; - input.setAttribute("aria-expanded", "true"); - render(); - }); - input.addEventListener("keydown", (event) => { - if (event.key === "Escape" && opened) { - event.preventDefault(); - event.stopPropagation(); - close(); - return; - } - if (event.key === "Tab") { - close(); - return; - } - if (event.key === "ArrowDown" || event.key === "ArrowUp") { - event.preventDefault(); - open(); - if (!matched.length) return; - active = - event.key === "ArrowDown" - ? (active + 1) % matched.length - : active <= 0 - ? matched.length - 1 - : active - 1; - highlight(); - return; - } - if (event.key === "Enter" && opened) { - event.preventDefault(); - const item = matched[active < 0 ? 0 : active]; - if (item) commit(item); - } - }); - root.addEventListener("focusout", (e) => { - if (!root.contains(e.relatedTarget)) close(); - }); - const view = globalThis as { - addEventListener?( - type: string, - listener: () => void, - options?: boolean, - ): void; - }; - view.addEventListener?.("resize", place); - view.addEventListener?.("scroll", place, true); - return { - root, - input, - close, - set( - items: ModelChoice[], - value: string, - labelText: string, - disabled = false, - ) { - choices = items; - selected = value; - display = labelText; - input.disabled = disabled; - input.setAttribute("title", labelText); - if (opened) { - render(); - } else input.value = display; - }, - disable(value: boolean) { - input.disabled = value; - if (value) close(); - }, - }; -} diff --git a/packages/lina-web/client/navigation.ts b/packages/lina-web/client/navigation.ts deleted file mode 100644 index 3d89be6..0000000 --- a/packages/lina-web/client/navigation.ts +++ /dev/null @@ -1,198 +0,0 @@ -import type { ChatModel } from "./model.ts"; -import { element, setText } from "./render.ts"; -import type { createSettings } from "./settings.ts"; -import { installSidebarResize } from "./sidebar-resize.ts"; - -export function createNavigation( - settings: ReturnType, - openSearch: (opener: HTMLElement) => void, -) { - installSidebarResize(settings); - const sidebar = element("sidebar", HTMLElement), - workspace = sidebar.parentElement; - if (!workspace) throw Error("Missing workspace"); - const drawer = element("sidebar-drawer", HTMLDialogElement), - open = element("open-sidebar", HTMLButtonElement), - collapse = element("collapse-sidebar", HTMLButtonElement); - const account = element("account-button", HTMLButtonElement), - menu = element("account-menu", HTMLDivElement), - search = element("open-search", HTMLButtonElement), - shortcuts = element("shortcuts-dialog", HTMLDialogElement); - const mobile = matchMedia("(max-width: 767px)"), - mac = /Mac|iPhone|iPad/.test(navigator.platform), - modifier = mac ? "⌘" : "Ctrl"; - setText(element("search-shortcut", HTMLElement), `${modifier} K`); - setText(element("settings-shortcut", HTMLElement), `${modifier} ,`); - setText(element("modifier-send-label", HTMLElement), `${modifier} + Enter`); - for (const label of shortcuts.querySelectorAll( - "[data-shortcut]", - )) - setText(label, `${modifier} ${label.dataset["shortcut"]?.toUpperCase()}`); - const items = Array.from(menu.querySelectorAll("button")); - const closeMenu = (focus = false) => { - menu.hidden = true; - account.setAttribute("aria-expanded", "false"); - if (focus) account.focus(); - }; - const restoreSidebar = () => { - workspace.prepend(sidebar); - open.setAttribute("aria-expanded", "false"); - }; - const closeDrawer = () => { - closeMenu(); - if (drawer.open) drawer.close(); - restoreSidebar(); - }; - const opener = () => (mobile.matches ? open : account); - const prepare = () => { - const target = opener(); - closeMenu(); - closeDrawer(); - return target; - }; - const openSettings = () => { - const target = prepare(); - shortcuts.close(); - settings.open(target); - }; - const showSearch = () => { - const target = mobile.matches ? open : search; - prepare(); - shortcuts.close(); - element("settings-dialog", HTMLDialogElement).close(); - openSearch(target); - }; - account.addEventListener("click", () => { - if (!menu.hidden) { - closeMenu(); - return; - } - menu.hidden = false; - account.setAttribute("aria-expanded", "true"); - items[0]?.focus(); - }); - menu.addEventListener("keydown", (event) => { - if (event.key === "Escape") { - event.preventDefault(); - event.stopPropagation(); - closeMenu(true); - return; - } - if (event.key === "Tab") { - closeMenu(true); - return; - } - const index = items.indexOf(document.activeElement as HTMLButtonElement); - if (["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) { - event.preventDefault(); - const next = - event.key === "Home" - ? 0 - : event.key === "End" - ? items.length - 1 - : (index + (event.key === "ArrowDown" ? 1 : -1) + items.length) % - items.length; - items[next]?.focus(); - } - }); - document.addEventListener("pointerdown", (event) => { - if ( - event.target instanceof Node && - !menu.contains(event.target) && - !account.contains(event.target) - ) - closeMenu(); - }); - element("open-settings", HTMLButtonElement).addEventListener( - "click", - openSettings, - ); - element("open-shortcuts", HTMLButtonElement).addEventListener("click", () => { - const target = prepare(); - shortcuts.showModal(); - shortcuts.addEventListener("close", () => target.focus(), { once: true }); - }); - for (const button of shortcuts.querySelectorAll("[data-close]")) - button.addEventListener("click", () => shortcuts.close()); - shortcuts.addEventListener("click", (event) => { - if (event.target === shortcuts) { - const r = shortcuts.getBoundingClientRect(); - if ( - event.clientX < r.left || - event.clientX > r.right || - event.clientY < r.top || - event.clientY > r.bottom - ) - shortcuts.close(); - } - }); - search.addEventListener("click", showSearch); - open.addEventListener("click", () => { - drawer.append(sidebar); - drawer.showModal(); - open.setAttribute("aria-expanded", "true"); - }); - element("close-sidebar", HTMLButtonElement).addEventListener( - "click", - closeDrawer, - ); - drawer.addEventListener("close", restoreSidebar); - drawer.addEventListener("click", (event) => { - if (event.target === drawer) closeDrawer(); - }); - mobile.addEventListener("change", () => { - if (!mobile.matches) closeDrawer(); - }); - const updateCollapse = () => { - collapse.setAttribute( - "aria-expanded", - String(!settings.preferences.sidebarCollapsed), - ); - collapse.setAttribute( - "aria-label", - settings.preferences.sidebarCollapsed - ? "사이드바 펼치기" - : "사이드바 접기", - ); - }; - collapse.addEventListener("click", () => { - settings.update({ - sidebarCollapsed: !settings.preferences.sidebarCollapsed, - }); - updateCollapse(); - }); - updateCollapse(); - element("open-lina", HTMLButtonElement).addEventListener("click", () => { - closeDrawer(); - element("message", HTMLTextAreaElement).focus(); - }); - document.addEventListener("keydown", (event) => { - if (event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) - return; - if (event.key.toLowerCase() === "k" || event.code === "KeyK") { - event.preventDefault(); - showSearch(); - } - if (event.key === ",") { - event.preventDefault(); - element("search-dialog", HTMLDialogElement).close(); - openSettings(); - } - }); - return (model: ChatModel) => { - const last = model.messages.findLast( - (m) => m.role === "assistant" || m.role === "user", - ); - setText( - element("agent-preview", HTMLElement), - last?.text.trim().startsWith("```") - ? "코드 답변" - : last?.text - .split(/\r?\n/) - .find((line) => line.trim()) - ?.replace(/^#{1,6}\s*/, "") - .replace(/[`*_]/g, "") - .slice(0, 100) || "대화 시작", - ); - }; -} diff --git a/packages/lina-web/client/settings-tab-model.ts b/packages/lina-web/client/settings-tab-model.ts deleted file mode 100644 index 29b00de..0000000 --- a/packages/lina-web/client/settings-tab-model.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const SETTINGS_TABS = ["general", "connections", "models"] as const; -export type SettingsTab = (typeof SETTINGS_TABS)[number]; - -export function nextSettingsTab( - current: SettingsTab, - key: string, -): SettingsTab | null { - if (key === "Home") return "general"; - if (key === "End") return "models"; - const delta = - key === "ArrowRight" || key === "ArrowDown" - ? 1 - : key === "ArrowLeft" || key === "ArrowUp" - ? -1 - : 0; - return delta - ? (SETTINGS_TABS[ - (SETTINGS_TABS.indexOf(current) + delta + SETTINGS_TABS.length) % - SETTINGS_TABS.length - ] ?? current) - : null; -} diff --git a/packages/lina-web/client/settings-tabs.ts b/packages/lina-web/client/settings-tabs.ts deleted file mode 100644 index 06569fd..0000000 --- a/packages/lina-web/client/settings-tabs.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - nextSettingsTab, - SETTINGS_TABS, - type SettingsTab, -} from "./settings-tab-model.ts"; - -export function installSettingsTabs( - root: HTMLElement, - changed: (tab: SettingsTab) => void, -) { - let current: SettingsTab = "general"; - const navigation = root.querySelector('[role="tablist"]'); - const mobile = window.matchMedia("(max-width: 767px)"); - const orientation = () => - navigation?.setAttribute( - "aria-orientation", - mobile.matches ? "horizontal" : "vertical", - ); - orientation(); - mobile.addEventListener("change", orientation); - const buttons = SETTINGS_TABS.map((id) => { - const button = root.querySelector(`#settings-tab-${id}`); - const panel = root.querySelector(`#settings-panel-${id}`); - if (!button || !panel) throw Error("Missing settings panel"); - return { id, button, panel }; - }); - const select = (id: SettingsTab, focus = false) => { - if (id !== current) - root - .querySelector(".settings-content") - ?.scrollTo({ top: 0 }); - current = id; - for (const item of buttons) { - const selected = item.id === id; - item.button.setAttribute("aria-selected", String(selected)); - item.button.tabIndex = selected ? 0 : -1; - item.panel.hidden = !selected; - if (selected && focus) item.button.focus(); - } - changed(id); - }; - for (const { id, button } of buttons) { - button.addEventListener("click", () => select(id)); - button.addEventListener("keydown", (event) => { - const next = nextSettingsTab(current, event.key); - if (!next) return; - event.preventDefault(); - select(next, true); - }); - } - return { - select, - get current() { - return current; - }, - }; -} diff --git a/packages/lina-web/client/tokens.css b/packages/lina-web/client/tokens.css deleted file mode 100644 index 93655c5..0000000 --- a/packages/lina-web/client/tokens.css +++ /dev/null @@ -1,52 +0,0 @@ -:root { - color-scheme: dark; - --app-bg: #17181b; - --surface-main: #222326; - --surface-sidebar: #1b1c1f; - --surface-inspector: #1e1f22; - --surface-raised: #2b2c30; - --input-bg: #292a2e; - --input-border: #72747e; - --text: #eeeef1; - --muted: #b0b1b9; - --line: #393a40; - --line-strong: #55575f; - --accent: #83afff; - --accent-hover: #aac8ff; - --selection: #29364d; - --button-bg: #e5e5e9; - --button-text: #242428; - --button-hover: #fafafb; - --disabled-bg: #35363b; - --success: #a0c6ad; - --warning: #e8b680; - --danger: #f0a5a1; - --focus-ring: #83afff24; - --tint: var(--surface-raised); - --rail-text: var(--muted); -} -:root[data-theme="light"] { - color-scheme: light; - --app-bg: #eaeaec; - --surface-main: #ffffff; - --surface-sidebar: #f4f4f6; - --surface-inspector: #fafafa; - --surface-raised: #f0f0f3; - --input-bg: #fbfbfc; - --input-border: #858791; - --text: #242428; - --muted: #66666e; - --line: #e0e0e5; - --line-strong: #b2b3bb; - --accent: #345fa8; - --accent-hover: #244b90; - --selection: #e7edf7; - --button-bg: #2b2b30; - --button-text: #ffffff; - --button-hover: #101014; - --disabled-bg: #e7e7eb; - --success: #326649; - --warning: #875922; - --danger: #a03935; - --focus-ring: #345fa824; -} diff --git a/packages/lina-web/client/tsconfig.json b/packages/lina-web/client/tsconfig.json deleted file mode 100644 index 1fc574f..0000000 --- a/packages/lina-web/client/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { "lib": ["ESNext", "DOM", "DOM.Iterable"], "types": [] }, - "include": ["./*.ts", "../src/protocol.ts"], - "exclude": [] -} diff --git a/packages/lina-web/scripts/qa-pwa.ts b/packages/lina-web/scripts/qa-pwa.ts index 10231eb..700d46e 100644 --- a/packages/lina-web/scripts/qa-pwa.ts +++ b/packages/lina-web/scripts/qa-pwa.ts @@ -51,7 +51,7 @@ process.on("SIGUSR1", () => { void (async () => { await web.stop(true); const original = await loadWebAssets(); - const client = new URL("../client/", import.meta.url); + const client = new URL("../../lina-ui/client/", import.meta.url); const fresh = { ...original, ...createPwaAssets( diff --git a/packages/lina-web/src/assets.ts b/packages/lina-web/src/assets.ts index d55a2d9..bca788e 100644 --- a/packages/lina-web/src/assets.ts +++ b/packages/lina-web/src/assets.ts @@ -11,6 +11,8 @@ async function buildClientEntry(entry: URL): Promise { fileURLToPath(entry), "--target=browser", "--minify", + "--define", + 'process.env.NODE_ENV="production"', ], { cwd: fileURLToPath(new URL(".", entry)), @@ -30,14 +32,23 @@ async function buildClientEntry(entry: URL): Promise { } export async function loadWebAssets(): Promise { - const client = new URL("../client/", import.meta.url); - const [script, css, themeScript] = await Promise.all( + const client = new URL("../../lina-ui/client/", import.meta.url); + const [builtScript, css, themeScript] = await Promise.all( ["app.ts", "styles.css", "theme-boot.ts"].map((entry) => buildClientEntry(new URL(entry, client)), ), ); - if (script === undefined || css === undefined || themeScript === undefined) + if ( + builtScript === undefined || + css === undefined || + themeScript === undefined + ) throw new Error("Missing web assets"); + const licenses = await Bun.file( + new URL("../THIRD_PARTY_LICENSES.txt", client), + ).text(); + // The same output is served on web and bundled into Electron's ASAR. + const script = `/*!\n${licenses.replaceAll("*/", "* /")}\n*/\n${builtScript}`; const base = { icon: await Bun.file(new URL("favicon.svg", client)).text(), html: await Bun.file(new URL("index.html", client)).text(), diff --git a/packages/lina-web/src/protocol.ts b/packages/lina-web/src/protocol.ts index 223aba2..61a3727 100644 --- a/packages/lina-web/src/protocol.ts +++ b/packages/lina-web/src/protocol.ts @@ -1,79 +1 @@ -export const MAX_CHAT_LENGTH = 16_000; -export type ChatFrame = { - readonly type: "chat"; - readonly id: string; - readonly text: string; -}; -export type ServerFrame = - | ContextServer - | ControlServer - | WireServer - | { readonly type: "ack"; readonly id: string } - | { readonly type: "error"; readonly message: string } - | { readonly type: "agent-text" | "agent-thinking"; readonly text: string } - | { readonly type: "agent-status"; readonly state: "running" | "idle" }; - -function isRecord(value: unknown): value is Record { - return typeof value === "object" && value !== null && !Array.isArray(value); -} - -function record(raw: unknown): Record | undefined { - if (typeof raw !== "string" || raw.length > 1_048_576) return; - try { - const value: unknown = JSON.parse(raw); - if (isRecord(value)) return value; - } catch { - /* Invalid network frames carry no trusted data. */ - } - return; -} - -export function parseChat(raw: unknown): ChatFrame | undefined { - const value = parseWireClient(raw); - return value?.type === "chat" ? value : undefined; -} - -export function parseServerFrame(raw: unknown): ServerFrame | undefined { - const context = parseContextServer(raw); - if (context) return context; - const control = parseControlServer(raw); - if (control) return control; - const durable = parseWireServer(raw); - if (durable) return durable; - const value = record(raw); - if (value === undefined) return; - const { type, id, message, text, state } = value; - switch (type) { - case "ack": - return typeof id === "string" && id.length > 0 - ? { type: "ack", id } - : undefined; - case "error": - return typeof message === "string" - ? { type: "error", message } - : undefined; - case "agent-text": - case "agent-thinking": - return typeof text === "string" ? { type, text } : undefined; - case "agent-status": - return state === "idle" || state === "running" - ? { type: "agent-status", state } - : undefined; - default: - return; - } -} - -import { - type ContextServer, - parseContextServer, -} from "../../lina-core/src/context-wire.ts"; -import { - type ControlServer, - parseControlServer, -} from "../../lina-core/src/control-wire.ts"; -import { - parseWireClient, - parseWireServer, - type WireServer, -} from "../../lina-core/src/wire.ts"; +export * from "../../lina-client/src/protocol.ts"; diff --git a/packages/lina-web/src/server.ts b/packages/lina-web/src/server.ts index b3ea9dc..cb1ee33 100644 --- a/packages/lina-web/src/server.ts +++ b/packages/lina-web/src/server.ts @@ -1,11 +1,11 @@ import type { ServerWebSocket } from "bun"; +import { parseServerFrame } from "../../lina-client/src/protocol.ts"; import { parseContextClient } from "../../lina-core/src/context-wire.ts"; import { parseControlClient } from "../../lina-core/src/control-wire.ts"; import { parseWireClient } from "../../lina-core/src/wire.ts"; import { createAccessPolicy } from "./access.ts"; import { proxyAgents } from "./agent-proxy.ts"; import { proxyAttachment } from "./attachment-proxy.ts"; -import { parseServerFrame } from "./protocol.ts"; import type { PwaAssets } from "./pwa-assets.ts"; diff --git a/packages/lina-web/test/agent-draft.test.ts b/packages/lina-web/test/agent-draft.test.ts index 36750cf..d4219a2 100644 --- a/packages/lina-web/test/agent-draft.test.ts +++ b/packages/lina-web/test/agent-draft.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test"; -import { DraftStore } from "../client/draft.ts"; +import { DraftStore } from "../../lina-client/src/draft.ts"; test("agent drafts and unresolved sends stay separate while legacy Lina keys remain", () => { const data = new Map(); diff --git a/packages/lina-web/test/agent-editor.test.ts b/packages/lina-web/test/agent-editor.test.ts index 74c9781..9b15e2f 100644 --- a/packages/lina-web/test/agent-editor.test.ts +++ b/packages/lina-web/test/agent-editor.test.ts @@ -9,7 +9,7 @@ import { createAgentPicker, type EditorDependencies, type EditorNode, -} from "../client/agent-editor.ts"; +} from "../../lina-ui/client/agent-editor.ts"; type Listener = (event: FakeEvent) => void; class FakeEvent { diff --git a/packages/lina-web/test/agent-list.test.ts b/packages/lina-web/test/agent-list.test.ts new file mode 100644 index 0000000..d388e4d --- /dev/null +++ b/packages/lina-web/test/agent-list.test.ts @@ -0,0 +1,312 @@ +import { expect, test } from "bun:test"; +import { + type AgentConversationSummary, + AgentListModel, + type AgentListProfile, + publicMessagePreview, + summaryFromSnapshot, +} from "../../lina-client/src/agent-list.ts"; +import type { SessionSnapshot } from "../../lina-core/src/protocol.ts"; + +const profiles: AgentListProfile[] = [ + { id: "lina", name: "Lina", role: "개인 에이전트", avatarId: null }, + { id: "writer", name: "긴 이름 작가", role: "글쓰기", avatarId: null }, + { id: "research", name: "Research", role: "자료 조사", avatarId: null }, +]; +const snapshot = (seq = 2): SessionSnapshot => ({ + version: 2, + botId: "writer", + sessionId: "conversation-writer", + revision: seq, + state: "idle", + requests: [], + hasEarlier: false, + beforeCursor: 1, + messages: [ + { + entryId: `reply-${seq}`, + seq, + role: "assistant", + text: "내일 이어서 이야기해요.", + timestamp: "2026-09-07T13:18:00Z", + truncated: false, + }, + ], +}); +const summary = (seq = 2): AgentConversationSummary => + summaryFromSnapshot(snapshot(seq), 0); + +test("selection, summaries and drafts preserve every agent in server order", () => { + const model = new AgentListModel("writer"); + model.replace(profiles); + model.updateSummary(summary()); + model.setDraft("research", "새 초안"); + model.setCurrent("research"); + expect(model.rows().map((row) => row.id)).toEqual([ + "lina", + "writer", + "research", + ]); + expect( + model + .rows() + .filter((row) => row.selected) + .map((row) => row.id), + ).toEqual(["research"]); + model.setFilter(" 글쓰기 "); + expect(model.rows().map((row) => row.id)).toEqual(["writer"]); + model.setFilter("RESEARCH"); + expect(model.rows().map((row) => row.id)).toEqual(["research"]); +}); + +test("confirmation outranks draft, draft outranks message and neither changes message time", () => { + const model = new AgentListModel("writer"); + model.replace(profiles); + model.updateSummary({ ...summary(), confirmationCount: 2 }); + model.setDraft("writer", "아직 보내지 않은 말"); + expect(model.rows()[1]?.preview).toBe("확인 필요 · 2건"); + model.setCurrent("writer"); + expect(model.rows()[1]?.confirmationCount).toBe(2); + model.updateSummary(summary(3)); + expect(model.rows()[1]?.preview).toBe("초안: 아직 보내지 않은 말"); + expect(model.rows()[1]?.timestamp).toBe("2026-09-07T13:18:00Z"); + model.setDraft("writer", ""); + expect(model.rows()[1]?.preview).toBe("내일 이어서 이야기해요."); +}); + +test("unread requires a visible cursor, survives selection and is separate from confirmation", () => { + const model = new AgentListModel("writer"); + model.replace(profiles); + model.updateSummary(summary()); + expect(model.rows()[1]?.unread).toBe(false); + model.markVisible("writer", "wrong-session", 2); + model.updateSummary(summary(3)); + expect(model.rows()[1]?.unread).toBe(false); + model.markVisible("writer", "conversation-writer", 3); + model.updateSummary({ ...summary(4), confirmationCount: 1 }); + model.setCurrent("writer"); + expect(model.rows()[1]?.unread).toBe(true); + model.markVisible("writer", "conversation-writer", 999); + expect(model.rows()[1]?.unread).toBe(true); + model.markVisible("writer", "conversation-writer", 4); + expect(model.rows()[1]?.unread).toBe(false); + expect(model.rows()[1]?.confirmationCount).toBe(1); +}); + +test("stale revisions do not overwrite public messages; unavailable is not an empty conversation", () => { + const model = new AgentListModel("writer"); + model.replace(profiles); + expect(model.rows()[1]?.preview).toBe("대화 요약을 불러오는 중…"); + model.updateSummary(summary(5)); + model.updateSummary(summary(2)); + expect(model.rows()[1]?.messageSequence).toBe(5); + model.summariesFailed(); + expect(model.rows()[1]?.summaryUnavailable).toBe(true); + expect(model.rows()[1]?.preview).toBe("내일 이어서 이야기해요."); + expect(model.rows()[0]?.preview).toBe("대화 요약을 불러오지 못했어요"); +}); + +test("snapshot projection excludes tool/meta text and does not label missing approvals as zero", () => { + const value = snapshot(); + value.messages.push({ + ...{ + entryId: "tool", + text: "", + timestamp: "2026-09-07T00:00:00Z", + truncated: false, + }, + seq: 99, + role: "tool", + text: "INTERNAL SECRET", + }); + const result = summaryFromSnapshot(value); + expect(result.latestMessage?.seq).toBe(2); + expect(result.confirmationCount).toBeNull(); + expect(publicMessagePreview({ role: "user", text: "내일\n봐요" })).toBe( + "나: 내일 봐요", + ); + expect( + publicMessagePreview({ role: "assistant", text: "```ts\nconst x=1\n```" }), + ).toBe("코드 답변"); + expect( + publicMessagePreview({ + role: "user", + text: "[보고서.pdf](/api/attachments/11111111-1111-1111-1111-111111111111?sessionId=22222222-2222-2222-2222-222222222222)", + }), + ).toBe("나: 보고서.pdf"); +}); + +test("GET agents reads persisted public summaries after restart without opening an engine", async () => { + const { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } = + await import("node:fs"); + const { tmpdir } = await import("node:os"); + const { join } = await import("node:path"); + const { DurableStore } = await import("../../lina-core/src/store.ts"); + const { AgentFleet } = await import( + "../../lina-runtime/src/fleet/manager.ts" + ); + const { startFleetServer } = await import( + "../../lina-runtime/src/fleet/server.ts" + ); + const root = mkdtempSync(join(tmpdir(), "lina-list-test-")); + let opened = 0; + const fleet = new AgentFleet({ + workspace: root, + resourceRoot: process.cwd(), + stateRoot: root, + agentDir: join(root, "auth"), + systemPrompt: "test", + createApp: async () => { + opened++; + throw Error("must not open"); + }, + }); + const primary = fleet.presets.find((profile) => profile.id === "lina"); + if (!primary) throw Error("Missing primary"); + fleet.agents.create({ ...primary, id: "writer", name: "Writer" }); + fleet.agents.create({ ...primary, id: "unopened", name: "Unopened" }); + const writerRoot = join(root, "agents", "writer"); + mkdirSync(writerRoot, { recursive: true }); + const binding = { + version: 1 as const, + botId: "writer", + sessionId: "writer-session", + sessionFile: join(writerRoot, "session.jsonl"), + workspace: root, + }; + writeFileSync(join(writerRoot, "binding.json"), JSON.stringify(binding)); + const path = join(writerRoot, "state.sqlite"); + const store = new DurableStore(path, binding); + store.appendEntry({ + entryId: "public", + role: "assistant", + text: "확정된 답변", + timestamp: "2026-09-07T13:18:00Z", + raw: { message: { phase: "final_answer" } }, + }); + store.appendEntry({ + entryId: "commentary", + role: "assistant", + text: "PRIVATE COMMENTARY", + timestamp: "2026-09-07T13:19:00Z", + raw: { message: { phase: "commentary" } }, + }); + store.appendEntry({ + entryId: "tool", + role: "tool", + text: "PRIVATE TOOL", + timestamp: "2026-09-07T13:20:00Z", + raw: {}, + }); + store.close(); + // Finalize the fixture WAL before comparing file bytes; the reader cannot checkpoint it. + const { DatabaseSync } = await import("node:sqlite"); + const checkpoint = new DatabaseSync(path); + checkpoint.exec("PRAGMA wal_checkpoint(TRUNCATE)"); + checkpoint.close(); + const original = readFileSync(path); + const server = await startFleetServer(fleet, 0, process.cwd(), "lina", { + lazy: true, + }); + try { + const response = await fetch(`http://127.0.0.1:${server.port}/api/agents`); + const data = (await response.json()) as { + agents: { id: string }[]; + summaries: AgentConversationSummary[]; + }; + expect(response.status).toBe(200); + expect(data.summaries?.map((item) => item.agentId)).toEqual( + data.agents.map((item) => item.id), + ); + const writer = data.summaries.find((item) => item.agentId === "writer"); + expect(writer?.latestMessage).toMatchObject({ + entryId: "public", + text: "확정된 답변", + timestamp: "2026-09-07T13:18:00Z", + seq: 1, + }); + expect(writer?.confirmationCount).toBeNull(); + expect(writer?.running).toBeNull(); + expect( + data.summaries.find((item) => item.agentId === "unopened")?.available, + ).toBe(true); + expect(JSON.stringify(data)).not.toContain("PRIVATE"); + expect(opened).toBe(0); + expect(readFileSync(path)).toEqual(original); + writeFileSync( + join(writerRoot, "binding.json"), + JSON.stringify({ ...binding, botId: "foreign" }), + ); + const failed = (await fetch( + `http://127.0.0.1:${server.port}/api/agents`, + ).then((result) => result.json())) as typeof data; + expect( + failed.summaries.find((item) => item.agentId === "writer")?.available, + ).toBe(false); + expect(JSON.stringify(failed.summaries)).not.toContain("확정된 답변"); + expect( + ( + await fetch(`http://127.0.0.1:${server.port}/api/agents`, { + headers: { origin: "https://foreign.invalid" }, + }) + ).status, + ).toBe(403); + } finally { + await server.stop(); + rmSync(root, { recursive: true, force: true }); + } +}); + +test("visible cursors persist per agent and session while storage failure stays usable", () => { + const values = new Map(); + const storage = { + getItem: (key: string) => values.get(key) ?? null, + setItem: (key: string, value: string) => { + values.set(key, value); + }, + }; + const first = new AgentListModel("writer", storage); + first.replace(profiles); + first.updateSummary(summary(3)); + first.markVisible("writer", "conversation-writer", 3); + const restored = new AgentListModel("writer", storage); + restored.replace(profiles); + restored.updateSummary(summary(4)); + expect(restored.rows()[1]?.unread).toBe(true); + restored.updateSummary({ ...summary(5), sessionId: "new-conversation" }); + expect(restored.rows()[1]?.unread).toBe(false); + const blocked = new AgentListModel("writer", { + getItem: () => { + throw Error("blocked"); + }, + setItem: () => { + throw Error("blocked"); + }, + }); + blocked.replace(profiles); + blocked.updateSummary(summary(4)); + blocked.markVisible("writer", "conversation-writer", 4); + blocked.updateSummary(summary(5)); + expect(blocked.rows()[1]?.unread).toBe(true); +}); + +test("a user's own message does not become an unread assistant reply", () => { + const model = new AgentListModel("writer"); + model.replace(profiles); + model.updateSummary(summary(2)); + model.markVisible("writer", "conversation-writer", 2); + const value = snapshot(3); + value.messages = [ + { + entryId: "own", + seq: 3, + role: "user", + text: "내가 보낸 말", + timestamp: "2026-09-07T13:18:00Z", + truncated: false, + }, + ]; + model.updateSummary(summaryFromSnapshot(value, 0)); + expect(model.rows()[1]?.unread).toBe(false); + expect(model.rows()[1]?.preview).toBe("나: 내가 보낸 말"); +}); diff --git a/packages/lina-web/test/attachment-draft.test.ts b/packages/lina-web/test/attachment-draft.test.ts index 218c65a..2b03eba 100644 --- a/packages/lina-web/test/attachment-draft.test.ts +++ b/packages/lina-web/test/attachment-draft.test.ts @@ -1,5 +1,8 @@ import { expect, test } from "bun:test"; -import { AttachmentDraft, attachmentLink } from "../client/attachment-draft.ts"; +import { + AttachmentDraft, + attachmentLink, +} from "../../lina-client/src/attachment-draft.ts"; const session = "12345678-1234-4234-8234-123456789012"; const ref = { diff --git a/packages/lina-web/test/attachment-queue.test.ts b/packages/lina-web/test/attachment-queue.test.ts new file mode 100644 index 0000000..f6e2159 --- /dev/null +++ b/packages/lina-web/test/attachment-queue.test.ts @@ -0,0 +1,241 @@ +import { expect, test } from "bun:test"; +import { + AttachmentDraft, + attachmentLink, + type DraftAttachment, +} from "../../lina-client/src/attachment-draft.ts"; +import { AttachmentQueue } from "../../lina-client/src/attachment-queue.ts"; + +const firstSession = "12345678-1234-4234-8234-123456789012"; +const secondSession = "12345678-1234-4234-8234-123456789013"; +const file = (name: string) => + new File(["sample"], name, { type: "text/plain" }); +const receipt = ( + index: number, + name: string, + sessionId = firstSession, +): DraftAttachment => ({ + id: `87654321-1234-4234-8234-${String(index).padStart(12, "0")}`, + name, + sessionId, +}); +function harness() { + const draft = new AttachmentDraft(); + let session: string | undefined = firstSession; + let signal = Promise.withResolvers(); + const requests: { + file: File; + owner: string; + signal: AbortSignal; + resolve: (ref: DraftAttachment) => void; + reject: (error: Error) => void; + }[] = []; + const notices: string[] = []; + const queue = new AttachmentQueue(draft, { + session: () => session, + text: () => draft.text, + changed: () => { + signal.resolve(); + signal = Promise.withResolvers(); + }, + notice: (message) => notices.push(message), + upload: (file, owner, signal) => + new Promise((resolve, reject) => + requests.push({ file, owner, signal, resolve, reject }), + ), + }); + queue.update(true); + const waitFor = async (check: () => boolean) => { + while (!check()) await signal.promise; + }; + const request = (index: number) => { + const r = requests[index]; + if (!r) throw Error(`missing request ${index}`); + return r; + }; + return { + draft, + queue, + requests, + notices, + waitFor, + request, + session: (value: string | undefined) => { + session = value; + queue.update(true); + }, + }; +} + +test("one queue accepts picker and paste while busy and preserves all item states", async () => { + const h = harness(); + h.queue.addFiles([file("one.txt"), file("two.txt")], "picker"); + h.queue.addFiles([file("three.txt")], "paste"); + expect(h.queue.items.map((item) => item.state)).toEqual([ + "uploading", + "pending", + "pending", + ]); + expect(h.queue.busy).toBe(true); + expect(h.queue.blocked).toBe(true); + h.request(0).reject(Error("storage unavailable")); + await h.waitFor(() => h.requests.length === 2); + expect(h.queue.items.map((item) => item.state)).toEqual([ + "error", + "uploading", + "pending", + ]); + h.request(1).resolve(receipt(2, "two.txt")); + await h.waitFor(() => h.requests.length === 3); + h.request(2).resolve(receipt(3, "three.txt")); + await h.waitFor(() => !h.queue.busy); + expect(h.queue.blocked).toBe(true); + expect(h.draft.refs.map((ref) => ref.name)).toEqual(["two.txt", "three.txt"]); + const failed = h.queue.items[0]; + if (!failed) throw Error("missing failed item"); + h.queue.retry(failed.key); + h.request(3).resolve(receipt(1, "one.txt")); + await h.waitFor(() => !h.queue.busy); + expect(h.queue.items.map((item) => item.state)).toEqual([ + "ready", + "ready", + "ready", + ]); + expect(h.queue.blocked).toBe(false); + expect(h.draft.refs.map((ref) => ref.name)).toEqual([ + "one.txt", + "two.txt", + "three.txt", + ]); +}); + +test("max four counts ready, errors and queued files and rejects an oversized batch explicitly", async () => { + const h = harness(); + h.queue.addFiles( + [file("1.txt"), file("2.txt"), file("3.txt"), file("4.txt")], + "paste", + ); + h.request(0).reject(Error("offline")); + await h.waitFor(() => h.requests.length === 2); + h.queue.addFiles([file("5.txt")], "picker"); + expect(h.queue.items).toHaveLength(4); + expect(h.notices.at(-1)).toContain("4개"); + const failed = h.queue.items[0]; + if (!failed) throw Error("missing failed item"); + h.queue.remove(failed.key); + h.queue.addFiles([file("5.txt"), file("6.txt")], "paste"); + expect(h.queue.items).toHaveLength(3); + h.queue.addFiles([file("5.txt")], "picker"); + expect(h.queue.items).toHaveLength(4); + h.queue.reset(""); +}); + +test("reset cancels pending work and ignores stale success and failure within the same session", async () => { + for (const staleFailure of [false, true]) { + const h = harness(); + h.queue.addFiles([file("old.txt"), file("never.txt")], "picker"); + h.queue.reset("new draft"); + expect(h.request(0).signal.aborted).toBe(true); + h.queue.addFiles([file("new.txt")], "paste"); + if (staleFailure) h.request(0).reject(Error("stale failure")); + else h.request(0).resolve(receipt(1, "old.txt")); + h.request(1).resolve(receipt(2, "new.txt")); + await h.waitFor(() => !h.queue.busy); + expect(h.draft.value).toBe( + `new draft\n\n${attachmentLink(receipt(2, "new.txt"))}`, + ); + expect(h.requests.map((r) => r.file.name)).toEqual(["old.txt", "new.txt"]); + expect(h.notices).toEqual([]); + } +}); + +test("session changes abort old uploads, block foreign refs and forbid retry into the new session", async () => { + const h = harness(); + h.queue.reset(attachmentLink(receipt(1, "saved.txt"))); + h.queue.addFiles([file("old.txt"), file("pending.txt")], "paste"); + h.session(secondSession); + expect(h.request(0).signal.aborted).toBe(true); + expect(h.queue.busy).toBe(false); + expect(h.queue.blocked).toBe(true); + const old = h.queue.items[1]; + if (!old) throw Error("missing old item"); + h.queue.retry(old.key); + expect(h.requests).toHaveLength(1); + h.queue.reset(""); + h.queue.addFiles([file("new.txt")], "picker"); + h.request(0).resolve(receipt(2, "old.txt")); + h.request(1).resolve(receipt(3, "new.txt", secondSession)); + await h.waitFor(() => !h.queue.busy); + expect(h.draft.refs).toEqual([receipt(3, "new.txt", secondSession)]); + expect(h.request(1).owner).toBe(secondSession); +}); + +test("removing an upload aborts it, advances the queue and ignores its late receipt", async () => { + const h = harness(); + h.queue.addFiles([file("removed.txt"), file("kept.txt")], "paste"); + const removed = h.queue.items[0]; + if (!removed) throw Error("missing item"); + h.queue.remove(removed.key); + expect(h.request(0).signal.aborted).toBe(true); + h.request(0).resolve(receipt(1, "removed.txt")); + h.request(1).resolve(receipt(2, "kept.txt")); + await h.waitFor(() => !h.queue.busy); + expect(h.draft.refs).toEqual([receipt(2, "kept.txt")]); +}); + +test("disconnect retains files, cancels in-flight upload and requires explicit retry", async () => { + const h = harness(); + h.queue.addFiles([file("first.txt"), file("second.txt")], "paste"); + h.queue.update(false); + expect(h.request(0).signal.aborted).toBe(true); + expect(h.queue.items.map((item) => item.state)).toEqual(["error", "pending"]); + h.queue.update(true); + expect(h.requests.map((r) => r.file.name)).toEqual([ + "first.txt", + "second.txt", + ]); + h.request(0).resolve(receipt(1, "first.txt")); + h.request(1).resolve(receipt(2, "second.txt")); + await h.waitFor(() => !h.queue.busy); + expect(h.queue.blocked).toBe(true); + expect(h.draft.refs).toEqual([receipt(2, "second.txt")]); +}); + +test("restored uploaded references retain exact draft serialization and removal", () => { + const h = harness(); + const original = `read this\n${attachmentLink(receipt(1, "saved.txt"))}`; + h.queue.reset(original); + expect(h.draft.value).toBe(original); + expect(h.queue.items[0]?.state).toBe("ready"); + expect(h.queue.blocked).toBe(false); + const saved = h.queue.items[0]; + if (!saved) throw Error("missing saved item"); + h.queue.remove(saved.key); + expect(h.draft.value).toBe("read this"); +}); + +test("unnamed PNG and JPEG uploads get unique extensions without altering bytes", async () => { + const h = harness(); + h.queue.addFiles( + [ + new File(["png bytes"], "", { type: "image/png" }), + new File(["jpeg bytes"], "", { type: "image/jpeg" }), + new File(["png bytes"], "", { type: "image/png" }), + ], + "paste", + ); + for (const [index, extension, bytes] of [ + [0, ".png", "png bytes"], + [1, ".jpg", "jpeg bytes"], + [2, ".png", "png bytes"], + ] as const) { + const request = h.request(index); + expect(request.file.name.endsWith(extension)).toBe(true); + expect(await request.file.text()).toBe(bytes); + request.resolve(receipt(index + 1, request.file.name)); + await h.waitFor(() => + index === 2 ? !h.queue.busy : h.requests.length === index + 2, + ); + } + expect(new Set(h.requests.map((request) => request.file.name)).size).toBe(3); +}); diff --git a/packages/lina-web/test/clipboard-attachments.test.ts b/packages/lina-web/test/clipboard-attachments.test.ts new file mode 100644 index 0000000..788d9ec --- /dev/null +++ b/packages/lina-web/test/clipboard-attachments.test.ts @@ -0,0 +1,398 @@ +import { afterEach, expect, test } from "bun:test"; + +// Keep DOM globals out of the Bun root program; the browser build checks the +// renderer against lib.dom. This harness describes only its public boundary. +type Attachments = { + port: { value: string }; + busy: boolean; + blocked: boolean; + update(online: boolean): void; + dispose(): void; +}; +const moduleUrl = new URL( + "../../lina-ui/client/attachments.ts", + import.meta.url, +); +const { createAttachments } = (await import(moduleUrl.href)) as { + createAttachments( + input: Node, + session: () => string | undefined, + changed: () => void, + notice: (message: string) => void, + ): Attachments; +}; + +class Node extends EventTarget { + children: Node[] = []; + attributes = new Map(); + value = ""; + textContent = ""; + className = ""; + hidden = false; + disabled = false; + files: File[] = []; + selectionStart = 0; + selectionEnd = 0; + append(...nodes: Node[]) { + this.children.push(...nodes); + } + replaceChildren(...nodes: Node[]) { + this.children = nodes; + } + setAttribute(name: string, value: string) { + this.attributes.set(name, value); + } + getAttribute(name: string) { + return this.attributes.get(name) ?? null; + } + click() { + this.dispatchEvent(new Event("click")); + } + focus() {} + setRangeText(text: string, start: number, end: number) { + this.value = this.value.slice(0, start) + text + this.value.slice(end); + this.selectionStart = this.selectionEnd = start + text.length; + } +} + +const session = "12345678-1234-4234-8234-123456789012"; +const ref = { id: "87654321-1234-4234-8234-123456789012", name: "one.txt" }; +const file = (name = "one.txt", type = "text/plain") => + new File(["sample"], name, { type, lastModified: 1 }); +let restore = () => {}; +afterEach(() => restore()); + +function harness() { + const nodes = new Map( + ["message", "draft-files", "file-picker", "attach-file"].map((id) => [ + id, + new Node(), + ]), + ); + const get = (id: string) => { + const node = nodes.get(id); + if (!node) throw Error(id); + return node; + }; + const uploads: { + init: RequestInit; + resolve: (response: Response) => void; + }[] = []; + let signal = Promise.withResolvers(); + let changes = 0; + let changedHook = () => {}; + const changed = () => { + changes++; + signal.resolve(); + signal = Promise.withResolvers(); + changedHook(); + }; + const notices: string[] = []; + const globals: Record = { + document: { getElementById: get, createElement: () => new Node() }, + HTMLDivElement: Node, + HTMLInputElement: Node, + HTMLButtonElement: Node, + fetch: (_url: string, init: RequestInit) => + new Promise((resolve) => uploads.push({ init, resolve })), + }; + const descriptors = new Map( + Object.keys(globals).map((key) => [ + key, + Object.getOwnPropertyDescriptor(globalThis, key), + ]), + ); + for (const [key, value] of Object.entries(globals)) + Object.defineProperty(globalThis, key, { + configurable: true, + writable: true, + value, + }); + restore = () => { + for (const [key, descriptor] of descriptors) { + if (descriptor) Object.defineProperty(globalThis, key, descriptor); + else Reflect.deleteProperty(globalThis, key); + } + }; + const input = get("message"); + // Minimal DOM stand-in; browser build separately checks the actual DOM contract. + const attachments = createAttachments( + input, + () => session, + changed, + (message) => notices.push(message), + ); + const restoreGlobals = restore; + restore = () => { + attachments.dispose(); + restoreGlobals(); + }; + attachments.update(true); + const waitFor = async (check: () => boolean) => { + while (!check()) await signal.promise; + }; + const pick = (...files: File[]) => { + const picker = get("file-picker"); + picker.files = files; + picker.dispatchEvent(new Event("change")); + }; + const paste = (files: File[], text = "", fallback = files) => { + const event = Object.assign(new Event("paste", { cancelable: true }), { + clipboardData: { + items: files.map((value) => ({ kind: "file", getAsFile: () => value })), + files: fallback, + getData: (type: string) => + type === "text/plain" ? text : "", + }, + }); + input.dispatchEvent(event); + return event; + }; + return { + input, + attachments, + uploads, + notices, + get, + pick, + paste, + waitFor, + changes: () => changes, + onChange: (hook: () => void) => { + changedHook = hook; + }, + }; +} + +test("parent update callbacks do not recurse or replace unchanged attachment rows", async () => { + const h = harness(); + h.onChange(() => h.attachments.update(true)); + expect(h.changes()).toBe(0); + h.pick(file()); + const uploading = h.get("draft-files").children[0]; + for (let i = 0; i < 100; i++) h.attachments.update(true); + expect(h.changes()).toBe(1); + expect(h.get("draft-files").children[0]).toBe(uploading); + expect(h.uploads).toHaveLength(1); + h.uploads[0]?.resolve(new Response(null, { status: 507 })); + await h.waitFor(() => !h.attachments.busy); + expect(h.changes()).toBe(2); + const failed = h.get("draft-files").children[0]; + for (let i = 0; i < 100; i++) h.attachments.update(true); + expect(h.get("draft-files").children[0]).toBe(failed); + expect(h.changes()).toBe(2); + expect(h.uploads).toHaveLength(1); +}); + +test("picker additions during upload remain visible and queued", () => { + const h = harness(); + h.pick(file()); + h.pick(file("two.txt")); + expect(h.get("draft-files").children).toHaveLength(2); + expect(h.uploads).toHaveLength(1); + expect(h.get("attach-file").disabled).toBe(false); +}); + +test("mixed file/text paste replaces the selection once, emits input, and deduplicates items/files", () => { + const h = harness(); + h.input.value = "before selected after"; + h.input.selectionStart = 7; + h.input.selectionEnd = 15; + let inputs = 0; + h.input.addEventListener("input", () => { + inputs++; + }); + const event = h.paste([file()], "한글\ntext"); + expect(event.defaultPrevented).toBe(true); + expect(h.input.value).toBe("before 한글\ntext after"); + expect(inputs).toBe(1); + expect(h.get("draft-files").children).toHaveLength(1); + expect(h.uploads).toHaveLength(1); +}); + +test("plain text, URL and local path paste leave native editing untouched", () => { + const h = harness(); + h.input.value = "keep"; + let inputs = 0; + h.input.addEventListener("input", () => { + inputs++; + }); + for (const text of [ + "한글\ntext", + "https://example.com/a.png", + "/home/example/a.png", + ]) { + expect(h.paste([], text).defaultPrevented).toBe(false); + } + expect(h.input.value).toBe("keep"); + expect(inputs).toBe(0); + expect(h.uploads).toHaveLength(0); +}); + +test("files fallback and unnamed images use the same picker/paste queue without deduping later pastes", () => { + const h = harness(); + const png = file("", "image/png"); + h.paste([], "", [png]); + h.paste([png]); + h.paste([file("", "image/jpeg")]); + expect(h.get("draft-files").children).toHaveLength(3); + expect( + new Headers(h.uploads[0]?.init.headers).get("X-Lina-Filename"), + ).toMatch(/\.png$/); +}); + +test("resetting the draft aborts upload and a late receipt cannot contaminate the new draft", async () => { + const h = harness(); + h.pick(file()); + const upload = h.uploads[0]; + if (!upload) throw Error("missing upload"); + h.attachments.port.value = "new draft"; + expect(upload.init.signal?.aborted).toBe(true); + h.pick(file("new.txt")); + upload.resolve(Response.json(ref)); + h.uploads[1]?.resolve( + Response.json({ + ...ref, + id: "87654321-1234-4234-8234-123456789013", + name: "new.txt", + }), + ); + await h.waitFor(() => !h.attachments.busy); + expect(h.attachments.port.value).toBe( + `new draft\n\n[new.txt](/api/attachments/87654321-1234-4234-8234-123456789013?sessionId=${session})`, + ); + expect(h.get("draft-files").children).toHaveLength(1); +}); + +test("clipboard file items are authoritative even when files exposes extra wrappers", () => { + const h = harness(); + const first = file(); + h.paste([first], "", [file(), file("other.txt")]); + expect(h.get("draft-files").children).toHaveLength(1); + // Different copies with the same metadata remain distinct within one source. + h.paste([first, file()], "", [first, file()]); + expect(h.get("draft-files").children).toHaveLength(3); +}); + +test("one paste with different lastModified wrappers uploads once; a later paste stays separate", async () => { + const h = harness(); + const item = new File(["png bytes"], "image.png", { + type: "image/png", + lastModified: 1, + }); + const wrapper = new File(["png bytes"], "image.png", { + type: "image/png", + lastModified: 2, + }); + h.paste([item], "", [wrapper]); + expect(h.get("draft-files").children).toHaveLength(1); + h.uploads[0]?.resolve(Response.json({ ...ref, name: "image.png" })); + await h.waitFor(() => !h.attachments.busy); + expect(h.uploads).toHaveLength(1); + expect( + h.get("draft-files").children[0]?.getAttribute("data-attachment-state"), + ).toBe("ready"); + h.paste([item], "", [wrapper]); + expect(h.get("draft-files").children).toHaveLength(2); + expect(h.uploads).toHaveLength(2); +}); + +test.each([ + [413, "2 MiB"], + [507, "저장 공간"], + [500, "저장소 오류"], + [400, "형식"], +] as const)( + "HTTP %i leaves a recoverable file with the appropriate reason", + async (status, expected) => { + const h = harness(); + h.pick(file()); + h.uploads[0]?.resolve(new Response(null, { status })); + await h.waitFor(() => !h.attachments.busy); + expect(h.attachments.blocked).toBe(true); + const row = h.get("draft-files").children[0]; + expect(row?.getAttribute("data-attachment-state")).toBe("error"); + expect( + row?.children.find((node) => node.getAttribute("role") === "alert") + ?.textContent, + ).toContain(expected); + const retry = row?.children.find((node) => + node.getAttribute("aria-label")?.endsWith("재시도"), + ); + expect(retry?.disabled).toBe(false); + retry?.click(); + expect(h.uploads).toHaveLength(2); + h.uploads[1]?.resolve(Response.json(ref)); + await h.waitFor(() => !h.attachments.busy); + expect(h.attachments.blocked).toBe(false); + expect(h.attachments.port.value).toContain( + `[one.txt](/api/attachments/${ref.id}?sessionId=${session})`, + ); + const ready = h.get("draft-files").children[0]; + expect(ready?.children.some((node) => node.textContent === "준비됨")).toBe( + true, + ); + ready?.children + .find((node) => node.getAttribute("aria-label")?.endsWith("제외")) + ?.click(); + expect(h.attachments.port.value).toBe(""); + }, +); + +test("2 MiB is accepted; a larger file stays visible as an error and can be excluded", async () => { + const h = harness(); + h.pick( + new File([new Uint8Array(2097152)], "fits.png", { type: "image/png" }), + ); + expect(h.uploads).toHaveLength(1); + h.pick( + new File([new Uint8Array(2097153)], "large.png", { type: "image/png" }), + ); + h.uploads[0]?.resolve(Response.json({ ...ref, name: "fits.png" })); + await h.waitFor(() => !h.attachments.busy); + expect(h.uploads).toHaveLength(1); + expect( + h + .get("draft-files") + .children.map((node) => node.getAttribute("data-attachment-state")), + ).toEqual(["ready", "error"]); + expect(h.attachments.blocked).toBe(true); + h.get("draft-files") + .children[1]?.children.find((node) => + node.getAttribute("aria-label")?.endsWith("제외"), + ) + ?.click(); + expect(h.attachments.blocked).toBe(false); +}); + +test("a malformed JSON receipt displays a recovery action without exposing parser errors", async () => { + const h = harness(); + h.pick(file()); + h.uploads[0]?.resolve(new Response("server error")); + await h.waitFor(() => !h.attachments.busy); + const error = h + .get("draft-files") + .children[0]?.children.find( + (node) => node.getAttribute("role") === "alert", + ); + expect(error?.textContent).toBe( + "첨부 결과 미확인 · 재시도 또는 제외해 주세요.", + ); + expect(h.attachments.blocked).toBe(true); +}); + +test.each([ + {}, + { id: "invalid", name: "bad.txt" }, + { ...ref, name: "../../bad.txt" }, +])("invalid receipts never become uploaded draft links: %j", async (meta) => { + const h = harness(); + h.pick(file()); + h.uploads[0]?.resolve(Response.json(meta)); + await h.waitFor(() => !h.attachments.busy); + expect(h.attachments.port.value).toBe(""); + expect(h.attachments.blocked).toBe(true); + expect( + h.get("draft-files").children[0]?.getAttribute("data-attachment-state"), + ).toBe("error"); +}); diff --git a/packages/lina-web/test/connection.test.ts b/packages/lina-web/test/connection.test.ts index 79d4dd1..364935b 100644 --- a/packages/lina-web/test/connection.test.ts +++ b/packages/lina-web/test/connection.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it } from "bun:test"; -import { Connection } from "../client/connection.ts"; -import { ChatModel } from "../client/model.ts"; +import { Connection } from "../../lina-client/src/connection.ts"; +import { ChatModel } from "../../lina-client/src/model.ts"; const cleanup: (() => void)[] = []; afterEach(() => { diff --git a/packages/lina-web/test/context-model.test.ts b/packages/lina-web/test/context-model.test.ts index 42a76a7..f080b33 100644 --- a/packages/lina-web/test/context-model.test.ts +++ b/packages/lina-web/test/context-model.test.ts @@ -1,7 +1,7 @@ import { expect, test } from "bun:test"; +import { ContextModel } from "../../lina-client/src/context-model.ts"; +import { parseServerFrame } from "../../lina-client/src/protocol.ts"; import type { ContextSnapshot } from "../../lina-core/src/context-wire.ts"; -import { ContextModel } from "../client/context-model.ts"; -import { parseServerFrame } from "../src/protocol.ts"; const snapshot = (epoch = "one", revision = 2): ContextSnapshot => ({ sessionId: "s", diff --git a/packages/lina-web/test/conversation-editor.test.ts b/packages/lina-web/test/conversation-editor.test.ts index f30e016..6b5b123 100644 --- a/packages/lina-web/test/conversation-editor.test.ts +++ b/packages/lina-web/test/conversation-editor.test.ts @@ -5,7 +5,7 @@ import { conversationPreferenceLabel, conversationPreferenceValue, validateConversationExamples, -} from "../client/conversation-draft.ts"; +} from "../../lina-ui/client/conversation-draft.ts"; test("builds the scoped conversation endpoint", () => { expect(conversationEndpoint("lina")).toBe("/api/agents/lina/conversation"); diff --git a/packages/lina-web/test/draft.test.ts b/packages/lina-web/test/draft.test.ts index a3893b3..628f6a0 100644 --- a/packages/lina-web/test/draft.test.ts +++ b/packages/lina-web/test/draft.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test"; -import { DraftStore } from "../client/draft.ts"; +import { DraftStore } from "../../lina-client/src/draft.ts"; test("draft and pending ID survive reload without executing a send", () => { const values = new Map(); diff --git a/packages/lina-web/test/durable-model.test.ts b/packages/lina-web/test/durable-model.test.ts index fdf12c7..4a91bc4 100644 --- a/packages/lina-web/test/durable-model.test.ts +++ b/packages/lina-web/test/durable-model.test.ts @@ -1,9 +1,9 @@ import { expect, test } from "bun:test"; +import { DurableChatModel } from "../../lina-client/src/durable-model.ts"; import type { SessionSnapshot, TimelineEntry, } from "../../lina-core/src/protocol.ts"; -import { DurableChatModel } from "../client/durable-model.ts"; const row = ( seq: number, diff --git a/packages/lina-web/test/execution-model.test.ts b/packages/lina-web/test/execution-model.test.ts index 76e895c..be98510 100644 --- a/packages/lina-web/test/execution-model.test.ts +++ b/packages/lina-web/test/execution-model.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test"; +import { ExecutionModel } from "../../lina-client/src/execution-model.ts"; import type { ControlSnapshot } from "../../lina-core/src/control/types.ts"; -import { ExecutionModel } from "../client/execution-model.ts"; const state = (revision = 1): ControlSnapshot => ({ sessionId: "s", diff --git a/packages/lina-web/test/fixtures/codex-only-ui.ts b/packages/lina-web/test/fixtures/codex-only-ui.ts index d1fbee4..99f1a54 100644 --- a/packages/lina-web/test/fixtures/codex-only-ui.ts +++ b/packages/lina-web/test/fixtures/codex-only-ui.ts @@ -4,7 +4,7 @@ import type { ControlSnapshot } from "../../../lina-core/src/control/types.ts"; import { parseControlClient } from "../../../lina-core/src/control-wire.ts"; import type { SessionSnapshot } from "../../../lina-core/src/protocol.ts"; import { parseWireClient } from "../../../lina-core/src/wire.ts"; -import type { TaskDetail } from "../../client/task-view.ts"; +import type { TaskDetail } from "../../../lina-ui/client/task-view.ts"; import { loadWebAssets } from "../../src/assets.ts"; import { startWebServer } from "../../src/server.ts"; diff --git a/packages/lina-web/test/fixtures/model-combobox.ts b/packages/lina-web/test/fixtures/model-combobox.ts new file mode 100644 index 0000000..fe671a3 --- /dev/null +++ b/packages/lina-web/test/fixtures/model-combobox.ts @@ -0,0 +1,55 @@ +import type { + ModelChoice, + ModelComboboxAdapter, + ModelComboboxFactory, +} from "../../../lina-ui/client/model-combobox-types.ts"; + +/** Controller seam only: browser QA owns search, focus, keyboard, and popup behavior. */ +export function comboboxFixture() { + const controls = new Map< + string, + ModelComboboxAdapter & { items: ModelChoice[]; choose(value: string): void } + >(); + const factory: ModelComboboxFactory = (doc, id, label, change) => { + const root = doc.createElement("div"); + const input = doc.createElement("input"); + input.id = `${id}-input`; + input.setAttribute("aria-label", label); + root.append(input); + const control = { + root, + input, + items: [] as ModelChoice[], + close() {}, + set( + items: ModelChoice[], + _value: string, + display: string, + disabled = false, + ) { + control.items = items; + input.value = display; + input.disabled = disabled; + }, + disable(disabled: boolean) { + input.disabled = disabled; + }, + choose(value: string) { + if ( + input.disabled || + !control.items.some((item) => item.value === value) + ) + throw Error(`Unavailable model choice: ${id}/${value}`); + change(value); + }, + }; + controls.set(id, control); + return control; + }; + const get = (id: string) => { + const control = controls.get(id); + if (!control) throw Error(`Missing combobox: ${id}`); + return control; + }; + return { factory, get }; +} diff --git a/packages/lina-web/test/fixtures/ui-desktop.ts b/packages/lina-web/test/fixtures/ui-desktop.ts new file mode 100644 index 0000000..f0f1b26 --- /dev/null +++ b/packages/lina-web/test/fixtures/ui-desktop.ts @@ -0,0 +1,469 @@ +import { randomUUID } from "node:crypto"; +import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { summaryFromSnapshot } from "../../../lina-client/src/agent-list.ts"; +import { AttachmentStore } from "../../../lina-core/src/attachments/store.ts"; +import { handleAttachmentRequest } from "../../../lina-runtime/src/attachment-http.ts"; + +/** Browser-only fixture: real web assets/gateway, in-memory conversation/task APIs. */ + +import type { ControlSnapshot } from "../../../lina-core/src/control/types.ts"; +import { parseControlClient } from "../../../lina-core/src/control-wire.ts"; +import type { SessionSnapshot } from "../../../lina-core/src/protocol.ts"; +import { parseWireClient } from "../../../lina-core/src/wire.ts"; +import type { TaskDetail } from "../../../lina-ui/client/task-view.ts"; +import { loadWebAssets } from "../../src/assets.ts"; +import { startWebServer } from "../../src/server.ts"; + +const timestamp = new Date().toISOString(); +const sessionId = randomUUID(); +const snapshot: SessionSnapshot = { + version: 2, + botId: "lina", + sessionId, + revision: 1, + state: "running", + hasEarlier: false, + beforeCursor: null, + requests: [], + messages: [ + { + seq: 1, + entryId: "user-1", + role: "user", + timestamp, + truncated: false, + text: "로그인 흐름을 확인하고, 변경 전에 알려줘.", + }, + { + seq: 2, + entryId: "assistant-1", + role: "assistant", + timestamp, + truncated: false, + text: "로그인 오류를 확인했어요. 수정 내용을 검증하기 전에 승인을 기다리고 있어요.", + }, + ], +}; +const inputJson = JSON.stringify({ command: "bun test" }); +const control: ControlSnapshot = { + sessionId, + revision: 1, + cancelRequestId: "request-1", + cancelling: false, + cancelFailed: false, + tools: [ + { + id: "tool-1", + nativeCallId: "native-1", + requestId: "request-1", + name: "bash", + state: "waiting_approval", + inputPreview: inputJson, + outputPreview: "", + createdAt: timestamp, + updatedAt: timestamp, + }, + ], + approvals: [ + { + id: "approval-1", + toolRunId: "tool-1", + inputDigest: "a".repeat(64), + inputJson, + state: "pending", + expiresAt: Date.now() + 3_600_000, + createdAt: timestamp, + }, + ], +}; +const task: TaskDetail = { + task: { + id: "task-1", + threadId: "thread-1", + ownerAgentId: "lina", + title: "로그인 오류와 긴 안내 문구 확인", + cwd: "/synthetic/workspace", + status: "waiting_approval", + revision: 1, + updatedAt: timestamp, + model: "synthetic-model", + pendingApprovals: [ + { + id: "task-approval", + method: "item/commandExecution/requestApproval", + params: { command: "bun test", cwd: "/synthetic/workspace" }, + createdAt: timestamp, + }, + ], + }, + thread: { + id: "thread-1", + turns: [ + { + id: "turn-1", + status: "inProgress", + error: null, + items: [ + { + type: "userMessage", + content: [{ type: "text", text: "로그인 오류를 확인해줘." }], + }, + { + type: "agentMessage", + text: "입력 검증을 확인했습니다. 테스트 실행은 승인을 기다립니다.", + }, + ], + }, + ], + }, +}; +const commands: unknown[] = []; +const root = mkdtempSync(join(tmpdir(), "lina-ui-desktop-qa-")); +const presentation = process.env["LINA_QA_PRESENTATION"] === "1"; +const sampleNames = [ + "Lina", + "Kai", + "하루", + "소담", + "유리", + "노아", + "미오", + "서우", + "다온", + "루카", +]; +const count = Number(process.env["LINA_QA_AGENT_COUNT"] ?? 10); +if (!Number.isInteger(count) || count < 1 || count > 50) + throw new Error("Invalid fixture agent count"); +const profiles = Array.from({ length: count }, (_, index) => ({ + id: index === 0 ? "lina" : index === 1 ? "kai" : `agent-${index}`, + name: presentation + ? (sampleNames[index] ?? `동료 ${index}`) + : index === 0 + ? "Lina" + : index === 1 + ? "Kai" + : `긴 이름을 가진 에이전트 ${index}`, + role: index === 0 ? "함께 이야기하는 동료" : "글쓰기와 자료 조사", + personality: "차분함", + voice: "편안하게", + profile: "", + appearance: "", + interests: [], + avatarId: null, + evolution: "adaptive", + revision: 1, + state: "idle", + dynamics: { + revision: 0, + mood: null, + interests: [], + preferences: [], + relationship: [], + lastRequestId: null, + }, +})); +const snapshots = new Map( + profiles.map((profile, index) => [ + profile.id, + { + ...structuredClone(snapshot), + botId: profile.id, + state: index === 0 ? "running" : "idle", + sessionId: index === 0 ? sessionId : randomUUID(), + messages: Array.from({ length: 32 }, (_, n) => ({ + seq: n + 1, + entryId: `${profile.id}-entry-${n}`, + role: n % 2 ? ("assistant" as const) : ("user" as const), + timestamp, + truncated: false, + text: + `${profile.name}의 대화 ${n + 1}. ` + + (n % 2 + ? "오늘 생각한 내용을 함께 정리해 볼까요? 긴 한글 문장도 자연스럽게 읽을 수 있어요." + : "이 대화의 맥락과 초안을 다음에도 유지해줘."), + })), + } satisfies SessionSnapshot, + ]), +); +// The presentation dataset exercises normal rendering with readable synthetic content. +// Default stress/behavior fixtures above remain unchanged. +if (presentation) { + const conversation = [ + "이번 주말에는 좀 쉬고 싶어. 반나절 정도만 밖에 다녀올까?", + "좋아요. 멀리 가기보다, 걷다가 마음에 드는 곳에 잠깐 머무는 주말은 어때요?", + "성수 쪽이 좋겠어. 너무 빡빡한 일정은 말고.", + "그럼 두 군데만 정해둘게요. 나머지 시간은 비워두고요.\n\n### 느긋하게 보내는 토요일\n\n- **오전 11시 · 서울숲 산책**\n 천천히 한 바퀴 걸어요. 쉬고 싶으면 벤치에 앉아 있어도 좋고요.\n- **오후 1시 · 점심과 커피**\n 산책을 마치고 골목을 둘러보며 마음에 드는 곳을 골라요.\n\n돌아오는 시간은 정하지 않을게요. 더 걷고 싶으면 걷고, 피곤하면 바로 집으로 가요.", + "좋다. 챙길 것도 간단히 적어줘.", + "편한 신발, 물 한 병, 이어폰이면 충분해요. 작은 가방 하나로 가볍게 다녀와요.", + ]; + const previews = [ + "", + "초안의 첫 문장을 조금 다듬어 봤어요.", + "내일은 가볍게 20분만 걸어볼까요?", + "읽고 싶은 책 세 권을 골라봤어요.", + "여행 준비 목록을 정리했어요.", + "오늘 들을 음악을 찾아뒀어요.", + "사진 속 빛이 참 따뜻하네요.", + "다음 주 일정, 여유 있게 잡아둘게요.", + "생각나면 언제든 이어서 이야기해요.", + "저녁은 간단하게 만들어볼까요?", + ]; + for (const [index, profile] of profiles.entries()) { + const value = snapshots.get(profile.id); + if (!value) continue; + const text = + index === 0 + ? conversation + : [ + "오늘 이야기한 내용 정리해줘.", + previews[index] ?? "함께 천천히 정리해봐요.", + ]; + value.messages = text.map((content, n) => ({ + seq: n + 1, + entryId: `${profile.id}-sample-${n}`, + role: n % 2 ? "assistant" : "user", + timestamp: new Date(Date.now() - index * 23 * 60_000).toISOString(), + truncated: false, + text: content, + })); + } +} +const stores = new Map( + profiles.map((profile) => { + const folder = join(root, profile.id); + mkdirSync(folder); + const binding = { + version: 1 as const, + botId: profile.id, + sessionId: snapshots.get(profile.id)?.sessionId ?? sessionId, + sessionFile: join(folder, "session.jsonl"), + workspace: folder, + }; + return [binding.sessionId, new AttachmentStore(folder, binding)] as const; + }), +); +const persist = () => + writeFileSync( + join(root, "conversations.json"), + JSON.stringify([...snapshots]), + ); +persist(); +const upstream = Bun.serve<{ agentId: string }>({ + hostname: "127.0.0.1", + port: Number(process.env["LINA_QA_UPSTREAM_PORT"] ?? 18142), + async fetch(request, server) { + const path = new URL(request.url).pathname; + if ( + request.headers.get("upgrade") === "websocket" && + server.upgrade(request, { + data: { + agentId: new URL(request.url).searchParams.get("agent") ?? "lina", + }, + }) + ) + return; + if (path === "/fixture/commands") return Response.json(commands); + if (path === "/api/onboarding/entry") + return Response.json({ + firstUser: process.env["LINA_QA_FIRST_USER"] === "1", + resume: null, + legacyDrafts: [], + }); + if (path === "/api/models") + return Response.json({ + settings: { + revision: 1, + profiles: [], + defaultProfileId: null, + roles: {}, + agentRoles: {}, + }, + catalog: [], + active: [], + }); + if (path === "/api/agents/lina/intro" && request.method === "POST") + return Response.json({ + room: { + id: "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee", + agentId: "lina", + kind: "user", + status: "active", + revision: 0, + mode: "thoughtful", + draftId: null, + data: { + profile: profiles[0], + chapters: {}, + user: {}, + summary: [], + ready: false, + }, + createdAt: Date.now(), + finalization: null, + }, + turns: [], + userRevision: 0, + shareUser: false, + presets: [], + sessionId: null, + }); + if (path.startsWith("/api/attachments")) { + const id = + request.headers.get("X-Lina-Session") ?? + new URL(request.url).searchParams.get("sessionId") ?? + ""; + const store = stores.get(id); + if (!store) return new Response("Unknown session", { status: 404 }); + return ( + (await handleAttachmentRequest(request, store, store.binding)) ?? + new Response("Not found", { status: 404 }) + ); + } + if (path === "/api/agents") + return Response.json({ + agents: profiles, + presets: [], + summaries: [...snapshots.values()].map((item) => + summaryFromSnapshot( + item, + item.botId === "lina" ? control.approvals.length : 0, + ), + ), + }); + if (/^\/api\/agents\/[^/]+\/intro$/.test(path)) + return Response.json({ room: null }); + if (/^\/api\/agents\/[^/]+$/.test(path)) { + const profile = profiles.find( + (item) => item.id === path.split("/").at(-1), + ); + return Response.json({ + profile, + dynamics: profile?.dynamics, + changes: [], + }); + } + if (path === "/api/tasks" && request.method === "GET") + return Response.json({ + tasks: + !new URL(request.url).searchParams.get("ownerAgentId") || + new URL(request.url).searchParams.get("ownerAgentId") === + task.task.ownerAgentId + ? [task.task] + : [], + }); + if (path === "/api/tasks/task-1" && request.method === "GET") + return Response.json(task); + if (path.startsWith("/api/tasks") && request.method === "POST") { + const body = (await request.json()) as Record; + commands.push({ path, body }); + if (body["expectedRevision"] !== task.task.revision) + return Response.json( + { error: "작업이 변경되었습니다." }, + { status: 409 }, + ); + if (path.endsWith("/messages")) + return Response.json( + { error: "연결을 확인하고 다시 보내주세요." }, + { status: 503 }, + ); + if (path.endsWith("/approval")) { + task.task.pendingApprovals = []; + task.task.status = "inProgress"; + } + if (path.endsWith("/interrupt")) task.task.status = "interrupted"; + if (path.endsWith("/owner")) + task.task.ownerAgentId = String(body["ownerAgentId"]); + task.task.revision++; + return Response.json(task); + } + return Response.json( + { error: "Synthetic fixture has no such route." }, + { status: 404 }, + ); + }, + websocket: { + open(socket) { + socket.send(JSON.stringify({ type: "agent-status", state: "running" })); + }, + message(socket, raw) { + const snapshot = snapshots.get(socket.data.agentId); + if (!snapshot) return; + const text = String(raw); + const frame = parseWireClient(text) ?? parseControlClient(text); + if (!frame) return; + commands.push(frame); + if (frame.type === "chat") { + socket.send(JSON.stringify({ type: "ack", id: frame.id })); + for (const [role, text] of [ + ["user", frame.text], + [ + "assistant", + "입력과 첨부를 받았어요. 이 응답은 UI 검증용 합성 데이터입니다.", + ], + ] as const) + snapshot.messages.push({ + seq: snapshot.messages.length + 1, + entryId: randomUUID(), + role, + text, + timestamp: new Date().toISOString(), + truncated: false, + }); + snapshot.state = "idle"; + snapshot.revision++; + persist(); + } + if (frame.type === "ping") { + socket.send(JSON.stringify({ ...frame, type: "pong" })); + return; + } + if (frame.type === "approval_reply" || frame.type === "cancel") { + control.approvals = []; + control.tools = []; + control.cancelRequestId = null; + control.revision++; + snapshot.state = "idle"; + snapshot.revision++; + } + socket.send(JSON.stringify({ type: "snapshot", snapshot })); + socket.send( + JSON.stringify({ + type: "control-state", + state: { + ...control, + sessionId: snapshot.sessionId, + ...(snapshot.botId === "lina" + ? {} + : { approvals: [], tools: [], cancelRequestId: null }), + }, + }), + ); + // The real gateway must discard retired frames without affecting conversation. + socket.send( + JSON.stringify({ type: "job-error", message: "RETIRED_JOB_ERROR" }), + ); + }, + }, +}); +const web = startWebServer({ + port: Number(process.env["LINA_QA_WEB_PORT"] ?? 18140), + upstream: `ws://127.0.0.1:${upstream.port}`, + assets: await loadWebAssets(), +}); +console.log( + JSON.stringify({ + url: `http://127.0.0.1:${web.port}/?agent=lina`, + upstream: upstream.port, + root, + }), +); +const stop = () => { + void Promise.all([web.stop(true), upstream.stop(true)]).then(() => + process.exit(0), + ); +}; +process.once("SIGINT", stop); +process.once("SIGTERM", stop); diff --git a/packages/lina-web/test/hub-ui.test.ts b/packages/lina-web/test/hub-ui.test.ts index 2ae6ed0..d223a06 100644 --- a/packages/lina-web/test/hub-ui.test.ts +++ b/packages/lina-web/test/hub-ui.test.ts @@ -6,9 +6,9 @@ import { installHubSettings, parseHubStatus, safeHubGuiUrl, -} from "../client/hub-settings.ts"; -import { installModelSettings } from "../client/model-settings.ts"; -import { nextSettingsTab } from "../client/settings-tab-model.ts"; +} from "../../lina-ui/client/hub-settings.ts"; +import { installModelSettings } from "../../lina-ui/client/model-settings.ts"; +import { comboboxFixture } from "./fixtures/model-combobox.ts"; class Node { id = ""; @@ -209,15 +209,6 @@ function modelFixture() { }; } -test("settings tabs wrap with arrows and support Home/End without consuming unrelated keys", () => { - expect(nextSettingsTab("general", "ArrowRight")).toBe("connections"); - expect(nextSettingsTab("models", "ArrowDown")).toBe("general"); - expect(nextSettingsTab("general", "ArrowLeft")).toBe("models"); - expect(nextSettingsTab("models", "Home")).toBe("general"); - expect(nextSettingsTab("general", "End")).toBe("models"); - expect(nextSettingsTab("connections", "Enter")).toBeNull(); -}); - test("only https Tailscale GUI URLs can be opened in a new tab", () => { expect(safeHubGuiUrl("https://hub.example.ts.net:10100/")).toBe( "https://hub.example.ts.net:10100/", @@ -344,8 +335,10 @@ test("role dropdowns hide unsupported catalog models and refresh keeps the draft defaultProfileId: null, }; let loads = 0; + const combos = comboboxFixture(); const view = installModelSettings( f.dialog, + combos.factory, f.document, async (_path, method, body) => { if (method === "GET") { @@ -368,25 +361,22 @@ test("role dropdowns hide unsupported catalog models and refresh keeps the draft }, ); await view.open(); - const conversation = f.find("model-conversation-input"); - await conversation.fire("focus"); - expect(f.find("model-conversation-list").textContent).toContain("GLM Flash"); - expect(f.find("model-conversation-list").textContent).not.toContain( - "Summary Only", + expect( + combos.get("model-conversation").items.map((item) => item.label), + ).toContain("GLM Flash · opencodex"); + expect( + combos.get("model-conversation").items.map((item) => item.label), + ).not.toContain("Summary Only · opencodex"); + expect( + combos.get("model-conversation").items.map((item) => item.label), + ).not.toContain("Vision · opencodex"); + expect(combos.get("model-summary").items.map((item) => item.label)).toContain( + "Summary Only · opencodex", + ); + expect(combos.get("model-summary").items.map((item) => item.label)).toContain( + "GLM Flash · opencodex", ); - expect(f.find("model-conversation-list").textContent).not.toContain("Vision"); - await conversation.fire("keydown", "Escape"); - const summary = f.find("model-summary-input"); - await summary.fire("focus"); - expect(f.find("model-summary-list").textContent).toContain("Summary Only"); - expect(f.find("model-summary-list").textContent).toContain("GLM Flash"); - await summary.fire("keydown", "Escape"); - const def = f.find("model-default-input"); - await def.fire("focus"); - def.value = "glm"; - await def.fire("input"); - await def.fire("keydown", "ArrowDown"); - await def.fire("keydown", "Enter"); + combos.get("model-default").choose("opencodex/glm-flash"); expect(f.find("model-save").disabled).toBe(false); await f.find("model-reload").fire("click"); expect(f.find("model-save").disabled).toBe(false); diff --git a/packages/lina-web/test/intro-connection.test.ts b/packages/lina-web/test/intro-connection.test.ts index b8118d9..0c9dfe6 100644 --- a/packages/lina-web/test/intro-connection.test.ts +++ b/packages/lina-web/test/intro-connection.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test"; -import { checkIntroConnection } from "../client/intro-connection.ts"; +import { checkIntroConnection } from "../../lina-ui/client/intro-connection.ts"; const profile = { id: "default", diff --git a/packages/lina-web/test/intro-flow.test.ts b/packages/lina-web/test/intro-flow.test.ts index b6f6ce4..c907eb5 100644 --- a/packages/lina-web/test/intro-flow.test.ts +++ b/packages/lina-web/test/intro-flow.test.ts @@ -6,7 +6,7 @@ import { parseChooseResult, parseEntry, parseTurn, -} from "../client/intro-model.ts"; +} from "../../lina-ui/client/intro-model.ts"; test("first visit and resume route to onboarding, explicit agent route still opens ordinary room", () => { const entry = parseEntry({ firstUser: true, resume: null, legacyDrafts: [] }); @@ -57,7 +57,7 @@ test("a restored failed turn retains original request UUID and user source for r }); test("entry service failure does not prevent ordinary conversation or reopen completed intake", async () => { - const { resolveBoot } = await import("../client/intro-model.ts"); + const { resolveBoot } = await import("../../lina-ui/client/intro-model.ts"); const result = await resolveBoot( parseBootQuery("http://localhost/"), async () => { @@ -82,7 +82,7 @@ test("entry service failure does not prevent ordinary conversation or reopen com }); test("completed first setup ignores a saved user-onboarding URL", async () => { - const { resolveBoot } = await import("../client/intro-model.ts"); + const { resolveBoot } = await import("../../lina-ui/client/intro-model.ts"); let calls = 0; const r = await resolveBoot( parseBootQuery("http://localhost/?onboarding=user"), diff --git a/packages/lina-web/test/intro-starter.test.ts b/packages/lina-web/test/intro-starter.test.ts index 6a48648..731dddb 100644 --- a/packages/lina-web/test/intro-starter.test.ts +++ b/packages/lina-web/test/intro-starter.test.ts @@ -2,8 +2,11 @@ import { expect, test } from "bun:test"; import presets from "../../../data/personas/presets.json"; import { validateAgentInput } from "../../lina-core/src/agents/validation.ts"; import { unspecifiedProfile } from "../../lina-core/src/onboarding/helpers.ts"; -import type { IntroRoom } from "../client/intro-types.ts"; -import { type IntroNode, renderPanel } from "../client/intro-view.ts"; +import type { IntroRoom } from "../../lina-ui/client/intro-types.ts"; +import { + type IntroNode, + renderPanel, +} from "../../lina-ui/client/intro-view.ts"; class Node implements IntroNode { textContent: string | null = ""; diff --git a/packages/lina-web/test/markdown.test.ts b/packages/lina-web/test/markdown.test.ts index 358ec94..85d7a13 100644 --- a/packages/lina-web/test/markdown.test.ts +++ b/packages/lina-web/test/markdown.test.ts @@ -3,7 +3,7 @@ import { type MarkdownContainer, parseMarkdown, renderMarkdown, -} from "../client/markdown.ts"; +} from "../../lina-ui/client/markdown.ts"; type Listener = () => void; diff --git a/packages/lina-web/test/mind-view.test.ts b/packages/lina-web/test/mind-view.test.ts index 95d18cd..b5d2bc2 100644 --- a/packages/lina-web/test/mind-view.test.ts +++ b/packages/lina-web/test/mind-view.test.ts @@ -4,7 +4,7 @@ import { createMindView, type MindResponse, recordPresentation, -} from "../client/mind-view.ts"; +} from "../../lina-ui/client/mind-view.ts"; const available: MindResponse = { available: true, @@ -87,7 +87,9 @@ it("discards a retraction response after closing or switching agents", async () }); it("distinguishes changed, unchanged and historical failures without claiming records from receipts", async () => { - const { processingPresentation } = await import("../client/mind-view.ts"); + const { processingPresentation } = await import( + "../../lina-ui/client/mind-view.ts" + ); const text = processingPresentation({ error: null, pending: 2, diff --git a/packages/lina-web/test/model-combobox.test.ts b/packages/lina-web/test/model-combobox.test.ts deleted file mode 100644 index 68029fb..0000000 --- a/packages/lina-web/test/model-combobox.test.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { expect, test } from "bun:test"; -import { - createModelCombobox, - fitComboboxList, - placedComboboxList, -} from "../client/model-combobox.ts"; - -const qa1280 = { - input: { top: 424, bottom: 466 }, - clip: { top: 80, bottom: 548 }, - obstacle: { top: 500, bottom: 548 }, -}; - -test("short dialog under sticky actions flips the list above the trigger", () => { - const fit = fitComboboxList(qa1280); - const box = placedComboboxList(qa1280.input, fit); - expect(fit.placement).toBe("above"); - expect(box.bottom).toBeLessThanOrEqual(qa1280.input.top); - expect(box.top).toBeGreaterThanOrEqual(qa1280.clip.top); - expect(box.bottom).toBeLessThanOrEqual(qa1280.obstacle.top); - expect(box.bottom).toBeLessThanOrEqual(qa1280.clip.bottom); -}); - -test("overflowing option geometry from the 1280x577 picker stays inside the dialog", () => { - expect(596).toBeGreaterThan(548); - const fit = fitComboboxList(qa1280); - const box = placedComboboxList(qa1280.input, fit); - expect(box.bottom).toBeLessThan(554); - expect(box.bottom).toBeLessThanOrEqual(548); -}); - -test("enough room below keeps the list under the input and above sticky actions", () => { - const input = { top: 120, bottom: 162 }; - const clip = { top: 80, bottom: 548 }; - const obstacle = { top: 500, bottom: 548 }; - const fit = fitComboboxList({ input, clip, obstacle }); - const box = placedComboboxList(input, fit); - expect(fit.placement).toBe("below"); - expect(box.top).toBeGreaterThanOrEqual(input.bottom); - expect(box.bottom).toBeLessThanOrEqual(obstacle.top); - expect(box.bottom).toBeLessThanOrEqual(clip.bottom); -}); - -test("narrow mobile clip still keeps the popup inside the scrollport", () => { - const input = { top: 620, bottom: 662 }; - const clip = { top: 140, bottom: 780 }; - const obstacle = { top: 728, bottom: 780 }; - const fit = fitComboboxList({ input, clip, obstacle }); - const box = placedComboboxList(input, fit); - expect(fit.placement).toBe("above"); - expect(box.top).toBeGreaterThanOrEqual(clip.top); - expect(box.bottom).toBeLessThanOrEqual(obstacle.top); -}); - -class Node { - id = ""; - className = ""; - type = ""; - hidden = false; - disabled = false; - open = true; - min = ""; - max = ""; - step = ""; - checked = false; - parent?: Node; - children: Node[] = []; - attributes = new Map(); - style = { maxHeight: "" }; - rect = { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 }; - listeners = new Map< - string, - Array< - (event: { - key?: string; - relatedTarget?: unknown; - preventDefault(): void; - stopPropagation(): void; - }) => unknown - > - >(); - private text = ""; - private selected = ""; - constructor(readonly tag: string) {} - get textContent(): string { - return this.text + this.children.map((node) => node.textContent).join(""); - } - set textContent(value: string) { - this.text = value; - this.children = []; - } - get value(): string { - return this.selected; - } - set value(value: string) { - this.selected = value; - } - setAttribute(name: string, value: string) { - this.attributes.set(name, value); - } - removeAttribute(name: string) { - this.attributes.delete(name); - } - contains(node: unknown): boolean { - return this === node || this.children.some((child) => child.contains(node)); - } - select() {} - scrollIntoView() {} - focus() {} - checkValidity() { - return true; - } - reportValidity() { - return true; - } - append(...nodes: Node[]) { - for (const node of nodes) { - if (node.parent) - node.parent.children = node.parent.children.filter( - (item) => item !== node, - ); - node.parent = this; - this.children.push(node); - } - } - replaceChildren(...nodes: Node[]) { - this.children = []; - this.text = ""; - this.append(...nodes); - } - before() {} - after() {} - querySelectorAll(): Node[] { - return []; - } - querySelector(selector: string): Node | null { - const cls = selector.startsWith(".") ? selector.slice(1) : ""; - const walk = (node: Node): Node | null => { - if (cls && node.className.split(/\s+/).includes(cls)) return node; - for (const child of node.children) { - const found = walk(child); - if (found) return found; - } - return null; - }; - return walk(this); - } - closest(selector: string): Node | null { - const cls = selector.startsWith(".") ? selector.slice(1) : ""; - for (let node: Node | undefined = this; node; node = node.parent) { - if (selector === "dialog" && node.tag === "dialog") return node; - if (cls && node.className.split(/\s+/).includes(cls)) return node; - } - return null; - } - getBoundingClientRect() { - return this.rect; - } - addEventListener( - event: string, - listener: (event: { - key?: string; - relatedTarget?: unknown; - preventDefault(): void; - stopPropagation(): void; - }) => unknown, - ) { - this.listeners.set(event, [...(this.listeners.get(event) ?? []), listener]); - } - async fire(event: string, key?: string) { - await Promise.all( - (this.listeners.get(event) ?? []).map((listener) => - listener({ - ...(key ? { key } : {}), - preventDefault() {}, - stopPropagation() {}, - }), - ), - ); - } -} - -function widget(onChange: (value: string) => void = () => {}) { - const dialog = new Node("dialog"); - dialog.rect = { - top: 80, - bottom: 548, - left: 200, - right: 1080, - width: 880, - height: 468, - }; - const content = new Node("div"); - content.className = "settings-content"; - content.rect = dialog.rect; - const actions = new Node("div"); - actions.className = "model-actions"; - actions.rect = { - top: 500, - bottom: 548, - left: 200, - right: 1080, - width: 880, - height: 48, - }; - dialog.append(content, actions); - const combo = createModelCombobox( - { - location: { href: "http://fixture/" }, - createElement: (tag: string) => new Node(tag), - getElementById: () => null, - }, - "model-default", - "전역 기본값", - onChange, - ); - const root = combo.root as Node; - content.append(root); - const input = combo.input as Node; - input.rect = { - top: 424, - bottom: 466, - left: 420, - right: 820, - width: 400, - height: 42, - }; - combo.set( - [ - { value: "mini", label: "gpt-5.4-mini · openai" }, - { value: "codex", label: "gpt-5.6-codex · openai" }, - { value: "sol", label: "gpt-5.6-sol · openai" }, - ], - "", - "모델 선택…", - ); - return { combo: { ...combo, root }, input, list: root.children[1] as Node }; -} - -test("opening the default picker in the short dialog applies an above placement", async () => { - const { combo, input, list } = widget(); - await input.fire("focus"); - expect(combo.root.attributes.get("data-placement")).toBe("above"); - expect(combo.root.attributes.get("data-open")).toBe("true"); - const maxHeight = Number.parseInt(list.style.maxHeight, 10); - expect(maxHeight).toBeGreaterThan(0); - expect(maxHeight).toBeLessThanOrEqual(424 - 80); - const box = placedComboboxList(input.rect, { - placement: "above", - maxHeight, - }); - expect(box.bottom).toBeLessThanOrEqual(500); -}); - -test("keyboard search still commits a draft while the list is flipped", async () => { - let chosen = ""; - const { combo, input, list } = widget((value) => { - chosen = value; - }); - await input.fire("focus"); - input.value = "sol"; - await input.fire("input"); - expect(input.value).toBe("sol"); - expect(combo.root.attributes.get("data-placement")).toBe("above"); - expect(list.textContent).toContain("gpt-5.6-sol"); - expect(list.textContent).not.toContain("gpt-5.4-mini"); - await input.fire("keydown", "ArrowDown"); - await input.fire("keydown", "Enter"); - expect(chosen).toBe("sol"); - expect(combo.root.attributes.get("data-open")).toBeUndefined(); -}); diff --git a/packages/lina-web/test/model-settings-ui.test.ts b/packages/lina-web/test/model-settings-ui.test.ts index fa53126..7c56b5a 100644 --- a/packages/lina-web/test/model-settings-ui.test.ts +++ b/packages/lina-web/test/model-settings-ui.test.ts @@ -4,9 +4,10 @@ import type { ModelTrial, } from "../../lina-runtime/src/models/port.ts"; import type { ModelSettings } from "../../lina-runtime/src/models/types.ts"; -import { installModelSettings } from "../client/model-settings.ts"; +import { installModelSettings } from "../../lina-ui/client/model-settings.ts"; +import { comboboxFixture } from "./fixtures/model-combobox.ts"; -// Structural DOM fixture exercises real event handlers without a server or inference. +// Structural DOM fixture exercises controller events; browser QA owns combobox interaction. class Node { id = ""; className = ""; @@ -138,6 +139,7 @@ class Node { } } function fixture() { + const combos = comboboxFixture(); const root = new Node("dialog"); const make = (id: string, tag = "div") => { const node = new Node(tag); @@ -170,6 +172,7 @@ function fixture() { getElementById: find, }; return { + combos, root, find, document, @@ -219,6 +222,7 @@ function setup(initial?: ModelSettings) { }; const view = installModelSettings( f.dialog, + f.combos.factory, f.document, async (_path, method, body) => { if (method === "PATCH") { @@ -243,13 +247,8 @@ function setup(initial?: ModelSettings) { ); return { ...f, view, stored: () => stored }; } -async function choose(f: ReturnType, row: string, query: string) { - const input = f.find(`model-${row}-input`); - await input.fire("focus"); - input.value = query; - await input.fire("input"); - await input.fire("keydown", "ArrowDown"); - await input.fire("keydown", "Enter"); +function choose(f: ReturnType, row: string, value: string) { + f.combos.get(`model-${row}`).choose(value); } test("seven direct combobox rows select and save without registration or token UI", async () => { const f = setup(); @@ -263,12 +262,10 @@ test("seven direct combobox rows select and save without registration or token U "recall", "vision", ]) - expect(f.find(`model-${role}-input`).attributes.get("role")).toBe( - "combobox", - ); + expect(f.combos.get(`model-${role}`).input.id).toBe(`model-${role}-input`); expect(() => f.find("model-output")).toThrow(); expect(() => f.find("model-add-profile")).toThrow(); - await choose(f, "default", "glm"); + await choose(f, "default", "ollama/glm-flash"); await f.find("model-save").fire("click"); expect(f.stored().profiles[0]).toMatchObject({ provider: "ollama", @@ -282,42 +279,34 @@ test("seven direct combobox rows select and save without registration or token U test("role reasoning stays independent while its model keeps inheriting", async () => { const f = setup(); await f.view.open(); - await choose(f, "default", "glm"); + await choose(f, "default", "ollama/glm-flash"); const reason = f.find("model-summary-reasoning"); reason.value = "high"; await reason.fire("change"); - await choose(f, "default", "vision"); + await choose(f, "default", "codex/vision"); await f.find("model-save").fire("click"); expect(f.stored().roles.summary).toBeUndefined(); expect(f.stored().roleReasoning?.summary).toBe("high"); expect(f.find("model-summary-input").value).toContain("Vision"); expect(f.find("model-summary-reasoning").value).toBe("high"); }); -test("search excludes unconfigured providers and vision excludes text-only models", async () => { +test("controller supplies only configured models and image-capable vision choices", async () => { const f = setup(); await f.view.open(); - const input = f.find("model-default-input"); - await input.fire("focus"); - expect(f.find("model-default-list").textContent).not.toContain("Hidden"); - input.value = "no match"; - await input.fire("input"); - expect(f.find("model-default-empty").textContent).toContain( - "검색 결과가 없습니다", + expect(f.combos.get("model-default").items.map((item) => item.value)).toEqual( + ["ollama/glm-flash", "codex/vision"], ); - await input.fire("keydown", "Enter"); + expect(f.combos.get("model-vision").items.map((item) => item.value)).toEqual([ + "", + "codex/vision", + ]); expect(f.find("model-save").disabled).toBe(true); - const vision = f.find("model-vision-input"); - await vision.fire("focus"); - expect(f.find("model-vision-list").textContent).not.toContain("GLM Flash"); - expect(f.find("model-vision-list").textContent).toContain("Vision"); - await vision.fire("keydown", "Escape"); - expect(vision.attributes.get("aria-expanded")).toBe("false"); }); test("agent role selection and reasoning do not change global bindings", async () => { const f = setup(); await f.view.open("alpha"); - await choose(f, "default", "glm"); - await choose(f, "conversation", "vision"); + await choose(f, "default", "ollama/glm-flash"); + await choose(f, "conversation", "codex/vision"); const reason = f.find("model-conversation-reasoning"); reason.value = "medium"; await reason.fire("change"); @@ -335,6 +324,7 @@ test("closing fences a late load failure", async () => { let reject: (reason: Error) => void = () => {}; const view = installModelSettings( f.dialog, + f.combos.factory, f.document, () => new Promise((_, r) => { @@ -349,26 +339,18 @@ test("closing fences a late load failure", async () => { expect(f.find("model-settings-status").textContent).toBe(before); }); -test("model-name search chooses the actual model before inheritance and empty status is outside listbox", async () => { +test("explicit model selection creates a role binding", async () => { const f = setup(); await f.view.open(); - await choose(f, "default", "glm"); - await choose(f, "summary", "glm"); + await choose(f, "default", "ollama/glm-flash"); + await choose(f, "summary", "ollama/glm-flash"); await f.find("model-save").fire("click"); expect(f.stored().roles.summary).toBeDefined(); - const input = f.find("model-summary-input"); - input.value = "missing"; - await input.fire("input"); - expect(f.find("model-summary-empty").parent).not.toBe( - f.find("model-summary-list"), - ); }); test("reselecting inherited model in agent scope creates no false dirty edit", async () => { const f = setup(); await f.view.open("alpha"); - const input = f.find("model-summary-input"); - await input.fire("focus"); - await input.fire("keydown", "Enter"); + f.combos.get("model-summary").choose(""); expect(f.find("model-save").disabled).toBe(true); }); test("disconnected saved selection stays visible and cannot be reselected from catalog", async () => { @@ -384,24 +366,32 @@ test("disconnected saved selection stays visible and cannot be reselected from c await f.view.open(); expect(f.find("model-default-input").value).toContain("연결 확인 필요"); expect(f.find("model-save").disabled).toBe(true); - await f.find("model-default-input").fire("focus"); - expect(f.find("model-default-list").textContent).not.toContain("old-model"); + expect( + f.combos + .get("model-default") + .items.some((item) => item.value === "gone/old-model"), + ).toBe(false); }); test("model role scope includes unopened agents from the fleet catalog", async () => { const f = fixture(); - const view = installModelSettings(f.dialog, f.document, async () => ({ - settings: { - revision: 0, - profiles: [], - roles: {}, - agentRoles: {}, - defaultProfileId: null, - }, - catalog: [], - active: [], - agents: [{ id: "kai", name: "카이" }], - })); + const view = installModelSettings( + f.dialog, + f.combos.factory, + f.document, + async () => ({ + settings: { + revision: 0, + profiles: [], + roles: {}, + agentRoles: {}, + defaultProfileId: null, + }, + catalog: [], + active: [], + agents: [{ id: "kai", name: "카이" }], + }), + ); await view.open(); expect( f.find("model-scope").children.some((option) => option.value === "kai"), diff --git a/packages/lina-web/test/model-settings.test.ts b/packages/lina-web/test/model-settings.test.ts index 0002231..bcf3496 100644 --- a/packages/lina-web/test/model-settings.test.ts +++ b/packages/lina-web/test/model-settings.test.ts @@ -10,7 +10,7 @@ import { createProfile, profileFor, settingsInput, -} from "../client/model-settings.ts"; +} from "../../lina-ui/client/model-settings.ts"; const settings: ModelSettings = { revision: 4, diff --git a/packages/lina-web/test/model.test.ts b/packages/lina-web/test/model.test.ts index 347ced5..f46a8cc 100644 --- a/packages/lina-web/test/model.test.ts +++ b/packages/lina-web/test/model.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test"; -import { ChatModel } from "../client/model.ts"; +import { ChatModel } from "../../lina-client/src/model.ts"; describe("web conversation", () => { it("allows only one unresolved request when sending", () => { diff --git a/packages/lina-web/test/navigation-state.test.ts b/packages/lina-web/test/navigation-state.test.ts new file mode 100644 index 0000000..666e900 --- /dev/null +++ b/packages/lina-web/test/navigation-state.test.ts @@ -0,0 +1,49 @@ +import { expect, test } from "bun:test"; +import { + navigationLayout, + navigationUrl, + parseNavigation, +} from "../../lina-client/src/navigation-state.ts"; + +test("root opens the agent list, direct agent and task links preserve their destination", () => { + expect(parseNavigation("https://lina.test/")).toEqual({ + screen: "agents", + agentId: "lina", + }); + expect(parseNavigation("https://lina.test/?agent=writer")).toEqual({ + screen: "conversation", + agentId: "writer", + }); + expect( + parseNavigation("https://lina.test/?agent=writer&screen=tasks"), + ).toEqual({ screen: "tasks", agentId: "writer" }); + expect( + parseNavigation("https://lina.test/?agent=../other&screen=bad"), + ).toEqual({ screen: "agents", agentId: "lina" }); +}); + +test("width changes only layout, and extra task column requires explicit choice and room", () => { + const state = { screen: "conversation" as const, agentId: "writer" }; + expect(navigationUrl(state)).toBe("/?agent=writer&screen=conversation"); + expect(navigationLayout(390, true, 304)).toBe("mobile"); + expect(navigationLayout(1280, true, 304)).toBe("single"); + expect(navigationLayout(1440, false, 304)).toBe("single"); + expect(navigationLayout(1440, true, 420)).toBe("single"); + expect(navigationLayout(1440, true, 304)).toBe("dual"); + expect(state).toEqual({ screen: "conversation", agentId: "writer" }); +}); + +test("task deep links preserve the task key independently of the agent conversation", () => { + expect(parseNavigation("https://lina.test/?agent=kai&task=task-1")).toEqual({ + screen: "tasks", + agentId: "kai", + taskId: "task-1", + }); + expect( + navigationUrl({ screen: "tasks", agentId: "kai", taskId: "task-1" }), + ).toBe("/?agent=kai&screen=tasks&task=task-1"); + expect(parseNavigation("https://lina.test/?agent=kai&task=../oops")).toEqual({ + screen: "conversation", + agentId: "kai", + }); +}); diff --git a/packages/lina-web/test/onboarding-controller.test.ts b/packages/lina-web/test/onboarding-controller.test.ts index 204f92d..b0f2d85 100644 --- a/packages/lina-web/test/onboarding-controller.test.ts +++ b/packages/lina-web/test/onboarding-controller.test.ts @@ -1,14 +1,14 @@ import { expect, test } from "bun:test"; import type { AgentInput } from "../../lina-core/src/agents/types.ts"; -import { createOnboardingWizard } from "../client/onboarding.ts"; -import { OnboardingHttpError } from "../client/onboarding-api.ts"; +import { createOnboardingWizard } from "../../lina-ui/client/onboarding.ts"; +import { OnboardingHttpError } from "../../lina-ui/client/onboarding-api.ts"; import { type AgentDraft, emptyChapters, emptyUserAnswers, UNSPECIFIED, type UserState, -} from "../client/onboarding-types.ts"; +} from "../../lina-ui/client/onboarding-types.ts"; type Listener = (event: FakeEvent) => void; class FakeEvent { diff --git a/packages/lina-web/test/onboarding-model.test.ts b/packages/lina-web/test/onboarding-model.test.ts index 38e0ae4..634fb63 100644 --- a/packages/lina-web/test/onboarding-model.test.ts +++ b/packages/lina-web/test/onboarding-model.test.ts @@ -17,12 +17,12 @@ import { shouldClearPreview, userFieldSummaries, userPatch, -} from "../client/onboarding-model.ts"; +} from "../../lina-ui/client/onboarding-model.ts"; import type { AgentDraft, Chapter, UserState, -} from "../client/onboarding-types.ts"; +} from "../../lina-ui/client/onboarding-types.ts"; import { CHAPTER_IDS, emptyChapters, @@ -32,7 +32,7 @@ import { MAX_CHAPTER_TEXT, MAX_USER_ANSWER, UNSPECIFIED, -} from "../client/onboarding-types.ts"; +} from "../../lina-ui/client/onboarding-types.ts"; function profile(id = "agent-test"): AgentInput { return { diff --git a/packages/lina-web/test/preferences.test.ts b/packages/lina-web/test/preferences.test.ts index f434161..5ae867b 100644 --- a/packages/lina-web/test/preferences.test.ts +++ b/packages/lina-web/test/preferences.test.ts @@ -4,8 +4,12 @@ import { readPreferences, savePreferences, shouldSend, -} from "../client/preferences.ts"; -import { readTheme, resolveTheme, saveTheme } from "../client/theme.ts"; +} from "../../lina-client/src/preferences.ts"; +import { + readTheme, + resolveTheme, + saveTheme, +} from "../../lina-ui/client/theme.ts"; test("browser preferences validate saved values and survive blocked storage", () => { let value: string | null = null; @@ -21,14 +25,14 @@ test("browser preferences validate saved values and survive blocked storage", () textSize: "large", sendKey: "modifier", sidebarCollapsed: true, - sidebarWidth: 256, + sidebarWidth: 304, }), ).toBe(true); expect(readPreferences(storage)).toEqual({ textSize: "large", sendKey: "modifier", sidebarCollapsed: true, - sidebarWidth: 256, + sidebarWidth: 304, }); value = '{"textSize":"huge","sendKey":"wrong","sidebarCollapsed":"yes"}'; expect(readPreferences(storage)).toEqual(DEFAULT_PREFERENCES); @@ -92,12 +96,12 @@ test("system preference resolves against OS while explicit theme wins", () => { test("sidebar width validates legacy and damaged device values and preserves a chosen size", () => { const read = (sidebarWidth: unknown) => readPreferences({ getItem: () => JSON.stringify({ sidebarWidth }) }); - expect(read(undefined).sidebarWidth).toBe(256); + expect(read(undefined).sidebarWidth).toBe(304); expect(read(340).sidebarWidth).toBe(340); expect(read(120).sidebarWidth).toBe(200); expect(read(900).sidebarWidth).toBe(420); - expect(read("340").sidebarWidth).toBe(256); - expect(read(null).sidebarWidth).toBe(256); + expect(read("340").sidebarWidth).toBe(304); + expect(read(null).sidebarWidth).toBe(304); let saved = ""; const storage = { getItem: () => saved, diff --git a/packages/lina-web/test/presence.test.ts b/packages/lina-web/test/presence.test.ts index f009687..5cf8db1 100644 --- a/packages/lina-web/test/presence.test.ts +++ b/packages/lina-web/test/presence.test.ts @@ -7,7 +7,7 @@ import { activityStatus, elapsedText, operationLabel, -} from "../client/presence.ts"; +} from "../../lina-ui/client/presence.ts"; const started = "2026-09-06T01:00:00Z"; const tool: ToolRun = { diff --git a/packages/lina-web/test/protocol.test.ts b/packages/lina-web/test/protocol.test.ts index 9504e35..bf693e3 100644 --- a/packages/lina-web/test/protocol.test.ts +++ b/packages/lina-web/test/protocol.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test"; -import { parseChat, parseServerFrame } from "../src/protocol.ts"; +import { parseChat, parseServerFrame } from "../../lina-client/src/protocol.ts"; describe("web protocol", () => { for (const frame of [ diff --git a/packages/lina-web/test/pwa-assets.test.ts b/packages/lina-web/test/pwa-assets.test.ts index b3dc426..876ddcc 100644 --- a/packages/lina-web/test/pwa-assets.test.ts +++ b/packages/lina-web/test/pwa-assets.test.ts @@ -4,6 +4,8 @@ import { startWebServer } from "../src/server.ts"; test("a complete versioned shell serves manifest, icons and a scoped worker", async () => { const assets = await loadWebAssets(); + expect(assets.script).not.toContain("Download the React DevTools"); + expect(assets.script).toContain("Copyright (c) 2023 shadcn"); expect(assets.pwa).toBeDefined(); if (!assets.pwa) throw new Error("PWA missing"); const { version, files } = assets.pwa; diff --git a/packages/lina-web/test/search-model.test.ts b/packages/lina-web/test/search-model.test.ts index ba4a923..39ef212 100644 --- a/packages/lina-web/test/search-model.test.ts +++ b/packages/lina-web/test/search-model.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test"; -import { SearchModel } from "../client/search-model.ts"; +import { SearchModel } from "../../lina-client/src/search-model.ts"; const row = { seq: 3, diff --git a/packages/lina-web/test/shared-renderer.test.ts b/packages/lina-web/test/shared-renderer.test.ts new file mode 100644 index 0000000..899b04b --- /dev/null +++ b/packages/lina-web/test/shared-renderer.test.ts @@ -0,0 +1,14 @@ +import { expect, test } from "bun:test"; +import { existsSync, readFileSync } from "node:fs"; + +test("web assets build the shared renderer and portable client owns wire parsing", async () => { + const ui = new URL("../../lina-ui/client/app.ts", import.meta.url); + expect(existsSync(ui)).toBe(true); + const protocol = await import("../../lina-client/src/protocol.ts"); + expect( + protocol.parseServerFrame('{"type":"agent-status","state":"idle"}'), + ).toEqual({ type: "agent-status", state: "idle" }); + expect( + readFileSync(new URL("../src/assets.ts", import.meta.url), "utf8"), + ).toContain("../../lina-ui/client/"); +}); diff --git a/packages/lina-web/test/task-drafts.test.ts b/packages/lina-web/test/task-drafts.test.ts new file mode 100644 index 0000000..c2755ee --- /dev/null +++ b/packages/lina-web/test/task-drafts.test.ts @@ -0,0 +1,64 @@ +import { expect, test } from "bun:test"; +import { TaskDraftStore } from "../../lina-client/src/task-drafts.ts"; + +function memory() { + const values = new Map(); + return { + values, + getItem: (key: string) => values.get(key) ?? null, + setItem: (key: string, value: string) => { + values.set(key, value); + }, + removeItem: (key: string) => { + values.delete(key); + }, + }; +} +test("task drafts and all-owner scope survive a new client without mixing conversations", () => { + const storage = memory(); + storage.setItem("lina.draft.v1.lina", "agent draft"); + const first = new TaskDraftStore(storage); + expect(first.set("task-a", { input: "한글 초안", owner: "kai" })).toBe(true); + expect(first.set("task-b", { input: "different task" })).toBe(true); + first.setScope("all"); + const next = new TaskDraftStore(storage); + expect(next.get("task-a")).toEqual({ input: "한글 초안", owner: "kai" }); + expect(next.get("task-b")).toEqual({ input: "different task" }); + expect(next.scope()).toBe("all"); + expect(storage.getItem("lina.draft.v1.lina")).toBe("agent draft"); + next.delete("task-a"); + expect(new TaskDraftStore(storage).get("task-a")).toBeUndefined(); +}); +test("failed persistence retains an in-memory draft and flushes before leaving", () => { + const storage = memory(); + let fail = true; + const store = new TaskDraftStore({ + ...storage, + setItem(key, value) { + if (fail) throw Error("quota"); + storage.setItem(key, value); + }, + }); + expect(store.set("task-a", { input: "keep me" })).toBe(false); + expect(store.get("task-a")?.input).toBe("keep me"); + expect(store.flush()).toBe(false); + fail = false; + expect(store.flush()).toBe(true); + expect(new TaskDraftStore(storage).get("task-a")?.input).toBe("keep me"); +}); +test("malformed device data never becomes task input", () => { + const storage = memory(); + storage.setItem("lina.task-draft.v1.task-a", '{"input":42}'); + storage.setItem("lina.task-scope.v1", "unexpected"); + const store = new TaskDraftStore(storage); + expect(store.get("task-a")).toBeUndefined(); + expect(store.scope()).toBe("selected"); +}); + +test("discarding a never-saved draft permits leaving without a storage service", () => { + const store = new TaskDraftStore(); + expect(store.set("task-a", { input: "temporary" })).toBe(false); + expect(store.set("task-a", { input: "" })).toBe(true); + expect(store.flush()).toBe(true); + expect(store.get("task-a")).toBeUndefined(); +}); diff --git a/packages/lina-web/test/task-ui.browser.mjs b/packages/lina-web/test/task-ui.browser.mjs new file mode 100644 index 0000000..3d6c01b --- /dev/null +++ b/packages/lina-web/test/task-ui.browser.mjs @@ -0,0 +1,159 @@ +// Isolated renderer smoke. Run with Bun and an installed Playwright module. +import assert from "node:assert/strict"; + +const { chromium } = await import( + process.env.LINA_PLAYWRIGHT_MODULE ?? "playwright" +); +const client = new URL("../../lina-ui/client/", import.meta.url); +const source = await Bun.file(new URL("index.html", client)).text(); +const nav = source.match( + /]*\bid="task-pane"[^>]*>[\s\S]*?<\/nav>/, +)?.[0]; +const detail = source.match( + /]*\bid="task-dialog"[^>]*>[\s\S]*?<\/dialog>/, +)?.[0]; +assert.ok(nav && detail, "task pane and detail markup exist"); +const built = await Bun.build({ + entrypoints: [new URL("task-view.ts", client).pathname], + target: "browser", +}); +assert.ok(built.success, String(built.logs)); +const css = ( + await Promise.all( + [ + "tokens.css", + "base.css", + "sidebar.css", + "chat.css", + "composer.css", + "responsive.css", + "settings.css", + "tasks.css", + ].map((name) => Bun.file(new URL(name, client)).text()), + ) +).join("\n"); +const bootstrap = ` +import { installTasks } from '/task-view.js'; +const tasks = ['lina', 'kai'].map((ownerAgentId, index) => ({ + id: 'task-' + (index + 1), threadId: 'native-' + (index + 1), ownerAgentId, + title: index ? '카이의 로그인 오류 수정' : '리나의 긴 한글 작업 제목과 회귀 확인', + cwd: '/tmp/work', status: 'inProgress', revision: 3, model: 'fixture', + updatedAt: '2026-09-07T12:00:00Z', pendingApprovals: [] +})); +window.taskView = installTasks({ownerAgentId: 'lina', scheduler: () => () => {}, + request: async (path) => { + if (path === '/api/agents') return {agents: [{id:'lina', name:'리나'}, {id:'kai', name:'카이'}]}; + if (path === '/api/tasks') return {tasks}; + const task = tasks.find(task => path === '/api/tasks/' + task.id); + if (!task) throw Error(path); + return {task, thread: null}; + } +}); +await window.taskView.showList(); +document.body.dataset.ready = 'true'; +`; +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request) { + const path = new URL(request.url).pathname; + if (path === "/task-view.js") return new Response(built.outputs[0]); + if (path === "/bootstrap.js") + return new Response(bootstrap, { + headers: { "Content-Type": "text/javascript" }, + }); + return new Response( + `${detail}`, + { headers: { "Content-Type": "text/html" } }, + ); + }, +}); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_CHROMIUM_PATH + ? { executablePath: process.env.LINA_CHROMIUM_PATH } + : {}), + args: ["--no-sandbox"], +}); +const errors = []; +const captures = []; +try { + const page = await browser.newPage({ + viewport: { width: 1440, height: 900 }, + }); + page.on("pageerror", (error) => errors.push(error.message)); + await page.goto(server.url.href); + await page.waitForFunction(() => document.body.dataset.ready === "true"); + assert.equal(await page.locator("#task-list button").count(), 1); + await page.locator("#task-scope").selectOption("all"); + await page.getByRole("button", { name: /카이의 로그인/ }).waitFor(); + await page.evaluate(() => { + document + .querySelector("#task-column") + .append(document.querySelector("#task-pane")); + document.documentElement.dataset.sidebarCollapsed = "true"; + }); + assert.equal(await page.locator("#task-list").isVisible(), true); + assert.equal(await page.locator("#add-task").isVisible(), true); + assert.equal(await page.locator("#task-reload").isVisible(), true); + await page.getByRole("button", { name: /리나의 긴 한글/ }).click(); + await page.waitForFunction( + () => !document.querySelector("#task-interrupt").disabled, + ); + await page.locator("#task-input").fill("리나 작업에만 남길 초안"); + assert.equal( + await page.locator("#task-open-codex").getAttribute("href"), + "codex://threads/native-1", + ); + await page.locator("#task-close").click(); + await page.locator("#task-dialog").waitFor({ state: "hidden" }); + await page.getByRole("button", { name: /카이의 로그인/ }).click(); + await page.waitForFunction( + () => !document.querySelector("#task-interrupt").disabled, + ); + assert.equal(await page.locator("#task-input").inputValue(), ""); + await page.locator("#task-close").click(); + await page.locator("#task-dialog").waitFor({ state: "hidden" }); + if (process.env.TASK_UI_CAPTURE) + captures.push({ + name: "desktop-list", + data: (await page.screenshot()).toString("base64"), + }); + await page.setViewportSize({ width: 390, height: 844 }); + await page.getByRole("button", { name: /리나의 긴 한글/ }).click(); + await page.waitForFunction( + () => !document.querySelector("#task-interrupt").disabled, + ); + assert.equal( + await page.locator("#task-input").inputValue(), + "리나 작업에만 남길 초안", + ); + assert.equal( + await page.getByRole("button", { name: "담당 넘기기" }).isVisible(), + true, + ); + const bounds = await page.locator("#task-dialog").boundingBox(); + assert.equal(bounds.width, 390); + assert.equal(bounds.height, 844); + if (process.env.TASK_UI_CAPTURE) + captures.push({ + name: "mobile-detail", + data: (await page.screenshot()).toString("base64"), + }); + await page.keyboard.press("Escape"); + await page.locator("#task-dialog").waitFor({ state: "hidden" }); + assert.equal(await page.locator("#task-scope").inputValue(), "all"); + assert.equal(await page.locator("#task-list button").count(), 2); + assert.deepEqual(errors, []); + console.log( + JSON.stringify({ + result: "pass", + viewports: ["1440x900", "390x844"], + errors, + captures, + }), + ); +} finally { + await browser.close(); + await server.stop(true); +} diff --git a/packages/lina-web/test/task-ui.test.ts b/packages/lina-web/test/task-ui.test.ts index 44eeb90..46dc0ff 100644 --- a/packages/lina-web/test/task-ui.test.ts +++ b/packages/lina-web/test/task-ui.test.ts @@ -7,13 +7,14 @@ import { parseTaskDetail, parseTaskList, taskDeepLink, -} from "../client/task-view.ts"; +} from "../../lina-ui/client/task-view.ts"; class Node { id = ""; className = ""; type = ""; hidden = false; + scrollTop = 0; attributes = new Map(); setAttribute(k: string, v: string) { this.attributes.set(k, v); @@ -162,6 +163,11 @@ function fixture() { root.append(node); return node; }; + const tasksDialog = make("tasks-dialog", "section"); + Object.defineProperty(tasksDialog, "showModal", { value: undefined }); + Object.defineProperty(tasksDialog, "close", { value: undefined }); + tasksDialog.hidden = true; + make("task-list"); make("tasks-status", "p"); make("add-task", "button"); @@ -199,7 +205,8 @@ function fixture() { document: { location: { href: "http://fixture/?agent=lina" }, createElement: (tag: string) => new Node(tag), - getElementById: find, + getElementById: (id: string) => + [root, ...walk(root)].find((item) => item.id === id) ?? null, }, }; } @@ -966,3 +973,313 @@ test("live detail fills new turn history even when its summary revision was alre expect(f.find("task-history").textContent).toContain("새로 보낸 메시지"); view.close(); }); + +const otherTask = { + ...sampleTask, + id: "task-2", + threadId: "other-native-thread", + ownerAgentId: "kai", + title: "카이 작업", +}; +const taskAgents = { + agents: [ + { id: "lina", name: "리나" }, + { id: "kai", name: "카이" }, + ], +}; + +test("task list defaults to selected owner and all scope follows actual owners", async () => { + const f = fixture(); + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path) => { + if (path === "/api/agents") return taskAgents; + expect(path).toBe("/api/tasks"); + return { + tasks: [ + sampleTask, + otherTask, + { + ...sampleTask, + id: "unknown", + ownerAgentId: "gone", + title: "남은 작업", + }, + ], + }; + }, + }); + await view.showList(); + expect(f.find("tasks-dialog").hidden).toBe(false); + expect(f.find("task-list").querySelectorAll("button")).toHaveLength(1); + expect(f.find("task-scope").textContent).toContain("담당: 리나"); + await view.setScope("all"); + expect(f.find("task-list").querySelectorAll("button")).toHaveLength(3); + expect(f.find("task-open-task-2").textContent).toContain("카이"); + expect(f.find("task-open-unknown").textContent).toContain("담당 미지정"); + await view.setOwner("kai"); + expect(f.find("task-scope").value).toBe("all"); + expect(f.find("task-list").querySelectorAll("button")).toHaveLength(3); + f.find("task-scope").value = "selected"; + await f.find("task-scope").fire("change"); + expect(f.find("task-list").querySelectorAll("button")).toHaveLength(1); + expect(f.find("task-list").textContent).toContain("카이 작업"); + view.close(); +}); + +test("detail back retains list scope scroll and task-specific input and owner drafts", async () => { + const f = fixture(); + const events: string[] = []; + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + onShowList: () => events.push("list"), + onOpen: (id) => events.push(id), + request: async (path) => { + if (path === "/api/agents") return taskAgents; + if (path === "/api/tasks") return { tasks: [sampleTask, otherTask] }; + return { + task: path.endsWith("task-2") ? otherTask : sampleTask, + thread: null, + }; + }, + }); + await view.setScope("all"); + await view.showList(); + f.find("task-list").scrollTop = 120; + await view.open("task-1"); + f.find("task-input").value = "첫 작업 초안"; + f.find("task-owner").value = "kai"; + await view.refresh(); + await view.showList(); + expect(f.dialog.open).toBe(false); + expect(f.find("task-list").scrollTop).toBe(120); + expect(f.find("task-scope").value).toBe("all"); + await view.open("task-2"); + expect(f.find("task-input").value).toBe(""); + f.find("task-input").value = "둘째 초안"; + await view.open("task-1"); + expect(f.find("task-input").value).toBe("첫 작업 초안"); + expect(f.find("task-owner").value).toBe("kai"); + expect(f.find("task-open-codex").attributes.get("href")).toBe( + "codex://threads/thread-abc", + ); + await f.find("task-close").fire("click"); + expect(events.at(-1)).toBe("list"); + expect(events).toContain("task-2"); + view.close(); +}); + +test("owner switch discards stale list and agent-directory responses", async () => { + const f = fixture(); + const oldTasks = Promise.withResolvers(); + const oldAgents = Promise.withResolvers(); + let lists = 0; + let agents = 0; + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path) => { + if (path === "/api/agents") + return ++agents === 1 ? oldAgents.promise : taskAgents; + return ++lists === 1 + ? oldTasks.promise + : { tasks: [sampleTask, otherTask] }; + }, + }); + const old = view.refresh(); + await view.setOwner("kai"); + oldTasks.resolve({ tasks: [] }); + oldAgents.resolve({ agents: [{ id: "kai", name: "오래된 이름" }] }); + await old; + expect(f.find("task-list").textContent).toContain("카이 작업"); + expect(f.find("task-scope").textContent).not.toContain("오래된 이름"); + view.close(); +}); + +test("scope switch invalidates pending detail and a late mutation without losing drafts", async () => { + const f = fixture(); + const detail = Promise.withResolvers(); + const mutation = Promise.withResolvers(); + const sent = Promise.withResolvers(); + let reads = 0; + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path, method = "GET") => { + if (method === "POST") { + sent.resolve(); + return mutation.promise; + } + if (path === "/api/agents") return taskAgents; + if (path === "/api/tasks") return { tasks: [sampleTask, otherTask] }; + return ++reads === 1 + ? detail.promise + : { task: sampleTask, thread: null }; + }, + }); + const opening = view.open("task-1"); + await view.setScope("all"); + detail.resolve({ task: { ...sampleTask, title: "늦은 상세" }, thread: null }); + await opening; + expect(f.dialog.open).toBe(false); + await view.open("task-1"); + f.find("task-input").value = "보류한 입력"; + const sending = f.find("task-send").fire("click"); + await sent.promise; + await view.setScope("selected"); + mutation.resolve({ + task: { ...sampleTask, title: "늦은 응답", revision: 20 }, + }); + await sending; + await view.open("task-1"); + expect(f.find("task-heading").textContent).toBe("로그 정리"); + expect(f.find("task-input").value).toBe("보류한 입력"); + view.close(); +}); + +test("refresh during detail load preserves the active detail and owner selection", async () => { + const f = fixture(); + const gate = Promise.withResolvers(); + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path) => { + if (path === "/api/agents") return taskAgents; + if (path === "/api/tasks") return { tasks: [sampleTask] }; + return gate.promise; + }, + }); + const opening = view.open("task-1"); + await view.refresh(); + gate.resolve({ task: sampleTask, thread: null }); + await opening; + expect(f.find("task-heading").textContent).toBe("로그 정리"); + expect(f.find("task-owner").value).toBe("lina"); + expect(f.find("task-interrupt").disabled).toBe(false); + view.close(); +}); + +test("inline task pane needs no list dialog and closes detail before asynchronous native close events", async () => { + const f = fixture(); + f.find("tasks-dialog").id = "task-pane"; + const callbacks: string[] = []; + f.dialog.close = () => { + f.dialog.open = false; + }; + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + onShowList: () => callbacks.push("list"), + request: async (path) => { + if (path === "/api/agents") return taskAgents; + if (path === "/api/tasks") return { tasks: [sampleTask] }; + return { task: sampleTask, thread: null }; + }, + }); + await view.showList(); + expect(f.find("task-pane").hidden).toBe(false); + await view.open("task-1"); + await view.showList(); + expect(callbacks).toEqual(["list", "list"]); + await view.open("task-1"); + await f.dialog.fire("close"); + expect(f.dialog.hidden).toBe(false); + expect(f.dialog.open).toBe(true); + expect(callbacks).toEqual(["list", "list"]); + view.close(); +}); + +test("create uses the newly selected owner even when all tasks are shown", async () => { + const f = fixture(); + const created = Promise.withResolvers(); + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path, method = "GET", body) => { + if (method === "POST") { + created.resolve(body); + return { task: otherTask }; + } + if (path === "/api/agents") return taskAgents; + return { tasks: [] }; + }, + }); + await view.setScope("all"); + await view.setOwner("kai"); + await f.find("add-task").fire("click"); + f.find("task-title").value = "정리"; + f.find("task-cwd").value = "/tmp/work"; + f.find("task-prompt").value = "파일 정리"; + await f.find("task-create-submit").fire("click"); + expect(await created.promise).toMatchObject({ ownerAgentId: "kai" }); + view.close(); +}); + +test("live handover adds a newly discovered owner without dropping an edited owner draft", async () => { + const f = fixture(); + let task = { ...sampleTask }; + let directory = { agents: [{ id: "lina", name: "리나" }] }; + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + request: async (path) => { + if (path === "/api/agents") return directory; + if (path === "/api/tasks") return { tasks: [task] }; + return { task, thread: null }; + }, + }); + await view.open("task-1"); + directory = taskAgents; + task = { ...task, ownerAgentId: "kai", revision: 4 }; + await view.sync(); + expect( + f + .find("task-owner") + .querySelectorAll("option") + .map((option) => option.value), + ).toContain("kai"); + expect(f.find("task-owner").value).toBe("kai"); + f.find("task-owner").value = "lina"; + task = { ...task, revision: 5 }; + await view.sync(); + expect(f.find("task-owner").value).toBe("lina"); + view.close(); +}); + +test("editing a restored task while its detail loads preserves the edited owner", async () => { + const f = fixture(); + const values = new Map([ + [ + "lina.task-draft.v1.task-1", + JSON.stringify({ input: "saved task draft", owner: "kai" }), + ], + ]); + const pending = Promise.withResolvers(); + const view = installTasks({ + ownerAgentId: "lina", + document: f.document, + storage: { + getItem: (key) => values.get(key) ?? null, + setItem: (key, value) => { + values.set(key, value); + }, + removeItem: (key) => { + values.delete(key); + }, + }, + request: async (path) => + path === "/api/agents" ? taskAgents : pending.promise, + }); + const opening = view.open("task-1"); + f.find("task-input").value = "edited while loading"; + await f.find("task-input").fire("input"); + pending.resolve({ task: sampleTask, thread: null }); + await opening; + expect(f.find("task-owner").value).toBe("kai"); + expect(JSON.parse(values.get("lina.task-draft.v1.task-1") ?? "null")).toEqual( + { input: "edited while loading", owner: "kai" }, + ); + view.close(); +}); diff --git a/packages/lina-web/test/theme.test.ts b/packages/lina-web/test/theme.test.ts index a0389fa..1554e12 100644 --- a/packages/lina-web/test/theme.test.ts +++ b/packages/lina-web/test/theme.test.ts @@ -1,5 +1,5 @@ import { expect, test } from "bun:test"; -import { readTheme, saveTheme } from "../client/theme.ts"; +import { readTheme, saveTheme } from "../../lina-ui/client/theme.ts"; test("appearance defaults to dark and preserves an explicit light preference", () => { let value: string | null = null; diff --git a/packages/lina-web/test/tool-label.test.ts b/packages/lina-web/test/tool-label.test.ts index 41e6c76..543dc39 100644 --- a/packages/lina-web/test/tool-label.test.ts +++ b/packages/lina-web/test/tool-label.test.ts @@ -4,7 +4,7 @@ import { COMMAND_DETAIL_MAX_CHARS, toolLabel, toolSummary, -} from "../client/tool-label.ts"; +} from "../../lina-ui/client/tool-label.ts"; test("tool labels map known tools and bound unknown names", () => { for (const name of [ diff --git a/packages/lina-web/test/tool-view.test.ts b/packages/lina-web/test/tool-view.test.ts index f46630d..3db9687 100644 --- a/packages/lina-web/test/tool-view.test.ts +++ b/packages/lina-web/test/tool-view.test.ts @@ -1,10 +1,10 @@ import { expect, test } from "bun:test"; -import type { ChatMessage } from "../client/model.ts"; +import type { ChatMessage } from "../../lina-client/src/model.ts"; import { createToolNode, type ToolElement, updateToolNode, -} from "../client/tool-view.ts"; +} from "../../lina-ui/client/tool-view.ts"; class FakeElement implements ToolElement { readonly children: FakeElement[] = []; diff --git a/scripts/qa/ui-agent-list.mjs b/scripts/qa/ui-agent-list.mjs new file mode 100644 index 0000000..85959ff --- /dev/null +++ b/scripts/qa/ui-agent-list.mjs @@ -0,0 +1,447 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; + +// Bun + an installed Playwright; isolated component host, no model or user data. +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const root = fileURLToPath(new URL("../../", import.meta.url)); +const output = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-agent-list-evidence"; +await mkdir(output, { recursive: true }); +const bundle = await Bun.build({ + entrypoints: ["agent-list-qa"], + target: "browser", + define: { "process.env.NODE_ENV": '"production"' }, + plugins: [ + { + name: "agent-list-fixture", + setup(build) { + build.onResolve({ filter: /^agent-list-qa$/ }, () => ({ + path: "agent-list-qa", + namespace: "fixture", + })); + build.onLoad({ filter: /.*/, namespace: "fixture" }, () => ({ + loader: "ts", + resolveDir: root, + contents: ` +import { createAgentListView } from ${JSON.stringify(`${root}packages/lina-ui/client/agent-list.ts`)}; +import { AgentListModel } from ${JSON.stringify(`${root}packages/lina-client/src/agent-list.ts`)}; +import ${JSON.stringify(`${root}packages/lina-ui/client/styles.css`)}; +const model = new AgentListModel("lina"); +const profiles = [ + { id: "lina", name: "Lina", role: "개인 에이전트", avatarId: null }, + { id: "writer", name: "긴 이름 작가", role: "글쓰기", avatarId: null }, + { id: "research", name: "Research", role: "자료 조사", avatarId: null }, +]; +const calls = { selected: [], menus: [], retries: 0 }; +const render = createAgentListView(model, document.querySelector("#other-agents"), document.querySelector("#agent-list-status"), { + select(id) { calls.selected.push(id); }, + menu(id, opener) { calls.menus.push({ id, connected: opener.isConnected, label: opener.getAttribute("aria-label"), className: opener.className }); }, + retry() { calls.retries++; }, +}); +const filter = document.querySelector("#agent-filter"); +filter.addEventListener("input", () => { model.setFilter(filter.value); render(); }); +render(); +window.fixture = { model, profiles, calls, render }; +`, + })); + }, + }, + ], +}); +assert.ok(bundle.success, bundle.logs.join("\n")); +const assets = new Map( + bundle.outputs.map((asset) => [asset.path.replace(/^\.\//, "/"), asset]), +); +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request) { + const path = new URL(request.url).pathname; + if (path === "/") + return new Response( + ``, + { headers: { "content-type": "text/html" } }, + ); + const asset = assets.get(path); + return asset + ? new Response(asset) + : new Response("Not found", { status: 404 }); + }, +}); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const context = await browser.newContext({ + viewport: { width: 390, height: 844 }, + hasTouch: true, +}); +await context.tracing.start({ screenshots: true, snapshots: true }); +const page = await context.newPage(); +const errors = []; +page.on("pageerror", (error) => errors.push(error.message)); +const results = []; +const row = (id) => page.locator(`[data-agent-id="${id}"] .agent-link`); +async function reset() { + await page.goto(server.url.href); + await page.waitForFunction(() => !!window.fixture); + await page.evaluate(() => { + fixture.model.replace(fixture.profiles); + fixture.render(); + }); +} +async function check(name, run) { + try { + await reset(); + await run(); + results.push({ name, pass: true }); + } catch (error) { + results.push({ name, pass: false, error: String(error) }); + await page.screenshot({ path: `${output}/failure-${results.length}.png` }); + } +} +const touch = { + pointerType: "touch", + pointerId: 1, + isPrimary: true, + clientX: 25, + clientY: 25, +}; +try { + await check("filtering a pressed row cancels its menu", async () => { + await page.clock.install(); + await row("writer").dispatchEvent("pointerdown", touch); + await page.locator("#agent-filter").fill("Research"); + await page.clock.runFor(600); + assert.deepEqual(await page.evaluate(() => fixture.calls.menus), []); + }); + await check("scroll cancels a pending touch menu", async () => { + await page.clock.install(); + await row("writer").dispatchEvent("pointerdown", touch); + await page.locator(".sidebar-content").dispatchEvent("scroll"); + await page.clock.runFor(600); + assert.deepEqual(await page.evaluate(() => fixture.calls.menus), []); + }); + await check( + "keyboard, selection, menu openers and stable retained rows", + async () => { + await row("lina").focus(); + await page.keyboard.press("ArrowDown"); + assert.equal( + await row("writer").evaluate((node) => node === document.activeElement), + true, + ); + await page.keyboard.press("End"); + assert.equal( + await row("research").evaluate( + (node) => node === document.activeElement, + ), + true, + ); + await page.keyboard.press("ArrowUp"); + await page.keyboard.press("Home"); + await page.keyboard.press("Enter"); + assert.deepEqual(await page.evaluate(() => fixture.calls.selected), [ + "lina", + ]); + await page.keyboard.press("Shift+F10"); + await row("writer").dispatchEvent("contextmenu"); + await page.locator('[data-agent-id="research"] .agent-more').click(); + assert.deepEqual( + await page.evaluate(() => + fixture.calls.menus.map(({ id, connected }) => ({ id, connected })), + ), + [ + { id: "lina", connected: true }, + { id: "writer", connected: true }, + { id: "research", connected: true }, + ], + ); + assert.ok( + await page.evaluate(() => + fixture.calls.menus.every( + (call) => + call.className.includes("agent-more") && + call.label.endsWith(" 메뉴"), + ), + ), + ); + await row("writer").focus(); + const stable = await row("writer").elementHandle(); + await page.evaluate(() => { + fixture.model.replace([...fixture.profiles].reverse()); + fixture.model.setCurrent("writer"); + fixture.model.setDraft("writer", "업데이트된 초안"); + fixture.render(); + }); + assert.equal( + await stable.evaluate( + (node) => + node === + document.querySelector('[data-agent-id="writer"] .agent-link') && + node === document.activeElement, + ), + true, + ); + await page.locator("#agent-filter").fill("글쓰기"); + assert.equal(await row("writer").isVisible(), true); + assert.equal(await row("lina").isVisible(), false); + }, + ); + await check("long press, move, up, cancel and leave", async () => { + await page.clock.install(); + for (const type of [ + "pointermove", + "pointerup", + "pointercancel", + "pointerleave", + ]) { + await row("writer").dispatchEvent("pointerdown", touch); + // Browsers emit out before leave; React derives onPointerLeave from out. + if (type === "pointerleave") + await row("writer").dispatchEvent("pointerout", touch); + await row("writer").dispatchEvent(type, { + ...touch, + clientY: type === "pointermove" ? 50 : 25, + }); + await page.clock.runFor(600); + assert.deepEqual( + await page.evaluate(() => fixture.calls.menus), + [], + type, + ); + } + assert.deepEqual(await page.evaluate(() => fixture.calls.menus), []); + await row("writer").dispatchEvent("pointerdown", touch); + await page.clock.runFor(550); + await row("writer").dispatchEvent("pointerup", touch); + await row("writer").dispatchEvent("click", { detail: 1 }); + assert.deepEqual( + await page.evaluate(() => fixture.calls.menus.map((call) => call.id)), + ["writer"], + ); + assert.deepEqual(await page.evaluate(() => fixture.calls.selected), []); + await row("writer").click(); + assert.deepEqual(await page.evaluate(() => fixture.calls.selected), [ + "writer", + ]); + }); + await check( + "status, row details, unread and confirmation precedence", + async () => { + await page.evaluate(() => { + fixture.model.updateSummary({ + agentId: "writer", + available: true, + sessionId: "session", + revision: 1, + latestMessage: { + entryId: "a", + seq: 1, + role: "assistant", + text: "저장된 답변", + timestamp: "2026-08-05T12:00:00Z", + }, + confirmationCount: 0, + running: true, + }); + fixture.render(); + }); + const writer = page.locator('[data-agent-id="writer"]'); + assert.equal( + await writer.locator("strong").getAttribute("title"), + "긴 이름 작가", + ); + assert.equal( + await writer.locator("small").getAttribute("title"), + "저장된 답변", + ); + assert.equal( + await writer.locator("time").getAttribute("datetime"), + "2026-08-05T12:00:00Z", + ); + assert.equal(await writer.locator("time").isVisible(), true); + assert.equal(await writer.locator(".agent-working").isVisible(), true); + assert.equal( + await row("writer").getAttribute("aria-label"), + "긴 이름 작가 · 글쓰기 · 저장된 답변 · 작업 중", + ); + await page.evaluate(() => { + fixture.model.markVisible("writer", "session", 1); + const summary = fixture.model.summary("writer"); + fixture.model.updateSummary({ + ...summary, + revision: 2, + latestMessage: { ...summary.latestMessage, seq: 2 }, + confirmationCount: 2, + }); + fixture.model.summariesFailed(); + fixture.render(); + }); + assert.equal( + await writer.locator("small").textContent(), + "확인 필요 · 2건", + ); + assert.equal(await writer.locator(".agent-unread").isVisible(), true); + assert.equal(await writer.locator(".agent-working").isVisible(), false); + assert.ok( + (await writer.getAttribute("class")).includes("needs-confirmation"), + ); + assert.equal( + await row("writer").getAttribute("aria-label"), + "긴 이름 작가 · 글쓰기 · 확인 필요 · 2건 · 읽지 않은 메시지 · 요약 새로 고침 실패 · 작업 중", + ); + const status = page.locator("#agent-list-status"); + assert.ok( + (await status.textContent()).includes( + "일부 대화 요약을 새로 불러오지 못했어요.", + ), + ); + await status.getByRole("button", { name: "다시 시도" }).click(); + assert.equal(await page.evaluate(() => fixture.calls.retries), 1); + await page.screenshot({ path: `${output}/mobile-states.png` }); + await page.setViewportSize({ width: 1440, height: 900 }); + await page.screenshot({ path: `${output}/desktop-states.png` }); + await page.evaluate(() => { + fixture.model.fail(); + fixture.render(); + }); + assert.ok( + (await status.textContent()).includes( + "에이전트 목록을 불러오지 못했어요.", + ), + ); + await page.evaluate(() => { + fixture.model.status = "loading"; + fixture.render(); + }); + assert.equal( + await page.locator("#other-agents").getAttribute("aria-busy"), + "true", + ); + assert.ok( + (await status.textContent()).includes("에이전트를 불러오는 중…"), + ); + await page.evaluate(() => { + fixture.model.replace([]); + fixture.render(); + }); + assert.ok( + (await status.textContent()).includes("아직 에이전트가 없어요."), + ); + await page.locator("#agent-filter").fill("없음"); + assert.ok( + (await status.textContent()).includes( + "이름이나 역할이 일치하는 에이전트가 없어요.", + ), + ); + assert.equal(await status.getAttribute("role"), "status"); + assert.equal(await status.getAttribute("aria-live"), "polite"); + }, + ); + await check( + "avatar source changes, load failure and Unicode fallback", + async () => { + const avatar = page.locator('[data-agent-id="writer"] .avatar'); + assert.equal(await avatar.textContent(), "긴"); + await page.route("**/api/avatars/**", (route) => + route.fulfill({ + contentType: "image/svg+xml", + body: route.request().url().endsWith("valid%2Fimage") + ? '' + : "invalid image", + }), + ); + const updateAvatar = async (avatarId, name = "긴 이름 작가") => + page.evaluate( + ({ avatarId, name }) => { + fixture.model.replace( + fixture.profiles.map((profile) => + profile.id === "writer" + ? { ...profile, avatarId, name } + : profile, + ), + ); + fixture.render(); + }, + { avatarId, name }, + ); + await updateAvatar("valid/image"); + await avatar.locator("img").waitFor({ state: "visible" }); + assert.ok( + await avatar + .locator("img") + .evaluate((node) => node.complete && node.naturalWidth > 0), + ); + assert.equal(await avatar.textContent(), ""); + await updateAvatar("broken"); + await avatar.locator("img").waitFor({ state: "detached" }); + await page.waitForFunction( + () => + document.querySelector('[data-agent-id="writer"] .avatar') + .textContent === "긴", + ); + await updateAvatar(null, " 𠮷田 "); + assert.equal(await avatar.textContent(), "𠮷"); + assert.equal(await avatar.getAttribute("aria-hidden"), "true"); + await updateAvatar(null, " "); + assert.equal(await avatar.textContent(), "?"); + await updateAvatar("valid/image"); + await avatar.locator("img").waitFor({ state: "visible" }); + }, + ); + await check( + "navigation notice recovers through the next normal render", + async () => { + const status = page.locator("#agent-list-status"); + await page.evaluate(() => + fixture.render.notice( + "대화를 열지 못했어요. 에이전트를 다시 선택해주세요.", + ), + ); + assert.equal( + await status.locator("span").textContent(), + "대화를 열지 못했어요. 에이전트를 다시 선택해주세요.", + ); + assert.equal(await status.isVisible(), true); + assert.equal( + await status.getByRole("button", { name: "다시 시도" }).isVisible(), + false, + ); + await row("writer").click(); + await page.evaluate(() => { + fixture.model.setCurrent("writer"); + fixture.render(); + }); + assert.equal(await status.isVisible(), false); + assert.equal(await row("writer").getAttribute("aria-current"), "true"); + await page.evaluate(() => { + fixture.render.notice("선택을 다시 확인해주세요."); + fixture.model.fail(); + fixture.render(); + }); + assert.ok( + (await status.textContent()).includes( + "에이전트 목록을 불러오지 못했어요.", + ), + ); + await status.getByRole("button", { name: "다시 시도" }).click(); + assert.equal(await page.evaluate(() => fixture.calls.retries), 1); + }, + ); + assert.deepEqual(errors, []); +} finally { + await context.tracing.stop({ path: `${output}/trace.zip` }); + await browser.close(); + await server.stop(true); + await writeFile( + `${output}/results.json`, + JSON.stringify({ results, errors }, null, 2), + ); +} +console.log(JSON.stringify({ results, errors }, null, 2)); +if (results.some((result) => !result.pass)) process.exitCode = 1; diff --git a/scripts/qa/ui-components.mjs b/scripts/qa/ui-components.mjs new file mode 100644 index 0000000..56bc26e --- /dev/null +++ b/scripts/qa/ui-components.mjs @@ -0,0 +1,113 @@ +import assert from "node:assert/strict"; +import { mkdir } from "node:fs/promises"; + +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const output = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-ui-components"; +await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); +const errors = []; +page.on("pageerror", (e) => errors.push(e.message)); +try { + await page.goto(process.env.LINA_QA_URL ?? "http://127.0.0.1:18150"); + await page.locator("#other-agents .agent-link").first().waitFor(); + for (const [trigger, menu] of [ + ["#account-button", "#account-menu"], + ["#other-agents .agent-more", "#agent-actions"], + ]) { + for (const key of ["Tab", "Shift+Tab"]) { + const button = page.locator(trigger).first(); + await button.focus(); + await page.keyboard.press(key); + await page.evaluate(() => { + window.expectedTabTarget = document.activeElement; + }); + await button.click(); + await page.locator(menu).waitFor(); + await page.keyboard.press(key); + await page.locator(menu).waitFor({ state: "hidden", timeout: 2000 }); + await page.waitForFunction( + () => document.activeElement === window.expectedTabTarget, + undefined, + { timeout: 2000 }, + ); + } + } + await page.locator("#account-button").focus(); + await page.keyboard.press("ArrowUp"); + await page + .locator("#account-menu") + .waitFor({ state: "visible", timeout: 3000 }); + await page.waitForFunction( + () => document.activeElement?.id === "open-shortcuts", + ); + await page.keyboard.press("Home"); + await page.waitForFunction( + () => document.activeElement?.id === "open-settings", + ); + await page.keyboard.press("End"); + await page.waitForFunction( + () => document.activeElement?.id === "open-shortcuts", + ); + await page.keyboard.press("Escape"); + await page.waitForFunction( + () => document.activeElement?.id === "account-button", + ); + await page.locator("#account-button").click(); + await page.locator("#account-menu").waitFor(); + await page.locator("#account-button").click(); + await page + .locator("#account-menu") + .waitFor({ state: "hidden", timeout: 2000 }); + await page.locator("#account-button").click(); + await page.locator("#open-settings").click(); + await page.locator("#settings-dialog").waitFor(); + await page.keyboard.press("Escape"); + await page.locator("#settings-dialog").waitFor({ state: "hidden" }); + await page.locator("#message").fill("컴포넌트 전환 후에도 남아야 하는 초안"); + const more = page.locator("#other-agents .agent-more").first(); + await more.click(); + await page.locator("#agent-actions").waitFor(); + await page.keyboard.press("End"); + await page.waitForFunction(() => document.activeElement?.id === "open-mind"); + await page.keyboard.press("Escape"); + await page.waitForFunction( + () => + document.querySelector("#other-agents .agent-more") === + document.activeElement, + ); + await more.click(); + await page.locator("#agent-actions").waitFor(); + await page.locator("#message").click(); + await page.locator("#agent-actions").waitFor({ state: "hidden" }); + assert.equal( + await page.locator("#message").inputValue(), + "컴포넌트 전환 후에도 남아야 하는 초안", + ); + await page.locator("#current-agent-settings").click(); + await page.locator("#edit-agent").click(); + await page.locator("#agent-dialog").waitFor(); + await page.waitForFunction(() => + document.querySelector("#agent-dialog")?.contains(document.activeElement), + ); + assert.equal( + await page + .locator("#agent-dialog") + .evaluate((e) => e.contains(document.activeElement)), + true, + ); + await page.keyboard.press("Escape"); + assert.deepEqual(errors, []); + console.log( + "PASS shared menus: keyboard entry, roving focus, escape, dialog handoff, outside dismissal, draft retention", + ); +} finally { + await browser.close(); +} diff --git a/scripts/qa/ui-design.mjs b/scripts/qa/ui-design.mjs new file mode 100644 index 0000000..0bcb304 --- /dev/null +++ b/scripts/qa/ui-design.mjs @@ -0,0 +1,176 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; + +// Geometry and actual-render evidence for the shared UI. Use the synthetic fixture. +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const base = process.env.LINA_QA_URL ?? "http://127.0.0.1:18150"; +const output = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-ui-design-review"; +await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); +const errors = []; +const measurements = []; +page.on("pageerror", (error) => errors.push(error.message)); +try { + await page.goto(`${base}/?agent=lina`); + await page.locator("#other-agents .agent-row").first().waitFor(); + await page.locator("#messages .message").first().waitFor(); + const palette = await page.evaluate(() => { + const style = getComputedStyle(document.documentElement); + return Object.fromEntries( + ["--surface-main", "--surface-sidebar", "--input-bg"].map((key) => [ + key, + style.getPropertyValue(key).trim(), + ]), + ); + }); + await page.screenshot({ path: join(output, "desktop.png") }); + // The user-provided Codex reference has the darkest reading surface, then sidebar, + // then composer. Previous Lina implementation inverted the first two surfaces. + assert.equal( + palette["--surface-main"], + "#181818", + "reference: darkest reading surface", + ); + assert.equal( + palette["--surface-sidebar"], + "#212121", + "reference: raised navigation surface", + ); + for (const width of [1440, 1024, 768, 390, 320]) { + await page.setViewportSize({ width, height: width < 768 ? 844 : 900 }); + if (width < 768 && (await page.locator("#other-agents").isVisible())) + await page + .locator('#other-agents [data-agent-id="lina"] .agent-link') + .click(); + await page.locator("#message").fill("다음 주 여행 준비를 함께 정리해줘."); + const geometry = await page.evaluate(() => { + const rect = (selector) => { + const r = document.querySelector(selector).getBoundingClientRect(); + return { + x: r.x, + y: r.y, + width: r.width, + height: r.height, + right: r.right, + bottom: r.bottom, + }; + }; + return { + viewport: innerWidth, + scrollWidth: document.documentElement.scrollWidth, + composer: rect(".composer"), + send: rect("#send"), + attach: rect("#attach-file"), + model: rect("#composer-model"), + header: rect(".chat-header"), + title: rect("#chat-agent-name"), + menu: rect("#current-agent-settings"), + }; + }); + measurements.push(geometry); + assert.ok( + geometry.scrollWidth <= width, + `no horizontal page overflow at ${width}`, + ); + assert.ok( + Math.abs(geometry.send.width - geometry.send.height) < 1, + "send has a circular icon target", + ); + assert.ok( + Math.abs( + geometry.send.y + + geometry.send.height / 2 - + (geometry.attach.y + geometry.attach.height / 2), + ) < 1, + "composer controls share a center line", + ); + assert.ok( + geometry.model.right <= geometry.send.x, + "model control does not overlap send", + ); + assert.ok( + geometry.composer.bottom <= (width < 768 ? 844 : 900), + "composer stays in viewport", + ); + assert.equal( + await page.locator("#attach-file svg").count(), + 1, + "attachment has a real shared-size SVG icon", + ); + if (width < 768) { + assert.ok( + geometry.send.width >= 44 && geometry.attach.width >= 44, + "mobile action targets >=44px", + ); + assert.ok( + geometry.title.right <= geometry.menu.x, + "title does not overlap header actions", + ); + } + await page.locator("#message").blur(); + await page.screenshot({ path: join(output, `conversation-${width}.png`) }); + } + await page.locator("#open-sidebar").click(); + await page.locator("#mobile-settings").click(); + await page.locator("#settings-dialog[open]").waitFor(); + for (const width of [390, 320]) { + await page.setViewportSize({ width, height: 844 }); + const tabs = await page + .locator('.settings-navigation [role="tab"] span') + .evaluateAll((nodes) => + nodes.map((node) => ({ + height: node.getBoundingClientRect().height, + line: Number.parseFloat(getComputedStyle(node).lineHeight), + })), + ); + assert.ok( + tabs.every((tab) => tab.height <= tab.line + 1), + `settings tab labels stay on one line at ${width}`, + ); + const modal = await page.locator("#settings-dialog").boundingBox(); + assert.ok( + modal && modal.x === 0 && modal.width === width, + "mobile settings use the full screen", + ); + } + await page.locator('[data-theme-choice="light"]').click(); + const surfaces = await page.evaluate(() => { + const bg = (selector) => + getComputedStyle(document.querySelector(selector)).backgroundColor; + return { + reading: bg(".workspace"), + composer: bg(".composer"), + taskInput: bg(".task-composer"), + taskBody: bg("#task-dialog"), + }; + }); + assert.notEqual( + surfaces.composer, + surfaces.reading, + "unfocused light composer remains distinguishable from reading surface", + ); + assert.notEqual( + surfaces.taskInput, + surfaces.taskBody, + "unfocused light task input remains distinguishable from its dialog", + ); + assert.deepEqual(errors, []); + console.log( + "PASS: reference surface hierarchy, composer alignment, icon controls and responsive containment (5 viewports)", + ); +} finally { + await writeFile( + join(output, "geometry.json"), + JSON.stringify({ measurements, errors }, null, 2), + ); + await browser.close(); +} diff --git a/scripts/qa/ui-desktop.mjs b/scripts/qa/ui-desktop.mjs new file mode 100644 index 0000000..7270270 --- /dev/null +++ b/scripts/qa/ui-desktop.mjs @@ -0,0 +1,314 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; + +// Run against test/fixtures/ui-desktop.ts only. No live model or user data. +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const base = process.env.LINA_QA_URL ?? "http://127.0.0.1:18140"; +const output = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-ui-desktop-evidence"; +await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const context = await browser.newContext({ + viewport: { width: 1440, height: 900 }, + permissions: ["clipboard-read", "clipboard-write"], +}); +await context.tracing.start({ screenshots: true, snapshots: true }); +const page = await context.newPage(); +const errors = []; +const httpErrors = []; +page.on("response", (response) => { + if (response.status() >= 400) + httpErrors.push({ status: response.status(), url: response.url() }); +}); +page.on("pageerror", (error) => errors.push(error.message)); +const row = (id) => + page.locator(`#other-agents [data-agent-id="${id}"] .agent-link`); +const screen = (value) => + page.waitForFunction( + (value) => document.documentElement.dataset.screen === value, + value, + ); +const agent = (id) => + page.waitForFunction( + (id) => + new URL(location.href).searchParams.get("agent") === id && + document.querySelector("#messages .message"), + id, + ); +const input = page.locator("#message"); +const checks = []; +try { + await page.goto(`${base}/?agent=lina`); + await row("lina").waitFor(); + await page.locator("#send:not([disabled])").waitFor({ state: "hidden" }); + await page.locator("#messages .message").first().waitFor(); + const order = await page + .locator("#other-agents .agent-row") + .evaluateAll((rows) => rows.map((row) => row.dataset.agentId)); + assert.equal(order.length, 10); + await input.fill("Lina에 남기는 한글 초안"); + await page.locator("#conversation-scroll").evaluate((node) => { + node.scrollTop = 380; + }); + const position = await page + .locator("#conversation-scroll") + .evaluate((node) => node.scrollTop); + await row("kai").click(); + await agent("kai"); + await page.waitForFunction(() => + document.querySelector("#messages").textContent.includes("Kai의 대화"), + ); + assert.equal(await input.inputValue(), ""); + await input.fill("Kai의 별도 초안"); + await row("lina").click(); + await agent("lina"); + assert.equal(await input.inputValue(), "Lina에 남기는 한글 초안"); + assert.ok( + Math.abs( + (await page + .locator("#conversation-scroll") + .evaluate((node) => node.scrollTop)) - position, + ) < 3, + "reading anchor restored", + ); + assert.deepEqual( + await page + .locator("#other-agents .agent-row") + .evaluateAll((rows) => rows.map((row) => row.dataset.agentId)), + order, + ); + assert.equal(await page.evaluate(() => scrollY), 0); + checks.push( + "desktop in-page A→B→A preserves drafts, row order, reading anchor, one page", + ); + await page.locator("#file-picker").setInputFiles({ + name: "ui-proof.txt", + mimeType: "text/plain", + buffer: Buffer.from("isolated attachment proof"), + }); + await page.locator('#draft-files [data-attachment-state="ready"]').waitFor(); + await row("kai").click(); + await agent("kai"); + assert.equal(await input.inputValue(), "Kai의 별도 초안"); + await row("lina").click(); + await agent("lina"); + await page.locator('#draft-files [data-attachment-state="ready"]').waitFor(); + assert.ok( + (await page.locator("#draft-files").innerText()).includes("ui-proof.txt"), + ); + checks.push( + "uploaded attachment reference survives switching with its owner", + ); + await page + .locator('#draft-files button[aria-label="ui-proof.txt 첨부 제외"]') + .click(); + await input.fill("앞뒤"); + await input.evaluate((node) => node.setSelectionRange(1, 1)); + await page.evaluate(async () => { + await navigator.clipboard.writeText(" 붙여넣은 한글\n둘째 줄 "); + }); + await input.press("Control+V"); + await page.waitForFunction(() => + document.querySelector("#message").value.includes("둘째 줄"), + ); + assert.equal(await input.inputValue(), "앞 붙여넣은 한글\n둘째 줄 뒤"); + await input.press("Control+Z"); + assert.equal(await input.inputValue(), "앞뒤"); + checks.push( + "native Chromium clipboard text preserves selection, newline and Undo", + ); + await page.evaluate(async () => { + const canvas = document.createElement("canvas"); + canvas.width = canvas.height = 16; + canvas.getContext("2d").fillRect(0, 0, 16, 16); + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, "image/png"), + ); + await navigator.clipboard.write([new ClipboardItem({ "image/png": blob })]); + }); + await input.press("Control+V"); + await page + .locator('#draft-files [data-attachment-state="ready"] img') + .waitFor(); + await page.locator("#send").click(); + await page.waitForFunction(() => + document + .querySelector("#messages") + .textContent.includes("UI 검증용 합성 데이터"), + ); + await page.reload(); + await page.locator("#messages .message-files a").last().waitFor(); + checks.push( + "native Chromium PNG paste→upload→explicit send→reloaded conversation file", + ); + await page.screenshot({ path: join(output, "desktop.png") }); + await page.locator('.list-switch [data-screen="tasks"]').click(); + await page.locator("#toggle-task-column").click(); + await page.waitForFunction( + () => document.documentElement.dataset.layout === "dual", + ); + await page.locator("#task-column #task-list button").first().click(); + await page.locator("#task-dialog").waitFor({ state: "visible" }); + await page.waitForFunction(() => + document.querySelector("#task-heading").textContent.includes("로그인 오류"), + ); + await page.locator("#task-input").fill("재시작 뒤에도 남는 작업 초안"); + await page.locator("#task-dialog [data-close]").first().click(); + await page.locator("#task-scope").selectOption("all"); + await page.locator("#toggle-task-column").click(); + await page.goto(`${base}/?agent=lina&task=task-1`); + await page.locator("#task-dialog").waitFor({ state: "visible" }); + await page.reload(); + await page.locator("#task-dialog").waitFor({ state: "visible" }); + await page.waitForFunction(() => + document.querySelector("#task-heading").textContent.includes("로그인 오류"), + ); + assert.equal( + await page.locator("#task-input").inputValue(), + "재시작 뒤에도 남는 작업 초안", + ); + await page.locator("#task-dialog [data-close]").first().click(); + assert.equal(await page.locator("#task-scope").inputValue(), "all"); + checks.push("task input draft and all-owner filter survive document reload"); + assert.equal(new URL(page.url()).searchParams.has("task"), false); + checks.push( + "task direct link and reload preserve identity; closing returns to its list", + ); + checks.push("explicit task column uses existing detail and return controls"); + await page.setViewportSize({ width: 390, height: 844 }); + await page.locator('.mobile-navigation [data-screen="agents"]').click(); + await screen("agents"); + assert.equal(await page.locator("#conversation").isVisible(), false); + await page.locator("#agent-filter").fill("Kai"); + await row("kai").click(); + await screen("conversation"); + assert.equal(await input.inputValue(), "Kai의 별도 초안"); + assert.notEqual( + await page.evaluate(() => document.activeElement.id), + "message", + ); + assert.equal(await page.locator(".mobile-navigation").isVisible(), false); + await page.screenshot({ path: join(output, "mobile-conversation.png") }); + await page.locator("#open-sidebar").click(); + await screen("agents"); + assert.equal(await page.locator("#agent-filter").inputValue(), "Kai"); + await page.locator("#agent-filter").fill(""); + await page.screenshot({ path: join(output, "mobile-agents.png") }); + await page.locator("#mobile-settings").click(); + await page.locator("#settings-dialog").waitFor({ state: "visible" }); + await page.locator('[data-theme-choice="light"]').click(); + await page.locator("#settings-dialog [data-close]").first().click(); + await screen("agents"); + await page.goBack(); + assert.equal(await page.locator("#other-agents").isVisible(), true); + checks.push( + "390px list→chat→back restores filter/draft without opening keyboard; settings works", + ); + await page.locator("#agent-filter").fill(""); + await row("lina").click(); + await screen("conversation"); + await page.setViewportSize({ width: 390, height: 500 }); + const allow = page.getByRole("button", { name: "허용", exact: true }); + await allow.waitFor(); + const approveBox = await allow.boundingBox(); + const sendBox = await page.locator("#send").boundingBox(); + assert.ok( + approveBox && approveBox.y >= 0 && approveBox.y + approveBox.height <= 500, + ); + assert.ok(sendBox && sendBox.y >= 0 && sendBox.y + sendBox.height <= 500); + await page.getByRole("button", { name: "거절", exact: true }).click(); + await allow.waitFor({ state: "hidden" }); + await page.route("**/api/attachments", (route) => + route.fulfill({ status: 503, body: "synthetic failure" }), + ); + await input.fill("실패해도 남아야 하는 본문"); + await page.locator("#file-picker").setInputFiles({ + name: "retry.txt", + mimeType: "text/plain", + buffer: Buffer.from("retry content"), + }); + await page.locator('#draft-files [data-attachment-state="error"]').waitFor(); + assert.equal(await page.locator("#send").isDisabled(), true); + await page.locator("#open-sidebar").click(); + assert.equal(new URL(page.url()).searchParams.get("screen"), "conversation"); + await page.unroute("**/api/attachments"); + await page.getByRole("button", { name: "retry.txt 첨부 재시도" }).click(); + await page.locator('#draft-files [data-attachment-state="ready"]').waitFor(); + assert.equal(await input.inputValue(), "실패해도 남아야 하는 본문"); + await page.getByRole("button", { name: "retry.txt 첨부 제외" }).click(); + assert.equal( + await page.locator("#notice").isVisible(), + false, + "resolved attachment navigation warning clears", + ); + checks.push( + "390×500 reduced viewport keeps approval/send reachable; failed upload blocks send/navigation and retries safely", + ); + await page.setViewportSize({ width: 390, height: 844 }); + await page.evaluate(() => { + document.documentElement.style.fontSize = "200%"; + }); + assert.ok( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ); + await page.screenshot({ path: join(output, "mobile-text-200.png") }); + await page.evaluate(() => { + document.documentElement.style.fontSize = ""; + }); + for (const width of [320, 430, 768, 1024, 1280, 1920]) { + await page.setViewportSize({ width, height: 900 }); + await page.waitForFunction( + () => document.documentElement.scrollWidth <= innerWidth, + ); + assert.ok( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ); + } + checks.push("320/430/768/1024/1280/1920 containment and light theme"); + if (process.env.LINA_QA_INTRO_URL) { + const intro = await context.newPage(); + intro.on("pageerror", (error) => errors.push(error.message)); + await intro.setViewportSize({ width: 390, height: 844 }); + await intro.goto(process.env.LINA_QA_INTRO_URL); + await intro.locator("#intro-setup").waitFor({ state: "visible" }); + await intro + .getByText("반가워요. 대화를 시작하려면 사용할 모델을 먼저 골라주세요.") + .waitFor(); + assert.equal(await intro.locator("#sidebar").isVisible(), false); + assert.equal(await intro.locator(".mobile-navigation").isVisible(), false); + assert.equal(await intro.locator("#composer-model").isVisible(), false); + await intro.screenshot({ path: join(output, "onboarding-mobile.png") }); + checks.push( + "first setup remains a sidebar-free conversation with the existing model connection recovery", + ); + await intro.close(); + } + assert.deepEqual(errors, []); + await writeFile( + join(output, "web-results.json"), + JSON.stringify({ checks, errors, httpErrors }, null, 2), + ); + console.log( + JSON.stringify({ passed: checks.length, checks, errors, output }), + ); +} catch (error) { + await page.screenshot({ path: join(output, "failure.png") }); + console.error( + JSON.stringify({ error: String(error), errors, url: page.url() }), + ); + throw error; +} finally { + await context.tracing.stop({ path: join(output, "web-trace.zip") }); + await browser.close(); +} diff --git a/scripts/qa/ui-model-combobox.mjs b/scripts/qa/ui-model-combobox.mjs new file mode 100644 index 0000000..c9ef1de --- /dev/null +++ b/scripts/qa/ui-model-combobox.mjs @@ -0,0 +1,528 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; + +// Bun builds the actual settings controller and React adapter; no provider calls. +const client = fileURLToPath( + new URL("../../packages/lina-ui/client/", import.meta.url), +); +const out = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-model-combobox"; +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const fixture = ` +import { createModelCombobox } from ${JSON.stringify(`${client}model-combobox.ts`)}; +import { installModelSettings } from ${JSON.stringify(`${client}model-settings.ts`)}; +const dialog = document.getElementById('settings-dialog'); +for (const panel of dialog.querySelectorAll('[role="tabpanel"]')) panel.hidden = panel.id !== 'settings-panel-models'; +window.saved = { revision: 0, profiles: [], roles: {}, agentRoles: {}, defaultProfileId: null }; +const catalog = [ + { provider: 'local', id: 'glm-flash', name: 'GLM Flash', authenticated: true, reasoning: true }, + { provider: 'remote', id: 'vision', name: 'Vision', authenticated: true, reasoning: true, imageInput: true }, + { provider: 'hidden', id: 'hidden', name: 'Hidden', authenticated: false, reasoning: true }, + ...Array.from({ length: 35 }, (_, i) => ({ provider: 'local', id: 'model-' + i, name: 'Model ' + String(i).padStart(2, '0'), authenticated: true, reasoning: false })) +].map(item => ({ contextWindow: 64000, maxOutputTokens: 8000, ...item })); +window.settings = installModelSettings(dialog, createModelCombobox, document, async (path, method, body) => { + if (method === 'PATCH') { window.saved = { ...body.settings, revision: body.revision + 1 }; return { settings: window.saved }; } + if (method !== 'GET') throw Error('Unexpected request: ' + path); + return { settings: window.saved, catalog, active: [] }; +}); +window.chosen = []; +window.items = [ + { value: '', label: '전역 모델 사용 · GLM Flash', inherited: true }, + { value: 'glm', label: 'GLM Flash', search: 'LOCAL glm-flash fast' }, + { value: 'vision', label: 'Vision', search: 'remote image' }, + ...Array.from({ length: 35 }, (_, i) => ({ value: 'extra-' + i, label: 'Extra ' + String(i).padStart(2, '0') })) +]; +window.combo = createModelCombobox(document, 'qa-model', 'QA 모델', value => window.chosen.push(value)); +window.combo.set(window.items, 'vision', 'Vision'); +document.getElementById('model-settings').before(window.combo.root); +dialog.showModal(); +await window.settings.open(); +window.ready = true; +`; +const build = await Bun.build({ + entrypoints: [ + "model-combobox-fixture", + `${client}styles.css`, + `${client}theme-boot.ts`, + ], + target: "browser", + define: { "process.env.NODE_ENV": '"production"' }, + plugins: [ + { + name: "model-combobox-fixture", + setup(builder) { + builder.onResolve({ filter: /^model-combobox-fixture$/ }, () => ({ + path: "fixture", + namespace: "fixture", + })); + builder.onLoad({ filter: /.*/, namespace: "fixture" }, () => ({ + loader: "js", + contents: fixture, + })); + }, + }, + ], +}); +assert.ok(build.success, build.logs.map(String).join("\n")); +const assets = new Map( + build.outputs.map((output) => [output.path.split("/").pop(), output]), +); +const html = (await Bun.file(`${client}index.html`).text()) + .replace('src="/app.js"', 'src="/model-combobox-fixture.js"') + .replace('src="/theme.js"', 'src="/theme-boot.js"'); +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request) { + const path = new URL(request.url).pathname.slice(1); + if (!path) + return new Response(html, { headers: { "Content-Type": "text/html" } }); + const asset = assets.get(path); + return asset ? new Response(asset) : new Response(null, { status: 404 }); + }, +}); +await mkdir(out, { recursive: true }); +const results = []; +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +async function expanded(input, value) { + await input + .page() + .waitForFunction( + ({ id, value }) => + document.getElementById(id).getAttribute("aria-expanded") === + String(value), + { id: await input.getAttribute("id"), value }, + ); +} +async function contained(page) { + await page.waitForFunction(() => { + const popup = document.querySelector(".model-combobox-popup"); + if (!popup) return false; + const r = popup.getBoundingClientRect(); + const clip = popup.closest("dialog").getBoundingClientRect(); + return ( + r.width > 0 && + r.height > 0 && + r.left >= Math.max(0, clip.left) && + r.right <= Math.min(innerWidth, clip.right) && + r.top >= Math.max(0, clip.top) && + r.bottom <= Math.min(innerHeight, clip.bottom) + ); + }); +} +async function check(name, run, viewport = { width: 1280, height: 577 }) { + if (process.env.LINA_QA_CASE && !name.includes(process.env.LINA_QA_CASE)) + return; + const context = await browser.newContext({ viewport }); + const page = await context.newPage(); + page.setDefaultTimeout(5000); + const errors = []; + page.on("pageerror", (error) => errors.push(error.message)); + page.on("console", (message) => { + if (message.type() === "error" && !message.text().includes("404")) + errors.push(message.text()); + }); + try { + await page.goto(server.url.href); + await page.waitForFunction(() => window.ready); + await run(page); + assert.deepEqual(errors, []); + results.push({ name, pass: true }); + } catch (error) { + await page.screenshot({ path: `${out}/${results.length}-failure.png` }); + results.push({ name, pass: false, error: String(error), errors }); + } finally { + await context.close(); + } +} +try { + await check( + "programmatic set(disabled) closes popup and preserves label and node", + async (page) => { + const input = page.getByRole("combobox", { + name: "QA 모델", + exact: true, + }); + await input.click(); + await expanded(input, true); + await page.evaluate(() => { + window.originalInput = window.combo.input; + window.combo.set(window.items, "gone", "연결 확인 필요", true); + }); + await expanded(input, false); + assert.equal(await input.isDisabled(), true); + assert.equal(await input.inputValue(), "연결 확인 필요"); + assert.equal(await input.getAttribute("title"), "연결 확인 필요"); + assert.equal( + await page.evaluate(() => window.originalInput === window.combo.input), + true, + ); + await page.evaluate(() => window.combo.disable(false)); + await input.click(); + await expanded(input, true); + await page.evaluate(() => window.combo.disable(true)); + await expanded(input, false); + assert.deepEqual(await page.evaluate(() => window.chosen), []); + }, + ); + await check( + "aliases, inherited ordering, empty status and keyboard selection", + async (page) => { + const input = page.getByRole("combobox", { + name: "QA 모델", + exact: true, + }); + await input.click(); + await expanded(input, true); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option") + .first() + .textContent(), + "전역 모델 사용 · GLM Flash", + ); + await input.fill("GLM"); + await page.waitForFunction( + () => document.querySelectorAll('[role="option"]').length === 2, + ); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option") + .first() + .textContent(), + "GLM Flash", + ); + await input.fill(" FAST local "); + await page.waitForFunction( + () => document.querySelectorAll('[role="option"]').length === 1, + ); + await input.press("ArrowDown"); + await input.press("Enter"); + await expanded(input, false); + assert.deepEqual(await page.evaluate(() => window.chosen), ["glm"]); + assert.equal(await input.inputValue(), "GLM Flash"); + await input.click(); + await expanded(input, true); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option", { name: "GLM Flash", exact: true }) + .getAttribute("aria-selected"), + "true", + ); + await input.fill("missing-model"); + await page.getByText("검색 결과가 없습니다.", { exact: true }).waitFor(); + assert.equal( + await page.locator('[role="listbox"] [role="status"]').count(), + 0, + ); + await input.press("Enter"); + assert.deepEqual(await page.evaluate(() => window.chosen), ["glm"]); + // Base UI dismisses on Enter without a highlighted option; reopen before Escape. + await input.click(); + await expanded(input, true); + await input.fill("missing-model"); + await page.getByText("검색 결과가 없습니다.", { exact: true }).waitFor(); + await input.press("Escape"); + assert.equal( + await page.locator("#settings-dialog").evaluate((node) => node.open), + true, + "first Escape only closes the popup", + ); + await expanded(input, false); + assert.equal(await input.inputValue(), "GLM Flash"); + assert.equal( + await page.locator("#settings-dialog").evaluate((node) => node.open), + true, + ); + await input.press("Escape"); + await page.waitForFunction( + () => !document.getElementById("settings-dialog").open, + ); + }, + ); + await check( + "keyboard opening, inherited selection and updates during search", + async (page) => { + const input = page.locator("#qa-model-input"); + await input.focus(); + await input.press("ArrowDown"); + await expanded(input, true); + await input.fill("extra"); + await input.press("ArrowUp"); + await input.press("Enter"); + await expanded(input, false); + assert.deepEqual(await page.evaluate(() => window.chosen), ["extra-34"]); + await input.click(); + await input.fill(""); + await page.getByRole("listbox").getByRole("option").first().click(); + assert.deepEqual(await page.evaluate(() => window.chosen), [ + "extra-34", + "", + ]); + await input.click(); + await input.fill("GLM"); + await page.evaluate(() => { + window.combo.input.setAttribute( + "aria-describedby", + "model-settings-status", + ); + window.combo.set(window.items, "vision", "Updated Vision"); + }); + assert.equal(await input.inputValue(), "GLM"); + assert.equal(await input.getAttribute("title"), "Updated Vision"); + await page.evaluate(() => window.combo.close()); + assert.equal(await input.inputValue(), "Updated Vision"); + assert.equal( + await input.getAttribute("aria-describedby"), + "model-settings-status", + ); + assert.deepEqual(await page.evaluate(() => window.chosen), [ + "extra-34", + "", + ]); + }, + ); + await check( + "pointer selection, tab/outside dismissal and explicit close", + async (page) => { + const input = page.getByRole("combobox", { + name: "QA 모델", + exact: true, + }); + await input.click(); + await expanded(input, true); + await page + .getByRole("listbox") + .getByRole("option", { name: "GLM Flash", exact: true }) + .click(); + await expanded(input, false); + assert.deepEqual(await page.evaluate(() => window.chosen), ["glm"]); + assert.equal( + await input.evaluate((node) => document.activeElement === node), + true, + ); + await input.click(); + await expanded(input, true); + await input.press("Tab"); + await expanded(input, false); + assert.equal( + await input.evaluate((node) => document.activeElement === node), + false, + ); + await input.click(); + await expanded(input, true); + await page.locator("#settings-heading").click(); + await expanded(input, false); + await input.click(); + await expanded(input, true); + await page.evaluate(() => window.combo.close()); + await expanded(input, false); + }, + ); + for (const viewport of [ + { width: 1280, height: 577 }, + { width: 390, height: 844 }, + ]) { + await check( + `dialog top layer and viewport collision ${viewport.width}`, + async (page) => { + const input = page.locator("#model-vision-input"); + await input.click(); + await expanded(input, true); + const list = page.getByRole("listbox"); + await list.waitFor(); + assert.equal( + await list.evaluate((node) => node.closest("dialog")?.id), + "settings-dialog", + ); + assert.equal( + await list.evaluate( + (node) => node.closest(".settings-content") === null, + ), + true, + "popup escapes the settings scrollport", + ); + const option = page + .getByRole("listbox") + .getByRole("option", { name: "Vision · remote", exact: true }); + await option.scrollIntoViewIfNeeded(); + assert.equal( + await option.evaluate((node) => { + const r = node.getBoundingClientRect(); + const hit = document.elementFromPoint( + r.x + r.width / 2, + r.y + r.height / 2, + ); + return node === hit || node.contains(hit); + }), + true, + "option is hit-testable in native dialog top layer", + ); + await option.click(); + await expanded(input, false); + const dense = page.locator("#model-recall-input"); + await dense.click(); + await expanded(dense, true); + await contained(page); + await page + .getByRole("listbox") + .getByRole("option", { name: "Model 34 · local", exact: true }) + .scrollIntoViewIfNeeded(); + await page + .getByRole("listbox") + .getByRole("option", { name: "Model 34 · local", exact: true }) + .click(); + await expanded(dense, false); + await dense.click(); + await expanded(dense, true); + await contained(page); + await page + .getByRole("listbox") + .getByRole("option", { name: "Model 34 · local", exact: true }) + .scrollIntoViewIfNeeded(); + await page.screenshot({ path: `${out}/dialog-${viewport.width}.png` }); + }, + viewport, + ); + } + await check( + "open popup follows resize and settings scrolling", + async (page) => { + const input = page.locator("#model-recall-input"); + await input.click(); + await expanded(input, true); + await contained(page); + await page.setViewportSize({ width: 1024, height: 650 }); + await contained(page); + await page.locator(".settings-content").evaluate((node) => { + node.scrollTop -= 60; + }); + await page.waitForFunction(() => { + const input = document + .getElementById("model-recall-input") + .getBoundingClientRect(); + const positioner = document.querySelector(".model-combobox-positioner"); + const popup = positioner.getBoundingClientRect(); + const gap = + positioner.dataset.side === "top" + ? input.top - popup.bottom + : popup.top - input.bottom; + return Math.abs(gap - 5) <= 1 && Math.abs(input.left - popup.left) <= 1; + }); + await contained(page); + await page.screenshot({ path: `${out}/resized.png` }); + }, + ); + await check( + "bottom-edge anchor flips above within the native dialog", + async (page) => { + await page.evaluate(() => { + const dialog = document.getElementById("settings-dialog"); + dialog.append(window.combo.root); + Object.assign(window.combo.root.style, { + position: "absolute", + bottom: "16px", + left: "24px", + width: "260px", + }); + }); + const input = page.locator("#qa-model-input"); + await input.click(); + await expanded(input, true); + await page.waitForFunction( + () => + document.querySelector(".model-combobox-positioner")?.dataset.side === + "top", + ); + await contained(page); + const boxes = await page.evaluate(() => ({ + inputTop: document + .getElementById("qa-model-input") + .getBoundingClientRect().top, + popupBottom: document + .querySelector(".model-combobox-popup") + .getBoundingClientRect().bottom, + })); + assert.ok(boxes.popupBottom < boxes.inputTop); + await page.screenshot({ path: `${out}/flipped.png` }); + }, + ); + await check( + "real model settings selection saves correct roles and filters providers", + async (page) => { + const input = page.locator("#model-default-input"); + await input.click(); + await input.fill("glm-flash"); + await page + .getByRole("listbox") + .getByRole("option", { name: "GLM Flash · local", exact: true }) + .click(); + const summary = page.locator("#model-summary-input"); + await summary.click(); + await summary.fill("GLM"); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option") + .first() + .textContent(), + "GLM Flash · local", + ); + await page + .getByRole("listbox") + .getByRole("option", { name: "GLM Flash · local", exact: true }) + .click(); + await page.locator("#model-save").click(); + await page.waitForFunction(() => window.saved.revision === 1); + assert.equal( + await page.evaluate( + () => + window.saved.profiles.find( + (p) => p.id === window.saved.roles.summary, + ).model, + ), + "glm-flash", + ); + await input.click(); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option", { name: "Hidden · hidden", exact: true }) + .count(), + 0, + ); + await input.press("Escape"); + await page.locator("#model-vision-input").click(); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option", { name: "GLM Flash · local", exact: true }) + .count(), + 0, + ); + assert.equal( + await page + .getByRole("listbox") + .getByRole("option", { name: "Vision · remote", exact: true }) + .count(), + 1, + ); + }, + ); +} finally { + await browser.close(); + await server.stop(true); + await writeFile(`${out}/results.json`, JSON.stringify(results, null, 2)); +} +console.log(JSON.stringify(results, null, 2)); +if (results.some((result) => !result.pass)) process.exitCode = 1; diff --git a/scripts/qa/ui-navigation-regressions.mjs b/scripts/qa/ui-navigation-regressions.mjs new file mode 100644 index 0000000..cf78580 --- /dev/null +++ b/scripts/qa/ui-navigation-regressions.mjs @@ -0,0 +1,168 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; + +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const base = process.env.LINA_QA_URL ?? "http://127.0.0.1:18140"; +const out = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-ui-desktop-evidence"; +await mkdir(out, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const results = []; +async function check(name, run, blockedStorage = false) { + const context = await browser.newContext({ + viewport: { width: 390, height: 844 }, + }); + if (blockedStorage) + await context.addInitScript(() => { + Storage.prototype.setItem = () => { + throw new DOMException("full", "QuotaExceededError"); + }; + }); + const page = await context.newPage(); + const errors = []; + page.on("pageerror", (e) => errors.push(e.message)); + try { + await run(page); + assert.deepEqual(errors, []); + results.push({ name, pass: true }); + } catch (error) { + await page.screenshot({ + path: `${out}/navigation-${results.length}-failure.png`, + }); + results.push({ name, pass: false, error: String(error), errors }); + } finally { + await context.close(); + } +} +await check("browser Back closes mobile settings", async (page) => { + await page.goto(`${base}/?agent=lina&screen=agents`); + await page.locator("#other-agents button").first().waitFor(); + await page.locator("#mobile-settings").click(); + await page.locator("#settings-dialog").waitFor({ state: "visible" }); + await page.goBack(); + assert.equal(new URL(page.url()).searchParams.get("screen"), "agents"); + assert.equal(await page.locator("#settings-dialog").isVisible(), false); +}); +await check("new navigation cancels late intro selection", async (page) => { + await page.goto(`${base}/?agent=lina&screen=agents`); + await page + .locator('#other-agents [data-agent-id="kai"] .agent-link') + .waitFor(); + let release; + const gate = new Promise((resolve) => { + release = resolve; + }); + await page.route("**/api/agents/kai/intro", async (route) => { + await gate; + await route.fulfill({ + contentType: "application/json", + body: '{"room":null}', + }); + }); + const sent = page.waitForRequest((request) => + request.url().endsWith("/api/agents/kai/intro"), + ); + await page.locator('#other-agents [data-agent-id="kai"] .agent-link').click(); + await sent; + await page.locator('.mobile-navigation [data-screen="tasks"]').click(); + const response = page.waitForResponse((response) => + response.url().endsWith("/api/agents/kai/intro"), + ); + release(); + await (await response).finished(); + await page.evaluate( + () => new Promise((resolve) => requestAnimationFrame(resolve)), + ); + assert.equal(new URL(page.url()).searchParams.get("screen"), "tasks"); + assert.equal(new URL(page.url()).searchParams.get("agent"), "lina"); +}); +await check( + "mobile conversation exposes search without a hardware keyboard", + async (page) => { + await page.goto(`${base}/?agent=lina`); + await page.locator("#messages .message").first().waitFor(); + const buttons = page.getByRole("button", { + name: "대화 검색", + exact: true, + }); + assert.equal(await buttons.count(), 1); + await buttons.click(); + await page.locator("#search-dialog").waitFor({ state: "visible" }); + }, +); +await check( + "mobile reading anchor survives blocked storage and disconnected sockets", + async (page) => { + await page.goto(`${base}/?agent=lina`); + await page.locator("#messages .message").first().waitFor(); + await page.locator("#conversation-scroll").evaluate((node) => { + node.scrollTop = 380; + }); + const top = await page + .locator("#conversation-scroll") + .evaluate((node) => node.scrollTop); + await page.locator("#open-sidebar").click(); + await page + .locator('#other-agents [data-agent-id="kai"] .agent-link') + .click(); + await page.waitForFunction(() => + document.querySelector("#messages").textContent.includes("Kai의 대화"), + ); + await page.locator("#open-sidebar").click(); + await page.evaluate(() => { + window.originalSocket = WebSocket; + window.WebSocket = class extends window.originalSocket { + constructor(url) { + super(url); + this.close(); + } + }; + }); + await page + .locator('#other-agents [data-agent-id="lina"] .agent-link') + .click(); + await page.waitForFunction(() => + document.querySelector("#messages").textContent.includes("Lina의 대화"), + ); + await page.waitForFunction( + (top) => + Math.abs( + document.querySelector("#conversation-scroll").scrollTop - top, + ) < 3, + top, + ); + const restored = await page + .locator("#conversation-scroll") + .evaluate((node) => node.scrollTop); + assert.ok(Math.abs(restored - top) < 3, `${top} → ${restored}`); + assert.equal(await page.locator("#connection-status").isVisible(), true); + await page.evaluate(() => { + window.WebSocket = window.originalSocket; + }); + await page.locator("#reconnect").click(); + await page.waitForFunction( + () => document.querySelector("#connection-status").hidden, + ); + assert.ok( + Math.abs( + (await page + .locator("#conversation-scroll") + .evaluate((node) => node.scrollTop)) - top, + ) < 3, + ); + }, + true, +); +await browser.close(); +await writeFile( + `${out}/navigation-results.json`, + JSON.stringify(results, null, 2), +); +console.log(JSON.stringify(results)); +if (results.some((result) => !result.pass)) process.exitCode = 1; diff --git a/scripts/qa/ui-settings-islands.mjs b/scripts/qa/ui-settings-islands.mjs new file mode 100644 index 0000000..2a48863 --- /dev/null +++ b/scripts/qa/ui-settings-islands.mjs @@ -0,0 +1,394 @@ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; + +// Run with Bun. Uses the real settings markup/styles and adapters without APIs. +const client = fileURLToPath( + new URL("../../packages/lina-ui/client/", import.meta.url), +); +const out = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-settings-islands"; +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const build = await Bun.build({ + entrypoints: [ + "settings-islands-fixture", + `${client}styles.css`, + `${client}theme-boot.ts`, + ], + target: "browser", + define: { "process.env.NODE_ENV": '"production"' }, + minify: true, + plugins: [ + { + name: "settings-islands-fixture", + setup(builder) { + builder.onResolve({ filter: /^settings-islands-fixture$/ }, () => ({ + path: "fixture", + namespace: "fixture", + })); + builder.onLoad({ filter: /.*/, namespace: "fixture" }, () => ({ + loader: "js", + contents: ` +import { installSettingsTabs } from ${JSON.stringify(`${client}settings-tabs.ts`)}; +import { installThemeControls } from ${JSON.stringify(`${client}theme-controls.ts`)}; +const dialog = document.getElementById("settings-dialog"); +const nav = dialog.querySelector(".settings-navigation"); +nav.replaceChildren(); +window.panelNodes = [...dialog.querySelectorAll('[role="tabpanel"]')]; +window.changes = []; +window.tabs = installSettingsTabs(dialog, tab => window.changes.push(tab)); +const original = dialog.querySelector(".theme-switch"); +original.replaceChildren(); +const duplicate = original.cloneNode(true); +duplicate.id = "intro-theme"; +duplicate.removeAttribute("aria-labelledby"); +duplicate.setAttribute("aria-label", "소개 화면 모드"); +dialog.querySelector('#settings-panel-general').append(duplicate); +window.choiceHosts = [original, duplicate]; +window.failures = 0; +installThemeControls(() => { window.failures++; }); +dialog.showModal(); +window.ready = true; +`, + })); + }, + }, + ], +}); +assert.ok(build.success, build.logs.map(String).join("\n")); +const assets = new Map( + build.outputs.map((output) => [output.path.split("/").pop(), output]), +); +const html = (await Bun.file(`${client}index.html`).text()) + .replace('src="/app.js"', 'src="/settings-islands-fixture.js"') + .replace('src="/theme.js"', 'src="/theme-boot.js"'); +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 0, + fetch(request) { + const path = new URL(request.url).pathname.slice(1); + if (!path) + return new Response(html, { headers: { "Content-Type": "text/html" } }); + const asset = assets.get(path); + return asset ? new Response(asset) : new Response(null, { status: 404 }); + }, +}); +const fixtureUrl = server.url.href; +console.log(`Settings islands fixture: ${fixtureUrl}`); +await mkdir(out, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const results = []; +async function check(name, run, options = {}) { + const context = await browser.newContext({ + viewport: { width: 1440, height: 900 }, + colorScheme: "light", + }); + if (options.storage) + await context.addInitScript((mode) => { + if (mode === "get") + Object.defineProperty(window, "localStorage", { + get() { + throw new DOMException("blocked", "SecurityError"); + }, + }); + else + Storage.prototype.setItem = () => { + throw new DOMException("full", "QuotaExceededError"); + }; + }, options.storage); + const page = await context.newPage(); + page.setDefaultTimeout(5000); + const errors = []; + page.on("pageerror", (error) => errors.push(error.message)); + page.on("console", (message) => { + if (message.type() === "error" && !message.text().includes("404")) + errors.push(message.text()); + }); + try { + await page.goto(server.url.href); + await page.waitForFunction(() => window.ready); + await run(page); + assert.deepEqual(errors, []); + results.push({ name, pass: true }); + } catch (error) { + await page.screenshot({ path: `${out}/${results.length}-failure.png` }); + results.push({ name, pass: false, error: String(error), errors }); + } finally { + await context.close(); + } +} +async function selected(page, tab) { + await page.waitForFunction( + (id) => + window.tabs.current === id && + document + .getElementById(`settings-tab-${id}`) + .getAttribute("aria-selected") === "true", + tab, + ); + assert.equal( + await page.locator('[role="tabpanel"]:visible').getAttribute("id"), + `settings-panel-${tab}`, + ); + const orientation = await page + .getByRole("tablist") + .getAttribute("aria-orientation"); + const boxes = await page.getByRole("tab").evaluateAll((tabs) => + tabs.map((tab) => { + const { x, y, width, height } = tab.getBoundingClientRect(); + return { x, y, width, height }; + }), + ); + if (orientation === "vertical") { + assert.equal(boxes[0].x, boxes[1].x, "vertical tab alignment"); + const listWidth = await page + .getByRole("tablist") + .evaluate((list) => list.getBoundingClientRect().width); + assert.ok( + boxes.every((box) => box.width === listWidth), + "desktop tabs stretch to the full list width", + ); + assert.ok( + boxes[1].y >= boxes[0].y + boxes[0].height, + "vertical tabs do not overlap", + ); + } else { + assert.equal(boxes[0].y, boxes[1].y, "horizontal tab alignment"); + assert.ok( + boxes[1].x >= boxes[0].x + boxes[0].width, + "horizontal tabs do not overlap", + ); + } +} +await check( + "desktop vertical keys, panel adapter, Home/End and select focus", + async (page) => { + const general = page.getByRole("tab", { name: "일반", exact: true }); + await general.focus(); + await general.press("ArrowRight"); + assert.equal( + await page.evaluate(() => window.tabs.current), + "general", + "vertical tabs ignore ArrowRight", + ); + await general.press("ArrowDown"); + await selected(page, "connections"); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "settings-tab-connections", + ); + assert.deepEqual(await page.evaluate(() => window.changes), [ + "connections", + ]); + await page.keyboard.press("End"); + await selected(page, "models"); + await page.keyboard.press("ArrowDown"); + await selected(page, "general"); + await page.keyboard.press("End"); + await page.keyboard.press("Home"); + await selected(page, "general"); + await page.evaluate(() => { + window.tabs.select("models", true); + const content = document.querySelector(".settings-content"); + const tall = document.createElement("div"); + tall.style.height = "2000px"; + document.getElementById("settings-panel-models").append(tall); + content.scrollTop = 120; + window.tabs.select("models"); + window.sameScroll = content.scrollTop; + window.tabs.select("connections", true); + }); + assert.equal(await page.evaluate(() => window.sameScroll), 120); + assert.equal( + await page + .locator(".settings-content") + .evaluate((node) => node.scrollTop), + 0, + ); + assert.equal( + await page.evaluate(() => document.activeElement.id), + "settings-tab-connections", + ); + assert.equal( + await page.evaluate(() => + window.panelNodes.every( + (node) => node === document.getElementById(node.id), + ), + ), + true, + ); + assert.equal(await page.getByRole("tablist").count(), 1); + for (const tab of ["general", "connections", "models"]) { + assert.equal( + await page + .locator(`#settings-tab-${tab}`) + .getAttribute("aria-controls"), + `settings-panel-${tab}`, + ); + assert.equal( + await page + .locator(`#settings-panel-${tab}`) + .getAttribute("aria-labelledby"), + `settings-tab-${tab}`, + ); + } + await page.screenshot({ path: `${out}/desktop.png` }); + }, +); +await check( + "mobile horizontal keys and live orientation resize", + async (page) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.waitForFunction( + () => + document + .querySelector('[role="tablist"]') + .getAttribute("aria-orientation") === "horizontal", + ); + const general = page.getByRole("tab", { name: "일반", exact: true }); + await general.focus(); + await general.press("ArrowDown"); + assert.equal( + await page.evaluate(() => window.tabs.current), + "general", + "horizontal tabs ignore ArrowDown", + ); + await general.press("ArrowRight"); + await selected(page, "connections"); + await page.keyboard.press("ArrowLeft"); + await selected(page, "general"); + await page.setViewportSize({ width: 1024, height: 768 }); + await page.waitForFunction( + () => + document + .querySelector('[role="tablist"]') + .getAttribute("aria-orientation") === "vertical", + ); + await page.keyboard.press("ArrowDown"); + await selected(page, "connections"); + await page.setViewportSize({ width: 390, height: 844 }); + await page.waitForFunction( + () => + document + .querySelector('[role="tablist"]') + .getAttribute("aria-orientation") === "horizontal", + ); + await page.screenshot({ path: `${out}/mobile.png` }); + }, +); +async function theme(page, value, resolved) { + await page.waitForFunction( + ({ value, resolved }) => + document.documentElement.dataset.theme === resolved && + document.querySelectorAll("[data-theme-choice]").length === 6 && + [...document.querySelectorAll("[data-theme-choice]")].every( + (button) => + button.getAttribute("aria-pressed") === + String(button.dataset.themeChoice === value), + ), + { value, resolved }, + ); + assert.equal( + await page.evaluate( + () => + document.querySelector('meta[name="theme-color"]').content === + getComputedStyle(document.documentElement) + .getPropertyValue("--surface-main") + .trim(), + ), + true, + ); + assert.equal( + await page.evaluate( + () => getComputedStyle(document.documentElement).colorScheme, + ), + resolved, + ); +} +await check( + "empty theme hosts preserve labels, attributes, persistence and OS changes", + async (page) => { + await theme(page, "dark", "dark"); + assert.deepEqual( + await page.locator("#intro-theme button").allTextContents(), + ["다크", "라이트", "시스템"], + ); + assert.equal( + await page.locator("#intro-theme").getAttribute("aria-label"), + "소개 화면 모드", + ); + assert.equal( + await page + .locator(".theme-switch") + .first() + .getAttribute("aria-labelledby"), + "theme-label", + ); + await page.locator('#intro-theme [data-theme-choice="light"]').click(); + await theme(page, "light", "light"); + assert.equal( + await page.evaluate(() => localStorage.getItem("lina.theme.v1")), + "light", + ); + await page.reload(); + await page.waitForFunction(() => window.ready); + await theme(page, "light", "light"); + await page.locator('#intro-theme [data-theme-choice="system"]').click(); + await theme(page, "system", "light"); + await page.emulateMedia({ colorScheme: "dark" }); + await theme(page, "system", "dark"); + assert.equal( + await page.evaluate(() => localStorage.getItem("lina.theme.v1")), + "system", + ); + await page.locator('[data-theme-choice="light"]').first().click(); + await theme(page, "light", "light"); + await page.emulateMedia({ colorScheme: "light" }); + await page.emulateMedia({ colorScheme: "dark" }); + await theme(page, "light", "light"); + assert.equal( + await page.evaluate(() => + window.choiceHosts.every( + (host) => host.isConnected && host.children.length === 3, + ), + ), + true, + ); + await page.screenshot({ path: `${out}/theme-light.png` }); + }, +); +for (const storage of ["get", "set"]) + await check( + `theme remains usable when storage ${storage} throws`, + async (page) => { + await page.locator('[data-theme-choice="system"]').first().click(); + await theme(page, "system", "light"); + assert.equal(await page.evaluate(() => window.failures), 1); + await page.emulateMedia({ colorScheme: "dark" }); + await theme(page, "system", "dark"); + }, + { storage }, + ); +await browser.close(); +await server.stop(true); +await writeFile( + `${out}/teardown.json`, + JSON.stringify( + { + fixtureUrl, + serverStopped: true, + browserConnected: browser.isConnected(), + }, + null, + 2, + ), +); +await writeFile(`${out}/results.json`, JSON.stringify(results, null, 2)); +console.log(JSON.stringify(results, null, 2)); +if (results.some((result) => !result.pass)) process.exitCode = 1; diff --git a/scripts/qa/ui-task-layout.mjs b/scripts/qa/ui-task-layout.mjs new file mode 100644 index 0000000..cc74dc7 --- /dev/null +++ b/scripts/qa/ui-task-layout.mjs @@ -0,0 +1,134 @@ +import assert from "node:assert/strict"; +import { mkdir } from "node:fs/promises"; + +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const output = process.env.LINA_QA_OUTPUT ?? "/tmp/lina-task-layout-ux"; +await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ + headless: true, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}); +const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); +page.setDefaultTimeout(5000); +const errors = []; +page.on("pageerror", (e) => errors.push(e.message)); +const layout = (value) => + page.waitForFunction( + (value) => document.documentElement.dataset.layout === value, + value, + { timeout: 5000 }, + ); +try { + await page.goto(process.env.LINA_QA_URL ?? "http://127.0.0.1:18160"); + await page.locator("#other-agents .agent-row").first().waitFor(); + assert.equal( + await page.locator(".list-switch .icon-button").count(), + 0, + "list tabs must not contain an ambiguous layout icon", + ); + assert.equal(await page.locator("#collapse-sidebar").count(), 1); + assert.equal( + await page.locator("#toggle-task-column").isVisible(), + false, + "layout action belongs only to tasks", + ); + await page.screenshot({ path: `${output}/agents.png` }); + await page.locator("#message").fill("목록 배치를 바꿔도 보존할 초안"); + await page.locator('.list-switch [data-screen="tasks"]').click(); + const toggle = page.locator("#task-pane #toggle-task-column"); + await toggle.waitFor(); + assert.equal(await toggle.innerText(), "나란히 보기"); + await page.locator("#task-list .task-link").first().waitFor(); + await page.locator("#task-scope").selectOption("all"); + await page.evaluate(() => { + window.retainedTaskList = document.querySelector("#task-list"); + }); + await page.screenshot({ path: `${output}/tasks.png` }); + await toggle.click(); + await layout("dual"); + assert.equal(await toggle.innerText(), "나란히 보기 종료"); + assert.equal(await toggle.getAttribute("aria-pressed"), "true"); + assert.equal(await page.locator("#agent-pane").isVisible(), true); + assert.equal(await page.locator("#task-column #task-pane").isVisible(), true); + assert.equal( + await page.locator("#close-task-column").count(), + 0, + "one control owns the view choice", + ); + await page.screenshot({ path: `${output}/together.png` }); + await toggle.click(); + await layout("single"); + assert.equal(await page.locator("#sidebar #task-pane").isVisible(), true); + assert.equal(await page.locator("#task-scope").inputValue(), "all"); + assert.equal( + await page.evaluate( + () => window.retainedTaskList === document.querySelector("#task-list"), + ), + true, + ); + await page.waitForFunction( + () => document.activeElement?.id === "toggle-task-column", + ); + assert.equal( + await page.locator("#message").inputValue(), + "목록 배치를 바꿔도 보존할 초안", + ); + await toggle.click(); + await layout("dual"); + await page.reload(); + await layout("dual"); + await toggle.waitFor(); + assert.equal(await toggle.innerText(), "나란히 보기 종료"); + await page.locator('.list-switch [data-screen="agents"]').click(); + await toggle.click(); + await layout("single"); + await page.waitForFunction( + () => + document.activeElement === + document.querySelector('.list-switch [data-screen="agents"]'), + ); + await page.locator('.list-switch [data-screen="tasks"]').click(); + // 1440px with a wide sidebar cannot fit both lists and the reading column. + await page.locator("#sidebar-resizer").focus(); + await page.keyboard.press("End"); + await page.waitForFunction( + () => + document.querySelector("#sidebar").getBoundingClientRect().width >= 419, + ); + assert.equal( + await toggle.isVisible(), + false, + "hide an unavailable split action, not an ineffective toggle", + ); + await page.setViewportSize({ width: 1600, height: 900 }); + await toggle.waitFor(); + await toggle.click(); + await layout("dual"); + await page.setViewportSize({ width: 1280, height: 900 }); + await layout("single"); + assert.equal(await toggle.isVisible(), false); + await page.setViewportSize({ width: 1600, height: 900 }); + await layout("dual"); + assert.equal(await toggle.innerText(), "나란히 보기 종료"); + await page.setViewportSize({ width: 390, height: 844 }); + await layout("mobile"); + assert.equal(await toggle.isVisible(), false); + assert.equal(await page.locator("#task-pane").isVisible(), true); + assert.equal(await page.locator("#collapse-sidebar").isVisible(), false); + assert.ok( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ); + await page.screenshot({ path: `${output}/mobile-tasks.png` }); + assert.deepEqual(errors, []); + console.log( + "PASS: contextual action, one toggle, active label, focus, retained list/filter/draft, reload, actual available width and mobile", + ); +} finally { + await browser.close(); +} diff --git a/scripts/qa/ui-task-restart.mjs b/scripts/qa/ui-task-restart.mjs new file mode 100644 index 0000000..e6bffe9 --- /dev/null +++ b/scripts/qa/ui-task-restart.mjs @@ -0,0 +1,66 @@ +import assert from "node:assert/strict"; +import { mkdtemp, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +const { chromium } = await import( + process.env.LINA_QA_PLAYWRIGHT_MODULE ?? "playwright" +); +const profile = await mkdtemp(join(tmpdir(), "lina-task-browser-")); +const options = { + headless: true, + viewport: { width: 1440, height: 900 }, + ...(process.env.LINA_QA_CHROMIUM + ? { executablePath: process.env.LINA_QA_CHROMIUM } + : {}), +}; +const url = + (process.env.LINA_QA_URL ?? "http://127.0.0.1:18140") + + "/?agent=lina&task=task-1"; +let context; +try { + context = await chromium.launchPersistentContext(profile, options); + let page = await context.newPage(); + await page.goto(url); + await page.waitForFunction(() => + document.querySelector("#task-heading").textContent.includes("로그인 오류"), + ); + await page.locator("#task-input").fill("브라우저를 닫아도 남는 작업 입력"); + await page.locator("#task-owner").selectOption("kai"); + await page.locator("#task-dialog [data-close]").first().click(); + await page.locator("#task-scope").selectOption("all"); + await context.close(); + context = undefined; + context = await chromium.launchPersistentContext(profile, options); + page = await context.newPage(); + await page.goto(url); + await page.waitForFunction(() => + document.querySelector("#task-heading").textContent.includes("로그인 오류"), + ); + assert.equal( + await page.locator("#task-input").inputValue(), + "브라우저를 닫아도 남는 작업 입력", + ); + assert.equal(await page.locator("#task-owner").inputValue(), "kai"); + await page.locator("#task-dialog [data-close]").first().click(); + assert.equal(await page.locator("#task-scope").inputValue(), "all"); + const result = { + pass: true, + independentBrowserProcesses: 2, + taskInputRestored: true, + ownerDraftRestored: true, + allOwnerFilterRestored: true, + serverMutation: false, + }; + await writeFile( + join( + process.env.LINA_QA_OUTPUT ?? "/tmp/lina-ui-desktop-evidence", + "task-restart.json", + ), + JSON.stringify(result, null, 2), + ); + console.log(JSON.stringify(result)); +} finally { + await context?.close(); + await rm(profile, { recursive: true, force: true }); +} diff --git a/tsconfig.json b/tsconfig.json index 41e3eaf..4165228 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,6 +33,7 @@ ], "exclude": [ "node_modules", - "dist" + "dist", + "packages/lina-desktop" ] } From 71316635fa0cbc43d015fb84886fa55833aaa4c5 Mon Sep 17 00:00:00 2001 From: thisisjun786 <259586770+thisisjun786@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:55:57 +0000 Subject: [PATCH 2/2] Record integrated UI verification and current screenshots --- docs/plans/codex-ui/010_implementation.md | 18 +++++++++++++----- docs/plans/codex-ui/010_ui_desktop.png | Bin 121410 -> 121489 bytes docs/plans/codex-ui/010_ui_evidence.json | 14 ++++++++++++++ docs/plans/codex-ui/010_ui_mobile.png | Bin 48589 -> 48645 bytes docs/plans/codex-ui/010_ui_models.png | Bin 125002 -> 124731 bytes docs/plans/codex-ui/010_ui_task_layout.png | Bin 131841 -> 131927 bytes 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 docs/plans/codex-ui/010_ui_evidence.json diff --git a/docs/plans/codex-ui/010_implementation.md b/docs/plans/codex-ui/010_implementation.md index a6077b0..bddd8ea 100644 --- a/docs/plans/codex-ui/010_implementation.md +++ b/docs/plans/codex-ui/010_implementation.md @@ -66,9 +66,11 @@ HttpOnly 인증, 정확한 Host/Origin, 메서드·경로 허용 목록과 프 ## 검증 -구현 후보에서 전체 테스트 1,353개, 타입 검사, lint와 CI build가 통과했다. -이후 작업 보기 UX 변경은 관련 테스트 32개와 실제 Chromium 회귀 10개로 -재검증했다. PR 후보의 최신 dev 통합과 CI 결과는 PR의 Verification 기록을 따른다. +`dev`의 이미지 엔진 변경까지 통합한 PR 후보에서 `bun test` 1,495개가 +통과했다. `bun run typecheck`, `bun run lint`, `bun run ci:validate`, +`bun run ci:build`, `bun scripts/ci/audit.ts`와 전체 Git 기록 비밀정보 검사도 +통과했다. 실제 Chromium 전체 앱 시나리오 11개와 작업 보기 UX를 재검증했다. +CI 상태는 PR의 Verification 기록을 따른다. | 실제 UI 검사 | 증명한 범위 | | --- | --- | @@ -86,6 +88,10 @@ HttpOnly 인증, 정확한 Host/Origin, 메서드·경로 허용 목록과 프 production 정의와 자산 테스트로 막았다. 의존성/소스 라이선스는 JS에 포함해 웹과 Electron 양쪽 결과물에 보존한다. +Linux ZIP을 생성했고 세 QA 서버의 JS/CSS/theme이 ASAR의 동봉 자산과 +바이트 단위로 일치했다. rendererVersion은 `8b7f0710d8fa18e241fa`다. +ZIP은 로컬 빌드 산출물이며 이 PR이 릴리스로 배포하지 않는다. + ## 격리와 재현 Bun과 별도로 Playwright/Chromium이 준비된 개발 환경에서 저장소 루트 기준으로 @@ -116,8 +122,10 @@ Playwright 모듈과 실행 파일은 `LINA_QA_PLAYWRIGHT_MODULE`, `LINA_QA_CHRO GUI·재시작·OS 파일 대화상자·알림·프로토콜 실행을 확인해야 한다. - macOS/Windows 패키징·서명, 업데이트 배포, 물리 모바일 IME/OS 파일 복사는 별도 검증 범위다. Linux ZIP 생성은 출시/설치 검증을 뜻하지 않는다. -- 실모델과 외부 이미지 서비스의 생성·편집 품질은 모의 서버 결과로 주장하지 - 않는다. 새 이미지/세계관 엔진은 해당 작업이 소유하며 기존 공개 계약을 쓴다. +- 이미지 엔진의 `dev` 변경을 공통 renderer에 통합했다. 모의 생성·편집 결과가 + 세션 소유권을 유지한 320×200 미리보기로 표시되는 흐름을 확인했다. 엔진 내부를 + 수정하지 않았고 외부 provider 호출은 0회다. 실제 서비스의 생성·편집 품질과 + 세계관 엔진의 최종 연결은 이 검증으로 주장하지 않는다. - 연속 발화·중간 입력의 엔진 정책은 [별도 설계](002_conversation_delivery.md)다. - 기존 `render.ts ↔ attachments.ts` 참조는 남아 있다. 새 컴포넌트 경로는 순환하지 않으며, 기존 첨부 렌더링의 추가 분리는 이번 범위에 포함하지 않았다. diff --git a/docs/plans/codex-ui/010_ui_desktop.png b/docs/plans/codex-ui/010_ui_desktop.png index 1e265986ead2e5c4512053fbbc25d16917d79ab6..c35c741cfc1bdd39f7ca73dd3ff56df6149cf39c 100644 GIT binary patch literal 121489 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
?|9QHj_C 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%0AV5E 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�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 j_ifYwM?-zs2|Y#%nV3RK20ZP}v+kg_E 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 literal 125002 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 z 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 {N^%)~oo;;!c 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 Z2om16*NU2vNzmqym3%8vA!gwJzW_NTiWUF> diff --git a/docs/plans/codex-ui/010_ui_task_layout.png b/docs/plans/codex-ui/010_ui_task_layout.png index a3076305ed86e44b5641024d9ac838593753cbd8..e8304d734915c93b448e3580eec358d84d012b7d 100644 GIT binary patch literal 131927 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 z zpSjTrKXV-X%YKGR`>_4b|KWb(|JpXwS-|31tP;QX>n5shy)x4iV?*;lD` M>+a3M8~307KU#KgH2?qr literal 131841 zcmcG$Wl$YW|1G*9AxMG;cnAc7TX2VsySux)>&An-6WoHkyL)hVhu|(7m$S+9zUThy ze7SY2?wJo%7rSSsyQimn{nlE)36Yf+K}7h10000G#Y6?=0RWgR0N~v|95m!V1=wS` z000U=Ops5}HSKs6kr!QMjpZq)S4I$5x4vJU51)@he-uGDz*HcVm>k=$oe>@% z3Jng9(CxXt#E>Cbk~H~u({9@9W@AeWIso89=F9u7(dh^i3eqN@0vVmRw!Iw_!vq_D z3y^PrF+tERD1v2SRm9_=?ulYZW9#>tg%vM&7ipDXf`y^B1BBWfmM`cE~V0zR^L0W`R2mvAiq ztt7+pKYHrKuwiQ8fzaoY;3l3YpUpz6kv$Vfv-G{w;FtI7%l1GNKAkQgZh)PWbAD!~ zHtEmZ%k$&T&JG9!YOq-+1?cv~Qz#_G?X;Y=6a8(2RyLKpq%2y;LYv5|=Urx|jXD-s zTh&KVG^Sh_@uM_5Xm_Nl>fZVJ+hmgrJ!^#b z&@_q5`d@d;#o|cmOW4`iq6c6dnk~f_o6W0#U)JUd_Vi090rh$T?R}vJ>+31i;O8n2 z=!tZH{%lcyTAR0~>@#So&BQ71^^XomY`Y6tFMpx)pBQ;<##SLlbAVx*);CzPTz#=>p6;?(5|fyYuqO2yJU{%N*OX*+Ohh6sl>*u)7|WDE^#~(Pha^ckmcn9o zD)7@$8d^+c_Jtz%Z2#H0D|nl-8 (H9sBQyR&&xzhJlx3Ar5blX&&{i};GMTCcZT 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