@drisp/cli 0.5.16 → 0.5.18

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.
@@ -8,7 +8,7 @@ import {
8
8
  installWorkflowPlugins,
9
9
  resolveWorkflow,
10
10
  writeGlobalConfig
11
- } from "./chunk-SOW2QPXY.js";
11
+ } from "./chunk-ISU54GPM.js";
12
12
 
13
13
  // src/setup/steps/WorkflowInstallWizard.tsx
14
14
  import { useState, useEffect, useCallback, useRef } from "react";
@@ -92,4 +92,4 @@ function WorkflowInstallWizard({ source, onDone }) {
92
92
  export {
93
93
  WorkflowInstallWizard as default
94
94
  };
95
- //# sourceMappingURL=WorkflowInstallWizard-AY4CPQS2.js.map
95
+ //# sourceMappingURL=WorkflowInstallWizard-IUMUXPKI.js.map
@@ -2440,7 +2440,7 @@ var cachedVersion = null;
2440
2440
  function readVersion() {
2441
2441
  if (cachedVersion !== null) return cachedVersion;
2442
2442
  try {
2443
- const injected = "0.5.16";
2443
+ const injected = "0.5.18";
2444
2444
  if (typeof injected === "string" && injected.length > 0) {
2445
2445
  cachedVersion = injected;
2446
2446
  return cachedVersion;
@@ -1687,7 +1687,7 @@ import fs10 from "fs";
1687
1687
  import path8 from "path";
1688
1688
 
1689
1689
  // src/core/workflows/stateMachine.md
1690
- var stateMachine_default = "# Stateless Session Protocol\n\nYou run in a stateless loop. Each session is a fresh process with no memory of prior sessions. **The tracker file is your only continuity** \u2014 read it, work, write it. Assume interruption: the runner may kill a long session, your context may collapse under tool output, you may hit token limits mid-task. Anything not in the tracker is gone.\n\n## First action, every session\n\n1. Read the tracker at the configured path (default: `.athena/<session_id>/tracker.md`). The runner provides the session ID \u2014 do not invent one.\n2. If the tracker contains `<!-- TRACKER_SKELETON -->` \u2192 this is session 1, run [**Orient**](#orient-session-1).\n3. Otherwise \u2192 this is a continuation, run [**Execute**](#execute-session-2) from where the tracker says, not from the start of the flow.\n\nReading first prevents two failure modes that waste whole sessions: redoing work already done, or contradicting decisions a prior session made.\n\n## Tracker contract\n\nThe tracker must always answer four questions:\n\n1. What are we trying to accomplish?\n2. What has been done?\n3. What's left?\n4. What should the next session do first?\n\nA future session has no other context. If something isn't here, it doesn't exist. Section headings may vary by workflow, but these four answers must be explicit and easy to find.\n\n### Terminal markers\n\nDefault markers (workflows may override \u2014 use the markers configured for the active workflow):\n\n- `<!-- WORKFLOW_COMPLETE -->` \u2014 all work done and verified\n- `<!-- WORKFLOW_BLOCKED -->` or `<!-- WORKFLOW_BLOCKED: reason -->` \u2014 cannot proceed without external intervention\n\nRules:\n\n- Only the last non-empty line of the tracker is authoritative. Marker-like text in notes, examples, or quoted instructions earlier in the file is ignored.\n- The runner trusts markers unconditionally. A premature marker ends the loop with no automatic recovery \u2014 write one only when its criteria are fully met.\n- Include a concrete reason after `WORKFLOW_BLOCKED:` whenever possible; the bare form is still valid.\n\n## Phases\n\n### Orient (session 1)\n\n1. **Replace the skeleton immediately**, before any domain work. Even a three-line tracker (goal + \"orienting\") protects you if the session dies during setup.\n2. Run the workflow's orientation steps. These vary by domain \u2014 a test-writing workflow explores the product in a browser; a migration workflow audits the schema. The workflow defines what orientation means.\n3. Refine the tracker into a granular plan. Each task a concrete, verifiable unit of work, including verification steps (running checks, reviewing output) \u2014 not just implementation. Vague tasks (\"write tests\") cannot be meaningfully resumed by a future session that has no idea what they mean here.\n4. Record concrete observations \u2014 what you actually saw, not what you assumed. Wrong assumptions burn entire future sessions on rework.\n5. **Single-turn requests still go through this phase.** If the entire request is satisfied in one turn, write a minimal tracker (what was asked, what was done, the outcome) and append `<!-- WORKFLOW_COMPLETE -->`. Leaving the skeleton in place causes the runner to classify the session as a failure.\n\n### Execute (session 2+)\n\n- Work from where the tracker says, in the workflow's prescribed sequence. Not every session covers every step.\n- If the workflow defines a skill table, **load the relevant skill before each activity**. Skills carry the implementation detail (scaffolding steps, locator rules, anti-patterns, code templates) that this protocol intentionally doesn't repeat.\n- Delegate heavy exploration or generation to subagents via the Task tool. Pass file paths, conventions, and concrete output expectations; tell them which skill to load. Respect the workflow's **delegation constraints** \u2014 some operations must run in the main agent because their output is proof, or because the main agent needs to interpret results in context.\n- Run quality gates in order. Do not skip \u2014 they exist because skipping cascades into rework. On a failing verdict, address the issues and re-run before proceeding. Respect the workflow's **retry limits**: repeated failure usually signals a deeper issue another retry won't fix.\n\n### End\n\n1. Tracker reflects all progress, discoveries, and blockers.\n2. Tracker says clearly what the next session should do first.\n3. If all work is verified: append the completion marker.\n4. If an unrecoverable blocker prevents progress: append the blocked marker, with a reason if you have one.\n\n## When to write the tracker\n\nWrite on **concrete triggers**, not on a vague sense of \"meaningful progress.\" The right cadence sits between every-tool-call (noisy log, wastes tokens) and end-of-session (everything lost if you die mid-task).\n\n- **Discrete unit done** \u2014 file written, fix applied, test run, gate passed. Reflect the new reality before starting the next unit.\n- **Insight learned** \u2014 API quirk, config field that turned out to matter, dead end ruled out, decision between two approaches. Insights are tracker-worthy even when no code changed; rediscovering them costs the next session a full re-exploration. The tracker is a knowledge ledger, not just a task log.\n- **About to do something risky or long-running** \u2014 subagent dispatch, long build, flaky external call, large refactor. Write _first_, then act. If the operation kills your session, only what's on disk survives.\n- **Plan changed** \u2014 task resequenced, new task surfaced, planned task no longer needed. Stale plans poison continuation sessions.\n- **You haven't written in a while** \u2014 if you can't remember the last update, you've gone too long. A short defensive update (\"doing X, last completed Y, next is Z\") beats nothing.\n\nEach update covers: what changed (work or knowledge), what's now next, and any caveat the next session needs. Don't transcribe tool calls \u2014 the tracker is a contract with your future self, not a replay log.\n\nThe cost of one extra tracker update is a few tokens. The cost of dying without one is a whole wasted session. Bias toward writing.\n\n## Task UI projection\n\nThe tracker is the durable source of truth. Your harness's task tools are a session-scoped UI projection of the same plan, shown to the user in their CLI widget. They do not survive process exit.\n\n{{TASK_TOOL_INSTRUCTIONS}}\n\n- **Session 1, after orientation:** project the tracker's task plan into the task tools.\n- **Session 2+, after reading the tracker:** recreate the projection from the tracker; do not assume task IDs from prior sessions still exist.\n- **During work:** update both \u2014 the task tools for immediate UI feedback, the tracker for persistence \u2014 in the same working phase.\n\n## Session bounding\n\nEach fresh session starts with a clean context window and a compact tracker \u2014 effectively self-compaction. As you work, context fills with tool outputs and intermediate state. The longer you run, the more attention is spread across tokens that are no longer relevant, degrading precision on the work that matters now.\n\nWork a bounded chunk per session. Ending early and letting the next session pick up from a clean tracker is almost always better than pushing through with a heavy context. Natural checkpoints:\n\n- After a quality gate\n- After crossing multiple phases (explored \u2192 planned \u2192 wrote specs) \u2014 stop before pushing into the next\n- When your context is visibly heavy with tool output from earlier work\n\n## Quick reference\n\n- [ ] Read the tracker before doing anything else\n- [ ] Replace the skeleton immediately, even for single-turn requests\n- [ ] Update on concrete triggers \u2014 unit done, insight learned, risky op pending, plan changed\n- [ ] Project the tracker plan into task tools at session start; keep both in sync as work lands\n- [ ] Load the workflow's skill before each activity\n- [ ] Run quality gates in order; respect delegation constraints and retry limits\n- [ ] Write the completion marker only when all work is verified\n- [ ] Checkpoint and end before context goes stale\n";
1690
+ var stateMachine_default = "# Stateless Turn Protocol\n\nYou run in a stateless loop. Each Turn is a fresh process with no memory of prior Turns. **The tracker file is your only continuity** \u2014 read it, work, write it. Assume interruption: the runner may kill a long Turn, your context may collapse under tool output, you may hit token limits mid-task. Anything not in the tracker is gone.\n\n## First action, every Turn\n\n1. Read the tracker at the configured path (default: `.athena/<session_id>/tracker.md`). The runner provides the session ID \u2014 do not invent one.\n2. If the tracker contains `<!-- TRACKER_SKELETON -->` \u2192 this is Turn 1, run [**Orient**](#orient-turn-1).\n3. Otherwise \u2192 this is a continuation, run [**Execute**](#execute-turn-2) from where the tracker says, not from the start of the flow.\n\nReading first prevents two failure modes that waste whole Turns: redoing work already done, or contradicting decisions a prior Turn made.\n\n## Tracker contract\n\nThe tracker must always answer four questions:\n\n1. What are we trying to accomplish?\n2. What has been done?\n3. What's left?\n4. What should the next Turn do first?\n\nA future Turn has no other context. If something isn't here, it doesn't exist. Section headings may vary by workflow, but these four answers must be explicit and easy to find.\n\n### Terminal markers\n\nDefault markers (workflows may override \u2014 use the markers configured for the active workflow):\n\n- `<!-- WORKFLOW_COMPLETE -->` \u2014 all work done and verified\n- `<!-- WORKFLOW_BLOCKED -->` or `<!-- WORKFLOW_BLOCKED: reason -->` \u2014 cannot proceed without external intervention\n\nRules:\n\n- Only the last non-empty line of the tracker is authoritative. Marker-like text in notes, examples, or quoted instructions earlier in the file is ignored.\n- The runner trusts markers unconditionally. A premature marker ends the loop with no automatic recovery \u2014 write one only when its criteria are fully met.\n- Include a concrete reason after `WORKFLOW_BLOCKED:` whenever possible; the bare form is still valid.\n\n## Phases\n\n### Orient (Turn 1)\n\n1. **Replace the skeleton immediately**, before any domain work. Even a three-line tracker (goal + \"orienting\") protects you if the Turn dies during setup.\n2. Run the workflow's orientation steps. These vary by domain \u2014 a test-writing workflow explores the product in a browser; a migration workflow audits the schema. The workflow defines what orientation means.\n3. Refine the tracker into a granular plan. Each task a concrete, verifiable unit of work, including verification steps (running checks, reviewing output) \u2014 not just implementation. Vague tasks (\"write tests\") cannot be meaningfully resumed by a future Turn that has no idea what they mean here.\n4. Record concrete observations \u2014 what you actually saw, not what you assumed. Wrong assumptions burn entire future Turns on rework.\n5. **Single-Turn requests still go through this phase.** If the entire request is satisfied in one Turn, write a minimal tracker (what was asked, what was done, the outcome) and append `<!-- WORKFLOW_COMPLETE -->`. Leaving the skeleton in place causes the runner to classify the Turn as a failure.\n\n### Execute (Turn 2+)\n\n- Work from where the tracker says, in the workflow's prescribed sequence. Not every Turn covers every step.\n- If the workflow defines a skill table, **load the relevant skill before each activity**. Skills carry the implementation detail (scaffolding steps, locator rules, anti-patterns, code templates) that this protocol intentionally doesn't repeat.\n- Delegate heavy exploration or generation to subagents via the Task tool. Pass file paths, conventions, and concrete output expectations; tell them which skill to load. Respect the workflow's **delegation constraints** \u2014 some operations must run in the main agent because their output is proof, or because the main agent needs to interpret results in context.\n- Run quality gates in order. Do not skip \u2014 they exist because skipping cascades into rework. On a failing verdict, address the issues and re-run before proceeding. Respect the workflow's **retry limits**: repeated failure usually signals a deeper issue another retry won't fix.\n\n### End\n\n1. Tracker reflects all progress, discoveries, and blockers.\n2. Tracker says clearly what the next Turn should do first.\n3. If all work is verified: append the completion marker.\n4. If an unrecoverable blocker prevents progress: append the blocked marker, with a reason if you have one.\n\n## When to write the tracker\n\nWrite on **concrete triggers**, not on a vague sense of \"meaningful progress.\" The right cadence sits between every-tool-call (noisy log, wastes tokens) and end-of-Turn (everything lost if you die mid-task).\n\n- **Discrete unit done** \u2014 file written, fix applied, test run, gate passed. Reflect the new reality before starting the next unit.\n- **Insight learned** \u2014 API quirk, config field that turned out to matter, dead end ruled out, decision between two approaches. Insights are tracker-worthy even when no code changed; rediscovering them costs the next Turn a full re-exploration. The tracker is a knowledge ledger, not just a task log.\n- **About to do something risky or long-running** \u2014 subagent dispatch, long build, flaky external call, large refactor. Write _first_, then act. If the operation kills your Turn, only what's on disk survives.\n- **Plan changed** \u2014 task resequenced, new task surfaced, planned task no longer needed. Stale plans poison continuation Turns.\n- **You haven't written in a while** \u2014 if you can't remember the last update, you've gone too long. A short defensive update (\"doing X, last completed Y, next is Z\") beats nothing.\n\nEach update covers: what changed (work or knowledge), what's now next, and any caveat the next Turn needs. Don't transcribe tool calls \u2014 the tracker is a contract with your future self, not a replay log.\n\nThe cost of one extra tracker update is a few tokens. The cost of dying without one is a whole wasted Turn. Bias toward writing.\n\n## Task UI projection\n\nThe tracker is the durable source of truth. Your harness's task tools are a Turn-scoped UI projection of the same plan, shown to the user in their CLI widget. They do not survive process exit.\n\n{{TASK_TOOL_INSTRUCTIONS}}\n\n- **Turn 1, after orientation:** project the tracker's task plan into the task tools.\n- **Turn 2+, after reading the tracker:** recreate the projection from the tracker; do not assume task IDs from prior Turns still exist.\n- **During work:** update both \u2014 the task tools for immediate UI feedback, the tracker for persistence \u2014 in the same working phase.\n\n## Turn bounding\n\nEach fresh Turn starts with a clean context window and a compact tracker \u2014 effectively self-compaction. As you work, context fills with tool outputs and intermediate state. The longer you run, the more attention is spread across tokens that are no longer relevant, degrading precision on the work that matters now.\n\nWork a bounded chunk per Turn. Ending early and letting the next Turn pick up from a clean tracker is almost always better than pushing through with a heavy context. Natural checkpoints:\n\n- After a quality gate\n- After crossing multiple phases (explored \u2192 planned \u2192 wrote specs) \u2014 stop before pushing into the next\n- When your context is visibly heavy with tool output from earlier work\n\n## Quick reference\n\n- [ ] Read the tracker before doing anything else\n- [ ] Replace the skeleton immediately, even for single-Turn requests\n- [ ] Update on concrete triggers \u2014 unit done, insight learned, risky op pending, plan changed\n- [ ] Project the tracker plan into task tools at Turn start; keep both in sync as work lands\n- [ ] Load the workflow's skill before each activity\n- [ ] Run quality gates in order; respect delegation constraints and retry limits\n- [ ] Write the completion marker only when all work is verified\n- [ ] Checkpoint and end before context goes stale\n";
1691
1691
 
1692
1692
  // src/core/workflows/stateMachine.ts
1693
1693
  function buildTaskToolInstructions(harness) {
@@ -1886,7 +1886,7 @@ var TRACKER_SKELETON_TEMPLATE = `${TRACKER_SKELETON_MARKER}
1886
1886
  ---
1887
1887
 
1888
1888
  > This tracker was created by the runner. Update it as you work.
1889
- > See the Stateless Session Protocol for tracker conventions.
1889
+ > See the Stateless Turn Protocol for tracker conventions.
1890
1890
 
1891
1891
  ## Status
1892
1892
 
@@ -2237,4 +2237,4 @@ export {
2237
2237
  compileWorkflowPlan,
2238
2238
  collectMcpServersWithOptions
2239
2239
  };
2240
- //# sourceMappingURL=chunk-SOW2QPXY.js.map
2240
+ //# sourceMappingURL=chunk-ISU54GPM.js.map
@@ -34,7 +34,7 @@ import {
34
34
  resolveWorkflow,
35
35
  resolveWorkflowInstall,
36
36
  resolveWorkflowPlugins
37
- } from "./chunk-SOW2QPXY.js";
37
+ } from "./chunk-ISU54GPM.js";
38
38
 
39
39
  // src/infra/daemon/stateDir.ts
40
40
  import fs from "fs";
@@ -18274,4 +18274,4 @@ export {
18274
18274
  startUdsServer,
18275
18275
  sendUdsRequest
18276
18276
  };
18277
- //# sourceMappingURL=chunk-PWXH6WWV.js.map
18277
+ //# sourceMappingURL=chunk-TYTYZDXL.js.map
package/dist/cli.js CHANGED
@@ -97,7 +97,7 @@ import {
97
97
  writeAttachmentMirror,
98
98
  writeGatewayClientConfig,
99
99
  wsClientOptionsForEndpoint
100
- } from "./chunk-PWXH6WWV.js";
100
+ } from "./chunk-TYTYZDXL.js";
101
101
  import {
102
102
  generateId as generateId2
103
103
  } from "./chunk-BTKQ67RE.js";
@@ -157,7 +157,7 @@ import {
157
157
  useWorkflowSessionController,
158
158
  writeGlobalConfig,
159
159
  writeProjectConfig
160
- } from "./chunk-SOW2QPXY.js";
160
+ } from "./chunk-ISU54GPM.js";
161
161
 
162
162
  // src/app/entry/cli.tsx
163
163
  import { render } from "ink";
@@ -3592,8 +3592,8 @@ var ShellInputImpl = forwardRef(function ShellInput({
3592
3592
  ShellInputImpl.displayName = "ShellInput";
3593
3593
  var ShellInput2 = React2.memo(ShellInputImpl);
3594
3594
 
3595
- // src/ui/hooks/useAppMode.ts
3596
- function useAppMode(isClaudeRunning, currentPermissionRequest, currentQuestionRequest, startupFailureMessage) {
3595
+ // src/shared/utils/deriveAppMode.ts
3596
+ function deriveAppMode(isClaudeRunning, currentPermissionRequest, currentQuestionRequest, startupFailureMessage) {
3597
3597
  if (startupFailureMessage) {
3598
3598
  return { type: "startup_failed", message: startupFailureMessage };
3599
3599
  }
@@ -4105,19 +4105,19 @@ function useMessageKeyboard({
4105
4105
  return;
4106
4106
  }
4107
4107
  if (key.pageUp) {
4108
- callbacks.moveCursor(-pageStep);
4108
+ callbacks.scrollByLines(-pageStep);
4109
4109
  return;
4110
4110
  }
4111
4111
  if (key.pageDown) {
4112
- callbacks.moveCursor(pageStep);
4112
+ callbacks.scrollByLines(pageStep);
4113
4113
  return;
4114
4114
  }
4115
4115
  if (key.upArrow) {
4116
- callbacks.moveCursor(-1);
4116
+ callbacks.scrollByLines(-1);
4117
4117
  return;
4118
4118
  }
4119
4119
  if (key.downArrow) {
4120
- callbacks.moveCursor(1);
4120
+ callbacks.scrollByLines(1);
4121
4121
  return;
4122
4122
  }
4123
4123
  } finally {
@@ -9307,6 +9307,18 @@ function maxMessageCursor(ctx) {
9307
9307
  function maxMessageViewportStart(ctx) {
9308
9308
  return ctx.messageContentRows <= 0 ? 0 : Math.max(0, ctx.messageEntryCount - ctx.messageContentRows);
9309
9309
  }
9310
+ function entryAtLine(offsets, line) {
9311
+ if (offsets.length === 0) return 0;
9312
+ let result = 0;
9313
+ for (let i = 0; i < offsets.length; i++) {
9314
+ if (offsets[i] <= line) {
9315
+ result = i;
9316
+ } else {
9317
+ break;
9318
+ }
9319
+ }
9320
+ return result;
9321
+ }
9310
9322
  function resolveIdToIndex(entries, cursorId) {
9311
9323
  if (cursorId === null) return -1;
9312
9324
  return entries.findIndex((e) => e.id === cursorId);
@@ -9330,7 +9342,7 @@ function computeFeedState(cursorIndex, viewportStart, tailFollow, ctx) {
9330
9342
  feedViewportStart: s.viewportStart
9331
9343
  };
9332
9344
  }
9333
- function computeMessageState(viewportStart, tailFollow, cursorIndex, ctx) {
9345
+ function computeMessageState(viewportStart, tailFollow, ctx) {
9334
9346
  const mc = maxMessageCursor(ctx);
9335
9347
  const ms = maxMessageViewportStart(ctx);
9336
9348
  if (tailFollow) {
@@ -9340,19 +9352,8 @@ function computeMessageState(viewportStart, tailFollow, cursorIndex, ctx) {
9340
9352
  messageCursorIndex: ctx.messageEntryLength > 0 ? mc : 0
9341
9353
  };
9342
9354
  }
9343
- const nextCursor = ctx.messageEntryLength > 0 ? clamp(cursorIndex, 0, mc) : 0;
9344
- let nextStart = clamp(viewportStart, 0, ms);
9345
- const offsets = ctx.messageEntryLineOffsets;
9346
- if (offsets.length > 0 && nextCursor < offsets.length) {
9347
- const cursorLineStart = offsets[nextCursor];
9348
- if (cursorLineStart < nextStart) {
9349
- nextStart = cursorLineStart;
9350
- }
9351
- if (cursorLineStart >= nextStart + ctx.messageContentRows) {
9352
- nextStart = cursorLineStart - ctx.messageContentRows + 1;
9353
- }
9354
- nextStart = clamp(nextStart, 0, ms);
9355
- }
9355
+ const nextStart = clamp(viewportStart, 0, ms);
9356
+ const nextCursor = ctx.messageEntryLength > 0 ? clamp(entryAtLine(ctx.messageEntryLineOffsets, nextStart), 0, mc) : 0;
9356
9357
  return {
9357
9358
  messageTailFollow: false,
9358
9359
  messageViewportStart: nextStart,
@@ -9410,7 +9411,6 @@ function resolveSessionUiState(state, ctx) {
9410
9411
  const msgState = computeMessageState(
9411
9412
  state.messageViewportStart,
9412
9413
  state.messageTailFollow,
9413
- state.messageCursorIndex,
9414
9414
  ctx
9415
9415
  );
9416
9416
  const todoCursor = resolveTodoCursor(state, ctx);
@@ -9640,44 +9640,18 @@ function reduceSessionUiState(state, action, ctx) {
9640
9640
  if (current.messagePanelTab === action.tab) return current;
9641
9641
  return { ...current, messagePanelTab: action.tab };
9642
9642
  case "scroll_message_viewport":
9643
- return withMessageChange(current, {
9644
- messageTailFollow: false,
9645
- messageViewportStart: clamp(
9646
- current.messageViewportStart + action.delta,
9647
- 0,
9648
- maxMessageViewportStart(ctx)
9649
- ),
9650
- messageCursorIndex: ctx.messageEntryLength > 0 ? clamp(current.messageCursorIndex, 0, maxMessageCursor(ctx)) : 0
9651
- });
9652
- case "move_message_cursor": {
9653
- const mc = maxMessageCursor(ctx);
9654
- const requested = current.messageCursorIndex + action.delta;
9655
- const actual = ctx.messageEntryLength > 0 ? clamp(requested, 0, mc) : 0;
9656
- if (actual === current.messageCursorIndex && action.delta !== 0) {
9657
- return withMessageChange(current, {
9658
- messageTailFollow: false,
9659
- messageViewportStart: clamp(
9660
- current.messageViewportStart + action.delta,
9661
- 0,
9662
- maxMessageViewportStart(ctx)
9663
- ),
9664
- messageCursorIndex: actual
9665
- });
9666
- }
9667
9643
  return withMessageChange(
9668
9644
  current,
9669
- computeMessageState(current.messageViewportStart, false, actual, ctx)
9645
+ computeMessageState(
9646
+ current.messageViewportStart + action.delta,
9647
+ false,
9648
+ ctx
9649
+ )
9670
9650
  );
9671
- }
9672
9651
  case "jump_message_tail":
9673
9652
  return withMessageChange(
9674
9653
  current,
9675
- computeMessageState(
9676
- current.messageViewportStart,
9677
- true,
9678
- current.messageCursorIndex,
9679
- ctx
9680
- )
9654
+ computeMessageState(current.messageViewportStart, true, ctx)
9681
9655
  );
9682
9656
  case "jump_message_top":
9683
9657
  return withMessageChange(current, {
@@ -10032,7 +10006,7 @@ function AppContent({
10032
10006
  const metrics = useHeaderMetrics(feedEvents);
10033
10007
  sessionTelemetryMetricsRef.current = metrics;
10034
10008
  useTerminalTitle(workflow?.name, isHarnessRunning);
10035
- const appMode = useAppMode(
10009
+ const appMode = deriveAppMode(
10036
10010
  isHarnessRunning,
10037
10011
  currentPermissionRequest,
10038
10012
  currentQuestionRequest,
@@ -10783,7 +10757,7 @@ function AppContent({
10783
10757
  isActive: focusMode === "messages" && !dialogActive && !pagerActive,
10784
10758
  pageStep: messagePageStep,
10785
10759
  callbacks: {
10786
- moveCursor: (delta) => dispatchUi({ type: "move_message_cursor", delta }),
10760
+ scrollByLines: (delta) => dispatchUi({ type: "scroll_message_viewport", delta }),
10787
10761
  jumpToTail: () => dispatchUi({ type: "jump_message_tail" }),
10788
10762
  jumpToTop: () => dispatchUi({ type: "jump_message_top" }),
10789
10763
  yankAtCursor: yankMessageAtCursor,
@@ -12681,7 +12655,7 @@ var cachedVersion = null;
12681
12655
  function readPackageVersion() {
12682
12656
  if (cachedVersion !== null) return cachedVersion;
12683
12657
  try {
12684
- const injected = "0.5.16";
12658
+ const injected = "0.5.18";
12685
12659
  if (typeof injected === "string" && injected.length > 0) {
12686
12660
  cachedVersion = injected;
12687
12661
  return cachedVersion;
@@ -15428,7 +15402,7 @@ Available commands: ${[...KNOWN_COMMANDS].join(", ")}`
15428
15402
  await exitWith(1);
15429
15403
  return;
15430
15404
  }
15431
- const { default: WorkflowInstallWizard } = await import("./WorkflowInstallWizard-AY4CPQS2.js");
15405
+ const { default: WorkflowInstallWizard } = await import("./WorkflowInstallWizard-IUMUXPKI.js");
15432
15406
  const { waitUntilExit } = render(
15433
15407
  /* @__PURE__ */ jsx25(
15434
15408
  WorkflowInstallWizard,
@@ -3,13 +3,13 @@ import {
3
3
  ensureDaemonStateDir,
4
4
  runDashboardRuntimeDaemon,
5
5
  startUdsServer
6
- } from "./chunk-PWXH6WWV.js";
6
+ } from "./chunk-TYTYZDXL.js";
7
7
  import "./chunk-BTKQ67RE.js";
8
8
  import {
9
9
  readDashboardClientConfig,
10
10
  refreshDashboardAccessToken
11
11
  } from "./chunk-BTY7MYYT.js";
12
- import "./chunk-SOW2QPXY.js";
12
+ import "./chunk-ISU54GPM.js";
13
13
 
14
14
  // src/infra/daemon/logFile.ts
15
15
  import fs from "fs";
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "hooks",
18
18
  "dashboard"
19
19
  ],
20
- "version": "0.5.16",
20
+ "version": "0.5.18",
21
21
  "license": "MIT",
22
22
  "bin": {
23
23
  "athena": "dist/cli.js",