jupyterlab-codex-sidebar 0.1.4 → 0.1.6

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 (153) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.github/workflows/unit-tests.yml +27 -0
  3. package/.jupyterlab-playwright.log +0 -0
  4. package/README.md +83 -9
  5. package/docs/images/codex-sidebar-screenshot.png +0 -0
  6. package/jupyterlab_codex/handlers.py +938 -297
  7. package/jupyterlab_codex/labextension/package.json +13 -3
  8. package/jupyterlab_codex/labextension/static/525.224526d045c727069de6.js +2 -0
  9. package/jupyterlab_codex/labextension/static/737.e7de3ad9dd6ded798340.js +1 -0
  10. package/jupyterlab_codex/labextension/static/remoteEntry.6ef5e7167763a316c000.js +1 -0
  11. package/jupyterlab_codex/protocol.py +297 -0
  12. package/jupyterlab_codex/runner.py +58 -15
  13. package/jupyterlab_codex/sessions.py +582 -97
  14. package/lib/codexChat.d.ts +13 -0
  15. package/lib/codexChat.js +2506 -0
  16. package/lib/codexChat.js.map +1 -0
  17. package/lib/codexChatAttachmentDedup.d.ts +10 -0
  18. package/lib/codexChatAttachmentDedup.js +35 -0
  19. package/lib/codexChatAttachmentDedup.js.map +1 -0
  20. package/lib/codexChatAttachmentLimit.d.ts +18 -0
  21. package/lib/codexChatAttachmentLimit.js +50 -0
  22. package/lib/codexChatAttachmentLimit.js.map +1 -0
  23. package/lib/codexChatAttachmentState.d.ts +15 -0
  24. package/lib/codexChatAttachmentState.js +16 -0
  25. package/lib/codexChatAttachmentState.js.map +1 -0
  26. package/lib/codexChatDocumentUtils.d.ts +70 -0
  27. package/lib/codexChatDocumentUtils.js +506 -0
  28. package/lib/codexChatDocumentUtils.js.map +1 -0
  29. package/lib/codexChatFormatting.d.ts +11 -0
  30. package/lib/codexChatFormatting.js +83 -0
  31. package/lib/codexChatFormatting.js.map +1 -0
  32. package/lib/codexChatNotice.d.ts +3 -0
  33. package/lib/codexChatNotice.js +74 -0
  34. package/lib/codexChatNotice.js.map +1 -0
  35. package/lib/codexChatPersistence.d.ts +35 -0
  36. package/lib/codexChatPersistence.js +158 -0
  37. package/lib/codexChatPersistence.js.map +1 -0
  38. package/lib/codexChatPrimitives.d.ts +44 -0
  39. package/lib/codexChatPrimitives.js +156 -0
  40. package/lib/codexChatPrimitives.js.map +1 -0
  41. package/lib/codexChatRender.d.ts +24 -0
  42. package/lib/codexChatRender.js +293 -0
  43. package/lib/codexChatRender.js.map +1 -0
  44. package/lib/codexChatSessionFactory.d.ts +15 -0
  45. package/lib/codexChatSessionFactory.js +45 -0
  46. package/lib/codexChatSessionFactory.js.map +1 -0
  47. package/lib/codexChatSessionKey.d.ts +3 -0
  48. package/lib/codexChatSessionKey.js +14 -0
  49. package/lib/codexChatSessionKey.js.map +1 -0
  50. package/lib/codexChatStorage.d.ts +4 -0
  51. package/lib/codexChatStorage.js +37 -0
  52. package/lib/codexChatStorage.js.map +1 -0
  53. package/lib/codexSessionResolver.d.ts +12 -0
  54. package/lib/codexSessionResolver.js +38 -0
  55. package/lib/codexSessionResolver.js.map +1 -0
  56. package/lib/handlers/activitySummarizer.d.ts +15 -0
  57. package/lib/handlers/activitySummarizer.js +327 -0
  58. package/lib/handlers/activitySummarizer.js.map +1 -0
  59. package/lib/handlers/codexMessageTypes.d.ts +30 -0
  60. package/lib/handlers/codexMessageTypes.js +2 -0
  61. package/lib/handlers/codexMessageTypes.js.map +1 -0
  62. package/lib/handlers/codexMessageUtils.d.ts +46 -0
  63. package/lib/handlers/codexMessageUtils.js +144 -0
  64. package/lib/handlers/codexMessageUtils.js.map +1 -0
  65. package/lib/handlers/handleCodexSocketMessage.d.ts +107 -0
  66. package/lib/handlers/handleCodexSocketMessage.js +78 -0
  67. package/lib/handlers/handleCodexSocketMessage.js.map +1 -0
  68. package/lib/handlers/sessionSyncHandler.d.ts +34 -0
  69. package/lib/handlers/sessionSyncHandler.js +181 -0
  70. package/lib/handlers/sessionSyncHandler.js.map +1 -0
  71. package/lib/hooks/useCodexSocket.d.ts +15 -0
  72. package/lib/hooks/useCodexSocket.js +84 -0
  73. package/lib/hooks/useCodexSocket.js.map +1 -0
  74. package/lib/index.js +1 -1
  75. package/lib/index.js.map +1 -1
  76. package/lib/panel.d.ts +1 -11
  77. package/lib/panel.js +1 -2815
  78. package/lib/panel.js.map +1 -1
  79. package/lib/protocol.d.ts +235 -0
  80. package/lib/protocol.js +278 -0
  81. package/lib/protocol.js.map +1 -0
  82. package/package.json +13 -3
  83. package/playwright.config.cjs +27 -0
  84. package/playwright.unit.config.cjs +19 -0
  85. package/pyproject.toml +1 -1
  86. package/release.sh +52 -14
  87. package/scripts/run_playwright_e2e.sh +96 -0
  88. package/scripts/run_playwright_freeze_repro.sh +58 -0
  89. package/scripts/run_playwright_queue_repro.sh +60 -0
  90. package/scripts/run_playwright_repro.sh +55 -0
  91. package/src/codexChat.tsx +3914 -0
  92. package/src/codexChatAttachmentDedup.ts +47 -0
  93. package/src/codexChatAttachmentLimit.ts +81 -0
  94. package/src/codexChatAttachmentState.ts +37 -0
  95. package/src/codexChatDocumentUtils.ts +644 -0
  96. package/src/codexChatFormatting.ts +94 -0
  97. package/src/codexChatNotice.ts +95 -0
  98. package/src/codexChatPersistence.ts +191 -0
  99. package/src/codexChatPrimitives.tsx +446 -0
  100. package/src/codexChatRender.tsx +376 -0
  101. package/src/codexChatSessionFactory.ts +79 -0
  102. package/src/codexChatSessionKey.ts +16 -0
  103. package/src/codexChatStorage.ts +36 -0
  104. package/src/codexSessionResolver.ts +56 -0
  105. package/src/handlers/activitySummarizer.ts +369 -0
  106. package/src/handlers/codexMessageTypes.ts +34 -0
  107. package/src/handlers/codexMessageUtils.ts +217 -0
  108. package/src/handlers/handleCodexSocketMessage.ts +204 -0
  109. package/src/handlers/sessionSyncHandler.ts +308 -0
  110. package/src/hooks/useCodexSocket.ts +109 -0
  111. package/src/index.ts +1 -1
  112. package/src/panel.tsx +1 -4184
  113. package/src/protocol.ts +582 -0
  114. package/style/index.css +480 -11
  115. package/test-results/.last-run.json +4 -0
  116. package/test.py +0 -0
  117. package/tests/e2e/cell-output-error-tail.spec.js +156 -0
  118. package/tests/e2e/codex-ui-test-helpers.js +138 -0
  119. package/tests/e2e/fixtures/notebooks/error-output-tail.ipynb +58 -0
  120. package/tests/e2e/fixtures/notebooks/error-output-tail.py +19 -0
  121. package/tests/e2e/fixtures/notebooks/tab1.ipynb +322 -0
  122. package/tests/e2e/fixtures/notebooks/tab1.py +272 -0
  123. package/tests/e2e/fixtures/notebooks/tab2.ipynb +252 -0
  124. package/tests/e2e/fixtures/notebooks/tab2.py +231 -0
  125. package/tests/e2e/fixtures/notebooks/tab3.ipynb +403 -0
  126. package/tests/e2e/fixtures/notebooks/tab3.py +331 -0
  127. package/tests/e2e/fixtures/notebooks/tab4.py +339 -0
  128. package/tests/e2e/freeze-notebook-tabs-repro.spec.js +295 -0
  129. package/tests/e2e/mock-codex-cli-flood.py +127 -0
  130. package/tests/e2e/mock-codex-cli-prompt-echo.py +88 -0
  131. package/tests/e2e/mock-codex-cli.py +95 -0
  132. package/tests/e2e/queue-multitab-repro.spec.js +189 -0
  133. package/tests/test_handlers.py +116 -0
  134. package/tests/test_protocol.py +169 -0
  135. package/tests/test_session_store_limits.py +50 -0
  136. package/tests/unit/codexChatAttachmentDedup.spec.ts +56 -0
  137. package/tests/unit/codexChatAttachmentLimit.spec.ts +57 -0
  138. package/tests/unit/codexChatAttachmentState.spec.ts +71 -0
  139. package/tests/unit/codexChatDocumentUtils.spec.ts +63 -0
  140. package/tests/unit/codexChatLimit.spec.ts +18 -0
  141. package/tests/unit/codexChatNotice.spec.ts +45 -0
  142. package/tests/unit/codexChatPersistence.spec.ts +199 -0
  143. package/tests/unit/codexChatSessionFactory.spec.ts +94 -0
  144. package/tests/unit/codexChatSessionKey.spec.ts +18 -0
  145. package/tests/unit/codexMessageUtils.spec.ts +89 -0
  146. package/tests/unit/codexSessionResolver.spec.ts +92 -0
  147. package/tests/unit/handleCodexSocketMessage.spec.ts +476 -0
  148. package/tsconfig.tsbuildinfo +1 -1
  149. package/webpack.config.js +6 -0
  150. package/jupyterlab_codex/labextension/static/504.335f3447c84ba3d74517.js +0 -2
  151. package/jupyterlab_codex/labextension/static/972.8e856719e40acc1ef4cb.js +0 -1
  152. package/jupyterlab_codex/labextension/static/remoteEntry.a2982f776a1f0f515640.js +0 -1
  153. /package/jupyterlab_codex/labextension/static/{504.335f3447c84ba3d74517.js.LICENSE.txt → 525.224526d045c727069de6.js.LICENSE.txt} +0 -0
package/style/index.css CHANGED
@@ -123,7 +123,7 @@
123
123
  justify-self: end;
124
124
  display: flex;
125
125
  align-items: center;
126
- gap: 4px;
126
+ gap: 0;
127
127
  }
128
128
 
129
129
  @container (max-width: 420px) {
@@ -142,7 +142,7 @@
142
142
  }
143
143
 
144
144
  .jp-CodexChat-header-actions {
145
- gap: 6px;
145
+ gap: 0;
146
146
  }
147
147
 
148
148
  .jp-CodexChat-notebook {
@@ -770,6 +770,7 @@
770
770
  .jp-CodexChat-assistant {
771
771
  align-self: flex-start;
772
772
  border: 0;
773
+ background: transparent;
773
774
  padding-left: 0;
774
775
  padding-right: 0;
775
776
  }
@@ -905,6 +906,133 @@
905
906
  margin-top: 8px;
906
907
  }
907
908
 
909
+ .jp-CodexChat-selectionToggle {
910
+ appearance: none;
911
+ -webkit-appearance: none;
912
+ box-sizing: border-box;
913
+ position: absolute;
914
+ right: calc(var(--cdx-selection-btn-size, 2em) * -0.14);
915
+ bottom: calc(var(--cdx-selection-btn-size, 2em) * -0.36);
916
+ z-index: 1;
917
+ width: var(--cdx-selection-btn-size, 2em) !important;
918
+ height: var(--cdx-selection-btn-size, 2em) !important;
919
+ min-width: var(--cdx-selection-btn-size, 2em) !important;
920
+ min-height: var(--cdx-selection-btn-size, 2em) !important;
921
+ max-width: var(--cdx-selection-btn-size, 2em) !important;
922
+ max-height: var(--cdx-selection-btn-size, 2em) !important;
923
+ border-radius: 50% !important;
924
+ overflow: hidden;
925
+ border: 2px solid color-mix(in srgb, var(--cdx-surface) 94%, #ffffff);
926
+ background: #101010;
927
+ color: #ffffff;
928
+ display: inline-flex;
929
+ align-items: center;
930
+ justify-content: center;
931
+ padding: 0;
932
+ line-height: 0;
933
+ font-size: calc(var(--cdx-selection-btn-size, 2em) * 0.48);
934
+ cursor: pointer;
935
+ box-shadow: 0 8px 22px rgba(10, 10, 10, 0.3);
936
+ opacity: 1;
937
+ transition: background 120ms ease, border-color 120ms ease, color 120ms ease, transform 120ms ease,
938
+ opacity 120ms ease;
939
+ }
940
+
941
+ .jp-CodexChat-selectionToggle svg {
942
+ display: block;
943
+ transition: transform 120ms ease;
944
+ }
945
+
946
+ .jp-CodexChat-selectionToggle:hover {
947
+ background: #1a1a1a;
948
+ border-color: color-mix(in srgb, #ffffff 94%, var(--cdx-border));
949
+ transform: translateY(-1px);
950
+ }
951
+
952
+ .jp-CodexChat-selectionToggle.is-open {
953
+ background: #000000;
954
+ border-color: #ffffff;
955
+ }
956
+
957
+ .jp-CodexChat-selectionToggle.is-open svg {
958
+ transform: rotate(45deg);
959
+ }
960
+
961
+ @media (hover: hover) and (pointer: fine) {
962
+ .jp-CodexChat-user.has-selection-preview .jp-CodexChat-selectionToggle {
963
+ opacity: 0;
964
+ pointer-events: none;
965
+ transform: translateY(2px) scale(0.94);
966
+ }
967
+
968
+ .jp-CodexChat-user.has-selection-preview:hover .jp-CodexChat-selectionToggle,
969
+ .jp-CodexChat-user.has-selection-preview:focus-within .jp-CodexChat-selectionToggle,
970
+ .jp-CodexChat-user.has-selection-preview.is-selection-open .jp-CodexChat-selectionToggle {
971
+ opacity: 1;
972
+ pointer-events: auto;
973
+ transform: translateY(0) scale(1);
974
+ }
975
+
976
+ .jp-CodexChat-user.has-selection-preview .jp-CodexChat-selectionToggle:hover {
977
+ transform: translateY(-1px) scale(1);
978
+ }
979
+ }
980
+
981
+ .jp-CodexChat-selectionCard {
982
+ margin-top: 0;
983
+ width: auto;
984
+ padding: 9px 11px;
985
+ border-radius: 12px;
986
+ border: 1px solid color-mix(in srgb, var(--cdx-border) 72%, transparent);
987
+ background: color-mix(in srgb, var(--cdx-surface-2) 82%, transparent);
988
+ }
989
+
990
+ .jp-CodexChat-contextSection + .jp-CodexChat-contextSection {
991
+ margin-top: 10px;
992
+ padding-top: 10px;
993
+ border-top: 1px solid color-mix(in srgb, var(--cdx-border) 66%, transparent);
994
+ }
995
+
996
+ .jp-CodexChat-selectionMeta {
997
+ font-family: var(--cdx-mono);
998
+ font-size: 11px;
999
+ line-height: 1.35;
1000
+ color: var(--cdx-muted);
1001
+ }
1002
+
1003
+ .jp-CodexChat-selectionText {
1004
+ margin-top: 4px;
1005
+ font-family: var(--cdx-mono);
1006
+ font-size: 12px;
1007
+ line-height: 1.45;
1008
+ color: var(--cdx-text);
1009
+ white-space: pre-wrap;
1010
+ overflow-wrap: anywhere;
1011
+ word-break: break-word;
1012
+ }
1013
+
1014
+ .jp-CodexChat-selectionCode {
1015
+ margin-top: 6px;
1016
+ border-radius: 10px;
1017
+ border: 1px solid color-mix(in srgb, var(--cdx-border) 78%, transparent);
1018
+ background: color-mix(in srgb, var(--cdx-surface) 86%, var(--cdx-surface-2));
1019
+ padding: 8px 10px;
1020
+ overflow: auto;
1021
+ }
1022
+
1023
+ .jp-CodexChat-selectionCode code.hljs {
1024
+ white-space: pre;
1025
+ }
1026
+
1027
+ .jp-CodexChat-message.has-selection-preview {
1028
+ overflow: visible;
1029
+ }
1030
+
1031
+ .jp-CodexChat-user.has-selection-preview {
1032
+ --cdx-selection-btn-size: clamp(1.85em, 2.08em, 2.28em);
1033
+ margin-bottom: calc(var(--cdx-selection-btn-size) * 0.45);
1034
+ }
1035
+
908
1036
  .jp-CodexChat-attachmentPill {
909
1037
  display: inline-flex;
910
1038
  align-items: center;
@@ -957,10 +1085,12 @@
957
1085
 
958
1086
  .jp-CodexMarkdown code {
959
1087
  font-family: var(--cdx-mono);
960
- font-size: 11px;
1088
+ font-size: 8px;
961
1089
  color: var(--cdx-code-text);
962
- padding: 2px 7px;
963
- border-radius: 10px;
1090
+ padding: 2px 5px;
1091
+ margin-left: 2px;
1092
+ margin-right: 2px;
1093
+ border-radius: 8px;
964
1094
  border: 0;
965
1095
  background: color-mix(in srgb, var(--cdx-surface-2) 78%, transparent);
966
1096
  line-height: 1.45;
@@ -971,6 +1101,11 @@
971
1101
  word-break: break-word;
972
1102
  }
973
1103
 
1104
+ .jp-CodexChat .jp-CodexMarkdown code {
1105
+ font-family: var(--cdx-mono) !important;
1106
+ font-size: 12px !important;
1107
+ }
1108
+
974
1109
  .jp-CodexMarkdown pre {
975
1110
  margin: 10px 0 0;
976
1111
  padding: 10px;
@@ -1108,6 +1243,16 @@
1108
1243
  color: var(--cdx-code-operator);
1109
1244
  }
1110
1245
 
1246
+ /* Fallback for highlight.js token classes we do not theme explicitly. */
1247
+ .jp-CodexCodeBlock .hljs-subst,
1248
+ .jp-CodexCodeBlock .hljs-type,
1249
+ .jp-CodexCodeBlock .hljs-name,
1250
+ .jp-CodexCodeBlock .hljs-class,
1251
+ .jp-CodexCodeBlock .hljs-tag,
1252
+ .jp-CodexCodeBlock .hljs-link {
1253
+ color: var(--cdx-code-text);
1254
+ }
1255
+
1111
1256
  .jp-CodexCodeBlockCopyBtn {
1112
1257
  opacity: 0;
1113
1258
  pointer-events: none;
@@ -1156,7 +1301,7 @@
1156
1301
  box-shadow: none;
1157
1302
  display: flex;
1158
1303
  flex-direction: column;
1159
- gap: 8px;
1304
+ gap: 2px;
1160
1305
  }
1161
1306
 
1162
1307
  .jp-CodexComposer:focus-within {
@@ -1168,13 +1313,13 @@
1168
1313
  width: 100%;
1169
1314
  box-sizing: border-box;
1170
1315
  resize: none;
1171
- min-height: calc(1.55em + 12px);
1172
- max-height: calc(1.55em * 3 + 12px);
1316
+ min-height: calc(1.45em + 8px);
1317
+ max-height: calc(1.45em * 3 + 8px);
1173
1318
  border: 0;
1174
1319
  border-radius: 14px;
1175
- padding: 6px 10px;
1320
+ padding: 4px 10px;
1176
1321
  font-size: 13px;
1177
- line-height: 1.55;
1322
+ line-height: 1.45;
1178
1323
  background: transparent;
1179
1324
  color: var(--cdx-text);
1180
1325
  outline: none;
@@ -1189,6 +1334,83 @@
1189
1334
  opacity: 0.7;
1190
1335
  }
1191
1336
 
1337
+ .jp-CodexComposer-cellAttachmentWrap {
1338
+ display: flex;
1339
+ align-items: center;
1340
+ max-height: 0;
1341
+ margin-bottom: 0;
1342
+ opacity: 0;
1343
+ transform: translateY(-4px) scale(0.98);
1344
+ transform-origin: left center;
1345
+ overflow: hidden;
1346
+ pointer-events: none;
1347
+ transition: max-height 170ms ease, margin-bottom 170ms ease, opacity 170ms ease, transform 170ms ease;
1348
+ }
1349
+
1350
+ .jp-CodexComposer-cellAttachmentWrap.is-visible {
1351
+ max-height: 32px;
1352
+ margin-bottom: 6px;
1353
+ opacity: 1;
1354
+ transform: translateY(0) scale(1);
1355
+ pointer-events: auto;
1356
+ }
1357
+
1358
+ .jp-CodexComposer-cellAttachment {
1359
+ appearance: none;
1360
+ -webkit-appearance: none;
1361
+ display: inline-flex;
1362
+ align-items: center;
1363
+ justify-content: center;
1364
+ gap: 4px;
1365
+ width: fit-content;
1366
+ max-width: 100%;
1367
+ min-height: 24px;
1368
+ padding: 0 7px 0 6px;
1369
+ border-radius: 9999px !important;
1370
+ border: 1px solid transparent;
1371
+ overflow: hidden;
1372
+ background: color-mix(in srgb, var(--cdx-accent) 9%, var(--cdx-surface));
1373
+ color: color-mix(in srgb, var(--cdx-accent) 80%, var(--cdx-text));
1374
+ font-size: 11px;
1375
+ font-weight: 400;
1376
+ line-height: 1;
1377
+ cursor: pointer;
1378
+ transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
1379
+ animation: cdx-cell-attachment-in 220ms cubic-bezier(0.2, 0.8, 0.2, 1);
1380
+ }
1381
+
1382
+ .jp-CodexComposer-cellAttachment:not(.is-off) {
1383
+ border-color: color-mix(in srgb, var(--cdx-accent) 42%, var(--cdx-border));
1384
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--cdx-accent) 16%, transparent);
1385
+ }
1386
+
1387
+ .jp-CodexComposer-cellAttachment.is-off {
1388
+ background: color-mix(in srgb, var(--cdx-border) 28%, var(--cdx-surface));
1389
+ color: color-mix(in srgb, var(--cdx-text) 72%, var(--cdx-muted));
1390
+ }
1391
+
1392
+ .jp-CodexComposer-cellAttachment:hover,
1393
+ .jp-CodexComposer-cellAttachment:focus-within {
1394
+ background: color-mix(in srgb, var(--cdx-accent) 80%, var(--cdx-text));
1395
+ color: var(--cdx-surface);
1396
+ }
1397
+
1398
+ .jp-CodexComposer-cellAttachmentLabel {
1399
+ min-width: 0;
1400
+ white-space: nowrap;
1401
+ }
1402
+
1403
+ @keyframes cdx-cell-attachment-in {
1404
+ 0% {
1405
+ opacity: 0;
1406
+ transform: translateY(-4px) scale(0.96);
1407
+ }
1408
+ 100% {
1409
+ opacity: 1;
1410
+ transform: translateY(0) scale(1);
1411
+ }
1412
+ }
1413
+
1192
1414
  .jp-CodexComposer-attachments {
1193
1415
  display: flex;
1194
1416
  flex-wrap: wrap;
@@ -1196,6 +1418,55 @@
1196
1418
  padding: 0 4px;
1197
1419
  }
1198
1420
 
1421
+ .jp-CodexComposer-queued {
1422
+ display: flex;
1423
+ align-items: center;
1424
+ gap: 8px;
1425
+ min-width: 0;
1426
+ margin: 0 2px 4px;
1427
+ padding: 4px 8px;
1428
+ border: 1px solid color-mix(in srgb, var(--cdx-accent) 30%, var(--cdx-border));
1429
+ border-radius: 10px;
1430
+ background: color-mix(in srgb, var(--cdx-accent) 10%, var(--cdx-surface));
1431
+ color: color-mix(in srgb, var(--cdx-accent) 82%, var(--cdx-text));
1432
+ font-size: 11px;
1433
+ }
1434
+
1435
+ .jp-CodexComposer-queuedLabel {
1436
+ flex: 0 0 auto;
1437
+ font-weight: 700;
1438
+ letter-spacing: 0.01em;
1439
+ }
1440
+
1441
+ .jp-CodexComposer-queuedText {
1442
+ flex: 1 1 auto;
1443
+ min-width: 0;
1444
+ white-space: nowrap;
1445
+ overflow: hidden;
1446
+ text-overflow: ellipsis;
1447
+ }
1448
+
1449
+ .jp-CodexComposer-queuedRemove {
1450
+ appearance: none;
1451
+ width: 16px;
1452
+ height: 16px;
1453
+ padding: 0;
1454
+ border-radius: 999px;
1455
+ border: 1px solid color-mix(in srgb, var(--cdx-accent) 35%, var(--cdx-border));
1456
+ background: color-mix(in srgb, var(--cdx-surface) 84%, transparent);
1457
+ color: inherit;
1458
+ display: inline-flex;
1459
+ align-items: center;
1460
+ justify-content: center;
1461
+ cursor: pointer;
1462
+ transition: background 120ms ease, border-color 120ms ease;
1463
+ }
1464
+
1465
+ .jp-CodexComposer-queuedRemove:hover:not(:disabled) {
1466
+ background: var(--cdx-surface);
1467
+ border-color: color-mix(in srgb, var(--cdx-accent) 55%, var(--cdx-border));
1468
+ }
1469
+
1199
1470
  .jp-CodexComposer-attachment {
1200
1471
  position: relative;
1201
1472
  width: 64px;
@@ -1241,7 +1512,7 @@
1241
1512
  align-items: center;
1242
1513
  justify-content: space-between;
1243
1514
  gap: 10px;
1244
- padding-top: 8px;
1515
+ padding-top: 0;
1245
1516
  }
1246
1517
 
1247
1518
  .jp-CodexComposer-toolbarLeft {
@@ -1260,6 +1531,65 @@
1260
1531
  flex-shrink: 0;
1261
1532
  }
1262
1533
 
1534
+ .jp-CodexContextWrap {
1535
+ position: relative;
1536
+ display: inline-flex;
1537
+ align-items: center;
1538
+ }
1539
+
1540
+ .jp-CodexContextBtn {
1541
+ color: color-mix(in srgb, var(--cdx-muted) 90%, var(--cdx-text));
1542
+ }
1543
+
1544
+ .jp-CodexContextBtn.is-stale:not(:disabled) {
1545
+ opacity: 0.72;
1546
+ }
1547
+
1548
+ .jp-CodexContextPopover {
1549
+ min-width: 176px;
1550
+ width: fit-content;
1551
+ z-index: 35;
1552
+ max-width: min(280px, calc(100vw - 24px));
1553
+ border-radius: 12px;
1554
+ border: 1px solid color-mix(in srgb, var(--cdx-border) 85%, transparent);
1555
+ background: color-mix(in srgb, var(--cdx-surface) 94%, transparent);
1556
+ box-shadow: 0 14px 30px rgba(2, 6, 23, 0.2);
1557
+ backdrop-filter: blur(10px);
1558
+ padding: 8px 9px;
1559
+ display: grid;
1560
+ gap: 6px;
1561
+ }
1562
+
1563
+ .jp-CodexContextPopoverTitle {
1564
+ font-size: 11px;
1565
+ font-weight: 700;
1566
+ letter-spacing: 0.01em;
1567
+ color: var(--cdx-text);
1568
+ }
1569
+
1570
+ .jp-CodexContextPopoverRow {
1571
+ display: flex;
1572
+ align-items: center;
1573
+ justify-content: space-between;
1574
+ gap: 10px;
1575
+ font-size: 11px;
1576
+ color: var(--cdx-muted);
1577
+ }
1578
+
1579
+ .jp-CodexContextPopoverRow strong {
1580
+ color: var(--cdx-text);
1581
+ font-family: var(--cdx-mono);
1582
+ font-size: 11px;
1583
+ font-weight: 600;
1584
+ }
1585
+
1586
+ .jp-CodexContextPopoverMeta {
1587
+ padding-top: 2px;
1588
+ border-top: 1px solid color-mix(in srgb, var(--cdx-border) 80%, transparent);
1589
+ font-size: 10px;
1590
+ color: color-mix(in srgb, var(--cdx-muted) 90%, var(--cdx-text));
1591
+ }
1592
+
1263
1593
  .jp-CodexComposer-hint {
1264
1594
  font-size: 11px;
1265
1595
  color: var(--cdx-muted);
@@ -1530,6 +1860,15 @@
1530
1860
  --cdx-good: var(--jp-success-color1, #22c55e);
1531
1861
  --cdx-warn: var(--jp-warn-color1, #f97316);
1532
1862
  --cdx-bad: var(--jp-error-color1, #ef4444);
1863
+ --cdx-code-text: var(--cdx-text);
1864
+ --cdx-code-comment: #6b7280;
1865
+ --cdx-code-keyword: #7c3aed;
1866
+ --cdx-code-string: #0f766e;
1867
+ --cdx-code-number: #b45309;
1868
+ --cdx-code-function: #0f766e;
1869
+ --cdx-code-variable: #1d4ed8;
1870
+ --cdx-code-operator: #334155;
1871
+ --cdx-code-title: #0f172a;
1533
1872
 
1534
1873
  --cdx-radius: 14px;
1535
1874
  --cdx-radius-sm: 10px;
@@ -1547,6 +1886,108 @@
1547
1886
  color: var(--cdx-text);
1548
1887
  }
1549
1888
 
1889
+ .jp-mod-theme-light .jp-CodexMenuPortal {
1890
+ --cdx-code-text: #0f172a;
1891
+ --cdx-code-comment: #6b7280;
1892
+ --cdx-code-keyword: #7c3aed;
1893
+ --cdx-code-string: #0f766e;
1894
+ --cdx-code-number: #b45309;
1895
+ --cdx-code-function: #0f766e;
1896
+ --cdx-code-variable: #1d4ed8;
1897
+ --cdx-code-operator: #334155;
1898
+ --cdx-code-title: #0f172a;
1899
+ }
1900
+
1901
+ .jp-mod-theme-dark .jp-CodexMenuPortal {
1902
+ --cdx-code-text: #e2e8f0;
1903
+ --cdx-code-comment: #94a3b8;
1904
+ --cdx-code-keyword: #c084fc;
1905
+ --cdx-code-string: #5eead4;
1906
+ --cdx-code-number: #fbbf24;
1907
+ --cdx-code-function: #4ade80;
1908
+ --cdx-code-variable: #93c5fd;
1909
+ --cdx-code-operator: #cbd5e1;
1910
+ --cdx-code-title: #f8fafc;
1911
+ }
1912
+
1913
+ .jp-CodexMenu.jp-CodexChat-selectionPopover {
1914
+ min-width: min(18ch, calc(100vw - 24px)) !important;
1915
+ width: fit-content !important;
1916
+ max-width: min(600px, calc(100vw - 24px)) !important;
1917
+ max-height: calc(100vh - 48px) !important;
1918
+ max-height: calc(100dvh - 48px) !important;
1919
+ padding: 8px !important;
1920
+ overflow: auto !important;
1921
+ overscroll-behavior: contain;
1922
+ -webkit-overflow-scrolling: touch;
1923
+ }
1924
+
1925
+ .jp-CodexMenu.jp-CodexCellAttachmentPopoverMenu {
1926
+ min-width: 220px;
1927
+ width: fit-content;
1928
+ max-width: min(320px, calc(100vw - 24px));
1929
+ padding: 8px;
1930
+ box-shadow: 0 12px 26px rgba(2, 6, 23, 0.16);
1931
+ }
1932
+
1933
+ .jp-CodexMenu.jp-CodexContextPopover {
1934
+ min-width: 176px;
1935
+ width: fit-content;
1936
+ max-width: min(280px, calc(100vw - 24px));
1937
+ border-radius: 12px;
1938
+ background: color-mix(in srgb, var(--cdx-surface) 94%, transparent);
1939
+ box-shadow: 0 14px 30px rgba(2, 6, 23, 0.2);
1940
+ padding: 8px 9px;
1941
+ }
1942
+
1943
+ .jp-CodexCellAttachmentPopoverCard {
1944
+ display: grid;
1945
+ gap: 6px;
1946
+ padding: 2px;
1947
+ }
1948
+
1949
+ .jp-CodexCellAttachmentPopoverTitle {
1950
+ font-size: 11px;
1951
+ font-weight: 700;
1952
+ letter-spacing: 0.01em;
1953
+ color: var(--cdx-text);
1954
+ }
1955
+
1956
+ .jp-CodexCellAttachmentPopoverRow {
1957
+ display: flex;
1958
+ align-items: center;
1959
+ justify-content: space-between;
1960
+ gap: 10px;
1961
+ font-size: 11px;
1962
+ color: var(--cdx-muted);
1963
+ }
1964
+
1965
+ .jp-CodexCellAttachmentPopoverRow strong {
1966
+ color: var(--cdx-text);
1967
+ font-family: var(--cdx-mono);
1968
+ font-size: 11px;
1969
+ font-weight: 700;
1970
+ }
1971
+
1972
+ .jp-CodexCellAttachmentDot {
1973
+ width: 9px;
1974
+ height: 9px;
1975
+ border-radius: 999px;
1976
+ display: inline-block;
1977
+ border: 1px solid color-mix(in srgb, var(--cdx-border) 80%, transparent);
1978
+ }
1979
+
1980
+ .jp-CodexCellAttachmentDot.is-on {
1981
+ background: color-mix(in srgb, var(--cdx-good) 88%, var(--cdx-text));
1982
+ border-color: color-mix(in srgb, var(--cdx-good) 48%, var(--cdx-border));
1983
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--cdx-good) 18%, transparent);
1984
+ }
1985
+
1986
+ .jp-CodexCellAttachmentDot.is-off {
1987
+ background: color-mix(in srgb, var(--cdx-muted) 42%, var(--cdx-surface));
1988
+ border-color: color-mix(in srgb, var(--cdx-border) 88%, transparent);
1989
+ }
1990
+
1550
1991
  .jp-CodexUsageBtn {
1551
1992
  position: relative;
1552
1993
  }
@@ -1564,6 +2005,19 @@
1564
2005
  color: color-mix(in srgb, var(--cdx-bad) 85%, var(--cdx-text));
1565
2006
  }
1566
2007
 
2008
+ .jp-CodexPermissionBtn.is-warning:not(:disabled) {
2009
+ border-color: transparent;
2010
+ background: transparent;
2011
+ color: color-mix(in srgb, #f5b301 72%, var(--cdx-text));
2012
+ }
2013
+
2014
+ .jp-CodexPermissionBtn.is-warning:hover:not(:disabled),
2015
+ .jp-CodexPermissionBtn.is-warning.is-open:not(:disabled) {
2016
+ border-color: color-mix(in srgb, #f5b301 55%, var(--cdx-border));
2017
+ background: color-mix(in srgb, #f5b301 14%, var(--cdx-surface));
2018
+ color: color-mix(in srgb, #f5b301 84%, var(--cdx-text));
2019
+ }
2020
+
1567
2021
  .jp-CodexUsageBtn.is-stale:not(:disabled),
1568
2022
  .jp-CodexUsageBtn.is-stale:hover:not(:disabled),
1569
2023
  .jp-CodexUsageBtn.is-stale.is-open:not(:disabled) {
@@ -1775,15 +2229,30 @@
1775
2229
  color: #ffffff;
1776
2230
  }
1777
2231
 
2232
+ .jp-CodexSendBtn.is-queue:not(:disabled) {
2233
+ border-color: color-mix(in srgb, var(--cdx-accent) 70%, var(--cdx-border));
2234
+ background: color-mix(in srgb, var(--cdx-accent) 92%, #0f172a);
2235
+ color: #ffffff;
2236
+ }
2237
+
1778
2238
  .jp-CodexSendBtn:hover:not(:disabled) {
1779
2239
  border-color: color-mix(in srgb, #000000 92%, var(--cdx-border));
1780
2240
  background: color-mix(in srgb, #000000 92%, #222222);
1781
2241
  }
1782
2242
 
2243
+ .jp-CodexSendBtn.is-queue:hover:not(:disabled) {
2244
+ border-color: color-mix(in srgb, var(--cdx-accent) 86%, var(--cdx-border));
2245
+ background: color-mix(in srgb, var(--cdx-accent) 96%, #0f172a);
2246
+ }
2247
+
1783
2248
  .jp-CodexSendBtn:active:not(:disabled) {
1784
2249
  background: color-mix(in srgb, #000000 88%, #222222);
1785
2250
  }
1786
2251
 
2252
+ .jp-CodexSendBtn.is-queue:active:not(:disabled) {
2253
+ background: color-mix(in srgb, var(--cdx-accent) 88%, #0f172a);
2254
+ }
2255
+
1787
2256
  .jp-CodexSendBtn:focus-visible {
1788
2257
  outline: none;
1789
2258
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "passed",
3
+ "failedTests": []
4
+ }
package/test.py ADDED
File without changes