@maximoai/maximo-syntax-cli 0.1.21 → 0.1.23

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 (3) hide show
  1. package/README.md +27 -16
  2. package/dist/cli.mjs +219 -95
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -63,6 +63,21 @@ After installation, you can invoke the CLI using any of the following commands:
63
63
 
64
64
  All five commands are equivalent and natively supported.
65
65
 
66
+ ## Scrolling (app-managed by default)
67
+
68
+ Interactive sessions use **fullscreen alt-screen scroll** by default (`displayMode:
69
+ auto`), the same approach as Grok Build: an in-app ScrollBox owns the wheel and
70
+ keyboard scroll, sticky follow only while you are pinned to the bottom, and
71
+ streaming output cannot yank the viewport while you read earlier turns.
72
+
73
+ - **Wheel / trackpad** — scroll the conversation; follow pauses automatically.
74
+ - **PgUp / PgDn** — page through the transcript from the prompt.
75
+ - **End / jump-to-bottom pill** — resume follow of new output.
76
+ - **Wheel past the bottom** — also re-enables follow.
77
+
78
+ Prefer native terminal scrollback instead? Set Display mode to `inline` in
79
+ `/config`, or `export MAXIMO_SYNTAX_NO_FLICKER=0`.
80
+
66
81
  ## Prompt mouse controls
67
82
 
68
83
  The prompt supports terminal-native mouse editing in both inline and
@@ -78,11 +93,6 @@ fullscreen layouts:
78
93
  - Click a visible slash-command or file suggestion to accept that row
79
94
  immediately. Keyboard navigation remains available.
80
95
 
81
- Application-level dispatch is limited to the prompt and suggestion boxes. The
82
- terminal’s mouse-reporting mode is global while it is enabled, so users who
83
- need native terminal scrollback selection should use this switch before
84
- starting Maximo Syntax:
85
-
86
96
  ```bash
87
97
  # Keep the prompt from enabling mouse reporting.
88
98
  export MAXIMO_SYNTAX_DISABLE_MOUSE=1
@@ -122,20 +132,21 @@ then `Q` in VS Code). The pane supports:
122
132
  - `Ctrl+Up` / `Ctrl+Down` to reorder it.
123
133
  - Typing to filter the queue.
124
134
 
125
- Open the detailed transcript with `Ctrl+O`. Fullscreen scrollback supports
126
- mouse-wheel and keyboard scrolling, `/` incremental search, `N`/`Shift+N`
127
- match navigation, text selection and copy, and automatic follow while pinned
128
- to the bottom. Manual scrolling pauses follow; returning to the bottom resumes
129
- it. Press `Shift+Up` or click a message to focus it, then use Up/Down or `J`/`K`
130
- to move between turns, Enter to fold or expand supported rows, `C` to copy,
131
- `R` for raw view, and Escape to return. Press `[` to dump the complete expanded
135
+ Open the detailed transcript with `Ctrl+O`. Scrollback supports mouse-wheel
136
+ and keyboard scrolling, `/` incremental search, `N`/`Shift+N` match navigation,
137
+ text selection and copy, and automatic follow while pinned to the bottom.
138
+ Manual scrolling pauses follow; returning to the bottom resumes it. Press
139
+ `Shift+Up` or click a message to focus it, then use Up/Down or `J`/`K` to move
140
+ between turns, Enter to fold or expand supported rows, `C` to copy, `R` for
141
+ raw view, and Escape to return. Press `[` to dump the complete expanded
132
142
  transcript into native terminal scrollback, or `V` to open it in `$VISUAL` or
133
143
  `$EDITOR`.
134
144
 
135
- `/config` also exposes display mode (auto, fullscreen, inline, compact), UI
136
- density, prompt border style, reduced motion, contextual shortcut hints, and
137
- response-completion notifications. Notifications can be limited to times when
138
- the terminal is unfocused.
145
+ `/config` also exposes display mode (`auto` = fullscreen scroll by default;
146
+ `inline` = native terminal scrollback; `fullscreen` / `compact` force the
147
+ alt-screen layout), UI density, prompt border style, reduced motion, contextual
148
+ shortcut hints, and response-completion notifications. Notifications can be
149
+ limited to times when the terminal is unfocused.
139
150
 
140
151
  ## Skills and cross-CLI compatibility
141
152
 
package/dist/cli.mjs CHANGED
@@ -123670,7 +123670,7 @@ var init_metadata = __esm(() => {
123670
123670
  isMaximoAiAuth: isMaximoAISubscriber(),
123671
123671
  version: "99.0.0",
123672
123672
  versionBase: getVersionBase(),
123673
- buildTime: "2026-08-03T01:01:49.719Z",
123673
+ buildTime: "2026-08-03T12:06:47.158Z",
123674
123674
  deploymentEnvironment: env3.detectDeploymentEnvironment(),
123675
123675
  ...isEnvTruthy(process.env.GITHUB_ACTIONS) && {
123676
123676
  githubEventName: process.env.GITHUB_EVENT_NAME,
@@ -130044,13 +130044,13 @@ function isFullscreenEnvEnabled() {
130044
130044
  if (isTmuxControlMode()) {
130045
130045
  if (!loggedTmuxCcDisable) {
130046
130046
  loggedTmuxCcDisable = true;
130047
- logForDebugging2("fullscreen disabled: tmux -CC (iTerm2 integration mode) detected · set MAXIMO_SYNTAX_NO_FLICKER=1 to override");
130047
+ logForDebugging2("fullscreen disabled: tmux -CC (iTerm2 integration mode) detected · set displayMode=fullscreen or MAXIMO_SYNTAX_NO_FLICKER=1 to override");
130048
130048
  }
130049
130049
  return false;
130050
130050
  }
130051
130051
  if (displayMode === "fullscreen" || displayMode === "compact")
130052
130052
  return true;
130053
- return process.env.USER_TYPE === "ant";
130053
+ return true;
130054
130054
  }
130055
130055
  function isMouseTrackingEnabled() {
130056
130056
  return !isEnvTruthy(process.env.MAXIMO_SYNTAX_DISABLE_MOUSE);
@@ -131101,6 +131101,16 @@ var init_terminal_focus_event = __esm(() => {
131101
131101
  };
131102
131102
  });
131103
131103
 
131104
+ // src/ink/prompt-mouse.ts
131105
+ function toPromptFrameRow(terminalRow, mainScreenRowOffset, altScreen) {
131106
+ return terminalRow - 1 - (altScreen ? 0 : mainScreenRowOffset ?? 0);
131107
+ }
131108
+ function shouldSuspendPromptMouseForNativeScroll(keyName2, altScreenActive) {
131109
+ if (altScreenActive)
131110
+ return false;
131111
+ return keyName2 === "wheelup" || keyName2 === "wheeldown";
131112
+ }
131113
+
131104
131114
  // node_modules/scheduler/cjs/scheduler.production.js
131105
131115
  var exports_scheduler_production = {};
131106
131116
  __export(exports_scheduler_production, {
@@ -144888,6 +144898,9 @@ function processKeysInBatch(app, items, _unused1, _unused2) {
144888
144898
  handleMouseEvent(app, item);
144889
144899
  continue;
144890
144900
  }
144901
+ if (app.props.isAltScreenActive && shouldSuspendPromptMouseForNativeScroll(item.name, app.props.isAltScreenActive())) {
144902
+ app.props.onSuspendPromptMouseForScroll?.();
144903
+ }
144891
144904
  const sequence = item.sequence;
144892
144905
  if (sequence === FOCUS_IN) {
144893
144906
  app.handleTerminalFocus(true);
@@ -147417,27 +147430,18 @@ function drainAdaptive(node, pending, innerHeight) {
147417
147430
  const step = abs <= SCROLL_INSTANT_THRESHOLD ? abs : abs < SCROLL_HIGH_PENDING ? SCROLL_STEP_MED : SCROLL_STEP_HIGH;
147418
147431
  applied += sign * step;
147419
147432
  const rem = abs - step;
147420
- const cap = Math.max(1, innerHeight - 1);
147433
+ const frameCap = Math.max(1, Math.min(innerHeight - 1, Math.floor(innerHeight / SCROLL_MAX_STEP_FRACTION)));
147421
147434
  const totalAbs = Math.abs(applied);
147422
- if (totalAbs > cap) {
147423
- const excess = totalAbs - cap;
147435
+ if (totalAbs > frameCap) {
147436
+ const excess = totalAbs - frameCap;
147424
147437
  node.pendingScrollDelta = sign * (rem + excess);
147425
- return sign * cap;
147438
+ return sign * frameCap;
147426
147439
  }
147427
147440
  node.pendingScrollDelta = rem > 0 ? sign * rem : undefined;
147428
147441
  return applied;
147429
147442
  }
147430
147443
  function drainProportional(node, pending, innerHeight) {
147431
- const abs = Math.abs(pending);
147432
- const cap = Math.max(1, innerHeight - 1);
147433
- const step = Math.min(cap, Math.max(SCROLL_MIN_PER_FRAME, abs * 3 >> 2));
147434
- if (abs <= step) {
147435
- node.pendingScrollDelta = undefined;
147436
- return pending;
147437
- }
147438
- const applied = pending > 0 ? step : -step;
147439
- node.pendingScrollDelta = pending - applied;
147440
- return applied;
147444
+ return drainAdaptive(node, pending, innerHeight);
147441
147445
  }
147442
147446
  function wrapWithOsc8Link(text, url3) {
147443
147447
  return `${OSC3}8;;${url3}${BEL3}${text}${OSC3}8;;${BEL3}`;
@@ -147718,8 +147722,6 @@ function renderNodeToOutput(node, output, {
147718
147722
  const content = node.childNodes.find((c5) => isElementNode(c5) && c5.yogaNode !== undefined);
147719
147723
  const contentYoga = content?.yogaNode;
147720
147724
  const scrollHeight = contentYoga?.getComputedHeight() ?? 0;
147721
- const prevScrollHeight = node.scrollHeight ?? scrollHeight;
147722
- const prevInnerHeight = node.scrollViewportHeight ?? innerHeight;
147723
147725
  node.scrollHeight = scrollHeight;
147724
147726
  node.scrollViewportHeight = innerHeight;
147725
147727
  node.scrollViewportTop = (y1 ?? y2) + padTop;
@@ -147734,15 +147736,9 @@ function renderNodeToOutput(node, output, {
147734
147736
  }
147735
147737
  const scrollTopBeforeFollow = node.scrollTop ?? 0;
147736
147738
  const sticky = node.stickyScroll ?? Boolean(node.attributes["stickyScroll"]);
147737
- const prevMaxScroll = Math.max(0, prevScrollHeight - prevInnerHeight);
147738
- const grew = scrollHeight >= prevScrollHeight;
147739
- const atBottom = sticky || grew && scrollTopBeforeFollow >= prevMaxScroll;
147740
- if (atBottom && (node.pendingScrollDelta ?? 0) >= 0) {
147739
+ if (sticky && (node.pendingScrollDelta ?? 0) >= 0) {
147741
147740
  node.scrollTop = maxScroll;
147742
147741
  node.pendingScrollDelta = undefined;
147743
- if (node.stickyScroll === false && scrollTopBeforeFollow >= prevMaxScroll) {
147744
- node.stickyScroll = true;
147745
- }
147746
147742
  }
147747
147743
  const followDelta = (node.scrollTop ?? 0) - scrollTopBeforeFollow;
147748
147744
  if (followDelta > 0) {
@@ -147760,7 +147756,7 @@ function renderNodeToOutput(node, output, {
147760
147756
  const haveClamp = cMin !== undefined && cMax !== undefined;
147761
147757
  if (pending !== undefined && pending !== 0) {
147762
147758
  const pastClamp = haveClamp && (pending < 0 && cur < cMin || pending > 0 && cur > cMax);
147763
- const eff = pastClamp ? Math.min(4, innerHeight >> 3) : innerHeight;
147759
+ const eff = pastClamp ? Math.max(8, Math.min(16, innerHeight >> 2)) : innerHeight;
147764
147760
  cur += isXtermJsHost() ? drainAdaptive(node, pending, eff) : drainProportional(node, pending, eff);
147765
147761
  } else if (pending === 0) {
147766
147762
  node.pendingScrollDelta = undefined;
@@ -148082,7 +148078,7 @@ function dropSubtreeCache(node) {
148082
148078
  }
148083
148079
  }
148084
148080
  }
148085
- var layoutShifted = false, scrollHint = null, absoluteRectsPrev, absoluteRectsCur, scrollDrainNode = null, followScroll = null, SCROLL_MIN_PER_FRAME = 4, SCROLL_INSTANT_THRESHOLD = 5, SCROLL_HIGH_PENDING = 12, SCROLL_STEP_MED = 2, SCROLL_STEP_HIGH = 3, SCROLL_MAX_PENDING = 30, OSC3 = "\x1B]", BEL3 = "\x07", render_node_to_output_default;
148081
+ var layoutShifted = false, scrollHint = null, absoluteRectsPrev, absoluteRectsCur, scrollDrainNode = null, followScroll = null, SCROLL_INSTANT_THRESHOLD = 3, SCROLL_STEP_MED = 2, SCROLL_STEP_HIGH = 4, SCROLL_HIGH_PENDING = 16, SCROLL_MAX_PENDING = 48, SCROLL_MAX_STEP_FRACTION = 4, OSC3 = "\x1B]", BEL3 = "\x07", render_node_to_output_default;
148086
148082
  var init_render_node_to_output = __esm(() => {
148087
148083
  init_colorize();
148088
148084
  init_get_max_width();
@@ -148356,11 +148352,6 @@ var init_useTerminalNotification = __esm(() => {
148356
148352
  TerminalWriteProvider = TerminalWriteContext.Provider;
148357
148353
  });
148358
148354
 
148359
- // src/ink/prompt-mouse.ts
148360
- function toPromptFrameRow(terminalRow, mainScreenRowOffset, altScreen) {
148361
- return terminalRow - 1 - (altScreen ? 0 : mainScreenRowOffset ?? 0);
148362
- }
148363
-
148364
148355
  // src/ink/ink.tsx
148365
148356
  import { closeSync as closeSync3, constants as fsConstants, openSync as openSync3, readSync as readSync2, writeSync } from "fs";
148366
148357
  import { format as format3 } from "util";
@@ -148414,6 +148405,9 @@ class Ink {
148414
148405
  promptMouseTargets = new Map;
148415
148406
  promptMouseTarget = null;
148416
148407
  promptMouseTracking = false;
148408
+ promptMouseTrackingSuspendedForScroll = false;
148409
+ promptMouseScrollResumeTimer = null;
148410
+ static PROMPT_MOUSE_SCROLL_RESUME_MS = 1500;
148417
148411
  prevFrameContaminated = false;
148418
148412
  needsEraseBeforePaint = false;
148419
148413
  cursorDeclaration = null;
@@ -148527,7 +148521,7 @@ class Ink {
148527
148521
  this.log.reset();
148528
148522
  this.displayCursor = null;
148529
148523
  this.invalidatePromptMouseCalibration();
148530
- if (this.promptMouseTracking) {
148524
+ if (this.promptMouseTracking && !this.promptMouseTrackingSuspendedForScroll) {
148531
148525
  this.options.stdout.write(ENABLE_MOUSE_PROMPT_TRACKING);
148532
148526
  }
148533
148527
  };
@@ -148547,7 +148541,7 @@ class Ink {
148547
148541
  this.resetFramesForAltScreen();
148548
148542
  this.needsEraseBeforePaint = true;
148549
148543
  }
148550
- if (!this.altScreenActive && !this.isPaused && this.options.stdout.isTTY && this.promptMouseTracking) {
148544
+ if (!this.altScreenActive && !this.isPaused && this.options.stdout.isTTY && this.promptMouseTracking && !this.promptMouseTrackingSuspendedForScroll) {
148551
148545
  this.options.stdout.write(ENABLE_MOUSE_PROMPT_TRACKING);
148552
148546
  }
148553
148547
  if (this.currentNode !== null) {
@@ -148687,7 +148681,8 @@ class Ink {
148687
148681
  }
148688
148682
  optimized.push(this.altScreenParkPatch);
148689
148683
  }
148690
- const decl = this.cursorDeclaration;
148684
+ const suppressMainScreenCursorPark = !this.altScreenActive && this.promptMouseTrackingSuspendedForScroll;
148685
+ const decl = suppressMainScreenCursorPark ? null : this.cursorDeclaration;
148691
148686
  const rect = decl !== null ? nodeCache.get(decl.node) : undefined;
148692
148687
  const target = decl !== null && rect !== undefined ? {
148693
148688
  x: rect.x + decl.relativeX,
@@ -148760,10 +148755,10 @@ class Ink {
148760
148755
  }
148761
148756
  const tWrite = performance.now();
148762
148757
  writeDiffToTerminal(this.terminal, optimized, this.altScreenActive && !SYNC_OUTPUT_SUPPORTED);
148763
- if (this.promptMouseTracking && !this.altScreenActive && !this.isPaused && this.options.stdout.isTTY) {
148758
+ if (this.promptMouseTracking && !this.promptMouseTrackingSuspendedForScroll && !this.altScreenActive && !this.isPaused && this.options.stdout.isTTY) {
148764
148759
  this.options.stdout.write(ENABLE_MOUSE_PROMPT_TRACKING);
148765
148760
  }
148766
- if (target !== null && this.promptMouseTracking && !this.altScreenActive && !this.isPaused && this.options.stdout.isTTY && this.pendingCursorCalibrationY === null && (this.promptMouseRowOffset === null || this.lastCalibratedCursorY !== target.y || this.lastCalibratedFrameCursorY !== frame.cursor.y)) {
148761
+ if (target !== null && this.promptMouseTracking && !this.promptMouseTrackingSuspendedForScroll && !this.altScreenActive && !this.isPaused && this.options.stdout.isTTY && this.pendingCursorCalibrationY === null && (this.promptMouseRowOffset === null || this.lastCalibratedCursorY !== target.y || this.lastCalibratedFrameCursorY !== frame.cursor.y)) {
148767
148762
  this.pendingCursorCalibrationY = target.y;
148768
148763
  this.pendingCalibrationFrameCursorY = frame.cursor.y;
148769
148764
  this.options.stdout.write(REQUEST_CURSOR_POSITION);
@@ -148839,6 +148834,11 @@ class Ink {
148839
148834
  this.altScreenActive = active;
148840
148835
  this.altScreenMouseTracking = active && mouseTracking;
148841
148836
  if (active) {
148837
+ if (this.promptMouseScrollResumeTimer) {
148838
+ clearTimeout(this.promptMouseScrollResumeTimer);
148839
+ this.promptMouseScrollResumeTimer = null;
148840
+ }
148841
+ this.promptMouseTrackingSuspendedForScroll = false;
148842
148842
  this.resetFramesForAltScreen();
148843
148843
  } else {
148844
148844
  this.repaint();
@@ -148856,7 +148856,7 @@ class Ink {
148856
148856
  this.options.stdout.write(DISABLE_KITTY_KEYBOARD + ENABLE_KITTY_KEYBOARD + ENABLE_MODIFY_OTHER_KEYS);
148857
148857
  }
148858
148858
  if (!this.altScreenActive) {
148859
- if (this.promptMouseTracking) {
148859
+ if (this.promptMouseTracking && !this.promptMouseTrackingSuspendedForScroll) {
148860
148860
  this.options.stdout.write(ENABLE_MOUSE_PROMPT_TRACKING);
148861
148861
  }
148862
148862
  return;
@@ -148908,11 +148908,38 @@ class Ink {
148908
148908
  if (!this.options.stdout.isTTY || this.isPaused || this.altScreenActive) {
148909
148909
  return;
148910
148910
  }
148911
+ if (enabled && this.promptMouseTrackingSuspendedForScroll) {
148912
+ return;
148913
+ }
148911
148914
  this.options.stdout.write(enabled ? ENABLE_MOUSE_PROMPT_TRACKING : DISABLE_MOUSE_PROMPT_TRACKING);
148912
148915
  }
148916
+ suspendPromptMouseForNativeScroll = () => {
148917
+ if (this.altScreenActive)
148918
+ return;
148919
+ this.promptMouseTrackingSuspendedForScroll = true;
148920
+ if (this.promptMouseScrollResumeTimer) {
148921
+ clearTimeout(this.promptMouseScrollResumeTimer);
148922
+ }
148923
+ this.promptMouseScrollResumeTimer = setTimeout(() => {
148924
+ this.promptMouseScrollResumeTimer = null;
148925
+ this.resumePromptMouseAfterScroll();
148926
+ }, Ink.PROMPT_MOUSE_SCROLL_RESUME_MS);
148927
+ if (this.promptMouseTracking && this.options.stdout.isTTY && !this.isPaused) {
148928
+ this.options.stdout.write(DISABLE_MOUSE_PROMPT_TRACKING);
148929
+ }
148930
+ };
148931
+ resumePromptMouseAfterScroll() {
148932
+ if (!this.promptMouseTrackingSuspendedForScroll)
148933
+ return;
148934
+ this.promptMouseTrackingSuspendedForScroll = false;
148935
+ if (this.promptMouseTracking && this.options.stdout.isTTY && !this.isPaused && !this.altScreenActive) {
148936
+ this.options.stdout.write(ENABLE_MOUSE_PROMPT_TRACKING);
148937
+ }
148938
+ }
148913
148939
  dispatchPromptMouse(m) {
148914
- if (!this.promptMouseTracking || isMouseClicksDisabled())
148940
+ if (!this.promptMouseTracking || this.promptMouseTrackingSuspendedForScroll || isMouseClicksDisabled()) {
148915
148941
  return false;
148942
+ }
148916
148943
  const col = m.col - 1;
148917
148944
  const row = toPromptFrameRow(m.row, this.promptMouseRowOffset, this.altScreenActive);
148918
148945
  const baseButton = m.button & 3;
@@ -149298,6 +149325,7 @@ class Ink {
149298
149325
  onStdinResume: this.reassertTerminalModes,
149299
149326
  onPromptMouse: this.dispatchPromptMouse,
149300
149327
  isAltScreenActive: () => this.altScreenActive,
149328
+ onSuspendPromptMouseForScroll: this.suspendPromptMouseForNativeScroll,
149301
149329
  onCursorDeclaration: this.setCursorDeclaration,
149302
149330
  onCursorPosition: this.handleCursorPosition,
149303
149331
  dispatchKeyboardEvent: this.dispatchKeyboardEvent,
@@ -149343,6 +149371,10 @@ class Ink {
149343
149371
  clearTimeout(this.drainTimer);
149344
149372
  this.drainTimer = null;
149345
149373
  }
149374
+ if (this.promptMouseScrollResumeTimer !== null) {
149375
+ clearTimeout(this.promptMouseScrollResumeTimer);
149376
+ this.promptMouseScrollResumeTimer = null;
149377
+ }
149346
149378
  reconciler_default.updateContainerSync(null, this.container, null, noop_default);
149347
149379
  reconciler_default.flushSyncWork();
149348
149380
  instances_default.delete(this.options.stdout);
@@ -276381,7 +276413,7 @@ import { access as access3, writeFile as writeFile13 } from "fs/promises";
276381
276413
  import { homedir as homedir22 } from "os";
276382
276414
  import { join as join65 } from "path";
276383
276415
  function getCurrentRealVersion() {
276384
- return "0.1.21";
276416
+ return "0.1.23";
276385
276417
  }
276386
276418
  async function getRolloutConfig() {
276387
276419
  try {
@@ -280832,7 +280864,7 @@ var init_detection = __esm(() => {
280832
280864
  });
280833
280865
 
280834
280866
  // src/entrypoints/sdk/coreSchemas.ts
280835
- var ModelUsageSchema, OutputFormatTypeSchema, BaseOutputFormatSchema, JsonSchemaOutputFormatSchema, OutputFormatSchema, ApiKeySourceSchema, ConfigScopeSchema2, SdkBetaSchema, ThinkingAdaptiveSchema, ThinkingEnabledSchema, ThinkingDisabledSchema, ThinkingConfigSchema, McpStdioServerConfigSchema2, McpSSEServerConfigSchema2, McpHttpServerConfigSchema, McpSdkServerConfigSchema2, McpServerConfigForProcessTransportSchema, McpMaximoAIProxyServerConfigSchema2, McpServerStatusConfigSchema, McpServerStatusSchema, McpSetServersResultSchema, PermissionUpdateDestinationSchema, PermissionBehaviorSchema, PermissionRuleValueSchema, PermissionUpdateSchema, PermissionDecisionClassificationSchema, PermissionResultSchema, PermissionModeSchema, HOOK_EVENTS2, HookEventSchema, BaseHookInputSchema, PreToolUseHookInputSchema, PermissionRequestHookInputSchema, PostToolUseHookInputSchema, PostToolUseFailureHookInputSchema, PermissionDeniedHookInputSchema, NotificationHookInputSchema, UserPromptSubmitHookInputSchema, SessionStartHookInputSchema, SetupHookInputSchema, StopHookInputSchema, StopFailureHookInputSchema, SubagentStartHookInputSchema, SubagentStopHookInputSchema, PreCompactHookInputSchema, PostCompactHookInputSchema, TeammateIdleHookInputSchema, TaskCreatedHookInputSchema, TaskCompletedHookInputSchema, ElicitationHookInputSchema, ElicitationResultHookInputSchema, CONFIG_CHANGE_SOURCES, ConfigChangeHookInputSchema, INSTRUCTIONS_LOAD_REASONS, INSTRUCTIONS_MEMORY_TYPES, InstructionsLoadedHookInputSchema, WorktreeCreateHookInputSchema, WorktreeRemoveHookInputSchema, CwdChangedHookInputSchema, FileChangedHookInputSchema, EXIT_REASONS, ExitReasonSchema, SessionEndHookInputSchema, HookInputSchema, AsyncHookJSONOutputSchema, PreToolUseHookSpecificOutputSchema, UserPromptSubmitHookSpecificOutputSchema, SessionStartHookSpecificOutputSchema, SetupHookSpecificOutputSchema, SubagentStartHookSpecificOutputSchema, PostToolUseHookSpecificOutputSchema, PostToolUseFailureHookSpecificOutputSchema, PermissionDeniedHookSpecificOutputSchema, NotificationHookSpecificOutputSchema, PermissionRequestHookSpecificOutputSchema, CwdChangedHookSpecificOutputSchema, FileChangedHookSpecificOutputSchema, SyncHookJSONOutputSchema, ElicitationHookSpecificOutputSchema, ElicitationResultHookSpecificOutputSchema, WorktreeCreateHookSpecificOutputSchema, HookJSONOutputSchema, PromptRequestOptionSchema, PromptRequestSchema, PromptResponseSchema, SlashCommandSchema, AgentInfoSchema, ModelInfoSchema, AccountInfoSchema, AgentMcpServerSpecSchema2, AgentDefinitionSchema, SettingSourceSchema, SdkPluginConfigSchema, RewindFilesResultSchema, APIUserMessagePlaceholder, APIAssistantMessagePlaceholder, RawMessageStreamEventPlaceholder, UUIDPlaceholder, NonNullableUsagePlaceholder, SDKAssistantMessageErrorSchema, SDKStatusSchema, SDKUserMessageContentSchema, SDKUserMessageSchema, SDKUserMessageReplaySchema, SDKRateLimitInfoSchema, SDKAssistantMessageSchema, SDKRateLimitEventSchema, SDKStreamlinedTextMessageSchema, SDKStreamlinedToolUseSummaryMessageSchema, SDKPermissionDenialSchema, SDKResultSuccessSchema, SDKResultErrorSchema, SDKResultMessageSchema, SDKSystemMessageSchema, SDKPartialAssistantMessageSchema, SDKCompactBoundaryMessageSchema, SDKStatusMessageSchema, SDKPostTurnSummaryMessageSchema, SDKAPIRetryMessageSchema, SDKLocalCommandOutputMessageSchema, SDKHookStartedMessageSchema, SDKHookProgressMessageSchema, SDKHookResponseMessageSchema, SDKToolProgressMessageSchema, SDKAuthStatusMessageSchema, SDKFilesPersistedEventSchema, SDKTaskNotificationMessageSchema, SDKTaskStartedMessageSchema, SDKSessionStateChangedMessageSchema, SDKTaskProgressMessageSchema, SDKToolUseSummaryMessageSchema, SDKElicitationCompleteMessageSchema, SDKPromptSuggestionMessageSchema, SDKSessionInfoSchema, SDKMessageSchema, FastModeStateSchema;
280867
+ var ModelUsageSchema, OutputFormatTypeSchema, BaseOutputFormatSchema, JsonSchemaOutputFormatSchema, OutputFormatSchema, ApiKeySourceSchema, ConfigScopeSchema2, SdkBetaSchema, ThinkingAdaptiveSchema, ThinkingEnabledSchema, ThinkingDisabledSchema, ThinkingConfigSchema, McpStdioServerConfigSchema2, McpSSEServerConfigSchema2, McpHttpServerConfigSchema, McpSdkServerConfigSchema2, McpServerConfigForProcessTransportSchema, McpMaximoAIProxyServerConfigSchema2, McpServerStatusConfigSchema, McpServerStatusSchema, McpSetServersResultSchema, PermissionUpdateDestinationSchema, PermissionBehaviorSchema, PermissionRuleValueSchema, PermissionUpdateSchema, PermissionDecisionClassificationSchema, PermissionResultSchema, PermissionModeSchema, HOOK_EVENTS2, HookEventSchema, BaseHookInputSchema, PreToolUseHookInputSchema, PermissionRequestHookInputSchema, PostToolUseHookInputSchema, PostToolUseFailureHookInputSchema, PermissionDeniedHookInputSchema, NotificationHookInputSchema, UserPromptSubmitHookInputSchema, SessionStartHookInputSchema, SetupHookInputSchema, StopHookInputSchema, StopFailureHookInputSchema, SubagentStartHookInputSchema, SubagentStopHookInputSchema, PreCompactHookInputSchema, PostCompactHookInputSchema, TeammateIdleHookInputSchema, TaskCreatedHookInputSchema, TaskCompletedHookInputSchema, ElicitationHookInputSchema, ElicitationResultHookInputSchema, CONFIG_CHANGE_SOURCES, ConfigChangeHookInputSchema, INSTRUCTIONS_LOAD_REASONS, INSTRUCTIONS_MEMORY_TYPES, InstructionsLoadedHookInputSchema, WorktreeCreateHookInputSchema, WorktreeRemoveHookInputSchema, CwdChangedHookInputSchema, FileChangedHookInputSchema, EXIT_REASONS, ExitReasonSchema, SessionEndHookInputSchema, HookInputSchema, AsyncHookJSONOutputSchema, PreToolUseHookSpecificOutputSchema, UserPromptSubmitHookSpecificOutputSchema, SessionStartHookSpecificOutputSchema, SetupHookSpecificOutputSchema, SubagentStartHookSpecificOutputSchema, PostToolUseHookSpecificOutputSchema, PostToolUseFailureHookSpecificOutputSchema, PermissionDeniedHookSpecificOutputSchema, NotificationHookSpecificOutputSchema, PermissionRequestHookSpecificOutputSchema, CwdChangedHookSpecificOutputSchema, FileChangedHookSpecificOutputSchema, SyncHookJSONOutputSchema, ElicitationHookSpecificOutputSchema, ElicitationResultHookSpecificOutputSchema, WorktreeCreateHookSpecificOutputSchema, HookJSONOutputSchema, PromptRequestOptionSchema, PromptRequestSchema, PromptResponseSchema, SlashCommandSchema, AgentInfoSchema, ModelInfoSchema, AccountInfoSchema, AgentMcpServerSpecSchema2, AgentDefinitionSchema, SettingSourceSchema, SdkPluginConfigSchema, RewindFilesResultSchema, APIUserMessagePlaceholder, APIAssistantMessagePlaceholder, RawMessageStreamEventPlaceholder, UUIDPlaceholder, NonNullableUsagePlaceholder, SDKAssistantMessageErrorSchema, SDKStatusSchema, SDKUserMessageContentSchema, SDKUserMessageSchema, SDKUserMessageReplaySchema, SDKRateLimitInfoSchema, SDKAssistantMessageSchema, SDKRateLimitEventSchema, SDKStreamlinedTextMessageSchema, SDKStreamlinedToolUseSummaryMessageSchema, SDKPermissionDenialSchema, SDKResultSuccessSchema, SDKResultErrorSchema, SDKResultMessageSchema, SDKSystemMessageSchema, SDKPartialAssistantMessageSchema, SDKCompactBoundaryMessageSchema, SDKStatusMessageSchema, SDKPostTurnSummaryMessageSchema, SDKAPIRetryMessageSchema, SDKLocalCommandOutputMessageSchema, SDKClassifierDecisionMessageSchema, SDKHookStartedMessageSchema, SDKHookProgressMessageSchema, SDKHookResponseMessageSchema, SDKToolProgressMessageSchema, SDKAuthStatusMessageSchema, SDKFilesPersistedEventSchema, SDKTaskNotificationMessageSchema, SDKTaskStartedMessageSchema, SDKSessionStateChangedMessageSchema, SDKTaskProgressMessageSchema, SDKToolUseSummaryMessageSchema, SDKElicitationCompleteMessageSchema, SDKPromptSuggestionMessageSchema, SDKSessionInfoSchema, SDKMessageSchema, FastModeStateSchema;
280836
280868
  var init_coreSchemas = __esm(() => {
280837
280869
  init_v4();
280838
280870
  ModelUsageSchema = lazySchema(() => exports_external.object({
@@ -281692,6 +281724,17 @@ var init_coreSchemas = __esm(() => {
281692
281724
  uuid: UUIDPlaceholder(),
281693
281725
  session_id: exports_external.string()
281694
281726
  }).describe("Output from a local slash command (e.g. /voice, /cost). Displayed as assistant-style text in the transcript."));
281727
+ SDKClassifierDecisionMessageSchema = lazySchema(() => exports_external.object({
281728
+ type: exports_external.literal("system"),
281729
+ subtype: exports_external.literal("classifier_decision"),
281730
+ tool_use_id: exports_external.string(),
281731
+ tool_name: exports_external.string(),
281732
+ decision: exports_external.enum(["allowed", "denied"]),
281733
+ classifier: exports_external.string().describe('Classifier id, e.g. "auto-mode" or "bash".'),
281734
+ reason: exports_external.string().optional().describe("Human-readable reason from the classifier, when available."),
281735
+ uuid: UUIDPlaceholder(),
281736
+ session_id: exports_external.string()
281737
+ }).describe("Emitted when auto-mode or bash classifier allows or denies a tool use. Hosts should show this next to the matching tool activity."));
281695
281738
  SDKHookStartedMessageSchema = lazySchema(() => exports_external.object({
281696
281739
  type: exports_external.literal("system"),
281697
281740
  subtype: exports_external.literal("hook_started"),
@@ -281855,6 +281898,7 @@ var init_coreSchemas = __esm(() => {
281855
281898
  SDKStatusMessageSchema(),
281856
281899
  SDKAPIRetryMessageSchema(),
281857
281900
  SDKLocalCommandOutputMessageSchema(),
281901
+ SDKClassifierDecisionMessageSchema(),
281858
281902
  SDKHookStartedMessageSchema(),
281859
281903
  SDKHookProgressMessageSchema(),
281860
281904
  SDKHookResponseMessageSchema(),
@@ -359896,6 +359940,31 @@ var init_bashPermissions = __esm(() => {
359896
359940
  speculativeChecks = new Map;
359897
359941
  });
359898
359942
 
359943
+ // src/utils/classifierDecisionEvents.ts
359944
+ function registerClassifierDecisionHandler(next) {
359945
+ handler7 = next;
359946
+ if (handler7 && pending.length > 0) {
359947
+ for (const event of pending.splice(0)) {
359948
+ handler7(event);
359949
+ }
359950
+ }
359951
+ }
359952
+ function emitClassifierDecision(event) {
359953
+ if (!event.toolUseId || !event.toolName)
359954
+ return;
359955
+ if (handler7) {
359956
+ handler7(event);
359957
+ return;
359958
+ }
359959
+ pending.push(event);
359960
+ if (pending.length > MAX_PENDING)
359961
+ pending.shift();
359962
+ }
359963
+ var MAX_PENDING = 50, pending, handler7 = null;
359964
+ var init_classifierDecisionEvents = __esm(() => {
359965
+ pending = [];
359966
+ });
359967
+
359899
359968
  // src/utils/sessionActivity.ts
359900
359969
  function startHeartbeatTimer() {
359901
359970
  clearIdleTimer();
@@ -360986,6 +361055,15 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
360986
361055
  if (permissionDurationMs >= SLOW_PHASE_LOG_THRESHOLD_MS && permissionMode === "auto") {
360987
361056
  logForDebugging2(`Slow permission decision: ${permissionDurationMs}ms for ${tool.name} ` + `(mode=${permissionMode}, behavior=${permissionDecision.behavior})`, { level: "info" });
360988
361057
  }
361058
+ if (permissionDecision.decisionReason?.type === "classifier" && (permissionDecision.behavior === "allow" || permissionDecision.behavior === "deny")) {
361059
+ emitClassifierDecision({
361060
+ toolUseId: toolUseID,
361061
+ toolName: tool.name,
361062
+ decision: permissionDecision.behavior === "allow" ? "allowed" : "denied",
361063
+ classifier: permissionDecision.decisionReason.classifier,
361064
+ reason: permissionDecision.decisionReason.reason
361065
+ });
361066
+ }
360989
361067
  if (permissionDecision.behavior !== "ask" && !toolUseContext.toolDecisions?.has(toolUseID)) {
360990
361068
  const decision = permissionDecision.behavior === "allow" ? "accept" : "reject";
360991
361069
  const source = decisionReasonToOTelSource(permissionDecision.decisionReason, permissionDecision.behavior);
@@ -361472,6 +361550,7 @@ var init_toolExecution = __esm(() => {
361472
361550
  init_permissionLogging();
361473
361551
  init_Tool();
361474
361552
  init_bashPermissions();
361553
+ init_classifierDecisionEvents();
361475
361554
  init_prompt2();
361476
361555
  init_prompt3();
361477
361556
  init_gitOperationTracking();
@@ -363801,7 +363880,7 @@ function getAnthropicEnvMetadata() {
363801
363880
  function getBuildAgeMinutes() {
363802
363881
  if (false)
363803
363882
  ;
363804
- const buildTime = new Date("2026-08-03T01:01:49.719Z").getTime();
363883
+ const buildTime = new Date("2026-08-03T12:06:47.158Z").getTime();
363805
363884
  if (isNaN(buildTime))
363806
363885
  return;
363807
363886
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -369383,11 +369462,11 @@ For example, to get tab context:
369383
369462
  2. Then: Call mcp__claude-in-chrome__tabs_context_mcp`, CLAUDE_IN_CHROME_SKILL_HINT = `**Browser Automation**: Chrome browser tools are available via the "claude-in-chrome" skill. CRITICAL: Before using any mcp__claude-in-chrome__* tools, invoke the skill by calling the Skill tool with skill: "claude-in-chrome". The skill provides browser automation instructions and enables the tools.`;
369384
369463
 
369385
369464
  // src/utils/hooks/hookEvents.ts
369386
- function registerHookEventHandler(handler7) {
369387
- eventHandler = handler7;
369388
- if (handler7 && pendingEvents.length > 0) {
369465
+ function registerHookEventHandler(handler8) {
369466
+ eventHandler = handler8;
369467
+ if (handler8 && pendingEvents.length > 0) {
369389
369468
  for (const event of pendingEvents.splice(0)) {
369390
- handler7(event);
369469
+ handler8(event);
369391
369470
  }
369392
369471
  }
369393
369472
  }
@@ -371329,8 +371408,8 @@ async function getVerifyPlanReminderAttachment(messages, toolUseContext) {
371329
371408
  return [];
371330
371409
  }
371331
371410
  const appState = toolUseContext.getAppState();
371332
- const pending = appState.pendingPlanVerification;
371333
- if (!pending || pending.verificationStarted || pending.verificationCompleted) {
371411
+ const pending2 = appState.pendingPlanVerification;
371412
+ if (!pending2 || pending2.verificationStarted || pending2.verificationCompleted) {
371334
371413
  return [];
371335
371414
  }
371336
371415
  if (messages && messages.length > 0) {
@@ -386696,9 +386775,9 @@ var init_directoryCompletion = __esm(() => {
386696
386775
  });
386697
386776
 
386698
386777
  // src/ink/hooks/use-prompt-mouse-target.ts
386699
- function usePromptMouseTarget(handler7, enabled = true) {
386700
- const handlerRef = import_react94.useRef(handler7);
386701
- handlerRef.current = handler7;
386778
+ function usePromptMouseTarget(handler8, enabled = true) {
386779
+ const handlerRef = import_react94.useRef(handler8);
386780
+ handlerRef.current = handler8;
386702
386781
  const nodeRef = import_react94.useRef(null);
386703
386782
  const registeredNodeRef = import_react94.useRef(null);
386704
386783
  const unregisterRef = import_react94.useRef(null);
@@ -387719,6 +387798,13 @@ function ScrollBox({
387719
387798
  el.pendingScrollDelta = (el.pendingScrollDelta ?? 0) + Math.floor(dy);
387720
387799
  scrollMutated(el);
387721
387800
  },
387801
+ nudgeScrollTop(dy) {
387802
+ const el = domRef.current;
387803
+ if (!el || dy === 0)
387804
+ return;
387805
+ el.scrollTop = Math.max(0, Math.floor((el.scrollTop ?? 0) + dy));
387806
+ scrollMutated(el);
387807
+ },
387722
387808
  scrollToBottom() {
387723
387809
  const el = domRef.current;
387724
387810
  if (!el)
@@ -420267,9 +420353,9 @@ function ManagePlugins({
420267
420353
  handleSingleOperationRef.current = handleSingleOperation;
420268
420354
  import_react143.useEffect(() => {
420269
420355
  if (viewState === "plugin-details" && selectedPlugin && pendingAutoActionRef.current) {
420270
- const pending = pendingAutoActionRef.current;
420356
+ const pending2 = pendingAutoActionRef.current;
420271
420357
  pendingAutoActionRef.current = undefined;
420272
- handleSingleOperationRef.current(pending);
420358
+ handleSingleOperationRef.current(pending2);
420273
420359
  }
420274
420360
  }, [viewState, selectedPlugin]);
420275
420361
  const handleToggle = React79.useCallback(() => {
@@ -429868,7 +429954,7 @@ function getRecentActivitySync() {
429868
429954
  return cachedActivity;
429869
429955
  }
429870
429956
  function getLogoDisplayData() {
429871
- const version2 = process.env.DEMO_VERSION ?? "0.1.21" ?? "99.0.0";
429957
+ const version2 = process.env.DEMO_VERSION ?? "0.1.23" ?? "99.0.0";
429872
429958
  const serverUrl = getDirectConnectServerUrl();
429873
429959
  const displayPath = process.env.DEMO_VERSION ? "/code/maximo" : getDisplayPath(getCwd());
429874
429960
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -432772,6 +432858,7 @@ var init_StatusNotices = __esm(() => {
432772
432858
  function useVirtualScroll(scrollRef, itemKeys, columns) {
432773
432859
  const heightCache = import_react156.useRef(new Map);
432774
432860
  const offsetVersionRef = import_react156.useRef(0);
432861
+ const [, setMeasureEpoch] = import_react156.useState(0);
432775
432862
  const lastScrollTopRef = import_react156.useRef(0);
432776
432863
  const offsetsRef = import_react156.useRef({
432777
432864
  arr: new Float64Array(0),
@@ -432965,7 +433052,10 @@ function useVirtualScroll(scrollRef, itemKeys, columns) {
432965
433052
  skipMeasurementRef.current = false;
432966
433053
  return;
432967
433054
  }
433055
+ const scrollTopNow = scrollRef.current?.getScrollTop() ?? -1;
433056
+ const stickyNow = scrollRef.current?.isSticky() ?? true;
432968
433057
  let anyChanged = false;
433058
+ let anchorDelta = 0;
432969
433059
  for (const [key, el] of itemRefs.current) {
432970
433060
  const yoga = el.yogaNode;
432971
433061
  if (!yoga)
@@ -432974,16 +433064,34 @@ function useVirtualScroll(scrollRef, itemKeys, columns) {
432974
433064
  const prev = heightCache.current.get(key);
432975
433065
  if (h2 > 0) {
432976
433066
  if (prev !== h2) {
433067
+ const oldH = prev ?? DEFAULT_ESTIMATE;
433068
+ const itemTop = yoga.getComputedTop();
433069
+ if (!stickyNow && scrollTopNow >= 0 && itemTop < scrollTopNow) {
433070
+ anchorDelta += h2 - oldH;
433071
+ }
432977
433072
  heightCache.current.set(key, h2);
432978
433073
  anyChanged = true;
432979
433074
  }
432980
433075
  } else if (yoga.getComputedWidth() > 0 && prev !== 0) {
433076
+ if (prev !== undefined && prev > 0) {
433077
+ const itemTop = yoga.getComputedTop();
433078
+ if (!stickyNow && scrollTopNow >= 0 && itemTop < scrollTopNow) {
433079
+ anchorDelta += 0 - prev;
433080
+ }
433081
+ }
432981
433082
  heightCache.current.set(key, 0);
432982
433083
  anyChanged = true;
432983
433084
  }
432984
433085
  }
432985
- if (anyChanged)
432986
- offsetVersionRef.current++;
433086
+ if (!anyChanged)
433087
+ return;
433088
+ offsetVersionRef.current++;
433089
+ if (anchorDelta !== 0) {
433090
+ scrollRef.current?.nudgeScrollTop(anchorDelta);
433091
+ }
433092
+ if (!stickyNow) {
433093
+ setMeasureEpoch((e) => e + 1);
433094
+ }
432987
433095
  });
432988
433096
  const measureRef = import_react156.useCallback((key) => {
432989
433097
  let fn = refCache.current.get(key);
@@ -433035,7 +433143,7 @@ function useVirtualScroll(scrollRef, itemKeys, columns) {
433035
433143
  scrollToIndex
433036
433144
  };
433037
433145
  }
433038
- var import_react156, DEFAULT_ESTIMATE = 3, OVERSCAN_ROWS = 80, COLD_START_COUNT = 30, SCROLL_QUANTUM, PESSIMISTIC_HEIGHT = 1, MAX_MOUNTED_ITEMS = 300, SLIDE_STEP = 25, NOOP_UNSUB = () => {};
433146
+ var import_react156, DEFAULT_ESTIMATE = 4, OVERSCAN_ROWS = 80, COLD_START_COUNT = 30, SCROLL_QUANTUM, PESSIMISTIC_HEIGHT = 1, MAX_MOUNTED_ITEMS = 300, SLIDE_STEP = 25, NOOP_UNSUB = () => {};
433039
433147
  var init_useVirtualScroll = __esm(() => {
433040
433148
  import_react156 = __toESM(require_react(), 1);
433041
433149
  SCROLL_QUANTUM = OVERSCAN_ROWS >> 1;
@@ -434094,10 +434202,10 @@ function VirtualMessageList({
434094
434202
  searchState.current.screenOrd = ord;
434095
434203
  startPtrRef.current = -1;
434096
434204
  highlightRef.current(ord);
434097
- const pending = pendingStepRef.current;
434098
- if (pending) {
434205
+ const pending2 = pendingStepRef.current;
434206
+ if (pending2) {
434099
434207
  pendingStepRef.current = 0;
434100
- stepRef.current(pending);
434208
+ stepRef.current(pending2);
434101
434209
  }
434102
434210
  }, [seekGen]);
434103
434211
  function jump(i3, wantLast) {
@@ -434383,14 +434491,14 @@ function StickyTracker({
434383
434491
  }
434384
434492
  const baseOffset = firstVisibleTop >= 0 ? firstVisibleTop - offsets[firstVisible] : 0;
434385
434493
  const estimate = idx >= 0 ? Math.max(0, baseOffset + offsets[idx]) : -1;
434386
- const pending = import_react159.useRef({
434494
+ const pending2 = import_react159.useRef({
434387
434495
  idx: -1,
434388
434496
  tries: 0
434389
434497
  });
434390
434498
  const suppress = import_react159.useRef("none");
434391
434499
  const lastIdx = import_react159.useRef(-1);
434392
434500
  import_react159.useEffect(() => {
434393
- if (pending.current.idx >= 0)
434501
+ if (pending2.current.idx >= 0)
434394
434502
  return;
434395
434503
  if (suppress.current === "armed") {
434396
434504
  suppress.current = "force";
@@ -434424,7 +434532,7 @@ function StickyTracker({
434424
434532
  scrollRef.current?.scrollToElement(el, 1);
434425
434533
  } else {
434426
434534
  scrollRef.current?.scrollTo(capturedEstimate);
434427
- pending.current = {
434535
+ pending2.current = {
434428
434536
  idx: capturedIdx,
434429
434537
  tries: 0
434430
434538
  };
@@ -434433,17 +434541,17 @@ function StickyTracker({
434433
434541
  });
434434
434542
  });
434435
434543
  import_react159.useEffect(() => {
434436
- if (pending.current.idx < 0)
434544
+ if (pending2.current.idx < 0)
434437
434545
  return;
434438
- const el = getItemElement(pending.current.idx);
434546
+ const el = getItemElement(pending2.current.idx);
434439
434547
  if (el) {
434440
434548
  scrollRef.current?.scrollToElement(el, 1);
434441
- pending.current = {
434549
+ pending2.current = {
434442
434550
  idx: -1,
434443
434551
  tries: 0
434444
434552
  };
434445
- } else if (++pending.current.tries > 5) {
434446
- pending.current = {
434553
+ } else if (++pending2.current.tries > 5) {
434554
+ pending2.current = {
434447
434555
  idx: -1,
434448
434556
  tries: 0
434449
434557
  };
@@ -459311,7 +459419,7 @@ var init_bridge_kick = __esm(() => {
459311
459419
  var call57 = async () => {
459312
459420
  return {
459313
459421
  type: "text",
459314
- value: `${"99.0.0"} (built ${"2026-08-03T01:01:49.719Z"})`
459422
+ value: `${"99.0.0"} (built ${"2026-08-03T12:06:47.158Z"})`
459315
459423
  };
459316
459424
  }, version2, version_default;
459317
459425
  var init_version = __esm(() => {
@@ -464153,14 +464261,14 @@ var init_effort3 = __esm(() => {
464153
464261
  });
464154
464262
 
464155
464263
  // native-stub:asciichart
464156
- var noop16 = () => null, handler7, stub8, SandboxManager8, plot6;
464264
+ var noop16 = () => null, handler8, stub8, SandboxManager8, plot6;
464157
464265
  var init_asciichart = __esm(() => {
464158
- handler7 = {
464266
+ handler8 = {
464159
464267
  get(_, prop) {
464160
464268
  if (prop === "__esModule")
464161
464269
  return true;
464162
464270
  if (prop === "default")
464163
- return new Proxy({}, handler7);
464271
+ return new Proxy({}, handler8);
464164
464272
  if (prop === "ExportResultCode")
464165
464273
  return { SUCCESS: 0, FAILED: 1 };
464166
464274
  if (prop === "resourceFromAttributes")
@@ -464170,7 +464278,7 @@ var init_asciichart = __esm(() => {
464170
464278
  return noop16;
464171
464279
  }
464172
464280
  };
464173
- stub8 = new Proxy(noop16, handler7);
464281
+ stub8 = new Proxy(noop16, handler8);
464174
464282
  SandboxManager8 = new Proxy({}, { get: () => noop16 });
464175
464283
  plot6 = noop16;
464176
464284
  });
@@ -492959,8 +493067,8 @@ function useFilePermissionDialog({
492959
493067
  toolUseConfirm.onAllow = (_input, permissionUpdates, feedback3) => {
492960
493068
  originalOnAllow(input, permissionUpdates, feedback3);
492961
493069
  };
492962
- const handler8 = PERMISSION_HANDLERS[option.type];
492963
- handler8(params, {
493070
+ const handler9 = PERMISSION_HANDLERS[option.type];
493071
+ handler9(params, {
492964
493072
  feedback: feedback2,
492965
493073
  hasFeedback: !!feedback2,
492966
493074
  enteredFeedbackMode: option.type === "accept-once" ? yesFeedbackModeEntered : noFeedbackModeEntered,
@@ -516615,14 +516723,14 @@ __export(exports_cacache, {
516615
516723
  ATTR_SERVICE_NAME: () => ATTR_SERVICE_NAME8
516616
516724
  });
516617
516725
  var noop17 = () => null, noopClass6 = class {
516618
- }, handler8, stub9, cacache_default, __stub6 = true, SandboxViolationStore7 = null, SandboxManager9, SandboxRuntimeConfigSchema7, BROWSER_TOOLS6, getMcpConfigForManifest6, ColorDiff7 = null, ColorFile7 = null, getSyntaxTheme8, plot7, createMaximoForChromeMcpServer6, ExportResultCode8, resourceFromAttributes8, Resource6, SimpleSpanProcessor6, BatchSpanProcessor7, NodeTracerProvider6, BasicTracerProvider7, OTLPTraceExporter6, OTLPLogExporter6, OTLPMetricExporter6, PrometheusExporter6, LoggerProvider8, SimpleLogRecordProcessor6, BatchLogRecordProcessor8, MeterProvider7, PeriodicExportingMetricReader7, trace8, context7, SpanStatusCode6, ATTR_SERVICE_NAME8 = "service.name", ATTR_SERVICE_VERSION8 = "service.version", SEMRESATTRS_SERVICE_NAME6 = "service.name", SEMRESATTRS_SERVICE_VERSION6 = "service.version", AggregationTemporality7, DataPointType6, InstrumentType6, PushMetricExporter6, SeverityNumber6;
516726
+ }, handler9, stub9, cacache_default, __stub6 = true, SandboxViolationStore7 = null, SandboxManager9, SandboxRuntimeConfigSchema7, BROWSER_TOOLS6, getMcpConfigForManifest6, ColorDiff7 = null, ColorFile7 = null, getSyntaxTheme8, plot7, createMaximoForChromeMcpServer6, ExportResultCode8, resourceFromAttributes8, Resource6, SimpleSpanProcessor6, BatchSpanProcessor7, NodeTracerProvider6, BasicTracerProvider7, OTLPTraceExporter6, OTLPLogExporter6, OTLPMetricExporter6, PrometheusExporter6, LoggerProvider8, SimpleLogRecordProcessor6, BatchLogRecordProcessor8, MeterProvider7, PeriodicExportingMetricReader7, trace8, context7, SpanStatusCode6, ATTR_SERVICE_NAME8 = "service.name", ATTR_SERVICE_VERSION8 = "service.version", SEMRESATTRS_SERVICE_NAME6 = "service.name", SEMRESATTRS_SERVICE_VERSION6 = "service.version", AggregationTemporality7, DataPointType6, InstrumentType6, PushMetricExporter6, SeverityNumber6;
516619
516727
  var init_cacache = __esm(() => {
516620
- handler8 = {
516728
+ handler9 = {
516621
516729
  get(_, prop) {
516622
516730
  if (prop === "__esModule")
516623
516731
  return true;
516624
516732
  if (prop === "default")
516625
- return new Proxy({}, handler8);
516733
+ return new Proxy({}, handler9);
516626
516734
  if (prop === "ExportResultCode")
516627
516735
  return { SUCCESS: 0, FAILED: 1 };
516628
516736
  if (prop === "resourceFromAttributes")
@@ -516632,7 +516740,7 @@ var init_cacache = __esm(() => {
516632
516740
  return noop17;
516633
516741
  }
516634
516742
  };
516635
- stub9 = new Proxy(noop17, handler8);
516743
+ stub9 = new Proxy(noop17, handler9);
516636
516744
  cacache_default = stub9;
516637
516745
  SandboxManager9 = new Proxy({}, { get: () => noop17 });
516638
516746
  SandboxRuntimeConfigSchema7 = { parse: () => ({}) };
@@ -528745,7 +528853,7 @@ function applyModalPagerAction(s, act, onBeforeJump) {
528745
528853
  }
528746
528854
  }
528747
528855
  }
528748
- var import_react325, WHEEL_ACCEL_WINDOW_MS = 40, WHEEL_ACCEL_STEP = 0.3, WHEEL_ACCEL_MAX = 6, WHEEL_BOUNCE_GAP_MAX_MS = 200, WHEEL_MODE_STEP = 15, WHEEL_MODE_CAP = 15, WHEEL_MODE_RAMP = 3, WHEEL_MODE_IDLE_DISENGAGE_MS = 1500, WHEEL_DECAY_HALFLIFE_MS = 150, WHEEL_DECAY_STEP = 5, WHEEL_BURST_MS = 5, WHEEL_DECAY_GAP_MS = 80, WHEEL_DECAY_CAP_SLOW = 3, WHEEL_DECAY_CAP_FAST = 6, WHEEL_DECAY_IDLE_MS = 500, AUTOSCROLL_LINES = 2, AUTOSCROLL_INTERVAL_MS = 50, AUTOSCROLL_MAX_TICKS = 200;
528856
+ var import_react325, WHEEL_ACCEL_WINDOW_MS = 40, WHEEL_ACCEL_STEP = 0.25, WHEEL_ACCEL_MAX = 4, WHEEL_BOUNCE_GAP_MAX_MS = 200, WHEEL_MODE_STEP = 6, WHEEL_MODE_CAP = 8, WHEEL_MODE_RAMP = 2, WHEEL_MODE_IDLE_DISENGAGE_MS = 1500, WHEEL_DECAY_HALFLIFE_MS = 150, WHEEL_DECAY_STEP = 3, WHEEL_BURST_MS = 5, WHEEL_DECAY_GAP_MS = 80, WHEEL_DECAY_CAP_SLOW = 2, WHEEL_DECAY_CAP_FAST = 4, WHEEL_DECAY_IDLE_MS = 500, AUTOSCROLL_LINES = 2, AUTOSCROLL_INTERVAL_MS = 50, AUTOSCROLL_MAX_TICKS = 200;
528749
528857
  var init_ScrollKeybindingHandler = __esm(() => {
528750
528858
  init_notifications();
528751
528859
  init_useCopyOnSelect();
@@ -530631,8 +530739,8 @@ Error: sandbox required but unavailable: ${reason}
530631
530739
  ]);
530632
530740
  const initialMessageRef = import_react327.useRef(false);
530633
530741
  import_react327.useEffect(() => {
530634
- const pending = initialMessage;
530635
- if (!pending || isLoading || initialMessageRef.current)
530742
+ const pending2 = initialMessage;
530743
+ if (!pending2 || isLoading || initialMessageRef.current)
530636
530744
  return;
530637
530745
  initialMessageRef.current = true;
530638
530746
  async function processInitialMessage(initialMsg) {
@@ -530704,7 +530812,7 @@ Error: sandbox required but unavailable: ${reason}
530704
530812
  ref.current = false;
530705
530813
  }, 100, initialMessageRef);
530706
530814
  }
530707
- processInitialMessage(pending);
530815
+ processInitialMessage(pending2);
530708
530816
  }, [
530709
530817
  initialMessage,
530710
530818
  isLoading,
@@ -532053,16 +532161,16 @@ Note: ctrl + z now suspends Maximo Syntax, ctrl + _ undoes input.
532053
532161
  idleMinutes: idleReturnPending.idleMinutes,
532054
532162
  totalInputTokens: getTotalInputTokens(),
532055
532163
  onDone: async (action2) => {
532056
- const pending = idleReturnPending;
532164
+ const pending2 = idleReturnPending;
532057
532165
  setIdleReturnPending(null);
532058
532166
  logEvent("tengu_idle_return_action", {
532059
532167
  action: action2,
532060
- idleMinutes: Math.round(pending.idleMinutes),
532168
+ idleMinutes: Math.round(pending2.idleMinutes),
532061
532169
  messageCount: messagesRef.current.length,
532062
532170
  totalInputTokens: getTotalInputTokens()
532063
532171
  });
532064
532172
  if (action2 === "dismiss") {
532065
- setInputValue(pending.input);
532173
+ setInputValue(pending2.input);
532066
532174
  return;
532067
532175
  }
532068
532176
  if (action2 === "never") {
@@ -532092,7 +532200,7 @@ Note: ctrl + z now suspends Maximo Syntax, ctrl + _ undoes input.
532092
532200
  bashToolsProcessedIdx.current = 0;
532093
532201
  }
532094
532202
  skipIdleCheckRef.current = true;
532095
- onSubmitRef.current(pending.input, {
532203
+ onSubmitRef.current(pending2.input, {
532096
532204
  setCursorOffset: () => {},
532097
532205
  clearBuffer: () => {},
532098
532206
  resetHistory: () => {}
@@ -533663,7 +533771,7 @@ function SetupRow({ children }) {
533663
533771
  }
533664
533772
  function WelcomeV2() {
533665
533773
  const { columns } = useTerminalSize();
533666
- const version3 = "0.1.21";
533774
+ const version3 = "0.1.23";
533667
533775
  const width = Math.max(48, Math.min(columns || 92, 92));
533668
533776
  const stacked = width < OCTOPUS_COMPACT_WIDTH + 42;
533669
533777
  return /* @__PURE__ */ jsx_runtime479.jsx(ThemedBox_default, {
@@ -545909,6 +546017,21 @@ Error: sandbox required but unavailable: ${sandboxUnavailableReason}
545909
546017
  structuredIO.write(message);
545910
546018
  });
545911
546019
  }
546020
+ if (options2.outputFormat === "stream-json") {
546021
+ registerClassifierDecisionHandler((event) => {
546022
+ structuredIO.write({
546023
+ type: "system",
546024
+ subtype: "classifier_decision",
546025
+ tool_use_id: event.toolUseId,
546026
+ tool_name: event.toolName,
546027
+ decision: event.decision,
546028
+ classifier: event.classifier,
546029
+ reason: event.reason,
546030
+ uuid: randomUUID53(),
546031
+ session_id: getSessionId()
546032
+ });
546033
+ });
546034
+ }
545912
546035
  if (options2.setupTrigger) {
545913
546036
  await processSetupHooks(options2.setupTrigger);
545914
546037
  }
@@ -548604,6 +548727,7 @@ var init_print = __esm(() => {
548604
548727
  init_path2();
548605
548728
  init_queryHelpers();
548606
548729
  init_hookEvents();
548730
+ init_classifierDecisionEvents();
548607
548731
  init_filePersistence();
548608
548732
  init_AsyncHookRegistry();
548609
548733
  init_gracefulShutdown();
@@ -549258,7 +549382,7 @@ var init_server3 = __esm(() => {
549258
549382
  }
549259
549383
  this._capabilities = mergeCapabilities(this._capabilities, capabilities);
549260
549384
  }
549261
- setRequestHandler(requestSchema, handler9) {
549385
+ setRequestHandler(requestSchema, handler10) {
549262
549386
  const shape = getObjectShape(requestSchema);
549263
549387
  const methodSchema = shape?.method;
549264
549388
  if (!methodSchema) {
@@ -549286,7 +549410,7 @@ var init_server3 = __esm(() => {
549286
549410
  throw new McpError(ErrorCode.InvalidParams, `Invalid tools/call request: ${errorMessage4}`);
549287
549411
  }
549288
549412
  const { params } = validatedRequest.data;
549289
- const result = await Promise.resolve(handler9(request, extra));
549413
+ const result = await Promise.resolve(handler10(request, extra));
549290
549414
  if (params.task) {
549291
549415
  const taskValidationResult = safeParse3(CreateTaskResultSchema, result);
549292
549416
  if (!taskValidationResult.success) {
@@ -549304,7 +549428,7 @@ var init_server3 = __esm(() => {
549304
549428
  };
549305
549429
  return super.setRequestHandler(requestSchema, wrappedHandler);
549306
549430
  }
549307
- return super.setRequestHandler(requestSchema, handler9);
549431
+ return super.setRequestHandler(requestSchema, handler10);
549308
549432
  }
549309
549433
  assertCapabilityForMethod(method) {
549310
549434
  switch (method) {
@@ -553574,7 +553698,7 @@ Usage: maximo --remote "your task description"`, () => gracefulShutdown(1));
553574
553698
  pendingHookMessages
553575
553699
  }, renderAndRun);
553576
553700
  }
553577
- }).version("0.1.21 (Maximo Syntax)", "-v, --version", "Output the version number");
553701
+ }).version("0.1.23 (Maximo Syntax)", "-v, --version", "Output the version number");
553578
553702
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
553579
553703
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
553580
553704
  if (canUserConfigureAdvisor()) {
@@ -554105,7 +554229,7 @@ function validateProviderEnvOrExit() {
554105
554229
  async function main2() {
554106
554230
  const args = process.argv.slice(2);
554107
554231
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
554108
- console.log(`${"0.1.21"} (Maximo Syntax)`);
554232
+ console.log(`${"0.1.23"} (Maximo Syntax)`);
554109
554233
  return;
554110
554234
  }
554111
554235
  validateProviderEnvOrExit();
@@ -554182,4 +554306,4 @@ async function main2() {
554182
554306
  }
554183
554307
  main2();
554184
554308
 
554185
- //# debugId=33E2F13A070537E464756E2164756E21
554309
+ //# debugId=A69DD0EA5FE13F0D64756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maximoai/maximo-syntax-cli",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "Maximo Syntax CLI - A powerful AI-powered command-line interface for code development with any LLM",
5
5
  "type": "module",
6
6
  "bin": {