Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
450dc3c
feat(amicode): CredentialStore seam — company-compute backend + golde…
kateebonner Jul 20, 2026
c1d877a
feat(amicode): atomic 0600-at-birth credential writer (159/S1 AC2)
kateebonner Jul 20, 2026
234f81c
test(amicode): injected-failure atomicity coverage for the credential…
kateebonner Jul 20, 2026
8c45bd3
test(amicode): pasqal golden fixture + poison coverage — token-only a…
kateebonner Jul 20, 2026
e91ba3e
test(amicode): tolerant credential read path — absent, never a throw …
kateebonner Jul 20, 2026
5c027e9
style(amicode): prettier pass on the credential store and its tests
kateebonner Jul 20, 2026
2b36794
merge: issue #162 (frontier via worktree)
kateebonner Jul 20, 2026
4f99fd8
test+feat(amicode): probe-first classification for Company Compute ke…
kateebonner Jul 20, 2026
455b4cc
test+feat(amicode): redacting-whitelist status renderer + connections…
kateebonner Jul 20, 2026
d6efc05
test+feat(amicode): submit-credential path — probe → seam write → ter…
kateebonner Jul 20, 2026
889eb39
test+feat(amicode): disconnect + revalidate round out the lifecycle (…
kateebonner Jul 20, 2026
fd6df1c
test+feat(amicode): loopback guard — mutations refuse non-loopback bi…
kateebonner Jul 20, 2026
7c144d9
test+feat(amicode): register /amicode/connections routes; standalone-…
kateebonner Jul 20, 2026
ab07412
fix(amicode): the recorded bind dies with its listener (165 AC5 harde…
kateebonner Jul 20, 2026
b88820e
docs(amicode): flag the per-id probe branch point for the Pasqal slic…
kateebonner Jul 20, 2026
8f0ed98
merge: issue #165 (frontier via worktree)
kateebonner Jul 20, 2026
cc86f7b
test+feat(amicode): tolerant connections wire parser — unknown states…
kateebonner Jul 20, 2026
22205bf
test+feat(amicode): HP flip on valid Company Compute save — grant iss…
kateebonner Jul 20, 2026
681f0ba
test+feat(amicode): card model — distinct copy + flags per contract s…
kateebonner Jul 20, 2026
200fbfb
test+feat(amicode): only the valid outcome flips; repeat saves stay i…
kateebonner Jul 20, 2026
d7e5ae9
test+feat(amicode): submit gate + one-round-trip overlay — empty subm…
kateebonner Jul 20, 2026
476838c
test+feat(amicode): flip trouble never corrupts the save — connected …
kateebonner Jul 20, 2026
916084e
test(amicode): flip artifacts asserted over the real route tree (167 …
kateebonner Jul 20, 2026
ae19888
merge: issue #167 (frontier via worktree)
kateebonner Jul 20, 2026
9bd3cf6
feat(amicode): Connections tab — Company Compute card beside vaults i…
kateebonner Jul 20, 2026
90ea264
merge: issue #166 (frontier via worktree)
kateebonner Jul 20, 2026
b03bdd3
test+feat(amicode): Pasqal card — validator spawn seam + token-only p…
kateebonner Jul 20, 2026
6497428
test+feat(amicode): Pasqal exit-code classes — invalid/unreachable/un…
kateebonner Jul 20, 2026
fa8de9a
test+feat(amicode): Pasqal null token → session-only connected, gone …
kateebonner Jul 20, 2026
b8c0374
test(amicode): adversarial password scan — every outcome class, every…
kateebonner Jul 20, 2026
bade1f4
test+feat(amicode): Pasqal revalidate — token-mode freshness, never a…
kateebonner Jul 20, 2026
6ee6436
test(amicode): Pasqal asserted over the real route tree with a REAL s…
kateebonner Jul 20, 2026
af4c012
test+feat(amicode): Pasqal card UI — credentials form, device list, s…
kateebonner Jul 20, 2026
e309af9
fix(amicode): type the stub-validator record with its argv field (tsgo)
kateebonner Jul 20, 2026
3206405
merge: issue #169 (frontier via worktree)
kateebonner Jul 20, 2026
501ccd5
test+feat(amicode): mtime staleness + non-blocking background revalid…
kateebonner Jul 20, 2026
a8568b5
test(amicode): unparseable credential files render needs-key — locked…
kateebonner Jul 20, 2026
1386a3c
test+feat(amicode): offline boot — connected + last-verified line, ne…
kateebonner Jul 20, 2026
648a5d4
test+feat(amicode): submitter identity echo + explicit drift diff (17…
kateebonner Jul 20, 2026
2859ea5
test+feat(amicode): past expiry renders the reconnect prompt at read …
kateebonner Jul 20, 2026
d06040c
test(amicode): resilience asserted over the REAL route tree + prettie…
kateebonner Jul 20, 2026
108e588
merge: issue #170 (frontier via worktree)
kateebonner Jul 20, 2026
c76749a
fix(auth): serve the app's fingerprinted /assets/* without server auth
kateebonner Jul 20, 2026
ca69ef0
fix(auth): serve the widget-frame document without server auth
kateebonner Jul 20, 2026
a0b67cb
fix(ui): un-hide the status popover — it now hosts Vaults + Connections
kateebonner Jul 20, 2026
b2d49b2
feat(app): framed-app clipboard fallback for every editable (175)
kateebonner Jul 20, 2026
b9e8605
feat(app): status-popover policy model — trigger/dot split + global t…
kateebonner Jul 20, 2026
6714742
feat(app,ui): mount the clipboard fallback; opt out elements owning t…
kateebonner Jul 20, 2026
64edf12
merge: issue #175 (clipboard bridge for all editables)
kateebonner Jul 20, 2026
845dfc1
feat(app): global Connections entry on home chrome + un-gated session…
kateebonner Jul 20, 2026
5b0def9
merge: issue #174 (global Connections entry on the home chrome)
kateebonner Jul 20, 2026
2ed6938
polish(connections): design-system Buttons for card actions
kateebonner Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions packages/app/src/components/prompt-input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1547,6 +1547,10 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
<div class="relative max-h-[180px] overflow-y-auto no-scrollbar" ref={(el) => (scrollRef = el)}>
<div
data-component="prompt-input"
// Owns its own bridged ⌘V (handleKeyDown + the image pipeline) —
// opt out of the app-wide clipboard fallback so paste never
// double-fires (see utils/global-clipboard.ts).
data-amc-clipboard="self"
ref={(el) => {
editorRef = el
props.ref?.(el)
Expand Down Expand Up @@ -1726,6 +1730,10 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
>
<div
data-component="prompt-input"
// Owns its own bridged ⌘V (handleKeyDown + the image pipeline) —
// opt out of the app-wide clipboard fallback so paste never
// double-fires (see utils/global-clipboard.ts).
data-amc-clipboard="self"
ref={(el) => {
editorRef = el
props.ref?.(el)
Expand Down
29 changes: 21 additions & 8 deletions packages/app/src/components/session/session-header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,15 @@ import { messageAgentColor } from "@/utils/agent"
import { decode64 } from "@/utils/base64"
import { Persist, persisted } from "@/utils/persist"
import { StatusPopover, StatusPopoverV2 } from "../status-popover"
import { statusTriggerVisibility } from "../status-popover-model"

// AMICODE: the MCP/LSP/Plugins/Vaults status popover is opencode-operator
// noise here ("No MCPs configured"). Hidden, not deleted — the trigger slot is
// where a solver-health panel (server/Julia env/runs dir) belongs later.
const AMICODE_HIDE_STATUS_POPOVER = true
// Un-hidden 2026-07-20 (amicode#159 test drive): the 7/7 hide targeted the
// popover's then-only content (upstream MCP/LSP operator noise). It now hosts
// the amicode-first Vaults + Connections tabs — hiding it orphaned both.
const AMICODE_HIDE_STATUS_POPOVER = false
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"

Expand Down Expand Up @@ -164,7 +168,14 @@ export function SessionHeader() {
const search = createMemo(() => (isDesktopV2() ? settings.general.showSearch() : true))
const tree = createMemo(() => (isDesktopV2() ? settings.general.showFileTree() : true))
const term = createMemo(() => (isDesktopV2() ? settings.general.showTerminal() : true))
const status = createMemo(() => (isDesktopV2() ? settings.general.showStatus() : true))
// AMICODE (#174 AC2): unlike its siblings above, showStatus no longer gates
// the whole trigger — the popover now hosts the global Connections + Vaults
// tabs, and the setting defaults OFF, which orphaned them in every session.
// The settings row sells "server status", so that is all it scopes now: the
// health dot. Policy + rationale live in status-popover-model.ts (tested).
const statusVis = createMemo(() =>
statusTriggerVisibility({ desktopV2: isDesktopV2(), showStatus: settings.general.showStatus() }),
)

const [exists, setExists] = createStore<Partial<Record<OpenApp, boolean>>>({
finder: true,
Expand Down Expand Up @@ -239,7 +250,7 @@ export function SessionHeader() {
messageAgentColor(params.id ? sync.data.message[params.id] : undefined, sync.data.agent),
)
const v2ActionsState = createMemo<SessionHeaderV2ActionsState>(() => ({
statusVisible: status(),
statusDotVisible: statusVis().healthDot,
statusLabel: language.t("status.popover.trigger"),
reviewLabel: language.t("command.review.toggle"),
reviewKeybind: command.keybind("review.toggle"),
Expand Down Expand Up @@ -444,9 +455,9 @@ export function SessionHeader() {
</div>
</Show>
<div class="flex items-center gap-1">
<Show when={!AMICODE_HIDE_STATUS_POPOVER && status()}>
<Show when={!AMICODE_HIDE_STATUS_POPOVER && statusVis().trigger}>
<Tooltip placement="bottom" value={language.t("status.popover.trigger")}>
<StatusPopover />
<StatusPopover healthDot={statusVis().healthDot} />
</Tooltip>
</Show>
<Show when={term()}>
Expand Down Expand Up @@ -525,7 +536,9 @@ export function SessionHeader() {
}

type SessionHeaderV2ActionsState = {
statusVisible: boolean
/** AMICODE (#174 AC2): the trigger itself always renders in a session; the
* show-status setting only drives this health-dot flag. */
statusDotVisible: boolean
statusLabel: string
reviewLabel: string
reviewKeybind: string
Expand All @@ -536,9 +549,9 @@ type SessionHeaderV2ActionsState = {
function SessionHeaderV2Actions(props: { state: SessionHeaderV2ActionsState }) {
return (
<div class="flex items-center gap-2">
<Show when={!AMICODE_HIDE_STATUS_POPOVER && props.state.statusVisible}>
<Show when={!AMICODE_HIDE_STATUS_POPOVER}>
<Tooltip placement="bottom" value={props.state.statusLabel}>
<StatusPopoverV2 />
<StatusPopoverV2 healthDot={props.state.statusDotVisible} />
</Tooltip>
</Show>
<TooltipKeybind title={props.state.reviewLabel} keybind={props.state.reviewKeybind}>
Expand Down
Loading
Loading