openclacky 1.3.7 → 1.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/lib/clacky/agent/hook_manager.rb +10 -1
  4. data/lib/clacky/agent/system_prompt_builder.rb +1 -1
  5. data/lib/clacky/agent.rb +9 -2
  6. data/lib/clacky/agent_profile.rb +7 -4
  7. data/lib/clacky/billing/billing_store.rb +3 -2
  8. data/lib/clacky/brand_config.rb +2 -1
  9. data/lib/clacky/default_extensions/coding/agents/coding/avatar.png +0 -0
  10. data/lib/clacky/default_extensions/coding/ext.yml +4 -4
  11. data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/avatar.png +0 -0
  12. data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/system_prompt.md +0 -1
  13. data/lib/clacky/default_extensions/ext-studio/api/handler.rb +4 -3
  14. data/lib/clacky/default_extensions/ext-studio/ext.yml +1 -1
  15. data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +118 -50
  16. data/lib/clacky/default_extensions/ext-studio/skills/ext-publish/SKILL.md +1 -2
  17. data/lib/clacky/default_extensions/general/agents/general/avatar.png +0 -0
  18. data/lib/clacky/default_extensions/general/ext.yml +4 -4
  19. data/lib/clacky/default_extensions/git/ext.yml +0 -1
  20. data/lib/clacky/default_extensions/git/panels/git/view.js +3 -3
  21. data/lib/clacky/default_extensions/meeting/ext.yml +0 -1
  22. data/lib/clacky/default_extensions/meeting/panels/meeting/view.js +1 -2
  23. data/lib/clacky/default_extensions/time_machine/ext.yml +0 -1
  24. data/lib/clacky/extension/api_extension.rb +11 -2
  25. data/lib/clacky/extension/dispatcher.rb +3 -2
  26. data/lib/clacky/extension/loader.rb +6 -0
  27. data/lib/clacky/extension/packager.rb +0 -6
  28. data/lib/clacky/extension/verifier.rb +1 -1
  29. data/lib/clacky/server/http_server.rb +149 -5
  30. data/lib/clacky/shell_hook_loader.rb +266 -22
  31. data/lib/clacky/ui2/components/welcome_banner.rb +1 -1
  32. data/lib/clacky/utils/workspace_rules.rb +2 -2
  33. data/lib/clacky/version.rb +1 -1
  34. data/lib/clacky/web/app.css +334 -73
  35. data/lib/clacky/web/core/ext.js +130 -24
  36. data/lib/clacky/web/features/extensions/store.js +41 -6
  37. data/lib/clacky/web/features/extensions/view.js +44 -13
  38. data/lib/clacky/web/features/new-session/store.js +13 -0
  39. data/lib/clacky/web/features/new-session/view.js +314 -14
  40. data/lib/clacky/web/features/trash/view.js +4 -5
  41. data/lib/clacky/web/i18n.js +44 -2
  42. data/lib/clacky/web/index.html +54 -16
  43. data/lib/clacky/web/sessions.js +3 -3
  44. data/lib/clacky/web/skills.js +86 -48
  45. data/lib/clacky/web/theme.js +3 -0
  46. data/lib/clacky/web/ws-dispatcher.js +11 -2
  47. metadata +7 -7
@@ -221,6 +221,7 @@ html { font-size: 16px; }
221
221
  100% { background-position: -200% 0; }
222
222
  }
223
223
  .skel {
224
+ display: inline-block;
224
225
  border-radius: 6px;
225
226
  background: linear-gradient(90deg,
226
227
  #e8e8e8 25%,
@@ -1855,42 +1856,87 @@ body {
1855
1856
  /* ── New Session landing page (#new) ─────────────────────────────────────── */
1856
1857
  .new-session-page {
1857
1858
  justify-content: flex-start;
1858
- padding: 3rem 1.5rem 2rem;
1859
- overflow-y: auto;
1859
+ padding: 0;
1860
+ overflow: hidden;
1860
1861
  gap: 0;
1861
1862
  }
1862
1863
  .new-session-inner {
1863
1864
  width: 100%;
1864
- max-width: 44rem;
1865
+ height: 100%;
1865
1866
  display: flex;
1866
1867
  flex-direction: column;
1867
- gap: 1.5rem;
1868
+ gap: 0;
1869
+ }
1870
+ .new-session-body {
1871
+ flex: 1 1 auto;
1872
+ overflow-y: auto;
1873
+ display: flex;
1874
+ flex-direction: column;
1875
+ gap: 1.25rem;
1876
+ width: 100%;
1877
+ max-width: 60rem;
1878
+ margin: 0 auto;
1879
+ padding: 5.5rem 1.5rem 1rem;
1880
+ }
1881
+ .new-session-composer {
1882
+ position: relative;
1883
+ flex: none;
1884
+ padding: 0.75rem 1.5rem 1.25rem;
1868
1885
  }
1869
1886
  .new-session-title {
1870
1887
  font-size: 1.5rem;
1871
1888
  font-weight: 680;
1872
1889
  color: var(--color-text-primary);
1873
1890
  letter-spacing: -0.01em;
1874
- text-align: center;
1891
+ text-align: left;
1875
1892
  margin: 0;
1876
1893
  }
1877
1894
  .new-session-subtitle {
1878
1895
  color: var(--color-text-tertiary);
1879
1896
  font-size: 0.875rem;
1880
- text-align: center;
1897
+ text-align: left;
1881
1898
  margin: 0;
1882
1899
  }
1883
1900
  .new-session-agents {
1901
+ display: grid;
1902
+ grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
1903
+ grid-auto-rows: 1fr;
1904
+ gap: 0.75rem;
1905
+ }
1906
+ .new-session-agent-panels {
1884
1907
  display: flex;
1885
1908
  flex-wrap: wrap;
1886
- gap: 0.75rem;
1887
- justify-content: flex-start;
1909
+ align-items: center;
1910
+ gap: 0.375rem;
1911
+ margin-top: -0.625rem;
1912
+ padding-left: 0.125rem;
1913
+ }
1914
+ .ns-panels-label {
1915
+ width: 100%;
1916
+ font-size: 0.75rem;
1917
+ color: var(--color-text-tertiary);
1918
+ margin-bottom: 0.0625rem;
1919
+ }
1920
+ .ns-panel-chip {
1921
+ display: inline-flex;
1922
+ align-items: center;
1923
+ padding: 0.1875rem 0.5rem;
1924
+ border-radius: 0.375rem;
1925
+ font-size: 0.78125rem;
1926
+ font-weight: 500;
1927
+ line-height: 1.3;
1928
+ }
1929
+ .ns-panel-chip--panel {
1930
+ background: var(--color-accent-soft);
1931
+ color: var(--color-accent-primary);
1932
+ }
1933
+ .ns-panel-chip--skill {
1934
+ background: var(--color-bg-secondary);
1935
+ color: var(--color-text-secondary);
1936
+ border: 1px solid var(--color-border-primary);
1888
1937
  }
1889
1938
  .agent-card {
1890
1939
  position: relative;
1891
- flex: 1 1 12rem;
1892
- min-width: 11rem;
1893
- max-width: 15rem;
1894
1940
  padding: 0.9375rem 1rem;
1895
1941
  border: 1px solid var(--color-border-primary);
1896
1942
  border-radius: 0.75rem;
@@ -1918,6 +1964,35 @@ body {
1918
1964
  align-items: center;
1919
1965
  gap: 0.375rem;
1920
1966
  }
1967
+ .agent-card-header {
1968
+ display: flex;
1969
+ align-items: center;
1970
+ gap: 0.625rem;
1971
+ margin-bottom: 0.125rem;
1972
+ }
1973
+ .agent-card-avatar {
1974
+ flex: none;
1975
+ width: 2.25rem;
1976
+ height: 2.25rem;
1977
+ border-radius: 50%;
1978
+ overflow: hidden;
1979
+ background: var(--color-bg-hover);
1980
+ display: flex;
1981
+ align-items: center;
1982
+ justify-content: center;
1983
+ }
1984
+ .agent-card-avatar img {
1985
+ width: 100%;
1986
+ height: 100%;
1987
+ object-fit: cover;
1988
+ display: block;
1989
+ }
1990
+ .agent-card-avatar--fallback {
1991
+ font-size: 1rem;
1992
+ font-weight: 700;
1993
+ color: var(--color-accent-primary);
1994
+ background: var(--color-accent-soft);
1995
+ }
1921
1996
  .agent-card-new {
1922
1997
  font-size: 0.6rem;
1923
1998
  font-weight: 700;
@@ -1951,45 +2026,77 @@ body {
1951
2026
  color: var(--color-accent-primary);
1952
2027
  }
1953
2028
  .agent-card-author {
2029
+ margin-top: 0.25rem;
1954
2030
  font-size: 0.72rem;
1955
2031
  color: var(--color-text-tertiary);
1956
2032
  opacity: 0.8;
1957
2033
  }
1958
2034
 
1959
- .new-session-composer {
1960
- display: flex;
1961
- flex-direction: column;
1962
- gap: 0.5rem;
2035
+ .new-session-input-bar {
2036
+ margin: 0;
2037
+ padding: 10px 12px;
1963
2038
  border: 1px solid var(--color-border-primary);
1964
- border-radius: 0.75rem;
1965
- padding: 0.75rem;
2039
+ border-radius: 13px;
1966
2040
  background: var(--color-bg-primary);
2041
+ display: flex;
2042
+ align-items: center;
2043
+ gap: 8px;
2044
+ box-shadow: var(--shadow-card);
2045
+ transition: border-color .14s;
2046
+ }
2047
+ .new-session-input-bar:focus-within {
2048
+ border-color: color-mix(in srgb, var(--color-accent-primary) 50%, var(--color-border-primary));
2049
+ }
2050
+ .new-session-composer-btn {
2051
+ flex: none;
2052
+ display: grid;
2053
+ place-items: center;
2054
+ width: 32px;
2055
+ height: 32px;
2056
+ padding: 0;
2057
+ border: none;
2058
+ border-radius: 8px;
2059
+ background: transparent;
2060
+ color: var(--color-text-tertiary);
2061
+ cursor: pointer;
2062
+ transition: background .12s, color .12s;
2063
+ }
2064
+ .new-session-composer-btn:hover {
2065
+ color: var(--color-text-primary);
2066
+ background: var(--color-bg-hover);
2067
+ }
2068
+ .new-session-composer-btn.active {
2069
+ color: var(--color-accent-primary);
2070
+ background: var(--color-accent-soft);
2071
+ }
2072
+ .new-session-composer-btn > span {
2073
+ font-size: 0.875rem;
2074
+ font-weight: 400;
2075
+ line-height: 1;
1967
2076
  }
1968
2077
  .new-session-textarea {
1969
- width: 100%;
2078
+ flex: 1;
1970
2079
  border: none;
1971
2080
  outline: none;
1972
- resize: vertical;
2081
+ resize: none;
1973
2082
  background: transparent;
1974
2083
  color: var(--color-text-primary);
1975
- font: inherit;
1976
- font-size: 0.9375rem;
1977
- line-height: 1.5;
1978
- padding: 0.25rem;
1979
- min-height: 3rem;
1980
- max-height: 12rem;
1981
- }
1982
- .new-session-composer-actions {
1983
- display: flex;
1984
- align-items: center;
1985
- justify-content: flex-end;
1986
- gap: 0.5rem;
2084
+ font-family: var(--font-sans);
2085
+ font-size: 0.875rem;
2086
+ line-height: 1.55;
2087
+ padding: 4px 6px;
2088
+ margin: 0;
2089
+ max-height: 12.5rem;
2090
+ overflow-y: auto;
2091
+ scrollbar-width: none;
1987
2092
  }
2093
+ .new-session-textarea::-webkit-scrollbar { display: none; }
1988
2094
  .new-session-advanced-wrap {
1989
2095
  display: flex;
1990
2096
  flex-direction: column;
1991
2097
  gap: 0.5rem;
1992
2098
  align-items: flex-start;
2099
+ margin-top: -0.5rem;
1993
2100
  }
1994
2101
  .new-session-advanced-toggle {
1995
2102
  display: inline-flex;
@@ -2006,7 +2113,6 @@ body {
2006
2113
  }
2007
2114
  .new-session-advanced-toggle:hover {
2008
2115
  color: var(--color-text-secondary);
2009
- background: var(--color-bg-hover);
2010
2116
  }
2011
2117
  .new-session-advanced-caret {
2012
2118
  transition: transform 0.15s;
@@ -2015,22 +2121,30 @@ body {
2015
2121
  transform: rotate(180deg);
2016
2122
  }
2017
2123
  .new-session-send {
2018
- padding: 0.4375rem 1rem;
2124
+ flex: none;
2125
+ display: grid;
2126
+ place-items: center;
2127
+ width: 34px;
2128
+ height: 34px;
2019
2129
  border: none;
2020
- border-radius: 0.5rem;
2130
+ border-radius: 9px;
2021
2131
  background: var(--color-accent-primary);
2022
- color: var(--color-text-inverse, #fff);
2023
- font-size: 0.875rem;
2024
- font-weight: 550;
2132
+ color: #fff;
2025
2133
  cursor: pointer;
2026
- transition: opacity 0.14s;
2134
+ transition: background .12s, opacity .12s;
2135
+ }
2136
+ .new-session-send svg {
2137
+ width: 15px;
2138
+ height: 15px;
2027
2139
  }
2028
2140
  .new-session-send:disabled {
2029
- opacity: 0.45;
2141
+ background: var(--color-border-primary);
2142
+ color: var(--color-text-tertiary);
2030
2143
  cursor: not-allowed;
2144
+ opacity: 0.6;
2031
2145
  }
2032
2146
  .new-session-send:not(:disabled):hover {
2033
- opacity: 0.9;
2147
+ background: color-mix(in srgb, var(--color-accent-primary) 85%, #fff);
2034
2148
  }
2035
2149
 
2036
2150
  .new-session-advanced {
@@ -2255,7 +2369,15 @@ body {
2255
2369
  .session-banner:empty,
2256
2370
  .session-composer:empty { display: none; }
2257
2371
  .session-banner { flex-shrink: 0; }
2258
- .session-composer { flex-shrink: 0; }
2372
+ .session-composer {
2373
+ flex-shrink: 0;
2374
+ margin-bottom: -9px;
2375
+ display: flex;
2376
+ padding-inline: 12px;
2377
+ }
2378
+ .session-composer > * {
2379
+ justify-content: flex-start !important;
2380
+ }
2259
2381
 
2260
2382
  /* ── File tree (used inside the Files tab) ──────────────────────────────── */
2261
2383
  .wt-panel { flex: 1; min-height: 0; display: flex; flex-direction: column; }
@@ -4038,6 +4160,12 @@ body {
4038
4160
  box-shadow: var(--shadow-card);
4039
4161
  margin-bottom: -1px;
4040
4162
  }
4163
+ #ns-image-preview-strip {
4164
+ display: flex;
4165
+ flex-wrap: wrap;
4166
+ gap: 0.5rem;
4167
+ padding: 0.25rem 0 0.5rem;
4168
+ }
4041
4169
  /* Square off the top corners of the input-bar when the preview strip sits above it */
4042
4170
  #input-area:has(#image-preview-strip:not([style*="display:none"])):not(:has(#image-preview-strip[style*="display: none"])) #input-bar {
4043
4171
  border-top-left-radius: 0;
@@ -4136,7 +4264,8 @@ body {
4136
4264
  .pdf-preview-remove:hover { background: var(--color-error); }
4137
4265
 
4138
4266
  /* ── Skill autocomplete dropdown ─────────────────────────────────────────── */
4139
- #skill-autocomplete {
4267
+ #skill-autocomplete,
4268
+ .skill-autocomplete {
4140
4269
  position: absolute;
4141
4270
  bottom: 100%;
4142
4271
  left: 0;
@@ -4154,7 +4283,8 @@ body {
4154
4283
  z-index: 1000;
4155
4284
  }
4156
4285
 
4157
- #skill-autocomplete-list {
4286
+ #skill-autocomplete-list,
4287
+ #ns-skill-autocomplete-list {
4158
4288
  padding: 0.25rem 0;
4159
4289
  }
4160
4290
 
@@ -6949,13 +7079,45 @@ body {
6949
7079
  gap: 1.25rem;
6950
7080
  }
6951
7081
  .extensions-toolbar {
7082
+ display: flex;
7083
+ align-items: center;
7084
+ justify-content: space-between;
7085
+ gap: 0.75rem;
7086
+ margin-bottom: 0.25rem;
7087
+ }
7088
+ .extensions-toolbar-right {
6952
7089
  display: flex;
6953
7090
  align-items: center;
6954
7091
  gap: 0.5rem;
6955
7092
  }
7093
+ .extensions-filter-tabs {
7094
+ display: flex;
7095
+ align-items: center;
7096
+ gap: 0;
7097
+ flex-shrink: 0;
7098
+ }
7099
+ .extensions-filter-tab {
7100
+ font-size: 0.875rem;
7101
+ font-weight: 500;
7102
+ padding: 0.25rem 0.875rem 0.5rem;
7103
+ border: none;
7104
+ background: transparent;
7105
+ color: var(--color-text-tertiary);
7106
+ cursor: pointer;
7107
+ white-space: nowrap;
7108
+ border-bottom: 2px solid transparent;
7109
+ transition: color .15s, border-color .15s;
7110
+ }
7111
+ .extensions-filter-tab:hover {
7112
+ color: var(--color-text-primary);
7113
+ }
7114
+ .extensions-filter-tab-active {
7115
+ color: var(--color-text-primary);
7116
+ border-bottom-color: var(--color-accent, #6366f1);
7117
+ }
6956
7118
  .extensions-search {
6957
7119
  flex: 1;
6958
- min-width: 0;
7120
+ min-width: 15rem;
6959
7121
  font-size: 0.8125rem;
6960
7122
  padding: 0.4375rem 0.75rem;
6961
7123
  border-radius: 6px;
@@ -6968,13 +7130,22 @@ body {
6968
7130
  border-color: var(--color-accent, #6366f1);
6969
7131
  }
6970
7132
  .extensions-sort {
7133
+ flex-shrink: 0;
6971
7134
  font-size: 0.8125rem;
6972
- padding: 0.4375rem 0.5rem;
7135
+ padding: 0.4375rem 2rem 0.4375rem 0.75rem;
6973
7136
  border-radius: 6px;
6974
7137
  border: 1px solid var(--color-border-primary);
6975
7138
  background: var(--color-bg-secondary);
6976
7139
  color: var(--color-text-primary);
6977
7140
  cursor: pointer;
7141
+ appearance: none;
7142
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23888' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
7143
+ background-repeat: no-repeat;
7144
+ background-position: right 0.625rem center;
7145
+ }
7146
+ .extensions-sort:focus {
7147
+ outline: none;
7148
+ border-color: var(--color-accent, #6366f1);
6978
7149
  }
6979
7150
  #extensions-list {
6980
7151
  display: flex;
@@ -7024,7 +7195,7 @@ body {
7024
7195
  color: var(--color-text-secondary);
7025
7196
  background: var(--color-bg-tertiary, rgba(255,255,255,0.05));
7026
7197
  border-radius: 4px;
7027
- padding: 0.0625rem 0.375rem;
7198
+ padding: 0.0625rem 0rem;
7028
7199
  }
7029
7200
  .extension-units {
7030
7201
  font-size: 0.6875rem;
@@ -7043,6 +7214,14 @@ body {
7043
7214
  line-height: 1.5;
7044
7215
  margin-bottom: 0.375rem;
7045
7216
  }
7217
+ .extension-desc-detail {
7218
+ font-size: 0.8125rem;
7219
+ margin-bottom: 0.5rem;
7220
+ }
7221
+ .extension-detail-author {
7222
+ font-size: 0.6875rem;
7223
+ color: var(--color-text-muted);
7224
+ }
7046
7225
  .extension-meta {
7047
7226
  display: flex;
7048
7227
  align-items: center;
@@ -7065,30 +7244,41 @@ body {
7065
7244
  }
7066
7245
  .extension-detail-head { margin-bottom: 1rem; }
7067
7246
  .extension-detail-back {
7247
+ display: inline-flex;
7248
+ align-items: center;
7249
+ gap: 0.25rem;
7068
7250
  background: transparent;
7069
7251
  border: none;
7070
7252
  color: var(--color-text-secondary);
7071
7253
  font-size: 0.8125rem;
7072
7254
  cursor: pointer;
7073
- padding: 0.25rem 0;
7255
+ padding: 0.3rem 0.6rem;
7256
+ border-radius: 6px;
7257
+ margin-left: -0.6rem;
7258
+ transition: background 0.15s, color 0.15s;
7259
+ }
7260
+ .extension-detail-back:hover {
7261
+ color: var(--color-text-primary);
7262
+ background: var(--color-bg-hover);
7074
7263
  }
7075
- .extension-detail-back:hover { color: var(--color-text-primary); }
7076
7264
  .extension-detail-hero {
7077
7265
  display: flex;
7078
7266
  align-items: flex-start;
7079
- gap: 0.875rem;
7080
- padding-bottom: 1rem;
7267
+ gap: 1rem;
7268
+ padding-bottom: 1.25rem;
7081
7269
  border-bottom: 1px solid var(--color-border-primary);
7082
7270
  }
7083
7271
  .extension-detail-heading { flex: 1; min-width: 0; }
7084
- .extension-emoji-lg { font-size: 2.25rem; }
7085
- .extension-name-lg { font-size: 1.0625rem; }
7086
- .extension-detail-block { margin-top: 1.25rem; }
7272
+ .extension-emoji-lg { font-size: 2.5rem; line-height: 1; margin-top: 0.125rem; }
7273
+ .extension-name-lg { font-size: 1.125rem; font-weight: 700; }
7274
+ .extension-detail-block { margin-top: 1.5rem; }
7087
7275
  .extension-detail-block-title {
7088
- font-size: 0.8125rem;
7276
+ font-size: 0.75rem;
7089
7277
  font-weight: 600;
7090
- color: var(--color-text-primary);
7091
- margin: 0 0 0.625rem;
7278
+ text-transform: uppercase;
7279
+ letter-spacing: 0.04em;
7280
+ color: var(--color-text-muted);
7281
+ margin: 0 0 0.75rem;
7092
7282
  }
7093
7283
  .extension-detail-section { margin-bottom: 0.875rem; }
7094
7284
  .extension-detail-section-title {
@@ -7100,18 +7290,30 @@ body {
7100
7290
  margin: 0 0 0.375rem;
7101
7291
  }
7102
7292
  .extension-contrib-list,
7103
- .extension-version-list { list-style: none; margin: 0; padding: 0; }
7104
- .extension-contrib-item {
7105
- padding: 0.5rem 0.75rem;
7106
- background: var(--color-bg-secondary);
7293
+ .extension-version-list {
7294
+ list-style: none;
7295
+ margin: 0;
7296
+ padding: 0;
7107
7297
  border: 1px solid var(--color-border-primary);
7108
- border-radius: 6px;
7109
- margin-bottom: 0.375rem;
7298
+ border-radius: 8px;
7299
+ overflow: hidden;
7300
+ background: var(--color-bg-secondary);
7110
7301
  }
7302
+ .extension-contrib-item {
7303
+ padding: 0.625rem 0.875rem;
7304
+ border-bottom: 1px solid var(--color-border-primary);
7305
+ background: transparent;
7306
+ border-radius: 0;
7307
+ border-left: none;
7308
+ border-right: none;
7309
+ border-top: none;
7310
+ margin-bottom: 0;
7311
+ }
7312
+ .extension-contrib-item:last-child { border-bottom: none; }
7111
7313
  .extension-contrib-title {
7112
7314
  display: block;
7113
7315
  font-size: 0.8125rem;
7114
- font-weight: 600;
7316
+ font-weight: 500;
7115
7317
  color: var(--color-text-primary);
7116
7318
  }
7117
7319
  .extension-contrib-desc {
@@ -7122,7 +7324,7 @@ body {
7122
7324
  margin-top: 0.125rem;
7123
7325
  }
7124
7326
  .extension-version-item {
7125
- padding: 0.5rem 0.75rem;
7327
+ padding: 0.625rem 0.875rem;
7126
7328
  border-bottom: 1px solid var(--color-border-primary);
7127
7329
  }
7128
7330
  .extension-version-item:last-child { border-bottom: none; }
@@ -7158,20 +7360,43 @@ body {
7158
7360
  padding: 0.0625rem 0.375rem;
7159
7361
  }
7160
7362
  .extension-action {
7363
+ display: inline-flex;
7364
+ align-items: center;
7161
7365
  font-size: 0.75rem;
7162
- padding: 0.3125rem 0.75rem;
7163
- border-radius: 6px;
7164
- border: 1px solid var(--color-border);
7165
- background: var(--color-surface);
7166
- color: var(--color-text);
7366
+ padding: 0.25rem 0.625rem;
7367
+ border-radius: 5px;
7368
+ border: 1px solid var(--color-border-primary);
7369
+ background: var(--color-bg-primary);
7370
+ color: var(--color-text-secondary);
7167
7371
  cursor: pointer;
7372
+ transition: background .15s, border-color .15s, opacity .15s;
7373
+ white-space: nowrap;
7374
+ }
7375
+ .extension-action:hover { background: var(--color-bg-hover); }
7376
+ .extension-action-install {
7377
+ background: var(--color-button-primary);
7378
+ color: var(--color-button-primary-text);
7379
+ border-color: transparent;
7380
+ }
7381
+ .extension-action-install:hover {
7382
+ background: var(--color-button-primary-hover);
7383
+ }
7384
+ .extension-action-install:disabled {
7385
+ opacity: 0.5;
7386
+ cursor: not-allowed;
7387
+ }
7388
+ .extension-action-disable,
7389
+ .extension-action-enable {
7390
+ color: var(--color-text-tertiary);
7168
7391
  }
7169
- .extension-action:hover { background: var(--color-surface-hover, rgba(0,0,0,0.04)); }
7170
7392
  .extension-action-remove {
7171
- color: var(--color-danger, #dc2626);
7172
- border-color: var(--color-danger-border, rgba(220,38,38,0.4));
7393
+ color: var(--color-error);
7394
+ border-color: var(--color-error-border);
7395
+ }
7396
+ .extension-action-remove:hover {
7397
+ background: var(--color-error-bg);
7398
+ border-color: var(--color-error);
7173
7399
  }
7174
- .extension-action-remove:hover { background: var(--color-danger-bg, rgba(220,38,38,0.08)); }
7175
7400
 
7176
7401
  /* Brand Skill card */
7177
7402
  .brand-skill-card {
@@ -12472,5 +12697,41 @@ body.setup-mode[data-theme="dark"] {
12472
12697
  #workspace-overlay.active {
12473
12698
  display: block;
12474
12699
  }
12700
+
12701
+ /* ── New-session page: mobile ── */
12702
+ #welcome.new-session-page {
12703
+ position: fixed;
12704
+ top: 3rem;
12705
+ left: 0;
12706
+ right: 0;
12707
+ bottom: 0;
12708
+ overflow: hidden;
12709
+ padding: 0;
12710
+ justify-content: flex-start;
12711
+ height: auto;
12712
+ }
12713
+ .new-session-inner {
12714
+ height: 100%;
12715
+ display: flex;
12716
+ flex-direction: column;
12717
+ }
12718
+ .new-session-spacer {
12719
+ display: none;
12720
+ }
12721
+ .new-session-body {
12722
+ flex: 1 1 auto;
12723
+ min-height: 0;
12724
+ overflow-y: auto;
12725
+ -webkit-overflow-scrolling: touch;
12726
+ padding: 1.25rem 1rem 1rem;
12727
+ max-width: 100%;
12728
+ }
12729
+ .new-session-composer {
12730
+ flex: none;
12731
+ position: static;
12732
+ padding: 0.75rem 1rem 1rem;
12733
+ border-top: 1px solid var(--color-border-subtle);
12734
+ background: var(--color-bg-primary);
12735
+ }
12475
12736
  }
12476
12737