codex-autorunner 1.2.0__py3-none-any.whl → 1.3.0__py3-none-any.whl

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 (67) hide show
  1. codex_autorunner/bootstrap.py +26 -5
  2. codex_autorunner/core/about_car.py +12 -12
  3. codex_autorunner/core/config.py +178 -61
  4. codex_autorunner/core/context_awareness.py +1 -0
  5. codex_autorunner/core/filesystem.py +24 -0
  6. codex_autorunner/core/flows/controller.py +50 -12
  7. codex_autorunner/core/flows/runtime.py +8 -3
  8. codex_autorunner/core/hub.py +293 -16
  9. codex_autorunner/core/lifecycle_events.py +44 -5
  10. codex_autorunner/core/pma_context.py +188 -1
  11. codex_autorunner/core/pma_delivery.py +81 -0
  12. codex_autorunner/core/pma_dispatches.py +224 -0
  13. codex_autorunner/core/pma_lane_worker.py +122 -0
  14. codex_autorunner/core/pma_queue.py +167 -18
  15. codex_autorunner/core/pma_reactive.py +91 -0
  16. codex_autorunner/core/pma_safety.py +58 -0
  17. codex_autorunner/core/pma_sink.py +104 -0
  18. codex_autorunner/core/pma_transcripts.py +183 -0
  19. codex_autorunner/core/safe_paths.py +117 -0
  20. codex_autorunner/housekeeping.py +77 -23
  21. codex_autorunner/integrations/agents/codex_backend.py +18 -12
  22. codex_autorunner/integrations/agents/wiring.py +2 -0
  23. codex_autorunner/integrations/app_server/client.py +31 -0
  24. codex_autorunner/integrations/app_server/supervisor.py +3 -0
  25. codex_autorunner/integrations/telegram/adapter.py +1 -1
  26. codex_autorunner/integrations/telegram/config.py +1 -1
  27. codex_autorunner/integrations/telegram/constants.py +1 -1
  28. codex_autorunner/integrations/telegram/handlers/commands/execution.py +16 -15
  29. codex_autorunner/integrations/telegram/handlers/commands/files.py +5 -8
  30. codex_autorunner/integrations/telegram/handlers/commands/github.py +10 -6
  31. codex_autorunner/integrations/telegram/handlers/commands/shared.py +9 -8
  32. codex_autorunner/integrations/telegram/handlers/commands/workspace.py +85 -2
  33. codex_autorunner/integrations/telegram/handlers/commands_runtime.py +29 -8
  34. codex_autorunner/integrations/telegram/handlers/messages.py +8 -2
  35. codex_autorunner/integrations/telegram/helpers.py +30 -2
  36. codex_autorunner/integrations/telegram/ticket_flow_bridge.py +54 -3
  37. codex_autorunner/static/archive.js +274 -81
  38. codex_autorunner/static/archiveApi.js +21 -0
  39. codex_autorunner/static/constants.js +1 -1
  40. codex_autorunner/static/docChatCore.js +2 -0
  41. codex_autorunner/static/hub.js +59 -0
  42. codex_autorunner/static/index.html +70 -54
  43. codex_autorunner/static/notificationBell.js +173 -0
  44. codex_autorunner/static/notifications.js +187 -36
  45. codex_autorunner/static/pma.js +96 -35
  46. codex_autorunner/static/styles.css +431 -4
  47. codex_autorunner/static/terminalManager.js +22 -3
  48. codex_autorunner/static/utils.js +5 -1
  49. codex_autorunner/surfaces/cli/cli.py +206 -129
  50. codex_autorunner/surfaces/cli/template_repos.py +157 -0
  51. codex_autorunner/surfaces/web/app.py +193 -5
  52. codex_autorunner/surfaces/web/routes/archive.py +197 -0
  53. codex_autorunner/surfaces/web/routes/file_chat.py +115 -87
  54. codex_autorunner/surfaces/web/routes/flows.py +125 -67
  55. codex_autorunner/surfaces/web/routes/pma.py +638 -57
  56. codex_autorunner/surfaces/web/schemas.py +11 -0
  57. codex_autorunner/tickets/agent_pool.py +6 -1
  58. codex_autorunner/tickets/outbox.py +27 -14
  59. codex_autorunner/tickets/replies.py +4 -10
  60. codex_autorunner/tickets/runner.py +1 -0
  61. codex_autorunner/workspace/paths.py +8 -3
  62. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/METADATA +1 -1
  63. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/RECORD +67 -57
  64. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/WHEEL +0 -0
  65. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/entry_points.txt +0 -0
  66. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/licenses/LICENSE +0 -0
  67. {codex_autorunner-1.2.0.dist-info → codex_autorunner-1.3.0.dist-info}/top_level.txt +0 -0
@@ -1080,6 +1080,19 @@ main {
1080
1080
  gap: 8px;
1081
1081
  }
1082
1082
 
1083
+ .notifications-modal-links {
1084
+ display: flex;
1085
+ flex-direction: column;
1086
+ gap: 6px;
1087
+ margin-top: 8px;
1088
+ }
1089
+
1090
+ .notifications-modal-links a {
1091
+ color: var(--accent);
1092
+ text-decoration: none;
1093
+ font-size: 12px;
1094
+ }
1095
+
1083
1096
  .notifications-open-run {
1084
1097
  display: inline-flex;
1085
1098
  align-items: center;
@@ -10971,6 +10984,22 @@ button.filebox-delete:hover {
10971
10984
  min-height: 0;
10972
10985
  }
10973
10986
 
10987
+ .archive-list-section {
10988
+ display: grid;
10989
+ gap: 8px;
10990
+ }
10991
+
10992
+ .archive-list-header {
10993
+ text-transform: uppercase;
10994
+ letter-spacing: 0.08em;
10995
+ font-size: 10px;
10996
+ padding: 0 4px;
10997
+ }
10998
+
10999
+ .archive-list-empty {
11000
+ padding: 4px 6px;
11001
+ }
11002
+
10974
11003
  .archive-snapshot {
10975
11004
  text-align: left;
10976
11005
  border: 1px solid var(--border);
@@ -12520,6 +12549,143 @@ button.filebox-delete:hover {
12520
12549
  overflow: hidden;
12521
12550
  }
12522
12551
 
12552
+ /* PMA Dispatches */
12553
+ .pma-dispatches-section {
12554
+ padding: 10px 12px;
12555
+ display: flex;
12556
+ flex-direction: column;
12557
+ gap: 10px;
12558
+ }
12559
+
12560
+ .pma-dispatches-header {
12561
+ display: flex;
12562
+ align-items: center;
12563
+ gap: 8px;
12564
+ }
12565
+
12566
+ .pma-dispatches-header h2 {
12567
+ margin: 0;
12568
+ font-size: 14px;
12569
+ font-weight: 600;
12570
+ color: var(--text);
12571
+ }
12572
+
12573
+ .pma-dispatches-content {
12574
+ display: grid;
12575
+ grid-template-columns: minmax(200px, 1fr) minmax(280px, 1.4fr);
12576
+ gap: 12px;
12577
+ min-height: 180px;
12578
+ }
12579
+
12580
+ .pma-dispatches-list {
12581
+ display: flex;
12582
+ flex-direction: column;
12583
+ gap: 8px;
12584
+ max-height: 320px;
12585
+ overflow-y: auto;
12586
+ border: 1px solid var(--border);
12587
+ border-radius: var(--radius);
12588
+ background: rgba(8, 10, 16, 0.4);
12589
+ padding: 8px;
12590
+ }
12591
+
12592
+ .pma-dispatch-item {
12593
+ display: flex;
12594
+ flex-direction: column;
12595
+ gap: 4px;
12596
+ padding: 8px;
12597
+ border: 1px solid transparent;
12598
+ border-radius: var(--radius);
12599
+ background: rgba(15, 18, 28, 0.7);
12600
+ cursor: pointer;
12601
+ transition: border-color 0.15s ease, background 0.15s ease;
12602
+ }
12603
+
12604
+ .pma-dispatch-item:hover {
12605
+ border-color: rgba(108, 245, 216, 0.4);
12606
+ }
12607
+
12608
+ .pma-dispatch-item.active {
12609
+ border-color: var(--accent);
12610
+ box-shadow: 0 0 0 1px rgba(108, 245, 216, 0.2);
12611
+ }
12612
+
12613
+ .pma-dispatch-item.resolved {
12614
+ opacity: 0.6;
12615
+ }
12616
+
12617
+ .pma-dispatch-item-title {
12618
+ font-size: 13px;
12619
+ font-weight: 600;
12620
+ color: var(--text);
12621
+ }
12622
+
12623
+ .pma-dispatch-item-meta {
12624
+ display: flex;
12625
+ align-items: center;
12626
+ gap: 6px;
12627
+ font-size: 11px;
12628
+ color: var(--muted);
12629
+ }
12630
+
12631
+ .pma-dispatches-detail {
12632
+ border: 1px solid var(--border);
12633
+ border-radius: var(--radius);
12634
+ background: rgba(8, 10, 16, 0.4);
12635
+ padding: 12px;
12636
+ min-height: 180px;
12637
+ }
12638
+
12639
+ .pma-dispatch-detail-title {
12640
+ margin: 0 0 6px;
12641
+ font-size: 14px;
12642
+ font-weight: 600;
12643
+ color: var(--text);
12644
+ }
12645
+
12646
+ .pma-dispatch-detail-meta {
12647
+ display: flex;
12648
+ align-items: center;
12649
+ gap: 8px;
12650
+ font-size: 11px;
12651
+ color: var(--muted);
12652
+ margin-bottom: 10px;
12653
+ }
12654
+
12655
+ .pma-dispatch-detail-body {
12656
+ font-size: 13px;
12657
+ line-height: 1.5;
12658
+ color: var(--text);
12659
+ margin-bottom: 12px;
12660
+ }
12661
+
12662
+ .pma-dispatch-detail-links {
12663
+ display: flex;
12664
+ flex-direction: column;
12665
+ gap: 6px;
12666
+ margin-bottom: 12px;
12667
+ }
12668
+
12669
+ .pma-dispatch-detail-links a {
12670
+ color: var(--accent);
12671
+ text-decoration: none;
12672
+ font-size: 12px;
12673
+ }
12674
+
12675
+ .pma-dispatch-detail-actions {
12676
+ display: flex;
12677
+ gap: 8px;
12678
+ }
12679
+
12680
+ @media (max-width: 900px) {
12681
+ .pma-dispatches-content {
12682
+ grid-template-columns: 1fr;
12683
+ }
12684
+ .pma-dispatches-list {
12685
+ max-height: 220px;
12686
+ }
12687
+ }
12688
+
12523
12689
  .pma-chat-main {
12524
12690
  flex: 1 1 0;
12525
12691
  display: flex;
@@ -13478,21 +13644,28 @@ button.filebox-delete:hover {
13478
13644
  /* PMA Top Bar */
13479
13645
  .pma-top-bar {
13480
13646
  display: flex;
13481
- flex-direction: column;
13482
- gap: 6px;
13483
- padding: 6px 8px;
13647
+ flex-direction: row;
13648
+ align-items: center;
13649
+ justify-content: space-between;
13650
+ gap: 10px;
13651
+ padding: 6px 10px;
13484
13652
  background: var(--bg-surface);
13485
13653
  border-bottom: 1px solid var(--border);
13486
13654
  flex-shrink: 0;
13487
13655
  }
13488
13656
 
13657
+ .pma-dispatches-section {
13658
+ padding: 10px 12px;
13659
+ border-bottom: 1px solid var(--border);
13660
+ background: var(--bg-surface);
13661
+ }
13662
+
13489
13663
  .pma-paused-runs-bar {
13490
13664
  display: flex;
13491
13665
  flex-direction: row;
13492
13666
  align-items: stretch;
13493
13667
  gap: 8px;
13494
13668
  padding: 6px 8px;
13495
- border-bottom: 1px solid var(--border);
13496
13669
  background: var(--panel);
13497
13670
  max-height: none;
13498
13671
  }
@@ -13557,6 +13730,37 @@ button.filebox-delete:hover {
13557
13730
  background: var(--panel);
13558
13731
  }
13559
13732
 
13733
+ .pma-view-tabs {
13734
+ display: flex;
13735
+ gap: 6px;
13736
+ padding: 8px 10px;
13737
+ border-bottom: 1px solid var(--border);
13738
+ background: var(--panel);
13739
+ }
13740
+
13741
+ .pma-view-tab {
13742
+ padding: 6px 12px;
13743
+ font-size: 11px;
13744
+ font-weight: 600;
13745
+ color: var(--muted);
13746
+ background: transparent;
13747
+ border: 1px solid transparent;
13748
+ border-radius: 999px;
13749
+ cursor: pointer;
13750
+ transition: color 0.15s, background 0.15s, border-color 0.15s;
13751
+ }
13752
+
13753
+ .pma-view-tab:hover {
13754
+ color: var(--text);
13755
+ background: var(--hover-bg);
13756
+ }
13757
+
13758
+ .pma-view-tab.active {
13759
+ color: var(--text);
13760
+ background: var(--primary-bg);
13761
+ border-color: var(--border);
13762
+ }
13763
+
13560
13764
  .pma-inbox-list {
13561
13765
  flex: 1;
13562
13766
  display: flex;
@@ -13567,6 +13771,219 @@ button.filebox-delete:hover {
13567
13771
  max-height: none;
13568
13772
  }
13569
13773
 
13774
+ .pma-dispatches-section .pma-paused-runs-bar {
13775
+ flex-direction: column;
13776
+ align-items: stretch;
13777
+ padding: 10px 12px;
13778
+ border: 1px solid var(--border);
13779
+ border-radius: var(--radius);
13780
+ }
13781
+
13782
+ .pma-dispatches-section .pma-inbox-list {
13783
+ flex-direction: column;
13784
+ align-items: stretch;
13785
+ gap: 10px;
13786
+ overflow-y: auto;
13787
+ overflow-x: hidden;
13788
+ }
13789
+
13790
+ .pma-dispatches-section .pma-inbox-item {
13791
+ max-width: none;
13792
+ width: 100%;
13793
+ padding: 10px 12px;
13794
+ border-radius: var(--radius);
13795
+ display: flex;
13796
+ flex-direction: column;
13797
+ align-items: stretch;
13798
+ gap: 6px;
13799
+ }
13800
+
13801
+ .pma-dispatches-section .pma-inbox-item-header {
13802
+ display: flex;
13803
+ align-items: center;
13804
+ gap: 8px;
13805
+ justify-content: space-between;
13806
+ }
13807
+
13808
+ .pma-dispatches-section .pma-inbox-title {
13809
+ display: block;
13810
+ }
13811
+
13812
+ .pma-dispatches-section .pma-inbox-excerpt {
13813
+ display: block;
13814
+ }
13815
+
13816
+ .pma-dispatches-section .pma-inbox-actions {
13817
+ display: flex;
13818
+ gap: 6px;
13819
+ flex-wrap: wrap;
13820
+ }
13821
+
13822
+ .pma-dispatches-section .pma-inbox-item-header .pill {
13823
+ display: inline-flex;
13824
+ }
13825
+
13826
+ .pma-view-toggle {
13827
+ display: inline-flex;
13828
+ align-items: center;
13829
+ gap: 2px;
13830
+ padding: 2px;
13831
+ border: 1px solid var(--border);
13832
+ border-radius: 999px;
13833
+ background: var(--panel);
13834
+ }
13835
+
13836
+ .pma-view-btn {
13837
+ height: 22px;
13838
+ padding: 0 10px;
13839
+ font-size: 10px;
13840
+ font-weight: 600;
13841
+ text-transform: uppercase;
13842
+ letter-spacing: 0.4px;
13843
+ border: none;
13844
+ border-radius: 999px;
13845
+ background: transparent;
13846
+ color: var(--muted);
13847
+ cursor: pointer;
13848
+ transition: color 0.15s ease, background 0.15s ease;
13849
+ }
13850
+
13851
+ .pma-view-btn:hover {
13852
+ color: var(--text);
13853
+ }
13854
+
13855
+ .pma-view-btn.active,
13856
+ .pma-view-btn[aria-selected="true"] {
13857
+ background: rgba(108, 245, 216, 0.16);
13858
+ color: var(--accent);
13859
+ }
13860
+
13861
+ .hub-shell[data-pma-view="chat"] #pma-docs-section {
13862
+ display: none !important;
13863
+ }
13864
+
13865
+ .hub-shell[data-pma-view="memory"] #pma-chat-section {
13866
+ display: none !important;
13867
+ }
13868
+
13869
+ .notification-bell {
13870
+ position: relative;
13871
+ overflow: visible;
13872
+ }
13873
+
13874
+ .notification-bell-icon {
13875
+ width: 18px;
13876
+ height: 18px;
13877
+ stroke: currentColor;
13878
+ stroke-width: 1.6;
13879
+ fill: none;
13880
+ }
13881
+
13882
+ .notification-bell:hover .notification-bell-icon {
13883
+ stroke: var(--accent);
13884
+ }
13885
+
13886
+ .notification-badge {
13887
+ position: absolute;
13888
+ top: 3px;
13889
+ right: 3px;
13890
+ min-width: 16px;
13891
+ height: 16px;
13892
+ padding: 0 4px;
13893
+ border-radius: 999px;
13894
+ background: var(--accent);
13895
+ color: #031311;
13896
+ font-size: 9px;
13897
+ font-weight: 700;
13898
+ display: inline-flex;
13899
+ align-items: center;
13900
+ justify-content: center;
13901
+ box-shadow: 0 0 0 2px var(--bg);
13902
+ }
13903
+
13904
+ .notification-dialog {
13905
+ max-width: 640px;
13906
+ }
13907
+
13908
+ .notification-modal-header {
13909
+ display: flex;
13910
+ align-items: center;
13911
+ justify-content: space-between;
13912
+ gap: 12px;
13913
+ }
13914
+
13915
+ .notification-modal-actions {
13916
+ display: inline-flex;
13917
+ align-items: center;
13918
+ gap: 6px;
13919
+ }
13920
+
13921
+ .notification-list {
13922
+ display: flex;
13923
+ flex-direction: column;
13924
+ gap: 10px;
13925
+ }
13926
+
13927
+ .notification-item {
13928
+ padding: 12px;
13929
+ border: 1px solid var(--border);
13930
+ border-radius: var(--radius);
13931
+ background: var(--panel);
13932
+ display: flex;
13933
+ flex-direction: column;
13934
+ gap: 6px;
13935
+ }
13936
+
13937
+ .notification-item-header {
13938
+ display: flex;
13939
+ align-items: center;
13940
+ justify-content: space-between;
13941
+ gap: 12px;
13942
+ }
13943
+
13944
+ .notification-repo {
13945
+ font-weight: 600;
13946
+ color: var(--accent);
13947
+ }
13948
+
13949
+ .notification-title {
13950
+ font-weight: 600;
13951
+ font-size: 13px;
13952
+ }
13953
+
13954
+ .notification-excerpt {
13955
+ font-size: 12px;
13956
+ color: var(--muted);
13957
+ }
13958
+
13959
+ .notification-actions {
13960
+ display: flex;
13961
+ gap: 6px;
13962
+ flex-wrap: wrap;
13963
+ }
13964
+
13965
+ .notification-actions .notification-action {
13966
+ border: 1px solid var(--border);
13967
+ border-radius: var(--radius);
13968
+ padding: 4px 8px;
13969
+ font-size: 10px;
13970
+ text-transform: uppercase;
13971
+ letter-spacing: 0.3px;
13972
+ color: var(--muted);
13973
+ background: transparent;
13974
+ cursor: pointer;
13975
+ text-decoration: none;
13976
+ }
13977
+
13978
+ .notification-actions .notification-action:hover {
13979
+ color: var(--text);
13980
+ border-color: rgba(108, 245, 216, 0.4);
13981
+ }
13982
+
13983
+ .pma-clear-btn {
13984
+ margin-left: 2px;
13985
+ }
13986
+
13570
13987
  .pma-inbox-item {
13571
13988
  display: inline-flex;
13572
13989
  flex-direction: row;
@@ -13774,6 +14191,16 @@ button.filebox-delete:hover {
13774
14191
  align-items: center;
13775
14192
  gap: 8px;
13776
14193
  padding: 8px 0;
14194
+ flex-wrap: wrap;
14195
+ }
14196
+
14197
+ .pma-docs-history {
14198
+ font-size: 11px;
14199
+ padding: 6px 10px;
14200
+ border-radius: 6px;
14201
+ border: 1px solid var(--border);
14202
+ background: var(--panel);
14203
+ color: var(--text);
13777
14204
  }
13778
14205
 
13779
14206
  .pma-docs-actions button:disabled {
@@ -49,6 +49,17 @@ const CAR_CONTEXT_HINT = wrapInjectedContext(CONSTANTS.PROMPTS.CAR_CONTEXT_HINT)
49
49
  const VOICE_TRANSCRIPT_DISCLAIMER_TEXT = CONSTANTS.PROMPTS?.VOICE_TRANSCRIPT_DISCLAIMER ||
50
50
  "Note: transcribed from user voice. If confusing or possibly inaccurate and you cannot infer the intention please clarify before proceeding.";
51
51
  const INJECTED_CONTEXT_TAG_RE = /<injected context>/i;
52
+ const CAR_CONTEXT_COMMAND_RE = [
53
+ /^\/\S/,
54
+ /^\.\/\S/,
55
+ /^git(\s|$)/,
56
+ /^cd(\s|$)/,
57
+ /^ls(\s|$)/,
58
+ /^make(\s|$)/,
59
+ /^pnpm(\s|$)/,
60
+ /^npm(\s|$)/,
61
+ /^python3?(\s|$)/,
62
+ ];
52
63
  function wrapInjectedContext(text) {
53
64
  return `<injected context>\n${text}\n</injected context>`;
54
65
  }
@@ -57,6 +68,13 @@ function wrapInjectedContextIfNeeded(text) {
57
68
  return text;
58
69
  return INJECTED_CONTEXT_TAG_RE.test(text) ? text : wrapInjectedContext(text);
59
70
  }
71
+ function looksLikeCommand(text) {
72
+ const trimmed = text.trim();
73
+ if (!trimmed)
74
+ return false;
75
+ const lowered = trimmed.toLowerCase();
76
+ return CAR_CONTEXT_COMMAND_RE.some((pattern) => pattern.test(lowered));
77
+ }
60
78
  const LEGACY_SESSION_STORAGE_KEY = "codex_terminal_session_id";
61
79
  const SESSION_STORAGE_PREFIX = "codex_terminal_session_id:";
62
80
  const SESSION_STORAGE_TS_PREFIX = "codex_terminal_session_ts:";
@@ -620,12 +638,13 @@ export class TerminalManager {
620
638
  return null;
621
639
  if (manager._hasTextInputHookFired(CAR_CONTEXT_HOOK_ID))
622
640
  return null;
623
- const lowered = text.toLowerCase();
624
- const hit = CONSTANTS.KEYWORDS.CAR_CONTEXT.some((kw) => lowered.includes(kw));
625
- if (!hit)
641
+ if (looksLikeCommand(text))
626
642
  return null;
643
+ const lowered = text.toLowerCase();
627
644
  if (lowered.includes("about_car.md"))
628
645
  return null;
646
+ if (lowered.includes(".codex-autorunner"))
647
+ return null;
629
648
  if (text.includes(CONSTANTS.PROMPTS.CAR_CONTEXT_HINT) ||
630
649
  text.includes(CAR_CONTEXT_HINT)) {
631
650
  return null;
@@ -542,7 +542,7 @@ export function confirmModal(message, options = {}) {
542
542
  });
543
543
  }
544
544
  export function inputModal(message, options = {}) {
545
- const { placeholder = "", defaultValue = "", confirmText = "OK", cancelText = "Cancel" } = options;
545
+ const { placeholder = "", defaultValue = "", confirmText = "OK", cancelText = "Cancel", allowEmpty = false, } = options;
546
546
  return new Promise((resolve) => {
547
547
  const overlay = document.getElementById("input-modal");
548
548
  const messageEl = document.getElementById("input-modal-message");
@@ -576,6 +576,10 @@ export function inputModal(message, options = {}) {
576
576
  };
577
577
  const onOk = () => {
578
578
  const value = inputEl.value.trim();
579
+ if (allowEmpty) {
580
+ finalize(value);
581
+ return;
582
+ }
579
583
  finalize(value || null);
580
584
  };
581
585
  const onCancel = () => {