Skip to content

Replace self-update with local history; rename apiclient to transport - #16

Open
LarssonSv wants to merge 1 commit into
mainfrom
feature/transport-and-history
Open

Replace self-update with local history; rename apiclient to transport#16
LarssonSv wants to merge 1 commit into
mainfrom
feature/transport-and-history

Conversation

@LarssonSv

Copy link
Copy Markdown

Restructures the CLI's support layer.

  • Rename internal/apiclientinternal/transport; new transport.OpenSettings owns the settings-page browser hop
  • Remove self-update entirely (internal/selfupdate, abstr upgrade, background release check) — updates belong to the installer
  • New internal/history package: local, size-capped log of buffered exchanges, exposed as abstr history [list|path|clear]
  • Config: drop auto_upgrade bookkeeping; add browser_command and history_limit
  • render.Errorf removed in favor of plain Error; new render.Success

🤖 Generated with Claude Code

- Rename internal/apiclient to internal/transport; add transport.OpenSettings
so the login flow no longer wires the browser hop itself
- Remove the self-update machinery (internal/selfupdate, abstr upgrade, the
background release check) — installs are owned by the installer now
- Add internal/history: a local, size-capped log of buffered exchanges, with
an abstr history command (list/path/clear)
- Config: drop auto_upgrade/update bookkeeping; add browser_command and
history_limit (env: ABSTR_BROWSER, ABSTR_HISTORY)
- Render: replace Errorf with Success; browser opens honour browser_command
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@abstraction-comabstraction-comBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

This PR adds authenticated workspace chat transport and local conversation history while removing the CLI self-update workflow.

Areas touched:

  • Added authenticated workspace, review, chat, buffered-ask, streaming-ask, and SSE handling through Client.
  • Added bounded local exchange persistence and history list, path, and clear commands through Store.
  • Replaced upgrade settings with browser-command and history-limit resolution in Config.
  • Updated replModel to resume chats, restore pull-request scope, and replay readable transcript turns.
  • Centralized terminal Markdown, color, diagnostics, and agent-output routing through Renderer.

How to review:

  • Trace the streaming handoff from AskStream to startTurn, including output, status, conversation, and completion messages.
  • Verify chat loading and resumeConversation preserve session identifiers, pull-request context, transcript ordering, and unreadable-exchange handling.
  • Check first-use authentication and workspace selection through ensureConfigured, including retry, cancellation, and non-blocking configuration saves.
  • Confirm successful one-shot requests record history before terminal or piped output, without changing the command’s exit status.

Review

Two real bugs — block on fixes.

Checks

CheckStatusDetails
Test code must not be reachable from production✅ Successall assertions passed
Controllers must not access the database directly✅ Successall assertions passed
Sensitive personal data should not flow into logs⚠️ Warning4 elements match
Credentials should not flow into logs⚠️ Warning35 elements match

Affected Concepts

  • CLI Commands & REPL
  • API Client
  • Support Utilities (Update, Render, Config, Browser, Entry)
  • abstraction-dev/cli
  • Abstraction

Reviewed deccac2 · 2026-08-21 09:04 UTC

View full report · Re-run review


// Append records one exchange, trimming the file to the newest limit entries.
// A blank question or answer is dropped: a cancelled turn is not history.
func (s *Store) Append(e Entry) error {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data lossAppend

Concurrent CLI processes can read the same history snapshot and overwrite each other's updates, silently losing completed exchanges.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Append
File: internal/history/history.go (lines 72-91)
Category: Data loss
Concurrent CLI processes can read the same history snapshot and overwrite each other's updates, silently losing completed exchanges.


// listHistory prints the newest entries, one row each: when, workspace, and the
// question collapsed to the terminal width.
func listHistory(store *history.Store, r *render.Renderer, limit int) int {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic errorlistHistory

The fixed 32-column prefix allowance undercounts non-UTC RFC3339 timestamps, causing long history rows to exceed the terminal width.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: listHistory
File: internal/cli/history.go (lines 68-88)
Category: Logic error
The fixed 32-column prefix allowance undercounts non-UTC RFC3339 timestamps, causing long history rows to exceed the terminal width.

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds local conversation history, configurable browser and history settings, and a dedicated API transport layer while removing self-update behavior.

Areas touched:

  • Added authenticated workspace, chat, review, buffered-question, and SSE APIs through Client.
  • Added bounded, newest-first local exchange storage and history listing, clearing, and formatting through Store.
  • Replaced upgrade settings with browser-command and history-limit resolution in Config.
  • Added browser-command-aware settings launching through OpenWithConfig.
  • Centralized terminal detection, Markdown formatting, and color-aware diagnostic routing in Renderer.

How to review:

  • Verify the handoff from AskStream to sseReader preserves event boundaries, callbacks, termination, and stream errors.
  • Trace one-shot execution through history recording and terminal-versus-piped output handling.
  • Check interactive chat resume restores transcript turns, prompt history, pull-request scope, and unreadable-exchange messaging.
  • Verify authentication bootstrapping, workspace selection, configuration persistence, and exit-code classification remain consistent.

Review

One history data-loss race needs fixing.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 09:10 UTC

View full report · Re-run review


// Append records one exchange, trimming the file to the newest limit entries.
// A blank question or answer is dropped: a cancelled turn is not history.
func (s *Store) Append(e Entry) error {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data lossAppend

Append performs an unlocked read-modify-write of the shared history file, so simultaneous CLI invocations can overwrite one another and silently lose completed entries.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Append
File: internal/history/history.go (lines 72-91)
Category: Data loss
Append performs an unlocked read-modify-write of the shared history file, so simultaneous CLI invocations can overwrite one another and silently lose completed entries.

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

This PR adds persisted exchange history and chat resumption while consolidating API transport, configuration, and terminal interaction behavior.

Areas touched:

  • Centralizes authenticated workspace, review, chat, buffered ask, and SSE calls in Client.
  • Adds bounded local exchange history with listing, clearing, timestamps, and configurable retention through Store.
  • Replaces upgrade settings with browser-command and history-limit resolution in Config.
  • Routes the new history command and records successful one-shot answers through Main.
  • Loads chats, replays transcripts, restores pull-request scope, and continues sessions in resumeConversation.

How to review:

  • Verify the SSE event lifecycle in AskStream, including stream completion, status, output, conversation, and error handling.
  • Trace the handoff from startTurn to AskStream for cancellation, asynchronous messages, and loader updates.
  • Check history recording from runImmediate through Store, including disabled storage and write failures.
  • Verify chat loading and transcript restoration preserve session identifiers, pull-request context, input history, and unreadable exchanges.

Review

LGTM.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 09:28 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds persistent conversation history and a consolidated transport-backed chat experience while removing automatic self-updates.

Areas touched:

  • Consolidates authenticated workspace, PR, chat, buffered, and streaming API behavior in Client.
  • Adds local JSON recording, newest-first listing, truncation, and clearing through Store.
  • Replaces upgrade settings with browser-command and history-limit resolution in Config.
  • Routes terminal responses through Markdown formatting while preserving clean piped output in Renderer.
  • Adds history commands and removes upgrade command dispatch from Main.

How to review:

Review

LGTM.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 09:43 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds persisted exchange history and chat-resume support while consolidating API/SSE transport, configuration behavior, and terminal output handling.

Areas touched:

  • Centralizes authenticated JSON/SSE API operations and chat/workspace models in Client.
  • Records one-shot question/answer exchanges and adds list, path, and clear commands via Store.
  • Adds browser-command and history-limit resolution to Config, replacing automatic-upgrade settings.
  • Resumes chats by replaying readable turns and restoring pull-request scope in resumeConversation.
  • Routes colored terminal diagnostics while preserving raw piped answers through Renderer.

How to review:

  • Verify streamed callbacks, completion messages, and cancellation flow from AskStream through startTurn.
  • Trace chat loading through GetChat into resumeConversation, including unreadable exchanges and pull-request restoration.
  • Check history writes after buffered answers and newest-first trimming through recordHistory and Recent.
  • Verify first-run authentication, browser fallback, workspace selection, and exit classification through ensureConfigured.

Review

LGTM.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 14:01 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds local conversation history, a centralized authenticated transport layer, configurable browser behavior, and chat resumption while removing self-update flows.

Areas touched:

  • Adds authenticated workspace, PR review, chat, buffered ask, and SSE streaming operations in Client.
  • Persists completed one-shot exchanges and exposes history listing, path, and clear commands through Store.
  • Replaces upgrade settings with browser command and history retention resolution in Config.
  • Records answers and restores remote transcripts, prompt history, PR scope, and chat state through runImmediate and resumeConversation.
  • Routes terminal responses and diagnostics with optional color while preserving clean piped output in Renderer.

How to review:

  • Trace streamed SSE callbacks from AskStream through startTurn into reactive REPL messages and cancellation.
  • Verify resumeConversation reconstructs transcript entries, input history, PR context, selection state, and unreadable-exchange notices.
  • Check recordHistory and Store preserve bounded, newest-first history without affecting successful answers.
  • Check ensureConfigured coordinates API-key validation, browser launching, workspace selection, and best-effort persistence.

Review

LGTM.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 14:10 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds local conversation history and a consolidated transport layer while removing release self-updates and extending CLI configuration and output behavior.

Areas touched:

  • Added authenticated workspace, review, chat, buffered-ask, and SSE streaming operations through Client.
  • Added bounded local history recording and history listing, path, and clear commands via Store.
  • Replaced upgrade settings with browser-command and history-limit configuration, including environment resolution through Config.
  • Updated one-shot and interactive ask flows to persist answers while preserving raw piped output and terminal Markdown formatting.
  • Added configurable browser launching and green success diagnostics through OpenWithConfig and Success.

How to review:

  • Trace runAsk through ensureConfigured, request execution, history recording, rendering, and exit-code handling.
  • Verify AskStream SSE event parsing, callback delivery, cancellation, stream termination, and conversation-session propagation.
  • Check chat loading and transcript reconstruction preserve PR scope, prompt history, unreadable exchanges, and picker state.
  • Confirm removal of update-check and self-upgrade paths is reflected consistently in command dispatch, usage text, and persisted configuration.

Review

LGTM.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-21 14:30 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds persisted exchange history and chat resumption while consolidating API transport, configuration behavior, and CLI command routing.

Areas touched:

  • AskStream sends authenticated streaming requests and dispatches conversation, output, status, and error events.
  • resumeConversation rebuilds REPL transcripts, prompt history, session IDs, and pull-request scope from loaded chats.
  • runImmediate records completed exchanges, retaining formatted terminal output and raw piped responses.
  • runConfigSet replaces auto-upgrade settings with browser-command and history-retention configuration.
  • Main replaces upgrade and update command routing with history inspection and clearing commands.

How to review:

  • Check AskStream event parsing and the handoff into streamed REPL callbacks, including conversation identifiers and cancellation.
  • Trace loadChatCmd to resumeConversation for transcript replay, session restoration, and pull-request scope recovery.
  • Verify recordHistory and runHistory use the same resolved path, retention limit, and newest-first ordering.
  • Check ensureConfigured through API-key bootstrap, browser launching, workspace selection, and configuration persistence.

Review

One real data-loss race — block on making history updates concurrency-safe.

  • Data lossStore.Append: Append performs an unlocked read-modify-write on the shared history file, so concurrent CLI runs can overwrite one another's entries and silently lose history.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"
Säkert✅ Successno added functions named "Security Test"

Affected Concepts

  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
  • abstraction-dev/cli
  • CLI

Reviewed deccac2 · 2026-08-26 13:04 UTC

View full report · Re-run review

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

This PR adds persisted exchange history and chat resumption while consolidating API access and removing the CLI’s automatic upgrade flow.

Areas touched:

  • Workspaces adds authenticated workspace, PR-review, chat, buffered-question, and SSE request flows.
  • Append stores bounded local exchanges, with newest-first listing and clear/path commands through runHistory.
  • runConfigSet manages browser-command and history-limit settings with environment-aware resolution.
  • runImmediate records completed answers while preserving rendered terminal output and raw piped Markdown.
  • resumeConversation restores chat transcripts, prompt history, pull-request scope, and unreadable-exchange notices.

How to review:

Review

One backward-compatibility regression — restore the upgrade/update route.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"
Säkert✅ Successno added functions named "Security Test"

Affected Concepts

  • CLI
  • abstraction-dev/cli
  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)

Reviewed deccac2 · 2026-08-26 13:21 UTC

View full report · Re-run review

Comment threadinternal/cli/root.go
return runConfig(args[1:])
case "upgrade", "update":
return runUpgrade(ctx, args[1:])
case "history":

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BugMain

Removing the upgrade/update routing causes existing invocations to be submitted as questions instead of performing release updates.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Main
File: internal/cli/root.go (lines 16-39)
Category: Bug
Removing the upgrade/update routing causes existing invocations to be submitted as questions instead of performing release updates.

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds transport-backed API access, local conversation history, configurable browser behavior, and a history command while removing self-update functionality.

Areas touched:

  • AskStream adds authenticated buffered and SSE-backed workspace questions, chat retrieval, and PR-review APIs.
  • recordHistory persists completed one-shot exchanges with bounded, timestamped storage exposed by runHistory.
  • runConfigSet replaces auto-upgrade settings with browser-command and history-limit configuration.
  • ensureConfigured and bootstrapAPIKey use configured browser launching during authentication and workspace setup.
  • Main removes upgrade commands and registers history listing, path, and clearing.

How to review:

Review

Two real bugs — block on fixes.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"
Säkert✅ Successno added functions named "Security Test"

Affected Concepts

  • CLI
  • abstraction-dev/cli
  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)

Reviewed deccac2 · 2026-08-26 13:27 UTC

View full report · Re-run review

const historyListDefault = 20

// runHistory inspects or clears the locally stored exchanges.
func runHistory(args []string) int {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data lossrunHistory

Trailing positional arguments are ignored, so a malformed history clear ... invocation still deletes history instead of returning a usage error.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: runHistory
File: internal/cli/history.go (lines 18-64)
Category: Data loss
Trailing positional arguments are ignored, so a malformed `history clear ...` invocation still deletes history instead of returning a usage error.

Comment threadinternal/cli/repl.go
// normalised URL equality (so http/https and trailing-slash variants resolve),
// then by the PR number in its /pull/<n> path as a fallback.
func matchPRReview(reviews []apiclient.PRReview, url string) *apiclient.PRReview {
func matchPRReview(reviews []transport.PRReview, url string) *transport.PRReview {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic errormatchPRReview

When exact URL matching fails, the fallback uses only the repository-scoped PR number and can select a review from another repository in the workspace.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: matchPRReview
File: internal/cli/repl.go (lines 893-905)
Category: Logic error
When exact URL matching fails, the fallback uses only the repository-scoped PR number and can select a review from another repository in the workspace.

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

This PR adds shared API transport, local conversation history, chat resumption, and configuration-driven terminal behavior while removing built-in release updates.

Areas touched:

  • New centralizes authenticated workspace, review, chat, buffered-question, and SSE operations in the transport layer.
  • Append persists bounded exchanges, while runHistory exposes newest-first listing, paths, and clearing.
  • runAsk records one-shot answers and separates rendered terminal Markdown from raw piped output through New.
  • runConfigSet manages browser and history settings; OpenWithConfig applies browser commands, while Main removes upgrade commands.
  • resumeConversation restores chat turns, pull-request scope, and prompt history in the interactive REPL.

How to review:

Review

One data-loss bug in history clearing — block on a fix.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"
Säkert✅ Successno added functions named "Security Test"

Affected Concepts

  • CLI
  • abstraction-dev/cli
  • CLI Application & REPL
  • API Client
  • Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)

Reviewed deccac2 · 2026-08-26 13:37 UTC

View full report · Re-run review

const historyListDefault = 20

// runHistory inspects or clears the locally stored exchanges.
func runHistory(args []string) int {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Data lossrunHistory

Arguments after the action are silently ignored, so history clear --config X clears the default store rather than the requested file, risking unintended history deletion.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: runHistory
File: internal/cli/history.go (lines 18-64)
Category: Data loss
Arguments after the action are silently ignored, so `history clear --config X` clears the default store rather than the requested file, risking unintended history deletion.

@abstraction-developabstraction-developBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change Summary

Adds authenticated API transport, local exchange history, configurable browser launching, and replaces built-in release updating with history commands.

Areas touched:

How to review:

Review

One user-visible REPL history bug needs a fix.

Checks

CheckStatusDetails
No simon✅ Successno added functions named "simon"
Säkert✅ Successno added functions named "Security Test"

Affected Concepts

Reviewed deccac2 · 2026-08-26 14:24 UTC

View full report · Re-run review

Comment threadinternal/cli/repl.go
// scope, so the status bar says what the answers are grounded in and starting a new
// conversation keeps that grounding.
func (m *replModel) resumeConversation(loaded apiclient.ChatWithMessages) {
func (m *replModel) resumeConversation(loaded transport.ChatWithMessages) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic errorresumeConversation

Each resume appends all restored user turns to existing input history, so reopening the same chat repeatedly duplicates prompts during up-arrow recall.

Explain · Fix in Claude Code · Fix in Codex

Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: resumeConversation
File: internal/cli/repl.go (lines 660-698)
Category: Logic error
Each resume appends all restored user turns to existing input history, so reopening the same chat repeatedly duplicates prompts during up-arrow recall.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@LarssonSv