@@ -1838,7 +1838,7 @@ describe("handleDirectiveOnly model persist behavior (fixes #1435)", () => {
18381838 } ) ;
18391839} ) ;
18401840
1841- describe ( "persistInlineDirectives internal exec scope gate " , ( ) => {
1841+ describe ( "persistInlineDirectives session directive persistence policy " , ( ) => {
18421842 it ( "skips exec persistence for internal operator.write callers" , async ( ) => {
18431843 const sessionEntry = await persistInternalOperatorWriteDirective (
18441844 "/exec host=node security=allowlist ask=always node=worker-1" ,
@@ -1856,7 +1856,7 @@ describe("persistInlineDirectives internal exec scope gate", () => {
18561856 expect ( sessionEntry . verboseLevel ) . toBeUndefined ( ) ;
18571857 } ) ;
18581858
1859- it ( "skips exec persistence for non-webchat gateway callers without operator.admin " , async ( ) => {
1859+ it ( "skips exec persistence for unauthorized external callers even when gateway scopes are empty " , async ( ) => {
18601860 const sessionEntry = await persistInternalOperatorWriteDirective (
18611861 "/exec host=node security=allowlist ask=always node=worker-1" ,
18621862 {
@@ -1872,7 +1872,7 @@ describe("persistInlineDirectives internal exec scope gate", () => {
18721872 expect ( sessionEntry . execNode ) . toBeUndefined ( ) ;
18731873 } ) ;
18741874
1875- it ( "skips verbose persistence for non-webchat gateway callers without operator.admin " , async ( ) => {
1875+ it ( "skips verbose persistence for unauthorized external callers even when gateway scopes are empty " , async ( ) => {
18761876 const sessionEntry = await persistInternalOperatorWriteDirective ( "/verbose full" , {
18771877 messageProvider : "telegram" ,
18781878 surface : "telegram" ,
@@ -1882,13 +1882,14 @@ describe("persistInlineDirectives internal exec scope gate", () => {
18821882 expect ( sessionEntry . verboseLevel ) . toBeUndefined ( ) ;
18831883 } ) ;
18841884
1885- it ( "allows non-webchat gateway callers with operator.admin to persist exec defaults" , async ( ) => {
1885+ it ( "allows authorized external callers with empty gateway scopes to persist exec defaults" , async ( ) => {
18861886 const sessionEntry = await persistInternalOperatorWriteDirective (
18871887 "/exec host=node security=allowlist ask=always node=worker-1" ,
18881888 {
18891889 messageProvider : "telegram" ,
18901890 surface : "telegram" ,
1891- gatewayClientScopes : [ "operator.admin" ] ,
1891+ gatewayClientScopes : [ ] ,
1892+ commandAuthorized : true ,
18921893 } ,
18931894 ) ;
18941895
@@ -1898,6 +1899,17 @@ describe("persistInlineDirectives internal exec scope gate", () => {
18981899 expect ( sessionEntry . execNode ) . toBe ( "worker-1" ) ;
18991900 } ) ;
19001901
1902+ it ( "allows authorized external callers with empty gateway scopes to persist verbose defaults" , async ( ) => {
1903+ const sessionEntry = await persistInternalOperatorWriteDirective ( "/verbose full" , {
1904+ messageProvider : "telegram" ,
1905+ surface : "telegram" ,
1906+ gatewayClientScopes : [ ] ,
1907+ commandAuthorized : true ,
1908+ } ) ;
1909+
1910+ expect ( sessionEntry . verboseLevel ) . toBe ( "full" ) ;
1911+ } ) ;
1912+
19011913 it ( "skips exec persistence for non-webchat channel callers without gateway scopes" , async ( ) => {
19021914 const sessionEntry = await persistInternalOperatorWriteDirective (
19031915 "/exec host=node security=allowlist ask=always node=worker-1" ,
0 commit comments