dsh-ntr 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +4 -2
- package/README.md +4 -2
- package/cordis.patch.yml +56 -28
- package/lib/bridge.js +378 -330
- package/lib/client/acp-ui.js +60 -32
- package/lib/client/index.js +17 -0
- package/lib/client/panel.js +257 -103
- package/lib/client/permission-dock.js +72 -0
- package/lib/client/session-controls.js +4 -4
- package/lib/client/store.js +88 -22
- package/lib/client.js +584 -226
- package/lib/client.js.map +1 -1
- package/lib/impl.js +128 -45
- package/lib/index.js +20 -52
- package/lib/types/bridge.d.ts +164 -214
- package/lib/types/client/panel.d.ts +59 -20
- package/lib/types/client/permission-dock.d.ts +31 -0
- package/lib/types/client/store.d.ts +52 -15
- package/lib/types/impl.d.ts +93 -27
- package/lib/types/protocol.d.ts +137 -52
- package/package.json +1 -1
- package/src/bridge.ts +433 -417
- package/src/client/acp-ui.tsx +60 -32
- package/src/client/index.tsx +18 -0
- package/src/client/panel.tsx +395 -197
- package/src/client/permission-dock.tsx +133 -0
- package/src/client/session-controls.tsx +4 -4
- package/src/client/store.ts +112 -36
- package/src/impl.ts +166 -82
- package/src/index.ts +20 -65
- package/src/protocol.ts +143 -52
package/src/client/acp-ui.tsx
CHANGED
|
@@ -857,9 +857,9 @@ const STYLE = `
|
|
|
857
857
|
.ntr-acp-seat:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-active, #0000000d); }
|
|
858
858
|
.ntr-acp-seat:disabled { opacity: 0.5; cursor: default; }
|
|
859
859
|
.ntr-acp-seat.is-open { border-color: var(--dsw-alias-state-business-primary, #2563eb); color: var(--dsw-alias-state-business-primary, #2563eb); }
|
|
860
|
-
.ntr-acp-seat.is-detached { border-color: var(--
|
|
860
|
+
.ntr-acp-seat.is-detached { border-color: var(--dsw-alias-state-warn-label, #d97706); color: var(--dsw-alias-state-warn-label, #d97706); }
|
|
861
861
|
.ntr-acp-seat-main { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
862
|
-
.ntr-acp-seat-sub { color: var(--dsw-alias-
|
|
862
|
+
.ntr-acp-seat-sub { color: var(--dsw-alias-label-secondary, #6b7280); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
863
863
|
.ntr-acp-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
|
|
864
864
|
.ntr-acp-tick { margin-left: auto; color: var(--dsw-alias-state-business-primary, #2563eb); }
|
|
865
865
|
.ntr-acp-check { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 13px; height: 13px; border: 1px solid var(--dsw-alias-border-l2, #d1d5db); border-radius: 3px; font-size: 10px; line-height: 1; color: var(--dsw-alias-state-business-primary, #2563eb); }
|
|
@@ -868,80 +868,108 @@ const STYLE = `
|
|
|
868
868
|
.ntr-acp-menu-head { padding: 8px 10px 6px; font-weight: 600; display: flex; align-items: center; gap: 6px; }
|
|
869
869
|
.ntr-acp-menu-title { flex: 1; }
|
|
870
870
|
.ntr-acp-menu-spin { opacity: 0.5; }
|
|
871
|
-
.ntr-acp-menu-note { padding: 0 10px 6px; font-size: 11px; color: var(--dsw-alias-
|
|
872
|
-
.ntr-acp-menu-error { margin: 0 10px 6px; padding: 6px 8px; border-radius: 6px; background: #
|
|
871
|
+
.ntr-acp-menu-note { padding: 0 10px 6px; font-size: 11px; color: var(--dsw-alias-label-secondary, #6b7280); line-height: 1.5; }
|
|
872
|
+
.ntr-acp-menu-error { margin: 0 10px 6px; padding: 6px 8px; border-radius: 6px; background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #b91c1c) 12%, transparent); color: var(--dsw-alias-state-error-primary, #b91c1c); font-size: 11px; }
|
|
873
873
|
.ntr-acp-menu-body { overflow: auto; padding: 0 4px 6px; }
|
|
874
874
|
.ntr-acp-menu-section { display: flex; flex-direction: column; padding-top: 4px; }
|
|
875
|
-
.ntr-acp-menu-section-title { padding: 6px 8px 4px; font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--dsw-alias-
|
|
875
|
+
.ntr-acp-menu-section-title { padding: 6px 8px 4px; font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
876
876
|
.ntr-acp-menu-item { display: flex; align-items: center; gap: 6px; font: inherit; font-size: 12px; text-align: left; padding: 6px 8px; border: none; border-radius: 6px; background: none; color: inherit; cursor: pointer; width: 100%; }
|
|
877
877
|
.ntr-acp-menu-item:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-active, #0000000d); }
|
|
878
878
|
.ntr-acp-menu-item:disabled { opacity: 0.45; cursor: default; }
|
|
879
879
|
.ntr-acp-menu-item.is-active { font-weight: 600; }
|
|
880
880
|
.ntr-acp-menu-item-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
881
|
-
.ntr-acp-menu-item-detail { color: var(--dsw-alias-
|
|
882
|
-
.ntr-acp-menu-empty { padding: 10px; text-align: center; color: var(--dsw-alias-
|
|
881
|
+
.ntr-acp-menu-item-detail { color: var(--dsw-alias-label-secondary, #6b7280); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; text-align: right; }
|
|
882
|
+
.ntr-acp-menu-empty { padding: 10px; text-align: center; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
883
883
|
/* ---- ACP view tab ---- */
|
|
884
884
|
.ntr-acp-view { display: flex; flex-direction: column; height: 100%; min-height: 0; font-size: 13px; line-height: 1.6; }
|
|
885
|
-
.ntr-acp-view-head { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb); font-size: 12px; color: var(--dsw-alias-
|
|
885
|
+
.ntr-acp-view-head { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--dsw-alias-border-l2, #e5e7eb); font-size: 12px; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
886
886
|
.ntr-acp-view-agent { font-weight: 600; color: inherit; }
|
|
887
887
|
.ntr-acp-view-meta { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 40%; direction: rtl; text-align: left; }
|
|
888
888
|
.ntr-acp-view-head .ntr-acp-more { margin-left: auto; }
|
|
889
889
|
.ntr-acp-stream { flex: 1; min-height: 0; overflow: auto; padding: 12px 14px 24px; display: flex; flex-direction: column; gap: 10px; }
|
|
890
890
|
.ntr-acp-badge { font-size: 11px; padding: 1px 8px; border-radius: 999px; border: 1px solid transparent; }
|
|
891
|
-
.ntr-acp-badge.is-done { color: #
|
|
892
|
-
.ntr-acp-badge.is-busy { color: #1d4ed8; background: #dbeafe; }
|
|
893
|
-
.ntr-acp-badge.is-warn { color: #b45309; background: #fef3c7; }
|
|
894
|
-
.ntr-acp-badge.is-fail { color: #b91c1c; background: #
|
|
895
|
-
.ntr-acp-badge.is-idle { color: var(--dsw-alias-
|
|
891
|
+
.ntr-acp-badge.is-done { color: color-mix(in srgb, var(--dsw-alias-state-success-primary, #22c55e) 72%, var(--dsw-alias-label-primary, #111827)); background: var(--dsw-alias-state-success-tertiary, #dcfce7); }
|
|
892
|
+
.ntr-acp-badge.is-busy { color: var(--dsw-alias-state-business-primary, #1d4ed8); background: var(--dsw-alias-state-business-tertiary, #dbeafe); }
|
|
893
|
+
.ntr-acp-badge.is-warn { color: var(--dsw-alias-state-warn-label, #b45309); background: var(--dsw-alias-state-warn-tertiary, #fef3c7); }
|
|
894
|
+
.ntr-acp-badge.is-fail { color: var(--dsw-alias-state-error-primary, #b91c1c); background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #b91c1c) 12%, transparent); }
|
|
895
|
+
.ntr-acp-badge.is-idle { color: var(--dsw-alias-label-secondary, #6b7280); background: var(--dsw-alias-bg-layer-2, #f3f4f6); }
|
|
896
896
|
.ntr-acp-bubble { max-width: 88%; padding: 8px 12px; border-radius: 12px; white-space: pre-wrap; word-break: break-word; }
|
|
897
897
|
.ntr-acp-bubble.is-user { align-self: flex-end; background: color-mix(in srgb, var(--dsw-alias-state-business-primary, #2563eb) 12%, transparent); }
|
|
898
898
|
.ntr-acp-bubble.is-agent { align-self: flex-start; background: var(--dsw-alias-bg-layer-2, #f3f4f6); }
|
|
899
899
|
.ntr-acp-inline-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; padding: 1px 4px; border-radius: 4px; background: color-mix(in srgb, currentColor 10%, transparent); }
|
|
900
900
|
.ntr-acp-code { margin: 6px 0; padding: 8px 10px; border-radius: 8px; background: #0f172a; color: #e2e8f0; overflow: auto; font-size: 12px; line-height: 1.5; }
|
|
901
|
-
.ntr-acp-thought { border-left: 3px solid var(--dsw-alias-border-l2, #d1d5db); padding-left: 8px; color: var(--dsw-alias-
|
|
901
|
+
.ntr-acp-thought { border-left: 3px solid var(--dsw-alias-border-l2, #d1d5db); padding-left: 8px; color: var(--dsw-alias-label-secondary, #6b7280); font-size: 12px; }
|
|
902
902
|
.ntr-acp-thought > summary { cursor: pointer; font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
903
903
|
.ntr-acp-thought-body { white-space: pre-wrap; padding: 4px 0 2px; }
|
|
904
904
|
.ntr-acp-tool { border: 1px solid var(--dsw-alias-border-l2, #e5e7eb); border-radius: 10px; background: var(--dsw-alias-bg-layer-1, #fff); overflow: hidden; }
|
|
905
|
-
.ntr-acp-tool.is-fail { border-color: #fca5a5; }
|
|
905
|
+
.ntr-acp-tool.is-fail { border-color: var(--dsw-alias-state-error-secondary, #fca5a5); }
|
|
906
906
|
.ntr-acp-tool-head { display: flex; align-items: center; gap: 8px; padding: 7px 10px; font-size: 12px; }
|
|
907
907
|
.ntr-acp-tool-title { flex: 1; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
908
908
|
.ntr-acp-tool-body { margin: 0; padding: 8px 10px; border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb); background: var(--dsw-alias-bg-layer-2, #f9fafb); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11.5px; line-height: 1.55; white-space: pre-wrap; word-break: break-word; max-height: 340px; overflow: auto; }
|
|
909
|
-
.ntr-acp-tool-input { background: var(--dsw-alias-bg-layer-1, #fff); color: var(--dsw-alias-
|
|
910
|
-
.ntr-acp-tool-meta { font-size: 11px; color: var(--dsw-alias-
|
|
909
|
+
.ntr-acp-tool-input { background: var(--dsw-alias-bg-layer-1, #fff); color: var(--dsw-alias-label-primary, #111827); max-height: 240px; }
|
|
910
|
+
.ntr-acp-tool-meta { font-size: 11px; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
911
911
|
.ntr-acp-diff { border-top: 1px solid var(--dsw-alias-border-l2, #e5e7eb); }
|
|
912
912
|
.ntr-acp-diff-head { display: flex; align-items: center; gap: 8px; padding: 5px 10px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11.5px; background: var(--dsw-alias-bg-layer-2, #f9fafb); }
|
|
913
913
|
.ntr-acp-diff-path { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
914
|
-
.ntr-acp-diff-stats .is-add { color: #15803d; }
|
|
915
|
-
.ntr-acp-diff-stats .is-del { color: #b91c1c; }
|
|
914
|
+
.ntr-acp-diff-stats .is-add { color: var(--dsw-alias-state-success-primary, #15803d); }
|
|
915
|
+
.ntr-acp-diff-stats .is-del { color: var(--dsw-alias-state-error-primary, #b91c1c); }
|
|
916
916
|
.ntr-acp-diff-body { max-height: 360px; overflow: auto; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11.5px; line-height: 1.55; }
|
|
917
917
|
.ntr-acp-diff-row { display: flex; gap: 8px; padding: 0 10px; white-space: pre; }
|
|
918
|
-
.ntr-acp-diff-row.is-add { background: #dcfce7; }
|
|
919
|
-
.ntr-acp-diff-row.is-del { background: #fee2e2; }
|
|
920
|
-
.ntr-acp-diff-row.is-ctx { color: var(--dsw-alias-
|
|
918
|
+
.ntr-acp-diff-row.is-add { background: var(--dsw-alias-file-diff-added-bg, #dcfce7); }
|
|
919
|
+
.ntr-acp-diff-row.is-del { background: var(--dsw-alias-file-diff-deleted-bg, #fee2e2); }
|
|
920
|
+
.ntr-acp-diff-row.is-ctx { color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
921
921
|
.ntr-acp-diff-sign { width: 1ch; flex: none; opacity: 0.7; }
|
|
922
922
|
.ntr-acp-diff-text { overflow-x: auto; }
|
|
923
|
-
.ntr-acp-diff-note { padding: 4px 10px 6px; font-size: 11px; color: var(--dsw-alias-
|
|
923
|
+
.ntr-acp-diff-note { padding: 4px 10px 6px; font-size: 11px; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
924
924
|
.ntr-acp-more { font: inherit; font-size: 11.5px; padding: 3px 10px; border-radius: 6px; border: 1px solid var(--dsw-alias-border-l2, #d1d5db); background: var(--dsw-alias-bg-layer-2, #f3f4f6); color: inherit; cursor: pointer; }
|
|
925
925
|
.ntr-acp-more:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-active, #0000000d); }
|
|
926
926
|
.ntr-acp-more:disabled { opacity: 0.5; cursor: default; }
|
|
927
|
-
.ntr-acp-more.is-primary { border-color: transparent; background: var(--dsw-alias-button-primary-fill, #2563eb); color: var(--dsw-alias-
|
|
927
|
+
.ntr-acp-more.is-primary { border-color: transparent; background: var(--dsw-alias-button-primary-fill, #2563eb); color: var(--dsw-alias-label-primary-foreground, #fff); }
|
|
928
928
|
.ntr-acp-tool > .ntr-acp-more, .ntr-acp-empty-actions .ntr-acp-more { margin: 6px 10px; }
|
|
929
929
|
.ntr-acp-plan { border: 1px solid var(--dsw-alias-border-l2, #e5e7eb); border-radius: 10px; padding: 8px 10px; background: var(--dsw-alias-bg-layer-1, #fff); }
|
|
930
|
-
.ntr-acp-plan-head { font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--dsw-alias-
|
|
930
|
+
.ntr-acp-plan-head { font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--dsw-alias-label-secondary, #6b7280); margin-bottom: 4px; }
|
|
931
931
|
.ntr-acp-plan-row { display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; padding: 1px 0; }
|
|
932
|
-
.ntr-acp-plan-row.is-completed { color: var(--dsw-alias-
|
|
932
|
+
.ntr-acp-plan-row.is-completed { color: var(--dsw-alias-label-secondary, #6b7280); text-decoration: line-through; }
|
|
933
933
|
.ntr-acp-plan-row.is-in_progress { font-weight: 600; }
|
|
934
934
|
.ntr-acp-plan-glyph { width: 1ch; flex: none; }
|
|
935
|
-
.ntr-acp-plan-prio { margin-left: auto; font-size: 10px; text-transform: uppercase; color: var(--dsw-alias-
|
|
935
|
+
.ntr-acp-plan-prio { margin-left: auto; font-size: 10px; text-transform: uppercase; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
936
936
|
.ntr-acp-notice { padding: 6px 10px; border-radius: 8px; font-size: 12px; }
|
|
937
|
-
.ntr-acp-notice.is-error { background: #
|
|
938
|
-
.ntr-acp-notice.is-info { background: var(--dsw-alias-bg-layer-2, #f3f4f6); color: var(--dsw-alias-
|
|
937
|
+
.ntr-acp-notice.is-error { background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #b91c1c) 12%, transparent); color: var(--dsw-alias-state-error-primary, #b91c1c); }
|
|
938
|
+
.ntr-acp-notice.is-info { background: var(--dsw-alias-bg-layer-2, #f3f4f6); color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
939
939
|
.ntr-acp-empty { margin: auto; max-width: 460px; text-align: center; display: flex; flex-direction: column; gap: 10px; padding: 24px; }
|
|
940
940
|
.ntr-acp-empty-title { font-size: 14px; font-weight: 600; }
|
|
941
|
-
.ntr-acp-empty-body { margin: 0; color: var(--dsw-alias-
|
|
942
|
-
.ntr-acp-empty-hint { color: var(--dsw-alias-
|
|
943
|
-
.ntr-acp-seat-diag { font-family: var(--
|
|
941
|
+
.ntr-acp-empty-body { margin: 0; color: var(--dsw-alias-label-secondary, #6b7280); font-size: 12.5px; line-height: 1.7; }
|
|
942
|
+
.ntr-acp-empty-hint { color: var(--dsw-alias-label-secondary, #6b7280); font-size: 12px; }
|
|
943
|
+
.ntr-acp-seat-diag { font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace); opacity: 0.72; word-break: break-word; }
|
|
944
944
|
.ntr-acp-empty-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
|
|
945
|
+
/* ---- Pending permission asks (conversation.input.dock) ---- */
|
|
946
|
+
/* The dock slot is the full conversation column, but the composer card inside
|
|
947
|
+
it is narrower (InputBar: side clearance + card max width). Mirror that
|
|
948
|
+
formula so each ask lines up with the input box instead of spanning the
|
|
949
|
+
column. The list owns a bounded height and scrolls so a burst of asks cannot
|
|
950
|
+
push the composer off screen. */
|
|
951
|
+
.ntr-permission-dock {
|
|
952
|
+
box-sizing: border-box;
|
|
953
|
+
width: calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px));
|
|
954
|
+
max-width: var(--dsh-composer-card-max-width, 920px);
|
|
955
|
+
margin: 0 auto;
|
|
956
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
957
|
+
max-height: min(38vh, 320px); overflow-y: auto;
|
|
958
|
+
font-size: 12px; line-height: 1.5;
|
|
959
|
+
}
|
|
960
|
+
.ntr-permission-card { display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; border: 1px solid var(--dsw-alias-border-l2, #d1d5db); border-left: 3px solid var(--dsw-alias-state-warn-primary, #d97706); border-radius: 10px; background: var(--dsw-alias-bg-layer-1, #fff); }
|
|
961
|
+
.ntr-permission-head { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
|
|
962
|
+
.ntr-permission-tool { flex: none; font-weight: 600; }
|
|
963
|
+
.ntr-permission-reason { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
964
|
+
.ntr-permission-deadline { flex: none; font-size: 11px; color: var(--dsw-alias-label-secondary, #6b7280); font-variant-numeric: tabular-nums; }
|
|
965
|
+
.ntr-permission-deadline.is-expired { color: var(--dsw-alias-state-warn-label, #b45309); font-weight: 600; }
|
|
966
|
+
.ntr-permission-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
967
|
+
.ntr-permission-option, .ntr-permission-cancel { font: inherit; font-size: 12px; line-height: 1.4; padding: 4px 10px; border-radius: 7px; border: 1px solid var(--dsw-alias-border-l2, #d1d5db); background: var(--dsw-alias-bg-layer-2, #f3f4f6); color: inherit; cursor: pointer; white-space: normal; text-align: left; }
|
|
968
|
+
.ntr-permission-option:hover:not(:disabled), .ntr-permission-cancel:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-active, #0000000d); }
|
|
969
|
+
.ntr-permission-option:disabled, .ntr-permission-cancel:disabled { opacity: 0.5; cursor: default; }
|
|
970
|
+
.ntr-permission-option:focus-visible, .ntr-permission-cancel:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary, #2563eb); outline-offset: 2px; }
|
|
971
|
+
.ntr-permission-cancel { margin-left: auto; color: var(--dsw-alias-label-secondary, #6b7280); }
|
|
972
|
+
.ntr-permission-error { padding: 4px 8px; border-radius: 6px; background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #b91c1c) 12%, transparent); color: var(--dsw-alias-state-error-primary, #b91c1c); font-size: 11px; word-break: break-word; }
|
|
945
973
|
/* ---- NTR settings dialog (shell.overlay) ---- */
|
|
946
974
|
/* Frame-wide surface opened from the agent base's empty-roster menu. The
|
|
947
975
|
overlay layer itself is click-through, so the layer opts back in and blocks
|
package/src/client/index.tsx
CHANGED
|
@@ -19,6 +19,7 @@ import { AcpComposerMode } from './composer-mode.tsx'
|
|
|
19
19
|
import { AcpComposerAgentTag, AcpSessionControls, AcpSessionMenu } from './session-controls.tsx'
|
|
20
20
|
import { AcpConversationView } from './acp-view.tsx'
|
|
21
21
|
import { AcpSettingsDialog } from './settings-dialog.tsx'
|
|
22
|
+
import { PermissionDock } from './permission-dock.tsx'
|
|
22
23
|
import {
|
|
23
24
|
createModelSeatClaim,
|
|
24
25
|
createPermissionSeatClaim,
|
|
@@ -230,6 +231,23 @@ export function apply(ctx: Context): void {
|
|
|
230
231
|
inject: (sessionId: unknown) => chatFace(sessionId),
|
|
231
232
|
}, AcpComposerAgentTag as unknown as SlotComponent<any>)), 'dsh-ntr: composer agent tag')
|
|
232
233
|
|
|
234
|
+
// Pending permission asks for the staged conversation, above the composer
|
|
235
|
+
// card (`conversation.input.dock` — a session-scoped list slot; the host's
|
|
236
|
+
// own queue/todo docks register the same way). The slot spans the whole
|
|
237
|
+
// conversation column, so the dock component applies the composer's own
|
|
238
|
+
// width formula to line up with the input box. Every ask is dispatched as
|
|
239
|
+
// broadcast as `permission/request`; the dock renders only the ones carrying
|
|
240
|
+
// this conversation's id, so it needs no ACP-mode gate. Asks without a chat
|
|
241
|
+
// identity stay on the settings-panel ledger.
|
|
242
|
+
ctx.effect(() => ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({
|
|
243
|
+
name: 'conversation.input.dock',
|
|
244
|
+
id: 'acp-permissions',
|
|
245
|
+
order: 10,
|
|
246
|
+
// The positional inject argument is the session binding key — the chat
|
|
247
|
+
// session id this dock belongs to (same contract as every other entry).
|
|
248
|
+
inject: (sessionId: unknown) => chatFace(sessionId),
|
|
249
|
+
}, PermissionDock as unknown as SlotComponent<any>)), 'dsh-ntr: conversation permission dock')
|
|
250
|
+
|
|
233
251
|
/**
|
|
234
252
|
* The client runtime's session list store, read structurally. Used to find
|
|
235
253
|
* the session the composer is staged on and whether it runs the ACP preset —
|