@integrity-labs/agt-cli 0.28.678 → 0.28.680

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.
@@ -38499,6 +38499,15 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38499
38499
  // long note on the window-capture click handler for why this is a mode and
38500
38500
  // not just always-on.
38501
38501
  var editMode = false;
38502
+ // ENG-9383: the ONE gate every edit-entry path asks. It exists because the
38503
+ // last time a path was added, the old ones did not come with it: ENG-8477
38504
+ // introduced editMode for the deep-probe handlers and left the ENG-6821
38505
+ // direct click/hover on an arming-only check, so text stayed editable with
38506
+ // the toggle off and the button gated one of two paths. A funnel is the fix
38507
+ // for that class of bug; adding the term twice is only the fix for this
38508
+ // instance of it. A fifth handler cannot forget the mode.
38509
+ function canEdit(){ return editEnabled && editMode && !editing; }
38510
+ var hoverCued = []; // ENG-9383: elements currently wearing the mouseover cue
38502
38511
 
38503
38512
  // Element-child indices from <body> down to el. Counts ELEMENT children only
38504
38513
  // (children, not childNodes), matching how the server walks source_html; our
@@ -38692,14 +38701,48 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38692
38701
  // Hover affordance (only when armed and not mid-edit). Highlight leaves AND
38693
38702
  // inline-only containers (their bare text is per-node editable, ENG-6856).
38694
38703
  document.addEventListener('mouseover', function(e){
38695
- if(!editEnabled||editing) return; var el=e.target;
38696
- if(editable(el)||inlineOnlyEditable(el)){ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; }
38704
+ if(!canEdit()) return; var el=e.target;
38705
+ if(editable(el)||inlineOnlyEditable(el)){
38706
+ // ENG-9383: remember what the author's cursor was before we overwrite it.
38707
+ // Blanking it on the way out would delete an inline cursor the artefact
38708
+ // set itself; '' is a legitimate saved value meaning "there was none".
38709
+ if(el.__alCur===undefined) el.__alCur = el.style.cursor || '';
38710
+ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; hoverCued.push(el);
38711
+ }
38697
38712
  });
38698
38713
  document.addEventListener('mouseout', function(e){
38699
- var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; el.__alHover=0; }
38714
+ var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; restoreCursor(el); el.__alHover=0; dropHoverCue(el); }
38700
38715
  });
38716
+ // ENG-9383 (CodeRabbit on #4956): the cue is an outline AND an I-beam cursor.
38717
+ // Clearing only the outline leaves the text still saying "you can type here"
38718
+ // on a page that will now refuse the click - the same misdirection this ticket
38719
+ // is about, one property over.
38720
+ function restoreCursor(el){
38721
+ if(el.__alCur!==undefined){ try{ el.style.cursor=el.__alCur; }catch(e){} el.__alCur=undefined; }
38722
+ }
38723
+ // Keep hoverCued bounded. Without this it grows once per hovered element for
38724
+ // the life of the page and pins every one of them against GC - a list that
38725
+ // only ever empties when the viewer toggles the mode off is a leak on any page
38726
+ // nobody toggles.
38727
+ function dropHoverCue(el){
38728
+ var i=hoverCued.indexOf(el); if(i!==-1) hoverCued.splice(i,1);
38729
+ }
38730
+ // ENG-9383: drop every outline the mouseover cue left behind, without waiting
38731
+ // for a mouseout that may never come - the mode can go off while the pointer is
38732
+ // parked on the text, and then the artefact wears a dashed "editable" outline
38733
+ // on a page where you no longer can. Tracked in a list rather than queried back
38734
+ // out of the DOM: more than one element can carry the cue if the pointer moved
38735
+ // between mouseover and mouseout, and the bridge should not depend on a
38736
+ // selector matching an inline style it wrote.
38737
+ function clearHoverCues(){
38738
+ for(var i=0;i<hoverCued.length;i++){
38739
+ var el=hoverCued[i];
38740
+ if(el && el.__alHover && el!==editing){ try{ el.style.outline=''; }catch(e){} restoreCursor(el); el.__alHover=0; }
38741
+ }
38742
+ hoverCued.length=0;
38743
+ }
38701
38744
  document.addEventListener('click', function(e){
38702
- if(!editEnabled||editing) return;
38745
+ if(!canEdit()) return;
38703
38746
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // a selection => comment flow
38704
38747
  var el=e.target;
38705
38748
  if(editable(el)){ e.preventDefault(); e.stopPropagation(); startEdit(el); return; }
@@ -38743,7 +38786,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38743
38786
  // Deliberately general: nothing here knows about .clickzone or any class name.
38744
38787
  // It fixes any artefact that covers its own content.
38745
38788
  window.addEventListener('click', function(e){
38746
- if(!editEnabled || !editMode || editing) return;
38789
+ if(!canEdit()) return;
38747
38790
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // selection => comment flow
38748
38791
  var t=e.target;
38749
38792
  // Our own toolbar (Save/Cancel) must keep its clicks.
@@ -38801,7 +38844,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38801
38844
  hoverEl=null;
38802
38845
  }
38803
38846
  document.addEventListener('mousemove', function(e){
38804
- if(!editEnabled || !editMode || editing){ clearDeepHover(); return; }
38847
+ if(!canEdit()){ clearDeepHover(); return; }
38805
38848
  var t=e.target;
38806
38849
  if(editable(t)||inlineOnlyEditable(t)){ clearDeepHover(); return; }
38807
38850
  var now=Date.now(); if(now-hoverProbeAt<80) return; hoverProbeAt=now;
@@ -38901,12 +38944,17 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38901
38944
  var d=e.data; if(!d || d['${MARKUP_CONTROL_MARKER}']!==true) return;
38902
38945
  if(d.type==='enable-edit'){ editEnabled=true; }
38903
38946
  else if(d.type==='enable-comment'){ commentEnabled=true; }
38904
- // ENG-8477: the viewer toggled Edit text in the shell. Turning it OFF must
38947
+ // ENG-8477: the viewer toggled Edit mode in the shell. Turning it OFF must
38905
38948
  // also close anything open and drop the hover cue, or the artefact is left
38906
38949
  // wearing our outlines with no way to clear them.
38950
+ // ENG-9383: clearDeepHover() only knows the deep-probe path's outline. The
38951
+ // ENG-6821 mouseover path marks its own element with __alHover and relies on
38952
+ // mouseout to undo it - which never fires if the pointer is still sitting on
38953
+ // the text when the mode goes off, leaving a dashed "you can edit this"
38954
+ // outline on a page where you now cannot. Clear both.
38907
38955
  else if(d.type==='set-edit-mode'){
38908
38956
  editMode = !!d.on;
38909
- if(!editMode){ if(editing) endEdit(false); clearDeepHover(); }
38957
+ if(!editMode){ if(editing) endEdit(false); clearDeepHover(); clearHoverCues(); }
38910
38958
  }
38911
38959
  else if(d.type==='edit-result'){
38912
38960
  if(d.ok){ /* republish hot-swaps the iframe; nothing to do */ }
@@ -41647,14 +41695,15 @@ var FLAG_REGISTRY = [
41647
41695
  // hand-written process.env gate) — same posture as memory-extraction /
41648
41696
  // tool-call-audit above. Gives a per-host canary before the DB flag exists.
41649
41697
  envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
41650
- // Deliberately-unreachable placeholder until this ships: no published CLI
41651
- // carries the manager reader + core writer yet, so reach must report "no
41652
- // host honors" rather than the `honors`-for-everyone that omitting `since`
41653
- // produces. MOVE THIS PIN to the actual auto-published agt-cli version at
41654
- // merge (auto-publish patch-bumps from main; verify against the tarball, the
41655
- // ENG-8575/ENG-9350 lesson) the marker is `setSecretFileTmpfsBacking` in
41656
- // package/dist/lib/manager-worker.js.
41657
- since: "99.0.0"
41698
+ // The real published build that carries the manager reader + core writer,
41699
+ // replacing the deliberately-unreachable `99.0.0` this flag shipped with.
41700
+ // Verified against the tarball (`npm pack @integrity-labs/agt-cli@0.28.678`):
41701
+ // `setSecretFileTmpfsBacking` is present in package/dist/lib/manager-worker.js
41702
+ // and the `secret-files-tmpfs` key ships in the bundle. Auto-publish patch-
41703
+ // bumps from main, so if a CLI-touching PR landed between the ENG-9348 merge
41704
+ // and this one the real cut is higher than 0.28.678 and reach under-reports;
41705
+ // re-verify before flipping the flag on for a canary (ENG-8575/ENG-9350).
41706
+ since: "0.28.678"
41658
41707
  },
41659
41708
  {
41660
41709
  key: "memory-file-tombstones",
@@ -42438,6 +42487,17 @@ var FLAG_REGISTRY = [
42438
42487
  // control that does nothing, which is the ENG-8303 class exactly.
42439
42488
  // enforce arms automated downtime on a customer's production host.
42440
42489
  sensitive: true
42490
+ },
42491
+ {
42492
+ key: "live-meeting-advisor",
42493
+ description: "Live meeting advising in Ninja Notes (ENG-9381). When ON for an org, a person recording a meeting on the Mac may arm an agent to watch it in flight: audio chunks stream to POST /notes/live/:id/chunks, a server-side Haiku vet decides moment by moment whether to escalate, and escalations reach the agent in a server-minted chat thread. Gates the CAPABILITY, not a surface: the refusal is in startLiveAdvisorSession, so a client that ignores the flag still cannot open a session, and GET /notes/destinations reports the same answer as advisor_enabled so the app can skip the arming modal entirely. Boolean gate; ships dark. OFF NEVER COSTS THE RECORDING. An unentitled org \u2014 or a flag read that fails \u2014 costs the advisor only; the microphone still starts and the note is still transcribed and delivered. That direction is deliberate: the user pressed Record and a recording is what they are owed, while arming on a failed read would spend money per minute on a session nobody confirmed. Deliberately NO envVar. This is an org-scoped gate, and an envVar is highest-precedence per ADR-0022 \u2014 a literal in sst.config.ts would pin every stage and make the admin control do nothing, the ENG-8303 class exactly.",
42494
+ flagType: "boolean",
42495
+ defaultValue: false,
42496
+ // Turning it ON arms a per-minute-metered capability AND starts streaming
42497
+ // meeting content to a server-side vet. Both halves are the deliberate,
42498
+ // audited decision ADR-0022 §4 reserves confirmation for — same treatment as
42499
+ // agent-hours-billing-enabled.
42500
+ sensitive: true
42441
42501
  }
42442
42502
  ];
42443
42503
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -32559,6 +32559,15 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32559
32559
  // long note on the window-capture click handler for why this is a mode and
32560
32560
  // not just always-on.
32561
32561
  var editMode = false;
32562
+ // ENG-9383: the ONE gate every edit-entry path asks. It exists because the
32563
+ // last time a path was added, the old ones did not come with it: ENG-8477
32564
+ // introduced editMode for the deep-probe handlers and left the ENG-6821
32565
+ // direct click/hover on an arming-only check, so text stayed editable with
32566
+ // the toggle off and the button gated one of two paths. A funnel is the fix
32567
+ // for that class of bug; adding the term twice is only the fix for this
32568
+ // instance of it. A fifth handler cannot forget the mode.
32569
+ function canEdit(){ return editEnabled && editMode && !editing; }
32570
+ var hoverCued = []; // ENG-9383: elements currently wearing the mouseover cue
32562
32571
 
32563
32572
  // Element-child indices from <body> down to el. Counts ELEMENT children only
32564
32573
  // (children, not childNodes), matching how the server walks source_html; our
@@ -32752,14 +32761,48 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32752
32761
  // Hover affordance (only when armed and not mid-edit). Highlight leaves AND
32753
32762
  // inline-only containers (their bare text is per-node editable, ENG-6856).
32754
32763
  document.addEventListener('mouseover', function(e){
32755
- if(!editEnabled||editing) return; var el=e.target;
32756
- if(editable(el)||inlineOnlyEditable(el)){ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; }
32764
+ if(!canEdit()) return; var el=e.target;
32765
+ if(editable(el)||inlineOnlyEditable(el)){
32766
+ // ENG-9383: remember what the author's cursor was before we overwrite it.
32767
+ // Blanking it on the way out would delete an inline cursor the artefact
32768
+ // set itself; '' is a legitimate saved value meaning "there was none".
32769
+ if(el.__alCur===undefined) el.__alCur = el.style.cursor || '';
32770
+ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; hoverCued.push(el);
32771
+ }
32757
32772
  });
32758
32773
  document.addEventListener('mouseout', function(e){
32759
- var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; el.__alHover=0; }
32774
+ var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; restoreCursor(el); el.__alHover=0; dropHoverCue(el); }
32760
32775
  });
32776
+ // ENG-9383 (CodeRabbit on #4956): the cue is an outline AND an I-beam cursor.
32777
+ // Clearing only the outline leaves the text still saying "you can type here"
32778
+ // on a page that will now refuse the click - the same misdirection this ticket
32779
+ // is about, one property over.
32780
+ function restoreCursor(el){
32781
+ if(el.__alCur!==undefined){ try{ el.style.cursor=el.__alCur; }catch(e){} el.__alCur=undefined; }
32782
+ }
32783
+ // Keep hoverCued bounded. Without this it grows once per hovered element for
32784
+ // the life of the page and pins every one of them against GC - a list that
32785
+ // only ever empties when the viewer toggles the mode off is a leak on any page
32786
+ // nobody toggles.
32787
+ function dropHoverCue(el){
32788
+ var i=hoverCued.indexOf(el); if(i!==-1) hoverCued.splice(i,1);
32789
+ }
32790
+ // ENG-9383: drop every outline the mouseover cue left behind, without waiting
32791
+ // for a mouseout that may never come - the mode can go off while the pointer is
32792
+ // parked on the text, and then the artefact wears a dashed "editable" outline
32793
+ // on a page where you no longer can. Tracked in a list rather than queried back
32794
+ // out of the DOM: more than one element can carry the cue if the pointer moved
32795
+ // between mouseover and mouseout, and the bridge should not depend on a
32796
+ // selector matching an inline style it wrote.
32797
+ function clearHoverCues(){
32798
+ for(var i=0;i<hoverCued.length;i++){
32799
+ var el=hoverCued[i];
32800
+ if(el && el.__alHover && el!==editing){ try{ el.style.outline=''; }catch(e){} restoreCursor(el); el.__alHover=0; }
32801
+ }
32802
+ hoverCued.length=0;
32803
+ }
32761
32804
  document.addEventListener('click', function(e){
32762
- if(!editEnabled||editing) return;
32805
+ if(!canEdit()) return;
32763
32806
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // a selection => comment flow
32764
32807
  var el=e.target;
32765
32808
  if(editable(el)){ e.preventDefault(); e.stopPropagation(); startEdit(el); return; }
@@ -32803,7 +32846,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32803
32846
  // Deliberately general: nothing here knows about .clickzone or any class name.
32804
32847
  // It fixes any artefact that covers its own content.
32805
32848
  window.addEventListener('click', function(e){
32806
- if(!editEnabled || !editMode || editing) return;
32849
+ if(!canEdit()) return;
32807
32850
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // selection => comment flow
32808
32851
  var t=e.target;
32809
32852
  // Our own toolbar (Save/Cancel) must keep its clicks.
@@ -32861,7 +32904,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32861
32904
  hoverEl=null;
32862
32905
  }
32863
32906
  document.addEventListener('mousemove', function(e){
32864
- if(!editEnabled || !editMode || editing){ clearDeepHover(); return; }
32907
+ if(!canEdit()){ clearDeepHover(); return; }
32865
32908
  var t=e.target;
32866
32909
  if(editable(t)||inlineOnlyEditable(t)){ clearDeepHover(); return; }
32867
32910
  var now=Date.now(); if(now-hoverProbeAt<80) return; hoverProbeAt=now;
@@ -32961,12 +33004,17 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32961
33004
  var d=e.data; if(!d || d['${MARKUP_CONTROL_MARKER}']!==true) return;
32962
33005
  if(d.type==='enable-edit'){ editEnabled=true; }
32963
33006
  else if(d.type==='enable-comment'){ commentEnabled=true; }
32964
- // ENG-8477: the viewer toggled Edit text in the shell. Turning it OFF must
33007
+ // ENG-8477: the viewer toggled Edit mode in the shell. Turning it OFF must
32965
33008
  // also close anything open and drop the hover cue, or the artefact is left
32966
33009
  // wearing our outlines with no way to clear them.
33010
+ // ENG-9383: clearDeepHover() only knows the deep-probe path's outline. The
33011
+ // ENG-6821 mouseover path marks its own element with __alHover and relies on
33012
+ // mouseout to undo it - which never fires if the pointer is still sitting on
33013
+ // the text when the mode goes off, leaving a dashed "you can edit this"
33014
+ // outline on a page where you now cannot. Clear both.
32967
33015
  else if(d.type==='set-edit-mode'){
32968
33016
  editMode = !!d.on;
32969
- if(!editMode){ if(editing) endEdit(false); clearDeepHover(); }
33017
+ if(!editMode){ if(editing) endEdit(false); clearDeepHover(); clearHoverCues(); }
32970
33018
  }
32971
33019
  else if(d.type==='edit-result'){
32972
33020
  if(d.ok){ /* republish hot-swaps the iframe; nothing to do */ }
@@ -36130,14 +36178,15 @@ var FLAG_REGISTRY = [
36130
36178
  // hand-written process.env gate) — same posture as memory-extraction /
36131
36179
  // tool-call-audit above. Gives a per-host canary before the DB flag exists.
36132
36180
  envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
36133
- // Deliberately-unreachable placeholder until this ships: no published CLI
36134
- // carries the manager reader + core writer yet, so reach must report "no
36135
- // host honors" rather than the `honors`-for-everyone that omitting `since`
36136
- // produces. MOVE THIS PIN to the actual auto-published agt-cli version at
36137
- // merge (auto-publish patch-bumps from main; verify against the tarball, the
36138
- // ENG-8575/ENG-9350 lesson) the marker is `setSecretFileTmpfsBacking` in
36139
- // package/dist/lib/manager-worker.js.
36140
- since: "99.0.0"
36181
+ // The real published build that carries the manager reader + core writer,
36182
+ // replacing the deliberately-unreachable `99.0.0` this flag shipped with.
36183
+ // Verified against the tarball (`npm pack @integrity-labs/agt-cli@0.28.678`):
36184
+ // `setSecretFileTmpfsBacking` is present in package/dist/lib/manager-worker.js
36185
+ // and the `secret-files-tmpfs` key ships in the bundle. Auto-publish patch-
36186
+ // bumps from main, so if a CLI-touching PR landed between the ENG-9348 merge
36187
+ // and this one the real cut is higher than 0.28.678 and reach under-reports;
36188
+ // re-verify before flipping the flag on for a canary (ENG-8575/ENG-9350).
36189
+ since: "0.28.678"
36141
36190
  },
36142
36191
  {
36143
36192
  key: "memory-file-tombstones",
@@ -36921,6 +36970,17 @@ var FLAG_REGISTRY = [
36921
36970
  // control that does nothing, which is the ENG-8303 class exactly.
36922
36971
  // enforce arms automated downtime on a customer's production host.
36923
36972
  sensitive: true
36973
+ },
36974
+ {
36975
+ key: "live-meeting-advisor",
36976
+ description: "Live meeting advising in Ninja Notes (ENG-9381). When ON for an org, a person recording a meeting on the Mac may arm an agent to watch it in flight: audio chunks stream to POST /notes/live/:id/chunks, a server-side Haiku vet decides moment by moment whether to escalate, and escalations reach the agent in a server-minted chat thread. Gates the CAPABILITY, not a surface: the refusal is in startLiveAdvisorSession, so a client that ignores the flag still cannot open a session, and GET /notes/destinations reports the same answer as advisor_enabled so the app can skip the arming modal entirely. Boolean gate; ships dark. OFF NEVER COSTS THE RECORDING. An unentitled org \u2014 or a flag read that fails \u2014 costs the advisor only; the microphone still starts and the note is still transcribed and delivered. That direction is deliberate: the user pressed Record and a recording is what they are owed, while arming on a failed read would spend money per minute on a session nobody confirmed. Deliberately NO envVar. This is an org-scoped gate, and an envVar is highest-precedence per ADR-0022 \u2014 a literal in sst.config.ts would pin every stage and make the admin control do nothing, the ENG-8303 class exactly.",
36977
+ flagType: "boolean",
36978
+ defaultValue: false,
36979
+ // Turning it ON arms a per-minute-metered capability AND starts streaming
36980
+ // meeting content to a server-side vet. Both halves are the deliberate,
36981
+ // audited decision ADR-0022 §4 reserves confirmation for — same treatment as
36982
+ // agent-hours-billing-enabled.
36983
+ sensitive: true
36924
36984
  }
36925
36985
  ];
36926
36986
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -32709,6 +32709,15 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32709
32709
  // long note on the window-capture click handler for why this is a mode and
32710
32710
  // not just always-on.
32711
32711
  var editMode = false;
32712
+ // ENG-9383: the ONE gate every edit-entry path asks. It exists because the
32713
+ // last time a path was added, the old ones did not come with it: ENG-8477
32714
+ // introduced editMode for the deep-probe handlers and left the ENG-6821
32715
+ // direct click/hover on an arming-only check, so text stayed editable with
32716
+ // the toggle off and the button gated one of two paths. A funnel is the fix
32717
+ // for that class of bug; adding the term twice is only the fix for this
32718
+ // instance of it. A fifth handler cannot forget the mode.
32719
+ function canEdit(){ return editEnabled && editMode && !editing; }
32720
+ var hoverCued = []; // ENG-9383: elements currently wearing the mouseover cue
32712
32721
 
32713
32722
  // Element-child indices from <body> down to el. Counts ELEMENT children only
32714
32723
  // (children, not childNodes), matching how the server walks source_html; our
@@ -32902,14 +32911,48 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32902
32911
  // Hover affordance (only when armed and not mid-edit). Highlight leaves AND
32903
32912
  // inline-only containers (their bare text is per-node editable, ENG-6856).
32904
32913
  document.addEventListener('mouseover', function(e){
32905
- if(!editEnabled||editing) return; var el=e.target;
32906
- if(editable(el)||inlineOnlyEditable(el)){ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; }
32914
+ if(!canEdit()) return; var el=e.target;
32915
+ if(editable(el)||inlineOnlyEditable(el)){
32916
+ // ENG-9383: remember what the author's cursor was before we overwrite it.
32917
+ // Blanking it on the way out would delete an inline cursor the artefact
32918
+ // set itself; '' is a legitimate saved value meaning "there was none".
32919
+ if(el.__alCur===undefined) el.__alCur = el.style.cursor || '';
32920
+ el.style.cursor='text'; el.style.outline=el.style.outline||'1px dashed rgba(110,231,183,.6)'; el.__alHover=1; hoverCued.push(el);
32921
+ }
32907
32922
  });
32908
32923
  document.addEventListener('mouseout', function(e){
32909
- var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; el.__alHover=0; }
32924
+ var el=e.target; if(el&&el.__alHover&&el!==editing){ el.style.outline=''; restoreCursor(el); el.__alHover=0; dropHoverCue(el); }
32910
32925
  });
32926
+ // ENG-9383 (CodeRabbit on #4956): the cue is an outline AND an I-beam cursor.
32927
+ // Clearing only the outline leaves the text still saying "you can type here"
32928
+ // on a page that will now refuse the click - the same misdirection this ticket
32929
+ // is about, one property over.
32930
+ function restoreCursor(el){
32931
+ if(el.__alCur!==undefined){ try{ el.style.cursor=el.__alCur; }catch(e){} el.__alCur=undefined; }
32932
+ }
32933
+ // Keep hoverCued bounded. Without this it grows once per hovered element for
32934
+ // the life of the page and pins every one of them against GC - a list that
32935
+ // only ever empties when the viewer toggles the mode off is a leak on any page
32936
+ // nobody toggles.
32937
+ function dropHoverCue(el){
32938
+ var i=hoverCued.indexOf(el); if(i!==-1) hoverCued.splice(i,1);
32939
+ }
32940
+ // ENG-9383: drop every outline the mouseover cue left behind, without waiting
32941
+ // for a mouseout that may never come - the mode can go off while the pointer is
32942
+ // parked on the text, and then the artefact wears a dashed "editable" outline
32943
+ // on a page where you no longer can. Tracked in a list rather than queried back
32944
+ // out of the DOM: more than one element can carry the cue if the pointer moved
32945
+ // between mouseover and mouseout, and the bridge should not depend on a
32946
+ // selector matching an inline style it wrote.
32947
+ function clearHoverCues(){
32948
+ for(var i=0;i<hoverCued.length;i++){
32949
+ var el=hoverCued[i];
32950
+ if(el && el.__alHover && el!==editing){ try{ el.style.outline=''; }catch(e){} restoreCursor(el); el.__alHover=0; }
32951
+ }
32952
+ hoverCued.length=0;
32953
+ }
32911
32954
  document.addEventListener('click', function(e){
32912
- if(!editEnabled||editing) return;
32955
+ if(!canEdit()) return;
32913
32956
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // a selection => comment flow
32914
32957
  var el=e.target;
32915
32958
  if(editable(el)){ e.preventDefault(); e.stopPropagation(); startEdit(el); return; }
@@ -32953,7 +32996,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32953
32996
  // Deliberately general: nothing here knows about .clickzone or any class name.
32954
32997
  // It fixes any artefact that covers its own content.
32955
32998
  window.addEventListener('click', function(e){
32956
- if(!editEnabled || !editMode || editing) return;
32999
+ if(!canEdit()) return;
32957
33000
  var sel=document.getSelection(); if(sel && String(sel).trim()) return; // selection => comment flow
32958
33001
  var t=e.target;
32959
33002
  // Our own toolbar (Save/Cancel) must keep its clicks.
@@ -33011,7 +33054,7 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
33011
33054
  hoverEl=null;
33012
33055
  }
33013
33056
  document.addEventListener('mousemove', function(e){
33014
- if(!editEnabled || !editMode || editing){ clearDeepHover(); return; }
33057
+ if(!canEdit()){ clearDeepHover(); return; }
33015
33058
  var t=e.target;
33016
33059
  if(editable(t)||inlineOnlyEditable(t)){ clearDeepHover(); return; }
33017
33060
  var now=Date.now(); if(now-hoverProbeAt<80) return; hoverProbeAt=now;
@@ -33111,12 +33154,17 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
33111
33154
  var d=e.data; if(!d || d['${MARKUP_CONTROL_MARKER}']!==true) return;
33112
33155
  if(d.type==='enable-edit'){ editEnabled=true; }
33113
33156
  else if(d.type==='enable-comment'){ commentEnabled=true; }
33114
- // ENG-8477: the viewer toggled Edit text in the shell. Turning it OFF must
33157
+ // ENG-8477: the viewer toggled Edit mode in the shell. Turning it OFF must
33115
33158
  // also close anything open and drop the hover cue, or the artefact is left
33116
33159
  // wearing our outlines with no way to clear them.
33160
+ // ENG-9383: clearDeepHover() only knows the deep-probe path's outline. The
33161
+ // ENG-6821 mouseover path marks its own element with __alHover and relies on
33162
+ // mouseout to undo it - which never fires if the pointer is still sitting on
33163
+ // the text when the mode goes off, leaving a dashed "you can edit this"
33164
+ // outline on a page where you now cannot. Clear both.
33117
33165
  else if(d.type==='set-edit-mode'){
33118
33166
  editMode = !!d.on;
33119
- if(!editMode){ if(editing) endEdit(false); clearDeepHover(); }
33167
+ if(!editMode){ if(editing) endEdit(false); clearDeepHover(); clearHoverCues(); }
33120
33168
  }
33121
33169
  else if(d.type==='edit-result'){
33122
33170
  if(d.ok){ /* republish hot-swaps the iframe; nothing to do */ }
@@ -36274,14 +36322,15 @@ var FLAG_REGISTRY = [
36274
36322
  // hand-written process.env gate) — same posture as memory-extraction /
36275
36323
  // tool-call-audit above. Gives a per-host canary before the DB flag exists.
36276
36324
  envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
36277
- // Deliberately-unreachable placeholder until this ships: no published CLI
36278
- // carries the manager reader + core writer yet, so reach must report "no
36279
- // host honors" rather than the `honors`-for-everyone that omitting `since`
36280
- // produces. MOVE THIS PIN to the actual auto-published agt-cli version at
36281
- // merge (auto-publish patch-bumps from main; verify against the tarball, the
36282
- // ENG-8575/ENG-9350 lesson) the marker is `setSecretFileTmpfsBacking` in
36283
- // package/dist/lib/manager-worker.js.
36284
- since: "99.0.0"
36325
+ // The real published build that carries the manager reader + core writer,
36326
+ // replacing the deliberately-unreachable `99.0.0` this flag shipped with.
36327
+ // Verified against the tarball (`npm pack @integrity-labs/agt-cli@0.28.678`):
36328
+ // `setSecretFileTmpfsBacking` is present in package/dist/lib/manager-worker.js
36329
+ // and the `secret-files-tmpfs` key ships in the bundle. Auto-publish patch-
36330
+ // bumps from main, so if a CLI-touching PR landed between the ENG-9348 merge
36331
+ // and this one the real cut is higher than 0.28.678 and reach under-reports;
36332
+ // re-verify before flipping the flag on for a canary (ENG-8575/ENG-9350).
36333
+ since: "0.28.678"
36285
36334
  },
36286
36335
  {
36287
36336
  key: "memory-file-tombstones",
@@ -37065,6 +37114,17 @@ var FLAG_REGISTRY = [
37065
37114
  // control that does nothing, which is the ENG-8303 class exactly.
37066
37115
  // enforce arms automated downtime on a customer's production host.
37067
37116
  sensitive: true
37117
+ },
37118
+ {
37119
+ key: "live-meeting-advisor",
37120
+ description: "Live meeting advising in Ninja Notes (ENG-9381). When ON for an org, a person recording a meeting on the Mac may arm an agent to watch it in flight: audio chunks stream to POST /notes/live/:id/chunks, a server-side Haiku vet decides moment by moment whether to escalate, and escalations reach the agent in a server-minted chat thread. Gates the CAPABILITY, not a surface: the refusal is in startLiveAdvisorSession, so a client that ignores the flag still cannot open a session, and GET /notes/destinations reports the same answer as advisor_enabled so the app can skip the arming modal entirely. Boolean gate; ships dark. OFF NEVER COSTS THE RECORDING. An unentitled org \u2014 or a flag read that fails \u2014 costs the advisor only; the microphone still starts and the note is still transcribed and delivered. That direction is deliberate: the user pressed Record and a recording is what they are owed, while arming on a failed read would spend money per minute on a session nobody confirmed. Deliberately NO envVar. This is an org-scoped gate, and an envVar is highest-precedence per ADR-0022 \u2014 a literal in sst.config.ts would pin every stage and make the admin control do nothing, the ENG-8303 class exactly.",
37121
+ flagType: "boolean",
37122
+ defaultValue: false,
37123
+ // Turning it ON arms a per-minute-metered capability AND starts streaming
37124
+ // meeting content to a server-side vet. Both halves are the deliberate,
37125
+ // audited decision ADR-0022 §4 reserves confirmation for — same treatment as
37126
+ // agent-hours-billing-enabled.
37127
+ sensitive: true
37068
37128
  }
37069
37129
  ];
37070
37130
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-LTOGVWUR.js";
47
- import "./chunk-5DHJE2G7.js";
46
+ } from "./chunk-ZKNKHAHX.js";
47
+ import "./chunk-OOFJUWMT.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-EZEYH3PM.js.map
95
+ //# sourceMappingURL=persistent-session-OQ7MFVEH.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-LTOGVWUR.js";
4
- import "./chunk-5DHJE2G7.js";
3
+ } from "./chunk-ZKNKHAHX.js";
4
+ import "./chunk-OOFJUWMT.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -727,4 +727,4 @@ export {
727
727
  readAndResetSlackReplyBindingClassifications,
728
728
  readAndResetSlackReplyTargetClassifications
729
729
  };
730
- //# sourceMappingURL=responsiveness-probe-VS6GODYP.js.map
730
+ //# sourceMappingURL=responsiveness-probe-MDL53OT2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-5DHJE2G7.js";
3
+ } from "./chunk-OOFJUWMT.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-7U24PZZS.js.map
206
+ //# sourceMappingURL=session-auth-dead-4OJ2XLH4.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.678",
3
+ "version": "0.28.680",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {