From fbf3932e6970d86a9320c0ff9cd5c01e3551afc6 Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 6 Nov 2026 13:39:00 +0000 Subject: [PATCH 01/10] Support managed one-time human command approvals --- README.md | 9 +++ internal/codex/approval_options.go | 4 ++ internal/codex/daemon_status_unix.go | 15 ++++- internal/codex/session_approval.go | 10 +++ internal/codex/session_approval_unix.go | 2 +- internal/codex/session_approval_unix_test.go | 49 +++++++++++++++ internal/codex/session_context.go | 13 ++-- internal/codex/session_context_daemon.go | 15 ++++- internal/codex/session_human_approval_test.go | 44 +++++++++++++ internal/codex/session_settings_unix_test.go | 62 ++++++++++--------- internal/ui/model.go | 4 ++ internal/ui/monitor_context.go | 3 + internal/ui/monitor_detail.go | 3 + internal/ui/monitor_detail_test.go | 11 ++++ internal/web/control.go | 22 ++++--- .../{index-BcNMhG4h.js => index-CJs9l6nA.js} | 48 +++++++------- internal/web/dist/index.html | 2 +- internal/web/server.go | 3 + internal/web/state.go | 59 ++++++++++-------- web/src/SessionActions.svelte | 4 ++ web/src/contracts.generated.ts | 2 + 21 files changed, 283 insertions(+), 101 deletions(-) create mode 100644 internal/codex/session_human_approval_test.go rename internal/web/dist/assets/{index-BcNMhG4h.js => index-CJs9l6nA.js} (83%) diff --git a/README.md b/README.md index 031b3585..2986adf6 100644 --- a/README.md +++ b/README.md @@ -2100,6 +2100,15 @@ visually marked with a vertical rail. Formatting uses validated structured fields rather than guessing command boundaries from the justification. Legacy or incomplete requests retain their original bounded text. +**Managed human approvals (Codex 0.167+):** a managed command policy can require +fresh approval each time, even when ordinary approvals have been saved or +reviewed automatically. The terminal and writable web mode offer **APPROVE ONCE**, +**DECLINE**, and **REJECT & STOP TURN**, with a **HUMAN APPROVAL REQUIRED** label. +Session-wide and persistent grants cannot satisfy these checkpoints. `--no-confirm` +can remove the extra confirmation step, but every request still needs an explicit +human action. Passive observation and read-only web mode do not advertise support +for answering these checkpoints; use a capable native Codex client there. + **File-change approvals (shared app-server only):** proposed additions, deletions and updates are shown as scrollable patches, with file paths, rename destinations, old/new line numbers and green additions/red removals. An overall `+N / −N` diff --git a/internal/codex/approval_options.go b/internal/codex/approval_options.go index b5b846e6..5efacc54 100644 --- a/internal/codex/approval_options.go +++ b/internal/codex/approval_options.go @@ -10,6 +10,10 @@ import ( // Value selects an advertised option; Wire is the validated server payload. type ApprovalOption struct{ Kind, Value, Wire, Detail string } +func oneTimeApproval(kind string) bool { + return kind == "accept" || kind == "decline" || kind == "cancel" +} + func (o ApprovalOption) GrantsPermission() bool { return o.Kind == "accept" || o.Kind == "acceptForSession" || o.Kind == "acceptWithExecpolicyAmendment" } diff --git a/internal/codex/daemon_status_unix.go b/internal/codex/daemon_status_unix.go index d810dd4d..0a7a301b 100644 --- a/internal/codex/daemon_status_unix.go +++ b/internal/codex/daemon_status_unix.go @@ -24,6 +24,7 @@ const ( ) type daemonStatusProvider struct { + humanApprovals bool commandGeneration uint64 commandTransitions map[string]uint64 queueRevision uint64 @@ -300,6 +301,7 @@ func (p *daemonStatusProvider) ensureConnected(ctx context.Context) error { return nil } p.connection = connection + humanApprovals := p.humanApprovals p.wire = wire p.commandGeneration++ p.commandTransitions = make(map[string]uint64) @@ -318,7 +320,7 @@ func (p *daemonStatusProvider) ensureConnected(ctx context.Context) error { } if err := p.request(ctx, "initialize", map[string]any{ "clientInfo": codexometerClientInfo(), - "capabilities": map[string]any{"experimentalApi": true}, + "capabilities": map[string]any{"experimentalApi": true, "requiredHumanApproval": humanApprovals}, }, &initialized); err != nil { p.disconnect(connection) return err @@ -665,3 +667,14 @@ func (p *daemonStatusProvider) disconnect(connection *websocket.Conn) { type daemonResponseError struct{ payload string } func (e *daemonResponseError) Error() string { return e.payload } + +func (p *daemonStatusProvider) setHumanApprovalSupport(enabled bool) { + p.mu.Lock() + changed := p.humanApprovals != enabled + p.humanApprovals = enabled + connection := p.connection + p.mu.Unlock() + if changed && connection != nil { + p.disconnect(connection) + } +} diff --git a/internal/codex/session_approval.go b/internal/codex/session_approval.go index 97cf00da..7dbac7e9 100644 --- a/internal/codex/session_approval.go +++ b/internal/codex/session_approval.go @@ -29,3 +29,13 @@ func (c Client) RespondSessionApproval(ctx context.Context, token, decision stri } return errors.New("approval unavailable; respond in Codex") } + +// SetSessionHumanApprovalSupport is configured by interactive adapters before +// observation starts. Passive clients must not claim they can present a decision. +func (c Client) SetSessionHumanApprovalSupport(enabled bool) { + if c.LiveUsage != nil { + if p, ok := c.LiveUsage.statusProvider.(interface{ setHumanApprovalSupport(bool) }); ok { + p.setHumanApprovalSupport(enabled) + } + } +} diff --git a/internal/codex/session_approval_unix.go b/internal/codex/session_approval_unix.go index ae6b5aba..15094d3b 100644 --- a/internal/codex/session_approval_unix.go +++ b/internal/codex/session_approval_unix.go @@ -44,7 +44,7 @@ func (p *daemonStatusProvider) RespondSessionApproval(ctx context.Context, token } var wire string for _, option := range s.requests[id].ApprovalOptions { - if option.Kind != "" && option.Value == decision { + if option.Kind != "" && option.Value == decision && (!s.requests[id].RequiredHumanApproval || oneTimeApproval(option.Kind)) { wire = option.Wire break } diff --git a/internal/codex/session_approval_unix_test.go b/internal/codex/session_approval_unix_test.go index 4d9d682f..7dc196a9 100644 --- a/internal/codex/session_approval_unix_test.go +++ b/internal/codex/session_approval_unix_test.go @@ -56,6 +56,28 @@ func TestApprovalWireOneUseAndDisconnect(t *testing.T) { t.Fatal("file capability reused") } } + p.contexts, c = approvalFixture(t, map[string]any{"kind": "humanCommand", "availableDecisions": []string{"accept", "acceptForSession"}}) + // Defend at the response boundary even if a caller hands us a malformed option snapshot. + human := p.contexts["root"].requests[`"req"`] + human.ApprovalOptions[1] = ApprovalOption{Kind: "acceptForSession", Value: "acceptForSession", Wire: `"acceptForSession"`} + p.contexts["root"].requests[`"req"`] = human + if err := p.RespondSessionApproval(context.Background(), c.ApprovalToken, "acceptForSession"); err == nil { + t.Fatal("checkpoint accepted a reusable grant") + } + if err := p.RespondSessionApproval(context.Background(), c.ApprovalToken, "accept"); err != nil { + t.Fatal(err) + } + select { + case msg := <-received: + if string(msg["result"]) != `{"decision":"accept"}` { + t.Fatal("wrong human decision", msg) + } + case <-time.After(time.Second): + t.Fatal("missing human decision") + } + if p.SessionApprovalPending(c.ApprovalToken) { + t.Fatal("human decision capability reused") + } p.contexts, c = approvalFixture(t, nil) if !p.SessionApprovalPending(c.ApprovalToken) { t.Fatal("missing pending") @@ -184,3 +206,30 @@ func TestDaemonSuccessfulCompletionIsSeparateFromIdle(t *testing.T) { }) } } + +func TestHumanApprovalCapabilityNegotiated(t *testing.T) { + p, fixture := newQuotaDaemon(t) + p.setHumanApprovalSupport(true) + if err := p.ensureConnected(context.Background()); err != nil { + t.Fatal(err) + } + fixture.mu.Lock() + defer fixture.mu.Unlock() + capabilities, _ := fixture.initializeParams["capabilities"].(map[string]any) + if capabilities["requiredHumanApproval"] != true || capabilities["experimentalApi"] != true { + t.Fatal("human approval capability missing", capabilities) + } +} + +func TestPassiveClientDoesNotClaimHumanApprovalSupport(t *testing.T) { + p, fixture := newQuotaDaemon(t) + if err := p.ensureConnected(context.Background()); err != nil { + t.Fatal(err) + } + fixture.mu.Lock() + defer fixture.mu.Unlock() + capabilities, _ := fixture.initializeParams["capabilities"].(map[string]any) + if capabilities["requiredHumanApproval"] != false { + t.Fatal("passive observer claimed approval support", capabilities) + } +} diff --git a/internal/codex/session_context.go b/internal/codex/session_context.go index 46f6ae83..3db19e82 100644 --- a/internal/codex/session_context.go +++ b/internal/codex/session_context.go @@ -26,12 +26,13 @@ const ( // SessionContext is a bounded, memory-only excerpt, never a generated summary. // It is deliberately separate from token accounting and persisted preferences. type SessionContext struct { - FailureCode string - CurrentTask string - LatestGuidance string - LatestGuidanceID string - Streaming bool - Activity SessionActivity + RequiredHumanApproval bool + FailureCode string + CurrentTask string + LatestGuidance string + LatestGuidanceID string + Streaming bool + Activity SessionActivity // ApprovalContext is preceding same-thread/turn prose captured when the // request arrived. Display-only: never part of the authorised action. ApprovalContext string diff --git a/internal/codex/session_context_daemon.go b/internal/codex/session_context_daemon.go index b1845ac2..113c3629 100644 --- a/internal/codex/session_context_daemon.go +++ b/internal/codex/session_context_daemon.go @@ -160,7 +160,7 @@ func daemonContextEvent(states map[string]*daemonContextState, method string, id return case "item/commandExecution/requestApproval": kind := "command" // legacy servers omit the discriminator - kindValid := len(p.Kind) == 0 || json.Unmarshal(p.Kind, &kind) == nil && kind == "command" && string(p.Kind) != "null" + kindValid := len(p.Kind) == 0 || json.Unmarshal(p.Kind, &kind) == nil && (kind == "command" || kind == "humanCommand") && string(p.Kind) != "null" var command string commandValid := len(p.Command) == 0 || string(p.Command) == "null" || json.Unmarshal(p.Command, &command) == nil previous := state.commands[p.TurnID+"/"+p.ItemID] @@ -171,6 +171,7 @@ func daemonContextEvent(states map[string]*daemonContextState, method string, id p.CWD = previous.CWD } c.Kind = SessionContextApproval + c.RequiredHumanApproval = kindValid && kind == "humanCommand" c.Text = strings.TrimSpace(p.Reason + "\nCommand: " + command + "\nDirectory: " + p.CWD) special := func(raw json.RawMessage) bool { return len(raw) > 0 && string(raw) != "null" } if special(p.Network) { @@ -180,6 +181,18 @@ func daemonContextEvent(states map[string]*daemonContextState, method string, id c.Text += "\nPermissions: " + string(p.Permissions) } c.ApprovalOptions, c.ApprovalDecisions = commandApprovalOptions(p.Decisions) + if c.RequiredHumanApproval { + c.Text = "HUMAN APPROVAL REQUIRED\nManaged policy requires approval each time.\n" + c.Text + var once [8]ApprovalOption + n := 0 + for _, option := range c.ApprovalOptions { + if oneTimeApproval(option.Kind) { + once[n] = option + n++ + } + } + c.ApprovalOptions = once + } for _, option := range c.ApprovalOptions { if option.Detail != "" { c.Text += "\nPersistent command-prefix rule: " + option.Detail diff --git a/internal/codex/session_human_approval_test.go b/internal/codex/session_human_approval_test.go new file mode 100644 index 00000000..4cd041ee --- /dev/null +++ b/internal/codex/session_human_approval_test.go @@ -0,0 +1,44 @@ +package codex + +import ( + "encoding/json" + "testing" + "time" +) + +func TestHumanApprovalRequiresFreshOneTimeDecision(t *testing.T) { + states := map[string]*daemonContextState{} + raw := rawJSON(map[string]any{"threadId": "root", "turnId": "turn", "itemId": "checkpoint", "approvalId": "unique", "kind": "humanCommand", "command": "git push", "cwd": "/work", "availableDecisions": []any{"acceptForSession", map[string]any{"acceptWithExecpolicyAmendment": map[string]any{"execpolicy_amendment": []string{"git"}}}, "accept", "decline", "cancel"}}) + emit := func() { + daemonContextEvent(states, "item/commandExecution/requestApproval", json.RawMessage(`"human"`), raw, time.Now()) + } + emit() + c := states["root"].requests[`"human"`] + if !c.RequiredHumanApproval || c.ApprovalToken == "" || c.CommandDetails.Command != "git push" { + t.Fatal("checkpoint without a preceding execution item was not actionable", c) + } + if len(states["root"].commands) != 0 || states["root"].activity.snapshot().RunningCommands != 0 { + t.Fatal("checkpoint invented a running command") + } + for i, kind := range []string{"accept", "decline", "cancel"} { + if c.ApprovalOptions[i].Kind != kind { + t.Fatal("one-time decisions were lost", c.ApprovalOptions) + } + } + if c.ApprovalOptions[3].Kind != "" { + t.Fatal("checkpoint offered a reusable grant") + } + emit() + replay := states["root"].requests[`"human"`] + if replay.ApprovalToken == c.ApprovalToken { + t.Fatal("replayed checkpoint retained its old capability") + } + daemonContextEvent(states, "serverRequest/resolved", nil, rawJSON(map[string]any{"threadId": "root", "requestId": "human"}), time.Now()) + if len(states["root"].requests) != 0 { + t.Fatal("resolved checkpoint still pending") + } + _, invalid := approvalFixture(t, map[string]any{"kind": "humanCommand", "availableDecisions": []string{"acceptForSession"}}) + if invalid.ApprovalToken != "" { + t.Fatal("checkpoint with only reusable choices became actionable") + } +} diff --git a/internal/codex/session_settings_unix_test.go b/internal/codex/session_settings_unix_test.go index 7b8b5478..5737dafc 100644 --- a/internal/codex/session_settings_unix_test.go +++ b/internal/codex/session_settings_unix_test.go @@ -17,36 +17,37 @@ import ( ) type quotaDaemonFixture struct { - mu sync.Mutex - sessions map[string]QuotaSession - writes []map[string]any - fail string - queued bool - notify bool - started chan struct{} - release chan struct{} - commandStatus string - catalogues map[string]map[string]any - historyReads []map[string]any - names map[string]string - nameWrites []map[string]any - cwds map[string]string - ignoreCwd bool - environments []any - permissions map[string]string - resumeReads []map[string]any - hookReads []map[string]any - threadHooks map[string]any - hookError map[string]any - goals map[string]*SessionGoal - goalReads int - goalWrites []map[string]any - goalMethods []string - ignoreGoal bool - goalReadError map[string]any - goalReadHook func() - goalNoReply map[string]bool - threadReads int + initializeParams map[string]any + mu sync.Mutex + sessions map[string]QuotaSession + writes []map[string]any + fail string + queued bool + notify bool + started chan struct{} + release chan struct{} + commandStatus string + catalogues map[string]map[string]any + historyReads []map[string]any + names map[string]string + nameWrites []map[string]any + cwds map[string]string + ignoreCwd bool + environments []any + permissions map[string]string + resumeReads []map[string]any + hookReads []map[string]any + threadHooks map[string]any + hookError map[string]any + goals map[string]*SessionGoal + goalReads int + goalWrites []map[string]any + goalMethods []string + ignoreGoal bool + goalReadError map[string]any + goalReadHook func() + goalNoReply map[string]bool + threadReads int } func TestQuotaEffortDefaultFallback(t *testing.T) { @@ -128,6 +129,7 @@ func newQuotaDaemonTransport(t *testing.T, compressed bool) (*daemonStatusProvid id, _ := req.Params["threadId"].(string) switch req.Method { case "initialize": + fixture.initializeParams = req.Params result["userAgent"] = "test" case "model/list": result["data"] = []any{map[string]any{"model": "small", "supportedReasoningEfforts": []any{map[string]any{"reasoningEffort": "medium"}}, "serviceTiers": []any{map[string]any{"id": "flex", "name": "Fast"}, map[string]any{"id": "priority", "name": "Slow"}}}} diff --git a/internal/ui/model.go b/internal/ui/model.go index c10e772a..1d096d29 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -426,6 +426,10 @@ var quotaFooterButtonDefinitions = []footerButton{ } func New(fetcher Fetcher, refreshEvery time.Duration) Model { + if client, ok := fetcher.(interface{ SetSessionHumanApprovalSupport(bool) }); ok { + client.SetSessionHumanApprovalSupport(true) + } + if refreshEvery <= 0 { refreshEvery = time.Minute } diff --git a/internal/ui/monitor_context.go b/internal/ui/monitor_context.go index 5cbdbda3..e2a89e27 100644 --- a/internal/ui/monitor_context.go +++ b/internal/ui/monitor_context.go @@ -37,6 +37,9 @@ func contextTitle(c codex.SessionContext) string { case codex.SessionContextQuestion: return i18n.Text("QUESTION") case codex.SessionContextApproval: + if c.RequiredHumanApproval { + return i18n.Text("HUMAN APPROVAL REQUIRED") + } return i18n.Text("APPROVAL REQUEST") default: return i18n.Text("LAST ACTIVITY") diff --git a/internal/ui/monitor_detail.go b/internal/ui/monitor_detail.go index d7e873a6..d3010f3b 100644 --- a/internal/ui/monitor_detail.go +++ b/internal/ui/monitor_detail.go @@ -131,6 +131,9 @@ func (m Model) contextDetailDocument(width int) (document []detailLine) { } else if c.Kind == codex.SessionContextApproval && c.CommandDetails.Command != "" { section(contextTitle(c)) d := c.CommandDetails + if c.RequiredHumanApproval { + appendText(i18n.Text("Managed policy requires approval each time."), "warning", "") + } if strings.TrimSpace(d.Justification) != "" { section(i18n.Text("JUSTIFICATION")) appendText(sanitize(d.Justification), "body", "") diff --git a/internal/ui/monitor_detail_test.go b/internal/ui/monitor_detail_test.go index 876016cc..875cbad8 100644 --- a/internal/ui/monitor_detail_test.go +++ b/internal/ui/monitor_detail_test.go @@ -112,3 +112,14 @@ func TestApprovalDetailKeepsCommandWhitespaceAndControls(t *testing.T) { t.Fatal("display formatting changed the original approval") } } + +func TestHumanApprovalUsesExistingReviewWithClearPolicyLabel(t *testing.T) { + m := approvalTestModel() + c := &m.monitorSessionData[0].preview + c.RequiredHumanApproval = true + c.CommandDetails = codex.ApprovalCommandDetails{Command: "git push", Directory: "/work"} + text := strings.Join(m.contextDetailLines(120), "\n") + if !strings.Contains(text, "HUMAN APPROVAL REQUIRED") || !strings.Contains(text, "Managed policy requires approval each time.") { + t.Fatal("missing human checkpoint explanation", text) + } +} diff --git a/internal/web/control.go b/internal/web/control.go index 4540a625..8db868f9 100644 --- a/internal/web/control.go +++ b/internal/web/control.go @@ -49,16 +49,17 @@ type actionQuestion struct { } type actionOffer struct { - FileChanges []codex.FileDiffLine `json:"fileChanges,omitempty"` - Profile *profileReview `json:"profile,omitempty"` - ID string `json:"id"` - Session string `json:"session"` - Thread string `json:"thread"` - Directory string `json:"directory"` - Kind string `json:"kind"` - Command string `json:"command"` - Choices []actionChoice `json:"choices"` - Questions []actionQuestion `json:"questions"` + RequiredHumanApproval bool `json:"requiredHumanApproval,omitempty"` + FileChanges []codex.FileDiffLine `json:"fileChanges,omitempty"` + Profile *profileReview `json:"profile,omitempty"` + ID string `json:"id"` + Session string `json:"session"` + Thread string `json:"thread"` + Directory string `json:"directory"` + Kind string `json:"kind"` + Command string `json:"command"` + Choices []actionChoice `json:"choices"` + Questions []actionQuestion `json:"questions"` } type offeredAction struct { @@ -119,6 +120,7 @@ func (c *control) offer(id string) (offeredAction, error) { return o, nil } o.Kind, o.token = "approval", ctx.ApprovalToken + o.RequiredHumanApproval = ctx.RequiredHumanApproval o.Command, o.Directory, o.Thread = ctx.CommandDetails.Command, ctx.CommandDetails.Directory, ctx.ThreadID o.FileChanges = codex.FileDiffLines(ctx.FileChanges) for _, option := range ctx.ApprovalOptions { diff --git a/internal/web/dist/assets/index-BcNMhG4h.js b/internal/web/dist/assets/index-CJs9l6nA.js similarity index 83% rename from internal/web/dist/assets/index-BcNMhG4h.js rename to internal/web/dist/assets/index-CJs9l6nA.js index ae7f31e2..b446b90f 100644 --- a/internal/web/dist/assets/index-BcNMhG4h.js +++ b/internal/web/dist/assets/index-CJs9l6nA.js @@ -17,34 +17,34 @@ change token usage and cost. Changes affect subsequent turns of this session, not global defaults. Automatic quota thresholds may later supersede model settings.`))};Z(i,e=>{K(o)?e(a):K(c)?e(s,1):K(u)?e(l,2):e(d,-1)}),P(n),U(()=>X(r,`TARGET // ${t.session??``}. `)),Y(e,n)};Z(s,e=>{K(y).action&&e(c)}),P(n),Li(n,e=>R(te,e),()=>K(te)),U(()=>{X(i,K(y).label),X(o,K(y).help||`No additional help supplied by Codex.`)}),Y(e,n)},w=e=>{var t=Oo(),i=B(t),a=e=>{var t=So(),i=z(t);r(i),P(t),Li(t,e=>R(D,e),()=>K(D)),U(()=>Q(t,`aria-activedescendant`,`${n}-${K(T)}`)),Y(e,t)},o=e=>{var t=Co();let n;var i=z(t);r(i),P(t),Li(t,e=>R(D,e),()=>K(D)),U(()=>n=li(t,1,`command-options svelte-7bfwr9`,null,n,{vertical:K(ge)})),Y(e,t)};Z(i,e=>{K(A)?e(a):e(o,-1)});var s=H(i,2),c=e=>{var t=Eo(),n=B(t),r=V(n,!0),i=H(n,2),a=e=>{var t=To(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,wo())};Z(i,e=>{K(b)&&K(S)>=K(x)&&e(a)}),U(()=>X(r,`REVIEW // ${K(me).label??``}. No change sent yet.`)),Y(e,t)};Z(i,e=>{K(me)&&e(a)}),U(()=>X(r,K(fe)[K(T)]?.help)),Y(e,t)};Z(s,e=>{K(A)&&e(c)});var l=H(s,2),u=e=>{Y(e,Do())};Z(l,e=>{!K(g)&&!K(fe).length&&e(u)}),Y(e,t)};Z(p,e=>{K(v)?.input?e(m):K(y)?e(h,1):e(w,-1)});var E=H(p,2),O=e=>{var t=ko(),n=V(t,!0);U(()=>X(n,K(j).unavailable)),Y(e,t)};Z(E,e=>{K(j)?.unavailable&&e(O)});var ne=H(E,2),k=e=>{Y(e,Ao())};Z(ne,e=>{K(b)&&K(S)>=K(x)&&!K(A)&&e(k)});var ie=H(ne,2),ae=z(ie),ce=e=>{var t=Nr(),r=B(t),i=e=>{var t=jo(),r=V(t,!0);U(e=>{Q(t,`form`,`${n}-input`),t.disabled=e,X(r,K(v).reversibleInput||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)},[()=>K(g)||K(he)||!K(C).trim()]),Y(e,t)},o=e=>{var t=Nr(),n=B(t),r=e=>{var t=Mo();U(()=>t.disabled=K(g)||K(he)&&!a()),q(`click`,t,xe),Y(e,t)},i=e=>{var t=No(),n=V(t,!0);U(()=>{t.disabled=K(g)||K(he)&&!a(),X(n,K(j).reversible||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)}),q(`click`,t,()=>{K(j)&&be(K(j))}),Y(e,t)};Z(n,e=>{K(pe)&&!K(j).reversible&&!$.data?.noConfirm?e(r):e(i,-1)}),Y(e,t)},s=e=>{var t=No(),n=V(t);U(()=>{t.disabled=K(g)||K(he)&&!a(),X(n,`ENTER ${K(j).next?`OPEN`:`HELP`}`)}),q(`click`,t,()=>{K(j)&&ye(K(j))}),Y(e,t)};Z(r,e=>{K(v)?.input?e(i):K(j)?.action&&!K(j).unavailable?e(o,1):!K(y)&&K(j)&&!K(j).unavailable&&e(s,2)}),Y(e,t)};Z(ae,e=>{K(_)||e(ce)});var le=H(ae,2),ue=e=>{var t=Po();U(()=>t.disabled=K(g)),q(`click`,t,oe),Y(e,t)};Z(le,e=>{K(re)&&e(ue)});var de=H(le,2),_e=e=>{var t=Fo();U(()=>t.disabled=K(g)),q(`click`,t,()=>N(K(v)?.path||``,void 0,!0)),Y(e,t)};Z(de,e=>{K(ge)||e(_e)});var Se=H(de,2);P(ie);var Ce=H(ie,2),we=e=>{var t=Io(),n=V(t);U(()=>X(n,`↑/↓ select${K(ge)?` · Tab complete`:``}`)),Y(e,t)};Z(Ce,e=>{!K(v)?.input&&!K(y)&&e(we)}),P(i),Li(i,e=>R(ee,e),()=>K(ee)),U(()=>{Q(i,`aria-label`,K(ge)?`Slash command suggestions`:`Session command options`),o=li(i,1,`svelte-7bfwr9`,null,o,{"command-popup":K(ge)})}),q(`keydown`,i,ve),q(`click`,Se,M),Y(e,i)};return Z(De,e=>{K(h)&&e(Oe)}),P(Ce),U(()=>we.disabled=K(he)&&!a()||K(g)),q(`click`,we,()=>{R(h,!K(h)),R(E,K(h)?null:i(),!0),R(b,``),K(h)?(R(ne,[],!0),N(``)):M()}),Y(e,Ce),We(Se)}Sr([`click`,`keydown`]);var Bo=J(` `,1),Vo=J(`
`),Ho=J(`
/
`);function Uo(e,t){Ue(t,!0);let n=F(()=>t.lines.filter(e=>e.kind===`addition`).length),r=F(()=>t.lines.filter(e=>e.kind===`removal`).length);var i=Ho(),a=z(i),o=z(a),s=V(o),c=V(H(o,2));P(a),Xr(H(a,2),17,()=>t.lines,Kr,(e,t)=>{var n=Vo();let r;var i=z(n),a=e=>{var n=Bo(),r=B(n),i=V(r,!0),a=V(H(r),!0);U(()=>{X(i,K(t).old||``),X(a,K(t).new||``)}),Y(e,n)};Z(i,e=>{K(t).kind!==`heading`&&K(t).kind!==`metadata`&&e(a)});var o=V(H(i),!0);P(n),U(()=>{r=li(n,1,`diff-line svelte-x4gtb6`,null,r,{added:K(t).kind===`addition`,removed:K(t).kind===`removal`,heading:K(t).kind===`heading`}),X(o,K(t).text)}),Y(e,n)}),P(i),U(()=>{Q(a,`aria-label`,`${K(n)} lines added, ${K(r)} lines removed`),X(s,`+${K(n)??``}`),X(c,`−${K(r)??``}`)}),Y(e,i),We()}var Wo=J(`

`),Go=J(`

Send this saved prompt now? This starts Codex work and consumes quota.

`,1),Ko=J(``),qo=J(`

 

In memory only. Follows session model, reasoning and speed. Closing - Codexometer cancels pending work.

`),Jo=J(`

CURRENT PROFILE

MODEL / REASONING LEVEL / SPEED

 

PROPOSED PROFILE

MODEL / REASONING LEVEL / SPEED

 

Applied settings remain after Codexometer closes.

`,1),Yo=J(`

`),Xo=J(`

 
`,1),Zo=J(`

Command unavailable from this observation. Open Codex to inspect the - request.

`),Qo=J(`

Session controls temporarily unavailable. Check Codex for current state.

`),$o=J(`

Checking session controls…

`),es=J(`

`),ts=J(`
About browser controls

Controls require a supported live request from a connected shared - app-server session. Local observations alone cannot provide them.

`),ns=J(` `,1),rs=J(` `),is=J(`Grants permission beyond this one action. Check the scope - carefully.`),as=J(``),os=J(``),ss=J(``),cs=J(``),ls=J(`

Not before this time; when quota and idle allow.

`),us=J(`

`,1),ds=J(`

The existing trigger remains active until saved or deleted. If - it changes or sends while you edit, saving is blocked.

`),fs=J(` `,1),ps=J(``),ms=J(``),hs=J(``),gs=J(` `,1),_s=J(`
  • `),vs=J(`
    View fixed choices

    Type one of these choices exactly. Your answer stays masked.

    `),ys=J(` `,1),bs=J(`

    `),xs=J(`

    `,1),Ss=J(` `,1),Cs=J(``),ws=J(`

    `,1),Ts=J(`

    `);function Es(e,t){Ue(t,!0);let n=[],r=Gi(t,`observedCommand`,3,``),i=Gi(t,`observedFileChanges`,19,()=>[]),a=Gi(t,`review`,3,``),o=Gi(t,`suspended`,3,!1),s=Gi(t,`openScheduler`,3,!1),c=Gi(t,`onProtectedChange`,3,e=>{}),l=Gi(t,`oncopy`,3,()=>{}),u=L(null),d=L(Yt([])),f=L(null),p=L(``),m=L(0),h=L(Yt(Date.now())),g=L(!1),_=L(``),v=L(!1),y=L(!1),b=L(``),x=L(!1),S=L(``),C=L(!1),w=L(``),T=L(`now`),E=L(60),D=L(``),ee=L(!1),te=L(``),O=L(Yt([])),ne=F(()=>K(O).find(e=>e.status!==`sent`)),k=L(void 0),re=L(void 0);function ie(e){if(K(x)){lr().then(()=>K(k)?.focus());return}if(e.status!==`pending`||K(g)||!K(u)?.id||K(u).kind!==`prompt`||K(u).questions?.length)return;R(x,!0),R(S,e.id,!0),lr().then(()=>K(k)?.focus()),R(d,[e.text],!0),R(T,e.trigger===`quota`?`quota`:`at`,!0),R(p,``),R(w,``);let t=new Date(e.at||0);e.trigger!==`quota`&&R(D,new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16),!0)}vn(()=>{s()&&K(ne)&&!K(C)&&K(u)?.id&&K(u).kind===`prompt`&&!K(u).questions?.length&&(R(C,!0),ie(K(ne)))});async function ae(){if(!a())try{R(O,await ya(`schedules`,{session:t.session},M.signal),!0),K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`)&&R(p,``),K(w)&&!K(O).some(e=>e.id===K(w)&&e.status===`pending`)&&(R(p,``),R(w,``))}catch{}}async function oe(e){try{R(O,await ya(`schedules`,{session:t.session,cancelId:e},M.signal),!0),R(x,!1),R(p,``),R(w,``),R(d,[],!0)}catch(e){R(_,e instanceof Error?e.message:`Unable to cancel trigger.`,!0)}}vn(()=>(c()(K(g)||K(d).some(e=>e.length>0)),()=>c()(!1)));let se=F(()=>$.data?.sessions.find(e=>e.id===t.session)?.status),A=F(()=>!$.connected||!!$.data?.sessionsError),ce=F(()=>a()!==`profile`&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&!!$.data?.profiles?.some(e=>e.session===t.session&&e.pending)),le=F(()=>!K(A)&&!K(y)&&!!K(u)?.id&&K(u).kind===`approval`&&K(b)!==K(u).id),ue=F(()=>K(le)?K(u).command:r()),de=F(()=>!!K(p)&&K(h)K(u)?.questions?.length?K(u).questions:[{text:`Follow-up message`,secret:!1,freeText:!0,options:[]}]),j=F(()=>K(u)?.kind===`approval`||K(u)?.kind===`profile`?K(f)!==null:K(d).length===K(fe).length&&K(d).every((e,t)=>e.trim().length>0&&(K(fe)[t].freeText||K(fe)[t].options?.includes(e)))),pe=F(()=>K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`),me=F(()=>K(T)===`delay`?K(h)+K(E)*6e4:Date.parse(K(D))),he=F(()=>{if(!K(pe))return``;if(K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`))return`Trigger changed, removed or already sent. Go back and reopen it; your draft has not been saved.`;if(!K(d)[0]?.trim())return`Enter a message to schedule.`;if(K(T)===`quota`)return``;if(!Number.isFinite(K(me))||K(me)<=K(h))return`Choose a future date/time or a delay greater than zero.`;let e=new Date(K(h));return e.setFullYear(e.getFullYear()+1),K(me)>=e.getTime()?`Choose a time within one year.`:``});function ge(e){return e===void 0?`Not yet available`:new Date(e).toLocaleString([],{timeZoneName:`short`})}function _e(e){if(e.status!==`pending`)return e.status;if(e.trigger===`at`&&e.at&&Date.parse(e.at)>K(h))return`Due in `+Math.ceil((Date.parse(e.at)-K(h))/6e4)+` min`;let t=K(A)?`waiting for a fresh connection`:e.waitingReason||(e.canSend?`ready; awaiting dispatch`:`waiting for quota and an eligible idle session`);return(e.trigger===`at`?`Time reached — `:``)+t}vn(()=>{(K(A)||o()||K(ce)||K(h)>=K(m))&&R(p,``)});let M=new AbortController;Ki(()=>{let e=e=>{e.ctrlKey&&e.key.toLowerCase()===`s`&&!a()&&K(ne)&&(e.preventDefault(),ie(K(ne)))};window.addEventListener(`keydown`,e);let n,r=setInterval(()=>{R(h,Date.now(),!0)},1e3);async function i(){await ae();try{let e=await ya(`offer`,{session:t.session,...a()?{review:a()}:{}},M.signal);if(M.signal.aborted)return;R(y,!1),K(u)?.id!==e.id&&(R(p,``),R(f,null),R(d,Array(Math.max(1,e.questions?.length||0)).fill(``),!0)),R(u,e,!0),K(v)&&e.id&&e.id!==K(b)&&(R(_,``),R(v,!1))}catch{M.signal.aborted||(R(u,null),R(y,!0),R(p,``))}finally{M.signal.aborted||(n=setTimeout(i,2e3))}}return i(),()=>{window.removeEventListener(`keydown`,e),M.abort(),clearTimeout(n),clearInterval(r)}});async function ve(e){if(!e&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(d)[0]?.trim().startsWith(`/`)&&!K(d)[0]?.trim().startsWith(`//`)){R(_,`Choose a slash command from COMMANDS; use // for literal slash text.`);return}if(!K(u)?.id||K(g)||K(A)||o()||K(ce)||(e?!e.canSend:!K(j)||K(he)))return;let n=K(u).id;R(g,!0),R(_,``),R(v,!1),R(p,``),R(w,e?.id||``,!0);try{let r=!e&&K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?{trigger:K(T)===`quota`?`quota`:`at`,zone:Intl.DateTimeFormat().resolvedOptions().timeZone,...K(T)===`quota`?{}:{at:(K(T)===`delay`?new Date(Date.now()+K(E)*6e4):new Date(K(D))).toISOString()}}:void 0;R(ee,!!r),R(te,r?r.trigger===`quota`?`After fresh quota becomes available, when the session is idle`:ge(r.at)+` — not before this time; when quota and idle allow`:``,!0);let i=await ya(`prepare`,{session:t.session,...a()?{review:a()}:{},offer:n,...e?{sendId:e.id}:{},...r?{schedule:r}:{},...r&&K(x)?{editId:K(S)}:{},...K(u).kind===`approval`||K(u).kind===`profile`?{choice:K(f)}:{answers:e?[e.text]:[...K(d)]}},M.signal);K(u)?.id!==n||M.signal.aborted||K(A)||o()||K(ce)||(R(p,i.confirmation,!0),R(m,Date.parse(i.expires),!0))}catch(e){M.signal.aborted||R(_,e instanceof Error?e.message:`Unable to prepare action.`,!0)}finally{R(g,!1)}$.data?.noConfirm&&K(p)&&!M.signal.aborted&&await N()}async function N(){if(!K(u)?.id||K(g)||o()||K(ce)||!K(de))return;let e=K(u).id,n=K(u).kind,r=K(p);R(p,``),R(g,!0),R(b,e,!0);try{await ya(`commit`,{session:t.session,...a()?{review:a()}:{},offer:e,confirmation:r},M.signal),R(v,!0),R(x,!1),K(ee)&&(R(b,``),await ae()),R(_,K(ee)?`Trigger set. Closing Codexometer cancels it.`:n===`profile`?`Profile decision completed.`:n===`approval`?`Decision sent.`:`Text sent.`,!0)}catch(e){R(_,e instanceof _a?e.message:`Outcome uncertain. Check Codex before taking another action; nothing was retried.`,!0)}finally{R(g,!1),R(w,``),await ae(),R(d,[],!0),R(f,null)}}var ye=ns(),be=B(ye),Se=e=>{var t=Nr();Xr(B(t),17,()=>K(O).filter(e=>e.status!==`sent`),e=>e.id,(e,t)=>{var n=qo(),r=z(n),i=V(r,!0),a=H(r,2),s=V(a),c=H(a,2),l=V(c,!0),d=H(c,2),f=V(d,!0),m=H(d,2),h=V(m,!0),v=H(m,2),y=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(_))),Y(e,t)};Z(v,e=>{K(_)&&e(y)});var b=H(v,4),x=H(b,2),S=H(x,2),C=e=>{var n=Go(),r=H(B(n),2),i=H(r,2);U(()=>r.disabled=K(g)||K(A)||!K(t).canSend),q(`click`,r,N),q(`click`,i,()=>{R(p,``),R(w,``)}),Y(e,n)},T=e=>{var n=Ko();U(()=>n.disabled=K(g)||K(A)||!K(t).canSend||o()),q(`click`,n,()=>ve(K(t))),Y(e,n)};Z(S,e=>{K(de)&&K(w)===K(t).id?e(C):e(T,-1)}),P(n),U((e,n)=>{X(i,K(t).status===`uncertain`?`CHECK TRIGGER — outcome uncertain; not retried`:`SCHEDULED FOLLOW-UP`),X(s,`TARGET // ${K(t).session??``}`),X(l,e),X(f,n),X(h,K(t).text),b.disabled=K(g)||!K(u)?.id||K(u).kind!==`prompt`||!!K(u).questions?.length||K(t).status!==`pending`,x.disabled=K(g)||K(t).status===`sending`},[()=>K(t).trigger===`quota`?`After confirmed quota recovery, when idle`:`Not before ${ge(K(t).at)}`,()=>_e(K(t))]),q(`click`,b,()=>ie(K(t))),q(`click`,x,()=>oe(K(t).id)),Y(e,n)}),Y(e,t)},Ce=F(()=>!a()&&K(u)?.kind!==`approval`&&!K(u)?.questions?.length&&![`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``));Z(be,e=>{K(Ce)&&e(Se)});var we=H(be,2),Te=e=>{var r=Ts(),o=z(r),s=V(o,!0),c=H(o,2),S=e=>{var t=Jo(),n=B(t),r=V(n),i=H(n,6),a=V(i,!0),o=V(H(i,6),!0);xe(2),U(()=>{X(r,`Your ${K(u).profile.threshold??``}% quota threshold has been reached. Review - the profile for subsequent turns.`),X(a,K(u).profile.current),X(o,K(u).profile.proposed)}),Y(e,t)};Z(c,e=>{K(u)?.profile&&!K(A)&&!K(y)&&e(S)});var C=H(c,2),w=e=>{var t=Yo();let n;var r=V(t,!0);U(()=>{n=li(t,1,`svelte-1oupzfc`,null,n,{notice:!K(v),sent:K(v)}),X(r,K(_))}),Y(e,t)};Z(C,e=>{K(_)&&e(w)});var O=H(C,2),ne=e=>{Uo(e,{get lines(){return K(u).fileChanges}})},ie=e=>{Uo(e,{get lines(){return i()}})},ae=e=>{var t=Xo(),n=B(t),r=V(n,!0),i=V(H(n,2),!0);U(()=>{X(r,K(le)?`EXACT COMMAND`:`LAST OBSERVED COMMAND`),X(i,K(ue))}),Y(e,t)},oe=e=>{Y(e,Zo())};Z(O,e=>{K(u)?.fileChanges?.length&&!K(A)&&!K(y)?e(ne):i().length?e(ie,1):K(ue)?e(ae,2):a()!==`profile`&&K(se)===`APPROVAL NEEDED`&&!K(v)&&e(oe,3)});var ce=H(O,2),pe=e=>{Y(e,Qo())},_e=e=>{Y(e,$o())},M=e=>{var t=ns(),n=B(t),r=e=>{var t=es(),n=V(t,!0);U(e=>X(n,e),[()=>K(se)===`WORKING`?`Codex is working — nothing to respond to.`:[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)?`Respond in Codex for this request.`:`Nothing needs a response right now.`]),Y(e,t)};Z(n,e=>{(K(se)===`WORKING`||!K(v)&&!K(g))&&e(r)});var i=H(n,2),a=e=>{Y(e,ts())},o=F(()=>[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)&&!K(v));Z(i,e=>{K(o)&&e(a)}),Y(e,t)},ye=e=>{var r=ws(),i=B(r),o=V(i),s=H(i,2),c=z(s),_=V(c,!0),v=H(c,2),y=e=>{var r=Nr();Xr(B(r),17,()=>K(u).choices||[],Kr,(e,r,i)=>{var o=as(),s=z(o);Si(s),s.value=s.__value=i;var c=H(s),l=H(c),u=e=>{var t=rs(),n=V(t,!0);U(()=>X(n,K(r).detail)),Y(e,t)};Z(l,e=>{K(r).detail&&e(u)});var d=H(l,2),p=e=>{Y(e,is())};Z(d,e=>{K(r).persistent&&e(p)}),P(o),U(()=>{Q(s,`name`,`decision-`+t.session+`-`+a()),X(c,` ${K(r).label??``} `)}),ki(n,[],s,()=>K(f),e=>R(f,e)),Y(e,o)}),Y(e,r)},b=e=>{var n=ns(),r=B(n),i=e=>{var t=fs(),n=B(t),r=H(z(n)),i=z(r),a=e=>{var t=os();t.value=t.__value=`now`,Y(e,t)};Z(i,e=>{K(x)||e(a)});var o=H(i);o.value=o.__value=`quota`;var s=H(o);s.value=s.__value=`delay`;var c=H(s);c.value=c.__value=`at`,P(r),hi(r),P(n);var l=H(n,2),u=e=>{var t=ss(),n=H(z(t));Si(n),P(t),Di(n,()=>K(E),e=>R(E,e)),Y(e,t)};Z(l,e=>{K(T)===`delay`&&e(u)});var d=H(l,2),f=e=>{var t=cs(),n=H(z(t));Si(n),P(t),Di(n,()=>K(D),e=>R(D,e)),Y(e,t)};Z(d,e=>{K(T)===`at`&&e(f)});var p=H(d,2),m=e=>{var t=us(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,ls())};Z(i,e=>{K(T)!==`quota`&&e(a)});var o=H(i,2);o.textContent=`Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone??``}. + Codexometer cancels pending work.

    `),Jo=J(`

    HUMAN APPROVAL REQUIRED

    Managed policy requires approval each time.

    `,1),Yo=J(`

    CURRENT PROFILE

    MODEL / REASONING LEVEL / SPEED

     

    PROPOSED PROFILE

    MODEL / REASONING LEVEL / SPEED

     

    Applied settings remain after Codexometer closes.

    `,1),Xo=J(`

    `),Zo=J(`

     
    `,1),Qo=J(`

    Command unavailable from this observation. Open Codex to inspect the + request.

    `),$o=J(`

    Session controls temporarily unavailable. Check Codex for current state.

    `),es=J(`

    Checking session controls…

    `),ts=J(`

    `),ns=J(`
    About browser controls

    Controls require a supported live request from a connected shared + app-server session. Local observations alone cannot provide them.

    `),rs=J(` `,1),is=J(` `),as=J(`Grants permission beyond this one action. Check the scope + carefully.`),os=J(``),ss=J(``),cs=J(``),ls=J(``),us=J(`

    Not before this time; when quota and idle allow.

    `),ds=J(`

    `,1),fs=J(`

    The existing trigger remains active until saved or deleted. If + it changes or sends while you edit, saving is blocked.

    `),ps=J(` `,1),ms=J(``),hs=J(``),gs=J(``),_s=J(` `,1),vs=J(`
  • `),ys=J(`
    View fixed choices

    Type one of these choices exactly. Your answer stays masked.

      `),bs=J(` `,1),xs=J(`

      `),Ss=J(`

      `,1),Cs=J(` `,1),ws=J(``),Ts=J(`

      `,1),Es=J(`

      `);function Ds(e,t){Ue(t,!0);let n=[],r=Gi(t,`observedCommand`,3,``),i=Gi(t,`observedFileChanges`,19,()=>[]),a=Gi(t,`review`,3,``),o=Gi(t,`suspended`,3,!1),s=Gi(t,`openScheduler`,3,!1),c=Gi(t,`onProtectedChange`,3,e=>{}),l=Gi(t,`oncopy`,3,()=>{}),u=L(null),d=L(Yt([])),f=L(null),p=L(``),m=L(0),h=L(Yt(Date.now())),g=L(!1),_=L(``),v=L(!1),y=L(!1),b=L(``),x=L(!1),S=L(``),C=L(!1),w=L(``),T=L(`now`),E=L(60),D=L(``),ee=L(!1),te=L(``),O=L(Yt([])),ne=F(()=>K(O).find(e=>e.status!==`sent`)),k=L(void 0),re=L(void 0);function ie(e){if(K(x)){lr().then(()=>K(k)?.focus());return}if(e.status!==`pending`||K(g)||!K(u)?.id||K(u).kind!==`prompt`||K(u).questions?.length)return;R(x,!0),R(S,e.id,!0),lr().then(()=>K(k)?.focus()),R(d,[e.text],!0),R(T,e.trigger===`quota`?`quota`:`at`,!0),R(p,``),R(w,``);let t=new Date(e.at||0);e.trigger!==`quota`&&R(D,new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16),!0)}vn(()=>{s()&&K(ne)&&!K(C)&&K(u)?.id&&K(u).kind===`prompt`&&!K(u).questions?.length&&(R(C,!0),ie(K(ne)))});async function ae(){if(!a())try{R(O,await ya(`schedules`,{session:t.session},M.signal),!0),K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`)&&R(p,``),K(w)&&!K(O).some(e=>e.id===K(w)&&e.status===`pending`)&&(R(p,``),R(w,``))}catch{}}async function oe(e){try{R(O,await ya(`schedules`,{session:t.session,cancelId:e},M.signal),!0),R(x,!1),R(p,``),R(w,``),R(d,[],!0)}catch(e){R(_,e instanceof Error?e.message:`Unable to cancel trigger.`,!0)}}vn(()=>(c()(K(g)||K(d).some(e=>e.length>0)),()=>c()(!1)));let se=F(()=>$.data?.sessions.find(e=>e.id===t.session)?.status),A=F(()=>!$.connected||!!$.data?.sessionsError),ce=F(()=>a()!==`profile`&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&!!$.data?.profiles?.some(e=>e.session===t.session&&e.pending)),le=F(()=>!K(A)&&!K(y)&&!!K(u)?.id&&K(u).kind===`approval`&&K(b)!==K(u).id),ue=F(()=>K(le)?K(u).command:r()),de=F(()=>!!K(p)&&K(h)K(u)?.questions?.length?K(u).questions:[{text:`Follow-up message`,secret:!1,freeText:!0,options:[]}]),j=F(()=>K(u)?.kind===`approval`||K(u)?.kind===`profile`?K(f)!==null:K(d).length===K(fe).length&&K(d).every((e,t)=>e.trim().length>0&&(K(fe)[t].freeText||K(fe)[t].options?.includes(e)))),pe=F(()=>K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`),me=F(()=>K(T)===`delay`?K(h)+K(E)*6e4:Date.parse(K(D))),he=F(()=>{if(!K(pe))return``;if(K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`))return`Trigger changed, removed or already sent. Go back and reopen it; your draft has not been saved.`;if(!K(d)[0]?.trim())return`Enter a message to schedule.`;if(K(T)===`quota`)return``;if(!Number.isFinite(K(me))||K(me)<=K(h))return`Choose a future date/time or a delay greater than zero.`;let e=new Date(K(h));return e.setFullYear(e.getFullYear()+1),K(me)>=e.getTime()?`Choose a time within one year.`:``});function ge(e){return e===void 0?`Not yet available`:new Date(e).toLocaleString([],{timeZoneName:`short`})}function _e(e){if(e.status!==`pending`)return e.status;if(e.trigger===`at`&&e.at&&Date.parse(e.at)>K(h))return`Due in `+Math.ceil((Date.parse(e.at)-K(h))/6e4)+` min`;let t=K(A)?`waiting for a fresh connection`:e.waitingReason||(e.canSend?`ready; awaiting dispatch`:`waiting for quota and an eligible idle session`);return(e.trigger===`at`?`Time reached — `:``)+t}vn(()=>{(K(A)||o()||K(ce)||K(h)>=K(m))&&R(p,``)});let M=new AbortController;Ki(()=>{let e=e=>{e.ctrlKey&&e.key.toLowerCase()===`s`&&!a()&&K(ne)&&(e.preventDefault(),ie(K(ne)))};window.addEventListener(`keydown`,e);let n,r=setInterval(()=>{R(h,Date.now(),!0)},1e3);async function i(){await ae();try{let e=await ya(`offer`,{session:t.session,...a()?{review:a()}:{}},M.signal);if(M.signal.aborted)return;R(y,!1),K(u)?.id!==e.id&&(R(p,``),R(f,null),R(d,Array(Math.max(1,e.questions?.length||0)).fill(``),!0)),R(u,e,!0),K(v)&&e.id&&e.id!==K(b)&&(R(_,``),R(v,!1))}catch{M.signal.aborted||(R(u,null),R(y,!0),R(p,``))}finally{M.signal.aborted||(n=setTimeout(i,2e3))}}return i(),()=>{window.removeEventListener(`keydown`,e),M.abort(),clearTimeout(n),clearInterval(r)}});async function ve(e){if(!e&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(d)[0]?.trim().startsWith(`/`)&&!K(d)[0]?.trim().startsWith(`//`)){R(_,`Choose a slash command from COMMANDS; use // for literal slash text.`);return}if(!K(u)?.id||K(g)||K(A)||o()||K(ce)||(e?!e.canSend:!K(j)||K(he)))return;let n=K(u).id;R(g,!0),R(_,``),R(v,!1),R(p,``),R(w,e?.id||``,!0);try{let r=!e&&K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?{trigger:K(T)===`quota`?`quota`:`at`,zone:Intl.DateTimeFormat().resolvedOptions().timeZone,...K(T)===`quota`?{}:{at:(K(T)===`delay`?new Date(Date.now()+K(E)*6e4):new Date(K(D))).toISOString()}}:void 0;R(ee,!!r),R(te,r?r.trigger===`quota`?`After fresh quota becomes available, when the session is idle`:ge(r.at)+` — not before this time; when quota and idle allow`:``,!0);let i=await ya(`prepare`,{session:t.session,...a()?{review:a()}:{},offer:n,...e?{sendId:e.id}:{},...r?{schedule:r}:{},...r&&K(x)?{editId:K(S)}:{},...K(u).kind===`approval`||K(u).kind===`profile`?{choice:K(f)}:{answers:e?[e.text]:[...K(d)]}},M.signal);K(u)?.id!==n||M.signal.aborted||K(A)||o()||K(ce)||(R(p,i.confirmation,!0),R(m,Date.parse(i.expires),!0))}catch(e){M.signal.aborted||R(_,e instanceof Error?e.message:`Unable to prepare action.`,!0)}finally{R(g,!1)}$.data?.noConfirm&&K(p)&&!M.signal.aborted&&await N()}async function N(){if(!K(u)?.id||K(g)||o()||K(ce)||!K(de))return;let e=K(u).id,n=K(u).kind,r=K(p);R(p,``),R(g,!0),R(b,e,!0);try{await ya(`commit`,{session:t.session,...a()?{review:a()}:{},offer:e,confirmation:r},M.signal),R(v,!0),R(x,!1),K(ee)&&(R(b,``),await ae()),R(_,K(ee)?`Trigger set. Closing Codexometer cancels it.`:n===`profile`?`Profile decision completed.`:n===`approval`?`Decision sent.`:`Text sent.`,!0)}catch(e){R(_,e instanceof _a?e.message:`Outcome uncertain. Check Codex before taking another action; nothing was retried.`,!0)}finally{R(g,!1),R(w,``),await ae(),R(d,[],!0),R(f,null)}}var ye=rs(),be=B(ye),Se=e=>{var t=Nr();Xr(B(t),17,()=>K(O).filter(e=>e.status!==`sent`),e=>e.id,(e,t)=>{var n=qo(),r=z(n),i=V(r,!0),a=H(r,2),s=V(a),c=H(a,2),l=V(c,!0),d=H(c,2),f=V(d,!0),m=H(d,2),h=V(m,!0),v=H(m,2),y=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(_))),Y(e,t)};Z(v,e=>{K(_)&&e(y)});var b=H(v,4),x=H(b,2),S=H(x,2),C=e=>{var n=Go(),r=H(B(n),2),i=H(r,2);U(()=>r.disabled=K(g)||K(A)||!K(t).canSend),q(`click`,r,N),q(`click`,i,()=>{R(p,``),R(w,``)}),Y(e,n)},T=e=>{var n=Ko();U(()=>n.disabled=K(g)||K(A)||!K(t).canSend||o()),q(`click`,n,()=>ve(K(t))),Y(e,n)};Z(S,e=>{K(de)&&K(w)===K(t).id?e(C):e(T,-1)}),P(n),U((e,n)=>{X(i,K(t).status===`uncertain`?`CHECK TRIGGER — outcome uncertain; not retried`:`SCHEDULED FOLLOW-UP`),X(s,`TARGET // ${K(t).session??``}`),X(l,e),X(f,n),X(h,K(t).text),b.disabled=K(g)||!K(u)?.id||K(u).kind!==`prompt`||!!K(u).questions?.length||K(t).status!==`pending`,x.disabled=K(g)||K(t).status===`sending`},[()=>K(t).trigger===`quota`?`After confirmed quota recovery, when idle`:`Not before ${ge(K(t).at)}`,()=>_e(K(t))]),q(`click`,b,()=>ie(K(t))),q(`click`,x,()=>oe(K(t).id)),Y(e,n)}),Y(e,t)},Ce=F(()=>!a()&&K(u)?.kind!==`approval`&&!K(u)?.questions?.length&&![`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``));Z(be,e=>{K(Ce)&&e(Se)});var we=H(be,2),Te=e=>{var r=Es(),o=z(r),s=V(o,!0),c=H(o,2),S=e=>{var t=Jo();xe(2),Y(e,t)};Z(c,e=>{K(u)?.requiredHumanApproval&&!K(A)&&!K(y)&&e(S)});var C=H(c,2),w=e=>{var t=Yo(),n=B(t),r=V(n),i=H(n,6),a=V(i,!0),o=V(H(i,6),!0);xe(2),U(()=>{X(r,`Your ${K(u).profile.threshold??``}% quota threshold has been reached. Review + the profile for subsequent turns.`),X(a,K(u).profile.current),X(o,K(u).profile.proposed)}),Y(e,t)};Z(C,e=>{K(u)?.profile&&!K(A)&&!K(y)&&e(w)});var O=H(C,2),ne=e=>{var t=Xo();let n;var r=V(t,!0);U(()=>{n=li(t,1,`svelte-1oupzfc`,null,n,{notice:!K(v),sent:K(v)}),X(r,K(_))}),Y(e,t)};Z(O,e=>{K(_)&&e(ne)});var ie=H(O,2),ae=e=>{Uo(e,{get lines(){return K(u).fileChanges}})},oe=e=>{Uo(e,{get lines(){return i()}})},ce=e=>{var t=Zo(),n=B(t),r=V(n,!0),i=V(H(n,2),!0);U(()=>{X(r,K(le)?`EXACT COMMAND`:`LAST OBSERVED COMMAND`),X(i,K(ue))}),Y(e,t)},pe=e=>{Y(e,Qo())};Z(ie,e=>{K(u)?.fileChanges?.length&&!K(A)&&!K(y)?e(ae):i().length?e(oe,1):K(ue)?e(ce,2):a()!==`profile`&&K(se)===`APPROVAL NEEDED`&&!K(v)&&e(pe,3)});var _e=H(ie,2),M=e=>{Y(e,$o())},ye=e=>{Y(e,es())},be=e=>{var t=rs(),n=B(t),r=e=>{var t=ts(),n=V(t,!0);U(e=>X(n,e),[()=>K(se)===`WORKING`?`Codex is working — nothing to respond to.`:[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)?`Respond in Codex for this request.`:`Nothing needs a response right now.`]),Y(e,t)};Z(n,e=>{(K(se)===`WORKING`||!K(v)&&!K(g))&&e(r)});var i=H(n,2),a=e=>{Y(e,ns())},o=F(()=>[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)&&!K(v));Z(i,e=>{K(o)&&e(a)}),Y(e,t)},Se=e=>{var r=Ts(),i=B(r),o=V(i),s=H(i,2),c=z(s),_=V(c,!0),v=H(c,2),y=e=>{var r=Nr();Xr(B(r),17,()=>K(u).choices||[],Kr,(e,r,i)=>{var o=os(),s=z(o);Si(s),s.value=s.__value=i;var c=H(s),l=H(c),u=e=>{var t=is(),n=V(t,!0);U(()=>X(n,K(r).detail)),Y(e,t)};Z(l,e=>{K(r).detail&&e(u)});var d=H(l,2),p=e=>{Y(e,as())};Z(d,e=>{K(r).persistent&&e(p)}),P(o),U(()=>{Q(s,`name`,`decision-`+t.session+`-`+a()),X(c,` ${K(r).label??``} `)}),ki(n,[],s,()=>K(f),e=>R(f,e)),Y(e,o)}),Y(e,r)},b=e=>{var n=rs(),r=B(n),i=e=>{var t=ps(),n=B(t),r=H(z(n)),i=z(r),a=e=>{var t=ss();t.value=t.__value=`now`,Y(e,t)};Z(i,e=>{K(x)||e(a)});var o=H(i);o.value=o.__value=`quota`;var s=H(o);s.value=s.__value=`delay`;var c=H(s);c.value=c.__value=`at`,P(r),hi(r),P(n);var l=H(n,2),u=e=>{var t=cs(),n=H(z(t));Si(n),P(t),Di(n,()=>K(E),e=>R(E,e)),Y(e,t)};Z(l,e=>{K(T)===`delay`&&e(u)});var d=H(l,2),f=e=>{var t=ls(),n=H(z(t));Si(n),P(t),Di(n,()=>K(D),e=>R(D,e)),Y(e,t)};Z(d,e=>{K(T)===`at`&&e(f)});var p=H(d,2),m=e=>{var t=ds(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,us())};Z(i,e=>{K(T)!==`quota`&&e(a)});var o=H(i,2);o.textContent=`Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone??``}. One pending request per session; saving replaces it. Memory only; Codexometer must stay running. Uses session model, - reasoning and speed.`,U(e=>X(r,`Will send: ${e??``}`),[()=>K(T)===`quota`?`when quota is available and this session is idle`:Number.isFinite(K(me))?ge(K(me)):`choose a date and time`]),Y(e,t)};Z(p,e=>{K(T)!==`now`&&e(m)});var h=H(p,2),g=e=>{Y(e,ds())};Z(h,e=>{K(x)&&e(g)}),gi(r,()=>K(T),e=>R(T,e)),Y(e,t)};Z(r,e=>{K(u).questions?.length||e(i)}),Xr(H(r,2),17,()=>K(fe),Kr,(e,n,r)=>{var i=ys(),o=B(i),s=e=>{{let n=F(()=>K(d)[0]||``);Li(zo(e,{get session(){return t.session},get oncopy(){return l()},get query(){return K(n)},oncomplete:e=>{R(d,[e],!0),lr().then(()=>K(k)?.focus())},onchange:()=>{R(d,[``],!0),lr().then(()=>K(k)?.focus())}}),e=>R(re,e,!0),()=>K(re))}};Z(o,e=>{r===0&&a()!==`profile`&&K(u).kind===`prompt`&&!K(u).questions?.length&&e(s)});var c=H(o,2),f=z(c),p=H(f),m=e=>{var t=ps();Si(t),Di(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},h=e=>{var t=hs(),i=z(t);i.value=i.__value=``,Xr(H(i),17,()=>K(n).options||[],Kr,(e,t)=>{var n=ms(),r=V(n,!0),i={};U(()=>{X(r,K(t)),i!==(i=K(t))&&(n.value=(n.__value=i)??``)}),Y(e,n)}),P(t),hi(t),gi(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},g=e=>{var t=gs(),i=B(t);tt(i),Li(i,e=>R(k,e),()=>K(k));var a=H(i,2),o=e=>{var t=es(),r=V(t);U(e=>X(r,`Suggested answers: ${e??``}`),[()=>K(n).options.join(` · `)]),Y(e,t)};Z(a,e=>{K(n).options?.length&&e(o)}),q(`keydown`,i,e=>{K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(re)?.handleKey(e)}),Di(i,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)};Z(p,e=>{K(n).secret?e(m):K(n).freeText?e(g,-1):e(h,1)}),P(c);var _=H(c,2),v=e=>{var t=vs(),r=H(z(t),4);Xr(r,21,()=>K(n).options||[],Kr,(e,t)=>{var n=_s(),r=V(n,!0);U(()=>X(r,K(t))),Y(e,n)}),P(r),P(t),Y(e,t)};Z(_,e=>{K(n).secret&&!K(n).freeText&&e(v)}),U(()=>X(f,`${K(n).text??``} `)),Y(e,i)}),Y(e,n)};Z(v,e=>{K(u).kind===`approval`||K(u).kind===`profile`?e(y):e(b,-1)}),P(s);var S=H(s,2),C=e=>{var t=xs(),n=B(t),r=e=>{var t=bs(),n=V(t);U(()=>X(n,`TRIGGER // ${K(te)??``}`)),Y(e,t)};Z(n,e=>{K(ee)&&e(r)});var i=H(n,2),a=V(i),o=H(i,2),s=V(o),c=H(o,2);U(e=>{X(a,`Check the target and ${K(u).kind===`profile`?`profile above`:K(u).kind===`approval`?K(u).fileChanges?.length?`proposed file changes above`:`exact command and permission scope`:`message above`}. ${K(ee)?`This schedules a follow-up that will send automatically when eligible`:`This will send to Codex`}; it may start work using your quota. - Confirmation expires in ${e??``}s.`),o.disabled=K(g)||K(A),X(s,`CONFIRM ${(K(u).kind===`approval`||K(u).kind===`profile`?K(u).choices?.[K(f)]?.label:K(ee)?K(x)?`SAVE CHANGES`:`SCHEDULE`:`SEND`)??``}`)},[()=>Math.max(0,Math.ceil((K(m)-K(h))/1e3))]),q(`click`,o,N),q(`click`,c,()=>{R(p,``)}),Y(e,t)},w=e=>{var t=Ss(),n=B(t),r=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(he))),Y(e,t)};Z(n,e=>{K(he)&&e(r)});var i=H(n,2),a=V(i,!0);U(()=>{i.disabled=K(g)||K(A)||!K(j)||!!K(he),X(a,K(g)?`SENDING…`:$.data?.noConfirm?K(x)?`SAVE CHANGES`:K(u).kind===`approval`||K(u).kind===`profile`?`SEND DECISION`:K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?`SET TRIGGER`:`SEND`:K(x)?`REVIEW CHANGES`:`REVIEW BEFORE SENDING`)}),q(`click`,i,()=>ve()),Y(e,t)};Z(S,e=>{K(de)&&!$.data?.noConfirm?e(C):e(w,-1)});var O=H(S,2),ne=e=>{var t=Cs();q(`click`,t,()=>{R(x,!1),R(p,``),R(d,[],!0)}),Y(e,t)};Z(O,e=>{K(x)&&e(ne)}),U(()=>{X(o,`TARGET // ${K(u).thread??``} // ${(K(u).directory||`Directory unavailable`)??``}`),s.disabled=K(g)||K(de)||K(A),X(_,K(u).kind===`approval`||K(u).kind===`profile`?`Choose a decision`:K(x)?`EDIT SCHEDULED FOLLOW-UP`:`Reply to this session`)}),Y(e,r)};Z(ce,e=>{K(A)||K(y)?e(pe):K(u)?K(u).id?K(b)!==K(u).id&&e(ye,3):e(M,2):e(_e,1)}),P(r),U(()=>X(s,a()===`profile`?`QUOTA THRESHOLD`:`SESSION CONTROL // EXPERIMENTAL`)),Y(e,r)};Z(we,e=>{!K(ce)&&(!K(ne)||K(x)||a()||K(u)?.kind!==`prompt`||K(u).questions?.length)&&e(Te)}),Y(e,ye),We()}Sr([`click`,`keydown`]);var Ds=J(` `);function Os(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=F(()=>n()||!!t.goal?.stale);var i=Nr(),a=B(i),o=e=>{var n=Ds();let i;var a=V(n,!0);U((e,o)=>{i=li(n,1,`goal-status svelte-1yfu3xi`,null,i,{stale:K(r),pursuing:!K(r)&&t.goal.status===`active`,blocked:e}),Q(n,`title`,o),X(a,K(r)?`GOAL STALE`:t.goal.label)},[()=>!K(r)&&[`blocked`,`usageLimited`,`budgetLimited`].includes(t.goal.status),()=>t.goal.objective+` -`+t.goal.tokensUsed.toLocaleString()+(t.goal.tokenBudget===null?` tokens`:` / `+t.goal.tokenBudget.toLocaleString()+` tokens`)]),Y(e,n)};Z(a,e=>{t.goal&&e(o)}),Y(e,i),We()}var ks=J(` `,1),As=J(`
      `),js=J(`

      STATUS LINE // CODEXOMETER

      Choose multiple fields and their order. These display preferences do not - change Codex CLI configuration. Missing values are omitted.

      `),Ms=J(`

      `,1);function Ns(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=L(Yt([])),i=L(!1),a=F(()=>$.data?.statusLineFields||[]),o=e=>[...new Set(e??K(a).filter(e=>e.default).map(e=>e.id))].filter(e=>K(a).some(t=>t.id===e)),s=e=>o(e).map(e=>e===`run-state`&&(n()||!$.connected||$.data?.sessionsError)?`STALE`:t.session.statusLine?.[e]).filter(Boolean).join(` · `),c=F(()=>[...K(r).map(e=>K(a).find(t=>t.id===e)).filter(Boolean),...K(a).filter(e=>!K(r).includes(e.id))]);vn(()=>{sa.open&&!K(i)?(R(r,o(oa.statusLine),!0),R(i,!0)):sa.open||R(i,!1)});function l(e,t){R(r,t?[...K(r),e]:K(r).filter(t=>t!==e),!0)}function u(e,t){let n=K(r).indexOf(e),i=n+t;if(n<0||i<0||i>=K(r).length)return;let a=[...K(r)];[a[n],a[i]]=[a[i],a[n]],R(r,a,!0)}var d=Ms(),p=B(d),m=e=>{var t=js(),n=H(z(t),4);Xr(n,21,()=>K(c),e=>e.id,(e,t)=>{var n=As(),i=z(n),a=z(i);Si(a);var o=H(a,1,!0),s=V(H(o),!0);P(i);var c=H(i,2),d=e=>{var n=ks(),i=B(n),a=H(i,2);U((e,n)=>{Q(i,`aria-label`,`Move `+K(t).label+` earlier`),i.disabled=e,Q(a,`aria-label`,`Move `+K(t).label+` later`),a.disabled=n},[()=>K(r).indexOf(K(t).id)===0,()=>K(r).indexOf(K(t).id)===K(r).length-1]),q(`click`,i,()=>u(K(t).id,-1)),q(`click`,a,()=>u(K(t).id,1)),Y(e,n)},f=F(()=>K(r).includes(K(t).id));Z(c,e=>{K(f)&&e(d)}),P(n),U(e=>{Q(i,`title`,K(t).help),Ci(a,e),X(o,K(t).label),X(s,K(t).help)},[()=>K(r).includes(K(t).id)]),q(`change`,a,e=>l(K(t).id,e.currentTarget.checked)),Y(e,n)}),P(n);var i=H(n,2),a=V(i),o=H(i,2),d=H(o,2);P(t),U(e=>X(a,`Preview // ${e??``}`),[()=>s(K(r))||`—`]),q(`click`,o,()=>{oa.statusLine=[...K(r)],la(),sa.open=!1}),q(`click`,d,()=>{sa.open=!1}),Y(e,t)};Z(p,e=>{sa.open&&e(m)});var h=H(p,2),g=z(h),_=V(g,!0),v=H(g,2);{let e=F(()=>n()||!$.connected||!!$.data?.sessionsError);Os(v,{get goal(){return t.session.goal},get stale(){return K(e)}})}var y=H(v,2);ni(H(y,2),()=>t.children??f),P(h),U((e,t)=>{Q(g,`title`,e),X(_,t)},[()=>s(oa.statusLine),()=>s(oa.statusLine)]),q(`click`,y,()=>{sa.open=!sa.open}),Y(e,d),We()}Sr([`change`,`click`]);var Ps=J(`
      `);function Fs(e,t){Ue(t,!0);let n=Gi(t,`active`,3,!1),r=Gi(t,`compact`,3,!1),i=F(()=>oo(t.session)),a=F(()=>!!K(i)),o=L(!1),s=L(``),c=L(!1);vn(()=>{if(!K(c))return;let e=setTimeout(()=>{R(c,!1)},150);return()=>clearTimeout(e)}),vn(()=>{K(i),t.session.status,R(s,``)});async function l(){if(!K(a)||K(o))return;let e=K(i);R(o,!0),R(c,!0),R(s,``);try{await navigator.clipboard.writeText(e),K(i)===e&&R(s,`Copied.`)}catch{K(i)===e&&R(s,`Clipboard unavailable. Select the visible text and copy it manually.`)}finally{R(o,!1)}}function u(e){!n()||!K(a)||e.defaultPrevented||e.repeat||e.ctrlKey||e.metaKey||e.altKey||e.key.toLowerCase()!==`c`||e.target instanceof Element&&e.target.closest(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),l())}var d={copy:l},f=Nr();xr(`keydown`,Qt,u);var p=B(f),m=e=>{var t=Ps();let n;var i=z(t),a=V(i,!0),u=H(i,2);let d;P(t),U(()=>{n=li(t,1,`session-copy svelte-543j00`,null,n,{compact:r()}),X(a,K(s)),u.disabled=K(o),d=li(u,1,`svelte-543j00`,null,d,{flashed:K(c)})}),q(`click`,u,l),Y(e,t)};return Z(p,e=>{K(a)&&e(m)}),Y(e,f),We(d)}Sr([`click`]);var Is=J(`

       
      `,1),Ls=J(`

      LATEST GUIDANCE

       
      `,1),Rs=J(`

      CONTEXT

       

      `,1),zs=J(`

      `),Bs=J(`

      `),Vs=J(`
       
      `),Hs=J(`

       
      `,1),Us=J(`
       
      `),Ws=J(`

      Command unavailable from this observation. Open Codex to inspect the - request.

      `),Gs=J(`

      `,1),Ks=J(`

      `),qs=J(` `,1),Js=J(`
      `),Ys=J(`

      Session connection or refresh unavailable. Context and telemetry may be - stale.

      `),Xs=J(`

      Some quota profile checks are unavailable. Only sessions with freshly + reasoning and speed.`,U(e=>X(r,`Will send: ${e??``}`),[()=>K(T)===`quota`?`when quota is available and this session is idle`:Number.isFinite(K(me))?ge(K(me)):`choose a date and time`]),Y(e,t)};Z(p,e=>{K(T)!==`now`&&e(m)});var h=H(p,2),g=e=>{Y(e,fs())};Z(h,e=>{K(x)&&e(g)}),gi(r,()=>K(T),e=>R(T,e)),Y(e,t)};Z(r,e=>{K(u).questions?.length||e(i)}),Xr(H(r,2),17,()=>K(fe),Kr,(e,n,r)=>{var i=bs(),o=B(i),s=e=>{{let n=F(()=>K(d)[0]||``);Li(zo(e,{get session(){return t.session},get oncopy(){return l()},get query(){return K(n)},oncomplete:e=>{R(d,[e],!0),lr().then(()=>K(k)?.focus())},onchange:()=>{R(d,[``],!0),lr().then(()=>K(k)?.focus())}}),e=>R(re,e,!0),()=>K(re))}};Z(o,e=>{r===0&&a()!==`profile`&&K(u).kind===`prompt`&&!K(u).questions?.length&&e(s)});var c=H(o,2),f=z(c),p=H(f),m=e=>{var t=ms();Si(t),Di(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},h=e=>{var t=gs(),i=z(t);i.value=i.__value=``,Xr(H(i),17,()=>K(n).options||[],Kr,(e,t)=>{var n=hs(),r=V(n,!0),i={};U(()=>{X(r,K(t)),i!==(i=K(t))&&(n.value=(n.__value=i)??``)}),Y(e,n)}),P(t),hi(t),gi(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},g=e=>{var t=_s(),i=B(t);tt(i),Li(i,e=>R(k,e),()=>K(k));var a=H(i,2),o=e=>{var t=ts(),r=V(t);U(e=>X(r,`Suggested answers: ${e??``}`),[()=>K(n).options.join(` · `)]),Y(e,t)};Z(a,e=>{K(n).options?.length&&e(o)}),q(`keydown`,i,e=>{K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(re)?.handleKey(e)}),Di(i,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)};Z(p,e=>{K(n).secret?e(m):K(n).freeText?e(g,-1):e(h,1)}),P(c);var _=H(c,2),v=e=>{var t=ys(),r=H(z(t),4);Xr(r,21,()=>K(n).options||[],Kr,(e,t)=>{var n=vs(),r=V(n,!0);U(()=>X(r,K(t))),Y(e,n)}),P(r),P(t),Y(e,t)};Z(_,e=>{K(n).secret&&!K(n).freeText&&e(v)}),U(()=>X(f,`${K(n).text??``} `)),Y(e,i)}),Y(e,n)};Z(v,e=>{K(u).kind===`approval`||K(u).kind===`profile`?e(y):e(b,-1)}),P(s);var S=H(s,2),C=e=>{var t=Ss(),n=B(t),r=e=>{var t=xs(),n=V(t);U(()=>X(n,`TRIGGER // ${K(te)??``}`)),Y(e,t)};Z(n,e=>{K(ee)&&e(r)});var i=H(n,2),a=V(i),o=H(i,2),s=V(o),c=H(o,2);U(e=>{X(a,`Check the target and ${K(u).kind===`profile`?`profile above`:K(u).kind===`approval`?K(u).fileChanges?.length?`proposed file changes above`:`exact command and permission scope`:`message above`}. ${K(ee)?`This schedules a follow-up that will send automatically when eligible`:`This will send to Codex`}; it may start work using your quota. + Confirmation expires in ${e??``}s.`),o.disabled=K(g)||K(A),X(s,`CONFIRM ${(K(u).kind===`approval`||K(u).kind===`profile`?K(u).choices?.[K(f)]?.label:K(ee)?K(x)?`SAVE CHANGES`:`SCHEDULE`:`SEND`)??``}`)},[()=>Math.max(0,Math.ceil((K(m)-K(h))/1e3))]),q(`click`,o,N),q(`click`,c,()=>{R(p,``)}),Y(e,t)},w=e=>{var t=Cs(),n=B(t),r=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(he))),Y(e,t)};Z(n,e=>{K(he)&&e(r)});var i=H(n,2),a=V(i,!0);U(()=>{i.disabled=K(g)||K(A)||!K(j)||!!K(he),X(a,K(g)?`SENDING…`:$.data?.noConfirm?K(x)?`SAVE CHANGES`:K(u).kind===`approval`||K(u).kind===`profile`?`SEND DECISION`:K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?`SET TRIGGER`:`SEND`:K(x)?`REVIEW CHANGES`:`REVIEW BEFORE SENDING`)}),q(`click`,i,()=>ve()),Y(e,t)};Z(S,e=>{K(de)&&!$.data?.noConfirm?e(C):e(w,-1)});var O=H(S,2),ne=e=>{var t=ws();q(`click`,t,()=>{R(x,!1),R(p,``),R(d,[],!0)}),Y(e,t)};Z(O,e=>{K(x)&&e(ne)}),U(()=>{X(o,`TARGET // ${K(u).thread??``} // ${(K(u).directory||`Directory unavailable`)??``}`),s.disabled=K(g)||K(de)||K(A),X(_,K(u).kind===`approval`||K(u).kind===`profile`?`Choose a decision`:K(x)?`EDIT SCHEDULED FOLLOW-UP`:`Reply to this session`)}),Y(e,r)};Z(_e,e=>{K(A)||K(y)?e(M):K(u)?K(u).id?K(b)!==K(u).id&&e(Se,3):e(be,2):e(ye,1)}),P(r),U(()=>X(s,a()===`profile`?`QUOTA THRESHOLD`:`SESSION CONTROL // EXPERIMENTAL`)),Y(e,r)};Z(we,e=>{!K(ce)&&(!K(ne)||K(x)||a()||K(u)?.kind!==`prompt`||K(u).questions?.length)&&e(Te)}),Y(e,ye),We()}Sr([`click`,`keydown`]);var Os=J(` `);function ks(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=F(()=>n()||!!t.goal?.stale);var i=Nr(),a=B(i),o=e=>{var n=Os();let i;var a=V(n,!0);U((e,o)=>{i=li(n,1,`goal-status svelte-1yfu3xi`,null,i,{stale:K(r),pursuing:!K(r)&&t.goal.status===`active`,blocked:e}),Q(n,`title`,o),X(a,K(r)?`GOAL STALE`:t.goal.label)},[()=>!K(r)&&[`blocked`,`usageLimited`,`budgetLimited`].includes(t.goal.status),()=>t.goal.objective+` +`+t.goal.tokensUsed.toLocaleString()+(t.goal.tokenBudget===null?` tokens`:` / `+t.goal.tokenBudget.toLocaleString()+` tokens`)]),Y(e,n)};Z(a,e=>{t.goal&&e(o)}),Y(e,i),We()}var As=J(` `,1),js=J(`

      `),Ms=J(`

      STATUS LINE // CODEXOMETER

      Choose multiple fields and their order. These display preferences do not + change Codex CLI configuration. Missing values are omitted.

      `),Ns=J(`

      `,1);function Ps(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=L(Yt([])),i=L(!1),a=F(()=>$.data?.statusLineFields||[]),o=e=>[...new Set(e??K(a).filter(e=>e.default).map(e=>e.id))].filter(e=>K(a).some(t=>t.id===e)),s=e=>o(e).map(e=>e===`run-state`&&(n()||!$.connected||$.data?.sessionsError)?`STALE`:t.session.statusLine?.[e]).filter(Boolean).join(` · `),c=F(()=>[...K(r).map(e=>K(a).find(t=>t.id===e)).filter(Boolean),...K(a).filter(e=>!K(r).includes(e.id))]);vn(()=>{sa.open&&!K(i)?(R(r,o(oa.statusLine),!0),R(i,!0)):sa.open||R(i,!1)});function l(e,t){R(r,t?[...K(r),e]:K(r).filter(t=>t!==e),!0)}function u(e,t){let n=K(r).indexOf(e),i=n+t;if(n<0||i<0||i>=K(r).length)return;let a=[...K(r)];[a[n],a[i]]=[a[i],a[n]],R(r,a,!0)}var d=Ns(),p=B(d),m=e=>{var t=Ms(),n=H(z(t),4);Xr(n,21,()=>K(c),e=>e.id,(e,t)=>{var n=js(),i=z(n),a=z(i);Si(a);var o=H(a,1,!0),s=V(H(o),!0);P(i);var c=H(i,2),d=e=>{var n=As(),i=B(n),a=H(i,2);U((e,n)=>{Q(i,`aria-label`,`Move `+K(t).label+` earlier`),i.disabled=e,Q(a,`aria-label`,`Move `+K(t).label+` later`),a.disabled=n},[()=>K(r).indexOf(K(t).id)===0,()=>K(r).indexOf(K(t).id)===K(r).length-1]),q(`click`,i,()=>u(K(t).id,-1)),q(`click`,a,()=>u(K(t).id,1)),Y(e,n)},f=F(()=>K(r).includes(K(t).id));Z(c,e=>{K(f)&&e(d)}),P(n),U(e=>{Q(i,`title`,K(t).help),Ci(a,e),X(o,K(t).label),X(s,K(t).help)},[()=>K(r).includes(K(t).id)]),q(`change`,a,e=>l(K(t).id,e.currentTarget.checked)),Y(e,n)}),P(n);var i=H(n,2),a=V(i),o=H(i,2),d=H(o,2);P(t),U(e=>X(a,`Preview // ${e??``}`),[()=>s(K(r))||`—`]),q(`click`,o,()=>{oa.statusLine=[...K(r)],la(),sa.open=!1}),q(`click`,d,()=>{sa.open=!1}),Y(e,t)};Z(p,e=>{sa.open&&e(m)});var h=H(p,2),g=z(h),_=V(g,!0),v=H(g,2);{let e=F(()=>n()||!$.connected||!!$.data?.sessionsError);ks(v,{get goal(){return t.session.goal},get stale(){return K(e)}})}var y=H(v,2);ni(H(y,2),()=>t.children??f),P(h),U((e,t)=>{Q(g,`title`,e),X(_,t)},[()=>s(oa.statusLine),()=>s(oa.statusLine)]),q(`click`,y,()=>{sa.open=!sa.open}),Y(e,d),We()}Sr([`change`,`click`]);var Fs=J(`
      `);function Is(e,t){Ue(t,!0);let n=Gi(t,`active`,3,!1),r=Gi(t,`compact`,3,!1),i=F(()=>oo(t.session)),a=F(()=>!!K(i)),o=L(!1),s=L(``),c=L(!1);vn(()=>{if(!K(c))return;let e=setTimeout(()=>{R(c,!1)},150);return()=>clearTimeout(e)}),vn(()=>{K(i),t.session.status,R(s,``)});async function l(){if(!K(a)||K(o))return;let e=K(i);R(o,!0),R(c,!0),R(s,``);try{await navigator.clipboard.writeText(e),K(i)===e&&R(s,`Copied.`)}catch{K(i)===e&&R(s,`Clipboard unavailable. Select the visible text and copy it manually.`)}finally{R(o,!1)}}function u(e){!n()||!K(a)||e.defaultPrevented||e.repeat||e.ctrlKey||e.metaKey||e.altKey||e.key.toLowerCase()!==`c`||e.target instanceof Element&&e.target.closest(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),l())}var d={copy:l},f=Nr();xr(`keydown`,Qt,u);var p=B(f),m=e=>{var t=Fs();let n;var i=z(t),a=V(i,!0),u=H(i,2);let d;P(t),U(()=>{n=li(t,1,`session-copy svelte-543j00`,null,n,{compact:r()}),X(a,K(s)),u.disabled=K(o),d=li(u,1,`svelte-543j00`,null,d,{flashed:K(c)})}),q(`click`,u,l),Y(e,t)};return Z(p,e=>{K(a)&&e(m)}),Y(e,f),We(d)}Sr([`click`]);var Ls=J(`

       
      `,1),Rs=J(`

      LATEST GUIDANCE

       
      `,1),zs=J(`

      CONTEXT

       

      `,1),Bs=J(`

      `),Vs=J(`

      `),Hs=J(`
       
      `),Us=J(`

       
      `,1),Ws=J(`
       
      `),Gs=J(`

      Command unavailable from this observation. Open Codex to inspect the + request.

      `),Ks=J(`

      `,1),qs=J(`

      `),Js=J(` `,1),Ys=J(`
      `),Xs=J(`

      Session connection or refresh unavailable. Context and telemetry may be + stale.

      `),Zs=J(`

      Some quota profile checks are unavailable. Only sessions with freshly verified quota and settings can be updated; previous outcome notices remain - visible.

      `),Zs=J(` `),Qs=J(` `),$s=J(` `),ec=J(``),tc=J(`

      Read only — reply or approve in Codex.

      `),nc=J(`

      `),rc=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),ic=J(`
      `),ac=J(` `,1),oc=J(`
      `),sc=J(`

      This session is no longer in the current observation. Return to sessions.

      `),cc=J(`

      `),lc=J(``),uc=J(`

      `),dc=J(` `),fc=J(`

      `),pc=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),mc=J(`

      `),hc=J(`

      TOKEN ACTIVITY // 30 SECOND SAMPLES

      `),gc=J(`

      TOKENS

      FULL DETAIL →
      `),_c=J(`

      No locally observed sessions yet. Keep Codex running alongside - Codexometer.

      `),vc=J(`

      ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

      `,1),yc=J(`

      SESSION TOTALS

      `,1);function bc(e,t){Ue(t,!0);let n=(e,t=f,n,r)=>{let i=pt(()=>g(n?.(),!0)),a=pt(()=>g(r?.(),!1));var o=qs(),s=B(o),c=e=>{var n=Is(),r=B(n),i=V(r,!0),a=V(H(r,2),!0);U(()=>{X(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),X(a,t().currentTask)}),Y(e,n)};Z(s,e=>{t().currentTask&&e(c)});var l=H(s,2),u=e=>{var n=Ls(),r=V(H(B(n),2),!0);U(()=>X(r,t().latestGuidance)),Y(e,n)};Z(l,e=>{t().latestGuidance&&e(u)});var d=H(l,2),p=e=>{var n=Rs(),r=V(H(B(n),2),!0);xe(2),U(()=>X(r,t().approvalContext)),Y(e,n)};Z(d,e=>{K(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=H(d,2),h=e=>{var n=zs();let r;var i=V(n,!0);U(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),X(i,e)},[()=>D(t())]),Y(e,n)},_=F(()=>D(t())&&(!K(a)||K(v)||t().status===`CHECK SESSION`||y(t())));Z(m,e=>{K(_)&&e(h)});var b=H(m,2),x=e=>{var n=Bs(),r=V(n,!0);U(e=>X(r,e),[()=>ee(t())]),Y(e,n)};Z(b,e=>{K(i)&&e(x)});var S=H(b,2),C=e=>{var n=Vs(),r=V(n,!0);U(()=>X(r,t().text||`No session context available.`)),Y(e,n)};Z(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=H(S,2),T=e=>{var n=Hs(),r=H(B(n),2),i=z(r),a=H(i),o=e=>{var n=Mr();U(()=>X(n,`// ${t().commandTiming??``}`)),Y(e,n)};Z(a,e=>{t().commandTiming&&e(o)});var s=H(a,2),c=e=>{var n=Mr();U(()=>X(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),Y(e,n)};Z(s,e=>{!K(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=H(s,2),u=e=>{Y(e,Mr(`+`))};Z(l,e=>{t().runningLimited&&e(u)}),P(r);var d=V(H(r,2),!0);U(e=>{X(i,`COMMAND // ${e??``} `),X(d,t().workingCommand)},[()=>K(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),Y(e,n)};Z(w,e=>{t().workingCommand&&e(T)});var E=H(w,2),te=e=>{Uo(e,{get lines(){return t().fileChanges}})},O=e=>{var n=Gs(),r=H(B(n),2),i=V(r,!0),a=H(r,2),o=e=>{var n=Us(),r=V(n,!0);U(()=>X(r,t().command)),Y(e,n)},s=e=>{Y(e,Ws())};Z(a,e=>{t().command?e(o):e(s,-1)}),U(()=>X(i,K(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),Y(e,n)};Z(E,e=>{(!K(a)||!$.data?.control)&&t().fileChanges?.length?e(te):K(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(O,1)});var ne=H(E,2),k=e=>{var n=Ks(),r=V(n);U(()=>X(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),Y(e,n)};Z(ne,e=>{K(a)||e(k)}),Y(e,o)},r=L(void 0),i=Gi(t,`params`,19,()=>({})),a=F(()=>$.data?.sessions||[]),o=F(()=>$.data?.control&&$.data.profiles||[]),s=F(()=>($.data?.triggers||[]).filter(e=>K(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&K(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=L(!1);function d(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}vn(()=>{let e=i().id;e&&fr(()=>{oa.selected=e,pa(e,2)})});let p=F(()=>K(a).find(e=>e.id===i().id)),m=F(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&K(o).some(e=>e.session===i().id&&e.pending)),h=F(()=>K(a).some(e=>e.id===oa.selected)?oa.selected:K(a)[0]?.id),v=F(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=F(()=>[[`OBSERVED TOKENS`,ma(K(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(K(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,K(v)?`—`:ma(K(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=F(()=>K(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=F(()=>K(a).filter(e=>e.status===`TURN COMPLETE`&&!K(s).some(t=>t.session===e.id)&&!K(o).some(t=>t.session===e.id&&t.pending)));function w(e){oa.selected=e,lr().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function T(e,t){if(w(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;n>2?location.hash=`/sessions/`+encodeURIComponent(e):pa(e,n)}function E(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),T(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||K(h)))e.preventDefault(),T(i().id||K(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&K(a).length){e.preventDefault();let t=K(a).findIndex(e=>e.id===K(h));w(K(a)[Math.max(0,Math.min(K(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function D(e){return K(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ee(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var te=yc();xr(`keydown`,Qt,E);var O=B(te),ne=V(H(z(O),2));P(O);var k=H(O,2);let re;Xr(k,21,()=>K(b),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1];var a=Js();let o;var s=z(a),c=V(s,!0),l=V(H(s,2),!0);P(a),U(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),X(c,r()),X(l,i())}),Y(e,a)}),P(k);var ie=H(k,2),ae=V(ie),oe=H(ie,2),se=e=>{Y(e,Ys())};Z(oe,e=>{K(v)&&e(se)});var A=H(oe,2),ce=e=>{Y(e,Xs())};Z(A,e=>{$.data?.profileError&&e(ce)});var le=H(A,2),ue=e=>{var t=ec(),n=z(t);Xr(n,17,()=>K(x),Kr,(e,t)=>{var n=Zs();let r;var i=V(n);U((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),X(i,`${K(t).status??``} - ${o??``} // ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>K(t).status===`APPROVAL NEEDED`||K(t).status===`INPUT NEEDED`||y(K(t)),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)});var r=H(n,2);Xr(r,17,()=>K(o).filter(e=>e.pending&&K(a).some(t=>t.id===e.session)),Kr,(e,t)=>{var n=Qs(),r=V(n);U((e,a,o)=>{Q(n,`title`,i().id&&i().id!==K(t).session&&K(u)?`Finish sending or clear your current draft before switching sessions.`:`Review this session’s quota threshold`),Q(n,`href`,e),X(r,`QUOTA THRESHOLD ${a??``} // ${o??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session)+`?review=profile`,()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory||K(t).session]),q(`click`,n,e=>d(e,K(t).session)),Y(e,n)});var l=H(r,2);Xr(l,17,()=>K(C),Kr,(e,t)=>{var n=$s(),r=V(n);U((e,i)=>{Q(n,`href`,e),X(r,`TURN COMPLETE ${i??``} // - ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)}),Xr(H(l,2),17,()=>K(s),Kr,(e,t)=>{var n=$s(),r=V(n);U((e,t,i)=>{Q(n,`href`,e),X(r,`TRIGGER SET ${t??``} // ${i??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session),()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory]),q(`click`,n,e=>c(e,K(t).session)),Y(e,n)}),P(t),Y(e,t)},de=F(()=>(K(x).length||K(C).length||K(o).some(e=>e.pending)||K(s).length)&&!K(v));Z(le,e=>{K(de)&&e(ue)});var fe=H(le,2),j=e=>{var t=Nr(),a=B(t),s=e=>{var t=oc(),a=z(t),s=z(a);let c;var d=z(s);let f;var h=H(d);P(s);var g=H(s,2);P(a);var _=H(a,2),b=e=>{var t=Ks(),n=V(t,!0);U(()=>X(n,K(p).directory)),Y(e,t)};Z(_,e=>{K(p).name&&K(p).directory&&e(b)});var x=H(_,2),S=V(x),C=H(x,2);let T;var E=z(C),D=z(E);n(D,()=>K(p),()=>!0,()=>!0),P(E);var ee=H(E,2),te=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{{let t=F(()=>new URLSearchParams(Xi.querystring).get(`schedule`)===`edit`),n=F(()=>K(p).fileChanges||[]);Es(e,{get session(){return K(p).id},oncopy:()=>K(r)?.copy(),get openScheduler(){return K(t)},get observedCommand(){return K(p).command},get observedFileChanges(){return K(n)},get suspended(){return K(m)},onProtectedChange:e=>{R(u,e,!0)}})}}),Y(e,t)},O=e=>{var t=tc();Gr(H(z(t),2),()=>K(p).id,e=>{zo(e,{get session(){return K(p).id},localOnly:!0,oncopy:()=>K(r)?.copy()})}),P(t),Y(e,t)};Z(ee,e=>{$.data?.control?e(te):e(O,-1)}),P(C);var ne=H(C,2);Xr(ne,17,()=>K(o).filter(e=>e.session===K(p).id),e=>e.session,(e,t)=>{var n=ic(),r=z(n),i=e=>{var n=nc(),r=V(n,!0);U(()=>X(r,K(t).notice)),Y(e,n)};Z(r,e=>{K(t).notice&&e(i)});var a=H(r,2),o=e=>{Es(e,{get session(){return K(p).id},review:`profile`})},s=e=>{var t=rc();U(e=>Q(t,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(p).id)+`?review=profile`]),Y(e,t)};Z(a,e=>{K(t).pending&&K(m)?e(o):K(t).pending&&e(s,1)}),P(n),U(()=>Q(n,`id`,`quota-profile-`+K(p).id)),Y(e,n)});var k=H(ne,2),re=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Ns(e,{get session(){return K(p)},get stale(){return K(v)},children:e=>{var t=Nr(),n=B(t),i=e=>{Li(Fs(e,{get session(){return K(p)},active:!0,compact:!0}),e=>R(r,e,!0),()=>K(r))};Z(n,e=>{K(m)||e(i)}),Y(e,t)},$$slots:{default:!0}})}),Y(e,t)},ie=e=>{var t=ac(),n=B(t),i=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Li(Fs(e,{get session(){return K(p)},active:!0}),e=>R(r,e,!0),()=>K(r))}),Y(e,t)};Z(n,e=>{K(m)||e(i)}),Gr(H(n,2),()=>K(p).id,e=>{Ns(e,{get session(){return K(p)},get stale(){return K(v)}})}),Y(e,t)};Z(k,e=>{K(p).goal?e(re):e(ie,-1)}),P(t),U((e,t,n,r)=>{c=li(s,1,`svelte-mm4wfe`,null,c,{failed:e}),f=li(d,1,`lamp lit svelte-mm4wfe`,null,f,{failed:t,working:K(p).status===`WORKING`&&!K(v)}),X(h,`${n??``} // ${(K(p).name||K(p).directory)??``}`),X(S,`${r??``} TOKENS // ${K(p).id??``} // CONTEXT SOURCE // ${(K(p).source||`LOCAL`)??``}`),T=di(C,``,T,{display:K(m)?`none`:void 0})},[()=>y(K(p))&&!K(v)&&!K(m),()=>y(K(p))&&!K(v),()=>K(v)?`STALE`:K(m)?`QUOTA THRESHOLD`:l(K(p)),()=>ma(K(p).tokens)]),q(`click`,g,()=>{w(i().id),pa(i().id,2)}),Y(e,t)},c=e=>{Y(e,sc())};Z(a,e=>{K(p)?e(s):e(c,-1)}),Y(e,t)},pe=e=>{var t=vc(),r=B(t),i=H(z(r),2),s=z(i),c=H(s,2);P(i),P(r);var u=H(r,2);Xr(u,17,()=>K(a),e=>e.id,(e,t)=>{let r=F(()=>da(K(t).id));var i=gc();let a;var s=z(i),c=z(s),u=e=>{var n=cc(),r=z(n),i=V(r);P(n),U(e=>{Q(r,`aria-pressed`,K(h)===K(t).id),X(i,`${e??``} // ${K(t).name??``}`)},[()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,r,()=>w(K(t).id)),Y(e,n)};Z(c,e=>{K(t).name&&e(u)});var f=H(c,2),p=z(f);let m;var g=z(p);let _;var b=H(g,1,!0);P(p),P(f);var x=H(f,2),S=e=>{var n=lc(),r=V(n,!0);U(()=>{Q(n,`aria-pressed`,K(h)===K(t).id),X(r,K(t).directory||K(t).id)}),q(`click`,n,()=>w(K(t).id)),Y(e,n)};Z(x,e=>{K(t).name||e(S)});var C=H(x,2),E=z(C);xe(),P(C);var D=H(C,2),te=e=>{var n=Ks(),r=V(n,!0);U(()=>X(r,K(t).directory)),Y(e,n)};Z(D,e=>{K(t).name&&K(t).directory&&e(te)});var O=H(D,2),ne=V(O),k=H(O,2),re=V(k),ie=H(k,2);Os(ie,{get goal(){return K(t).goal},get stale(){return K(v)}});var ae=H(ie,2),oe=z(ae),se=H(oe,2),A=V(se,!0),ce=H(se,2);P(ae);var le=H(ae,2),ue=H(le,2),de=e=>{var n=uc(),r=V(n,!0);U(e=>X(r,e),[()=>K(t).status===`CHECK SESSION`?`INFERRED INACTIVITY`:y(K(t))?`OPEN DETAIL FOR THE TURN ERROR`:$.data?.control?`OPEN FULL DETAIL OR REPLY IN CODEX`:K(t).status===`APPROVAL NEEDED`?`APPROVE OR DECLINE IN CODEX`:`REPLY IN CODEX`]),Y(e,n)},fe=F(()=>!K(v)&&([`APPROVAL NEEDED`,`INPUT NEEDED`,`CHECK SESSION`].includes(K(t).status)||y(K(t))));Z(ue,e=>{K(fe)&&e(de)}),P(s);var j=H(s,2),pe=e=>{var r=mc(),i=z(r),a=z(i),s=V(a,!0),c=H(a,2),l=e=>{var n=dc(),r=V(n,!0);U(e=>{Q(n,`href`,e),X(r,$.data?.control?`REVIEW IN FULL DETAIL ↗`:`APPROVAL IN CODEX ↗`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id)]),Y(e,n)};Z(c,e=>{!K(v)&&K(t).status===`APPROVAL NEEDED`&&e(l)}),P(i);var u=H(i,2);n(u,()=>K(t),()=>!1);var f=H(u,2);Xr(f,17,()=>K(o).filter(e=>e.session===K(t).id),Kr,(e,n)=>{var r=ac(),i=B(r),a=e=>{var t=fc(),r=V(t,!0);U(()=>X(r,K(n).notice)),Y(e,t)};Z(i,e=>{K(n).notice&&e(a)});var o=H(i,2),s=e=>{var n=pc();U(e=>Q(n,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(t).id)+`?review=profile`]),q(`click`,n,e=>d(e,K(t).id)),Y(e,n)};Z(o,e=>{K(n).pending&&e(s)}),Y(e,r)});var p=H(f,2);{let e=F(()=>K(h)===K(t).id);Fs(p,{get session(){return K(t)},get active(){return K(e)}})}P(r),U(e=>X(s,e),[()=>ee(K(t))]),Y(e,r)};Z(j,e=>{K(r)>0&&e(pe)});var me=H(j,2),he=e=>{var n=hc(),r=H(z(n),2);{let e=F(()=>(K(t).samples||[]).map(e=>e.tokens));ao(r,{get values(){return K(e)},capacity:120})}var i=V(H(r,2));P(n),U(()=>X(i,`LAST ${(K(t).samples?.length||0)??``} SAMPLES // AUTO SCALE`)),Y(e,n)};Z(me,e=>{K(r)<2&&e(he)}),P(i),U((e,n,o,s,c,l,u)=>{a=li(i,1,`session-row`,null,a,{selected:K(h)===K(t).id,wide:K(r)===2,split:K(r)===1}),Q(i,`aria-label`,`Session `+(K(t).name||K(t).directory||K(t).id)),m=li(p,1,`status-detail svelte-mm4wfe`,null,m,{failed:e}),Q(p,`href`,n),_=li(g,1,`lamp lit svelte-mm4wfe`,null,_,{failed:o,working:K(t).status===`WORKING`&&!K(v)}),X(b,s),X(E,`${c??``} `),X(ne,`${K(t).agents??``} LINKED AGENTS`),X(re,`ACTIVE // ${l??``}`),oe.disabled=K(r)===0,Q(se,`aria-expanded`,K(r)>0),X(A,K(r)?`HIDE DETAIL`:`SHOW DETAIL`),Q(le,`href`,u)},[()=>y(K(t))&&!K(v),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>y(K(t))&&!K(v),()=>K(v)?`STALE`:l(K(t)),()=>ma(K(t).tokens),()=>ha(K(t).activity),()=>`#/sessions/`+encodeURIComponent(K(t).id)]),q(`click`,p,()=>w(K(t).id)),q(`click`,oe,()=>T(K(t).id,-1)),q(`click`,se,()=>{w(K(t).id),pa(K(t).id,+!K(r))}),q(`click`,ce,()=>T(K(t).id,1)),q(`click`,le,()=>w(K(t).id)),Y(e,i)});var f=H(u,2),p=e=>{Y(e,_c())};Z(f,e=>{K(a).length||e(p)}),q(`click`,s,()=>fa(1)),q(`click`,c,()=>fa(0)),Y(e,t)};Z(fe,e=>{i().id?e(j):e(pe,-1)}),U(e=>{X(ne,`OBSERVED ${e??``}`),re=li(k,1,`session-totals`,null,re,{stale:K(v)}),X(ae,`${K(v)?`LAST KNOWN TOTALS — live state counts unavailable. `:``}Tokens + visible.

      `),Qs=J(` `),$s=J(` `),ec=J(` `),tc=J(``),nc=J(`

      Read only — reply or approve in Codex.

      `),rc=J(`

      `),ic=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),ac=J(`
      `),oc=J(` `,1),sc=J(`
      `),cc=J(`

      This session is no longer in the current observation. Return to sessions.

      `),lc=J(`

      `),uc=J(``),dc=J(`

      `),fc=J(` `),pc=J(`

      `),mc=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),hc=J(`

      `),gc=J(`

      TOKEN ACTIVITY // 30 SECOND SAMPLES

      `),_c=J(`

      TOKENS

      FULL DETAIL →
      `),vc=J(`

      No locally observed sessions yet. Keep Codex running alongside + Codexometer.

      `),yc=J(`

      ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

      `,1),bc=J(`

      SESSION TOTALS

      `,1);function xc(e,t){Ue(t,!0);let n=(e,t=f,n,r)=>{let i=pt(()=>g(n?.(),!0)),a=pt(()=>g(r?.(),!1));var o=Js(),s=B(o),c=e=>{var n=Ls(),r=B(n),i=V(r,!0),a=V(H(r,2),!0);U(()=>{X(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),X(a,t().currentTask)}),Y(e,n)};Z(s,e=>{t().currentTask&&e(c)});var l=H(s,2),u=e=>{var n=Rs(),r=V(H(B(n),2),!0);U(()=>X(r,t().latestGuidance)),Y(e,n)};Z(l,e=>{t().latestGuidance&&e(u)});var d=H(l,2),p=e=>{var n=zs(),r=V(H(B(n),2),!0);xe(2),U(()=>X(r,t().approvalContext)),Y(e,n)};Z(d,e=>{K(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=H(d,2),h=e=>{var n=Bs();let r;var i=V(n,!0);U(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),X(i,e)},[()=>D(t())]),Y(e,n)},_=F(()=>D(t())&&(!K(a)||K(v)||t().status===`CHECK SESSION`||y(t())));Z(m,e=>{K(_)&&e(h)});var b=H(m,2),x=e=>{var n=Vs(),r=V(n,!0);U(e=>X(r,e),[()=>ee(t())]),Y(e,n)};Z(b,e=>{K(i)&&e(x)});var S=H(b,2),C=e=>{var n=Hs(),r=V(n,!0);U(()=>X(r,t().text||`No session context available.`)),Y(e,n)};Z(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=H(S,2),T=e=>{var n=Us(),r=H(B(n),2),i=z(r),a=H(i),o=e=>{var n=Mr();U(()=>X(n,`// ${t().commandTiming??``}`)),Y(e,n)};Z(a,e=>{t().commandTiming&&e(o)});var s=H(a,2),c=e=>{var n=Mr();U(()=>X(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),Y(e,n)};Z(s,e=>{!K(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=H(s,2),u=e=>{Y(e,Mr(`+`))};Z(l,e=>{t().runningLimited&&e(u)}),P(r);var d=V(H(r,2),!0);U(e=>{X(i,`COMMAND // ${e??``} `),X(d,t().workingCommand)},[()=>K(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),Y(e,n)};Z(w,e=>{t().workingCommand&&e(T)});var E=H(w,2),te=e=>{Uo(e,{get lines(){return t().fileChanges}})},O=e=>{var n=Ks(),r=H(B(n),2),i=V(r,!0),a=H(r,2),o=e=>{var n=Ws(),r=V(n,!0);U(()=>X(r,t().command)),Y(e,n)},s=e=>{Y(e,Gs())};Z(a,e=>{t().command?e(o):e(s,-1)}),U(()=>X(i,K(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),Y(e,n)};Z(E,e=>{(!K(a)||!$.data?.control)&&t().fileChanges?.length?e(te):K(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(O,1)});var ne=H(E,2),k=e=>{var n=qs(),r=V(n);U(()=>X(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),Y(e,n)};Z(ne,e=>{K(a)||e(k)}),Y(e,o)},r=L(void 0),i=Gi(t,`params`,19,()=>({})),a=F(()=>$.data?.sessions||[]),o=F(()=>$.data?.control&&$.data.profiles||[]),s=F(()=>($.data?.triggers||[]).filter(e=>K(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&K(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=L(!1);function d(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}vn(()=>{let e=i().id;e&&fr(()=>{oa.selected=e,pa(e,2)})});let p=F(()=>K(a).find(e=>e.id===i().id)),m=F(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&K(o).some(e=>e.session===i().id&&e.pending)),h=F(()=>K(a).some(e=>e.id===oa.selected)?oa.selected:K(a)[0]?.id),v=F(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=F(()=>[[`OBSERVED TOKENS`,ma(K(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(K(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,K(v)?`—`:ma(K(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=F(()=>K(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=F(()=>K(a).filter(e=>e.status===`TURN COMPLETE`&&!K(s).some(t=>t.session===e.id)&&!K(o).some(t=>t.session===e.id&&t.pending)));function w(e){oa.selected=e,lr().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function T(e,t){if(w(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;n>2?location.hash=`/sessions/`+encodeURIComponent(e):pa(e,n)}function E(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),T(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||K(h)))e.preventDefault(),T(i().id||K(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&K(a).length){e.preventDefault();let t=K(a).findIndex(e=>e.id===K(h));w(K(a)[Math.max(0,Math.min(K(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function D(e){return K(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ee(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var te=bc();xr(`keydown`,Qt,E);var O=B(te),ne=V(H(z(O),2));P(O);var k=H(O,2);let re;Xr(k,21,()=>K(b),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1];var a=Ys();let o;var s=z(a),c=V(s,!0),l=V(H(s,2),!0);P(a),U(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),X(c,r()),X(l,i())}),Y(e,a)}),P(k);var ie=H(k,2),ae=V(ie),oe=H(ie,2),se=e=>{Y(e,Xs())};Z(oe,e=>{K(v)&&e(se)});var A=H(oe,2),ce=e=>{Y(e,Zs())};Z(A,e=>{$.data?.profileError&&e(ce)});var le=H(A,2),ue=e=>{var t=tc(),n=z(t);Xr(n,17,()=>K(x),Kr,(e,t)=>{var n=Qs();let r;var i=V(n);U((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),X(i,`${K(t).status??``} + ${o??``} // ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>K(t).status===`APPROVAL NEEDED`||K(t).status===`INPUT NEEDED`||y(K(t)),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)});var r=H(n,2);Xr(r,17,()=>K(o).filter(e=>e.pending&&K(a).some(t=>t.id===e.session)),Kr,(e,t)=>{var n=$s(),r=V(n);U((e,a,o)=>{Q(n,`title`,i().id&&i().id!==K(t).session&&K(u)?`Finish sending or clear your current draft before switching sessions.`:`Review this session’s quota threshold`),Q(n,`href`,e),X(r,`QUOTA THRESHOLD ${a??``} // ${o??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session)+`?review=profile`,()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory||K(t).session]),q(`click`,n,e=>d(e,K(t).session)),Y(e,n)});var l=H(r,2);Xr(l,17,()=>K(C),Kr,(e,t)=>{var n=ec(),r=V(n);U((e,i)=>{Q(n,`href`,e),X(r,`TURN COMPLETE ${i??``} // + ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)}),Xr(H(l,2),17,()=>K(s),Kr,(e,t)=>{var n=ec(),r=V(n);U((e,t,i)=>{Q(n,`href`,e),X(r,`TRIGGER SET ${t??``} // ${i??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session),()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory]),q(`click`,n,e=>c(e,K(t).session)),Y(e,n)}),P(t),Y(e,t)},de=F(()=>(K(x).length||K(C).length||K(o).some(e=>e.pending)||K(s).length)&&!K(v));Z(le,e=>{K(de)&&e(ue)});var fe=H(le,2),j=e=>{var t=Nr(),a=B(t),s=e=>{var t=sc(),a=z(t),s=z(a);let c;var d=z(s);let f;var h=H(d);P(s);var g=H(s,2);P(a);var _=H(a,2),b=e=>{var t=qs(),n=V(t,!0);U(()=>X(n,K(p).directory)),Y(e,t)};Z(_,e=>{K(p).name&&K(p).directory&&e(b)});var x=H(_,2),S=V(x),C=H(x,2);let T;var E=z(C),D=z(E);n(D,()=>K(p),()=>!0,()=>!0),P(E);var ee=H(E,2),te=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{{let t=F(()=>new URLSearchParams(Xi.querystring).get(`schedule`)===`edit`),n=F(()=>K(p).fileChanges||[]);Ds(e,{get session(){return K(p).id},oncopy:()=>K(r)?.copy(),get openScheduler(){return K(t)},get observedCommand(){return K(p).command},get observedFileChanges(){return K(n)},get suspended(){return K(m)},onProtectedChange:e=>{R(u,e,!0)}})}}),Y(e,t)},O=e=>{var t=nc();Gr(H(z(t),2),()=>K(p).id,e=>{zo(e,{get session(){return K(p).id},localOnly:!0,oncopy:()=>K(r)?.copy()})}),P(t),Y(e,t)};Z(ee,e=>{$.data?.control?e(te):e(O,-1)}),P(C);var ne=H(C,2);Xr(ne,17,()=>K(o).filter(e=>e.session===K(p).id),e=>e.session,(e,t)=>{var n=ac(),r=z(n),i=e=>{var n=rc(),r=V(n,!0);U(()=>X(r,K(t).notice)),Y(e,n)};Z(r,e=>{K(t).notice&&e(i)});var a=H(r,2),o=e=>{Ds(e,{get session(){return K(p).id},review:`profile`})},s=e=>{var t=ic();U(e=>Q(t,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(p).id)+`?review=profile`]),Y(e,t)};Z(a,e=>{K(t).pending&&K(m)?e(o):K(t).pending&&e(s,1)}),P(n),U(()=>Q(n,`id`,`quota-profile-`+K(p).id)),Y(e,n)});var k=H(ne,2),re=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Ps(e,{get session(){return K(p)},get stale(){return K(v)},children:e=>{var t=Nr(),n=B(t),i=e=>{Li(Is(e,{get session(){return K(p)},active:!0,compact:!0}),e=>R(r,e,!0),()=>K(r))};Z(n,e=>{K(m)||e(i)}),Y(e,t)},$$slots:{default:!0}})}),Y(e,t)},ie=e=>{var t=oc(),n=B(t),i=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Li(Is(e,{get session(){return K(p)},active:!0}),e=>R(r,e,!0),()=>K(r))}),Y(e,t)};Z(n,e=>{K(m)||e(i)}),Gr(H(n,2),()=>K(p).id,e=>{Ps(e,{get session(){return K(p)},get stale(){return K(v)}})}),Y(e,t)};Z(k,e=>{K(p).goal?e(re):e(ie,-1)}),P(t),U((e,t,n,r)=>{c=li(s,1,`svelte-mm4wfe`,null,c,{failed:e}),f=li(d,1,`lamp lit svelte-mm4wfe`,null,f,{failed:t,working:K(p).status===`WORKING`&&!K(v)}),X(h,`${n??``} // ${(K(p).name||K(p).directory)??``}`),X(S,`${r??``} TOKENS // ${K(p).id??``} // CONTEXT SOURCE // ${(K(p).source||`LOCAL`)??``}`),T=di(C,``,T,{display:K(m)?`none`:void 0})},[()=>y(K(p))&&!K(v)&&!K(m),()=>y(K(p))&&!K(v),()=>K(v)?`STALE`:K(m)?`QUOTA THRESHOLD`:l(K(p)),()=>ma(K(p).tokens)]),q(`click`,g,()=>{w(i().id),pa(i().id,2)}),Y(e,t)},c=e=>{Y(e,cc())};Z(a,e=>{K(p)?e(s):e(c,-1)}),Y(e,t)},pe=e=>{var t=yc(),r=B(t),i=H(z(r),2),s=z(i),c=H(s,2);P(i),P(r);var u=H(r,2);Xr(u,17,()=>K(a),e=>e.id,(e,t)=>{let r=F(()=>da(K(t).id));var i=_c();let a;var s=z(i),c=z(s),u=e=>{var n=lc(),r=z(n),i=V(r);P(n),U(e=>{Q(r,`aria-pressed`,K(h)===K(t).id),X(i,`${e??``} // ${K(t).name??``}`)},[()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,r,()=>w(K(t).id)),Y(e,n)};Z(c,e=>{K(t).name&&e(u)});var f=H(c,2),p=z(f);let m;var g=z(p);let _;var b=H(g,1,!0);P(p),P(f);var x=H(f,2),S=e=>{var n=uc(),r=V(n,!0);U(()=>{Q(n,`aria-pressed`,K(h)===K(t).id),X(r,K(t).directory||K(t).id)}),q(`click`,n,()=>w(K(t).id)),Y(e,n)};Z(x,e=>{K(t).name||e(S)});var C=H(x,2),E=z(C);xe(),P(C);var D=H(C,2),te=e=>{var n=qs(),r=V(n,!0);U(()=>X(r,K(t).directory)),Y(e,n)};Z(D,e=>{K(t).name&&K(t).directory&&e(te)});var O=H(D,2),ne=V(O),k=H(O,2),re=V(k),ie=H(k,2);ks(ie,{get goal(){return K(t).goal},get stale(){return K(v)}});var ae=H(ie,2),oe=z(ae),se=H(oe,2),A=V(se,!0),ce=H(se,2);P(ae);var le=H(ae,2),ue=H(le,2),de=e=>{var n=dc(),r=V(n,!0);U(e=>X(r,e),[()=>K(t).status===`CHECK SESSION`?`INFERRED INACTIVITY`:y(K(t))?`OPEN DETAIL FOR THE TURN ERROR`:$.data?.control?`OPEN FULL DETAIL OR REPLY IN CODEX`:K(t).status===`APPROVAL NEEDED`?`APPROVE OR DECLINE IN CODEX`:`REPLY IN CODEX`]),Y(e,n)},fe=F(()=>!K(v)&&([`APPROVAL NEEDED`,`INPUT NEEDED`,`CHECK SESSION`].includes(K(t).status)||y(K(t))));Z(ue,e=>{K(fe)&&e(de)}),P(s);var j=H(s,2),pe=e=>{var r=hc(),i=z(r),a=z(i),s=V(a,!0),c=H(a,2),l=e=>{var n=fc(),r=V(n,!0);U(e=>{Q(n,`href`,e),X(r,$.data?.control?`REVIEW IN FULL DETAIL ↗`:`APPROVAL IN CODEX ↗`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id)]),Y(e,n)};Z(c,e=>{!K(v)&&K(t).status===`APPROVAL NEEDED`&&e(l)}),P(i);var u=H(i,2);n(u,()=>K(t),()=>!1);var f=H(u,2);Xr(f,17,()=>K(o).filter(e=>e.session===K(t).id),Kr,(e,n)=>{var r=oc(),i=B(r),a=e=>{var t=pc(),r=V(t,!0);U(()=>X(r,K(n).notice)),Y(e,t)};Z(i,e=>{K(n).notice&&e(a)});var o=H(i,2),s=e=>{var n=mc();U(e=>Q(n,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(t).id)+`?review=profile`]),q(`click`,n,e=>d(e,K(t).id)),Y(e,n)};Z(o,e=>{K(n).pending&&e(s)}),Y(e,r)});var p=H(f,2);{let e=F(()=>K(h)===K(t).id);Is(p,{get session(){return K(t)},get active(){return K(e)}})}P(r),U(e=>X(s,e),[()=>ee(K(t))]),Y(e,r)};Z(j,e=>{K(r)>0&&e(pe)});var me=H(j,2),he=e=>{var n=gc(),r=H(z(n),2);{let e=F(()=>(K(t).samples||[]).map(e=>e.tokens));ao(r,{get values(){return K(e)},capacity:120})}var i=V(H(r,2));P(n),U(()=>X(i,`LAST ${(K(t).samples?.length||0)??``} SAMPLES // AUTO SCALE`)),Y(e,n)};Z(me,e=>{K(r)<2&&e(he)}),P(i),U((e,n,o,s,c,l,u)=>{a=li(i,1,`session-row`,null,a,{selected:K(h)===K(t).id,wide:K(r)===2,split:K(r)===1}),Q(i,`aria-label`,`Session `+(K(t).name||K(t).directory||K(t).id)),m=li(p,1,`status-detail svelte-mm4wfe`,null,m,{failed:e}),Q(p,`href`,n),_=li(g,1,`lamp lit svelte-mm4wfe`,null,_,{failed:o,working:K(t).status===`WORKING`&&!K(v)}),X(b,s),X(E,`${c??``} `),X(ne,`${K(t).agents??``} LINKED AGENTS`),X(re,`ACTIVE // ${l??``}`),oe.disabled=K(r)===0,Q(se,`aria-expanded`,K(r)>0),X(A,K(r)?`HIDE DETAIL`:`SHOW DETAIL`),Q(le,`href`,u)},[()=>y(K(t))&&!K(v),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>y(K(t))&&!K(v),()=>K(v)?`STALE`:l(K(t)),()=>ma(K(t).tokens),()=>ha(K(t).activity),()=>`#/sessions/`+encodeURIComponent(K(t).id)]),q(`click`,p,()=>w(K(t).id)),q(`click`,oe,()=>T(K(t).id,-1)),q(`click`,se,()=>{w(K(t).id),pa(K(t).id,+!K(r))}),q(`click`,ce,()=>T(K(t).id,1)),q(`click`,le,()=>w(K(t).id)),Y(e,i)});var f=H(u,2),p=e=>{Y(e,vc())};Z(f,e=>{K(a).length||e(p)}),q(`click`,s,()=>fa(1)),q(`click`,c,()=>fa(0)),Y(e,t)};Z(fe,e=>{i().id?e(j):e(pe,-1)}),U(e=>{X(ne,`OBSERVED ${e??``}`),re=li(k,1,`session-totals`,null,re,{stale:K(v)}),X(ae,`${K(v)?`LAST KNOWN TOTALS — live state counts unavailable. `:``}Tokens observed since this server started for currently listed sessions; linked agents are already included. Totals can decrease when a session leaves the - list. History samples every 30 seconds. Not account-wide totals.`)},[()=>ha($.data?.sessionsAt)]),Y(e,te),We()}Sr([`click`]);var xc=J(``),Sc=J(`

      `),Cc=J(`

      Relative usage/credits are not tokens or quota percentages. Groupings - describe the same usage, not additional consumption.

      `,1),wc=J(`// APPROXIMATE`),Tc=J(`

      Partial accounting: totals may still change.

      `),Ec=J(`

      Percentage of this period's historical allowance, not today's limit. May - exceed 100%. This is not a manual/automatic reset log.

      `,1),Dc=J(`

      `,1),Oc=J(`

      This optional account report is unavailable. Token history remains - available; missing data does not mean zero usage.

      `),kc=J(`
      `),Ac=J(`
      `),jc=J(`

      No usage reported for this day.

      `),Mc=J(`

      Selected breakdown unavailable; missing does not mean zero.

      `),Nc=J(`

      `,1);function Pc(e,t){Ue(t,!0);let n=L(Yt(co[0])),r=L(0),i=F(()=>t.reports?.daily),a=F(()=>t.reports?.plan),o=F(()=>t.mode===`breakdown`?K(i)?.days?.length||0:K(a)?.periods?.length||0),s=F(()=>Math.min(K(r),Math.max(0,K(o)-1))),c=F(()=>K(i)?.days?.[(K(i)?.days?.length||0)-1-K(s)]),l=F(()=>K(a)?.periods?.[K(s)]),u=F(()=>t.mode===`breakdown`?K(i)?.units||``:`%`),d=F(()=>(t.mode===`breakdown`?K(c):K(l))?.views?.[K(n)]),f=F(()=>K(d)?.rows||[]),p=F(()=>K(d)?.total),m=F(()=>K(d)?.level||`unknown`),h=F(()=>K(d)?.peak||1),g=e=>e==null?`UNKNOWN`:e.toLocaleString(`en-GB`,{maximumFractionDigits:2});var _=Nc(),v=B(_),y=z(v),b=H(z(y));Xr(b,21,()=>co,Kr,(e,t)=>{var n=xc(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).charAt(0).toUpperCase()+K(t).slice(1)]),Y(e,n)}),P(b),hi(b),P(y);var x=H(y,2),S=H(x,2),C=V(H(S,2),!0);P(v);var w=H(v,2),T=z(w),E=V(T,!0),D=H(T,2),ee=V(D),te=H(D,2),O=e=>{var t=Cc(),n=B(t),r=V(n),a=H(n,2),o=e=>{var t=Sc(),n=V(t);U(()=>X(n,`Data as of ${K(i).dataAsOf??``}`)),Y(e,t)};Z(a,e=>{K(i).dataAsOf&&e(o)});var s=V(H(a,2));xe(2),U((e,t)=>{X(r,`Latest fetch ${e??``} // queried ${K(i).from??``} → ${K(i).through??``}. + list. History samples every 30 seconds. Not account-wide totals.`)},[()=>ha($.data?.sessionsAt)]),Y(e,te),We()}Sr([`click`]);var Sc=J(``),Cc=J(`

      `),wc=J(`

      Relative usage/credits are not tokens or quota percentages. Groupings + describe the same usage, not additional consumption.

      `,1),Tc=J(`// APPROXIMATE`),Ec=J(`

      Partial accounting: totals may still change.

      `),Dc=J(`

      Percentage of this period's historical allowance, not today's limit. May + exceed 100%. This is not a manual/automatic reset log.

      `,1),Oc=J(`

      `,1),kc=J(`

      This optional account report is unavailable. Token history remains + available; missing data does not mean zero usage.

      `),Ac=J(`
      `),jc=J(`
      `),Mc=J(`

      No usage reported for this day.

      `),Nc=J(`

      Selected breakdown unavailable; missing does not mean zero.

      `),Pc=J(`

      `,1);function Fc(e,t){Ue(t,!0);let n=L(Yt(co[0])),r=L(0),i=F(()=>t.reports?.daily),a=F(()=>t.reports?.plan),o=F(()=>t.mode===`breakdown`?K(i)?.days?.length||0:K(a)?.periods?.length||0),s=F(()=>Math.min(K(r),Math.max(0,K(o)-1))),c=F(()=>K(i)?.days?.[(K(i)?.days?.length||0)-1-K(s)]),l=F(()=>K(a)?.periods?.[K(s)]),u=F(()=>t.mode===`breakdown`?K(i)?.units||``:`%`),d=F(()=>(t.mode===`breakdown`?K(c):K(l))?.views?.[K(n)]),f=F(()=>K(d)?.rows||[]),p=F(()=>K(d)?.total),m=F(()=>K(d)?.level||`unknown`),h=F(()=>K(d)?.peak||1),g=e=>e==null?`UNKNOWN`:e.toLocaleString(`en-GB`,{maximumFractionDigits:2});var _=Pc(),v=B(_),y=z(v),b=H(z(y));Xr(b,21,()=>co,Kr,(e,t)=>{var n=Sc(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).charAt(0).toUpperCase()+K(t).slice(1)]),Y(e,n)}),P(b),hi(b),P(y);var x=H(y,2),S=H(x,2),C=V(H(S,2),!0);P(v);var w=H(v,2),T=z(w),E=V(T,!0),D=H(T,2),ee=V(D),te=H(D,2),O=e=>{var t=wc(),n=B(t),r=V(n),a=H(n,2),o=e=>{var t=Cc(),n=V(t);U(()=>X(n,`Data as of ${K(i).dataAsOf??``}`)),Y(e,t)};Z(a,e=>{K(i).dataAsOf&&e(o)});var s=V(H(a,2));xe(2),U((e,t)=>{X(r,`Latest fetch ${e??``} // queried ${K(i).from??``} → ${K(i).through??``}. Reports are fetched from OpenAI and are not saved between runs.`),X(s,`${(K(c)?.date||`No daily buckets reported`)??``} // ${t??``} - ${K(u)??``}`)},[()=>ha(K(i).fetchedAt),()=>g(K(p))]),Y(e,t)},ne=e=>{var t=Dc(),n=B(t),r=z(n);let i;var o=V(r,!0),s=H(r),c=e=>{Y(e,wc())};Z(s,e=>{K(a).approximate&&e(c)});var u=H(s);P(n);var d=H(n,2),f=z(d),h=H(f),_=e=>{var t=Mr();U(()=>X(t,`// Boundary tolerance ${K(a).boundary_tolerance_seconds??``}s`)),Y(e,t)};Z(h,e=>{K(a).boundary_tolerance_seconds!=null&&e(_)}),P(d);var v=H(d,2),y=e=>{var t=Ec(),n=B(t),r=z(n),i=H(r);let a;var o=V(i);P(n);var s=H(n,2),c=V(s),u=H(s,2),d=e=>{Y(e,Tc())};Z(u,e=>{K(l).accounting_complete||e(d)}),xe(2),U(e=>{X(r,`${K(l).window_minutes??``} MIN // ${K(l).plan_type??``} // `),a=li(i,1,`svelte-1fbui7h`,null,a,{muted:K(m)===`unknown`,"quota-near":K(m)===`near`,"quota-full":K(m)===`full`}),X(o,`USED ${e??``}${K(p)==null?``:`%`}`),X(c,`${K(l).starts_at??``} → ${K(l).ends_at??``}`)},[()=>g(K(p))]),Y(e,t)};Z(v,e=>{K(l)&&e(y)}),U(e=>{i=li(r,1,`svelte-1fbui7h`,null,i,{"quality-warning":!K(a).coverage_complete}),X(o,K(a).coverage_complete?`Reported range complete`:`Partial coverage`),X(u,` // Latest fetch ${e??``}`),X(f,`Coverage starts ${(K(a).coverage_start||`unknown`)??``} // Data as of ${(K(a).data_as_of||`unknown`)??``}`)},[()=>ha(K(a).fetchedAt)]),Y(e,t)},k=e=>{Y(e,Oc())};Z(te,e=>{t.mode===`breakdown`&&K(i)?e(O):t.mode===`periods`&&K(a)?e(ne,1):e(k,-1)});var re=H(te,2),ie=e=>{var n=Ac(),r=z(n),i=V(H(z(r),2),!0);P(r),Xr(H(r,2),17,()=>K(f),Kr,(e,n,r)=>{let i=()=>K(n).name,a=()=>K(n).value;var o=kc();let s;var c=z(o),l=V(c,!0),u=H(c,2),d=z(u);let f;P(u);var p=V(H(u,2));P(o),U((e,n,a)=>{s=li(o,1,`report-row svelte-1fbui7h`,null,s,{unknown:e,alternate:r%2==1}),Q(c,`title`,i()),X(l,i()),f=di(d,``,f,{width:n}),X(p,`${a??``}${t.mode===`periods`?`%`:``}`)},[()=>i().trim().toLowerCase()===`unknown`,()=>`${Math.max(0,100*a()/K(h))}%`,()=>g(a())]),Y(e,o)}),P(n),U(()=>X(i,t.mode===`breakdown`?K(u):`QUOTA USED`)),Y(e,n)},ae=e=>{Y(e,jc())},oe=e=>{Y(e,Mc())};Z(re,e=>{K(f).length?e(ie):t.mode===`breakdown`&&K(d)?.knownEmpty?e(ae,1):(K(i)&&t.mode===`breakdown`||K(a)&&t.mode===`periods`)&&e(oe,2)}),P(w),U(()=>{x.disabled=K(s)>=K(o)-1,S.disabled=K(s)===0,X(C,K(o)?`${K(s)+1} / ${K(o)}`:`NO DATA`),X(E,t.mode===`breakdown`?`DAILY BREAKDOWN`:`QUOTA WINDOWS`),X(ee,`${(t.mode===`breakdown`?t.reports?.dailyStatus||`UNAVAILABLE`:t.reports?.planStatus||`UNAVAILABLE`)??``} // UTC`)}),gi(b,()=>K(n),e=>R(n,e)),q(`click`,x,()=>R(r,K(s)+1)),q(`click`,S,()=>R(r,K(s)-1)),Y(e,_),We()}Sr([`click`]);var Fc=864e5;function Ic(e,t){let n=new Date(e);n.setUTCDate(1),n.setUTCMonth(n.getUTCMonth()+t);let r=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,0)).getUTCDate();return n.setUTCDate(Math.min(e.getUTCDate(),r)),n}function Lc(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()));for(let e=0;;e++){let i=Ic(r,-t),a=new Date(i.getTime()+Fc);if(e===n)return{start:a,end:r};r=i}}var Rc=J(``),zc=J(``,1),Bc=J(`

      History refresh failed. Any displayed history is the last successful - observation.

      `),Vc=J(`

      Token history unavailable; other reports may still be available.

      `),Hc=J(``),Uc=J(`
      `),Wc=J(`

      LESS ░ ▒ ▓ █ MORE // HOVER FOR DATE AND TOKENS

      `,1),Gc=J(`
      `,1),Kc=J(` `),qc=J(`

      LIFETIME TOKENS

      PEAK DAY

      CURRENT STREAK

      DAYS

      LONGEST TURN

      SECONDS

      LONGEST STREAK

      DAYS

      OPENAI // UTC

      Accessible data table
      Date (UTC)Tokens

      `,1),Jc=J(`

      History unavailable or awaiting a matching account observation. Missing - history is not treated as zero usage.

      `),Yc=J(`

      USAGE // ACCOUNT HISTORY

      Account-wide history reported by Codex, not the local Sessions counter. Dates + ${K(u)??``}`)},[()=>ha(K(i).fetchedAt),()=>g(K(p))]),Y(e,t)},ne=e=>{var t=Oc(),n=B(t),r=z(n);let i;var o=V(r,!0),s=H(r),c=e=>{Y(e,Tc())};Z(s,e=>{K(a).approximate&&e(c)});var u=H(s);P(n);var d=H(n,2),f=z(d),h=H(f),_=e=>{var t=Mr();U(()=>X(t,`// Boundary tolerance ${K(a).boundary_tolerance_seconds??``}s`)),Y(e,t)};Z(h,e=>{K(a).boundary_tolerance_seconds!=null&&e(_)}),P(d);var v=H(d,2),y=e=>{var t=Dc(),n=B(t),r=z(n),i=H(r);let a;var o=V(i);P(n);var s=H(n,2),c=V(s),u=H(s,2),d=e=>{Y(e,Ec())};Z(u,e=>{K(l).accounting_complete||e(d)}),xe(2),U(e=>{X(r,`${K(l).window_minutes??``} MIN // ${K(l).plan_type??``} // `),a=li(i,1,`svelte-1fbui7h`,null,a,{muted:K(m)===`unknown`,"quota-near":K(m)===`near`,"quota-full":K(m)===`full`}),X(o,`USED ${e??``}${K(p)==null?``:`%`}`),X(c,`${K(l).starts_at??``} → ${K(l).ends_at??``}`)},[()=>g(K(p))]),Y(e,t)};Z(v,e=>{K(l)&&e(y)}),U(e=>{i=li(r,1,`svelte-1fbui7h`,null,i,{"quality-warning":!K(a).coverage_complete}),X(o,K(a).coverage_complete?`Reported range complete`:`Partial coverage`),X(u,` // Latest fetch ${e??``}`),X(f,`Coverage starts ${(K(a).coverage_start||`unknown`)??``} // Data as of ${(K(a).data_as_of||`unknown`)??``}`)},[()=>ha(K(a).fetchedAt)]),Y(e,t)},k=e=>{Y(e,kc())};Z(te,e=>{t.mode===`breakdown`&&K(i)?e(O):t.mode===`periods`&&K(a)?e(ne,1):e(k,-1)});var re=H(te,2),ie=e=>{var n=jc(),r=z(n),i=V(H(z(r),2),!0);P(r),Xr(H(r,2),17,()=>K(f),Kr,(e,n,r)=>{let i=()=>K(n).name,a=()=>K(n).value;var o=Ac();let s;var c=z(o),l=V(c,!0),u=H(c,2),d=z(u);let f;P(u);var p=V(H(u,2));P(o),U((e,n,a)=>{s=li(o,1,`report-row svelte-1fbui7h`,null,s,{unknown:e,alternate:r%2==1}),Q(c,`title`,i()),X(l,i()),f=di(d,``,f,{width:n}),X(p,`${a??``}${t.mode===`periods`?`%`:``}`)},[()=>i().trim().toLowerCase()===`unknown`,()=>`${Math.max(0,100*a()/K(h))}%`,()=>g(a())]),Y(e,o)}),P(n),U(()=>X(i,t.mode===`breakdown`?K(u):`QUOTA USED`)),Y(e,n)},ae=e=>{Y(e,Mc())},oe=e=>{Y(e,Nc())};Z(re,e=>{K(f).length?e(ie):t.mode===`breakdown`&&K(d)?.knownEmpty?e(ae,1):(K(i)&&t.mode===`breakdown`||K(a)&&t.mode===`periods`)&&e(oe,2)}),P(w),U(()=>{x.disabled=K(s)>=K(o)-1,S.disabled=K(s)===0,X(C,K(o)?`${K(s)+1} / ${K(o)}`:`NO DATA`),X(E,t.mode===`breakdown`?`DAILY BREAKDOWN`:`QUOTA WINDOWS`),X(ee,`${(t.mode===`breakdown`?t.reports?.dailyStatus||`UNAVAILABLE`:t.reports?.planStatus||`UNAVAILABLE`)??``} // UTC`)}),gi(b,()=>K(n),e=>R(n,e)),q(`click`,x,()=>R(r,K(s)+1)),q(`click`,S,()=>R(r,K(s)-1)),Y(e,_),We()}Sr([`click`]);var Ic=864e5;function Lc(e,t){let n=new Date(e);n.setUTCDate(1),n.setUTCMonth(n.getUTCMonth()+t);let r=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,0)).getUTCDate();return n.setUTCDate(Math.min(e.getUTCDate(),r)),n}function Rc(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()));for(let e=0;;e++){let i=Lc(r,-t),a=new Date(i.getTime()+Ic);if(e===n)return{start:a,end:r};r=i}}var zc=J(``),Bc=J(``,1),Vc=J(`

      History refresh failed. Any displayed history is the last successful + observation.

      `),Hc=J(`

      Token history unavailable; other reports may still be available.

      `),Uc=J(``),Wc=J(`
      `),Gc=J(`

      LESS ░ ▒ ▓ █ MORE // HOVER FOR DATE AND TOKENS

      `,1),Kc=J(`
      `,1),qc=J(` `),Jc=J(`

      LIFETIME TOKENS

      PEAK DAY

      CURRENT STREAK

      DAYS

      LONGEST TURN

      SECONDS

      LONGEST STREAK

      DAYS

      OPENAI // UTC

      Accessible data table
      Date (UTC)Tokens

      `,1),Yc=J(`

      History unavailable or awaiting a matching account observation. Missing + history is not treated as zero usage.

      `),Xc=J(`

      USAGE // ACCOUNT HISTORY

      Account-wide history reported by Codex, not the local Sessions counter. Dates use UTC. Allowance history is approximate where indicated; reset causes are - not provided.

      `,1);function Xc(e,t){Ue(t,!0);let n=L(`daily`),r=L(12),i=L(0),a=F(()=>{let e=$.data?.usage?.dailyUsageBuckets;if(!e)return[];let{start:t,end:n}=Lc(new Date,K(r),K(i)),a=new Map;for(let t of e)!Number.isFinite(t.tokens)||t.tokens<0||a.set(t.startDate,(a.get(t.startDate)||0)+t.tokens);let o=[];for(let e=t;e<=n;e=new Date(e.getTime()+864e5)){let t=e.toISOString().slice(0,10);o.push({date:t,tokens:a.get(t)||0})}return o}),o=F(()=>Math.max(1,...K(a).map(e=>e.tokens))),s=F(()=>K(a).length?new Date(K(a)[0].date+`T00:00:00Z`).getUTCDay():0),c=F(()=>{if(K(n)===`monthly`){let e=new Map;for(let t of K(a))e.set(t.date.slice(0,7),(e.get(t.date.slice(0,7))||0)+t.tokens);return[...e].map(([e,t])=>({date:e,tokens:t}))}let e=0;return K(a).map(t=>({date:t.date,tokens:e+=t.tokens}))});var l=Yc(),u=H(B(l),4);Xr(u,20,()=>[[`daily`,`Daily`],[`monthly`,`Monthly`],[`cumulative`,`Cumulative`],[`breakdown`,`Breakdown`],[`periods`,`Windows`]],Kr,(e,t)=>{var r=F(()=>_(t,2));let a=()=>K(r)[0],o=()=>K(r)[1];var s=Rc();let c;var l=V(s,!0);U(()=>{Q(s,`aria-pressed`,K(n)===a()),c=li(s,1,``,null,c,{active:K(n)===a()}),X(l,o())}),q(`click`,s,()=>{R(n,a(),!0),R(i,0)}),Y(e,s)}),P(u);var d=H(u,2),f=z(d),p=e=>{var t=zc(),n=B(t),a=H(z(n)),o=z(a);o.value=o.__value=6;var s=H(o);s.value=s.__value=12,P(a),hi(a),P(n);var c=H(n),l=H(c);U(()=>l.disabled=K(i)===0),q(`change`,a,()=>R(i,0)),gi(a,()=>K(r),e=>R(r,e)),q(`click`,c,()=>Kt(i)),q(`click`,l,()=>Kt(i,-1)),Y(e,t)};Z(f,e=>{K(n)!==`breakdown`&&K(n)!==`periods`&&e(p)}),P(d);var m=H(d,2),h=e=>{Y(e,Bc())};Z(m,e=>{$.data?.usageError&&e(h)});var g=H(m,2),v=e=>{Y(e,Vc())};Z(g,e=>{$.data?.usage?.tokenStatus===`UNAVAILABLE`&&K(n)!==`breakdown`&&K(n)!==`periods`&&e(v)});var y=H(g,2),b=e=>{var t=Nr();Gr(B(t),()=>K(n),e=>{{let t=F(()=>$.data?.usage?.reports);Pc(e,{get reports(){return K(t)},get mode(){return K(n)}})}}),Y(e,t)},x=e=>{var t=qc(),r=B(t),i=z(r),l=V(H(z(i),2),!0);P(i);var u=H(i,2),d=V(H(z(u),2),!0);P(u);var f=H(u,2),p=H(z(f),2),m=z(p);xe(),P(p),P(f);var h=H(f,2),g=H(z(h),2),_=z(g);xe(),P(g),P(h);var v=H(h,2),y=H(z(v),2),b=z(y);xe(),P(y),P(v),P(r);var x=H(r,4),S=z(x),C=V(S),w=H(S,2),T=e=>{var t=Wc(),n=B(t),r=z(n),i=z(r);Xr(i,17,()=>Array(K(s)),Kr,(e,t)=>{Y(e,Hc())}),Xr(H(i,2),17,()=>K(a),Kr,(e,t)=>{var n=Uc();let r,i;U(e=>{r=li(n,1,`heat-cell`,null,r,{zero:K(t).tokens===0}),Q(n,`title`,e),i=di(n,``,i,{opacity:K(t).tokens?.25+.75*K(t).tokens/K(o):1})},[()=>`${K(t).date}: ${ma(K(t).tokens)} tokens`]),Y(e,n)}),P(r),P(n),xe(2),Y(e,t)},E=e=>{var t=Gc(),r=B(t);{let e=F(()=>K(c).map(e=>e.tokens)),t=F(()=>K(n)+` usage`);ao(r,{get values(){return K(e)},get label(){return K(t)}})}var i=H(r,2),a=z(i),o=V(a,!0),s=V(H(a),!0);P(i),U(e=>{X(o,K(c)[0]?.date),X(s,e)},[()=>K(c).at(-1)?.date]),Y(e,t)};Z(w,e=>{K(n)===`daily`?e(T):e(E,-1)});var D=H(w,2),ee=H(z(D),2),te=z(ee),O=H(z(te));Xr(O,21,()=>K(n)===`daily`?K(a):K(c),Kr,(e,t)=>{var n=Kc(),r=z(n),i=V(r,!0),a=V(H(r),!0);P(n),U(e=>{X(i,K(t).date),X(a,e)},[()=>ma(K(t).tokens)]),Y(e,n)}),P(O),P(te),P(ee),P(D),P(x);var ne=V(H(x,2));U((e,t,n,r,i,o,s)=>{X(l,e),X(d,t),X(m,`${n??``} `),X(_,`${r??``} `),X(b,`${i??``} `),X(C,`${K(a)[0]?.date??``} — ${o??``}`),X(ne,`OBSERVED ${s??``} // CUMULATIVE IS FOR THE SELECTED PERIOD`)},[()=>ma($.data.usage.summary.lifetimeTokens),()=>ma($.data.usage.summary.peakDailyTokens),()=>ma($.data.usage.summary.currentStreakDays),()=>ma($.data.usage.summary.longestRunningTurnSec),()=>ma($.data.usage.summary.longestStreakDays),()=>K(a).at(-1)?.date,()=>ha($.data.usageAt)]),Y(e,t)},S=e=>{Y(e,Jc())};Z(y,e=>{K(n)===`breakdown`||K(n)===`periods`?e(b):$.data?.usage&&$.data.usage.dailyUsageBuckets!==null?e(x,1):e(S,-1)}),Y(e,l),We()}Sr([`click`,`change`]);var Zc=J(`

      Page not found

      Return to Quota

      `,1);function Qc(e){var t=Zc();xe(2),Y(e,t)}var $c=`CODEXOMETER`,el=[`█▀▀ █▀█ █▀▄ █▀▀ ▀▄▀ █▀█ █▀▄▀█ █▀▀ ▀█▀ █▀▀ █▀█`,`█▄▄ █▄█ █▄▀ ██▄ █ █ █▄█ █ ▀ █ ██▄ █ ██▄ █▀▄`].flatMap(e=>[[...e].map(e=>e===`█`||e===`▀`),[...e].map(e=>e===`█`||e===`▄`)]),tl=el[0].length,nl=el.length,rl=0,il=[...$c].map(e=>{let t=e===`M`?5:3,n={start:rl,width:t};return rl+=t+1,n}),al=`ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`,ol=`010 101 111 101.110 111 101 110.111 100 100 111.110 101 101 110.111 100 110 111.111 100 110 100.111 100 101 111.101 101 111 101.111 010 010 111.001 001 101 111.101 110 110 101.100 100 100 111.101 111 101 101.101 111 111 101.111 101 101 111.111 101 111 100.111 101 111 001.111 101 110 101.111 100 001 111.111 010 010 010.101 101 101 111.101 101 101 010.101 101 111 101.101 010 010 101.101 101 010 010.111 001 100 111.111 101 101 111.110 010 010 111.111 001 110 111.111 011 001 111.101 101 111 001.111 110 001 111.100 111 101 111.111 001 010 010.111 111 101 111.111 101 111 001`.split(`.`).map(e=>e.split(` `));function sl(e=$c,t=-1,n=!1){let r=``;for(let i=0;i{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}function dl(){let e=cl[Math.floor(Math.random()*cl.length)],t=Math.floor(Math.random()*4294967296),n=ul(t),r=[...$c].map((e,t)=>t);for(let e=r.length-1;e>0;e--){let t=Math.floor(n()*(e+1));[r[e],r[t]]=[r[t],r[e]]}return{variant:e,seed:t,order:r}}function fl(e,t){if(e.variant===`typing`){let e=t<1080,n=e?0:Math.min(Math.floor((t-1080)/90)+1,11);return{text:$c.slice(0,n).padEnd(11),cursor:n,dot:e?Math.floor(t/180)%2==0:n<11}}if(e.variant===`shuffle`){let n=ul(e.seed^Math.floor(t/70)),r=[...$c].map(e=>{let t;do t=al[Math.floor(n()*36)];while(t===e);return t}),i=Math.min(Math.floor(t/110),11);for(let t of e.order.slice(0,i))r[t]=$c[t];return{text:r.join(``),cursor:-1,dot:!1}}return{text:$c,cursor:-1,dot:!1}}var pl=jr(``);function ml(e,t){Ue(t,!0);let n=Gi(t,`text`,3,$c),r=Gi(t,`cursor`,19,()=>-1),i=Gi(t,`dot`,3,!1),a=F(()=>sl(n(),r(),i()));var o=pl(),s=V(o);U(()=>{Q(o,`viewBox`,`0 0 ${tl} ${nl}`),Q(o,`width`,tl),Q(o,`height`,nl),Q(s,`d`,K(a))}),Y(e,o),We()}var hl=J(`
      `),gl=J(`
      `);function _l(e,t){Ue(t,!0);let n=L(void 0),r=L(0),i=L(Yt({width:0,height:0,pixelRatio:1})),a=L(Yt({x:0,y:0,width:0})),o=F(()=>K(n)?fl(K(n),K(r)):void 0),s=F(()=>{if(!K(n))return{x:0,y:0,width:0};let e=ll[K(n).variant],t=Math.min(Math.max((K(r)-e-180)/800,0),1),o=t*t*(3-2*t),s=K(i).width+(K(a).width-K(i).width)*o,c=Math.max((K(i).height-K(i).width*nl/tl)/2,0),l=(K(n).variant===`slide`&&K(r)Math.round(e*K(i).pixelRatio)/K(i).pixelRatio;return{x:d(l),y:d(u),width:d(s)}});Ki(()=>{let e=matchMedia(`(prefers-reduced-motion: reduce)`);if(e.matches){t.onfinish();return}R(n,dl(),!0);let o=ll[K(n).variant]+180+800,s=0,c=!1,l=performance.now(),u=()=>{let e=t.target?.getBoundingClientRect();R(i,{width:window.innerWidth,height:window.innerHeight,pixelRatio:window.devicePixelRatio||1},!0),e&&R(a,{x:e.x,y:e.y,width:e.width},!0)},d=()=>{c||(c=!0,cancelAnimationFrame(s),t.onfinish())},f=e=>{e instanceof PointerEvent&&e.button!==0||e instanceof KeyboardEvent&&(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)||e instanceof KeyboardEvent&&[`Shift`,`Control`,`Alt`,`Meta`].includes(e.key)||(e.preventDefault(),e.stopImmediatePropagation(),d())},p=()=>{e.matches&&d()},m=e=>{R(r,Math.max(e-l,0),!0),K(r)>=o?d():s=requestAnimationFrame(m)},h=new ResizeObserver(u);if(t.target){h.observe(t.target),t.target.parentElement&&h.observe(t.target.parentElement);let e=t.target.closest(`header`);e&&h.observe(e)}return u(),window.addEventListener(`resize`,u),document.addEventListener(`keydown`,f,!0),document.addEventListener(`pointerdown`,f,!0),e.addEventListener(`change`,p),s=requestAnimationFrame(m),()=>{c=!0,cancelAnimationFrame(s),h.disconnect(),window.removeEventListener(`resize`,u),document.removeEventListener(`keydown`,f,!0),document.removeEventListener(`pointerdown`,f,!0),e.removeEventListener(`change`,p)}});var c=gl(),l=z(c),u=e=>{var t=hl();let n;ml(z(t),{get text(){return K(o).text},get cursor(){return K(o).cursor},get dot(){return K(o).dot}}),P(t),U(()=>{Q(t,`data-text`,K(o).text),Q(t,`data-cursor`,K(o).dot?K(o).cursor:void 0),n=di(t,``,n,{left:`${K(s).x}px`,top:`${K(s).y}px`,width:`${K(s).width}px`})}),Y(e,t)};Z(l,e=>{K(o)&&e(u)});var d=H(l,2);P(c),U(()=>Q(c,`data-entrance`,K(n)?.variant)),q(`click`,d,function(...e){t.onfinish?.apply(this,e)}),Y(e,c),We()}Sr([`click`]);var vl=J(` `),yl=J(`

      `),bl=J(`

      Connecting to your local Codexometer…

      `),xl=J(``),Sl=J(`

      Your quota. Your sessions. Your command centre.

      `);function Cl(e,t){Ue(t,!0);let n={"/":no,"/quota/:view?":no,"/sessions/:id?":bc,"/usage":Xc,"*":Qc},r={quota:/^(?:\/|\/quota(?:\/[^/]+)?\/?)$/,sessions:/^\/sessions(?:\/[^/]+)?\/?$/,usage:/^\/usage\/?$/},i=L(`hacker`),a=L(!0),o=L(void 0);vn(()=>{ca.requests&&lr().then(()=>{K(o)?.focus(),K(o)?.scrollIntoView({block:`nearest`})})});let s=L(void 0),c=[`hacker`,`rust`,`blue-steel`,`ultraviolet`,`nightshade`];vn(()=>{la()}),vn(()=>{if($.data)for(let[e,t]of Object.entries(r))t.test(Xi.location)&&(oa.tab=e)}),Ki(()=>{try{let e=localStorage.getItem(`codexometer.web.theme`);e&&c.includes(e)&&R(i,e,!0)}catch{}return ba()});function l(){try{localStorage.setItem(`codexometer.web.theme`,K(i))}catch{}}var u=Sl(),d=z(u),f=z(d),p=z(f);ml(z(p),{}),P(p),Li(p,e=>R(s,e),()=>K(s)),xe(2),P(f);var m=H(f,2),h=z(m);let g;var v=H(h,1,!0),y=V(H(v));P(m),P(d);var b=H(d,2);Xr(b,21,()=>Object.entries(r),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1],a=F(()=>i().test(Xi.location));var o=vl();let s;var c=V(o,!0);U(e=>{Q(o,`href`,r()===`quota`?`#/quota/`+oa.view:`#/`+r()),Q(o,`aria-current`,K(a)?`page`:void 0),s=li(o,1,``,null,s,{active:K(a)}),X(c,e)},[()=>r().toUpperCase()]),Y(e,o)}),P(b);var x=H(b,2),S=z(x),C=e=>{var t=yl(),n=V(t,!0);U(()=>X(n,$.error)),Y(e,t)};Z(S,e=>{$.error&&e(C)});var w=H(S,2),T=e=>{ea(e,{get routes(){return n}})},E=e=>{Y(e,bl())};Z(w,e=>{$.data?e(T):$.error||e(E,1)}),P(x);var D=H(x,2),ee=z(D),te=V(ee),O=H(ee,2),ne=V(O,!0),k=H(O,2),re=H(z(k));Xr(re,21,()=>c,Kr,(e,t)=>{var n=xl(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).replace(`-`,` `).toUpperCase()]),Y(e,n)}),P(re),Li(re,e=>R(o,e),()=>K(o)),hi(re),P(k),P(D);var ie=H(D,2),ae=e=>{_l(e,{get target(){return K(s)},onfinish:()=>R(a,!1)})};Z(ie,e=>{K(a)&&e(ae)}),P(u),U(()=>{Q(u,`data-theme`,K(i)),Q(u,`data-starting`,K(a)),d.inert=K(a),g=li(h,1,`lamp`,null,g,{lit:$.connected}),X(v,$.connected?`CONNECTED`:`OFFLINE`),X(y,`EXPERIMENTAL // ${$.data?.control?`SESSION CONTROL`:`READ ONLY`}`),b.inert=K(a),x.inert=K(a),D.inert=K(a),X(te,`v${($.data?.version||`…`)??``} // LOCAL ONLY`),X(ne,$.data?.control?`Session control enabled. Stop the server to revoke access.`:`No actions can be sent from this preview.`)}),q(`change`,re,l),gi(re,()=>K(i),e=>R(i,e)),Y(e,u),We()}Sr([`change`]),zr(Cl,{target:document.getElementById(`app`)}); \ No newline at end of file + not provided.

      `,1);function Zc(e,t){Ue(t,!0);let n=L(`daily`),r=L(12),i=L(0),a=F(()=>{let e=$.data?.usage?.dailyUsageBuckets;if(!e)return[];let{start:t,end:n}=Rc(new Date,K(r),K(i)),a=new Map;for(let t of e)!Number.isFinite(t.tokens)||t.tokens<0||a.set(t.startDate,(a.get(t.startDate)||0)+t.tokens);let o=[];for(let e=t;e<=n;e=new Date(e.getTime()+864e5)){let t=e.toISOString().slice(0,10);o.push({date:t,tokens:a.get(t)||0})}return o}),o=F(()=>Math.max(1,...K(a).map(e=>e.tokens))),s=F(()=>K(a).length?new Date(K(a)[0].date+`T00:00:00Z`).getUTCDay():0),c=F(()=>{if(K(n)===`monthly`){let e=new Map;for(let t of K(a))e.set(t.date.slice(0,7),(e.get(t.date.slice(0,7))||0)+t.tokens);return[...e].map(([e,t])=>({date:e,tokens:t}))}let e=0;return K(a).map(t=>({date:t.date,tokens:e+=t.tokens}))});var l=Xc(),u=H(B(l),4);Xr(u,20,()=>[[`daily`,`Daily`],[`monthly`,`Monthly`],[`cumulative`,`Cumulative`],[`breakdown`,`Breakdown`],[`periods`,`Windows`]],Kr,(e,t)=>{var r=F(()=>_(t,2));let a=()=>K(r)[0],o=()=>K(r)[1];var s=zc();let c;var l=V(s,!0);U(()=>{Q(s,`aria-pressed`,K(n)===a()),c=li(s,1,``,null,c,{active:K(n)===a()}),X(l,o())}),q(`click`,s,()=>{R(n,a(),!0),R(i,0)}),Y(e,s)}),P(u);var d=H(u,2),f=z(d),p=e=>{var t=Bc(),n=B(t),a=H(z(n)),o=z(a);o.value=o.__value=6;var s=H(o);s.value=s.__value=12,P(a),hi(a),P(n);var c=H(n),l=H(c);U(()=>l.disabled=K(i)===0),q(`change`,a,()=>R(i,0)),gi(a,()=>K(r),e=>R(r,e)),q(`click`,c,()=>Kt(i)),q(`click`,l,()=>Kt(i,-1)),Y(e,t)};Z(f,e=>{K(n)!==`breakdown`&&K(n)!==`periods`&&e(p)}),P(d);var m=H(d,2),h=e=>{Y(e,Vc())};Z(m,e=>{$.data?.usageError&&e(h)});var g=H(m,2),v=e=>{Y(e,Hc())};Z(g,e=>{$.data?.usage?.tokenStatus===`UNAVAILABLE`&&K(n)!==`breakdown`&&K(n)!==`periods`&&e(v)});var y=H(g,2),b=e=>{var t=Nr();Gr(B(t),()=>K(n),e=>{{let t=F(()=>$.data?.usage?.reports);Fc(e,{get reports(){return K(t)},get mode(){return K(n)}})}}),Y(e,t)},x=e=>{var t=Jc(),r=B(t),i=z(r),l=V(H(z(i),2),!0);P(i);var u=H(i,2),d=V(H(z(u),2),!0);P(u);var f=H(u,2),p=H(z(f),2),m=z(p);xe(),P(p),P(f);var h=H(f,2),g=H(z(h),2),_=z(g);xe(),P(g),P(h);var v=H(h,2),y=H(z(v),2),b=z(y);xe(),P(y),P(v),P(r);var x=H(r,4),S=z(x),C=V(S),w=H(S,2),T=e=>{var t=Gc(),n=B(t),r=z(n),i=z(r);Xr(i,17,()=>Array(K(s)),Kr,(e,t)=>{Y(e,Uc())}),Xr(H(i,2),17,()=>K(a),Kr,(e,t)=>{var n=Wc();let r,i;U(e=>{r=li(n,1,`heat-cell`,null,r,{zero:K(t).tokens===0}),Q(n,`title`,e),i=di(n,``,i,{opacity:K(t).tokens?.25+.75*K(t).tokens/K(o):1})},[()=>`${K(t).date}: ${ma(K(t).tokens)} tokens`]),Y(e,n)}),P(r),P(n),xe(2),Y(e,t)},E=e=>{var t=Kc(),r=B(t);{let e=F(()=>K(c).map(e=>e.tokens)),t=F(()=>K(n)+` usage`);ao(r,{get values(){return K(e)},get label(){return K(t)}})}var i=H(r,2),a=z(i),o=V(a,!0),s=V(H(a),!0);P(i),U(e=>{X(o,K(c)[0]?.date),X(s,e)},[()=>K(c).at(-1)?.date]),Y(e,t)};Z(w,e=>{K(n)===`daily`?e(T):e(E,-1)});var D=H(w,2),ee=H(z(D),2),te=z(ee),O=H(z(te));Xr(O,21,()=>K(n)===`daily`?K(a):K(c),Kr,(e,t)=>{var n=qc(),r=z(n),i=V(r,!0),a=V(H(r),!0);P(n),U(e=>{X(i,K(t).date),X(a,e)},[()=>ma(K(t).tokens)]),Y(e,n)}),P(O),P(te),P(ee),P(D),P(x);var ne=V(H(x,2));U((e,t,n,r,i,o,s)=>{X(l,e),X(d,t),X(m,`${n??``} `),X(_,`${r??``} `),X(b,`${i??``} `),X(C,`${K(a)[0]?.date??``} — ${o??``}`),X(ne,`OBSERVED ${s??``} // CUMULATIVE IS FOR THE SELECTED PERIOD`)},[()=>ma($.data.usage.summary.lifetimeTokens),()=>ma($.data.usage.summary.peakDailyTokens),()=>ma($.data.usage.summary.currentStreakDays),()=>ma($.data.usage.summary.longestRunningTurnSec),()=>ma($.data.usage.summary.longestStreakDays),()=>K(a).at(-1)?.date,()=>ha($.data.usageAt)]),Y(e,t)},S=e=>{Y(e,Yc())};Z(y,e=>{K(n)===`breakdown`||K(n)===`periods`?e(b):$.data?.usage&&$.data.usage.dailyUsageBuckets!==null?e(x,1):e(S,-1)}),Y(e,l),We()}Sr([`click`,`change`]);var Qc=J(`

      Page not found

      Return to Quota

      `,1);function $c(e){var t=Qc();xe(2),Y(e,t)}var el=`CODEXOMETER`,tl=[`█▀▀ █▀█ █▀▄ █▀▀ ▀▄▀ █▀█ █▀▄▀█ █▀▀ ▀█▀ █▀▀ █▀█`,`█▄▄ █▄█ █▄▀ ██▄ █ █ █▄█ █ ▀ █ ██▄ █ ██▄ █▀▄`].flatMap(e=>[[...e].map(e=>e===`█`||e===`▀`),[...e].map(e=>e===`█`||e===`▄`)]),nl=tl[0].length,rl=tl.length,il=0,al=[...el].map(e=>{let t=e===`M`?5:3,n={start:il,width:t};return il+=t+1,n}),ol=`ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`,sl=`010 101 111 101.110 111 101 110.111 100 100 111.110 101 101 110.111 100 110 111.111 100 110 100.111 100 101 111.101 101 111 101.111 010 010 111.001 001 101 111.101 110 110 101.100 100 100 111.101 111 101 101.101 111 111 101.111 101 101 111.111 101 111 100.111 101 111 001.111 101 110 101.111 100 001 111.111 010 010 010.101 101 101 111.101 101 101 010.101 101 111 101.101 010 010 101.101 101 010 010.111 001 100 111.111 101 101 111.110 010 010 111.111 001 110 111.111 011 001 111.101 101 111 001.111 110 001 111.100 111 101 111.111 001 010 010.111 111 101 111.111 101 111 001`.split(`.`).map(e=>e.split(` `));function cl(e=el,t=-1,n=!1){let r=``;for(let i=0;i{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}function fl(){let e=ll[Math.floor(Math.random()*ll.length)],t=Math.floor(Math.random()*4294967296),n=dl(t),r=[...el].map((e,t)=>t);for(let e=r.length-1;e>0;e--){let t=Math.floor(n()*(e+1));[r[e],r[t]]=[r[t],r[e]]}return{variant:e,seed:t,order:r}}function pl(e,t){if(e.variant===`typing`){let e=t<1080,n=e?0:Math.min(Math.floor((t-1080)/90)+1,11);return{text:el.slice(0,n).padEnd(11),cursor:n,dot:e?Math.floor(t/180)%2==0:n<11}}if(e.variant===`shuffle`){let n=dl(e.seed^Math.floor(t/70)),r=[...el].map(e=>{let t;do t=ol[Math.floor(n()*36)];while(t===e);return t}),i=Math.min(Math.floor(t/110),11);for(let t of e.order.slice(0,i))r[t]=el[t];return{text:r.join(``),cursor:-1,dot:!1}}return{text:el,cursor:-1,dot:!1}}var ml=jr(``);function hl(e,t){Ue(t,!0);let n=Gi(t,`text`,3,el),r=Gi(t,`cursor`,19,()=>-1),i=Gi(t,`dot`,3,!1),a=F(()=>cl(n(),r(),i()));var o=ml(),s=V(o);U(()=>{Q(o,`viewBox`,`0 0 ${nl} ${rl}`),Q(o,`width`,nl),Q(o,`height`,rl),Q(s,`d`,K(a))}),Y(e,o),We()}var gl=J(`
      `),_l=J(`
      `);function vl(e,t){Ue(t,!0);let n=L(void 0),r=L(0),i=L(Yt({width:0,height:0,pixelRatio:1})),a=L(Yt({x:0,y:0,width:0})),o=F(()=>K(n)?pl(K(n),K(r)):void 0),s=F(()=>{if(!K(n))return{x:0,y:0,width:0};let e=ul[K(n).variant],t=Math.min(Math.max((K(r)-e-180)/800,0),1),o=t*t*(3-2*t),s=K(i).width+(K(a).width-K(i).width)*o,c=Math.max((K(i).height-K(i).width*rl/nl)/2,0),l=(K(n).variant===`slide`&&K(r)Math.round(e*K(i).pixelRatio)/K(i).pixelRatio;return{x:d(l),y:d(u),width:d(s)}});Ki(()=>{let e=matchMedia(`(prefers-reduced-motion: reduce)`);if(e.matches){t.onfinish();return}R(n,fl(),!0);let o=ul[K(n).variant]+180+800,s=0,c=!1,l=performance.now(),u=()=>{let e=t.target?.getBoundingClientRect();R(i,{width:window.innerWidth,height:window.innerHeight,pixelRatio:window.devicePixelRatio||1},!0),e&&R(a,{x:e.x,y:e.y,width:e.width},!0)},d=()=>{c||(c=!0,cancelAnimationFrame(s),t.onfinish())},f=e=>{e instanceof PointerEvent&&e.button!==0||e instanceof KeyboardEvent&&(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)||e instanceof KeyboardEvent&&[`Shift`,`Control`,`Alt`,`Meta`].includes(e.key)||(e.preventDefault(),e.stopImmediatePropagation(),d())},p=()=>{e.matches&&d()},m=e=>{R(r,Math.max(e-l,0),!0),K(r)>=o?d():s=requestAnimationFrame(m)},h=new ResizeObserver(u);if(t.target){h.observe(t.target),t.target.parentElement&&h.observe(t.target.parentElement);let e=t.target.closest(`header`);e&&h.observe(e)}return u(),window.addEventListener(`resize`,u),document.addEventListener(`keydown`,f,!0),document.addEventListener(`pointerdown`,f,!0),e.addEventListener(`change`,p),s=requestAnimationFrame(m),()=>{c=!0,cancelAnimationFrame(s),h.disconnect(),window.removeEventListener(`resize`,u),document.removeEventListener(`keydown`,f,!0),document.removeEventListener(`pointerdown`,f,!0),e.removeEventListener(`change`,p)}});var c=_l(),l=z(c),u=e=>{var t=gl();let n;hl(z(t),{get text(){return K(o).text},get cursor(){return K(o).cursor},get dot(){return K(o).dot}}),P(t),U(()=>{Q(t,`data-text`,K(o).text),Q(t,`data-cursor`,K(o).dot?K(o).cursor:void 0),n=di(t,``,n,{left:`${K(s).x}px`,top:`${K(s).y}px`,width:`${K(s).width}px`})}),Y(e,t)};Z(l,e=>{K(o)&&e(u)});var d=H(l,2);P(c),U(()=>Q(c,`data-entrance`,K(n)?.variant)),q(`click`,d,function(...e){t.onfinish?.apply(this,e)}),Y(e,c),We()}Sr([`click`]);var yl=J(` `),bl=J(`

      `),xl=J(`

      Connecting to your local Codexometer…

      `),Sl=J(``),Cl=J(`

      Your quota. Your sessions. Your command centre.

      `);function wl(e,t){Ue(t,!0);let n={"/":no,"/quota/:view?":no,"/sessions/:id?":xc,"/usage":Zc,"*":$c},r={quota:/^(?:\/|\/quota(?:\/[^/]+)?\/?)$/,sessions:/^\/sessions(?:\/[^/]+)?\/?$/,usage:/^\/usage\/?$/},i=L(`hacker`),a=L(!0),o=L(void 0);vn(()=>{ca.requests&&lr().then(()=>{K(o)?.focus(),K(o)?.scrollIntoView({block:`nearest`})})});let s=L(void 0),c=[`hacker`,`rust`,`blue-steel`,`ultraviolet`,`nightshade`];vn(()=>{la()}),vn(()=>{if($.data)for(let[e,t]of Object.entries(r))t.test(Xi.location)&&(oa.tab=e)}),Ki(()=>{try{let e=localStorage.getItem(`codexometer.web.theme`);e&&c.includes(e)&&R(i,e,!0)}catch{}return ba()});function l(){try{localStorage.setItem(`codexometer.web.theme`,K(i))}catch{}}var u=Cl(),d=z(u),f=z(d),p=z(f);hl(z(p),{}),P(p),Li(p,e=>R(s,e),()=>K(s)),xe(2),P(f);var m=H(f,2),h=z(m);let g;var v=H(h,1,!0),y=V(H(v));P(m),P(d);var b=H(d,2);Xr(b,21,()=>Object.entries(r),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1],a=F(()=>i().test(Xi.location));var o=yl();let s;var c=V(o,!0);U(e=>{Q(o,`href`,r()===`quota`?`#/quota/`+oa.view:`#/`+r()),Q(o,`aria-current`,K(a)?`page`:void 0),s=li(o,1,``,null,s,{active:K(a)}),X(c,e)},[()=>r().toUpperCase()]),Y(e,o)}),P(b);var x=H(b,2),S=z(x),C=e=>{var t=bl(),n=V(t,!0);U(()=>X(n,$.error)),Y(e,t)};Z(S,e=>{$.error&&e(C)});var w=H(S,2),T=e=>{ea(e,{get routes(){return n}})},E=e=>{Y(e,xl())};Z(w,e=>{$.data?e(T):$.error||e(E,1)}),P(x);var D=H(x,2),ee=z(D),te=V(ee),O=H(ee,2),ne=V(O,!0),k=H(O,2),re=H(z(k));Xr(re,21,()=>c,Kr,(e,t)=>{var n=Sl(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).replace(`-`,` `).toUpperCase()]),Y(e,n)}),P(re),Li(re,e=>R(o,e),()=>K(o)),hi(re),P(k),P(D);var ie=H(D,2),ae=e=>{vl(e,{get target(){return K(s)},onfinish:()=>R(a,!1)})};Z(ie,e=>{K(a)&&e(ae)}),P(u),U(()=>{Q(u,`data-theme`,K(i)),Q(u,`data-starting`,K(a)),d.inert=K(a),g=li(h,1,`lamp`,null,g,{lit:$.connected}),X(v,$.connected?`CONNECTED`:`OFFLINE`),X(y,`EXPERIMENTAL // ${$.data?.control?`SESSION CONTROL`:`READ ONLY`}`),b.inert=K(a),x.inert=K(a),D.inert=K(a),X(te,`v${($.data?.version||`…`)??``} // LOCAL ONLY`),X(ne,$.data?.control?`Session control enabled. Stop the server to revoke access.`:`No actions can be sent from this preview.`)}),q(`change`,re,l),gi(re,()=>K(i),e=>R(i,e)),Y(e,u),We()}Sr([`change`]),zr(wl,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/internal/web/dist/index.html b/internal/web/dist/index.html index c3e309aa..68684b60 100644 --- a/internal/web/dist/index.html +++ b/internal/web/dist/index.html @@ -5,7 +5,7 @@ Codexometer // Experimental web - + diff --git a/internal/web/server.go b/internal/web/server.go index 105276c8..606de933 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -60,6 +60,9 @@ func Run(ctx context.Context, source Source, refresh time.Duration, port int, ou if policy, ok := source.(codex.QuotaStepPolicyProvider); ok { s.store.configureThresholds(policy.QuotaStepPolicy()) } + if client, ok := source.(interface{ SetSessionHumanApprovalSupport(bool) }); ok { + client.SetSessionHumanApprovalSupport(writable) + } mode := "READ ONLY" if writable { s.control = newControl(source, s.store) diff --git a/internal/web/state.go b/internal/web/state.go index f8603d92..cf38c64c 100644 --- a/internal/web/state.go +++ b/internal/web/state.go @@ -23,31 +23,32 @@ type Source interface { // Deliberately project source types: never serialize approval/input capabilities, // account fingerprints, arbitrary errors, or authentication objects to browsers. type session struct { - Goal *goal `json:"goal,omitempty"` - StatusLine map[string]string `json:"statusLine"` - FileChanges []codex.FileDiffLine `json:"fileChanges,omitempty"` - CurrentTask string `json:"currentTask,omitempty"` - LatestGuidance string `json:"latestGuidance,omitempty"` - Streaming bool `json:"streaming,omitempty"` - Name string `json:"name,omitempty"` - ID string `json:"id"` - Directory string `json:"directory"` - Tokens int64 `json:"tokens"` - Agents int `json:"agents"` - Status string `json:"status"` - Failed bool `json:"failed,omitempty"` - ContextKind string `json:"contextKind"` - Text string `json:"text"` - Command string `json:"command"` - WorkingCommand string `json:"workingCommand,omitempty"` - ApprovalContext string `json:"approvalContext,omitempty"` - CommandStatus string `json:"commandStatus,omitempty"` - CommandTiming string `json:"commandTiming,omitempty"` - RunningCommands int `json:"runningCommands,omitempty"` - RunningLimited bool `json:"runningLimited,omitempty"` - Source string `json:"source"` - Activity time.Time `json:"activity"` - Samples []sample `json:"samples"` + RequiredHumanApproval bool `json:"requiredHumanApproval,omitempty"` + Goal *goal `json:"goal,omitempty"` + StatusLine map[string]string `json:"statusLine"` + FileChanges []codex.FileDiffLine `json:"fileChanges,omitempty"` + CurrentTask string `json:"currentTask,omitempty"` + LatestGuidance string `json:"latestGuidance,omitempty"` + Streaming bool `json:"streaming,omitempty"` + Name string `json:"name,omitempty"` + ID string `json:"id"` + Directory string `json:"directory"` + Tokens int64 `json:"tokens"` + Agents int `json:"agents"` + Status string `json:"status"` + Failed bool `json:"failed,omitempty"` + ContextKind string `json:"contextKind"` + Text string `json:"text"` + Command string `json:"command"` + WorkingCommand string `json:"workingCommand,omitempty"` + ApprovalContext string `json:"approvalContext,omitempty"` + CommandStatus string `json:"commandStatus,omitempty"` + CommandTiming string `json:"commandTiming,omitempty"` + RunningCommands int `json:"runningCommands,omitempty"` + RunningLimited bool `json:"runningLimited,omitempty"` + Source string `json:"source"` + Activity time.Time `json:"activity"` + Samples []sample `json:"samples"` } type goal struct { @@ -329,14 +330,18 @@ func (s *store) live(l codex.LiveUsageSnapshot, err error, now time.Time) { } if row.Context.Kind == codex.SessionContextApproval && row.Context.CommandDetails.Command != "" && row.Context.CommandDetails.Justification != "" { text = row.Context.CommandDetails.Justification + if row.Context.RequiredHumanApproval { + text = "HUMAN APPROVAL REQUIRED\nManaged policy requires approval each time.\n" + text + } } s.state.Sessions = append(s.state.Sessions, session{ Goal: projectGoal(row.Goal), ID: row.ID, Name: codex.SanitizeSessionContext(row.Name), Directory: row.WorkingDirectory, Tokens: row.TotalTokens, Agents: row.AgentCount, StatusLine: statusline.Values(statusline.Data{Model: row.ModelSettings.Model, Effort: row.ModelSettings.ReasoningEffort, Speed: row.ModelSettings.ServiceTier, Directory: row.WorkingDirectory, Name: row.Name, ID: row.ID, State: sessionStatus(row), Source: row.Context.Source, Tokens: row.TotalTokens, Agents: row.AgentCount}), Status: sessionStatus(row), ContextKind: contextKind(row.Context.Kind), Text: text, - Failed: row.Attention == codex.SessionAttentionError, - Command: row.Context.CommandDetails.Command, Source: row.Context.Source, Activity: row.LastActivity, + Failed: row.Attention == codex.SessionAttentionError, + RequiredHumanApproval: row.Context.RequiredHumanApproval, + Command: row.Context.CommandDetails.Command, Source: row.Context.Source, Activity: row.LastActivity, WorkingCommand: activity.Command, CommandStatus: activity.CommandStatus, CommandTiming: activity.CommandTiming(now), ApprovalContext: approvalContext, diff --git a/web/src/SessionActions.svelte b/web/src/SessionActions.svelte index 430a7223..811aa01c 100644 --- a/web/src/SessionActions.svelte +++ b/web/src/SessionActions.svelte @@ -475,6 +475,10 @@ ? 'QUOTA THRESHOLD' : 'SESSION CONTROL // EXPERIMENTAL'} + {#if offer?.requiredHumanApproval && !stale && !offerError} +

      HUMAN APPROVAL REQUIRED

      +

      Managed policy requires approval each time.

      + {/if} {#if offer?.profile && !stale && !offerError}

      Your {offer.profile.threshold}% quota threshold has been reached. Review diff --git a/web/src/contracts.generated.ts b/web/src/contracts.generated.ts index 4a2d8bd4..1d22e443 100644 --- a/web/src/contracts.generated.ts +++ b/web/src/contracts.generated.ts @@ -20,6 +20,7 @@ export interface ActionChoice { } export interface ActionOffer { + requiredHumanApproval?: boolean; fileChanges?: Array | null; profile?: ProfileReview | null; id: string; @@ -193,6 +194,7 @@ export interface Segment { } export interface Session { + requiredHumanApproval?: boolean; goal?: SessionGoal | null; statusLine: Record; fileChanges?: Array | null; From 04dd2058707e88a57f8fa3ce17e11c39261e3aa1 Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 6 Nov 2026 13:40:42 +0000 Subject: [PATCH 02/10] Verify Codex 0.167 transport, network expiry and retained history --- README.md | 4 +-- internal/codex/daemon_native_unix_test.go | 6 ++--- internal/codex/session_167_test.go | 30 +++++++++++++++++++++ internal/codex/session_history_unix_test.go | 12 +++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 internal/codex/session_167_test.go diff --git a/README.md b/README.md index 2986adf6..1203a407 100644 --- a/README.md +++ b/README.md @@ -3769,10 +3769,10 @@ go test -race -cover -timeout 10m -run '^TestLocalisedScreens$' ./internal/ui ``` An optional Unix integration check verifies the installed Codex against either -the 0.164.0 baseline or 0.166.0, including negotiated compressed WebSocket RPC: +the 0.164.0 baseline, 0.166.0 or 0.167.0, including negotiated compressed WebSocket RPC: ```sh -CODEXOMETER_TEST_CODEX_VERSION=0.166.0 go test ./internal/codex -run '^TestNativeCodexCompression$' -count=1 +CODEXOMETER_TEST_CODEX_VERSION=0.167.0 go test ./internal/codex -run '^TestNativeCodexCompression$' -count=1 ``` Use `0.164.0` when that version is on `PATH`; the existing diff --git a/internal/codex/daemon_native_unix_test.go b/internal/codex/daemon_native_unix_test.go index eabe3a27..7f458bf4 100644 --- a/internal/codex/daemon_native_unix_test.go +++ b/internal/codex/daemon_native_unix_test.go @@ -20,10 +20,10 @@ func TestNativeCodexCompression(t *testing.T) { expected = "0.164.0" // Retain the existing baseline test invocation. } if expected == "" { - t.Skip("set CODEXOMETER_TEST_CODEX_VERSION=0.164.0 or 0.166.0 with that Codex installed") + t.Skip("set CODEXOMETER_TEST_CODEX_VERSION=0.164.0, 0.166.0 or 0.167.0 with that Codex installed") } - if expected != "0.164.0" && expected != "0.166.0" { - t.Fatal("native compatibility target must be 0.164.0 or 0.166.0") + if expected != "0.164.0" && expected != "0.166.0" && expected != "0.167.0" { + t.Fatal("native compatibility target must be 0.164.0, 0.166.0 or 0.167.0") } binary, err := exec.LookPath("codex") if err != nil { diff --git a/internal/codex/session_167_test.go b/internal/codex/session_167_test.go new file mode 100644 index 00000000..ed7eaf0a --- /dev/null +++ b/internal/codex/session_167_test.go @@ -0,0 +1,30 @@ +package codex + +import ( + "encoding/json" + "testing" + "time" +) + +func TestCodex167NetworkExpiryResolvesOnlyItsRequest(t *testing.T) { + states := map[string]*daemonContextState{} + for _, id := range []string{"expired", "remaining"} { + daemonContextEvent(states, "item/commandExecution/requestApproval", rawJSON(id), rawJSON(map[string]any{"threadId": "root", "turnId": "turn", "itemId": "command", "command": "curl https://example.com", "cwd": "/work", "networkApprovalContext": map[string]any{"host": "example.com", "protocol": "https"}}), time.Now()) + } + daemonContextEvent(states, "serverRequest/resolved", nil, rawJSON(map[string]any{"threadId": "other", "requestId": "expired"}), time.Now()) + if len(states["root"].requests) != 2 { + t.Fatal("resolution crossed threads") + } + daemonContextEvent(states, "serverRequest/resolved", nil, rawJSON(map[string]any{"threadId": "root", "requestId": "expired"}), time.Now()) + if _, ok := states["root"].requests[string(rawJSON("expired"))]; ok || len(states["root"].requests) != 1 { + t.Fatal("expired network prompt remained or removed its sibling") + } + c := daemonContextSnapshot(states, []string{"root"}, map[string]sessionRuntimeStatus{"root": sessionRuntimeApproval})["root"] + if c.PendingApprovals != 1 || c.ApprovalBlocked != "network" { + t.Fatal("network expiry changed remaining request semantics", c) + } + daemonContextEvent(states, "serverRequest/resolved", nil, json.RawMessage(`{"threadId":"root","requestId":"remaining"}`), time.Now()) + if len(states["root"].requests) != 0 { + t.Fatal("last expired prompt remained") + } +} diff --git a/internal/codex/session_history_unix_test.go b/internal/codex/session_history_unix_test.go index 0d5fa422..9fd10b07 100644 --- a/internal/codex/session_history_unix_test.go +++ b/internal/codex/session_history_unix_test.go @@ -47,3 +47,15 @@ func TestSessionHistoryBoundedReadOnlyCompletedTurns(t *testing.T) { t.Fatal("unavailable provider reported success") } } + +func TestCodex167HistoryIgnoresEvictedCommentaryButKeepsFinalReply(t *testing.T) { + p, f := newQuotaDaemon(t) + f.catalogues = map[string]map[string]any{"thread/turns/list": {"data": []any{map[string]any{"id": "turn", "status": "completed", "items": []any{ + map[string]any{"id": "old", "type": "agentMessage", "phase": "commentary", "text": ""}, + map[string]any{"id": "new", "type": "agentMessage", "phase": "final_answer", "text": "Final answer remains available"}, + }}}}} + turns, err := p.SessionHistory(context.Background(), "one") + if err != nil || len(turns) != 1 || turns[0].Text != "Final answer remains available" || turns[0].ItemID != "new" { + t.Fatal("evicted commentary hid completed answer", turns, err) + } +} From c7b1a422624e601e0bf01f0f267928fbc8731ed9 Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 6 Nov 2026 21:09:27 +0000 Subject: [PATCH 03/10] Require explicit checkpoint details and localise managed approval reviews --- internal/codex/session_approval_unix_test.go | 2 +- internal/codex/session_context_daemon.go | 6 +++--- internal/codex/session_human_approval_test.go | 20 +++++++++++++++++++ internal/i18n/locales/da.json | 4 +++- internal/i18n/locales/de.json | 4 +++- internal/i18n/locales/en-GB.json | 4 +++- internal/i18n/locales/es.json | 4 +++- internal/i18n/locales/et.json | 4 +++- internal/i18n/locales/fi.json | 4 +++- internal/i18n/locales/fr.json | 4 +++- internal/i18n/locales/it.json | 4 +++- internal/i18n/locales/ja.json | 4 +++- internal/i18n/locales/nb.json | 4 +++- internal/i18n/locales/nl.json | 4 +++- internal/i18n/locales/pt-BR.json | 4 +++- internal/i18n/locales/pt-PT.json | 4 +++- internal/i18n/locales/ru.json | 4 +++- internal/i18n/locales/sv.json | 4 +++- internal/i18n/locales/tr.json | 4 +++- internal/i18n/locales/zh-Hans.json | 4 +++- 20 files changed, 75 insertions(+), 21 deletions(-) diff --git a/internal/codex/session_approval_unix_test.go b/internal/codex/session_approval_unix_test.go index 7dc196a9..17177fbc 100644 --- a/internal/codex/session_approval_unix_test.go +++ b/internal/codex/session_approval_unix_test.go @@ -56,7 +56,7 @@ func TestApprovalWireOneUseAndDisconnect(t *testing.T) { t.Fatal("file capability reused") } } - p.contexts, c = approvalFixture(t, map[string]any{"kind": "humanCommand", "availableDecisions": []string{"accept", "acceptForSession"}}) + p.contexts, c = approvalFixture(t, map[string]any{"kind": "humanCommand", "command": "git push", "cwd": "/work", "availableDecisions": []string{"accept", "acceptForSession"}}) // Defend at the response boundary even if a caller hands us a malformed option snapshot. human := p.contexts["root"].requests[`"req"`] human.ApprovalOptions[1] = ApprovalOption{Kind: "acceptForSession", Value: "acceptForSession", Wire: `"acceptForSession"`} diff --git a/internal/codex/session_context_daemon.go b/internal/codex/session_context_daemon.go index 113c3629..16377b4b 100644 --- a/internal/codex/session_context_daemon.go +++ b/internal/codex/session_context_daemon.go @@ -164,10 +164,10 @@ func daemonContextEvent(states map[string]*daemonContextState, method string, id var command string commandValid := len(p.Command) == 0 || string(p.Command) == "null" || json.Unmarshal(p.Command, &command) == nil previous := state.commands[p.TurnID+"/"+p.ItemID] - if command == "" { + if command == "" && kind != "humanCommand" { command = previous.Command } - if p.CWD == "" { + if p.CWD == "" && kind != "humanCommand" { p.CWD = previous.CWD } c.Kind = SessionContextApproval @@ -214,7 +214,7 @@ func daemonContextEvent(states map[string]*daemonContextState, method string, id c.ApprovalBlocked = "missing-command" case p.CWD == "": c.ApprovalBlocked = "missing-directory" - case p.TurnID == "" || p.ItemID == "": + case p.TurnID == "" || p.ItemID == "" || state.ended || state.activeTurn != "" && p.TurnID != state.activeTurn: c.ApprovalBlocked = "missing-identity" case !allowed: c.ApprovalBlocked = "decisions" diff --git a/internal/codex/session_human_approval_test.go b/internal/codex/session_human_approval_test.go index 4cd041ee..901d53cf 100644 --- a/internal/codex/session_human_approval_test.go +++ b/internal/codex/session_human_approval_test.go @@ -42,3 +42,23 @@ func TestHumanApprovalRequiresFreshOneTimeDecision(t *testing.T) { t.Fatal("checkpoint with only reusable choices became actionable") } } + +func TestHumanCheckpointRequiresOwnCommandAndCurrentTurn(t *testing.T) { + for _, fields := range []map[string]any{{"kind": "humanCommand"}, {"kind": "humanCommand", "command": "git push"}, {"kind": "humanCommand", "cwd": "/work"}} { + _, c := approvalFixture(t, fields) + if c.ApprovalToken != "" { + t.Fatal("checkpoint inherited another execution's details", c) + } + } + for _, ended := range []bool{false, true} { + states := map[string]*daemonContextState{"root": {activeTurn: "current", ended: ended, requests: map[string]SessionContext{}}} + turn := "old" + if ended { + turn = "current" + } + daemonContextEvent(states, "item/commandExecution/requestApproval", rawJSON("human"), rawJSON(map[string]any{"threadId": "root", "turnId": turn, "itemId": "item", "kind": "humanCommand", "command": "git push", "cwd": "/work"}), time.Now()) + if c := states["root"].requests[`"human"`]; c.ApprovalToken != "" { + t.Fatal("checkpoint from inactive turn became actionable", c) + } + } +} diff --git a/internal/i18n/locales/da.json b/internal/i18n/locales/da.json index a52cc4a1..e0a89acb 100644 --- a/internal/i18n/locales/da.json +++ b/internal/i18n/locales/da.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HJÆLP ]", "[ ← BACK ]": "[ ← TILBAGE ]", "[ F REFRESH ]": "[ F OPDATER ]", - "[ ESC CANCEL ]": "[ ESC ANNULLER ]" + "[ ESC CANCEL ]": "[ ESC ANNULLER ]", + "HUMAN APPROVAL REQUIRED": "MENNESKELIG GODKENDELSE PÅKRÆVET", + "Managed policy requires approval each time.": "Den administrerede politik kræver godkendelse hver gang." } diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json index ea9de2c3..7e5c37b3 100644 --- a/internal/i18n/locales/de.json +++ b/internal/i18n/locales/de.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HILFE ]", "[ ← BACK ]": "[ ← ZURÜCK ]", "[ F REFRESH ]": "[ F AKTUALISIEREN ]", - "[ ESC CANCEL ]": "[ ESC ABBRECHEN ]" + "[ ESC CANCEL ]": "[ ESC ABBRECHEN ]", + "HUMAN APPROVAL REQUIRED": "MENSCHLICHE GENEHMIGUNG ERFORDERLICH", + "Managed policy requires approval each time.": "Die verwaltete Richtlinie erfordert jedes Mal eine Genehmigung." } diff --git a/internal/i18n/locales/en-GB.json b/internal/i18n/locales/en-GB.json index cde81cfb..f2332db2 100644 --- a/internal/i18n/locales/en-GB.json +++ b/internal/i18n/locales/en-GB.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HELP ]", "[ ← BACK ]": "[ ← BACK ]", "[ F REFRESH ]": "[ F REFRESH ]", - "[ ESC CANCEL ]": "[ ESC CANCEL ]" + "[ ESC CANCEL ]": "[ ESC CANCEL ]", + "HUMAN APPROVAL REQUIRED": "HUMAN APPROVAL REQUIRED", + "Managed policy requires approval each time.": "Managed policy requires approval each time." } diff --git a/internal/i18n/locales/es.json b/internal/i18n/locales/es.json index fc831c32..8f12d4b1 100644 --- a/internal/i18n/locales/es.json +++ b/internal/i18n/locales/es.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER AYUDA ]", "[ ← BACK ]": "[ ← ATRÁS ]", "[ F REFRESH ]": "[ F ACTUALIZAR ]", - "[ ESC CANCEL ]": "[ ESC CANCELAR ]" + "[ ESC CANCEL ]": "[ ESC CANCELAR ]", + "HUMAN APPROVAL REQUIRED": "APROBACIÓN HUMANA OBLIGATORIA", + "Managed policy requires approval each time.": "La política administrada exige aprobación cada vez." } diff --git a/internal/i18n/locales/et.json b/internal/i18n/locales/et.json index fa927e12..a202b812 100644 --- a/internal/i18n/locales/et.json +++ b/internal/i18n/locales/et.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER ABI ]", "[ ← BACK ]": "[ ← TAGASI ]", "[ F REFRESH ]": "[ F VÄRSKENDA ]", - "[ ESC CANCEL ]": "[ ESC TÜHISTA ]" + "[ ESC CANCEL ]": "[ ESC TÜHISTA ]", + "HUMAN APPROVAL REQUIRED": "VAJALIK ON INIMESE HEAKSKIIT", + "Managed policy requires approval each time.": "Hallatud poliitika nõuab iga kord heakskiitu." } diff --git a/internal/i18n/locales/fi.json b/internal/i18n/locales/fi.json index 4799b7b8..eb50b375 100644 --- a/internal/i18n/locales/fi.json +++ b/internal/i18n/locales/fi.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER OHJE ]", "[ ← BACK ]": "[ ← TAKAISIN ]", "[ F REFRESH ]": "[ F PÄIVITÄ ]", - "[ ESC CANCEL ]": "[ ESC PERUUTA ]" + "[ ESC CANCEL ]": "[ ESC PERUUTA ]", + "HUMAN APPROVAL REQUIRED": "IHMISEN HYVÄKSYNTÄ VAADITAAN", + "Managed policy requires approval each time.": "Hallittu käytäntö edellyttää hyväksyntää joka kerta." } diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json index f234edf7..82fab6cf 100644 --- a/internal/i18n/locales/fr.json +++ b/internal/i18n/locales/fr.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER AIDE ]", "[ ← BACK ]": "[ ← RETOUR ]", "[ F REFRESH ]": "[ F ACTUALISER ]", - "[ ESC CANCEL ]": "[ ESC ANNULER ]" + "[ ESC CANCEL ]": "[ ESC ANNULER ]", + "HUMAN APPROVAL REQUIRED": "APPROBATION HUMAINE REQUISE", + "Managed policy requires approval each time.": "La politique gérée exige une approbation à chaque fois." } diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json index db7e7436..a387ca51 100644 --- a/internal/i18n/locales/it.json +++ b/internal/i18n/locales/it.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER AIUTO ]", "[ ← BACK ]": "[ ← INDIETRO ]", "[ F REFRESH ]": "[ F AGGIORNA ]", - "[ ESC CANCEL ]": "[ ESC ANNULLA ]" + "[ ESC CANCEL ]": "[ ESC ANNULLA ]", + "HUMAN APPROVAL REQUIRED": "APPROVAZIONE UMANA RICHIESTA", + "Managed policy requires approval each time.": "La policy gestita richiede ogni volta una nuova approvazione." } diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json index 03b1edaa..a148ab8e 100644 --- a/internal/i18n/locales/ja.json +++ b/internal/i18n/locales/ja.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER ヘルプ ]", "[ ← BACK ]": "[ ← 戻る ]", "[ F REFRESH ]": "[ F 更新 ]", - "[ ESC CANCEL ]": "[ ESC キャンセル ]" + "[ ESC CANCEL ]": "[ ESC キャンセル ]", + "HUMAN APPROVAL REQUIRED": "人による承認が必要", + "Managed policy requires approval each time.": "管理ポリシーにより、毎回承認が必要です。" } diff --git a/internal/i18n/locales/nb.json b/internal/i18n/locales/nb.json index e37e7e3b..31a36791 100644 --- a/internal/i18n/locales/nb.json +++ b/internal/i18n/locales/nb.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HJELP ]", "[ ← BACK ]": "[ ← TILBAKE ]", "[ F REFRESH ]": "[ F OPPDATER ]", - "[ ESC CANCEL ]": "[ ESC AVBRYT ]" + "[ ESC CANCEL ]": "[ ESC AVBRYT ]", + "HUMAN APPROVAL REQUIRED": "MENNESKELIG GODKJENNING KREVES", + "Managed policy requires approval each time.": "Den administrerte policyen krever godkjenning hver gang." } diff --git a/internal/i18n/locales/nl.json b/internal/i18n/locales/nl.json index e590dc8e..d460b590 100644 --- a/internal/i18n/locales/nl.json +++ b/internal/i18n/locales/nl.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HELP ]", "[ ← BACK ]": "[ ← TERUG ]", "[ F REFRESH ]": "[ F VERNIEUWEN ]", - "[ ESC CANCEL ]": "[ ESC ANNULEREN ]" + "[ ESC CANCEL ]": "[ ESC ANNULEREN ]", + "HUMAN APPROVAL REQUIRED": "MENSELIJKE GOEDKEURING VEREIST", + "Managed policy requires approval each time.": "Beheerd beleid vereist elke keer goedkeuring." } diff --git a/internal/i18n/locales/pt-BR.json b/internal/i18n/locales/pt-BR.json index 91b1d764..998d967b 100644 --- a/internal/i18n/locales/pt-BR.json +++ b/internal/i18n/locales/pt-BR.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER AJUDA ]", "[ ← BACK ]": "[ ← VOLTAR ]", "[ F REFRESH ]": "[ F ATUALIZAR ]", - "[ ESC CANCEL ]": "[ ESC CANCELAR ]" + "[ ESC CANCEL ]": "[ ESC CANCELAR ]", + "HUMAN APPROVAL REQUIRED": "APROVAÇÃO HUMANA NECESSÁRIA", + "Managed policy requires approval each time.": "A política gerenciada exige aprovação a cada vez." } diff --git a/internal/i18n/locales/pt-PT.json b/internal/i18n/locales/pt-PT.json index 4bd4ae4d..7133d97d 100644 --- a/internal/i18n/locales/pt-PT.json +++ b/internal/i18n/locales/pt-PT.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER AJUDA ]", "[ ← BACK ]": "[ ← VOLTAR ]", "[ F REFRESH ]": "[ F ATUALIZAR ]", - "[ ESC CANCEL ]": "[ ESC CANCELAR ]" + "[ ESC CANCEL ]": "[ ESC CANCELAR ]", + "HUMAN APPROVAL REQUIRED": "APROVAÇÃO HUMANA NECESSÁRIA", + "Managed policy requires approval each time.": "A política gerida exige aprovação de cada vez." } diff --git a/internal/i18n/locales/ru.json b/internal/i18n/locales/ru.json index fbfcf7ea..40010321 100644 --- a/internal/i18n/locales/ru.json +++ b/internal/i18n/locales/ru.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER СПРАВКА ]", "[ ← BACK ]": "[ ← НАЗАД ]", "[ F REFRESH ]": "[ F ОБНОВИТЬ ]", - "[ ESC CANCEL ]": "[ ESC ОТМЕНА ]" + "[ ESC CANCEL ]": "[ ESC ОТМЕНА ]", + "HUMAN APPROVAL REQUIRED": "ТРЕБУЕТСЯ ОДОБРЕНИЕ ЧЕЛОВЕКА", + "Managed policy requires approval each time.": "Управляемая политика требует одобрения каждый раз." } diff --git a/internal/i18n/locales/sv.json b/internal/i18n/locales/sv.json index cc231986..4d431bd7 100644 --- a/internal/i18n/locales/sv.json +++ b/internal/i18n/locales/sv.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER HJÄLP ]", "[ ← BACK ]": "[ ← TILLBAKA ]", "[ F REFRESH ]": "[ F UPPDATERA ]", - "[ ESC CANCEL ]": "[ ESC AVBRYT ]" + "[ ESC CANCEL ]": "[ ESC AVBRYT ]", + "HUMAN APPROVAL REQUIRED": "MÄNSKLIGT GODKÄNNANDE KRÄVS", + "Managed policy requires approval each time.": "Den hanterade policyn kräver godkännande varje gång." } diff --git a/internal/i18n/locales/tr.json b/internal/i18n/locales/tr.json index 30c0ff05..6059c276 100644 --- a/internal/i18n/locales/tr.json +++ b/internal/i18n/locales/tr.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER YARDIM ]", "[ ← BACK ]": "[ ← GERİ ]", "[ F REFRESH ]": "[ F YENİLE ]", - "[ ESC CANCEL ]": "[ ESC İPTAL ]" + "[ ESC CANCEL ]": "[ ESC İPTAL ]", + "HUMAN APPROVAL REQUIRED": "İNSAN ONAYI GEREKLİ", + "Managed policy requires approval each time.": "Yönetilen ilke her seferinde onay gerektirir." } diff --git a/internal/i18n/locales/zh-Hans.json b/internal/i18n/locales/zh-Hans.json index d99291f3..99889258 100644 --- a/internal/i18n/locales/zh-Hans.json +++ b/internal/i18n/locales/zh-Hans.json @@ -543,5 +543,7 @@ "[ ENTER HELP ]": "[ ENTER 帮助 ]", "[ ← BACK ]": "[ ← 返回 ]", "[ F REFRESH ]": "[ F 刷新 ]", - "[ ESC CANCEL ]": "[ ESC 取消 ]" + "[ ESC CANCEL ]": "[ ESC 取消 ]", + "HUMAN APPROVAL REQUIRED": "需要人工批准", + "Managed policy requires approval each time.": "受管策略要求每次都进行批准。" } From 7a5fe250e0e26df88f923226c3b6fa369ef92a4a Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 6 Nov 2026 22:20:39 +0000 Subject: [PATCH 04/10] Share durable unread results across terminal and browser views --- README.md | 16 ++ internal/codex/client.go | 11 ++ internal/codex/daemon_status.go | 1 + internal/codex/daemon_status_unix.go | 24 ++- internal/codex/live_usage.go | 5 + internal/codex/session_approval.go | 20 +-- internal/codex/session_human_approval_test.go | 2 +- internal/codex/session_read_state.go | 54 +++++++ internal/codex/session_read_state_unix.go | 113 ++++++++++++++ .../codex/session_read_state_unix_test.go | 109 +++++++++++++ internal/codex/session_settings_unix_test.go | 19 +++ internal/ui/model.go | 39 ++--- internal/ui/monitor.go | 3 + internal/ui/monitor_context.go | 4 + internal/ui/monitor_context_modes.go | 31 ++++ internal/ui/monitor_copy.go | 20 +-- internal/ui/monitor_history.go | 1 + internal/ui/monitor_read.go | 114 ++++++++++++++ internal/ui/monitor_read_test.go | 126 +++++++++++++++ internal/ui/monitor_summary.go | 5 +- internal/web/control.go | 65 ++++---- internal/web/control_read.go | 57 +++++++ internal/web/control_read_test.go | 68 ++++++++ internal/web/dist/assets/index-CJs9l6nA.js | 50 ------ internal/web/dist/assets/index-DYxZORQa.css | 1 + internal/web/dist/assets/index-Ei3sATy3.css | 1 - internal/web/dist/assets/index-mFvKL8_v.js | 50 ++++++ internal/web/dist/index.html | 4 +- internal/web/server.go | 2 +- internal/web/state.go | 13 ++ web/src/Sessions.svelte | 137 +++++++++++++++- web/src/contracts.generated.ts | 4 + web/src/state.svelte.ts | 2 +- web/tests/browser.spec.ts | 146 ++++++++++++++++++ 34 files changed, 1176 insertions(+), 141 deletions(-) create mode 100644 internal/codex/session_read_state.go create mode 100644 internal/codex/session_read_state_unix.go create mode 100644 internal/codex/session_read_state_unix_test.go create mode 100644 internal/ui/monitor_read.go create mode 100644 internal/ui/monitor_read_test.go create mode 100644 internal/web/control_read.go create mode 100644 internal/web/control_read_test.go delete mode 100644 internal/web/dist/assets/index-CJs9l6nA.js create mode 100644 internal/web/dist/assets/index-DYxZORQa.css delete mode 100644 internal/web/dist/assets/index-Ei3sATy3.css create mode 100644 internal/web/dist/assets/index-mFvKL8_v.js diff --git a/README.md b/README.md index 1203a407..40abb171 100644 --- a/README.md +++ b/README.md @@ -1600,6 +1600,22 @@ same action on that session. The presentations are: not full command-output logs, and run asynchronously at most every five seconds while full detail is visible. +**Unread completed results (shared app-server):** when Codex supplies durable +read state, **TURN COMPLETE** remains highlighted and its completion pill stays +visible until the result is reviewed. Deliberately opening partial or full Detail, +or scrolling within its displayed result pane, acknowledges the latest completed +reply. The completion status remains visible in subdued styling afterward. +Rendering a preview, selecting a row, restoring a layout or receiving a new result +in an already-open pane does not acknowledge it. An older history page cannot +acknowledge a newer result; changed receipts require a fresh review action. + +These receipts are saved by Codex and shared with supported native Codex views, +so reviewed results remain reviewed across restarts. Codexometer does not save a +second read-state database. Read-only web mode displays receipts without changing +them; `--web-control` enables acknowledgement. When durable receipts are unavailable, +existing completion behaviour remains. Linked-agent previews do not acknowledge +the root's result, and approval/question/error controls keep priority. + Whenever visible **LAST REPLY** or **LAST ACTIVITY** text is available, its box offers **[ (C)OPY ]** in the bottom-right border (split, expanded and full detail, when space permits). Click it to copy a snapshot of that session's observed text, including offscreen text, diff --git a/internal/codex/client.go b/internal/codex/client.go index 13223af7..2ec46592 100644 --- a/internal/codex/client.go +++ b/internal/codex/client.go @@ -309,3 +309,14 @@ func withServerError(action string, err error, stderr string) error { } return fmt.Errorf("%s: %w", action, err) } + +// sessionCapability keeps optional live-control adapters consistent when the +// local observer is unavailable (including platforms without a shared daemon). +func sessionCapability[T any](c Client) (T, bool) { + var unavailable T + if c.LiveUsage == nil { + return unavailable, false + } + capability, ok := c.LiveUsage.statusProvider.(T) + return capability, ok +} diff --git a/internal/codex/daemon_status.go b/internal/codex/daemon_status.go index 5175ff97..e5bce37e 100644 --- a/internal/codex/daemon_status.go +++ b/internal/codex/daemon_status.go @@ -19,6 +19,7 @@ type sessionStatusProvider interface { } type sessionDaemonSnapshot struct { + ReadStates map[string]SessionReadState Goals map[string]*SessionGoal UsageCoverage map[string]string Contexts map[string]SessionContext diff --git a/internal/codex/daemon_status_unix.go b/internal/codex/daemon_status_unix.go index 0a7a301b..82626a7a 100644 --- a/internal/codex/daemon_status_unix.go +++ b/internal/codex/daemon_status_unix.go @@ -24,6 +24,8 @@ const ( ) type daemonStatusProvider struct { + readStates map[string]readStateObservation + readStateVersion uint64 humanApprovals bool commandGeneration uint64 commandTransitions map[string]uint64 @@ -115,8 +117,12 @@ func (p *daemonStatusProvider) Fetch(ctx context.Context, threadIDs []string) (s coverage := p.readUsageCoverage(ctx, threadIDs) statuses := make(map[string]sessionRuntimeStatus, len(threadIDs)) for _, threadID := range threadIDs { + p.mu.Lock() + connection, readVersion := p.connection, p.readStates[threadID].version + p.mu.Unlock() var result struct { - Thread struct { + ReadState *wireReadState `json:"readState"` + Thread struct { ID string `json:"id"` Status struct { Type string `json:"type"` @@ -129,6 +135,11 @@ func (p *daemonStatusProvider) Fetch(ctx context.Context, threadIDs []string) (s }, &result); err != nil { continue } + p.mu.Lock() + if p.connection == connection && p.readStates[threadID].version == readVersion && result.Thread.ID == threadID { + p.observeReadStateLocked(threadID, result.ReadState.snapshot()) + } + p.mu.Unlock() status := parseSessionRuntimeStatus(result.Thread.Status.Type, result.Thread.Status.ActiveFlags) if status != sessionRuntimeUnknown { statuses[threadID] = status @@ -136,6 +147,12 @@ func (p *daemonStatusProvider) Fetch(ctx context.Context, threadIDs []string) (s } p.mu.Lock() + wanted := stringStructSet(threadIDs) + for id := range p.readStates { + if _, keep := wanted[id]; !keep { + delete(p.readStates, id) + } + } p.usageCoverage = coverage p.lastStatusAt = time.Now() p.statusThreads = stringStructSet(threadIDs) @@ -167,6 +184,7 @@ func (p *daemonStatusProvider) statusSnapshotLocked(threadIDs []string) sessionD statuses := make(map[string]sessionRuntimeStatus, len(threadIDs)) directories := make(map[string]string, len(threadIDs)) goals := make(map[string]*SessionGoal) + readStates := make(map[string]SessionReadState) for _, threadID := range threadIDs { if _, subscribed := p.subscribed[threadID]; subscribed { if goal := p.goals[threadID].goal; goal != nil { @@ -174,6 +192,7 @@ func (p *daemonStatusProvider) statusSnapshotLocked(threadIDs []string) sessionD } } if status, ok := p.statuses[threadID]; ok { + readStates[threadID] = p.readStates[threadID].state if state := p.contexts[threadID]; status == sessionRuntimeIdle && state != nil && state.completed { status = sessionRuntimeComplete } @@ -195,6 +214,7 @@ func (p *daemonStatusProvider) statusSnapshotLocked(threadIDs []string) sessionD coverage[id] = issue } return sessionDaemonSnapshot{ + ReadStates: readStates, Goals: goals, UsageCoverage: coverage, Contexts: daemonContextSnapshot(p.contexts, threadIDs, statuses), @@ -307,6 +327,7 @@ func (p *daemonStatusProvider) ensureConnected(ctx context.Context) error { p.commandTransitions = make(map[string]uint64) p.pending = make(map[int64]chan daemonEnvelope) p.subscribed = make(map[string]struct{}) + p.readStates = make(map[string]readStateObservation) p.reroutedTurns = make(map[daemonTurnKey]string) p.threadSettings = make(map[string]QuotaSession) p.threadDirectories = make(map[string]string) @@ -501,6 +522,7 @@ func (p *daemonStatusProvider) readLoop(connection *websocket.Conn, wires ...*da p.queueRevision++ } p.goalNotificationLocked(envelope.Method, envelope.Params) + p.readStateNotificationLocked(envelope.Method, envelope.Params) if p.contexts == nil { p.contexts = map[string]*daemonContextState{} } diff --git a/internal/codex/live_usage.go b/internal/codex/live_usage.go index b5c8795b..aec0a74a 100644 --- a/internal/codex/live_usage.go +++ b/internal/codex/live_usage.go @@ -60,6 +60,7 @@ type LiveUsageSnapshot struct { // LiveUsageSession is one independently started local Codex session. Token // usage from explicitly linked spawned descendants is folded into the root. type LiveUsageSession struct { + ReadState SessionReadState Goal *SessionGoal ModelSettings SessionModelSettings ID string @@ -140,6 +141,7 @@ type LiveUsageReader struct { nameIndexInfo os.FileInfo daemonContexts map[string]SessionContext daemonDirectories map[string]string + daemonReadStates map[string]SessionReadState daemonGoals map[string]*SessionGoal SessionsRoot string WriterLocksRoot string @@ -409,6 +411,7 @@ func (r *LiveUsageReader) fetchTokenUsage(ctx context.Context, forceFullDiscover r.daemonContexts = nil r.daemonDirectories = nil r.daemonGoals = nil + r.daemonReadStates = nil appServerUp := false r.daemonSubscribedThreads = nil if r.statusProvider != nil { @@ -419,6 +422,7 @@ func (r *LiveUsageReader) fetchTokenUsage(ctx context.Context, forceFullDiscover daemonCoverage = daemonSnapshot.UsageCoverage r.daemonDirectories = daemonSnapshot.WorkingDirectories r.daemonGoals = daemonSnapshot.Goals + r.daemonReadStates = daemonSnapshot.ReadStates r.ingestResolvedModelObservations(daemonSnapshot.ModelObservations) r.daemonSubscribedThreads = daemonSnapshot.SubscribedThreads } @@ -1546,6 +1550,7 @@ func (r *LiveUsageReader) sessionSnapshots(now time.Time, liveWriters map[string anyWorking := false for _, session := range groups { session.Goal = r.daemonGoals[session.ID].Clone() + session.ReadState = r.daemonReadStates[session.ID] if root := byID[session.ID]; root != nil && !session.Unattributed { session.ModelSettings = root.modelSettings } diff --git a/internal/codex/session_approval.go b/internal/codex/session_approval.go index 7dbac7e9..b12c892b 100644 --- a/internal/codex/session_approval.go +++ b/internal/codex/session_approval.go @@ -14,28 +14,20 @@ type SessionApprovalClient interface { } func (c Client) SessionApprovalPending(token string) bool { - if c.LiveUsage == nil { - return false - } - p, ok := c.LiveUsage.statusProvider.(SessionApprovalClient) + p, ok := sessionCapability[SessionApprovalClient](c) return ok && p.SessionApprovalPending(token) } func (c Client) RespondSessionApproval(ctx context.Context, token, decision string) error { - if c.LiveUsage != nil { - if p, ok := c.LiveUsage.statusProvider.(SessionApprovalClient); ok { - return p.RespondSessionApproval(ctx, token, decision) - } + if p, ok := sessionCapability[SessionApprovalClient](c); ok { + return p.RespondSessionApproval(ctx, token, decision) } return errors.New("approval unavailable; respond in Codex") } -// SetSessionHumanApprovalSupport is configured by interactive adapters before -// observation starts. Passive clients must not claim they can present a decision. +// Passive clients must not claim they can present a human decision. func (c Client) SetSessionHumanApprovalSupport(enabled bool) { - if c.LiveUsage != nil { - if p, ok := c.LiveUsage.statusProvider.(interface{ setHumanApprovalSupport(bool) }); ok { - p.setHumanApprovalSupport(enabled) - } + if p, ok := sessionCapability[interface{ setHumanApprovalSupport(bool) }](c); ok { + p.setHumanApprovalSupport(enabled) } } diff --git a/internal/codex/session_human_approval_test.go b/internal/codex/session_human_approval_test.go index 901d53cf..8d463fb4 100644 --- a/internal/codex/session_human_approval_test.go +++ b/internal/codex/session_human_approval_test.go @@ -37,7 +37,7 @@ func TestHumanApprovalRequiresFreshOneTimeDecision(t *testing.T) { if len(states["root"].requests) != 0 { t.Fatal("resolved checkpoint still pending") } - _, invalid := approvalFixture(t, map[string]any{"kind": "humanCommand", "availableDecisions": []string{"acceptForSession"}}) + _, invalid := approvalFixture(t, map[string]any{"kind": "humanCommand", "command": "git push", "cwd": "/work", "availableDecisions": []string{"acceptForSession"}}) if invalid.ApprovalToken != "" { t.Fatal("checkpoint with only reusable choices became actionable") } diff --git a/internal/codex/session_read_state.go b/internal/codex/session_read_state.go new file mode 100644 index 00000000..c25a27a9 --- /dev/null +++ b/internal/codex/session_read_state.go @@ -0,0 +1,54 @@ +package codex + +import ( + "context" + "encoding/json" + "errors" +) + +// SessionReadState is Codex's durable local result receipt. An empty revision +// means unavailable; never substitute a local guess for shared read state. +type SessionReadState struct { + Revision string + Unread bool +} + +func (s SessionReadState) Known() bool { return s.Revision != "" } + +var ErrSessionReadState = errors.New("result changed or read state is unavailable; review the result again") + +// AcknowledgeSessionResult marks only a deliberately viewed latest completed +// reply. The server's revision check must protect newer, unseen results. +type SessionReadStateClient interface { + AcknowledgeSessionResult(context.Context, string, string, string) (SessionReadState, error) +} + +func (c Client) AcknowledgeSessionResult(ctx context.Context, id, turn, revision string) (SessionReadState, error) { + if p, ok := sessionCapability[SessionReadStateClient](c); ok { + return p.AcknowledgeSessionResult(ctx, id, turn, revision) + } + return SessionReadState{}, ErrSessionReadState +} + +// Wire receipts are deliberately separate from the comparable display value. +type wireReadState struct { + Revision string `json:"revision"` + FirstUnread json.RawMessage `json:"firstUnread"` +} + +func (s *wireReadState) snapshot() SessionReadState { + if s == nil || s.Revision == "" || len(s.Revision) > 2048 || len(s.FirstUnread) == 0 { + return SessionReadState{} + } + unread := string(s.FirstUnread) != "null" + if unread { + var position struct { + Type string + TurnID string + } + if json.Unmarshal(s.FirstUnread, &position) != nil || position.Type != "threadStart" && (position.Type != "turn" || position.TurnID == "") { + return SessionReadState{} + } + } + return SessionReadState{Revision: s.Revision, Unread: unread} +} diff --git a/internal/codex/session_read_state_unix.go b/internal/codex/session_read_state_unix.go new file mode 100644 index 00000000..6c5b4502 --- /dev/null +++ b/internal/codex/session_read_state_unix.go @@ -0,0 +1,113 @@ +//go:build unix + +package codex + +import ( + "context" + "encoding/json" + "time" +) + +type readStateObservation struct { + state SessionReadState + version uint64 +} + +func (p *daemonStatusProvider) observeReadStateLocked(id string, state SessionReadState) { + if p.readStates == nil { + p.readStates = make(map[string]readStateObservation) + } + if len(p.readStates) >= 256 { + if _, known := p.readStates[id]; !known { + return + } + } + p.readStateVersion++ + p.readStates[id] = readStateObservation{state: state, version: p.readStateVersion} +} + +func (p *daemonStatusProvider) readStateNotificationLocked(method string, raw json.RawMessage) { + switch method { + case "thread/readState/changed": + var notification struct { + ThreadID string + ReadState *wireReadState + } + if json.Unmarshal(raw, ¬ification) == nil && notification.ThreadID != "" { + p.observeReadStateLocked(notification.ThreadID, notification.ReadState.snapshot()) + } + case "turn/completed", "thread/closed", "thread/archived", "thread/deleted": + var notification struct{ ThreadID string } + if json.Unmarshal(raw, ¬ification) == nil && notification.ThreadID != "" { + p.observeReadStateLocked(notification.ThreadID, SessionReadState{}) + p.lastStatusAt = time.Time{} + } + } +} + +func (p *daemonStatusProvider) AcknowledgeSessionResult(ctx context.Context, id, turn, revision string) (SessionReadState, error) { + if id == "" || turn == "" || revision == "" || len(id) > 512 || len(turn) > 512 || len(revision) > 2048 { + return SessionReadState{}, ErrSessionReadState + } + p.mu.Lock() + connection, observed := p.connection, p.readStates[id].state + p.mu.Unlock() + if connection == nil || !observed.Unread || observed.Revision != revision { + return SessionReadState{}, ErrSessionReadState + } + // A stale excerpt may coexist with a freshly polled receipt. Verify which + // completed result the receipt would acknowledge before sending any write. + var history struct{ Data []historyTurn } + if err := p.requestOn(ctx, connection, "thread/turns/list", map[string]any{"threadId": id, "limit": 2, "sortDirection": "desc", "itemsView": "summary"}, &history); err != nil { + return SessionReadState{}, err + } + matched := false + for _, latest := range history.Data { + if latest.Status == "inProgress" { + continue + } + if latest.Status == "completed" && latest.ID == turn { + for _, item := range latest.Items { + if item.Type == "agentMessage" && (item.Phase == "final_answer" || item.Phase == "") && item.Text != "" { + matched = true + } + } + } + break + } + if !matched { + return SessionReadState{}, ErrSessionReadState + } + p.mu.Lock() + current := p.readStates[id].state + valid := p.connection == connection && current == observed + p.mu.Unlock() + if !valid { + return SessionReadState{}, ErrSessionReadState + } + var response struct{ ReadState *wireReadState } + // No retry, resume or reconnect: this mutation belongs to the viewed revision + // and the original connection. Codex atomically rejects newer unseen activity. + if err := p.requestOn(ctx, connection, "thread/readState/update", map[string]any{"threadId": id, "operation": "read", "expectedRevision": revision}, &response); err != nil { + p.mu.Lock() + if p.connection == connection { + p.lastStatusAt = time.Time{} + } + p.mu.Unlock() + return SessionReadState{}, err + } + next := response.ReadState.snapshot() + if !next.Known() || next.Unread { + return SessionReadState{}, ErrSessionReadState + } + p.mu.Lock() + defer p.mu.Unlock() + if p.connection != connection { + return SessionReadState{}, ErrSessionReadState + } + current = p.readStates[id].state + if current == observed || current == next { + p.observeReadStateLocked(id, next) + } + return p.readStates[id].state, nil +} diff --git a/internal/codex/session_read_state_unix_test.go b/internal/codex/session_read_state_unix_test.go new file mode 100644 index 00000000..be375763 --- /dev/null +++ b/internal/codex/session_read_state_unix_test.go @@ -0,0 +1,109 @@ +//go:build unix + +package codex + +import ( + "context" + "encoding/json" + "testing" +) + +func unreadReceipt(revision, turn string) map[string]any { + return map[string]any{"revision": revision, "firstUnread": map[string]any{"type": "turn", "turnId": turn}} +} + +func readStateDaemon(t *testing.T) (*daemonStatusProvider, *quotaDaemonFixture) { + t.Helper() + p, f := newQuotaDaemon(t) + f.readReceipts = map[string]map[string]any{"one": unreadReceipt("v1", "t1")} + f.catalogues = map[string]map[string]any{"thread/turns/list": {"data": []any{map[string]any{"id": "t1", "status": "completed", "items": []any{map[string]any{"type": "agentMessage", "phase": "final_answer", "text": "Finished"}}}}}} + snapshot, ok := p.Fetch(context.Background(), []string{"one"}) + if !ok || snapshot.ReadStates["one"] != (SessionReadState{Revision: "v1", Unread: true}) { + t.Fatal("receipt not observed", snapshot.ReadStates) + } + return p, f +} + +func TestReadStateAcknowledgementUsesSavedRevisionAndSurvivesNewClient(t *testing.T) { + p, f := readStateDaemon(t) + next, err := p.AcknowledgeSessionResult(context.Background(), "one", "t1", "v1") + if err != nil || !next.Known() || next.Unread { + t.Fatal("read acknowledgement failed", next, err) + } + if _, err := p.AcknowledgeSessionResult(context.Background(), "one", "t1", "v1"); err == nil { + t.Fatal("old receipt reused") + } + f.mu.Lock() + if len(f.readUpdates) != 1 || f.readUpdates[0]["expectedRevision"] != "v1" || f.readUpdates[0]["operation"] != "read" || len(f.writes) != 0 { + t.Fatal("unexpected mutation", f.readUpdates, f.writes) + } + f.mu.Unlock() + fresh := &daemonStatusProvider{socketPath: p.socketPath} + t.Cleanup(func() { fresh.disconnect(nil) }) + snapshot, ok := fresh.Fetch(context.Background(), []string{"one"}) + if !ok || snapshot.ReadStates["one"] != next { + t.Fatal("new client did not observe saved receipt", snapshot.ReadStates, next) + } + p.mu.Lock() + p.readStateNotificationLocked("thread/readState/changed", rawJSON(map[string]any{"threadId": "one", "readState": unreadReceipt("v2", "t2")})) + p.mu.Unlock() + cached, _ := p.cachedStatusSnapshot([]string{"one"}, p.lastStatusAt) + if !cached.ReadStates["one"].Unread || cached.ReadStates["one"].Revision != "v2" { + t.Fatal("shared notification lost", cached.ReadStates) + } +} + +func TestReadStateNeverAcknowledgesUnseenOrUnavailableResult(t *testing.T) { + for _, mode := range []string{"old-revision", "old-turn", "wrong-thread", "missing-receipt", "conflict", "arrived-during-read", "disconnected"} { + t.Run(mode, func(t *testing.T) { + p, f := readStateDaemon(t) + id, turn, revision := "one", "t1", "v1" + switch mode { + case "old-revision": + revision = "older" + case "old-turn": + turn = "older" + case "wrong-thread": + id = "two" + case "missing-receipt": + p.mu.Lock() + p.observeReadStateLocked("one", SessionReadState{}) + p.mu.Unlock() + case "conflict": + f.mu.Lock() + f.readConflict = true + f.mu.Unlock() + case "arrived-during-read": + f.mu.Lock() + f.historyReadHook = func() { f.readReceipts["one"] = unreadReceipt("v2", "t2") } + f.mu.Unlock() + case "disconnected": + p.disconnect(nil) + } + if _, err := p.AcknowledgeSessionResult(context.Background(), id, turn, revision); err == nil { + t.Fatal("unseen result acknowledged") + } + f.mu.Lock() + defer f.mu.Unlock() + expected := 0 + if mode == "conflict" || mode == "arrived-during-read" { + expected = 1 + } + if len(f.readUpdates) != expected { + t.Fatal("unexpected write or automatic retry", f.readUpdates) + } + }) + } +} + +func TestReadStateUnknownReceiptRetainsCompatibility(t *testing.T) { + for _, raw := range []string{`null`, `{}`, `{"revision":"r"}`, `{"revision":"r","firstUnread":{"type":"future"}}`} { + var response struct{ ReadState *wireReadState } + if err := json.Unmarshal([]byte(`{"readState":`+raw+`}`), &response); err != nil { + t.Fatal(err) + } + if response.ReadState.snapshot().Known() { + t.Fatal("unknown state treated as read", raw) + } + } +} diff --git a/internal/codex/session_settings_unix_test.go b/internal/codex/session_settings_unix_test.go index 5737dafc..b40575f8 100644 --- a/internal/codex/session_settings_unix_test.go +++ b/internal/codex/session_settings_unix_test.go @@ -17,6 +17,10 @@ import ( ) type quotaDaemonFixture struct { + readReceipts map[string]map[string]any + readUpdates []map[string]any + readConflict bool + historyReadHook func() initializeParams map[string]any mu sync.Mutex sessions map[string]QuotaSession @@ -150,11 +154,23 @@ func newQuotaDaemonTransport(t *testing.T, compressed bool) (*daemonStatusProvid result = map[string]any{"cwd": cwd, "model": s.Model, "reasoningEffort": s.Effort, "serviceTier": s.Tier, "thread": map[string]any{"id": id}, "activePermissionProfile": map[string]any{"id": fixture.permissions[id]}} case "thread/read": fixture.threadReads++ + result["readState"] = fixture.readReceipts[id] status := fixture.commandStatus if status == "" { status = "idle" } result["thread"] = map[string]any{"id": id, "cwd": "/work", "status": map[string]any{"type": status}, "name": fixture.names[id], "environments": fixture.environments} + case "thread/readState/update": + fixture.readUpdates = append(fixture.readUpdates, req.Params) + receipt := fixture.readReceipts[id] + if fixture.readConflict || receipt == nil || req.Params["operation"] != "read" || req.Params["expectedRevision"] != receipt["revision"] { + failure = true + failureDetail = map[string]any{"code": -32600, "message": "read state changed", "data": map[string]any{"reason": "readStateConflict"}} + } else { + receipt = map[string]any{"revision": receipt["revision"].(string) + "-read", "firstUnread": nil} + fixture.readReceipts[id] = receipt + result["readState"] = receipt + } case "thread/goal/get": fixture.goalReads++ noReply = fixture.goalNoReply[id] @@ -278,6 +294,9 @@ func newQuotaDaemonTransport(t *testing.T, compressed bool) (*daemonStatusProvid default: if req.Method == "thread/turns/list" { fixture.historyReads = append(fixture.historyReads, req.Params) + if fixture.historyReadHook != nil { + fixture.historyReadHook() + } } if value, ok := fixture.catalogues[req.Method]; ok { result = value diff --git a/internal/ui/model.go b/internal/ui/model.go index 1d096d29..b5265bb2 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -60,6 +60,8 @@ type Model struct { monitorContextExpanded string monitorContextRows map[string]rowContextState monitorContextScroll int + monitorReadIntent string + monitorReadBusy bool monitorHistory map[string]monitorTurnHistory monitorHistorySequence uint64 monitorAttentionPage int @@ -263,6 +265,7 @@ type monitorSessionDismissal struct { } type monitorSession struct { + readState codex.SessionReadState goal *codex.SessionGoal name string averageRate int64 @@ -476,7 +479,7 @@ func (m Model) Init() tea.Cmd { return tea.Batch(m.fetch(), secondTick(), refreshTick(m.refreshEvery), func() tea.Msg { return initialViewMsg{} }) } -func (m Model) Update(message tea.Msg) (tea.Model, tea.Cmd) { +func (m Model) update(message tea.Msg) (tea.Model, tea.Cmd) { if next, cmd, handled := m.updateStartup(message); handled { return next, cmd } else { @@ -2566,19 +2569,17 @@ func (m *Model) startMonitorSessions(usage codex.LiveUsageSnapshot, observedAt t m.monitorSessionData = nil m.monitorDismissed = nil for _, session := range usage.Sessions { - m.monitorSessionData = append(m.monitorSessionData, monitorSession{ + row := monitorSession{ id: session.ID, workingDirectory: session.WorkingDirectory, - name: session.Name, modelSettings: session.ModelSettings, baseline: session.TotalTokens, latest: session.TotalTokens, graphStart: session.TotalTokens, startedAt: observedAt, lastActivity: session.LastActivity, agentCount: session.AgentCount, - active: session.Active, working: session.Working, attention: session.Attention, - preview: session.Context, - goal: session.Goal.Clone(), displayed: session.Active, unattributed: session.Unattributed, callSequence: latestModelCallSequence(session.ModelCalls), turnSequence: latestTurnTimingSequence(session.TurnTimings), - }) + } + applyMonitorSessionObservation(&row, session) + m.monitorSessionData = append(m.monitorSessionData, row) } if len(m.monitorSessionData) == 0 && usage.SessionCount > 0 { m.monitorSessionData = append(m.monitorSessionData, monitorSession{ @@ -2627,15 +2628,12 @@ func (m *Model) syncMonitorSessions(usage codex.LiveUsageSnapshot, observedAt ti } created := monitorSession{ id: update.ID, workingDirectory: update.WorkingDirectory, - name: update.Name, modelSettings: update.ModelSettings, latest: update.TotalTokens, graphStart: 0, startedAt: startedAt, lastActivity: update.LastActivity, agentCount: update.AgentCount, - active: update.Active, working: update.Working, attention: update.Attention, - preview: update.Context, - goal: update.Goal.Clone(), displayed: update.Active || update.TotalTokens > 0 || len(update.ModelCalls) > 0 || len(update.TurnTimings) > 0, unattributed: update.Unattributed, } + applyMonitorSessionObservation(&created, update) applyMonitorSessionTelemetry(&created, update, m.monitorStartedAt) m.monitorSessionData = append(m.monitorSessionData, created) continue @@ -2648,13 +2646,7 @@ func (m *Model) syncMonitorSessions(usage codex.LiveUsageSnapshot, observedAt ti session.latest = update.TotalTokens session.lastActivity = update.LastActivity session.agentCount = max(session.agentCount, update.AgentCount) - session.active = update.Active - session.working = update.Working - session.attention = update.Attention - session.preview = update.Context - session.modelSettings = update.ModelSettings - session.goal = update.Goal.Clone() - session.name = update.Name + applyMonitorSessionObservation(session, update) session.displayed = session.displayed || update.Active || update.TotalTokens > session.baseline || len(update.ModelCalls) > 0 || len(update.TurnTimings) > 0 if update.WorkingDirectory != "" { @@ -2950,3 +2942,14 @@ func secondTick() tea.Cmd { func refreshTick(after time.Duration) tea.Cmd { return tea.Tick(after, func(now time.Time) tea.Msg { return refreshMsg(now) }) } + +func applyMonitorSessionObservation(row *monitorSession, observed codex.LiveUsageSession) { + row.name = observed.Name + row.modelSettings = observed.ModelSettings + row.preview = observed.Context + row.goal = observed.Goal.Clone() + row.readState = observed.ReadState + row.active = observed.Active + row.working = observed.Working + row.attention = observed.Attention +} diff --git a/internal/ui/monitor.go b/internal/ui/monitor.go index 30bb2b0d..f56d18e2 100644 --- a/internal/ui/monitor.go +++ b/internal/ui/monitor.go @@ -485,6 +485,9 @@ func (m Model) renderMonitorSessionBadge(session monitorSession, width int, colo badgeColor = paletteFor(m.theme).primary } badge := lipgloss.NewStyle().Bold(true).Foreground(colors.background).Background(badgeColor) + if session.attention == codex.SessionAttentionComplete && session.readState.Known() && !session.readState.Unread && !trigger { + badge = colors.dimmed() + } if m.monitorContextHover == "badge:"+session.id || (m.sessionTriggerStatus(session) && m.monitorContextHover == "attention-trigger:"+session.id) { badge = badge.Underline(true) } diff --git a/internal/ui/monitor_context.go b/internal/ui/monitor_context.go index e2a89e27..9947f760 100644 --- a/internal/ui/monitor_context.go +++ b/internal/ui/monitor_context.go @@ -293,12 +293,16 @@ func (m *Model) openMonitorContext(id string) { for _, s := range m.monitorSessionData { if s.id == id && (s.preview.Text != "" || s.preview.CurrentTask != "" || s.preview.LatestGuidance != "" || s.preview.Kind == codex.SessionContextApproval || m.hasSessionProfile(s) || id == m.monitorContextExpanded) && m.monitorSessionVisible(s) { m.setRowContext(id, contextFull) + m.monitorReadIntent = id return } } } func (m *Model) scrollMonitorContext(delta int) { + if delta != 0 { + m.monitorReadIntent = m.monitorContextDetail + } m.monitorContextScroll = min(max(m.monitorContextScroll+delta, 0), m.monitorContextScrollLimit()) } diff --git a/internal/ui/monitor_context_modes.go b/internal/ui/monitor_context_modes.go index 9b11d490..c969369a 100644 --- a/internal/ui/monitor_context_modes.go +++ b/internal/ui/monitor_context_modes.go @@ -62,6 +62,9 @@ func (m *Model) changeMonitorContext(id string, delta int) { if s.id == id && m.monitorSessionVisible(s) { mode := m.rowContextMode(id) next := min(max(mode+delta, contextGraph), contextFull) + if next > mode && next >= contextSplit { + m.monitorReadIntent = id + } if next != mode || m.monitorSelectedID != id { m.setRowContext(id, next) } @@ -345,3 +348,31 @@ func (m Model) expandedContextAt(x, y int) string { } return "" } + +// These frames are shared by Copy hit testing and explicit result review. +// Coordinates are relative to the dashboard content, including its header rows. +type monitorContextPane struct { + session monitorSession + frame monitorRect +} + +func (m Model) monitorPartialContextPanes() []monitorContextPane { + g := m.monitorDashboardLayout() + area := m.monitorArea(g.contentWidth, g.meterHeight) + sessions, heights, _ := m.monitorSessionPage(area.graphHeight) + metrics, wideWidth, _ := monitorSessionColumnWidths(area.width) + top := area.topHeight + area.gap - 1 + var panes []monitorContextPane + for i, row := range sessions { + width := wideWidth + mode := m.rowContextMode(row.id) + if mode == contextSplit { + _, width, _ = m.contextColumns(area.width, row) + } + if mode == contextSplit || mode == contextWide { + panes = append(panes, monitorContextPane{row, monitorRect{x: metrics + 1, y: top, width: width, height: heights[i]}}) + } + top += heights[i] + } + return panes +} diff --git a/internal/ui/monitor_copy.go b/internal/ui/monitor_copy.go index 6dabdc03..6f8d3b46 100644 --- a/internal/ui/monitor_copy.go +++ b/internal/ui/monitor_copy.go @@ -62,23 +62,13 @@ func (m Model) monitorCopyAt(x, y int) string { if m.monitorContextDetail != "" && !m.contextTargetHidden() { return hit(m.monitorContextDetail, 0, 0, g.contentWidth, g.meterHeight) } - a := m.monitorArea(g.contentWidth, g.meterHeight) - sessions, heights, _ := m.monitorSessionPage(a.graphHeight) - mw, cw, _ := monitorSessionColumnWidths(a.width) - y0 := a.topHeight + a.gap - 1 - for i, s := range sessions { - width := cw - mode := m.rowContextMode(s.id) - if mode == contextSplit { - _, width, _ = m.contextColumns(a.width, s) + for _, pane := range m.monitorPartialContextPanes() { + r := pane.frame + if action := hit(pane.session.id, r.x, r.y, r.width, r.height); action != "" { + return action } - if mode == contextSplit || mode == contextWide { - if action := hit(s.id, mw+1, y0, width, heights[i]); action != "" { - return action - } - } - y0 += heights[i] } + return "" } diff --git a/internal/ui/monitor_history.go b/internal/ui/monitor_history.go index 9fecc098..60096c21 100644 --- a/internal/ui/monitor_history.go +++ b/internal/ui/monitor_history.go @@ -145,6 +145,7 @@ func (m *Model) moveMonitorHistory(delta int) { h.selected = &c } m.saveMonitorHistory(id, h) + m.monitorReadIntent = id m.monitorContextScroll = 0 m.monitorPrompt.input.Blur() m.monitorApprovalConfirm = "" diff --git a/internal/ui/monitor_read.go b/internal/ui/monitor_read.go new file mode 100644 index 00000000..67e58e47 --- /dev/null +++ b/internal/ui/monitor_read.go @@ -0,0 +1,114 @@ +package ui + +import ( + "context" + "slices" + "time" + + tea "charm.land/bubbletea/v2" + "github.com/merefield/codexometer/internal/codex" +) + +type monitorReadResult struct { + id, revision string + state codex.SessionReadState + err error +} + +// Only deliberate input may acknowledge a result. Rendering, refreshes, +// restored layouts, hover and automatic history hydration never do so. +func (m Model) Update(message tea.Msg) (tea.Model, tea.Cmd) { + if result, ok := message.(monitorReadResult); ok { + m.monitorReadBusy = false + if result.err == nil { + m.monitorSessionData = slices.Clone(m.monitorSessionData) + for i := range m.monitorSessionData { + row := &m.monitorSessionData[i] + if row.id == result.id && row.readState.Revision == result.revision { + row.readState = result.state + } + } + } + return m, nil + } + m.monitorReadIntent = "" + next, command := m.update(message) + updated := next.(Model) + deliberate := false + switch msg := message.(type) { + case tea.KeyPressMsg: + deliberate = true + case tea.MouseClickMsg: + deliberate = msg.Button == tea.MouseLeft + case tea.MouseWheelMsg: + deliberate = true + updated.monitorReadIntent = "" + mouse := msg.Mouse() + for _, row := range m.monitorSessionData { + if rect, ok := m.monitorResultRect(row.id); ok && rect.contains(mouse.X, mouse.Y) { + updated.monitorReadIntent = row.id + break + } + } + + } + if !deliberate { + updated.monitorReadIntent = "" + } + receipt := updated.acknowledgeMonitorResult() + return updated, tea.Batch(command, receipt) +} + +func (m *Model) acknowledgeMonitorResult() tea.Cmd { + id := m.monitorReadIntent + m.monitorReadIntent = "" + client, ok := m.fetcher.(codex.SessionReadStateClient) + if !ok || id == "" || m.monitorReadBusy || m.meterView != viewMonitor || m.monitorState != monitorRunning || m.monitorError != "" || m.contextTargetHidden() || m.monitorCommands.open || m.monitorQueue.open || m.scheduleUI.open || m.rowContextMode(id) == contextGraph { + return nil + } + for _, row := range m.monitorSessionData { + c := row.preview + if row.id != id || m.hasSessionProfile(row) || !m.monitorSessionVisible(row) || !row.readState.Unread || !row.readState.Known() || c.Kind != codex.SessionContextReply || c.Streaming || c.Text == "" || c.ThreadID != id || c.TurnID == "" { + continue + } + if _, visible := m.monitorResultRect(id); !visible { + return nil + } + if h := m.monitorHistory[id]; h.selected != nil && !sameHistoryTurn(*h.selected, c) { + return nil + } + revision, turn := row.readState.Revision, c.TurnID + m.monitorReadBusy = true + return func() tea.Msg { + ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second) + defer cancel() + state, err := client.AcknowledgeSessionResult(ctx, id, turn, revision) + return monitorReadResult{id: id, revision: revision, state: state, err: err} + } + } + return nil +} + +// Match the actual displayed context pane, including narrow split layouts +// which render only a graph. Graphs, controls and off-page rows are not reviews. +func (m Model) monitorResultRect(id string) (monitorRect, bool) { + g := m.monitorDashboardLayout() + if m.monitorContextDetail != "" { + if m.monitorContextDetail != id || m.contextTargetHidden() { + return monitorRect{}, false + } + controls := m.layoutDetailControls(g.contentWidth, g.meterHeight) + rows, _, _ := m.detailBodyLayout(g.contentWidth, g.meterHeight, controls.rows) + rect := monitorRect{x: 4, y: g.meterY + 2, width: g.contentWidth - 4, height: rows} + return rect, rect.width > 0 && rect.height > 0 + } + for _, pane := range m.monitorPartialContextPanes() { + if pane.session.id == id { + r := pane.frame + rect := monitorRect{x: r.x + 4, y: g.meterY + r.y + 2, width: r.width - 4, height: r.height - 4} + return rect, rect.width > 0 && rect.height > 0 + } + } + + return monitorRect{}, false +} diff --git a/internal/ui/monitor_read_test.go b/internal/ui/monitor_read_test.go new file mode 100644 index 00000000..b0f91cb2 --- /dev/null +++ b/internal/ui/monitor_read_test.go @@ -0,0 +1,126 @@ +package ui + +import ( + "context" + "strings" + "testing" + "time" + + tea "charm.land/bubbletea/v2" + "github.com/merefield/codexometer/internal/codex" +) + +type readTestClient struct { + approvalTestClient + reads []string +} + +func (c *readTestClient) AcknowledgeSessionResult(_ context.Context, id, turn, revision string) (codex.SessionReadState, error) { + c.reads = append(c.reads, id+"/"+turn+"/"+revision) + return codex.SessionReadState{Revision: revision + "-read"}, nil +} +func unreadTestModel() (Model, *readTestClient) { + m := contextTestModel() + client := &readTestClient{} + m.fetcher = client + m.monitorSelectedID = "root-one" + m.setRowContext("root-one", contextGraph) + row := &m.monitorSessionData[0] + row.working = false + row.attention = codex.SessionAttentionComplete + row.preview.TurnID = "t1" + row.readState = codex.SessionReadState{Revision: "v1", Unread: true} + return m, client +} + +func TestUnreadPartialDetailAcknowledgesOnlyExplicitReview(t *testing.T) { + m, c := unreadTestModel() + m.render() + if len(c.reads) != 0 { + t.Fatal("render marked result read") + } + // Selection alone, automatic arrival and geometry restoration do not review. + m.setRowContext("root-one", contextSplit) + next, _ := m.Update(tea.WindowSizeMsg{Width: 120, Height: 40}) + m = next.(Model) + if m.monitorReadBusy || len(c.reads) != 0 { + t.Fatal("restored layout marked result read") + } + m.setRowContext("root-one", contextGraph) + next, cmd := m.Update(tea.KeyPressMsg{Code: tea.KeyRight}) + m = next.(Model) + if cmd == nil || m.rowContextMode("root-one") != contextSplit { + t.Fatal("opening partial detail did not stage receipt") + } + if len(c.reads) != 0 { + t.Fatal("receipt sent before command dispatch") + } + result := cmd().(monitorReadResult) + if len(c.reads) != 1 || c.reads[0] != "root-one/t1/v1" { + t.Fatal("wrong viewed result", c.reads) + } + next, _ = m.Update(result) + m = next.(Model) + if m.monitorSessionData[0].readState.Unread { + t.Fatal("successful review still unread") + } + for _, item := range m.monitorAttentionSessions() { + if item.id == "root-one" { + t.Fatal("read completion retained its attention pill") + } + } + if !strings.Contains(m.renderMonitorSessionBadge(m.monitorSessionData[0], 70, paletteFor(themeHacker)), "TURN COMPLETE") { + t.Fatal("read acknowledgement erased completion status") + } + // Another client's new receipt must survive a late acknowledgement response. + m.monitorSessionData[0].readState = codex.SessionReadState{Revision: "v2", Unread: true} + next, _ = m.Update(result) + if next.(Model).monitorSessionData[0].readState.Revision != "v2" { + t.Fatal("late response cleared newer result") + } +} + +func TestUnreadHistoryAndUnavailableContextCannotAcknowledgeLatest(t *testing.T) { + for _, mode := range []string{"older-history", "streaming", "child", "no-text", "stale", "unsupported"} { + t.Run(mode, func(t *testing.T) { + m, c := unreadTestModel() + m.setRowContext("root-one", contextFull) + switch mode { + case "older-history": + old := m.monitorSessionData[0].preview + old.TurnID = "older" + m.saveMonitorHistory("root-one", monitorTurnHistory{selected: &old}) + case "streaming": + m.monitorSessionData[0].preview.Streaming = true + case "child": + m.monitorSessionData[0].preview.ThreadID = "child" + case "no-text": + m.monitorSessionData[0].preview.Text = "" + case "stale": + m.monitorError = "disconnected" + case "unsupported": + m.monitorSessionData[0].readState = codex.SessionReadState{} + } + m.monitorReadIntent = "root-one" + if cmd := m.acknowledgeMonitorResult(); cmd != nil || len(c.reads) != 0 { + t.Fatal("unviewed result acknowledged") + } + }) + } +} + +func TestReadReceiptSurvivesMonitorStartAndSessionUpdates(t *testing.T) { + m, _ := unreadTestModel() + observed := codex.LiveUsageSession{ID: "root-one", Active: true, ReadState: codex.SessionReadState{Revision: "already-read"}, Attention: codex.SessionAttentionComplete} + usage := codex.LiveUsageSnapshot{Sessions: []codex.LiveUsageSession{observed}} + m.startMonitorSessions(usage, time.Now()) + if m.monitorSessionData[0].readState != observed.ReadState { + t.Fatal("startup discarded saved read receipt") + } + observed.ReadState = codex.SessionReadState{Revision: "new", Unread: true} + usage.Sessions[0] = observed + m.syncMonitorSessions(usage, time.Now()) + if m.monitorSessionData[0].readState != observed.ReadState { + t.Fatal("later activity did not restore unread result") + } +} diff --git a/internal/ui/monitor_summary.go b/internal/ui/monitor_summary.go index 2770838b..ac25b981 100644 --- a/internal/ui/monitor_summary.go +++ b/internal/ui/monitor_summary.go @@ -106,7 +106,7 @@ func (m *Model) monitorAttentionSessions() []monitorAttentionItem { case codex.SessionAttentionError: groups[2] = append(groups[2], item) case codex.SessionAttentionComplete: - if !s.working && !profile && !scheduled { + if !s.working && !profile && !scheduled && (!s.readState.Known() || s.readState.Unread) { groups[4] = append(groups[4], item) } } @@ -197,6 +197,9 @@ func (m *Model) openMonitorAttention(action string) { if item.action() != action { continue } + if !item.profile && !item.trigger { + m.monitorReadIntent = item.id + } review := "context" if item.profile { review = "profile" diff --git a/internal/web/control.go b/internal/web/control.go index 8db868f9..c0425f8e 100644 --- a/internal/web/control.go +++ b/internal/web/control.go @@ -23,16 +23,17 @@ import ( // binds the browser's selection to the exact source request without disclosing // Codex tokens. One pending confirmation bounds memory (including secret input). type control struct { - commands codex.SessionCommandsClient - schedules *schedule.Queue - profiles *profileControl - mu sync.Mutex - store *store - approvals codex.SessionApprovalClient - prompts codex.SessionPromptClient - key string - pending *preparedAction - expiry *time.Timer + readReceipts codex.SessionReadStateClient + commands codex.SessionCommandsClient + schedules *schedule.Queue + profiles *profileControl + mu sync.Mutex + store *store + approvals codex.SessionApprovalClient + prompts codex.SessionPromptClient + key string + pending *preparedAction + expiry *time.Timer } type actionChoice struct { @@ -73,17 +74,18 @@ type offeredAction struct { } type actionRequest struct { - Command *commandRequest `json:"command,omitempty"` - EditID string `json:"editId,omitempty"` - SendID string `json:"sendId,omitempty"` - Schedule *scheduleRule `json:"schedule,omitempty"` - CancelID string `json:"cancelId,omitempty"` - Review string `json:"review,omitempty"` - Session string `json:"session"` - Offer string `json:"offer"` - Choice *int `json:"choice,omitempty"` - Answers []string `json:"answers,omitempty"` - Confirmation string `json:"confirmation,omitempty"` + Read *resultReadRequest `json:"read,omitempty"` + Command *commandRequest `json:"command,omitempty"` + EditID string `json:"editId,omitempty"` + SendID string `json:"sendId,omitempty"` + Schedule *scheduleRule `json:"schedule,omitempty"` + CancelID string `json:"cancelId,omitempty"` + Review string `json:"review,omitempty"` + Session string `json:"session"` + Offer string `json:"offer"` + Choice *int `json:"choice,omitempty"` + Answers []string `json:"answers,omitempty"` + Confirmation string `json:"confirmation,omitempty"` } type preparedAction struct { @@ -98,6 +100,7 @@ func newControl(source Source, store *store) *control { c.approvals, _ = source.(codex.SessionApprovalClient) c.prompts, _ = source.(codex.SessionPromptClient) c.commands, _ = source.(codex.SessionCommandsClient) + c.readReceipts, _ = source.(codex.SessionReadStateClient) c.profiles = newProfileControl(source) return c } @@ -226,18 +229,24 @@ func (c *control) handle(action, origin string) http.HandlerFunc { http.Error(w, "Invalid request", 400) return } - if action == "commands" { - c.handleCommands(w, r, body) - return - } - if body.Command != nil { + if body.Read != nil && action != "read" || body.Command != nil && action != "commands" { http.Error(w, "Invalid request", 400) return } - if action == "schedules" { - c.handleSchedules(w, r, body) + var specialized func(http.ResponseWriter, *http.Request, actionRequest) + switch action { + case "read": + specialized = c.handleReadResult + case "commands": + specialized = c.handleCommands + case "schedules": + specialized = c.handleSchedules + } + if specialized != nil { + specialized(w, r, body) return } + c.mu.Lock() if c.pending != nil && !time.Now().Before(c.pending.until) { c.pending = nil diff --git a/internal/web/control_read.go b/internal/web/control_read.go new file mode 100644 index 00000000..1e22aca7 --- /dev/null +++ b/internal/web/control_read.go @@ -0,0 +1,57 @@ +package web + +import ( + "context" + "encoding/json" + "net/http" + "time" +) + +type resultReadRequest struct { + Turn string `json:"turn"` + Revision string `json:"revision"` +} + +func (q *resultReadRequest) valid() bool { + return q != nil && q.Turn != "" && len(q.Turn) <= 512 && q.Revision != "" && len(q.Revision) <= 2048 +} + +func (c *control) handleReadResult(w http.ResponseWriter, r *http.Request, body actionRequest) { + viewed := body.Read + if c.readReceipts == nil || !viewed.valid() { + http.Error(w, "Result read state unavailable", 409) + return + } + c.store.mu.Lock() + age := time.Since(c.store.state.SessionsAt) + fresh := !c.store.state.SessionsError && age >= 0 && age < 10*time.Second + eligible := false + for _, row := range c.store.state.Sessions { + if row.ID == body.Session && row.Unread && row.ReadStateKnown && row.ReadRevision == viewed.Revision && row.ReplyTurn == viewed.Turn { + eligible = true + } + } + c.store.mu.Unlock() + if !fresh || !eligible { + http.Error(w, "Result changed; review it again", 409) + return + } + ctx, cancel := context.WithTimeout(r.Context(), 4*time.Second) + defer cancel() + state, err := c.readReceipts.AcknowledgeSessionResult(ctx, body.Session, viewed.Turn, viewed.Revision) + if err != nil || !state.Known() || state.Unread { + http.Error(w, "Result changed or could not be marked read; review it again", 409) + return + } + c.store.mu.Lock() + for i := range c.store.state.Sessions { + row := &c.store.state.Sessions[i] + if row.ID == body.Session && row.ReadRevision == viewed.Revision { + row.ReadStateKnown, row.Unread, row.ReadRevision = state.Known(), state.Unread, state.Revision + } + } + c.store.publish() + c.store.mu.Unlock() + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(map[string]bool{"read": state.Known() && !state.Unread}) +} diff --git a/internal/web/control_read_test.go b/internal/web/control_read_test.go new file mode 100644 index 00000000..0ac2c6fc --- /dev/null +++ b/internal/web/control_read_test.go @@ -0,0 +1,68 @@ +package web + +import ( + "context" + "testing" + "time" + + "github.com/merefield/codexometer/internal/codex" +) + +type readSource struct { + cancelledSource + calls int + revision, turn string +} + +func (s *readSource) AcknowledgeSessionResult(_ context.Context, id, turn, revision string) (codex.SessionReadState, error) { + s.calls++ + s.revision = revision + s.turn = turn + return codex.SessionReadState{Revision: "v1-read"}, nil +} + +func TestBrowserReadReceiptRequiresWritableFreshMatchingResult(t *testing.T) { + for _, mode := range []string{"valid", "read-only", "stale", "old-revision", "old-turn", "child", "no-auth"} { + t.Run(mode, func(t *testing.T) { + s := testServer() + f := &readSource{} + s.control = newControl(f, s.store) + s.store.state.Control = true + row := codex.LiveUsageSession{ID: "root", ReadState: codex.SessionReadState{Revision: "v1", Unread: true}, Attention: codex.SessionAttentionComplete, Context: codex.SessionContext{ThreadID: "root", TurnID: "t1", Kind: codex.SessionContextReply, Text: "Finished"}} + now := time.Now() + if mode == "stale" { + now = now.Add(-time.Minute) + } + if mode == "child" { + row.Context.ThreadID = "child" + } + s.store.live(codex.LiveUsageSnapshot{Sessions: []codex.LiveUsageSession{row}}, nil, now) + token := pairBrowser(t, s) + body := actionRequest{Session: "root", Read: &resultReadRequest{Turn: "t1", Revision: "v1"}} + switch mode { + case "read-only": + s.control = nil + case "old-revision": + body.Read.Revision = "old" + case "old-turn": + body.Read.Turn = "old" + case "no-auth": + token = "" + } + w := actionCall(s, token, "read", body) + if mode == "valid" { + if w.Code != 200 || f.calls != 1 || f.revision != "v1" || f.turn != "t1" { + t.Fatal("valid receipt rejected", w.Code, w.Body, f) + } + if s.store.state.Sessions[0].Unread { + t.Fatal("read completion still highlighted") + } + if w = actionCall(s, token, "read", body); w.Code != 409 || f.calls != 1 { + t.Fatal("old receipt replayed") + } + } else if w.Code == 200 || f.calls != 0 { + t.Fatal("unseen result acknowledged", w.Code, f.calls) + } + }) + } +} diff --git a/internal/web/dist/assets/index-CJs9l6nA.js b/internal/web/dist/assets/index-CJs9l6nA.js deleted file mode 100644 index b446b90f..00000000 --- a/internal/web/dist/assets/index-CJs9l6nA.js +++ /dev/null @@ -1,50 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible;function d(e){return typeof e==`function`}var f=()=>{};function p(e){return e()}function m(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function g(e,t,n=!1){return e===void 0?n?t():t:e}function _(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var v=1024,y=2048,b=4096,x=8192,S=16384,C=32768,w=1<<25,T=65536,E=1<<19,D=1<<20,ee=1<<25,te=1<<21,O=1<<22,ne=1<<23,k=Symbol(`$state`),re=Symbol(`component`),ie=Symbol(`legacy props`),ae=Symbol(``),oe=Symbol(`attributes`),se=Symbol(`class`),A=Symbol(`style`),ce=Symbol(`text`),le=Symbol(`form reset`),ue=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},de=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`),fe={},j=Symbol(`uninitialized`),pe=`http://www.w3.org/1999/xhtml`;function me(){console.warn(`https://svelte.dev/e/derived_inert`)}function he(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function ge(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function _e(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var M=!1;function ve(e){M=e}var N;function ye(e){if(e===null)throw he(),fe;return N=e}function be(){return ye(on(N))}function P(e){if(M){if(on(N)!==null)throw he(),fe;N=e}}function xe(e=1){if(M){for(var t=e,n=N;t--;)n=on(n);N=n}}function Se(e=!0){for(var t=0,n=N;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=on(n);e&&n.remove(),n=i}}function Ce(e){if(!e||e.nodeType!==8)throw he(),fe;return e.data}function we(e){return e===this.v}function Te(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Ee(e){return!Te(e,this.v)}function De(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function Oe(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function ke(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ae(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function je(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Me(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Ne(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Pe(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Fe(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ie(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Le(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Re(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var ze=!1;function Be(){ze=!0}var Ve=null;function He(e){Ve=e}function Ue(e,t=!1,n){Ve={p:Ve,i:!1,c:null,e:null,s:e,x:null,r:G,l:ze&&!t?{s:null,u:null,$:[]}:null}}function We(e){var t=Ve,n=t.e;if(n!==null){t.e=null;for(var r of n)yn(r)}return e!==void 0&&(t.x=e),t.i=!0,Ve=t.p,Ge(e)}function Ge(e={}){return i(e,re,{value:!0}),e}function Ke(){return!ze||Ve!==null&&Ve.l===null}var qe=[];function Je(){var e=qe;qe=[],m(e)}function Ye(e){if(qe.length===0&&!Ct){var t=qe;queueMicrotask(()=>{t===qe&&Je()})}qe.push(e)}function Xe(){for(;qe.length>0;)Je()}var Ze=~(y|b|v);function Qe(e,t){e.f=e.f&Ze|t}function $e(e){e.f&512||e.deps===null?Qe(e,v):Qe(e,b)}function et(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),Qe(e,v)}function tt(e){M&&an(e)!==null&&sn(e)}var nt=!1;function rt(){nt||(nt=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[le]?.()})},{capture:!0}))}function it(e){var t=W,n=G;Un(null),Wn(null);try{return e()}finally{Un(t),Wn(n)}}function at(e,t,n,r=n){e.addEventListener(t,()=>it(n));let i=e[le];e[le]=i?()=>{i(),r(!0)}:()=>r(!0),rt()}function ot(e,t,n,r){let i=Ke()?ut:pt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=G,c=st(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){fn(e,s)}ct()}}var d=lt();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>ft(e))).then(u).catch(e=>fn(e,s)).finally(d)}l?l.then(()=>{c(),f(),ct()}):f()}function st(){var e=G,t=W,n=Ve,r=I;return function(i=!0){Wn(e),Un(t),He(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function ct(e=!0){Wn(null),Un(null),He(null),e&&I?.deactivate()}function lt(){var e=G,t=e.b,n=I,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function ut(e){var t=2|y;return G!==null&&(G.f|=E),{ctx:Ve,deps:null,effects:null,equals:we,f:t,fn:e,reactions:null,rv:0,v:j,wv:0,parent:G,ac:null}}var dt=Symbol(`obsolete`);function ft(e,t,n){let r=G;r===null&&Oe();var i=void 0,a=Bt(j),o=!W,s=new Set;return Cn(()=>{var t=G,n=h();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==ue&&n.reject(e)}).finally(ct)}catch(e){n.reject(e),ct()}var c=I;if(o){if(t.f&32768)var l=lt();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(dt);else for(let e of s.values())e.reject(dt);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==dt&&(c.activate(),t?(a.f|=ne,Wt(a,t)):(a.f&8388608&&(a.f^=ne),Wt(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),_n(()=>{for(let e of s)e.reject(dt)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function F(e){let t=ut(e);return Kn(t),t}function pt(e){let t=ut(e);return t.equals=Ee,t}function mt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(ue),t.ac=null}),t.fn!==null&&(t.teardown=f),sr(t,0),On(t))}function vt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&cr(t)}var yt=null,I=null,bt=null,xt=null,St=null,Ct=!1,wt=!1,Tt=null,Et=null,Dt=0,Ot=1,kt=class e{id=Ot++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){yt===null?yt=this:(yt.#n=this,this.#t=yt),yt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)Qe(r,y),t(r);for(r of n.m)Qe(r,b),t(r)}this.#p.add(e)}#g(){var e=[];for(let i of this.#c)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=v}}n||e.push(t)}return this.#c=[],e}#_(){this.#e=!0;for(let e of this.#u)this.#d.delete(e),Qe(e,y),this.schedule(e);for(let e of this.#d)Qe(e,b),this.schedule(e);this.apply();for(var t=Tt=[],n=[],r=Et=[];this.#c.length>0;){Dt++>1e3&&(this.#S(),jt());for(let e of this.#g())try{this.#v(e,t,n)}catch(t){throw It(e),this.#h()||this.discard(),t}}if(I=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(Tt=null,Et=null,this.#h()){this.#x(n),this.#x(t);for(let[e,t]of this.#f)Ft(e,t);r.length>0&&I.#_();return}let a=this.#y();if(a)this.#x(n),this.#x(t),a.#b(this);else{this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),bt=this,Nt(n),Nt(t),bt=null,this.#s?.resolve();var o=I;if(this.#a===0&&(this.#c.length===0||o!==null)&&this.#S(),this.#c.length>0){if(o!==null){for(let e of this.#c)o.#c.push(e);this.#c=[]}else o=this}o!==null&&(Rt.clear(),o.#_())}}#v(e,t,n){e.f^=v;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=v:i&4?t.push(r):nr(r)&&(i&16&&this.#d.add(r),cr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),Qe(i,y),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),I=this,this.#_()}#x(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=h()).promise}static ensure(){if(I===null){let t=I=new e;!wt&&!Ct&&Ye(()=>{t.#e||t.flush()})}return I}apply(){xt=null}schedule(e){St=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)?e.b.defer_effect(e):this.#c.push(e)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?yt=e:t.#t=e,this.linked=!1}}};function At(e){var t=Ct;Ct=!0;try{var n;for(e&&(I!==null&&!I.is_fork&&I.flush(),n=e());;){if(Xe(),I===null)return n;I.flush()}}finally{Ct=t}}function jt(){try{Ne()}catch(e){fn(e,St)}}var Mt=null;function Nt(e){var t=e.length;if(t!==0){for(var n=0;n0)){Rt.clear();for(let e of Mt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Mt.has(n)&&(Mt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||cr(n)}}Mt.clear()}}Mt=null}}function Pt(e){I.schedule(e)}function Ft(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),Qe(e,v);for(var n=e.first;n!==null;)Ft(n,t),n=n.next}}function It(e){Qe(e,v);for(var t=e.first;t!==null;)It(t),t=t.next}var Lt=new Set,Rt=new Map,zt=!1;function Bt(e,t){return{f:0,v:e,reactions:null,equals:we,rv:0,wv:0}}function L(e,t){let n=Bt(e,t);return Kn(n),n}function Vt(e,t=!1,n=!0){let r=Bt(e);return t||(r.equals=Ee),ze&&n&&Ve!==null&&Ve.l!==null&&(Ve.l.s??=[]).push(r),r}function R(e,t,n=!1){return W!==null&&(!Hn||W.f&131072)&&Ke()&&W.f&4325394&&(Gn===null||!Gn.has(e))&&Le(),Wt(e,n?Yt(t):t,Et)}var Ht=null,Ut=0;function Wt(e,t,n=null){if(!e.equals(t)){Bn?Rt.set(e,t):Rt.has(e)||Rt.set(e,e.v);var r=kt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&ht(t),xt===null&&$e(t)}e.wv=tr(),Ht=null,Ut=0,Jt(e,y,n),Ht=null,Ke()&&G!==null&&G.f&1024&&!(G.f&96)&&(Yn===null?Xn([e]):Yn.push(e)),!r.is_fork&&Lt.size>0&&!zt&&Gt()}return t}function Gt(){zt=!1;for(let e of Lt){e.f&1024&&Qe(e,b);let t;try{t=nr(e)}catch{t=!0}t&&cr(e)}Lt.clear()}function Kt(e,t=1){var n=K(e),r=t===1?n++:n--;return R(e,n),r}function qt(e){R(e,e.v+1)}function Jt(e,t,n){var r=e.reactions;if(r!==null){var i=Ke(),a=r.length;if(Ut+=a,Ut>1e5&&Ht===null&&(Ht=new Set),Ht!==null){if(Ht.has(e))return;Ht.add(e)}for(var o=0;o{if($n===d)return e();var t=W,n=$n;Un(null),er(d);var r=e();return Un(t),er(n),r};return i&&r.set(`length`,L(t.length,u)),new Proxy(t,{defineProperty(e,t,n){`value`in n&&n.configurable!==!1&&n.enumerable!==!1&&n.writable!==!1||Fe();var i=r.get(t);return i===void 0?f(()=>{var e=L(n.value,u);return r.set(t,e),e}):R(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>L(j,u));r.set(t,e),qt(o)}}else R(n,j),qt(o);return!0},get(e,n,i){if(n===k)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>L(Yt(s?e[n]:j),u)),r.set(n,o)),o!==void 0){var c=K(o);return c===j?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var n=Reflect.getOwnPropertyDescriptor(e,t),i=r.get(t);if(i!==void 0){var a=K(i);if(a===j)return;if(n&&`value`in n)n.value=a;else return{enumerable:!0,configurable:!0,value:a,writable:!0}}return n},has(e,t){if(t===k)return!0;var n=r.get(t),i=n!==void 0&&n.v!==j||Reflect.has(e,t);return(n!==void 0||G!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>L(i?Yt(e[t]):j,u)),r.set(t,n)),K(n)===j)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;dL(j,u)),r.set(d+``,p)):R(p,j)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>L(void 0,u)),R(c,Yt(n)),r.set(t,c));else{l=c.v!==j;var m=f(()=>Yt(n));R(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&R(g,_+1)}qt(o)}return!0},ownKeys(e){K(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==j});for(var[n,i]of r)i.v!==j&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Ie()}})}function Xt(e){try{if(typeof e==`object`&&e&&k in e)return e[k]}catch{}return e}function Zt(e,t){return Object.is(Xt(e),Xt(t))}var Qt,$t,en,tn;function nn(){if(Qt===void 0){Qt=window,$t=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;en=a(t,`firstChild`).get,tn=a(t,`nextSibling`).get,u(e)&&(e[se]=void 0,e[oe]=null,e[A]=void 0,e.__e=void 0),u(n)&&(n[ce]=void 0)}}function rn(e=``){return document.createTextNode(e)}function an(e){return en.call(e)}function on(e){return tn.call(e)}function z(e,t){if(!M)return an(e);var n=an(N);if(n===null)n=N.appendChild(rn());else if(t&&n.nodeType!==3){var r=rn();return n?.before(r),ye(r),r}return t&&un(n),ye(n),n}function B(e,t=!1){if(!M){var n=an(e);return n instanceof Comment&&n.data===``?on(n):n}if(t){if(N?.nodeType!==3){var r=rn();return N?.before(r),ye(r),r}un(N)}return N}function V(e,t=!1){if(!M)return an(e);var n=z(e,t);return P(e),n}function H(e,t=1,n=!1){let r=M?N:e;for(var i;t--;)i=r,r=on(r);if(!M)return r;if(n){if(r?.nodeType!==3){var a=rn();return r===null?i?.after(a):r.before(a),ye(a),a}un(r)}return ye(r),r}function sn(e){e.textContent=``}function cn(){return!1}function ln(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function un(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function dn(e){var t=G;if(t===null)return W.f|=ne,e;if(!(t.f&32768)&&!(t.f&4))throw e;fn(e,t)}function fn(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function pn(e){G===null&&(W===null&&Me(e),je()),Bn&&Ae(e)}function mn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function hn(e,t){var n=G;n!==null&&n.f&8192&&(e|=x);var r={ctx:Ve,deps:null,nodes:null,f:e|y|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};I?.register_created_effect(r);var i=r;if(e&4)Tt===null?kt.ensure().schedule(r):Tt.push(r);else if(t!==null){try{cr(r)}catch(e){throw An(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=T))}if(i!==null&&(i.parent=n,n!==null&&mn(i,n),W!==null&&W.f&2&&!(e&64))){var a=W;(a.effects??=[]).push(i)}return r}function gn(){return W!==null&&!Hn}function _n(e){let t=hn(8,null);return Qe(t,v),t.teardown=e,t}function vn(e){pn(`$effect`);var t=G.f;if(!W&&t&32&&Ve!==null&&!Ve.i){var n=Ve;(n.e??=[]).push(e)}else return yn(e)}function yn(e){return hn(4|D,e)}function bn(e){return pn(`$effect.pre`),hn(8|D,e)}function xn(e){kt.ensure();let t=hn(64|E,e);return(e={})=>new Promise(n=>{e.outro?Nn(t,()=>{An(t),n(void 0)}):(An(t),n(void 0))})}function Sn(e){return hn(4,e)}function Cn(e){return hn(O|E,e)}function wn(e,t=0){return hn(8|t,e)}function U(e,t=[],n=[],r=[]){ot(r,t,n,t=>{hn(8,()=>{e(...t.map(K))})})}function Tn(e,t=0){return hn(16|t,e)}function En(e){return hn(32|E,e)}function Dn(e){var t=e.teardown;if(t!==null){let n=Bn,r=W;Vn(!0),Un(null);try{t.call(null)}catch(t){fn(t,e.parent)}finally{Vn(n),Un(r)}}}function On(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&it(()=>{e.abort(ue)});var r=n.next;n.f&64?n.parent=null:An(n,t),n=r}}function kn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||An(t),t=n}}function An(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(jn(e.nodes.start,e.nodes.end),n=!0),e.f|=w,On(e,t&&!n),sr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();Dn(e),e.f^=w,e.f|=S;var i=e.parent;i!==null&&i.first!==null&&Mn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function jn(e,t){for(;e!==null;){var n=e===t?null:on(e);e.remove(),e=n}}function Mn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Nn(e,t,n=!0){var r=[];e.f|=256,Pn(e,r,!0);var i=()=>{n&&An(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Pn(e,t,n){if(!(e.f&8192)){e.f^=x;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);Pn(i,t,o?n:!1)}i=a}}}function Fn(e){e.f&=-257,In(e,!0)}function In(e,t){if(!(e.f&256)&&e.f&8192){e.f^=x,e.f&1024||(Qe(e,y),kt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);In(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Ln(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:on(n);t.append(n),n=i}}var Rn=null,zn=!1,Bn=!1;function Vn(e){Bn=e}var W=null,Hn=!1;function Un(e){W=e}var G=null;function Wn(e){G=e}var Gn=null;function Kn(e){W!==null&&(W.f&2097152||W.f&2)&&(Gn??=new Set).add(e)}var qn=null,Jn=0,Yn=null;function Xn(e){Yn=e}var Zn=1,Qn=0,$n=Qn;function er(e){$n=e}function tr(){return++Zn}function nr(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&xt===null&&Qe(e,v)}return!1}function rr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(Gn!==null&&Gn.has(e)))for(var i=0;i{e.ac.abort(ue)}),e.ac=null);try{e.f|=te;var u=e.fn,d=u();e.f|=C;var f=ar(e);if(Ke()&&Yn!==null&&!Hn&&f!==null&&!(e.f&6146))for(var p=0;p0)for(t.length=Jn+qn.length,r=0;r{s.ac.abort(ue),s.ac=null,Qe(s,y)}),_t(s),sr(s,0)}}function sr(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,Ye(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function xr(e,t,n,r,i){var a={capture:r,passive:i},o=br(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&_n(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function q(e,t,n){(t[_r]??={})[e]=n}function Sr(e){for(var t=0;t{wr=!1,Cr=null}));var s=0,c=Cr===e&&e[_r];if(c){var l=a.indexOf(c);if(l!==-1&&(t===document||t===window)){e[_r]=t;return}var u=a.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(o=a[s]||e.target,o!==t){i(e,`currentTarget`,{configurable:!0,get(){return o||n}});var d=W,f=G;Un(null),Wn(null);try{for(var p,m=[];o!==null&&o!==t;){try{var h=o[_r]?.[r];h==null||o.disabled&&e.target!==o||h.call(o,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;s++,o=s{throw e});throw p}}finally{e[_r]=t,delete e.currentTarget,Un(d),Wn(f)}}}var Er=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function Dr(e){return Er?.createHTML(e)??e}function Or(e){var t=ln(`template`);return t.innerHTML=Dr(e.replaceAll(``,``)),t.content}function kr(e,t){var n=G;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function J(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(``);return()=>{if(M)return kr(N,null),N;i===void 0&&(i=Or(a?e:``+e),n||(i=an(i)));var t=r||$t?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=an(t),s=t.lastChild;kr(o,s)}else kr(t,t);return t}}function Ar(e,t,n=`svg`){var r=!e.startsWith(``),i=!!(t&1),a=`<${n}>${r?e:``+e}`,o;return()=>{if(M)return kr(N,null),N;if(!o){var e=an(Or(a));if(i)for(o=document.createDocumentFragment();an(e);)o.appendChild(an(e));else o=an(e)}var t=o.cloneNode(!0);if(i){var n=an(t),r=t.lastChild;kr(n,r)}else kr(t,t);return t}}function jr(e,t){return Ar(e,t,`svg`)}function Mr(e=``){if(!M){var t=rn(e+``);return kr(t,t),t}var n=N;return n.nodeType===3?un(n):(n.before(n=rn()),ye(n)),kr(n,n),n}function Nr(){if(M)return kr(N,null),N;var e=document.createDocumentFragment(),t=document.createComment(``),n=rn();return e.append(t,n),kr(t,n),e}function Y(e,t){if(M){var n=G;n.f&32768&&n.nodes.end!==null||(n.nodes.end=N),be()}else e!==null&&e.before(t)}function Pr(){if(M&&N&&N.nodeType===8&&N.textContent?.startsWith(`$`)){let e=N.textContent.substring(1);return be(),e}return(window.__svelte??={}).uid??=1,`c${window.__svelte.uid++}`}function Fr(e){let t=0,n=Bt(0),r;return()=>{gn()&&(K(n),wn(()=>(t===0&&(r=fr(()=>e(()=>qt(n)))),t+=1,()=>{Ye(()=>{--t,t===0&&(r?.(),r=void 0,qt(n))})})))}}var Ir=T|E;function Lr(e,t,n,r){new Rr(e,t,n,r)}var Rr=class{parent;is_pending=!1;transform_error;#e;#t=M?N:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=Fr(()=>(this.#m=Bt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=G;t.b=this,t.f|=128,n(e)},this.parent=G.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=Tn(()=>{if(M){let e=this.#t;be();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#y():this.#g()}else this.#b()},Ir),M&&(this.#e=N)}#g(){try{this.#a=En(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#v(e);Ye(r),t&&(this.#s=En(()=>{t(this.#e,()=>e,()=>n)}))}#v(e){var t=!1,n=!1;let r=()=>{t?_e():(t=!0,n&&Re(),this.#s!==null&&Nn(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()}))};return{reset:r,invoke_onerror:()=>{try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){fn(e,this.#i&&this.#i.parent)}}}}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=En(()=>e(this.#e)),Ye(()=>{var e=this.#c=document.createDocumentFragment(),t=rn(),n=!1;e.append(t),this.#a=this.#S(()=>{try{return En(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){fn(e,this.#i.parent)}return null}}),this.#a===null?(this.#c=null,n&&this.#x(I)):this.#u===0&&(this.#e.before(e),this.#c=null,Nn(this.#o,()=>{this.#o=null}),this.#x(I))}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=En(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Ln(this.#a,e);let t=this.#n.pending;this.#o=En(()=>t(this.#e))}else this.#x(I)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){et(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=G,n=W,r=Ve;Wn(this.#i),Un(this.#i),He(this.#i.ctx);try{return kt.ensure(),e()}finally{Wn(t),Un(n),He(r)}}#C(e,t){this.has_pending_snippet()?(this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&Nn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))):this.parent&&this.parent.#C(e,t)}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,Ye(()=>{this.#d=!1,this.#m&&Wt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),K(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;I?.is_fork?(this.#a&&I.skip_effect(this.#a),this.#o&&I.skip_effect(this.#o),this.#s&&I.skip_effect(this.#s),I.oncommit(()=>{this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(An(this.#a),null),this.#o&&=(An(this.#o),null),this.#s&&=(An(this.#s),null),M&&(ye(this.#t),xe(),ye(Se()));let t=this.#n.failed,n=e=>{let{reset:n,invoke_onerror:r}=this.#v(e);r(),t&&(this.#s=this.#S(()=>{try{return En(()=>{var r=G;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return fn(e,this.#i.parent),null}}))};Ye(()=>{var t;try{t=this.transform_error(e)}catch(e){fn(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>fn(e,this.#i&&this.#i.parent)):n(t)})}};function X(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ce]??=e.nodeValue)&&(e[ce]=n,e.nodeValue=`${n}`)}function zr(e,t){return Vr(e,t)}var Br=new Map;function Vr(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){nn();var l=void 0,u=xn(()=>{var s=n??t.appendChild(rn());Lr(s,{pending:()=>{}},t=>{Ue({});var n=Ve;if(o&&(n.c=o),a&&(i.$$events=a),M&&kr(t,null),l=e(t,i)||Ge(),M&&(G.nodes.end=N,N===null||N.nodeType!==8||N.data!==`]`))throw he(),fe;We()},c);var u=new Set,d=e=>{for(var n=0;n{for(var e of u)for(let n of[t,document]){var r=Br.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,Tr),r.delete(e),r.size===0&&Br.delete(n)):r.set(e,i)}yr.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return Hr.set(l,u),l}var Hr=new WeakMap,Ur=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)Fn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(Fn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(An(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Ln(r,t),t.append(rn()),this.#n.set(e,{effect:r,fragment:t})}else An(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Nn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(An(n.effect),this.#n.delete(e))};ensure(e,t){var n=I,r=cn();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=rn();i.append(a),this.#n.set(e,{effect:En(()=>t(a)),fragment:i})}else this.#t.set(e,En(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else M&&(this.anchor=N),this.#a(n)}};function Z(e,t,n=!1){var r;M&&(r=N,be());var i=new Ur(e),a=n?T:0;function o(e,t){if(M){var n=Ce(r);if(e!==parseInt(n.substring(1))){var a=Se();ye(a),i.anchor=a,ve(!1),i.ensure(e,t),ve(!0);return}}i.ensure(e,t)}Tn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}var Wr=Symbol(`NaN`);function Gr(e,t,n){M&&be();var r=new Ur(e),i=!Ke();Tn(()=>{var e=t();e!==e&&(e=Wr),i&&typeof e==`object`&&e&&(e={}),r.ensure(e,n)})}function Kr(e,t){return t}function qr(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Jr(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;sn(d),d.append(u),e.items.clear()}Jr(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Jr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Qr(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=ee,ei(d,null,c)):Fn(d):Nn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:Tn(()=>{p=K(f);var e=p.length;let t=!1;M&&Ce(c)===`[!`!=(e===0)&&(c=Se(),ye(c),ve(!1),t=!0);for(var r=new Set,u=I,v=cn(),y=0;ys(c)):(d=En(()=>s(Yr??=rn())),d.f|=ee)),e>r.size&&ke(``,``,``),M&&e>0&&ye(Se()),!h){if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u)}t&&ve(!0),K(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,M&&(c=N)}function Zr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Qr(e,t,n,i,a){var o=!!(i&8),s=t.length,c=e.items,l=Zr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var E=i&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function $r(e,t,n,r,i,a,o,s){var c=o&1?o&16?Bt(n):Vt(n,!1,!1):null,l=o&2?Bt(i):null;return{v:c,i:l,e:En(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function ei(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=on(r);if(a.before(r),r===i)return;r=o}}function ti(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function ni(e,t,...n){var r=new Ur(e);Tn(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},T)}function ri(e,t,n){var r;M&&(r=N,be());var i=new Ur(e);Tn(()=>{var e=t()??null;if(M&&Ce(r)===`[`!=(e!==null)){var a=Se();ye(a),i.anchor=a,ve(!1),i.ensure(e,e&&(t=>n(t,e))),ve(!0)}else i.ensure(e,e&&(t=>n(t,e)))},T)}var ii=[...` -\r\f\xA0\v`];function ai(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||ii.includes(r[o-1]))&&(s===r.length||ii.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function oi(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function si(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function ci(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\/\*.*?\*\//g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(si)),i&&c.push(...Object.keys(i).map(si));var l=0,u=-1;let t=e.length;for(var d=0;d{t.every(vi)||(`__defaultValue`in e&&pi(e,!1),`__value`in e&&mi(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),_n(()=>{t.disconnect()})}function gi(e,t,n=t){var r=new WeakSet,i=!0;at(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),_i);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&_i(o)}n(a),e.__value=a,I!==null&&r.add(I)}),Sn(()=>{var a=t();if(e===document.activeElement){var o=I;if(r.has(o))return}if(mi(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=_i(s),n(a))}e.__value=a,i=!1})}function _i(e){return`__value`in e?e.__value:e.value}function vi(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var yi=Symbol(`is custom element`),bi=Symbol(`is html`),xi=de?`link`:`LINK`;function Si(e){if(M){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Q(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Q(e,`checked`,null),e.checked=r}}};e[le]=n,Ye(n),rt()}}function Ci(e,t){var n=wi(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Q(e,t,n,r){var i=wi(e);M&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===xi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[ae]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Ei(e).has(t)?e[t]=n:e.setAttribute(t,n))}function wi(e){return e[oe]??={[yi]:e.nodeName.includes(`-`),[bi]:e.namespaceURI===pe}}var Ti=new Map;function Ei(e){var t=e.getAttribute(`is`)||e.nodeName,n=Ti.get(t);if(n)return n;Ti.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.add(s);i=l(i)}return n}function Di(e,t,n=t){var r=new WeakSet;at(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Mi(e)?Ni(a):a,n(a),I!==null&&r.add(I),await lr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(M&&e.defaultValue!==e.value||fr(t)==null&&e.value)&&(n(Mi(e)?Ni(e.value):e.value),I!==null&&r.add(I)),wn(()=>{var n=t();if(e===document.activeElement){var i=I;if(r.has(i))return}Mi(e)&&n===Ni(e.value)||(e.type!==`date`||n||e.value)&&n!==e.value&&(e.value=n??``)})}var Oi=new Set;function ki(e,t,n,r,i=r){var a=n.getAttribute(`type`)===`checkbox`,o=e;let s=!1;if(t!==null)for(var c of t)o=o[c]??=[];o.push(n),at(n,`change`,()=>{var e=n.__value;a&&(e=ji(o,e,n.checked)),i(e)},()=>i(a?[]:null)),wn(()=>{var e=r();M&&n.defaultChecked!==n.checked?s=!0:a?(e||=[],n.checked=e.includes(n.__value)):n.checked=Zt(n.__value,e)}),_n(()=>{var e=o.indexOf(n);e!==-1&&o.splice(e,1)}),Oi.has(o)||(Oi.add(o),Ye(()=>{o.sort((e,t)=>e.compareDocumentPosition(t)===4?-1:1),Oi.delete(o)})),Ye(()=>{if(s){var e=a?ji(o,e,n.checked):o.find(e=>e.checked)?.__value;i(e)}})}function Ai(e,t,n=t){at(e,`change`,t=>{n(t?e.defaultChecked:e.checked)}),(M&&e.defaultChecked!==e.checked||fr(t)==null)&&n(e.checked),wn(()=>{e.checked=!!t()})}function ji(e,t,n){for(var r=new Set,i=0;i{var n=this.#e.get(e);n.delete(t),n.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#r(){return this.#t??=new ResizeObserver(t=>{for(var n of t){e.entries.set(n.target,n);for(var r of this.#e.get(n.target)||[])r(n)}})}}({box:`border-box`});function Fi(e,t,n){var r=Pi.observe(e,()=>n(e[t]));Sn(()=>(fr(()=>n(e[t])),r))}function Ii(e,t){return e===t||e?.[k]===t}function Li(e=Ge(),t,n,r){var i=Ve.r,a=G;return Sn(()=>{var o,s;return wn(()=>{o=s,s=r?.()||[],fr(()=>{Ii(n(...s),e)||(t(e,...s),o&&Ii(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Ii(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Ri(e,t,n,r,i){var a=()=>{r(n[e])};n.addEventListener(t,a),i?wn(()=>{n[e]=i()}):a(),(n===document.body||n===window||n===document)&&_n(()=>{n.removeEventListener(t,a)})}function zi(e=!1){let t=Ve,n=t.l.u;if(!n)return;let r=()=>pr(t.s);if(e){let e=0,n={},i=ut(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>K(i)}n.b.length&&bn(()=>{Bi(t,r),m(n.b)}),vn(()=>{let e=fr(()=>n.m.map(p));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&vn(()=>{Bi(t,r),m(n.a)})}function Bi(e,t){if(e.l.s)for(let t of e.l.s)K(t);t()}var Vi=!1;function Hi(e){var t=Vi;try{return Vi=!1,[e(),Vi]}finally{Vi=t}}var Ui={get(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(d(r)&&(r=r()),typeof r==`object`&&r&&t in r)return r[t]}},set(e,t,n){let r=e.props.length;for(;r--;){let i=e.props[r];d(i)&&(i=i());let o=a(i,t);if(o&&o.set)return o.set(n),!0}return!1},getOwnPropertyDescriptor(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(d(r)&&(r=r()),typeof r==`object`&&r&&t in r){let e=a(r,t);return e&&!e.configurable&&(e.configurable=!0),e}}},has(e,t){if(t===k||t===ie)return!1;for(let n of e.props)if(d(n)&&(n=n()),n!=null&&t in n)return!0;return!1},ownKeys(e){let t=[];for(let n of e.props)if(d(n)&&(n=n()),n){for(let e in n)t.includes(e)||t.push(e);for(let e of Object.getOwnPropertySymbols(n))t.includes(e)||t.push(e)}return t}};function Wi(...e){return new Proxy({props:e},Ui)}function Gi(e,t,n,r){var i=!ze||!!(n&2),o=!!(n&8),s=!!(n&16),c=r,l=!0,u=void 0,d=()=>s&&i?(u??=ut(r),K(u)):(l&&(l=!1,c=s?fr(r):r),c);let f;if(o){var p=k in e||ie in e;f=a(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;o?[m,h]=Hi(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Pe(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?ut:pt)(()=>(v=!1,g()));o&&K(y);var b=G;return(function(e,t){if(arguments.length>0){let n=t?K(y):i&&o?Yt(e):e;return R(y,n),v=!0,c!==void 0&&(c=n),e}return Bn&&v||b.f&16384?y.v:K(y)})}function Ki(e){Ve===null&&De(`onMount`),ze&&Ve.l!==null?Ji(Ve).m.push(e):vn(()=>{let t=fr(e);if(typeof t==`function`)return t})}function qi(e){Ve===null&&De(`onDestroy`),Ki(()=>()=>fr(e))}function Ji(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);function Yi(e,t){if(e instanceof RegExp)return{keys:!1,pattern:e};var n,r,i,a,o=[],s=``,c=e.split(`/`);for(c[0]||c.shift();i=c.shift();)n=i[0],n===`*`?(o.push(`wild`),s+=`/(.*)`):n===`:`?(r=i.indexOf(`?`,1),a=i.indexOf(`.`,1),o.push(i.substring(1,~r?r:~a?a:i.length)),s+=~r&&!~a?`(?:/([^/]+?))?`:`/([^/]+?)`,~a&&(s+=(~r?`?`:``)+`\\`+i.substring(a))):s+=`/`+i;return{keys:o,pattern:RegExp(`^`+s+(t?`(?=$|/)`:`/?$`),`i`)}}var Xi=new class{#e=L(Zi());get _loc(){return K(this.#e)}set _loc(e){R(this.#e,e)}#t=F(()=>this._loc.location);get _location(){return K(this.#t)}set _location(e){R(this.#t,e)}#n=F(()=>this._loc.querystring);get _querystring(){return K(this.#n)}set _querystring(e){R(this.#n,e)}#r=L(void 0);get _params(){return K(this.#r)}set _params(e){R(this.#r,e)}get loc(){return this._loc}get location(){return this._location}get querystring(){return this._querystring}get params(){return this._params}constructor(){typeof window<`u`?window.addEventListener(`hashchange`,()=>{this._loc=Zi()}):console.warn(`[svelte-spa-router] window 'window' is not defined, skipping initiation`)}};function Zi(){let e=typeof window<`u`?window.location.href:``,t=e.indexOf(`#/`),n=t>-1?e.substr(t+1):`/`,r=n.indexOf(`?`),i=``;return r>-1&&(i=n.substr(r+1),n=n.substr(0,r)),{location:n,querystring:i}}async function Qi(e){if(!e||e.length<1||e.charAt(0)!=`/`&&e.indexOf(`#/`)!==0)throw Error(`Invalid parameter location`);await lr();let t=(e.charAt(0)==`#`?``:`#`)+e;try{let e={...history.state};delete e.__svelte_spa_router_scrollX,delete e.__svelte_spa_router_scrollY,window.history.replaceState(e,``,t)}catch{console.warn("Caught exception while replacing the current page. If you're running this in the Svelte REPL, please note that the `replace` method might not work in this environment.")}window.dispatchEvent(new Event(`hashchange`))}function $i(e){e?window.scrollTo(e.__svelte_spa_router_scrollX||0,e.__svelte_spa_router_scrollY||0):window.scrollTo(0,0)}function ea(e,t){Ue(t,!0);let n=Gi(t,`routes`,19,()=>({})),r=Gi(t,`prefix`,3,``),i=Gi(t,`restoreScrollState`,3,!1),a=Gi(t,`onConditionsFailed`,3,()=>{}),o=Gi(t,`onRouteLoaded`,3,()=>{}),s=Gi(t,`onRouteLoading`,3,()=>{}),c=Gi(t,`onRouteEvent`,3,()=>{});class l{path;component;conditions;userData;props;_pattern;_keys;constructor(e,t){let n=e=>typeof e==`object`&&!!e&&e._sveltesparouter===!0;if(!t||typeof t!=`function`&&!n(t))throw Error(`Invalid component object`);if(!e||typeof e==`string`&&(e.length<1||e.charAt(0)!=`/`&&e.charAt(0)!=`*`)||typeof e==`object`&&!(e instanceof RegExp))throw Error(`Invalid value for "path" argument - strings must start with / or *`);let r=Yi(e);if(this.path=e,n(t)){let e=t;this.component=e.component,this.conditions=e.conditions||[],this.userData=e.userData,this.props=e.props||{}}else{let e=t;this.component=()=>Promise.resolve(e),this.conditions=[],this.props={}}this._pattern=r.pattern,this._keys=r.keys}match(e){if(r()){if(typeof r()==`string`){if(e.startsWith(r()))e=e.substr(r().length)||`/`;else return null}else if(r()instanceof RegExp){let t=e.match(r());if(t&&t[0])e=e.substr(t[0].length)||`/`;else return null}}let t=this._pattern.exec(e);if(t===null)return null;if(this._keys===!1)return t;let n={},i=0;for(;i{u.push(new l(t,e))}):Object.keys(n()).forEach(e=>{let t=n();u.push(new l(e,t[e]))});let d=L(null),f=L(null),p=L({}),m=null,h=null;vn(()=>{history.scrollRestoration=i()?`manual`:`auto`}),vn(()=>{if(!i())return;let e=e=>{m=e.state&&(e.state.__svelte_spa_router_scrollY||e.state.__svelte_spa_router_scrollX)?e.state:null};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)});async function g(e,t){await lr(),e(t)}vn(()=>{let e=Xi.loc,t=!1;return fr(async()=>{let n=0;for(;n{t=!0}});function _(e){return e&&typeof e==`object`&&Object.keys(e).length?e:null}var v=Nr(),y=B(v),b=e=>{let t=F(()=>K(d));var n=Nr(),r=B(n),i=e=>{var n=Nr();ri(B(n),()=>K(t),(e,t)=>{t(e,Wi({get params(){return K(f)},get onRouteEvent(){return c()}},()=>K(p)))}),Y(e,n)},a=e=>{var n=Nr();ri(B(n),()=>K(t),(e,t)=>{t(e,Wi({get onRouteEvent(){return c()}},()=>K(p)))}),Y(e,n)};Z(r,e=>{K(f)?e(i):e(a,-1)}),Y(e,n)};Z(y,e=>{K(d)&&e(b)}),Y(e,v),We()}var ta=[`bars`,`pace`,`pie`,`fuel`,`resets`,`thresholds`];function na(e){return e===`zone`||e===`consumption-pace`?`pace`:typeof e==`string`&&ta.includes(e)?e:`bars`}var ra=`codexometer.web.preferences.v1`,ia={statusLine:null,tab:`quota`,view:`bars`,selected:``,defaultDetail:0,layouts:[]};function aa(){try{let e=JSON.parse(localStorage.getItem(ra)||`null`);return!e||typeof e!=`object`?ia:{statusLine:Array.isArray(e.statusLine)?[...new Set(e.statusLine.filter(e=>typeof e==`string`&&e.length<64))].slice(0,32):null,tab:[`quota`,`sessions`,`usage`].includes(e.tab)?e.tab:`quota`,view:na(e.view),selected:typeof e.selected==`string`?e.selected.slice(0,256):``,defaultDetail:+(e.defaultDetail===1),layouts:Array.isArray(e.layouts)?e.layouts.filter(e=>{if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&t.id.length<=256&&[0,1,2].includes(t.level)}).slice(-100):[]}}catch{return ia}}var oa=Yt(aa()),sa=Yt({open:!1}),ca=Yt({requests:0});function la(){let e=JSON.stringify(oa);try{localStorage.setItem(ra,e)}catch{}}function ua(){return oa.tab===`quota`?`/quota/`+oa.view:`/`+oa.tab}function da(e){return oa.layouts.find(t=>t.id===e)?.level??oa.defaultDetail}function fa(e){oa.defaultDetail=e,oa.layouts=[]}function pa(e,t){oa.layouts=[...oa.layouts.filter(t=>t.id!==e),{id:e,level:Math.max(0,Math.min(2,t))}].slice(-100)}var $=Yt({data:null,connected:!1,error:``}),ma=e=>e==null?`Unavailable`:e.toLocaleString(`en-GB`),ha=e=>!e||String(e).startsWith(`0001-`)?`Not yet available`:new Date(typeof e==`number`?e*1e3:e).toLocaleString(`en-GB`),ga=`codexometer.web.session`,_a=class extends Error{},va;async function ya(e,t,n){if(!va||!$.connected||!$.data?.control||$.data.sessionsError)throw Error(`Session controls unavailable. Check the live connection.`);return await va(e,t,n)}function ba(){let e=new AbortController,t,n=``;va=async(t,r,i)=>{let a=await fetch(`/api/control/`+t,{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.any([e.signal,AbortSignal.timeout(8e3),...i?[i]:[]]),cache:`no-store`});if(!a.ok)throw a.status===502?Error(`Outcome uncertain. Check Codex before taking another action; nothing was retried.`):new _a(`Action rejected, expired or changed. Refresh and check Codex; nothing was retried.`);return a.json()};try{n=sessionStorage.getItem(ga)||``}catch{}let r=location.hash,i=r.startsWith(`#pair=`)?r.slice(6):``;(i||!r||r===`#`)&&(history.replaceState(null,``,`/#`+ua()),window.dispatchEvent(new HashChangeEvent(`hashchange`)));async function a(){if(i)try{let t=await fetch(`/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({secret:i}),signal:e.signal});if(!t.ok)throw Error(`Pairing link expired or already used. Restart --web for a fresh link.`);n=(await t.json()).token;try{sessionStorage.setItem(ga,n)}catch{}}catch(t){e.signal.aborted||($.error=t instanceof Error?t.message:`Pairing failed`);return}n?await o():$.error=`Open the private pairing link printed by codexometer --web in your terminal.`}async function o(){try{let t=await fetch(`/api/events`,{headers:{Authorization:`Bearer ${n}`},signal:e.signal,cache:`no-store`});if(t.status===401){try{sessionStorage.removeItem(ga)}catch{}$.error=`Browser session expired. Restart --web and open its new pairing link.`;return}if(!t.ok||!t.body)throw Error(`Live connection unavailable`);let r=t.body.getReader(),i=new TextDecoder,a=``;for(;!e.signal.aborted;){let{done:e,value:t}=await r.read();if(e)break;a+=i.decode(t,{stream:!0});let n;for(;(n=a.indexOf(` - -`))>=0;){let e=a.slice(0,n);a=a.slice(n+2),e.startsWith(`data: `)&&($.data=JSON.parse(e.slice(6)),$.connected=!0,$.error=``)}}}catch{}finally{$.connected=!1}e.signal.aborted||($.error=`Connection lost — showing last observation. Reconnecting…`,t=setTimeout(o,2500))}return a(),()=>{va=void 0,e.abort(),clearTimeout(t),$.connected=!1}}Be();var xa=J(`

      Quota refresh failed. Policy state is based on the last successful - observation.

      `),Sa=J(`

      `),Ca=J(`

      The longest Codex quota window selects one active model profile. ASK - creates a per-session review; AUTO applies the profile on the next - eligible check.

      `,1),wa=J(`

      No threshold-based model steps were configured at launch.

      `);function Ta(e,t){Ue(t,!1),zi();var n=Nr(),r=B(n),i=e=>{var t=Ca(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,xa())};Z(i,e=>{$.data.quotaError&&e(a)});var o=H(i,2),s=z(o),c=V(s),l=H(s,4);Xr(l,5,()=>$.data.thresholds,Kr,(e,t)=>{var n=Sa();let r;var i=z(n),a=V(i),o=H(i,2),s=z(o),c=V(s,!0),l=V(H(s,2));P(o);var u=H(o,2),d=V(u,!0),f=V(H(u,2));P(n),U((e,i)=>{r=li(n,1,``,null,r,{active:K(t).state===`ACTIVE`,next:K(t).state===`NEXT`}),X(a,`${K(t).threshold??``}%`),X(c,K(t).model),X(l,`${e??``} REASONING // ${i??``} - SPEED`),X(d,K(t).mode),X(f,`${K(t).state??``}${K(t).state===`NEXT`?` // ${K(t).remaining||0} PP TO GO`:``}`)},[()=>K(t).effort.toUpperCase(),()=>K(t).speed.toUpperCase()]),Y(e,n)}),P(l),P(o),U(e=>{X(r,`MODEL STEP POLICY // OBSERVED ${e??``}`),X(c,`THRESHOLDS // ${$.data.thresholds.length??``} CONFIGURED`)},[()=>ha($.data.quotaAt)]),Y(e,t)},a=e=>{Y(e,wa())};Z(r,e=>{$.data?.thresholds?.length?e(i):e(a,-1)}),Y(e,n),We()}var Ea=jr(` `,1),Da=jr(` `,1),Oa=jr(` `,1),ka=jr(` `,1),Aa=J(`
      `,1),ja=J(` `),Ma=J(`
      Quota observations
      Observed atPeriod elapsedConsumedTrail segment
      `),Na=J(`
      OBSERVATION DATA
      `),Pa=J(`
      CONSUMPTIONQUOTA PERIOD ELAPSED
      `,1);function Fa(e,t){let n=Pr();Ue(t,!0);let r=Gi(t,`trail`,19,()=>[]),i=L(!1),a=L(!0),o=L(`window`),s=[0,25,50,75,100],c=F(()=>t.plot?.known?t.plot.elapsed:t.elapsed),l=L(400),u=L(240),d=F(()=>K(l)-24),f=F(()=>K(u)-48),p=F(()=>Math.max(1,K(d)-48)),m=F(()=>Math.max(1,K(f)-20)),h=F(()=>48+Math.max(0,Math.min(100,K(c)))/100*K(p));function g(e){return K(f)-(e-0)/100*K(m)}let _=F(()=>g(t.used)),v=F(()=>t.used-K(c)),y=F(()=>r().map((e,t)=>`${t===0||e.break?`M`:`L`}${48+e.elapsed/100*K(p)} ${g(e.used)}`).join(` `)),b=F(()=>{let e=0;for(let t=r().length-1;t>0;t--)if(r()[t].break){e=t;break}return r().slice(e)}),x=F(()=>K(b).length<2?0:Math.max(0,Date.parse(K(b).at(-1).at)-Date.parse(K(b)[0].at))),S=F(()=>Object.fromEntries((t.plot?.modes||[]).map(e=>[e.id,e.available])));vn(()=>{K(o)!==`window`&&!K(S)[K(o)]&&R(o,`window`)});let C=F(()=>{let e=t.plot?.modes.find(e=>e.id===K(o));if(!e?.segment)return null;let{x1:n,y1:r,x2:i,y2:a}=e.segment,s=Math.hypot((i-n)/100*K(p),(a-r)/100*K(m)),c=Math.max(3,Math.min(9,Math.floor(s/65)+2));return{path:`M${Array.from({length:c},(e,t)=>{let o=n+(i-n)*t/(c-1),s=r+(a-r)*t/(c-1);return`${48+o/100*K(p)} ${g(s)}`}).join(` L`)}`,projected:e.projected,safe:e.safe}}),w=F(()=>{if(K(b).length===0)return`NO OBSERVATIONS`;if(K(b).length===1)return`ONE OBSERVATION`;let e=Math.floor(K(x)/6e4);if(e<60)return`${e} MIN CONTINUOUS`;let t=Math.floor(e/60);return t<24?`${t}H CONTINUOUS`:`${Math.floor(t/24)}D ${t%24}H CONTINUOUS`});var T=Pa(),E=B(T),D=z(E);let ee;var te=z(D),O=z(te),ne=H(O);P(te);var k=H(te),re=H(k);Xr(re,17,()=>s,Kr,(e,t)=>{var n=Ea(),r=B(n),i=H(r),a=V(i);U(()=>{Q(r,`x1`,48+K(t)/100*K(p)),Q(r,`x2`,48+K(t)/100*K(p)),Q(r,`y2`,K(f)),Q(i,`x`,48+K(t)/100*K(p)),Q(i,`y`,K(f)+20),X(a,`${K(t)??``}%`)}),Y(e,n)});var ie=H(re);Xr(ie,17,()=>s,Kr,(e,t)=>{var n=Da(),r=B(n),i=H(r),a=V(i);U((e,n,o)=>{Q(r,`y1`,e),Q(r,`x2`,K(d)),Q(r,`y2`,n),Q(i,`y`,o),X(a,`${K(t)??``}%`)},[()=>g(K(t)),()=>g(K(t)),()=>g(K(t))+4]),Y(e,n)});var ae=H(ie),oe=H(ae),se=H(oe),A=e=>{var t=Oa(),n=B(t),i=H(n),a=H(i),o=V(z(a));P(a),U((e,t)=>{Q(n,`d`,K(y)),Q(i,`d`,K(y)),Q(a,`cx`,48+r()[0].elapsed/100*K(p)),Q(a,`cy`,e),X(o,`First observation: ${t??``}`)},[()=>g(r()[0].used),()=>ha(r()[0].at)]),Y(e,t)};Z(se,e=>{K(a)&&r().length&&e(A)});var ce=H(se),le=e=>{var t=ka(),r=B(t),i=H(r),a=V(z(i));P(i),U(e=>{Q(r,`d`,K(C).path),Q(i,`d`,K(C).path),Q(i,`marker-mid`,`url(#${n}-trend-arrow)`),X(a,`${K(o)===`window`?`Window-average pace`:`Recent consumption trajectory`} projects ${e??``}% at reset if continued`)},[()=>K(C).projected.toFixed(1)]),Y(e,t)};Z(ce,e=>{K(C)&&e(le)});var ue=H(ce,2),de=H(ue),fe=H(de),j=V(z(fe));P(fe),P(D),P(E);var pe=H(E,2),me=z(pe),he=z(me),ge=H(he,3),_e=V(ge,!0),M=H(ge,2),ve=e=>{var t=Aa(),n=V(H(B(t)));U(e=>X(n,`TREND // ${e??``}`),[()=>K(C).projected>=100?`QUOTA EXHAUSTION PROJECTED`:`${K(C).projected.toFixed(1)}% PROJECTED AT RESET`]),Y(e,t)};Z(M,e=>{K(C)&&e(ve)}),P(me);var N=H(me,2),ye=z(N),be=z(ye);Si(be),xe(),P(ye);var Se=H(ye,2),Ce=H(z(Se),2),we=z(Ce);we.value=we.__value=`off`;var Te=H(we),Ee=V(Te);Te.value=Te.__value=`halfHour`;var De=H(Te),Oe=V(De);De.value=De.__value=`hour`;var ke=H(De),Ae=V(ke);ke.value=ke.__value=`day`;var je=H(ke),Me=V(je);je.value=je.__value=`window`,P(Ce),hi(Ce),P(Se);var Ne=V(H(Se,2));P(N),P(pe);var Pe=H(pe,2),Fe=e=>{var t=Na(),n=H(z(t),2),a=e=>{var t=Ma(),n=z(t),i=H(z(n),2);Xr(i,21,r,Kr,(e,t,n)=>{var r=ja(),i=z(r),a=z(i),o=V(a,!0);P(i);var s=H(i),c=V(s),l=H(s),u=V(l),d=V(H(l),!0);P(r),U((e,r)=>{Q(a,`datetime`,K(t).at),X(o,e),X(c,`${r??``}%`),X(u,`${K(t).used??``}%`),X(d,n===0?`First observation`:K(t).break?`Gap before this observation`:`Connected to previous observation`)},[()=>ha(K(t).at),()=>K(t).elapsed.toFixed(1)]),Y(e,r)}),P(i),P(n),P(t),Y(e,t)};Z(n,e=>{K(i)&&e(a)}),P(t),Ri(`open`,`toggle`,t,e=>R(i,e),()=>K(i)),Y(e,t)};Z(Pe,e=>{r().length&&e(Fe)}),U((e,r,i,a,o,s)=>{Q(D,`viewBox`,`0 0 ${K(l)} ${K(u)}`),Q(D,`aria-label`,e),ee=di(D,``,ee,{"--trend-color":K(C)?.safe?`#115b35`:`#7f1825`}),Q(O,`id`,n),Q(ne,`id`,n+`-trend-arrow`),Q(k,`width`,K(p)),Q(k,`height`,K(m)),Q(k,`fill`,`url(#${n})`),Q(ae,`d`,`M48 20 V${K(f)} H${K(d)}`),Q(oe,`y1`,r),Q(oe,`x2`,K(d)),Q(oe,`y2`,i),Q(ue,`x`,48+K(p)/2),Q(ue,`y`,K(u)-5),Q(de,`cx`,K(h)),Q(de,`cy`,K(_)),Q(fe,`cx`,K(h)),Q(fe,`cy`,K(_)),X(j,`${t.used??``}% consumed // ${a??``}% of period elapsed`),X(he,`${t.used??``}% USED // ${o??``}% TIME ELAPSED`),X(_e,s),Te.disabled=!K(S).halfHour,X(Ee,`LAST 30 MINUTES${K(S).halfHour?``:` — UNAVAILABLE`}`),De.disabled=!K(S).hour,X(Oe,`LAST HOUR${K(S).hour?``:` — UNAVAILABLE`}`),ke.disabled=!K(S).day,X(Ae,`LAST 24 HOURS${K(S).day?``:` — UNAVAILABLE`}`),je.disabled=!K(S).window,X(Me,`FROM WINDOW START${K(S).window?``:` — NO TIME ELAPSED`}`),X(Ne,`HISTORY // ${K(w)??``}`)},[()=>`Pace: ${t.used}% consumed, ${K(c).toFixed(1)}% of quota period elapsed. ${K(v)>0?`Above`:K(v)<0?`Below`:`On`} the steady-consumption line.${K(a)&&r().length?` Trace path contains ${r().length} ${r().length===1?`observation`:`observations`}; gaps are not interpolated.`:``}`,()=>g(0),()=>g(100),()=>K(c).toFixed(1),()=>K(c).toFixed(1),()=>Math.abs(K(v))<.05?`ON PACE`:K(v)>0?`ABOVE THE LINE — CONSUMING FASTER THAN TIME`:`BELOW THE LINE — WITHIN PACE`]),Fi(E,`clientWidth`,e=>R(l,e)),Fi(E,`clientHeight`,e=>R(u,e)),Ai(be,()=>K(a),e=>R(a,e)),gi(Ce,()=>K(o),e=>R(o,e)),Y(e,T),We()}var Ia=J(` `),La=J(`

      Quota refresh failed. Values below are the last successful observation.

      `),Ra=J(`

      `),za=J(`

      Expiry details unavailable. No listed expiry does not mean no expiry.

      `),Ba=J(`

      `),Va=J(`

      Read-only preview. Use the terminal to redeem a reset.

      The backend may return only some credits. This list does not establish - redemption order.

      `),Ha=J(` `,1),Ua=jr(``),Wa=jr(``),Ga=J(`
      `),Ka=J(`

      Cycle duration or reset date unavailable — position cannot be - plotted.

      `),qa=J(`
      EMPTYFULL
      `),Ja=J(`

      `,1),Ya=J(`
      `,1),Xa=J(`

      `),Za=J(`

      `),Qa=J(`

      No quota windows reported yet.

      `),$a=J(`
      `,1),eo=J(`

      All reported windows are shown. API-equivalent learning and quota status - scoring remain in the terminal for this first preview.

      `,1),to=J(` `,1);function no(e,t){Ue(t,!0);let n=Gi(t,`params`,19,()=>({})),r=F(()=>ta.filter(e=>e!==`thresholds`||!!$.data?.thresholds?.length)),i=L(Yt(Date.now())),a=F(()=>K(r).includes(na(n().view))?na(n().view):`bars`);Ki(()=>{let e=setInterval(()=>R(i,Date.now(),!0),1e3);return()=>clearInterval(e)});function o(e){return!e.duration||e.duration<=0||!e.reset?null:Math.max(0,Math.min(100,100*(1-(e.reset*1e3-K(i))/(e.duration*6e4))))}vn(()=>{oa.view=K(a),(n().view===`zone`||n().view===`consumption-pace`)&&Qi(`/quota/pace`)});function s(e){let t=e/100*Math.PI*2;return`M60 60 L60 14 A46 46 0 ${+(e>50)} 1 ${60+46*Math.sin(t)} ${60-46*Math.cos(t)} Z`}var c=to(),l=B(c);Xr(l,21,()=>K(r),Kr,(e,t)=>{var n=Ia();let r;var i=V(n,!0);U(e=>{Q(n,`href`,`#/quota/`+K(t)),Q(n,`aria-current`,K(a)===K(t)?`page`:void 0),r=li(n,1,``,null,r,{active:K(a)===K(t)}),X(i,e)},[()=>K(t)===`fuel`?`FUEL TANK`:K(t).toUpperCase()]),Y(e,n)}),P(l);var u=H(l,2),d=e=>{var t=eo(),n=B(t),r=e=>{Y(e,La())};Z(n,e=>{$.data.quotaError&&e(r)});var i=H(n,2),c=e=>{var t=Ra(),n=V(t);U(()=>X(n,`Last usage accounting issue: - ${$.data.usageDiagnostic??``}`)),Y(e,t)};Z(i,e=>{$.data.usageDiagnostic&&e(c)});var l=H(i,2),u=V(l),d=H(l,2),f=e=>{Ta(e,{})},p=e=>{var t=Va(),n=z(t),r=V(n),i=H(n,4),a=e=>{Y(e,za())};Z(i,e=>{$.data.credits.length||e(a)}),Xr(H(i,2),17,()=>$.data.credits,Kr,(e,t)=>{var n=Ba(),r=z(n),i=V(r),a=V(H(r,2),!0);P(n),U(e=>{X(i,`${(K(t).title||`Quota reset`)??``} // ${K(t).status??``}`),X(a,e)},[()=>K(t).expiryKnown?K(t).expires?`EXPIRES `+ha(K(t).expires):`Does not expire`:`Expiry information unavailable`]),Y(e,n)}),xe(2),P(t),U(()=>X(r,`RESET INVENTORY // ${$.data.creditCount??``} AVAILABLE`)),Y(e,t)},m=e=>{var t=$a(),n=B(t);let r;Xr(n,21,()=>$.data.meters,Kr,(e,t)=>{let n=F(()=>o(K(t)));var r=Za(),i=z(r),c=V(i,!0),l=H(i,2),u=z(l),d=e=>{var n=Ha(),r=B(n),i=V(r),a=V(H(r));U(()=>{X(i,`FREE ${100-K(t).used}%`),X(a,`USED ${K(t).used??``}%`)}),Y(e,n)},f=e=>{var n=Ha(),r=B(n),i=V(r),a=V(H(r));U(()=>{X(i,`USED ${K(t).used??``}%`),X(a,`FREE ${100-K(t).used}%`)}),Y(e,n)};Z(u,e=>{K(a)===`fuel`?e(d):e(f,-1)}),P(l);var p=H(l,2);let m;var h=z(p),g=e=>{var n=Ga(),r=z(n),i=H(z(r)),a=e=>{Y(e,Ua())},o=e=>{var n=Wa();U(e=>Q(n,`d`,e),[()=>s(K(t).used)]),Y(e,n)};Z(i,e=>{K(t).used>=100?e(a):K(t).used>0&&e(o,1)}),P(r),P(n),U(()=>Q(r,`aria-label`,`${K(t).used}% quota used`)),Y(e,n)},_=e=>{var r=Nr(),i=B(r),a=e=>{{let r=F(()=>K(t).trail||[]);Fa(e,{get used(){return K(t).used},get elapsed(){return K(n)},get trail(){return K(r)},get plot(){return K(t).plot}})}},o=e=>{Y(e,Ka())};Z(i,e=>{K(n)===null?e(o,-1):e(a)}),Y(e,r)},v=e=>{var r=Ya(),i=B(r),o=z(i);let s;P(i);var c=H(i,2),l=e=>{Y(e,qa())};Z(c,e=>{K(a)===`fuel`&&e(l)});var u=H(c,2),d=e=>{var t=Ja(),r=B(t),i=V(r),o=H(r,2),s=z(o);let c;P(o),U(e=>{X(i,`RESET CYCLE // ${e??``}% ELAPSED`),c=di(s,``,c,{width:`${K(a)===`fuel`?100-K(n):K(n)}%`})},[()=>Math.floor(K(n))]),Y(e,t)};Z(u,e=>{K(n)!==null&&e(d)}),U(()=>{Q(i,`aria-label`,K(a)===`fuel`?`Fuel remaining`:`Quota used`),Q(i,`aria-valuenow`,K(a)===`fuel`?100-K(t).used:K(t).used),s=di(o,``,s,{width:`${K(a)===`fuel`?100-K(t).used:K(t).used}%`})}),Y(e,r)};Z(h,e=>{K(a)===`pie`?e(g):K(a)===`pace`?e(_,1):e(v,-1)}),P(p);var y=H(p,2),b=V(y),x=H(y,2),S=e=>{var n=Xa(),r=V(n,!0);U(()=>X(r,K(t).details)),Y(e,n)};Z(x,e=>{K(t).details&&e(S)}),P(r),U(e=>{X(c,K(t).name),m=li(p,1,`meter-graphic`,null,m,{"bar-graphic":K(a)===`bars`||K(a)===`fuel`}),X(b,`RESETS // ${e??``}`)},[()=>ha(K(t).reset)]),Y(e,r)}),P(n);var i=H(n,2),c=e=>{Y(e,Qa())};Z(i,e=>{$.data.meters.length||e(c)}),U(()=>r=li(n,1,`quota-grid`,null,r,{radial:K(a)===`pie`,zone:K(a)===`pace`})),Y(e,t)};Z(d,e=>{K(a)===`thresholds`?e(f):K(a)===`resets`?e(p,1):e(m,-1)}),xe(2),U(e=>X(u,`QUOTA // OBSERVED ${e??``}`),[()=>ha($.data.quotaAt)]),Y(e,t)};Z(u,e=>{$.data&&e(d)}),Y(e,c),We()}var ro=J(`
      `),io=J(`

      `,1);function ao(e,t){Ue(t,!0);let n=Gi(t,`values`,19,()=>[]),r=Gi(t,`label`,3,`Token activity`),i=Gi(t,`capacity`,3,0),a=F(()=>Math.max(0,...n())),o=F(()=>i()>n().length?[...Array(i()-n().length).fill(0),...n()]:n());var s=io(),c=B(s),l=V(c),u=H(c,2);Xr(u,21,()=>K(o),Kr,(e,t)=>{var n=ro();let r;U((e,t)=>{Q(n,`title`,e),r=di(n,``,r,{height:t})},[()=>K(t).toLocaleString(`en-GB`)+` tokens`,()=>`${100*K(t)/Math.max(1,K(a))}%`]),Y(e,n)}),P(u),U((e,t)=>{X(l,`SCALE // 0 — ${e??``} TOKENS`),Q(u,`aria-label`,t)},[()=>K(a).toLocaleString(`en-GB`),()=>`${r()}. Peak ${K(a).toLocaleString(`en-GB`)} tokens.`]),Y(e,s),We()}function oo(e){if(!e||![`LAST REPLY`,`LAST ACTIVITY`].includes(e.contextKind))return``;let t=e.text||e.contextKind===`LAST ACTIVITY`&&e.workingCommand||``;return t.trim()?t:``}var so=[{id:`local-statusline`,label:`/statusline`,help:`Choose fields for Codexometer’s detail footer. Saved display preferences only.`,next:`statusline`},{id:`local-usage`,label:`/usage`,help:`Open Codexometer’s usage history. Existing quota and reset views remain available.`,next:`usage`},{id:`local-copy`,label:`/copy`,help:`Copy the selected session’s observed reply or activity using Codexometer’s copy control.`,next:`copy`},{id:`local-theme`,label:`/theme`,help:`Choose a Codexometer display theme. Saved local display preferences only.`,next:`theme`},{id:`local-exit`,label:`/exit`,help:`Leave this Codexometer interface. Codex sessions continue running.`,next:`exit`},{id:`local-quit`,label:`/quit`,help:`Alias for /exit. Codex sessions continue running.`,next:`quit`}],co=[`surface`,`model`,`feature`,`task start`],lo=J(` `),uo=J(``),fo=J(`

      `),po=J(`

      `),mo=J(`
      `),ho=J(`

      `),go=J(`

      `,1),_o=J(`

      `),vo=J(`

      Loading / sending…

      `),yo=J(`
      `),bo=J(`

      `),xo=J(`

       
      `),So=J(`
      `),Co=J(`
      `),wo=J(`

      Review expired. Press Enter to review again.

      `),To=J(`

      `,1),Eo=J(`

      `,1),Do=J(`

      No available matching commands.

      `),Oo=J(` `,1),ko=J(`

      `),Ao=J(`

      Review expired. Review the option again.

      `),jo=J(``),Mo=J(``),No=J(``),Po=J(``),Fo=J(``),Io=J(``),Lo=J(`
      `),Ro=J(`
      `);function zo(e,t){let n=Pr();Ue(t,!0);let r=e=>{var t=Nr();Xr(B(t),19,()=>K(fe),e=>e.id,(e,t,r)=>{var i=uo();let o;var s=z(i),c=V(s,!0),l=H(s),u=V(l),d=H(l),f=e=>{var n=lo(),r=V(n,!0);U(()=>X(r,K(t).help)),Y(e,n)};Z(d,e=>{(K(v)?.path===``||K(A))&&e(f)}),P(i),U((e,s)=>{Q(i,`id`,`${n}-${K(r)}`),Q(i,`role`,K(A)?`option`:void 0),Q(i,`aria-selected`,K(A)?K(T)===K(r):void 0),Q(i,`tabindex`,K(A)?-1:void 0),i.disabled=K(g)||K(he)&&!a(),Q(i,`title`,K(t).help),Q(i,`aria-label`,e),o=li(i,1,`svelte-7bfwr9`,null,o,{suggested:K(T)===K(r)}),X(c,K(t).label),X(u,`${K(A)&&K(t).selected?` // CURRENT`:``}${s??``}`)},[()=>K(t).label+(K(A)&&K(t).selected?` // CURRENT`:``)+ie(K(t)),()=>ie(K(t))]),xr(`focus`,i,()=>{K(A)||_e(K(r))}),q(`click`,i,()=>{_e(K(r)),ye(K(t))}),Y(e,i)}),Y(e,t)},i=Gi(t,`query`,3,``),a=Gi(t,`localOnly`,3,!1),o=Gi(t,`oncopy`,3,()=>{}),s=Gi(t,`onchange`,3,()=>{}),c=Gi(t,`oncomplete`,3,e=>{}),l=so.map(e=>e.next);function u(){return so.map(e=>[`exit`,`quit`].includes(e.next||``)?{...e,help:`Return to Sessions. The local server and Codex sessions remain running.`}:{...e})}function d(){return{title:`/ COMMANDS`,help:`Local Codexometer commands remain available without session control.`,path:``,revision:``,choices:u()}}function f(){R(b,``),R(O,``),R(x,0),R(ne,[],!0)}function p(){w++,R(g,!1),R(h,!1),R(E,i()),f(),R(_,``),K(ue)?s()():c()(i())}async function m(e){if(!l.includes(e))return!1;if(e===`copy`&&!oo($.data?.sessions.find(e=>e.id===t.session)))return R(_,`No reply or activity text is available to copy for this session.`),!0;if(e===`copy`){let e=o()();p(),await e}else p(),e===`usage`?location.hash=`/usage`:e===`theme`?ca.requests++:e===`statusline`?sa.open=!0:location.hash=`/sessions`;return!0}let h=L(!1),g=L(!1),_=L(``),v=L(null),y=L(null),b=L(``),x=L(0),S=L(Yt(Date.now())),C=L(``),w=0,T=L(0),E=L(null),D=L(void 0),ee=L(void 0),te=L(void 0),O=L(``),ne=L(Yt([])),k=F(()=>!!K(v)?.inputReview),re=F(()=>!!K(y)&&!K(k)||!!K(O)||K(ne).length>0);function ie(e){return e.unavailable?e.unavailable.startsWith(`Waiting for idle.`)?` // WAITING FOR IDLE`:` // UNAVAILABLE`:e.next?` →`:e.action?``:` // HELP`}async function ae(e){K(v)&&!(K(ge)&&K(de))&&R(ne,[...K(ne),{path:K(v).path,index:K(T),input:K(C)}],!0),await N(e)}async function oe(){if(!K(re))return;if(w++,R(g,!1),R(b,``),R(x,0),R(_,``),K(O)){R(O,``),K(D)?.focus();return}if(K(y)&&!K(k)){R(y,null),await lr(),K(D)?.focus();return}let e=K(ne).at(-1);e&&(R(ne,K(ne).slice(0,-1),!0),await N(e.path,e))}function se(){K(v)&&K(C).trim()&&!K(g)&&!K(he)&&ae(K(v).path+`/`+encodeURIComponent(K(C).trim()))}let A=F(()=>K(h)&&!!K(v)?.picker&&!K(y)),ce=F(()=>K(h)&&!K(v)?.input&&!K(y)),le=setInterval(()=>{R(S,Date.now(),!0)},1e3);qi(()=>{clearInterval(le),w++});let ue=F(()=>i().trim().startsWith(`/`)&&!i().trim().startsWith(`//`)),de=F(()=>K(v)?.path===``&&K(ue)?i().trim().slice(1).toLowerCase():``),fe=F(()=>(K(v)?.choices||[]).filter(e=>!K(de)||e.label.toLowerCase().startsWith(`/`+K(de)))),j=F(()=>K(y)||K(fe)[K(T)]),pe=F(()=>!!K(b)&&K(S)K(fe).find(e=>e.id===K(O))),he=F(()=>!$.connected||!!$.data?.sessionsError),ge=F(()=>K(h)&&K(ue)&&(!K(v)||K(v).path===``)&&!K(y));vn(()=>{i(),R(T,0)}),vn(()=>{let e=K(T);K(fe),K(ce)&&lr().then(()=>{let t=K(D)?.children[e];if(!t||!K(D))return;let n=K(D).getBoundingClientRect(),r=t.getBoundingClientRect();r.topn.bottom&&(K(D).scrollTop+=r.bottom-n.bottom)})});function _e(e){K(T)!==e&&K(v)?.picker&&(R(O,``),R(b,``),R(x,0),R(_,``),w++),R(T,e,!0)}function M(){w++,R(g,!1),R(h,!1),R(E,i()),f(),c()(i())}function ve(e){let t=!!K(ee)?.contains(e.target);if(!K(h)||!K(ce)&&!K(y)&&!K(v)?.input||!K(ue)&&!t||K(he)&&!a()||e.isComposing||e.ctrlKey||e.metaKey||e.altKey)return;if(K(v)?.input){e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),M());return}let n=e.key===`ArrowLeft`,r=e.key.toLowerCase()===`f`,o=e.key.toLowerCase()===`c`;if((o||r||n)&&!t||![`ArrowUp`,`ArrowDown`,`Tab`,`Enter`,`Escape`].includes(e.key)&&!o&&!r&&!n||e.key===`Tab`&&(K(y)||K(v)?.path!==``||e.shiftKey)||e.key===`Enter`&&e.target instanceof Element&&e.target.closest(`button`)&&!K(D)?.contains(e.target)&&!e.target.closest(`[data-command-confirm]`)||K(y)&&!t||K(y)&&[`ArrowUp`,`ArrowDown`].includes(e.key))return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){M();return}if(K(g)||e.repeat&&(o||e.key===`Enter`))return;if(n){K(re)&&oe();return}if(r){N(K(v)?.path||``,void 0,!0);return}if(o){(K(y)?.action||K(A)&&K(O))&&xe();return}if(K(y)){e.key===`Enter`&&K(y).action&&!K(pe)&&!K(_)&&be(K(y));return}if(e.key===`ArrowUp`||e.key===`ArrowDown`){_e(Math.min(Math.max(K(T)+(e.key===`ArrowUp`?-1:1),0),Math.max(K(fe).length-1,0))),!K(A)&&K(D)?.contains(e.target)&&lr().then(()=>(K(D)?.children[K(T)])?.focus());return}if(e.key===`Enter`&&(K(v)?.path===``||K(v)?.path===`goal`)&&/^\/goal\s+\S/.test(i().trim())){let e=K(v)?.path===`goal`?K(fe).find(e=>i().trim().slice(6).trim().toLowerCase()===e.label.toLowerCase()):void 0;if(e){ye(e);return}ae(i().trim().slice(1));return}let s=K(fe)[K(T)];s&&(e.key===`Tab`?c()(s.label):K(A)?be(s):ye(s))}vn(()=>{K(he)&&!a()&&(w++,R(g,!1),f(),K(h)&&(R(h,!1),R(E,i())),R(v,null),R(y,null))}),vn(()=>{K(ue)&&!K(h)&&i()!==K(E)&&(!K(he)||a())&&(f(),R(h,!0),N(``))});async function N(e,n,r=!1){let i=++w;if(K(v)&&R(v,{...K(v),path:e},!0),n&&R(C,n.input,!0),R(g,!0),R(y,null),R(O,``),R(b,``),R(x,0),R(_,``),a())R(v,d(),!0),R(T,n?.index??0,!0),R(g,!1);else try{let a=await ya(`commands`,{session:t.session,command:{mode:`list`,path:e,...r?{refresh:!0}:{}}});i===w&&(a.choices||=[],(e===``||e===`help`)&&(a.choices=[...a.choices.filter(e=>!l.includes(e.label.replace(/^\//,``))),...u()]),R(v,a,!0),R(T,n?Math.min(n.index,Math.max(a.choices.length-1,0)):a.picker?Math.max(a.choices.findIndex(e=>e.selected),0):0,!0),a.picker&&lr().then(()=>K(D)?.focus()),R(C,n?.input??a.value??``,!0),n&&lr().then(()=>{a.input?K(ee)?.querySelector(`input`)?.focus():K(D)?.focus()}),a.inputReview&&a.choices.length===1&&(R(g,!1),ye(a.choices[0])))}catch{i===w&&(R(_,`Command catalogue unavailable. Use Codex.`),e===``||e===`help`?(R(v,d(),!0),R(_,``)):R(v,{title:`/`+e,help:``,path:e,revision:``,choices:[]},!0))}finally{i===w&&R(g,!1)}}async function ye(e){e.unavailable||K(g)||e.next&&await m(e.next)||K(_)||(K(v)?.picker?(_e(K(fe).findIndex(t=>t.id===e.id)),e.action&&(e.reversible||$.data?.noConfirm)?await be(e):K(D)?.focus()):e.next?await ae(e.next):await be(e))}async function be(e){if(K(g)||K(he)||!K(v)||e.unavailable||K(_))return;let n=e.action&&(e.reversible||$.data?.noConfirm);if(K(v).picker){if(K(pe)&&K(O)===e.id)return;R(O,e.id,!0)}else n||(R(y,e,!0),lr().then(()=>K(te)?.focus()));if(R(b,``),R(x,0),R(_,``),!e.action)return;let r=++w;R(g,!0);try{let n=await ya(`commands`,{session:t.session,command:{mode:`prepare`,path:K(v).path,revision:K(v).revision,choice:e.id}});if(r===w){let e=Date.parse(n.expires);if(!n.confirmation||!Number.isFinite(e)||Date.now()>=e)throw Error(`Review confirmation unavailable`);R(b,n.confirmation,!0),R(x,e,!0)}}catch{r===w&&R(_,`Option changed or unavailable. Refresh before retrying.`)}finally{r===w&&R(g,!1)}n&&r===w&&K(b)&&await xe()}async function xe(){if(!K(b)||K(he)||K(g)||Date.now()>=K(x)||!K(v)||K(v).picker&&K(O)!==K(fe)[K(T)]?.id)return;let e=K(b);R(b,``),R(g,!0);let n=++w;try{let r=await ya(`commands`,{session:t.session,confirmation:e,command:{mode:`commit`,path:K(v).path}});n===w&&(R(_,r.message,!0),R(h,!1),R(v,null),R(y,null),f(),R(E,null),s()())}catch{n===w&&R(_,`Change unconfirmed. Check Codex before retrying.`)}finally{n===w&&R(g,!1)}}var Se={handleKey:ve},Ce=Ro(),we=z(Ce),Te=H(we,2),Ee=e=>{var t=fo(),n=V(t,!0);U(()=>X(n,K(_))),Y(e,t)};Z(Te,e=>{K(_)&&!K(h)&&e(Ee)});var De=H(Te,2),Oe=e=>{var i=Lo();let o;var s=z(i),c=e=>{var t=go(),n=B(t),r=V(n,!0),i=H(n,2),a=e=>{var t=mo();Xr(t,21,()=>K(v).help.split(` -`),Kr,(e,t)=>{var n=po(),r=V(n,!0);U(()=>{Q(n,`title`,K(t)),X(r,K(t))}),Y(e,n)}),P(t),Y(e,t)},o=e=>{var t=ho(),n=V(t,!0);U(()=>X(n,K(v)?.help||`Loading live options…`)),Y(e,t)};Z(i,e=>{K(v)?.path===`goal`?e(a):e(o,-1)}),U(()=>X(r,K(v)?.title||`/ COMMANDS`)),Y(e,t)};Z(s,e=>{K(ge)||e(c)});var l=H(s,2),u=e=>{var t=_o(),n=V(t,!0);U(()=>X(n,K(_))),Y(e,t)};Z(l,e=>{K(_)&&e(u)});var d=H(l,2),f=e=>{Y(e,vo())};Z(d,e=>{K(g)&&e(f)});var p=H(d,2),m=e=>{var t=yo(),r=z(t),i=z(r),o=H(i);Si(o),P(r),P(t),U(e=>{Q(t,`id`,`${n}-input`),X(i,`${e??``} `),Q(o,`aria-label`,K(v).inputLabel||`Session name`),Q(o,`maxlength`,K(v).inputLimit||512),o.disabled=K(g)||K(he)&&!a()},[()=>(K(v).inputLabel||`Session name`).toUpperCase()]),xr(`submit`,t,e=>{e.preventDefault(),se()}),Di(o,()=>K(C),e=>R(C,e)),Y(e,t)},h=e=>{var n=xo(),r=z(n),i=V(r,!0),a=H(r,2),o=V(a,!0),s=H(a,2),c=e=>{var n=bo(),r=z(n),i=H(r),a=e=>{Y(e,Mr(`Only this session's saved - name changes.`))},o=F(()=>K(v)?.path.startsWith(`rename/`)),s=e=>{Y(e,Mr(`Only this session’s - directory changes; project configuration is not reloaded.`))},c=F(()=>K(v)?.path.startsWith(`cd/`)),l=e=>{Y(e,Mr(`Only this session's goal - changes.`))},u=F(()=>K(v)?.path.startsWith(`goal/`)),d=e=>{Y(e,Mr(`No change sent yet. Model, reasoning and speed settings can - change token usage and cost. Changes affect subsequent turns of - this session, not global defaults. Automatic quota thresholds - may later supersede model settings.`))};Z(i,e=>{K(o)?e(a):K(c)?e(s,1):K(u)?e(l,2):e(d,-1)}),P(n),U(()=>X(r,`TARGET // ${t.session??``}. `)),Y(e,n)};Z(s,e=>{K(y).action&&e(c)}),P(n),Li(n,e=>R(te,e),()=>K(te)),U(()=>{X(i,K(y).label),X(o,K(y).help||`No additional help supplied by Codex.`)}),Y(e,n)},w=e=>{var t=Oo(),i=B(t),a=e=>{var t=So(),i=z(t);r(i),P(t),Li(t,e=>R(D,e),()=>K(D)),U(()=>Q(t,`aria-activedescendant`,`${n}-${K(T)}`)),Y(e,t)},o=e=>{var t=Co();let n;var i=z(t);r(i),P(t),Li(t,e=>R(D,e),()=>K(D)),U(()=>n=li(t,1,`command-options svelte-7bfwr9`,null,n,{vertical:K(ge)})),Y(e,t)};Z(i,e=>{K(A)?e(a):e(o,-1)});var s=H(i,2),c=e=>{var t=Eo(),n=B(t),r=V(n,!0),i=H(n,2),a=e=>{var t=To(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,wo())};Z(i,e=>{K(b)&&K(S)>=K(x)&&e(a)}),U(()=>X(r,`REVIEW // ${K(me).label??``}. No change sent yet.`)),Y(e,t)};Z(i,e=>{K(me)&&e(a)}),U(()=>X(r,K(fe)[K(T)]?.help)),Y(e,t)};Z(s,e=>{K(A)&&e(c)});var l=H(s,2),u=e=>{Y(e,Do())};Z(l,e=>{!K(g)&&!K(fe).length&&e(u)}),Y(e,t)};Z(p,e=>{K(v)?.input?e(m):K(y)?e(h,1):e(w,-1)});var E=H(p,2),O=e=>{var t=ko(),n=V(t,!0);U(()=>X(n,K(j).unavailable)),Y(e,t)};Z(E,e=>{K(j)?.unavailable&&e(O)});var ne=H(E,2),k=e=>{Y(e,Ao())};Z(ne,e=>{K(b)&&K(S)>=K(x)&&!K(A)&&e(k)});var ie=H(ne,2),ae=z(ie),ce=e=>{var t=Nr(),r=B(t),i=e=>{var t=jo(),r=V(t,!0);U(e=>{Q(t,`form`,`${n}-input`),t.disabled=e,X(r,K(v).reversibleInput||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)},[()=>K(g)||K(he)||!K(C).trim()]),Y(e,t)},o=e=>{var t=Nr(),n=B(t),r=e=>{var t=Mo();U(()=>t.disabled=K(g)||K(he)&&!a()),q(`click`,t,xe),Y(e,t)},i=e=>{var t=No(),n=V(t,!0);U(()=>{t.disabled=K(g)||K(he)&&!a(),X(n,K(j).reversible||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)}),q(`click`,t,()=>{K(j)&&be(K(j))}),Y(e,t)};Z(n,e=>{K(pe)&&!K(j).reversible&&!$.data?.noConfirm?e(r):e(i,-1)}),Y(e,t)},s=e=>{var t=No(),n=V(t);U(()=>{t.disabled=K(g)||K(he)&&!a(),X(n,`ENTER ${K(j).next?`OPEN`:`HELP`}`)}),q(`click`,t,()=>{K(j)&&ye(K(j))}),Y(e,t)};Z(r,e=>{K(v)?.input?e(i):K(j)?.action&&!K(j).unavailable?e(o,1):!K(y)&&K(j)&&!K(j).unavailable&&e(s,2)}),Y(e,t)};Z(ae,e=>{K(_)||e(ce)});var le=H(ae,2),ue=e=>{var t=Po();U(()=>t.disabled=K(g)),q(`click`,t,oe),Y(e,t)};Z(le,e=>{K(re)&&e(ue)});var de=H(le,2),_e=e=>{var t=Fo();U(()=>t.disabled=K(g)),q(`click`,t,()=>N(K(v)?.path||``,void 0,!0)),Y(e,t)};Z(de,e=>{K(ge)||e(_e)});var Se=H(de,2);P(ie);var Ce=H(ie,2),we=e=>{var t=Io(),n=V(t);U(()=>X(n,`↑/↓ select${K(ge)?` · Tab complete`:``}`)),Y(e,t)};Z(Ce,e=>{!K(v)?.input&&!K(y)&&e(we)}),P(i),Li(i,e=>R(ee,e),()=>K(ee)),U(()=>{Q(i,`aria-label`,K(ge)?`Slash command suggestions`:`Session command options`),o=li(i,1,`svelte-7bfwr9`,null,o,{"command-popup":K(ge)})}),q(`keydown`,i,ve),q(`click`,Se,M),Y(e,i)};return Z(De,e=>{K(h)&&e(Oe)}),P(Ce),U(()=>we.disabled=K(he)&&!a()||K(g)),q(`click`,we,()=>{R(h,!K(h)),R(E,K(h)?null:i(),!0),R(b,``),K(h)?(R(ne,[],!0),N(``)):M()}),Y(e,Ce),We(Se)}Sr([`click`,`keydown`]);var Bo=J(` `,1),Vo=J(`
      `),Ho=J(`
      /
      `);function Uo(e,t){Ue(t,!0);let n=F(()=>t.lines.filter(e=>e.kind===`addition`).length),r=F(()=>t.lines.filter(e=>e.kind===`removal`).length);var i=Ho(),a=z(i),o=z(a),s=V(o),c=V(H(o,2));P(a),Xr(H(a,2),17,()=>t.lines,Kr,(e,t)=>{var n=Vo();let r;var i=z(n),a=e=>{var n=Bo(),r=B(n),i=V(r,!0),a=V(H(r),!0);U(()=>{X(i,K(t).old||``),X(a,K(t).new||``)}),Y(e,n)};Z(i,e=>{K(t).kind!==`heading`&&K(t).kind!==`metadata`&&e(a)});var o=V(H(i),!0);P(n),U(()=>{r=li(n,1,`diff-line svelte-x4gtb6`,null,r,{added:K(t).kind===`addition`,removed:K(t).kind===`removal`,heading:K(t).kind===`heading`}),X(o,K(t).text)}),Y(e,n)}),P(i),U(()=>{Q(a,`aria-label`,`${K(n)} lines added, ${K(r)} lines removed`),X(s,`+${K(n)??``}`),X(c,`−${K(r)??``}`)}),Y(e,i),We()}var Wo=J(`

      `),Go=J(`

      Send this saved prompt now? This starts Codex work and consumes quota.

      `,1),Ko=J(``),qo=J(`

       

      In memory only. Follows session model, reasoning and speed. Closing - Codexometer cancels pending work.

      `),Jo=J(`

      HUMAN APPROVAL REQUIRED

      Managed policy requires approval each time.

      `,1),Yo=J(`

      CURRENT PROFILE

      MODEL / REASONING LEVEL / SPEED

       

      PROPOSED PROFILE

      MODEL / REASONING LEVEL / SPEED

       

      Applied settings remain after Codexometer closes.

      `,1),Xo=J(`

      `),Zo=J(`

       
      `,1),Qo=J(`

      Command unavailable from this observation. Open Codex to inspect the - request.

      `),$o=J(`

      Session controls temporarily unavailable. Check Codex for current state.

      `),es=J(`

      Checking session controls…

      `),ts=J(`

      `),ns=J(`
      About browser controls

      Controls require a supported live request from a connected shared - app-server session. Local observations alone cannot provide them.

      `),rs=J(` `,1),is=J(` `),as=J(`Grants permission beyond this one action. Check the scope - carefully.`),os=J(``),ss=J(``),cs=J(``),ls=J(``),us=J(`

      Not before this time; when quota and idle allow.

      `),ds=J(`

      `,1),fs=J(`

      The existing trigger remains active until saved or deleted. If - it changes or sends while you edit, saving is blocked.

      `),ps=J(` `,1),ms=J(``),hs=J(``),gs=J(``),_s=J(` `,1),vs=J(`
    • `),ys=J(`
      View fixed choices

      Type one of these choices exactly. Your answer stays masked.

        `),bs=J(` `,1),xs=J(`

        `),Ss=J(`

        `,1),Cs=J(` `,1),ws=J(``),Ts=J(`

        `,1),Es=J(`

        `);function Ds(e,t){Ue(t,!0);let n=[],r=Gi(t,`observedCommand`,3,``),i=Gi(t,`observedFileChanges`,19,()=>[]),a=Gi(t,`review`,3,``),o=Gi(t,`suspended`,3,!1),s=Gi(t,`openScheduler`,3,!1),c=Gi(t,`onProtectedChange`,3,e=>{}),l=Gi(t,`oncopy`,3,()=>{}),u=L(null),d=L(Yt([])),f=L(null),p=L(``),m=L(0),h=L(Yt(Date.now())),g=L(!1),_=L(``),v=L(!1),y=L(!1),b=L(``),x=L(!1),S=L(``),C=L(!1),w=L(``),T=L(`now`),E=L(60),D=L(``),ee=L(!1),te=L(``),O=L(Yt([])),ne=F(()=>K(O).find(e=>e.status!==`sent`)),k=L(void 0),re=L(void 0);function ie(e){if(K(x)){lr().then(()=>K(k)?.focus());return}if(e.status!==`pending`||K(g)||!K(u)?.id||K(u).kind!==`prompt`||K(u).questions?.length)return;R(x,!0),R(S,e.id,!0),lr().then(()=>K(k)?.focus()),R(d,[e.text],!0),R(T,e.trigger===`quota`?`quota`:`at`,!0),R(p,``),R(w,``);let t=new Date(e.at||0);e.trigger!==`quota`&&R(D,new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16),!0)}vn(()=>{s()&&K(ne)&&!K(C)&&K(u)?.id&&K(u).kind===`prompt`&&!K(u).questions?.length&&(R(C,!0),ie(K(ne)))});async function ae(){if(!a())try{R(O,await ya(`schedules`,{session:t.session},M.signal),!0),K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`)&&R(p,``),K(w)&&!K(O).some(e=>e.id===K(w)&&e.status===`pending`)&&(R(p,``),R(w,``))}catch{}}async function oe(e){try{R(O,await ya(`schedules`,{session:t.session,cancelId:e},M.signal),!0),R(x,!1),R(p,``),R(w,``),R(d,[],!0)}catch(e){R(_,e instanceof Error?e.message:`Unable to cancel trigger.`,!0)}}vn(()=>(c()(K(g)||K(d).some(e=>e.length>0)),()=>c()(!1)));let se=F(()=>$.data?.sessions.find(e=>e.id===t.session)?.status),A=F(()=>!$.connected||!!$.data?.sessionsError),ce=F(()=>a()!==`profile`&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&!!$.data?.profiles?.some(e=>e.session===t.session&&e.pending)),le=F(()=>!K(A)&&!K(y)&&!!K(u)?.id&&K(u).kind===`approval`&&K(b)!==K(u).id),ue=F(()=>K(le)?K(u).command:r()),de=F(()=>!!K(p)&&K(h)K(u)?.questions?.length?K(u).questions:[{text:`Follow-up message`,secret:!1,freeText:!0,options:[]}]),j=F(()=>K(u)?.kind===`approval`||K(u)?.kind===`profile`?K(f)!==null:K(d).length===K(fe).length&&K(d).every((e,t)=>e.trim().length>0&&(K(fe)[t].freeText||K(fe)[t].options?.includes(e)))),pe=F(()=>K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`),me=F(()=>K(T)===`delay`?K(h)+K(E)*6e4:Date.parse(K(D))),he=F(()=>{if(!K(pe))return``;if(K(x)&&!K(O).some(e=>e.id===K(S)&&e.status===`pending`))return`Trigger changed, removed or already sent. Go back and reopen it; your draft has not been saved.`;if(!K(d)[0]?.trim())return`Enter a message to schedule.`;if(K(T)===`quota`)return``;if(!Number.isFinite(K(me))||K(me)<=K(h))return`Choose a future date/time or a delay greater than zero.`;let e=new Date(K(h));return e.setFullYear(e.getFullYear()+1),K(me)>=e.getTime()?`Choose a time within one year.`:``});function ge(e){return e===void 0?`Not yet available`:new Date(e).toLocaleString([],{timeZoneName:`short`})}function _e(e){if(e.status!==`pending`)return e.status;if(e.trigger===`at`&&e.at&&Date.parse(e.at)>K(h))return`Due in `+Math.ceil((Date.parse(e.at)-K(h))/6e4)+` min`;let t=K(A)?`waiting for a fresh connection`:e.waitingReason||(e.canSend?`ready; awaiting dispatch`:`waiting for quota and an eligible idle session`);return(e.trigger===`at`?`Time reached — `:``)+t}vn(()=>{(K(A)||o()||K(ce)||K(h)>=K(m))&&R(p,``)});let M=new AbortController;Ki(()=>{let e=e=>{e.ctrlKey&&e.key.toLowerCase()===`s`&&!a()&&K(ne)&&(e.preventDefault(),ie(K(ne)))};window.addEventListener(`keydown`,e);let n,r=setInterval(()=>{R(h,Date.now(),!0)},1e3);async function i(){await ae();try{let e=await ya(`offer`,{session:t.session,...a()?{review:a()}:{}},M.signal);if(M.signal.aborted)return;R(y,!1),K(u)?.id!==e.id&&(R(p,``),R(f,null),R(d,Array(Math.max(1,e.questions?.length||0)).fill(``),!0)),R(u,e,!0),K(v)&&e.id&&e.id!==K(b)&&(R(_,``),R(v,!1))}catch{M.signal.aborted||(R(u,null),R(y,!0),R(p,``))}finally{M.signal.aborted||(n=setTimeout(i,2e3))}}return i(),()=>{window.removeEventListener(`keydown`,e),M.abort(),clearTimeout(n),clearInterval(r)}});async function ve(e){if(!e&&K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(d)[0]?.trim().startsWith(`/`)&&!K(d)[0]?.trim().startsWith(`//`)){R(_,`Choose a slash command from COMMANDS; use // for literal slash text.`);return}if(!K(u)?.id||K(g)||K(A)||o()||K(ce)||(e?!e.canSend:!K(j)||K(he)))return;let n=K(u).id;R(g,!0),R(_,``),R(v,!1),R(p,``),R(w,e?.id||``,!0);try{let r=!e&&K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?{trigger:K(T)===`quota`?`quota`:`at`,zone:Intl.DateTimeFormat().resolvedOptions().timeZone,...K(T)===`quota`?{}:{at:(K(T)===`delay`?new Date(Date.now()+K(E)*6e4):new Date(K(D))).toISOString()}}:void 0;R(ee,!!r),R(te,r?r.trigger===`quota`?`After fresh quota becomes available, when the session is idle`:ge(r.at)+` — not before this time; when quota and idle allow`:``,!0);let i=await ya(`prepare`,{session:t.session,...a()?{review:a()}:{},offer:n,...e?{sendId:e.id}:{},...r?{schedule:r}:{},...r&&K(x)?{editId:K(S)}:{},...K(u).kind===`approval`||K(u).kind===`profile`?{choice:K(f)}:{answers:e?[e.text]:[...K(d)]}},M.signal);K(u)?.id!==n||M.signal.aborted||K(A)||o()||K(ce)||(R(p,i.confirmation,!0),R(m,Date.parse(i.expires),!0))}catch(e){M.signal.aborted||R(_,e instanceof Error?e.message:`Unable to prepare action.`,!0)}finally{R(g,!1)}$.data?.noConfirm&&K(p)&&!M.signal.aborted&&await N()}async function N(){if(!K(u)?.id||K(g)||o()||K(ce)||!K(de))return;let e=K(u).id,n=K(u).kind,r=K(p);R(p,``),R(g,!0),R(b,e,!0);try{await ya(`commit`,{session:t.session,...a()?{review:a()}:{},offer:e,confirmation:r},M.signal),R(v,!0),R(x,!1),K(ee)&&(R(b,``),await ae()),R(_,K(ee)?`Trigger set. Closing Codexometer cancels it.`:n===`profile`?`Profile decision completed.`:n===`approval`?`Decision sent.`:`Text sent.`,!0)}catch(e){R(_,e instanceof _a?e.message:`Outcome uncertain. Check Codex before taking another action; nothing was retried.`,!0)}finally{R(g,!1),R(w,``),await ae(),R(d,[],!0),R(f,null)}}var ye=rs(),be=B(ye),Se=e=>{var t=Nr();Xr(B(t),17,()=>K(O).filter(e=>e.status!==`sent`),e=>e.id,(e,t)=>{var n=qo(),r=z(n),i=V(r,!0),a=H(r,2),s=V(a),c=H(a,2),l=V(c,!0),d=H(c,2),f=V(d,!0),m=H(d,2),h=V(m,!0),v=H(m,2),y=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(_))),Y(e,t)};Z(v,e=>{K(_)&&e(y)});var b=H(v,4),x=H(b,2),S=H(x,2),C=e=>{var n=Go(),r=H(B(n),2),i=H(r,2);U(()=>r.disabled=K(g)||K(A)||!K(t).canSend),q(`click`,r,N),q(`click`,i,()=>{R(p,``),R(w,``)}),Y(e,n)},T=e=>{var n=Ko();U(()=>n.disabled=K(g)||K(A)||!K(t).canSend||o()),q(`click`,n,()=>ve(K(t))),Y(e,n)};Z(S,e=>{K(de)&&K(w)===K(t).id?e(C):e(T,-1)}),P(n),U((e,n)=>{X(i,K(t).status===`uncertain`?`CHECK TRIGGER — outcome uncertain; not retried`:`SCHEDULED FOLLOW-UP`),X(s,`TARGET // ${K(t).session??``}`),X(l,e),X(f,n),X(h,K(t).text),b.disabled=K(g)||!K(u)?.id||K(u).kind!==`prompt`||!!K(u).questions?.length||K(t).status!==`pending`,x.disabled=K(g)||K(t).status===`sending`},[()=>K(t).trigger===`quota`?`After confirmed quota recovery, when idle`:`Not before ${ge(K(t).at)}`,()=>_e(K(t))]),q(`click`,b,()=>ie(K(t))),q(`click`,x,()=>oe(K(t).id)),Y(e,n)}),Y(e,t)},Ce=F(()=>!a()&&K(u)?.kind!==`approval`&&!K(u)?.questions?.length&&![`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``));Z(be,e=>{K(Ce)&&e(Se)});var we=H(be,2),Te=e=>{var r=Es(),o=z(r),s=V(o,!0),c=H(o,2),S=e=>{var t=Jo();xe(2),Y(e,t)};Z(c,e=>{K(u)?.requiredHumanApproval&&!K(A)&&!K(y)&&e(S)});var C=H(c,2),w=e=>{var t=Yo(),n=B(t),r=V(n),i=H(n,6),a=V(i,!0),o=V(H(i,6),!0);xe(2),U(()=>{X(r,`Your ${K(u).profile.threshold??``}% quota threshold has been reached. Review - the profile for subsequent turns.`),X(a,K(u).profile.current),X(o,K(u).profile.proposed)}),Y(e,t)};Z(C,e=>{K(u)?.profile&&!K(A)&&!K(y)&&e(w)});var O=H(C,2),ne=e=>{var t=Xo();let n;var r=V(t,!0);U(()=>{n=li(t,1,`svelte-1oupzfc`,null,n,{notice:!K(v),sent:K(v)}),X(r,K(_))}),Y(e,t)};Z(O,e=>{K(_)&&e(ne)});var ie=H(O,2),ae=e=>{Uo(e,{get lines(){return K(u).fileChanges}})},oe=e=>{Uo(e,{get lines(){return i()}})},ce=e=>{var t=Zo(),n=B(t),r=V(n,!0),i=V(H(n,2),!0);U(()=>{X(r,K(le)?`EXACT COMMAND`:`LAST OBSERVED COMMAND`),X(i,K(ue))}),Y(e,t)},pe=e=>{Y(e,Qo())};Z(ie,e=>{K(u)?.fileChanges?.length&&!K(A)&&!K(y)?e(ae):i().length?e(oe,1):K(ue)?e(ce,2):a()!==`profile`&&K(se)===`APPROVAL NEEDED`&&!K(v)&&e(pe,3)});var _e=H(ie,2),M=e=>{Y(e,$o())},ye=e=>{Y(e,es())},be=e=>{var t=rs(),n=B(t),r=e=>{var t=ts(),n=V(t,!0);U(e=>X(n,e),[()=>K(se)===`WORKING`?`Codex is working — nothing to respond to.`:[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)?`Respond in Codex for this request.`:`Nothing needs a response right now.`]),Y(e,t)};Z(n,e=>{(K(se)===`WORKING`||!K(v)&&!K(g))&&e(r)});var i=H(n,2),a=e=>{Y(e,ns())},o=F(()=>[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(K(se)||``)&&!K(v));Z(i,e=>{K(o)&&e(a)}),Y(e,t)},Se=e=>{var r=Ts(),i=B(r),o=V(i),s=H(i,2),c=z(s),_=V(c,!0),v=H(c,2),y=e=>{var r=Nr();Xr(B(r),17,()=>K(u).choices||[],Kr,(e,r,i)=>{var o=os(),s=z(o);Si(s),s.value=s.__value=i;var c=H(s),l=H(c),u=e=>{var t=is(),n=V(t,!0);U(()=>X(n,K(r).detail)),Y(e,t)};Z(l,e=>{K(r).detail&&e(u)});var d=H(l,2),p=e=>{Y(e,as())};Z(d,e=>{K(r).persistent&&e(p)}),P(o),U(()=>{Q(s,`name`,`decision-`+t.session+`-`+a()),X(c,` ${K(r).label??``} `)}),ki(n,[],s,()=>K(f),e=>R(f,e)),Y(e,o)}),Y(e,r)},b=e=>{var n=rs(),r=B(n),i=e=>{var t=ps(),n=B(t),r=H(z(n)),i=z(r),a=e=>{var t=ss();t.value=t.__value=`now`,Y(e,t)};Z(i,e=>{K(x)||e(a)});var o=H(i);o.value=o.__value=`quota`;var s=H(o);s.value=s.__value=`delay`;var c=H(s);c.value=c.__value=`at`,P(r),hi(r),P(n);var l=H(n,2),u=e=>{var t=cs(),n=H(z(t));Si(n),P(t),Di(n,()=>K(E),e=>R(E,e)),Y(e,t)};Z(l,e=>{K(T)===`delay`&&e(u)});var d=H(l,2),f=e=>{var t=ls(),n=H(z(t));Si(n),P(t),Di(n,()=>K(D),e=>R(D,e)),Y(e,t)};Z(d,e=>{K(T)===`at`&&e(f)});var p=H(d,2),m=e=>{var t=ds(),n=B(t),r=V(n),i=H(n,2),a=e=>{Y(e,us())};Z(i,e=>{K(T)!==`quota`&&e(a)});var o=H(i,2);o.textContent=`Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone??``}. - One pending request per session; saving replaces it. Memory - only; Codexometer must stay running. Uses session model, - reasoning and speed.`,U(e=>X(r,`Will send: ${e??``}`),[()=>K(T)===`quota`?`when quota is available and this session is idle`:Number.isFinite(K(me))?ge(K(me)):`choose a date and time`]),Y(e,t)};Z(p,e=>{K(T)!==`now`&&e(m)});var h=H(p,2),g=e=>{Y(e,fs())};Z(h,e=>{K(x)&&e(g)}),gi(r,()=>K(T),e=>R(T,e)),Y(e,t)};Z(r,e=>{K(u).questions?.length||e(i)}),Xr(H(r,2),17,()=>K(fe),Kr,(e,n,r)=>{var i=bs(),o=B(i),s=e=>{{let n=F(()=>K(d)[0]||``);Li(zo(e,{get session(){return t.session},get oncopy(){return l()},get query(){return K(n)},oncomplete:e=>{R(d,[e],!0),lr().then(()=>K(k)?.focus())},onchange:()=>{R(d,[``],!0),lr().then(()=>K(k)?.focus())}}),e=>R(re,e,!0),()=>K(re))}};Z(o,e=>{r===0&&a()!==`profile`&&K(u).kind===`prompt`&&!K(u).questions?.length&&e(s)});var c=H(o,2),f=z(c),p=H(f),m=e=>{var t=ms();Si(t),Di(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},h=e=>{var t=gs(),i=z(t);i.value=i.__value=``,Xr(H(i),17,()=>K(n).options||[],Kr,(e,t)=>{var n=hs(),r=V(n,!0),i={};U(()=>{X(r,K(t)),i!==(i=K(t))&&(n.value=(n.__value=i)??``)}),Y(e,n)}),P(t),hi(t),gi(t,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)},g=e=>{var t=_s(),i=B(t);tt(i),Li(i,e=>R(k,e),()=>K(k));var a=H(i,2),o=e=>{var t=ts(),r=V(t);U(e=>X(r,`Suggested answers: ${e??``}`),[()=>K(n).options.join(` · `)]),Y(e,t)};Z(a,e=>{K(n).options?.length&&e(o)}),q(`keydown`,i,e=>{K(u)?.kind===`prompt`&&!K(u).questions?.length&&K(re)?.handleKey(e)}),Di(i,()=>K(d)[r],e=>K(d)[r]=e),Y(e,t)};Z(p,e=>{K(n).secret?e(m):K(n).freeText?e(g,-1):e(h,1)}),P(c);var _=H(c,2),v=e=>{var t=ys(),r=H(z(t),4);Xr(r,21,()=>K(n).options||[],Kr,(e,t)=>{var n=vs(),r=V(n,!0);U(()=>X(r,K(t))),Y(e,n)}),P(r),P(t),Y(e,t)};Z(_,e=>{K(n).secret&&!K(n).freeText&&e(v)}),U(()=>X(f,`${K(n).text??``} `)),Y(e,i)}),Y(e,n)};Z(v,e=>{K(u).kind===`approval`||K(u).kind===`profile`?e(y):e(b,-1)}),P(s);var S=H(s,2),C=e=>{var t=Ss(),n=B(t),r=e=>{var t=xs(),n=V(t);U(()=>X(n,`TRIGGER // ${K(te)??``}`)),Y(e,t)};Z(n,e=>{K(ee)&&e(r)});var i=H(n,2),a=V(i),o=H(i,2),s=V(o),c=H(o,2);U(e=>{X(a,`Check the target and ${K(u).kind===`profile`?`profile above`:K(u).kind===`approval`?K(u).fileChanges?.length?`proposed file changes above`:`exact command and permission scope`:`message above`}. ${K(ee)?`This schedules a follow-up that will send automatically when eligible`:`This will send to Codex`}; it may start work using your quota. - Confirmation expires in ${e??``}s.`),o.disabled=K(g)||K(A),X(s,`CONFIRM ${(K(u).kind===`approval`||K(u).kind===`profile`?K(u).choices?.[K(f)]?.label:K(ee)?K(x)?`SAVE CHANGES`:`SCHEDULE`:`SEND`)??``}`)},[()=>Math.max(0,Math.ceil((K(m)-K(h))/1e3))]),q(`click`,o,N),q(`click`,c,()=>{R(p,``)}),Y(e,t)},w=e=>{var t=Cs(),n=B(t),r=e=>{var t=Wo(),n=V(t,!0);U(()=>X(n,K(he))),Y(e,t)};Z(n,e=>{K(he)&&e(r)});var i=H(n,2),a=V(i,!0);U(()=>{i.disabled=K(g)||K(A)||!K(j)||!!K(he),X(a,K(g)?`SENDING…`:$.data?.noConfirm?K(x)?`SAVE CHANGES`:K(u).kind===`approval`||K(u).kind===`profile`?`SEND DECISION`:K(u).kind===`prompt`&&!K(u).questions?.length&&K(T)!==`now`?`SET TRIGGER`:`SEND`:K(x)?`REVIEW CHANGES`:`REVIEW BEFORE SENDING`)}),q(`click`,i,()=>ve()),Y(e,t)};Z(S,e=>{K(de)&&!$.data?.noConfirm?e(C):e(w,-1)});var O=H(S,2),ne=e=>{var t=ws();q(`click`,t,()=>{R(x,!1),R(p,``),R(d,[],!0)}),Y(e,t)};Z(O,e=>{K(x)&&e(ne)}),U(()=>{X(o,`TARGET // ${K(u).thread??``} // ${(K(u).directory||`Directory unavailable`)??``}`),s.disabled=K(g)||K(de)||K(A),X(_,K(u).kind===`approval`||K(u).kind===`profile`?`Choose a decision`:K(x)?`EDIT SCHEDULED FOLLOW-UP`:`Reply to this session`)}),Y(e,r)};Z(_e,e=>{K(A)||K(y)?e(M):K(u)?K(u).id?K(b)!==K(u).id&&e(Se,3):e(be,2):e(ye,1)}),P(r),U(()=>X(s,a()===`profile`?`QUOTA THRESHOLD`:`SESSION CONTROL // EXPERIMENTAL`)),Y(e,r)};Z(we,e=>{!K(ce)&&(!K(ne)||K(x)||a()||K(u)?.kind!==`prompt`||K(u).questions?.length)&&e(Te)}),Y(e,ye),We()}Sr([`click`,`keydown`]);var Os=J(` `);function ks(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=F(()=>n()||!!t.goal?.stale);var i=Nr(),a=B(i),o=e=>{var n=Os();let i;var a=V(n,!0);U((e,o)=>{i=li(n,1,`goal-status svelte-1yfu3xi`,null,i,{stale:K(r),pursuing:!K(r)&&t.goal.status===`active`,blocked:e}),Q(n,`title`,o),X(a,K(r)?`GOAL STALE`:t.goal.label)},[()=>!K(r)&&[`blocked`,`usageLimited`,`budgetLimited`].includes(t.goal.status),()=>t.goal.objective+` -`+t.goal.tokensUsed.toLocaleString()+(t.goal.tokenBudget===null?` tokens`:` / `+t.goal.tokenBudget.toLocaleString()+` tokens`)]),Y(e,n)};Z(a,e=>{t.goal&&e(o)}),Y(e,i),We()}var As=J(` `,1),js=J(`
        `),Ms=J(`

        STATUS LINE // CODEXOMETER

        Choose multiple fields and their order. These display preferences do not - change Codex CLI configuration. Missing values are omitted.

        `),Ns=J(`

        `,1);function Ps(e,t){Ue(t,!0);let n=Gi(t,`stale`,3,!1),r=L(Yt([])),i=L(!1),a=F(()=>$.data?.statusLineFields||[]),o=e=>[...new Set(e??K(a).filter(e=>e.default).map(e=>e.id))].filter(e=>K(a).some(t=>t.id===e)),s=e=>o(e).map(e=>e===`run-state`&&(n()||!$.connected||$.data?.sessionsError)?`STALE`:t.session.statusLine?.[e]).filter(Boolean).join(` · `),c=F(()=>[...K(r).map(e=>K(a).find(t=>t.id===e)).filter(Boolean),...K(a).filter(e=>!K(r).includes(e.id))]);vn(()=>{sa.open&&!K(i)?(R(r,o(oa.statusLine),!0),R(i,!0)):sa.open||R(i,!1)});function l(e,t){R(r,t?[...K(r),e]:K(r).filter(t=>t!==e),!0)}function u(e,t){let n=K(r).indexOf(e),i=n+t;if(n<0||i<0||i>=K(r).length)return;let a=[...K(r)];[a[n],a[i]]=[a[i],a[n]],R(r,a,!0)}var d=Ns(),p=B(d),m=e=>{var t=Ms(),n=H(z(t),4);Xr(n,21,()=>K(c),e=>e.id,(e,t)=>{var n=js(),i=z(n),a=z(i);Si(a);var o=H(a,1,!0),s=V(H(o),!0);P(i);var c=H(i,2),d=e=>{var n=As(),i=B(n),a=H(i,2);U((e,n)=>{Q(i,`aria-label`,`Move `+K(t).label+` earlier`),i.disabled=e,Q(a,`aria-label`,`Move `+K(t).label+` later`),a.disabled=n},[()=>K(r).indexOf(K(t).id)===0,()=>K(r).indexOf(K(t).id)===K(r).length-1]),q(`click`,i,()=>u(K(t).id,-1)),q(`click`,a,()=>u(K(t).id,1)),Y(e,n)},f=F(()=>K(r).includes(K(t).id));Z(c,e=>{K(f)&&e(d)}),P(n),U(e=>{Q(i,`title`,K(t).help),Ci(a,e),X(o,K(t).label),X(s,K(t).help)},[()=>K(r).includes(K(t).id)]),q(`change`,a,e=>l(K(t).id,e.currentTarget.checked)),Y(e,n)}),P(n);var i=H(n,2),a=V(i),o=H(i,2),d=H(o,2);P(t),U(e=>X(a,`Preview // ${e??``}`),[()=>s(K(r))||`—`]),q(`click`,o,()=>{oa.statusLine=[...K(r)],la(),sa.open=!1}),q(`click`,d,()=>{sa.open=!1}),Y(e,t)};Z(p,e=>{sa.open&&e(m)});var h=H(p,2),g=z(h),_=V(g,!0),v=H(g,2);{let e=F(()=>n()||!$.connected||!!$.data?.sessionsError);ks(v,{get goal(){return t.session.goal},get stale(){return K(e)}})}var y=H(v,2);ni(H(y,2),()=>t.children??f),P(h),U((e,t)=>{Q(g,`title`,e),X(_,t)},[()=>s(oa.statusLine),()=>s(oa.statusLine)]),q(`click`,y,()=>{sa.open=!sa.open}),Y(e,d),We()}Sr([`change`,`click`]);var Fs=J(`
        `);function Is(e,t){Ue(t,!0);let n=Gi(t,`active`,3,!1),r=Gi(t,`compact`,3,!1),i=F(()=>oo(t.session)),a=F(()=>!!K(i)),o=L(!1),s=L(``),c=L(!1);vn(()=>{if(!K(c))return;let e=setTimeout(()=>{R(c,!1)},150);return()=>clearTimeout(e)}),vn(()=>{K(i),t.session.status,R(s,``)});async function l(){if(!K(a)||K(o))return;let e=K(i);R(o,!0),R(c,!0),R(s,``);try{await navigator.clipboard.writeText(e),K(i)===e&&R(s,`Copied.`)}catch{K(i)===e&&R(s,`Clipboard unavailable. Select the visible text and copy it manually.`)}finally{R(o,!1)}}function u(e){!n()||!K(a)||e.defaultPrevented||e.repeat||e.ctrlKey||e.metaKey||e.altKey||e.key.toLowerCase()!==`c`||e.target instanceof Element&&e.target.closest(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),l())}var d={copy:l},f=Nr();xr(`keydown`,Qt,u);var p=B(f),m=e=>{var t=Fs();let n;var i=z(t),a=V(i,!0),u=H(i,2);let d;P(t),U(()=>{n=li(t,1,`session-copy svelte-543j00`,null,n,{compact:r()}),X(a,K(s)),u.disabled=K(o),d=li(u,1,`svelte-543j00`,null,d,{flashed:K(c)})}),q(`click`,u,l),Y(e,t)};return Z(p,e=>{K(a)&&e(m)}),Y(e,f),We(d)}Sr([`click`]);var Ls=J(`

         
        `,1),Rs=J(`

        LATEST GUIDANCE

         
        `,1),zs=J(`

        CONTEXT

         

        `,1),Bs=J(`

        `),Vs=J(`

        `),Hs=J(`
         
        `),Us=J(`

         
        `,1),Ws=J(`
         
        `),Gs=J(`

        Command unavailable from this observation. Open Codex to inspect the - request.

        `),Ks=J(`

        `,1),qs=J(`

        `),Js=J(` `,1),Ys=J(`
        `),Xs=J(`

        Session connection or refresh unavailable. Context and telemetry may be - stale.

        `),Zs=J(`

        Some quota profile checks are unavailable. Only sessions with freshly - verified quota and settings can be updated; previous outcome notices remain - visible.

        `),Qs=J(` `),$s=J(` `),ec=J(` `),tc=J(``),nc=J(`

        Read only — reply or approve in Codex.

        `),rc=J(`

        `),ic=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),ac=J(`
        `),oc=J(` `,1),sc=J(`
        `),cc=J(`

        This session is no longer in the current observation. Return to sessions.

        `),lc=J(`

        `),uc=J(``),dc=J(`

        `),fc=J(` `),pc=J(`

        `),mc=J(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),hc=J(`

        `),gc=J(`

        TOKEN ACTIVITY // 30 SECOND SAMPLES

        `),_c=J(`

        TOKENS

        FULL DETAIL →
        `),vc=J(`

        No locally observed sessions yet. Keep Codex running alongside - Codexometer.

        `),yc=J(`

        ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

        `,1),bc=J(`

        SESSION TOTALS

        `,1);function xc(e,t){Ue(t,!0);let n=(e,t=f,n,r)=>{let i=pt(()=>g(n?.(),!0)),a=pt(()=>g(r?.(),!1));var o=Js(),s=B(o),c=e=>{var n=Ls(),r=B(n),i=V(r,!0),a=V(H(r,2),!0);U(()=>{X(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),X(a,t().currentTask)}),Y(e,n)};Z(s,e=>{t().currentTask&&e(c)});var l=H(s,2),u=e=>{var n=Rs(),r=V(H(B(n),2),!0);U(()=>X(r,t().latestGuidance)),Y(e,n)};Z(l,e=>{t().latestGuidance&&e(u)});var d=H(l,2),p=e=>{var n=zs(),r=V(H(B(n),2),!0);xe(2),U(()=>X(r,t().approvalContext)),Y(e,n)};Z(d,e=>{K(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=H(d,2),h=e=>{var n=Bs();let r;var i=V(n,!0);U(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),X(i,e)},[()=>D(t())]),Y(e,n)},_=F(()=>D(t())&&(!K(a)||K(v)||t().status===`CHECK SESSION`||y(t())));Z(m,e=>{K(_)&&e(h)});var b=H(m,2),x=e=>{var n=Vs(),r=V(n,!0);U(e=>X(r,e),[()=>ee(t())]),Y(e,n)};Z(b,e=>{K(i)&&e(x)});var S=H(b,2),C=e=>{var n=Hs(),r=V(n,!0);U(()=>X(r,t().text||`No session context available.`)),Y(e,n)};Z(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=H(S,2),T=e=>{var n=Us(),r=H(B(n),2),i=z(r),a=H(i),o=e=>{var n=Mr();U(()=>X(n,`// ${t().commandTiming??``}`)),Y(e,n)};Z(a,e=>{t().commandTiming&&e(o)});var s=H(a,2),c=e=>{var n=Mr();U(()=>X(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),Y(e,n)};Z(s,e=>{!K(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=H(s,2),u=e=>{Y(e,Mr(`+`))};Z(l,e=>{t().runningLimited&&e(u)}),P(r);var d=V(H(r,2),!0);U(e=>{X(i,`COMMAND // ${e??``} `),X(d,t().workingCommand)},[()=>K(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),Y(e,n)};Z(w,e=>{t().workingCommand&&e(T)});var E=H(w,2),te=e=>{Uo(e,{get lines(){return t().fileChanges}})},O=e=>{var n=Ks(),r=H(B(n),2),i=V(r,!0),a=H(r,2),o=e=>{var n=Ws(),r=V(n,!0);U(()=>X(r,t().command)),Y(e,n)},s=e=>{Y(e,Gs())};Z(a,e=>{t().command?e(o):e(s,-1)}),U(()=>X(i,K(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),Y(e,n)};Z(E,e=>{(!K(a)||!$.data?.control)&&t().fileChanges?.length?e(te):K(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(O,1)});var ne=H(E,2),k=e=>{var n=qs(),r=V(n);U(()=>X(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),Y(e,n)};Z(ne,e=>{K(a)||e(k)}),Y(e,o)},r=L(void 0),i=Gi(t,`params`,19,()=>({})),a=F(()=>$.data?.sessions||[]),o=F(()=>$.data?.control&&$.data.profiles||[]),s=F(()=>($.data?.triggers||[]).filter(e=>K(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&K(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=L(!1);function d(e,t){i().id&&i().id!==t&&K(u)?e.preventDefault():w(t)}vn(()=>{let e=i().id;e&&fr(()=>{oa.selected=e,pa(e,2)})});let p=F(()=>K(a).find(e=>e.id===i().id)),m=F(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&K(o).some(e=>e.session===i().id&&e.pending)),h=F(()=>K(a).some(e=>e.id===oa.selected)?oa.selected:K(a)[0]?.id),v=F(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=F(()=>[[`OBSERVED TOKENS`,ma(K(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(K(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,K(v)?`—`:ma(K(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=F(()=>K(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=F(()=>K(a).filter(e=>e.status===`TURN COMPLETE`&&!K(s).some(t=>t.session===e.id)&&!K(o).some(t=>t.session===e.id&&t.pending)));function w(e){oa.selected=e,lr().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function T(e,t){if(w(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;n>2?location.hash=`/sessions/`+encodeURIComponent(e):pa(e,n)}function E(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),T(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||K(h)))e.preventDefault(),T(i().id||K(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&K(a).length){e.preventDefault();let t=K(a).findIndex(e=>e.id===K(h));w(K(a)[Math.max(0,Math.min(K(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function D(e){return K(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ee(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var te=bc();xr(`keydown`,Qt,E);var O=B(te),ne=V(H(z(O),2));P(O);var k=H(O,2);let re;Xr(k,21,()=>K(b),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1];var a=Ys();let o;var s=z(a),c=V(s,!0),l=V(H(s,2),!0);P(a),U(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),X(c,r()),X(l,i())}),Y(e,a)}),P(k);var ie=H(k,2),ae=V(ie),oe=H(ie,2),se=e=>{Y(e,Xs())};Z(oe,e=>{K(v)&&e(se)});var A=H(oe,2),ce=e=>{Y(e,Zs())};Z(A,e=>{$.data?.profileError&&e(ce)});var le=H(A,2),ue=e=>{var t=tc(),n=z(t);Xr(n,17,()=>K(x),Kr,(e,t)=>{var n=Qs();let r;var i=V(n);U((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),X(i,`${K(t).status??``} - ${o??``} // ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>K(t).status===`APPROVAL NEEDED`||K(t).status===`INPUT NEEDED`||y(K(t)),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)});var r=H(n,2);Xr(r,17,()=>K(o).filter(e=>e.pending&&K(a).some(t=>t.id===e.session)),Kr,(e,t)=>{var n=$s(),r=V(n);U((e,a,o)=>{Q(n,`title`,i().id&&i().id!==K(t).session&&K(u)?`Finish sending or clear your current draft before switching sessions.`:`Review this session’s quota threshold`),Q(n,`href`,e),X(r,`QUOTA THRESHOLD ${a??``} // ${o??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session)+`?review=profile`,()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory||K(t).session]),q(`click`,n,e=>d(e,K(t).session)),Y(e,n)});var l=H(r,2);Xr(l,17,()=>K(C),Kr,(e,t)=>{var n=ec(),r=V(n);U((e,i)=>{Q(n,`href`,e),X(r,`TURN COMPLETE ${i??``} // - ${(K(t).name||K(t).directory||K(t).id)??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,n,()=>w(K(t).id)),Y(e,n)}),Xr(H(l,2),17,()=>K(s),Kr,(e,t)=>{var n=ec(),r=V(n);U((e,t,i)=>{Q(n,`href`,e),X(r,`TRIGGER SET ${t??``} // ${i??``}`)},[()=>`#/sessions/`+encodeURIComponent(K(t).session),()=>Array.from(K(t).session).slice(-5).join(``).toUpperCase(),()=>K(a).find(e=>e.id===K(t).session)?.name||K(a).find(e=>e.id===K(t).session)?.directory]),q(`click`,n,e=>c(e,K(t).session)),Y(e,n)}),P(t),Y(e,t)},de=F(()=>(K(x).length||K(C).length||K(o).some(e=>e.pending)||K(s).length)&&!K(v));Z(le,e=>{K(de)&&e(ue)});var fe=H(le,2),j=e=>{var t=Nr(),a=B(t),s=e=>{var t=sc(),a=z(t),s=z(a);let c;var d=z(s);let f;var h=H(d);P(s);var g=H(s,2);P(a);var _=H(a,2),b=e=>{var t=qs(),n=V(t,!0);U(()=>X(n,K(p).directory)),Y(e,t)};Z(_,e=>{K(p).name&&K(p).directory&&e(b)});var x=H(_,2),S=V(x),C=H(x,2);let T;var E=z(C),D=z(E);n(D,()=>K(p),()=>!0,()=>!0),P(E);var ee=H(E,2),te=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{{let t=F(()=>new URLSearchParams(Xi.querystring).get(`schedule`)===`edit`),n=F(()=>K(p).fileChanges||[]);Ds(e,{get session(){return K(p).id},oncopy:()=>K(r)?.copy(),get openScheduler(){return K(t)},get observedCommand(){return K(p).command},get observedFileChanges(){return K(n)},get suspended(){return K(m)},onProtectedChange:e=>{R(u,e,!0)}})}}),Y(e,t)},O=e=>{var t=nc();Gr(H(z(t),2),()=>K(p).id,e=>{zo(e,{get session(){return K(p).id},localOnly:!0,oncopy:()=>K(r)?.copy()})}),P(t),Y(e,t)};Z(ee,e=>{$.data?.control?e(te):e(O,-1)}),P(C);var ne=H(C,2);Xr(ne,17,()=>K(o).filter(e=>e.session===K(p).id),e=>e.session,(e,t)=>{var n=ac(),r=z(n),i=e=>{var n=rc(),r=V(n,!0);U(()=>X(r,K(t).notice)),Y(e,n)};Z(r,e=>{K(t).notice&&e(i)});var a=H(r,2),o=e=>{Ds(e,{get session(){return K(p).id},review:`profile`})},s=e=>{var t=ic();U(e=>Q(t,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(p).id)+`?review=profile`]),Y(e,t)};Z(a,e=>{K(t).pending&&K(m)?e(o):K(t).pending&&e(s,1)}),P(n),U(()=>Q(n,`id`,`quota-profile-`+K(p).id)),Y(e,n)});var k=H(ne,2),re=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Ps(e,{get session(){return K(p)},get stale(){return K(v)},children:e=>{var t=Nr(),n=B(t),i=e=>{Li(Is(e,{get session(){return K(p)},active:!0,compact:!0}),e=>R(r,e,!0),()=>K(r))};Z(n,e=>{K(m)||e(i)}),Y(e,t)},$$slots:{default:!0}})}),Y(e,t)},ie=e=>{var t=oc(),n=B(t),i=e=>{var t=Nr();Gr(B(t),()=>K(p).id,e=>{Li(Is(e,{get session(){return K(p)},active:!0}),e=>R(r,e,!0),()=>K(r))}),Y(e,t)};Z(n,e=>{K(m)||e(i)}),Gr(H(n,2),()=>K(p).id,e=>{Ps(e,{get session(){return K(p)},get stale(){return K(v)}})}),Y(e,t)};Z(k,e=>{K(p).goal?e(re):e(ie,-1)}),P(t),U((e,t,n,r)=>{c=li(s,1,`svelte-mm4wfe`,null,c,{failed:e}),f=li(d,1,`lamp lit svelte-mm4wfe`,null,f,{failed:t,working:K(p).status===`WORKING`&&!K(v)}),X(h,`${n??``} // ${(K(p).name||K(p).directory)??``}`),X(S,`${r??``} TOKENS // ${K(p).id??``} // CONTEXT SOURCE // ${(K(p).source||`LOCAL`)??``}`),T=di(C,``,T,{display:K(m)?`none`:void 0})},[()=>y(K(p))&&!K(v)&&!K(m),()=>y(K(p))&&!K(v),()=>K(v)?`STALE`:K(m)?`QUOTA THRESHOLD`:l(K(p)),()=>ma(K(p).tokens)]),q(`click`,g,()=>{w(i().id),pa(i().id,2)}),Y(e,t)},c=e=>{Y(e,cc())};Z(a,e=>{K(p)?e(s):e(c,-1)}),Y(e,t)},pe=e=>{var t=yc(),r=B(t),i=H(z(r),2),s=z(i),c=H(s,2);P(i),P(r);var u=H(r,2);Xr(u,17,()=>K(a),e=>e.id,(e,t)=>{let r=F(()=>da(K(t).id));var i=_c();let a;var s=z(i),c=z(s),u=e=>{var n=lc(),r=z(n),i=V(r);P(n),U(e=>{Q(r,`aria-pressed`,K(h)===K(t).id),X(i,`${e??``} // ${K(t).name??``}`)},[()=>Array.from(K(t).id).slice(-5).join(``).toUpperCase()]),q(`click`,r,()=>w(K(t).id)),Y(e,n)};Z(c,e=>{K(t).name&&e(u)});var f=H(c,2),p=z(f);let m;var g=z(p);let _;var b=H(g,1,!0);P(p),P(f);var x=H(f,2),S=e=>{var n=uc(),r=V(n,!0);U(()=>{Q(n,`aria-pressed`,K(h)===K(t).id),X(r,K(t).directory||K(t).id)}),q(`click`,n,()=>w(K(t).id)),Y(e,n)};Z(x,e=>{K(t).name||e(S)});var C=H(x,2),E=z(C);xe(),P(C);var D=H(C,2),te=e=>{var n=qs(),r=V(n,!0);U(()=>X(r,K(t).directory)),Y(e,n)};Z(D,e=>{K(t).name&&K(t).directory&&e(te)});var O=H(D,2),ne=V(O),k=H(O,2),re=V(k),ie=H(k,2);ks(ie,{get goal(){return K(t).goal},get stale(){return K(v)}});var ae=H(ie,2),oe=z(ae),se=H(oe,2),A=V(se,!0),ce=H(se,2);P(ae);var le=H(ae,2),ue=H(le,2),de=e=>{var n=dc(),r=V(n,!0);U(e=>X(r,e),[()=>K(t).status===`CHECK SESSION`?`INFERRED INACTIVITY`:y(K(t))?`OPEN DETAIL FOR THE TURN ERROR`:$.data?.control?`OPEN FULL DETAIL OR REPLY IN CODEX`:K(t).status===`APPROVAL NEEDED`?`APPROVE OR DECLINE IN CODEX`:`REPLY IN CODEX`]),Y(e,n)},fe=F(()=>!K(v)&&([`APPROVAL NEEDED`,`INPUT NEEDED`,`CHECK SESSION`].includes(K(t).status)||y(K(t))));Z(ue,e=>{K(fe)&&e(de)}),P(s);var j=H(s,2),pe=e=>{var r=hc(),i=z(r),a=z(i),s=V(a,!0),c=H(a,2),l=e=>{var n=fc(),r=V(n,!0);U(e=>{Q(n,`href`,e),X(r,$.data?.control?`REVIEW IN FULL DETAIL ↗`:`APPROVAL IN CODEX ↗`)},[()=>`#/sessions/`+encodeURIComponent(K(t).id)]),Y(e,n)};Z(c,e=>{!K(v)&&K(t).status===`APPROVAL NEEDED`&&e(l)}),P(i);var u=H(i,2);n(u,()=>K(t),()=>!1);var f=H(u,2);Xr(f,17,()=>K(o).filter(e=>e.session===K(t).id),Kr,(e,n)=>{var r=oc(),i=B(r),a=e=>{var t=pc(),r=V(t,!0);U(()=>X(r,K(n).notice)),Y(e,t)};Z(i,e=>{K(n).notice&&e(a)});var o=H(i,2),s=e=>{var n=mc();U(e=>Q(n,`href`,e),[()=>`#/sessions/`+encodeURIComponent(K(t).id)+`?review=profile`]),q(`click`,n,e=>d(e,K(t).id)),Y(e,n)};Z(o,e=>{K(n).pending&&e(s)}),Y(e,r)});var p=H(f,2);{let e=F(()=>K(h)===K(t).id);Is(p,{get session(){return K(t)},get active(){return K(e)}})}P(r),U(e=>X(s,e),[()=>ee(K(t))]),Y(e,r)};Z(j,e=>{K(r)>0&&e(pe)});var me=H(j,2),he=e=>{var n=gc(),r=H(z(n),2);{let e=F(()=>(K(t).samples||[]).map(e=>e.tokens));ao(r,{get values(){return K(e)},capacity:120})}var i=V(H(r,2));P(n),U(()=>X(i,`LAST ${(K(t).samples?.length||0)??``} SAMPLES // AUTO SCALE`)),Y(e,n)};Z(me,e=>{K(r)<2&&e(he)}),P(i),U((e,n,o,s,c,l,u)=>{a=li(i,1,`session-row`,null,a,{selected:K(h)===K(t).id,wide:K(r)===2,split:K(r)===1}),Q(i,`aria-label`,`Session `+(K(t).name||K(t).directory||K(t).id)),m=li(p,1,`status-detail svelte-mm4wfe`,null,m,{failed:e}),Q(p,`href`,n),_=li(g,1,`lamp lit svelte-mm4wfe`,null,_,{failed:o,working:K(t).status===`WORKING`&&!K(v)}),X(b,s),X(E,`${c??``} `),X(ne,`${K(t).agents??``} LINKED AGENTS`),X(re,`ACTIVE // ${l??``}`),oe.disabled=K(r)===0,Q(se,`aria-expanded`,K(r)>0),X(A,K(r)?`HIDE DETAIL`:`SHOW DETAIL`),Q(le,`href`,u)},[()=>y(K(t))&&!K(v),()=>`#/sessions/`+encodeURIComponent(K(t).id),()=>y(K(t))&&!K(v),()=>K(v)?`STALE`:l(K(t)),()=>ma(K(t).tokens),()=>ha(K(t).activity),()=>`#/sessions/`+encodeURIComponent(K(t).id)]),q(`click`,p,()=>w(K(t).id)),q(`click`,oe,()=>T(K(t).id,-1)),q(`click`,se,()=>{w(K(t).id),pa(K(t).id,+!K(r))}),q(`click`,ce,()=>T(K(t).id,1)),q(`click`,le,()=>w(K(t).id)),Y(e,i)});var f=H(u,2),p=e=>{Y(e,vc())};Z(f,e=>{K(a).length||e(p)}),q(`click`,s,()=>fa(1)),q(`click`,c,()=>fa(0)),Y(e,t)};Z(fe,e=>{i().id?e(j):e(pe,-1)}),U(e=>{X(ne,`OBSERVED ${e??``}`),re=li(k,1,`session-totals`,null,re,{stale:K(v)}),X(ae,`${K(v)?`LAST KNOWN TOTALS — live state counts unavailable. `:``}Tokens - observed since this server started for currently listed sessions; linked - agents are already included. Totals can decrease when a session leaves the - list. History samples every 30 seconds. Not account-wide totals.`)},[()=>ha($.data?.sessionsAt)]),Y(e,te),We()}Sr([`click`]);var Sc=J(``),Cc=J(`

        `),wc=J(`

        Relative usage/credits are not tokens or quota percentages. Groupings - describe the same usage, not additional consumption.

        `,1),Tc=J(`// APPROXIMATE`),Ec=J(`

        Partial accounting: totals may still change.

        `),Dc=J(`

        Percentage of this period's historical allowance, not today's limit. May - exceed 100%. This is not a manual/automatic reset log.

        `,1),Oc=J(`

        `,1),kc=J(`

        This optional account report is unavailable. Token history remains - available; missing data does not mean zero usage.

        `),Ac=J(`
        `),jc=J(`
        `),Mc=J(`

        No usage reported for this day.

        `),Nc=J(`

        Selected breakdown unavailable; missing does not mean zero.

        `),Pc=J(`

        `,1);function Fc(e,t){Ue(t,!0);let n=L(Yt(co[0])),r=L(0),i=F(()=>t.reports?.daily),a=F(()=>t.reports?.plan),o=F(()=>t.mode===`breakdown`?K(i)?.days?.length||0:K(a)?.periods?.length||0),s=F(()=>Math.min(K(r),Math.max(0,K(o)-1))),c=F(()=>K(i)?.days?.[(K(i)?.days?.length||0)-1-K(s)]),l=F(()=>K(a)?.periods?.[K(s)]),u=F(()=>t.mode===`breakdown`?K(i)?.units||``:`%`),d=F(()=>(t.mode===`breakdown`?K(c):K(l))?.views?.[K(n)]),f=F(()=>K(d)?.rows||[]),p=F(()=>K(d)?.total),m=F(()=>K(d)?.level||`unknown`),h=F(()=>K(d)?.peak||1),g=e=>e==null?`UNKNOWN`:e.toLocaleString(`en-GB`,{maximumFractionDigits:2});var _=Pc(),v=B(_),y=z(v),b=H(z(y));Xr(b,21,()=>co,Kr,(e,t)=>{var n=Sc(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).charAt(0).toUpperCase()+K(t).slice(1)]),Y(e,n)}),P(b),hi(b),P(y);var x=H(y,2),S=H(x,2),C=V(H(S,2),!0);P(v);var w=H(v,2),T=z(w),E=V(T,!0),D=H(T,2),ee=V(D),te=H(D,2),O=e=>{var t=wc(),n=B(t),r=V(n),a=H(n,2),o=e=>{var t=Cc(),n=V(t);U(()=>X(n,`Data as of ${K(i).dataAsOf??``}`)),Y(e,t)};Z(a,e=>{K(i).dataAsOf&&e(o)});var s=V(H(a,2));xe(2),U((e,t)=>{X(r,`Latest fetch ${e??``} // queried ${K(i).from??``} → ${K(i).through??``}. - Reports are fetched from OpenAI and are not saved between runs.`),X(s,`${(K(c)?.date||`No daily buckets reported`)??``} // ${t??``} - ${K(u)??``}`)},[()=>ha(K(i).fetchedAt),()=>g(K(p))]),Y(e,t)},ne=e=>{var t=Oc(),n=B(t),r=z(n);let i;var o=V(r,!0),s=H(r),c=e=>{Y(e,Tc())};Z(s,e=>{K(a).approximate&&e(c)});var u=H(s);P(n);var d=H(n,2),f=z(d),h=H(f),_=e=>{var t=Mr();U(()=>X(t,`// Boundary tolerance ${K(a).boundary_tolerance_seconds??``}s`)),Y(e,t)};Z(h,e=>{K(a).boundary_tolerance_seconds!=null&&e(_)}),P(d);var v=H(d,2),y=e=>{var t=Dc(),n=B(t),r=z(n),i=H(r);let a;var o=V(i);P(n);var s=H(n,2),c=V(s),u=H(s,2),d=e=>{Y(e,Ec())};Z(u,e=>{K(l).accounting_complete||e(d)}),xe(2),U(e=>{X(r,`${K(l).window_minutes??``} MIN // ${K(l).plan_type??``} // `),a=li(i,1,`svelte-1fbui7h`,null,a,{muted:K(m)===`unknown`,"quota-near":K(m)===`near`,"quota-full":K(m)===`full`}),X(o,`USED ${e??``}${K(p)==null?``:`%`}`),X(c,`${K(l).starts_at??``} → ${K(l).ends_at??``}`)},[()=>g(K(p))]),Y(e,t)};Z(v,e=>{K(l)&&e(y)}),U(e=>{i=li(r,1,`svelte-1fbui7h`,null,i,{"quality-warning":!K(a).coverage_complete}),X(o,K(a).coverage_complete?`Reported range complete`:`Partial coverage`),X(u,` // Latest fetch ${e??``}`),X(f,`Coverage starts ${(K(a).coverage_start||`unknown`)??``} // Data as of ${(K(a).data_as_of||`unknown`)??``}`)},[()=>ha(K(a).fetchedAt)]),Y(e,t)},k=e=>{Y(e,kc())};Z(te,e=>{t.mode===`breakdown`&&K(i)?e(O):t.mode===`periods`&&K(a)?e(ne,1):e(k,-1)});var re=H(te,2),ie=e=>{var n=jc(),r=z(n),i=V(H(z(r),2),!0);P(r),Xr(H(r,2),17,()=>K(f),Kr,(e,n,r)=>{let i=()=>K(n).name,a=()=>K(n).value;var o=Ac();let s;var c=z(o),l=V(c,!0),u=H(c,2),d=z(u);let f;P(u);var p=V(H(u,2));P(o),U((e,n,a)=>{s=li(o,1,`report-row svelte-1fbui7h`,null,s,{unknown:e,alternate:r%2==1}),Q(c,`title`,i()),X(l,i()),f=di(d,``,f,{width:n}),X(p,`${a??``}${t.mode===`periods`?`%`:``}`)},[()=>i().trim().toLowerCase()===`unknown`,()=>`${Math.max(0,100*a()/K(h))}%`,()=>g(a())]),Y(e,o)}),P(n),U(()=>X(i,t.mode===`breakdown`?K(u):`QUOTA USED`)),Y(e,n)},ae=e=>{Y(e,Mc())},oe=e=>{Y(e,Nc())};Z(re,e=>{K(f).length?e(ie):t.mode===`breakdown`&&K(d)?.knownEmpty?e(ae,1):(K(i)&&t.mode===`breakdown`||K(a)&&t.mode===`periods`)&&e(oe,2)}),P(w),U(()=>{x.disabled=K(s)>=K(o)-1,S.disabled=K(s)===0,X(C,K(o)?`${K(s)+1} / ${K(o)}`:`NO DATA`),X(E,t.mode===`breakdown`?`DAILY BREAKDOWN`:`QUOTA WINDOWS`),X(ee,`${(t.mode===`breakdown`?t.reports?.dailyStatus||`UNAVAILABLE`:t.reports?.planStatus||`UNAVAILABLE`)??``} // UTC`)}),gi(b,()=>K(n),e=>R(n,e)),q(`click`,x,()=>R(r,K(s)+1)),q(`click`,S,()=>R(r,K(s)-1)),Y(e,_),We()}Sr([`click`]);var Ic=864e5;function Lc(e,t){let n=new Date(e);n.setUTCDate(1),n.setUTCMonth(n.getUTCMonth()+t);let r=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,0)).getUTCDate();return n.setUTCDate(Math.min(e.getUTCDate(),r)),n}function Rc(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()));for(let e=0;;e++){let i=Lc(r,-t),a=new Date(i.getTime()+Ic);if(e===n)return{start:a,end:r};r=i}}var zc=J(``),Bc=J(``,1),Vc=J(`

        History refresh failed. Any displayed history is the last successful - observation.

        `),Hc=J(`

        Token history unavailable; other reports may still be available.

        `),Uc=J(``),Wc=J(`
        `),Gc=J(`

        LESS ░ ▒ ▓ █ MORE // HOVER FOR DATE AND TOKENS

        `,1),Kc=J(`
        `,1),qc=J(` `),Jc=J(`

        LIFETIME TOKENS

        PEAK DAY

        CURRENT STREAK

        DAYS

        LONGEST TURN

        SECONDS

        LONGEST STREAK

        DAYS

        OPENAI // UTC

        Accessible data table
        Date (UTC)Tokens

        `,1),Yc=J(`

        History unavailable or awaiting a matching account observation. Missing - history is not treated as zero usage.

        `),Xc=J(`

        USAGE // ACCOUNT HISTORY

        Account-wide history reported by Codex, not the local Sessions counter. Dates - use UTC. Allowance history is approximate where indicated; reset causes are - not provided.

        `,1);function Zc(e,t){Ue(t,!0);let n=L(`daily`),r=L(12),i=L(0),a=F(()=>{let e=$.data?.usage?.dailyUsageBuckets;if(!e)return[];let{start:t,end:n}=Rc(new Date,K(r),K(i)),a=new Map;for(let t of e)!Number.isFinite(t.tokens)||t.tokens<0||a.set(t.startDate,(a.get(t.startDate)||0)+t.tokens);let o=[];for(let e=t;e<=n;e=new Date(e.getTime()+864e5)){let t=e.toISOString().slice(0,10);o.push({date:t,tokens:a.get(t)||0})}return o}),o=F(()=>Math.max(1,...K(a).map(e=>e.tokens))),s=F(()=>K(a).length?new Date(K(a)[0].date+`T00:00:00Z`).getUTCDay():0),c=F(()=>{if(K(n)===`monthly`){let e=new Map;for(let t of K(a))e.set(t.date.slice(0,7),(e.get(t.date.slice(0,7))||0)+t.tokens);return[...e].map(([e,t])=>({date:e,tokens:t}))}let e=0;return K(a).map(t=>({date:t.date,tokens:e+=t.tokens}))});var l=Xc(),u=H(B(l),4);Xr(u,20,()=>[[`daily`,`Daily`],[`monthly`,`Monthly`],[`cumulative`,`Cumulative`],[`breakdown`,`Breakdown`],[`periods`,`Windows`]],Kr,(e,t)=>{var r=F(()=>_(t,2));let a=()=>K(r)[0],o=()=>K(r)[1];var s=zc();let c;var l=V(s,!0);U(()=>{Q(s,`aria-pressed`,K(n)===a()),c=li(s,1,``,null,c,{active:K(n)===a()}),X(l,o())}),q(`click`,s,()=>{R(n,a(),!0),R(i,0)}),Y(e,s)}),P(u);var d=H(u,2),f=z(d),p=e=>{var t=Bc(),n=B(t),a=H(z(n)),o=z(a);o.value=o.__value=6;var s=H(o);s.value=s.__value=12,P(a),hi(a),P(n);var c=H(n),l=H(c);U(()=>l.disabled=K(i)===0),q(`change`,a,()=>R(i,0)),gi(a,()=>K(r),e=>R(r,e)),q(`click`,c,()=>Kt(i)),q(`click`,l,()=>Kt(i,-1)),Y(e,t)};Z(f,e=>{K(n)!==`breakdown`&&K(n)!==`periods`&&e(p)}),P(d);var m=H(d,2),h=e=>{Y(e,Vc())};Z(m,e=>{$.data?.usageError&&e(h)});var g=H(m,2),v=e=>{Y(e,Hc())};Z(g,e=>{$.data?.usage?.tokenStatus===`UNAVAILABLE`&&K(n)!==`breakdown`&&K(n)!==`periods`&&e(v)});var y=H(g,2),b=e=>{var t=Nr();Gr(B(t),()=>K(n),e=>{{let t=F(()=>$.data?.usage?.reports);Fc(e,{get reports(){return K(t)},get mode(){return K(n)}})}}),Y(e,t)},x=e=>{var t=Jc(),r=B(t),i=z(r),l=V(H(z(i),2),!0);P(i);var u=H(i,2),d=V(H(z(u),2),!0);P(u);var f=H(u,2),p=H(z(f),2),m=z(p);xe(),P(p),P(f);var h=H(f,2),g=H(z(h),2),_=z(g);xe(),P(g),P(h);var v=H(h,2),y=H(z(v),2),b=z(y);xe(),P(y),P(v),P(r);var x=H(r,4),S=z(x),C=V(S),w=H(S,2),T=e=>{var t=Gc(),n=B(t),r=z(n),i=z(r);Xr(i,17,()=>Array(K(s)),Kr,(e,t)=>{Y(e,Uc())}),Xr(H(i,2),17,()=>K(a),Kr,(e,t)=>{var n=Wc();let r,i;U(e=>{r=li(n,1,`heat-cell`,null,r,{zero:K(t).tokens===0}),Q(n,`title`,e),i=di(n,``,i,{opacity:K(t).tokens?.25+.75*K(t).tokens/K(o):1})},[()=>`${K(t).date}: ${ma(K(t).tokens)} tokens`]),Y(e,n)}),P(r),P(n),xe(2),Y(e,t)},E=e=>{var t=Kc(),r=B(t);{let e=F(()=>K(c).map(e=>e.tokens)),t=F(()=>K(n)+` usage`);ao(r,{get values(){return K(e)},get label(){return K(t)}})}var i=H(r,2),a=z(i),o=V(a,!0),s=V(H(a),!0);P(i),U(e=>{X(o,K(c)[0]?.date),X(s,e)},[()=>K(c).at(-1)?.date]),Y(e,t)};Z(w,e=>{K(n)===`daily`?e(T):e(E,-1)});var D=H(w,2),ee=H(z(D),2),te=z(ee),O=H(z(te));Xr(O,21,()=>K(n)===`daily`?K(a):K(c),Kr,(e,t)=>{var n=qc(),r=z(n),i=V(r,!0),a=V(H(r),!0);P(n),U(e=>{X(i,K(t).date),X(a,e)},[()=>ma(K(t).tokens)]),Y(e,n)}),P(O),P(te),P(ee),P(D),P(x);var ne=V(H(x,2));U((e,t,n,r,i,o,s)=>{X(l,e),X(d,t),X(m,`${n??``} `),X(_,`${r??``} `),X(b,`${i??``} `),X(C,`${K(a)[0]?.date??``} — ${o??``}`),X(ne,`OBSERVED ${s??``} // CUMULATIVE IS FOR THE SELECTED PERIOD`)},[()=>ma($.data.usage.summary.lifetimeTokens),()=>ma($.data.usage.summary.peakDailyTokens),()=>ma($.data.usage.summary.currentStreakDays),()=>ma($.data.usage.summary.longestRunningTurnSec),()=>ma($.data.usage.summary.longestStreakDays),()=>K(a).at(-1)?.date,()=>ha($.data.usageAt)]),Y(e,t)},S=e=>{Y(e,Yc())};Z(y,e=>{K(n)===`breakdown`||K(n)===`periods`?e(b):$.data?.usage&&$.data.usage.dailyUsageBuckets!==null?e(x,1):e(S,-1)}),Y(e,l),We()}Sr([`click`,`change`]);var Qc=J(`

        Page not found

        Return to Quota

        `,1);function $c(e){var t=Qc();xe(2),Y(e,t)}var el=`CODEXOMETER`,tl=[`█▀▀ █▀█ █▀▄ █▀▀ ▀▄▀ █▀█ █▀▄▀█ █▀▀ ▀█▀ █▀▀ █▀█`,`█▄▄ █▄█ █▄▀ ██▄ █ █ █▄█ █ ▀ █ ██▄ █ ██▄ █▀▄`].flatMap(e=>[[...e].map(e=>e===`█`||e===`▀`),[...e].map(e=>e===`█`||e===`▄`)]),nl=tl[0].length,rl=tl.length,il=0,al=[...el].map(e=>{let t=e===`M`?5:3,n={start:il,width:t};return il+=t+1,n}),ol=`ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`,sl=`010 101 111 101.110 111 101 110.111 100 100 111.110 101 101 110.111 100 110 111.111 100 110 100.111 100 101 111.101 101 111 101.111 010 010 111.001 001 101 111.101 110 110 101.100 100 100 111.101 111 101 101.101 111 111 101.111 101 101 111.111 101 111 100.111 101 111 001.111 101 110 101.111 100 001 111.111 010 010 010.101 101 101 111.101 101 101 010.101 101 111 101.101 010 010 101.101 101 010 010.111 001 100 111.111 101 101 111.110 010 010 111.111 001 110 111.111 011 001 111.101 101 111 001.111 110 001 111.100 111 101 111.111 001 010 010.111 111 101 111.111 101 111 001`.split(`.`).map(e=>e.split(` `));function cl(e=el,t=-1,n=!1){let r=``;for(let i=0;i{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}function fl(){let e=ll[Math.floor(Math.random()*ll.length)],t=Math.floor(Math.random()*4294967296),n=dl(t),r=[...el].map((e,t)=>t);for(let e=r.length-1;e>0;e--){let t=Math.floor(n()*(e+1));[r[e],r[t]]=[r[t],r[e]]}return{variant:e,seed:t,order:r}}function pl(e,t){if(e.variant===`typing`){let e=t<1080,n=e?0:Math.min(Math.floor((t-1080)/90)+1,11);return{text:el.slice(0,n).padEnd(11),cursor:n,dot:e?Math.floor(t/180)%2==0:n<11}}if(e.variant===`shuffle`){let n=dl(e.seed^Math.floor(t/70)),r=[...el].map(e=>{let t;do t=ol[Math.floor(n()*36)];while(t===e);return t}),i=Math.min(Math.floor(t/110),11);for(let t of e.order.slice(0,i))r[t]=el[t];return{text:r.join(``),cursor:-1,dot:!1}}return{text:el,cursor:-1,dot:!1}}var ml=jr(``);function hl(e,t){Ue(t,!0);let n=Gi(t,`text`,3,el),r=Gi(t,`cursor`,19,()=>-1),i=Gi(t,`dot`,3,!1),a=F(()=>cl(n(),r(),i()));var o=ml(),s=V(o);U(()=>{Q(o,`viewBox`,`0 0 ${nl} ${rl}`),Q(o,`width`,nl),Q(o,`height`,rl),Q(s,`d`,K(a))}),Y(e,o),We()}var gl=J(`
        `),_l=J(`
        `);function vl(e,t){Ue(t,!0);let n=L(void 0),r=L(0),i=L(Yt({width:0,height:0,pixelRatio:1})),a=L(Yt({x:0,y:0,width:0})),o=F(()=>K(n)?pl(K(n),K(r)):void 0),s=F(()=>{if(!K(n))return{x:0,y:0,width:0};let e=ul[K(n).variant],t=Math.min(Math.max((K(r)-e-180)/800,0),1),o=t*t*(3-2*t),s=K(i).width+(K(a).width-K(i).width)*o,c=Math.max((K(i).height-K(i).width*rl/nl)/2,0),l=(K(n).variant===`slide`&&K(r)Math.round(e*K(i).pixelRatio)/K(i).pixelRatio;return{x:d(l),y:d(u),width:d(s)}});Ki(()=>{let e=matchMedia(`(prefers-reduced-motion: reduce)`);if(e.matches){t.onfinish();return}R(n,fl(),!0);let o=ul[K(n).variant]+180+800,s=0,c=!1,l=performance.now(),u=()=>{let e=t.target?.getBoundingClientRect();R(i,{width:window.innerWidth,height:window.innerHeight,pixelRatio:window.devicePixelRatio||1},!0),e&&R(a,{x:e.x,y:e.y,width:e.width},!0)},d=()=>{c||(c=!0,cancelAnimationFrame(s),t.onfinish())},f=e=>{e instanceof PointerEvent&&e.button!==0||e instanceof KeyboardEvent&&(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)||e instanceof KeyboardEvent&&[`Shift`,`Control`,`Alt`,`Meta`].includes(e.key)||(e.preventDefault(),e.stopImmediatePropagation(),d())},p=()=>{e.matches&&d()},m=e=>{R(r,Math.max(e-l,0),!0),K(r)>=o?d():s=requestAnimationFrame(m)},h=new ResizeObserver(u);if(t.target){h.observe(t.target),t.target.parentElement&&h.observe(t.target.parentElement);let e=t.target.closest(`header`);e&&h.observe(e)}return u(),window.addEventListener(`resize`,u),document.addEventListener(`keydown`,f,!0),document.addEventListener(`pointerdown`,f,!0),e.addEventListener(`change`,p),s=requestAnimationFrame(m),()=>{c=!0,cancelAnimationFrame(s),h.disconnect(),window.removeEventListener(`resize`,u),document.removeEventListener(`keydown`,f,!0),document.removeEventListener(`pointerdown`,f,!0),e.removeEventListener(`change`,p)}});var c=_l(),l=z(c),u=e=>{var t=gl();let n;hl(z(t),{get text(){return K(o).text},get cursor(){return K(o).cursor},get dot(){return K(o).dot}}),P(t),U(()=>{Q(t,`data-text`,K(o).text),Q(t,`data-cursor`,K(o).dot?K(o).cursor:void 0),n=di(t,``,n,{left:`${K(s).x}px`,top:`${K(s).y}px`,width:`${K(s).width}px`})}),Y(e,t)};Z(l,e=>{K(o)&&e(u)});var d=H(l,2);P(c),U(()=>Q(c,`data-entrance`,K(n)?.variant)),q(`click`,d,function(...e){t.onfinish?.apply(this,e)}),Y(e,c),We()}Sr([`click`]);var yl=J(` `),bl=J(`

        `),xl=J(`

        Connecting to your local Codexometer…

        `),Sl=J(``),Cl=J(`

        Your quota. Your sessions. Your command centre.

        `);function wl(e,t){Ue(t,!0);let n={"/":no,"/quota/:view?":no,"/sessions/:id?":xc,"/usage":Zc,"*":$c},r={quota:/^(?:\/|\/quota(?:\/[^/]+)?\/?)$/,sessions:/^\/sessions(?:\/[^/]+)?\/?$/,usage:/^\/usage\/?$/},i=L(`hacker`),a=L(!0),o=L(void 0);vn(()=>{ca.requests&&lr().then(()=>{K(o)?.focus(),K(o)?.scrollIntoView({block:`nearest`})})});let s=L(void 0),c=[`hacker`,`rust`,`blue-steel`,`ultraviolet`,`nightshade`];vn(()=>{la()}),vn(()=>{if($.data)for(let[e,t]of Object.entries(r))t.test(Xi.location)&&(oa.tab=e)}),Ki(()=>{try{let e=localStorage.getItem(`codexometer.web.theme`);e&&c.includes(e)&&R(i,e,!0)}catch{}return ba()});function l(){try{localStorage.setItem(`codexometer.web.theme`,K(i))}catch{}}var u=Cl(),d=z(u),f=z(d),p=z(f);hl(z(p),{}),P(p),Li(p,e=>R(s,e),()=>K(s)),xe(2),P(f);var m=H(f,2),h=z(m);let g;var v=H(h,1,!0),y=V(H(v));P(m),P(d);var b=H(d,2);Xr(b,21,()=>Object.entries(r),Kr,(e,t)=>{var n=F(()=>_(K(t),2));let r=()=>K(n)[0],i=()=>K(n)[1],a=F(()=>i().test(Xi.location));var o=yl();let s;var c=V(o,!0);U(e=>{Q(o,`href`,r()===`quota`?`#/quota/`+oa.view:`#/`+r()),Q(o,`aria-current`,K(a)?`page`:void 0),s=li(o,1,``,null,s,{active:K(a)}),X(c,e)},[()=>r().toUpperCase()]),Y(e,o)}),P(b);var x=H(b,2),S=z(x),C=e=>{var t=bl(),n=V(t,!0);U(()=>X(n,$.error)),Y(e,t)};Z(S,e=>{$.error&&e(C)});var w=H(S,2),T=e=>{ea(e,{get routes(){return n}})},E=e=>{Y(e,xl())};Z(w,e=>{$.data?e(T):$.error||e(E,1)}),P(x);var D=H(x,2),ee=z(D),te=V(ee),O=H(ee,2),ne=V(O,!0),k=H(O,2),re=H(z(k));Xr(re,21,()=>c,Kr,(e,t)=>{var n=Sl(),r=V(n,!0),i={};U(e=>{X(r,e),i!==(i=K(t))&&(n.value=(n.__value=i)??``)},[()=>K(t).replace(`-`,` `).toUpperCase()]),Y(e,n)}),P(re),Li(re,e=>R(o,e),()=>K(o)),hi(re),P(k),P(D);var ie=H(D,2),ae=e=>{vl(e,{get target(){return K(s)},onfinish:()=>R(a,!1)})};Z(ie,e=>{K(a)&&e(ae)}),P(u),U(()=>{Q(u,`data-theme`,K(i)),Q(u,`data-starting`,K(a)),d.inert=K(a),g=li(h,1,`lamp`,null,g,{lit:$.connected}),X(v,$.connected?`CONNECTED`:`OFFLINE`),X(y,`EXPERIMENTAL // ${$.data?.control?`SESSION CONTROL`:`READ ONLY`}`),b.inert=K(a),x.inert=K(a),D.inert=K(a),X(te,`v${($.data?.version||`…`)??``} // LOCAL ONLY`),X(ne,$.data?.control?`Session control enabled. Stop the server to revoke access.`:`No actions can be sent from this preview.`)}),q(`change`,re,l),gi(re,()=>K(i),e=>R(i,e)),Y(e,u),We()}Sr([`change`]),zr(wl,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/internal/web/dist/assets/index-DYxZORQa.css b/internal/web/dist/assets/index-DYxZORQa.css new file mode 100644 index 00000000..7a2f5005 --- /dev/null +++ b/internal/web/dist/assets/index-DYxZORQa.css @@ -0,0 +1 @@ +.observation-details.svelte-1vgdi83{font-size:12px}summary.svelte-1vgdi83{cursor:pointer;color:var(--accent)}.observation-table.svelte-1vgdi83{max-height:240px;overflow:auto}.zone-canvas.svelte-1vgdi83{flex:1;min-height:170px;margin-top:6px;position:relative}svg.svelte-1vgdi83{width:100%;height:100%;display:block;position:absolute;inset:0}text.svelte-1vgdi83{fill:var(--ink);font:14px Cascadia Code,Consolas,monospace}.axis-title.svelte-1vgdi83{letter-spacing:.04em;font-size:12px}.grid.svelte-1vgdi83{stroke:#fff;stroke-opacity:.14;stroke-width:1px}.axes.svelte-1vgdi83{stroke:var(--ink);stroke-width:1.5px;fill:none}.pace-line.svelte-1vgdi83{stroke:#fff;stroke-width:2px;stroke-dasharray:6 4}.position-halo.svelte-1vgdi83{fill:#101820;stroke:#fff;stroke-width:1.5px}.position-dot.svelte-1vgdi83{fill:#fff}.observation-trail.svelte-1vgdi83{fill:none;stroke:#101820;stroke-width:2.5px;stroke-linejoin:round}.observation-trail-casing.svelte-1vgdi83{fill:none;stroke:#ffffff73;stroke-width:4.5px;stroke-linejoin:round}.trail-start.svelte-1vgdi83{fill:#101820;stroke:#ffffffb3;stroke-width:2px}.trend-line.svelte-1vgdi83{fill:none;stroke:var(--trend-color);stroke-width:2px;stroke-dasharray:3 6}.trend-arrow.svelte-1vgdi83{fill:var(--trend-color);stroke:#ffffff73;stroke-width:.5px}.trend-casing.svelte-1vgdi83{fill:none;stroke:#ffffff73;stroke-width:4px;stroke-dasharray:3 6}.zone-caption.svelte-1vgdi83{min-width:0;color:var(--accent);flex:auto;margin:0}.trend-summary.svelte-1vgdi83{color:var(--ink)}.zone-footer.svelte-1vgdi83{justify-content:space-between;align-items:flex-start;gap:12px;margin-top:4px;display:flex}.zone-controls.svelte-1vgdi83{color:var(--muted);text-align:right;flex-direction:column;align-items:flex-end;gap:5px;font-size:11px;display:flex}.trace-control.svelte-1vgdi83,.trend-control.svelte-1vgdi83{cursor:pointer;white-space:nowrap}.trace-control.svelte-1vgdi83 input:where(.svelte-1vgdi83){accent-color:var(--accent)}.trend-control.svelte-1vgdi83 select:where(.svelte-1vgdi83){border:1px solid var(--edge);background:var(--panel);max-width:min(230px,45vw);color:var(--ink);font:inherit}.trend-control.svelte-1vgdi83 option:where(.svelte-1vgdi83):disabled{color:var(--muted)}.zone-controls.svelte-1vgdi83 small:where(.svelte-1vgdi83){font-size:10px}@container (width<=560px){.zone-footer.svelte-1vgdi83{flex-direction:column}.zone-controls.svelte-1vgdi83{align-self:stretch;align-items:flex-end}}.usage-diagnostic.svelte-16u6dmb{white-space:pre-wrap;overflow-wrap:anywhere}.slash-commands.svelte-7bfwr9{margin:.4rem 0;position:relative}.command-popup.svelte-7bfwr9{z-index:5;box-sizing:border-box;border:1px solid var(--accent);background:var(--panel);width:min(40rem,100%);padding:.35rem;position:absolute;bottom:100%;left:0;box-shadow:0 .3rem 1rem #0006}.command-popup.svelte-7bfwr9 p:where(.svelte-7bfwr9){margin:.3rem 0;font-size:.8em}.goal-summary.svelte-7bfwr9 p:where(.svelte-7bfwr9){white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.command-options.vertical.svelte-7bfwr9{flex-flow:column;gap:.15rem;display:flex}.vertical.svelte-7bfwr9 button:where(.svelte-7bfwr9){text-align:left;white-space:nowrap;width:100%;min-width:0;color:var(--muted);background:var(--panel);border-color:#0000;flex:none;align-items:baseline;gap:.4rem;display:flex}.vertical.svelte-7bfwr9 .command-name:where(.svelte-7bfwr9),.vertical.svelte-7bfwr9 .command-tail:where(.svelte-7bfwr9){flex:none}.vertical.svelte-7bfwr9 .command-name:where(.svelte-7bfwr9){text-overflow:ellipsis;max-width:100%;overflow:hidden}.vertical.svelte-7bfwr9 button.suggested:where(.svelte-7bfwr9){outline:none}.command-options.svelte-7bfwr9 button.suggested:where(.svelte-7bfwr9) .command-name:where(.svelte-7bfwr9){color:var(--ink);font-weight:700}.command-options.svelte-7bfwr9 button:where(.svelte-7bfwr9):not(.suggested):hover .command-name:where(.svelte-7bfwr9){text-decoration:underline}.command-options.svelte-7bfwr9 button:where(.svelte-7bfwr9){color:var(--muted)}.vertical.svelte-7bfwr9 .command-help:where(.svelte-7bfwr9){min-width:0;max-width:none;color:var(--muted);flex:1}.command-options.svelte-7bfwr9{flex-wrap:wrap;gap:.35rem;max-height:35vh;display:flex;overflow:auto}.command-options.svelte-7bfwr9 .suggested:where(.svelte-7bfwr9){outline:none}.command-help.svelte-7bfwr9{text-overflow:ellipsis;white-space:nowrap;opacity:.75;max-width:32ch;font-size:.8em;display:block;overflow:hidden}.command-actions.svelte-7bfwr9{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.availability.svelte-7bfwr9{font-weight:600}.navigation.svelte-7bfwr9{font-size:.8em}pre.svelte-7bfwr9{white-space:pre-wrap;overflow-wrap:anywhere;max-height:35vh;overflow:auto}.file-diff.svelte-x4gtb6{border:1px solid var(--muted);max-height:60vh;padding:.5rem;font-family:monospace;overflow:auto}.diff-line.svelte-x4gtb6{white-space:pre;min-height:1.3em;display:flex}.line-number.svelte-x4gtb6{text-align:right;opacity:.75;-webkit-user-select:none;user-select:none;flex:0 0 5ch;padding-right:1ch;display:inline-block}.added.svelte-x4gtb6{color:#67d391;background:#67d39112}.removed.svelte-x4gtb6{color:#ff6b83;background:#ff6b8312}.heading.svelte-x4gtb6{padding:.5rem 0;font-weight:700}.saved-prompt.svelte-1oupzfc{white-space:pre-wrap;overflow-wrap:anywhere}fieldset.svelte-1oupzfc{border:1px solid;margin:.5rem 0;padding:.35rem .6rem}.decision.svelte-1oupzfc,.answer.svelte-1oupzfc{margin:.3rem 0;display:block}.decision.svelte-1oupzfc code:where(.svelte-1oupzfc),.decision.svelte-1oupzfc span:where(.svelte-1oupzfc){overflow-wrap:anywhere;margin:.3rem 0 .3rem 1.5rem;display:block}textarea.svelte-1oupzfc,.answer.svelte-1oupzfc input:where(.svelte-1oupzfc),.answer.svelte-1oupzfc select:where(.svelte-1oupzfc){box-sizing:border-box;background:var(--bg);width:100%;color:inherit;font:inherit;border:1px solid;margin-top:.4rem;padding:.5rem;display:block}textarea.svelte-1oupzfc{resize:vertical;background:color-mix(in srgb, currentColor 8%, var(--bg))}button.svelte-1oupzfc{margin:.3rem .5rem .3rem 0}h3.svelte-1oupzfc,p.svelte-1oupzfc{margin-block:.4rem}.sent.svelte-1oupzfc{color:var(--accent)}.goal-status.svelte-1yfu3xi{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:.8rem;font-weight:700;overflow:hidden}.pursuing.svelte-1yfu3xi{color:#67d391}.blocked.svelte-1yfu3xi{color:var(--approval)}.stale.svelte-1yfu3xi{color:var(--muted)}.status-line.svelte-gprptn{align-items:center;gap:.5rem;min-width:0;margin-top:.5rem;display:flex}.status-line.svelte-gprptn p:where(.svelte-gprptn){white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;margin:0;font-size:.8rem;overflow:hidden}.configure.svelte-gprptn{padding:.15rem .35rem;font-size:.75rem}.status-picker.svelte-gprptn{border:1px solid var(--edge);margin:.5rem 0;padding:.6rem}.fields.svelte-gprptn{max-height:35vh;overflow:auto}.field.svelte-gprptn{align-items:center;gap:.35rem;display:flex}.field.svelte-gprptn label:where(.svelte-gprptn){flex:1;align-items:center;gap:.4rem;display:flex}.field.svelte-gprptn label:where(.svelte-gprptn) span:where(.svelte-gprptn){font-size:.75rem}.field.svelte-gprptn button:where(.svelte-gprptn){padding:.1rem .35rem}.session-copy.svelte-543j00{justify-content:flex-end;align-items:center;gap:8px;margin-top:auto;padding-top:6px;display:flex}.compact.svelte-543j00{flex-shrink:0;margin-top:0;padding-top:0}span.svelte-543j00{color:var(--muted);overflow-wrap:anywhere;font-size:12px}button.svelte-543j00{color:var(--accent);flex-shrink:0;padding:3px 7px}button.svelte-543j00:hover,button.flashed.svelte-543j00{color:var(--bg);background:var(--accent)}.reviewed.svelte-mm4wfe{color:var(--muted);font-weight:400}.reviewed.svelte-mm4wfe .lamp:where(.svelte-mm4wfe){opacity:.35}.failed.svelte-mm4wfe{color:var(--approval)}.lamp.failed.svelte-mm4wfe{background:var(--approval);box-shadow:0 0 8px color-mix(in srgb, var(--approval) 40%, transparent)}h3.svelte-1fbui7h,.window-dates.svelte-1fbui7h,.report-value.svelte-1fbui7h{color:var(--accent);font-weight:700}.quality-warning.svelte-1fbui7h,.quota-near.svelte-1fbui7h{color:var(--approval)}.quota-full.svelte-1fbui7h{color:#ff6680}.alternate.svelte-1fbui7h .report-fill:where(.svelte-1fbui7h){background:radial-gradient(circle, var(--panel) .7px, transparent .9px) 0 0 / 3px 3px, var(--accent)}.unknown.svelte-1fbui7h,.unknown.svelte-1fbui7h .report-value:where(.svelte-1fbui7h){color:var(--muted)}.unknown.svelte-1fbui7h .report-fill:where(.svelte-1fbui7h){background:var(--muted);opacity:1}.report-bars.svelte-1fbui7h{grid-template-columns:minmax(5rem,1fr) minmax(2rem,3fr) auto;gap:.6rem;display:grid}.report-row.svelte-1fbui7h,.report-head.svelte-1fbui7h{grid-column:1/-1;grid-template-columns:subgrid;align-items:center;gap:.6rem;display:grid}.report-head.svelte-1fbui7h{color:var(--muted);font-size:.85rem}.report-head.svelte-1fbui7h>span:where(.svelte-1fbui7h):last-child,.report-value.svelte-1fbui7h{text-align:right}.report-row.svelte-1fbui7h>span:where(.svelte-1fbui7h):first-child{overflow-wrap:anywhere}.report-track.svelte-1fbui7h{background:var(--panel);height:1rem}.report-fill.svelte-1fbui7h{background:var(--accent);height:100%}svg.svelte-1jpy949{fill:currentColor;width:100%;height:auto;display:block}.startup.svelte-19xbbtg{z-index:100;background:var(--bg);color:var(--accent);position:fixed;inset:0;overflow:hidden}.wordmark.svelte-19xbbtg{position:absolute}button.svelte-19xbbtg{color:var(--muted);font:inherit;white-space:nowrap;background:0 0;border:0;font-size:12px;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}:root{font-synthesis:none;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#080e0c;font-family:Cascadia Code,SFMono-Regular,Consolas,monospace}*{box-sizing:border-box}body{margin:0}.shell{--accent:#80edac;--approval:#ffca58;--muted:#98aaa0;--edge:#31473a;--panel:#101c16;--bg:#080e0c;--ink:#e2eee5;background:var(--bg);height:100dvh;color:var(--ink);grid-template-rows:auto auto minmax(0,1fr) auto;padding:clamp(10px,1.2vw,20px);display:grid}.shell[data-theme=rust]{--approval:#ff8a3d;--accent:#ffbc75;--muted:#bfac95;--edge:#59412c;--panel:#261b14;--bg:#140e0a}.shell[data-theme=blue-steel]{--approval:#e8c46a;--accent:#85c8ff;--muted:#9cacc4;--edge:#334d69;--panel:#142235;--bg:#0b1421}.shell[data-theme=ultraviolet]{--approval:#f9a8d4;--accent:#c5adff;--muted:#b3a6c9;--edge:#4b3c68;--panel:#241a35;--bg:#140d22}.shell[data-theme=nightshade]{--approval:#8f7cff;--accent:#e59bff;--muted:#c6a7cf;--edge:#673976;--panel:#301739;--bg:#1c0b24}header,.spread,footer,.controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}header{margin-bottom:10px}.shell[data-starting=true]>header,.shell[data-starting=true]>nav,.shell[data-starting=true]>main,.shell[data-starting=true]>footer{visibility:hidden}.brand{width:clamp(240px,32vw,405px);max-width:calc(100vw - 40px);color:var(--accent);text-decoration:none;display:block}header p{color:var(--muted);margin:3px 0 0;font-size:13px}.connection{color:var(--accent);text-align:right}small,.eyebrow{letter-spacing:.04em;font-size:12px}.connection small{color:var(--muted);margin-top:4px;display:block}.lamp{background:var(--muted);border-radius:50%;width:9px;height:9px;margin-right:9px;display:inline-block}.lamp.lit{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb, var(--accent) 40%, transparent)}.working{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{50%{opacity:.3}}nav{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}nav a,button,.button,select{font:inherit;color:var(--accent);border:1px solid var(--edge);background:var(--panel);cursor:pointer;border-radius:3px;padding:7px 11px;font-size:13px;text-decoration:none}button:hover,.button:hover,nav a:hover{border-color:var(--accent)}nav a.active,nav button.active{background:var(--accent);color:var(--bg);border-color:var(--accent)}:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.secondary{margin-bottom:8px}.secondary a,.secondary button{padding:6px 10px;font-size:12px}main{scrollbar-gutter:stable;flex-direction:column;min-width:0;min-height:0;display:flex;overflow:auto}main>*{flex-shrink:0}.panel{border:1px solid var(--edge);border-top:2px solid var(--accent);background:var(--panel);border-radius:4px;min-width:0;padding:clamp(10px,1vw,16px)}h1{color:var(--accent);font-size:20px}h2{letter-spacing:.04em;color:var(--accent);overflow-wrap:anywhere;margin:0 0 10px;font-size:13px}h3{overflow-wrap:anywhere;font-size:13px}p{margin:6px 0;font-size:13px;line-height:1.45}a{color:var(--accent)}.muted,.eyebrow{color:var(--muted)}.notice{color:#ffe0aa;background:#332611;border-left:3px solid #ffc26e;padding:12px 16px}.empty{color:var(--muted);padding:35px 0}.quota-grid{flex:1 0 auto;grid-auto-rows:minmax(220px,1fr);gap:10px;display:grid}.quota-card{flex-direction:column;min-height:0;display:flex;container-type:inline-size}.quota-card>:not(.meter-graphic){flex-shrink:0}.meter-graphic{flex-direction:column;flex:1;min-height:100px;display:flex}.bar-graphic{min-height:65px}.quota-card .gauge{flex:2;height:auto;min-height:16px;margin:7px 0}.quota-card .timeline{flex:1;min-height:8px}.quota-grid.zone{grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));grid-auto-rows:minmax(330px,1fr)}.quota-grid.radial{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));grid-auto-rows:minmax(260px,1fr)}.gauge{background:var(--edge);height:35px;margin:15px 0;overflow:hidden}.gauge>div{background:repeating-linear-gradient(90deg, var(--accent) 0, var(--accent) 9px, transparent 9px, transparent 12px);height:100%;transition:width .5s}.gauge.timeline{height:14px}.pie-wrap{flex:1;min-height:100px;margin:6px 0;position:relative}.pie-wrap svg{width:100%;height:100%;position:absolute;inset:0}.pie-base{fill:var(--edge);stroke:var(--accent);stroke-width:1px}.pie-fill{fill:var(--accent)}.readout{overflow-wrap:anywhere;color:var(--accent);margin:18px 0;font-size:clamp(22px,3vw,34px)}.credit+.credit{border-top:1px solid var(--edge);padding-top:20px}.credit{margin-top:24px}.session-row{grid-template-columns:minmax(210px,1.1fr) minmax(0,1.2fr) minmax(0,1.5fr);align-items:stretch;gap:14px;margin:18px 0;display:grid}.session-totals{grid-template-columns:repeat(auto-fit,minmax(min(145px,100%),1fr));gap:8px;margin:8px 0;display:grid}.session-totals>div{border:1px solid var(--edge);min-width:0;padding:10px}.session-totals dt{color:var(--muted);font-size:11px}.session-totals dd{color:var(--accent);overflow-wrap:anywhere;margin:6px 0 0;font-size:24px}.session-totals.stale dd{color:var(--muted)}.session-row.selected{outline:1px solid var(--accent);outline-offset:4px}.session-row.wide .context{grid-column:2/-1}.detail-controls{flex-wrap:wrap;gap:6px;display:flex}.attention-summary{flex-wrap:wrap;gap:8px;margin-block:8px;display:flex}.attention-summary .approval{color:var(--approval);border-color:var(--approval)}.attention-summary .approval:hover{background:color-mix(in srgb, var(--approval) 12%, var(--panel))}.attention-summary .approval:focus-visible{outline-color:var(--approval)}.attention-note,.attention-badge{color:var(--accent);border-left:3px solid;padding-left:8px}.attention-note.inferred{color:var(--muted)}.attention-badge{font-size:12px}.session-select{text-align:left;overflow-wrap:anywhere;max-width:100%}.status-detail{color:inherit;text-decoration:none}.status-detail:hover{text-decoration:underline}button:disabled{opacity:.4;cursor:default}.session-row .graph-panel{flex-direction:column;grid-column:2/-1;display:flex}.session-row.split .graph-panel{grid-column:auto}.session-row .button,.session-row button{margin-top:8px;display:inline-block}.context pre{max-height:230px;overflow:auto}.session-row .context{flex-direction:column;display:flex}pre{font:inherit;white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7}.full-detail{margin-top:6px}.detail-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;display:flex}.detail-heading h2{flex:250px;min-width:0;margin:0}.detail-metadata{overflow-wrap:anywhere}.detail-workspace{border-top:1px solid var(--edge);flex-direction:column;gap:10px;margin-top:8px;padding-top:4px;display:flex}.detail-context,.detail-workspace .session-actions{min-width:0}.detail-workspace .session-actions{border-top:1px solid var(--edge);padding-top:6px}.full-detail h3{margin-block:8px}.full-detail pre{margin-block:8px;line-height:1.5}.full-detail hr{margin-block:12px}.full-detail .command,.full-detail .notice{padding:8px 10px}.command{background:var(--bg);border-left:3px solid var(--accent);padding:16px}hr{border:0;border-top:1px solid var(--edge);margin:24px 0}.chart{border-bottom:1px solid var(--muted);align-items:flex-end;gap:2px;height:clamp(120px,22vh,320px);margin-top:18px;display:flex}.chart-bar{background:var(--accent);flex:1;min-width:0;max-height:100%}.controls{justify-content:flex-start;margin:20px 0}.summary-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:16px;margin:20px 0;display:grid}.thresholds-panel{padding:clamp(14px,2vw,22px)}.thresholds-panel h1{margin-top:0}.threshold-list{gap:8px;margin-top:16px;display:grid}.threshold-list article{border:1px solid var(--edge);grid-template-columns:minmax(64px,.5fr) minmax(220px,3fr) minmax(64px,.6fr) minmax(120px,1.2fr);align-items:center;gap:12px;padding:10px 12px;display:grid}.threshold-list article.active{border-color:var(--accent);box-shadow:inset 3px 0 0 var(--accent)}.threshold-list article.next{border-color:var(--approval);box-shadow:inset 3px 0 0 var(--approval)}.threshold-list p{color:var(--muted);margin:3px 0 0;font-size:12px}.threshold-trigger{color:var(--accent);font-size:22px;font-weight:800}.threshold-mode,.threshold-state{color:var(--muted);font-size:12px;font-weight:700}.threshold-list article.active .threshold-state{color:var(--accent)}.threshold-list article.next .threshold-state{color:var(--approval)}.heat-scroll{overflow-x:auto}.heatmap{grid-template-rows:repeat(7,13px);grid-auto-columns:minmax(9px,1fr);grid-auto-flow:column;gap:4px;min-width:620px;margin:25px 0;display:grid}.heat-cell{background:var(--accent);border-radius:2px}.heat-cell.zero{background:var(--edge)}.table-scroll{max-height:280px;overflow:auto}table{border-collapse:collapse;width:100%;margin-top:15px}th,td{text-align:left;border-bottom:1px solid var(--edge);padding:8px}summary{cursor:pointer;color:var(--accent);padding-top:14px}footer{border-top:1px solid var(--edge);color:var(--muted);margin-top:8px;padding-top:8px;font-size:11px}footer select{padding:6px}@media (width<=850px){.session-row{grid-template-columns:minmax(0,1fr)}.session-row.wide .context,.session-row .graph-panel{grid-column:auto}.connection{text-align:left}.threshold-list article{grid-template-columns:64px minmax(0,1fr)}.threshold-mode,.threshold-state{grid-column:2}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}} diff --git a/internal/web/dist/assets/index-Ei3sATy3.css b/internal/web/dist/assets/index-Ei3sATy3.css deleted file mode 100644 index d8b87d95..00000000 --- a/internal/web/dist/assets/index-Ei3sATy3.css +++ /dev/null @@ -1 +0,0 @@ -.observation-details.svelte-1vgdi83{font-size:12px}summary.svelte-1vgdi83{cursor:pointer;color:var(--accent)}.observation-table.svelte-1vgdi83{max-height:240px;overflow:auto}.zone-canvas.svelte-1vgdi83{flex:1;min-height:170px;margin-top:6px;position:relative}svg.svelte-1vgdi83{width:100%;height:100%;display:block;position:absolute;inset:0}text.svelte-1vgdi83{fill:var(--ink);font:14px Cascadia Code,Consolas,monospace}.axis-title.svelte-1vgdi83{letter-spacing:.04em;font-size:12px}.grid.svelte-1vgdi83{stroke:#fff;stroke-opacity:.14;stroke-width:1px}.axes.svelte-1vgdi83{stroke:var(--ink);stroke-width:1.5px;fill:none}.pace-line.svelte-1vgdi83{stroke:#fff;stroke-width:2px;stroke-dasharray:6 4}.position-halo.svelte-1vgdi83{fill:#101820;stroke:#fff;stroke-width:1.5px}.position-dot.svelte-1vgdi83{fill:#fff}.observation-trail.svelte-1vgdi83{fill:none;stroke:#101820;stroke-width:2.5px;stroke-linejoin:round}.observation-trail-casing.svelte-1vgdi83{fill:none;stroke:#ffffff73;stroke-width:4.5px;stroke-linejoin:round}.trail-start.svelte-1vgdi83{fill:#101820;stroke:#ffffffb3;stroke-width:2px}.trend-line.svelte-1vgdi83{fill:none;stroke:var(--trend-color);stroke-width:2px;stroke-dasharray:3 6}.trend-arrow.svelte-1vgdi83{fill:var(--trend-color);stroke:#ffffff73;stroke-width:.5px}.trend-casing.svelte-1vgdi83{fill:none;stroke:#ffffff73;stroke-width:4px;stroke-dasharray:3 6}.zone-caption.svelte-1vgdi83{min-width:0;color:var(--accent);flex:auto;margin:0}.trend-summary.svelte-1vgdi83{color:var(--ink)}.zone-footer.svelte-1vgdi83{justify-content:space-between;align-items:flex-start;gap:12px;margin-top:4px;display:flex}.zone-controls.svelte-1vgdi83{color:var(--muted);text-align:right;flex-direction:column;align-items:flex-end;gap:5px;font-size:11px;display:flex}.trace-control.svelte-1vgdi83,.trend-control.svelte-1vgdi83{cursor:pointer;white-space:nowrap}.trace-control.svelte-1vgdi83 input:where(.svelte-1vgdi83){accent-color:var(--accent)}.trend-control.svelte-1vgdi83 select:where(.svelte-1vgdi83){border:1px solid var(--edge);background:var(--panel);max-width:min(230px,45vw);color:var(--ink);font:inherit}.trend-control.svelte-1vgdi83 option:where(.svelte-1vgdi83):disabled{color:var(--muted)}.zone-controls.svelte-1vgdi83 small:where(.svelte-1vgdi83){font-size:10px}@container (width<=560px){.zone-footer.svelte-1vgdi83{flex-direction:column}.zone-controls.svelte-1vgdi83{align-self:stretch;align-items:flex-end}}.usage-diagnostic.svelte-16u6dmb{white-space:pre-wrap;overflow-wrap:anywhere}.slash-commands.svelte-7bfwr9{margin:.4rem 0;position:relative}.command-popup.svelte-7bfwr9{z-index:5;box-sizing:border-box;border:1px solid var(--accent);background:var(--panel);width:min(40rem,100%);padding:.35rem;position:absolute;bottom:100%;left:0;box-shadow:0 .3rem 1rem #0006}.command-popup.svelte-7bfwr9 p:where(.svelte-7bfwr9){margin:.3rem 0;font-size:.8em}.goal-summary.svelte-7bfwr9 p:where(.svelte-7bfwr9){white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.command-options.vertical.svelte-7bfwr9{flex-flow:column;gap:.15rem;display:flex}.vertical.svelte-7bfwr9 button:where(.svelte-7bfwr9){text-align:left;white-space:nowrap;width:100%;min-width:0;color:var(--muted);background:var(--panel);border-color:#0000;flex:none;align-items:baseline;gap:.4rem;display:flex}.vertical.svelte-7bfwr9 .command-name:where(.svelte-7bfwr9),.vertical.svelte-7bfwr9 .command-tail:where(.svelte-7bfwr9){flex:none}.vertical.svelte-7bfwr9 .command-name:where(.svelte-7bfwr9){text-overflow:ellipsis;max-width:100%;overflow:hidden}.vertical.svelte-7bfwr9 button.suggested:where(.svelte-7bfwr9){outline:none}.command-options.svelte-7bfwr9 button.suggested:where(.svelte-7bfwr9) .command-name:where(.svelte-7bfwr9){color:var(--ink);font-weight:700}.command-options.svelte-7bfwr9 button:where(.svelte-7bfwr9):not(.suggested):hover .command-name:where(.svelte-7bfwr9){text-decoration:underline}.command-options.svelte-7bfwr9 button:where(.svelte-7bfwr9){color:var(--muted)}.vertical.svelte-7bfwr9 .command-help:where(.svelte-7bfwr9){min-width:0;max-width:none;color:var(--muted);flex:1}.command-options.svelte-7bfwr9{flex-wrap:wrap;gap:.35rem;max-height:35vh;display:flex;overflow:auto}.command-options.svelte-7bfwr9 .suggested:where(.svelte-7bfwr9){outline:none}.command-help.svelte-7bfwr9{text-overflow:ellipsis;white-space:nowrap;opacity:.75;max-width:32ch;font-size:.8em;display:block;overflow:hidden}.command-actions.svelte-7bfwr9{flex-wrap:wrap;gap:.35rem;margin-top:.4rem;display:flex}.availability.svelte-7bfwr9{font-weight:600}.navigation.svelte-7bfwr9{font-size:.8em}pre.svelte-7bfwr9{white-space:pre-wrap;overflow-wrap:anywhere;max-height:35vh;overflow:auto}.file-diff.svelte-x4gtb6{border:1px solid var(--muted);max-height:60vh;padding:.5rem;font-family:monospace;overflow:auto}.diff-line.svelte-x4gtb6{white-space:pre;min-height:1.3em;display:flex}.line-number.svelte-x4gtb6{text-align:right;opacity:.75;-webkit-user-select:none;user-select:none;flex:0 0 5ch;padding-right:1ch;display:inline-block}.added.svelte-x4gtb6{color:#67d391;background:#67d39112}.removed.svelte-x4gtb6{color:#ff6b83;background:#ff6b8312}.heading.svelte-x4gtb6{padding:.5rem 0;font-weight:700}.saved-prompt.svelte-1oupzfc{white-space:pre-wrap;overflow-wrap:anywhere}fieldset.svelte-1oupzfc{border:1px solid;margin:.5rem 0;padding:.35rem .6rem}.decision.svelte-1oupzfc,.answer.svelte-1oupzfc{margin:.3rem 0;display:block}.decision.svelte-1oupzfc code:where(.svelte-1oupzfc),.decision.svelte-1oupzfc span:where(.svelte-1oupzfc){overflow-wrap:anywhere;margin:.3rem 0 .3rem 1.5rem;display:block}textarea.svelte-1oupzfc,.answer.svelte-1oupzfc input:where(.svelte-1oupzfc),.answer.svelte-1oupzfc select:where(.svelte-1oupzfc){box-sizing:border-box;background:var(--bg);width:100%;color:inherit;font:inherit;border:1px solid;margin-top:.4rem;padding:.5rem;display:block}textarea.svelte-1oupzfc{resize:vertical;background:color-mix(in srgb, currentColor 8%, var(--bg))}button.svelte-1oupzfc{margin:.3rem .5rem .3rem 0}h3.svelte-1oupzfc,p.svelte-1oupzfc{margin-block:.4rem}.sent.svelte-1oupzfc{color:var(--accent)}.goal-status.svelte-1yfu3xi{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:.8rem;font-weight:700;overflow:hidden}.pursuing.svelte-1yfu3xi{color:#67d391}.blocked.svelte-1yfu3xi{color:var(--approval)}.stale.svelte-1yfu3xi{color:var(--muted)}.status-line.svelte-gprptn{align-items:center;gap:.5rem;min-width:0;margin-top:.5rem;display:flex}.status-line.svelte-gprptn p:where(.svelte-gprptn){white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;margin:0;font-size:.8rem;overflow:hidden}.configure.svelte-gprptn{padding:.15rem .35rem;font-size:.75rem}.status-picker.svelte-gprptn{border:1px solid var(--edge);margin:.5rem 0;padding:.6rem}.fields.svelte-gprptn{max-height:35vh;overflow:auto}.field.svelte-gprptn{align-items:center;gap:.35rem;display:flex}.field.svelte-gprptn label:where(.svelte-gprptn){flex:1;align-items:center;gap:.4rem;display:flex}.field.svelte-gprptn label:where(.svelte-gprptn) span:where(.svelte-gprptn){font-size:.75rem}.field.svelte-gprptn button:where(.svelte-gprptn){padding:.1rem .35rem}.session-copy.svelte-543j00{justify-content:flex-end;align-items:center;gap:8px;margin-top:auto;padding-top:6px;display:flex}.compact.svelte-543j00{flex-shrink:0;margin-top:0;padding-top:0}span.svelte-543j00{color:var(--muted);overflow-wrap:anywhere;font-size:12px}button.svelte-543j00{color:var(--accent);flex-shrink:0;padding:3px 7px}button.svelte-543j00:hover,button.flashed.svelte-543j00{color:var(--bg);background:var(--accent)}.failed.svelte-mm4wfe{color:var(--approval)}.lamp.failed.svelte-mm4wfe{background:var(--approval);box-shadow:0 0 8px color-mix(in srgb, var(--approval) 40%, transparent)}h3.svelte-1fbui7h,.window-dates.svelte-1fbui7h,.report-value.svelte-1fbui7h{color:var(--accent);font-weight:700}.quality-warning.svelte-1fbui7h,.quota-near.svelte-1fbui7h{color:var(--approval)}.quota-full.svelte-1fbui7h{color:#ff6680}.alternate.svelte-1fbui7h .report-fill:where(.svelte-1fbui7h){background:radial-gradient(circle, var(--panel) .7px, transparent .9px) 0 0 / 3px 3px, var(--accent)}.unknown.svelte-1fbui7h,.unknown.svelte-1fbui7h .report-value:where(.svelte-1fbui7h){color:var(--muted)}.unknown.svelte-1fbui7h .report-fill:where(.svelte-1fbui7h){background:var(--muted);opacity:1}.report-bars.svelte-1fbui7h{grid-template-columns:minmax(5rem,1fr) minmax(2rem,3fr) auto;gap:.6rem;display:grid}.report-row.svelte-1fbui7h,.report-head.svelte-1fbui7h{grid-column:1/-1;grid-template-columns:subgrid;align-items:center;gap:.6rem;display:grid}.report-head.svelte-1fbui7h{color:var(--muted);font-size:.85rem}.report-head.svelte-1fbui7h>span:where(.svelte-1fbui7h):last-child,.report-value.svelte-1fbui7h{text-align:right}.report-row.svelte-1fbui7h>span:where(.svelte-1fbui7h):first-child{overflow-wrap:anywhere}.report-track.svelte-1fbui7h{background:var(--panel);height:1rem}.report-fill.svelte-1fbui7h{background:var(--accent);height:100%}svg.svelte-1jpy949{fill:currentColor;width:100%;height:auto;display:block}.startup.svelte-19xbbtg{z-index:100;background:var(--bg);color:var(--accent);position:fixed;inset:0;overflow:hidden}.wordmark.svelte-19xbbtg{position:absolute}button.svelte-19xbbtg{color:var(--muted);font:inherit;white-space:nowrap;background:0 0;border:0;font-size:12px;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}:root{font-synthesis:none;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;background:#080e0c;font-family:Cascadia Code,SFMono-Regular,Consolas,monospace}*{box-sizing:border-box}body{margin:0}.shell{--accent:#80edac;--approval:#ffca58;--muted:#98aaa0;--edge:#31473a;--panel:#101c16;--bg:#080e0c;--ink:#e2eee5;background:var(--bg);height:100dvh;color:var(--ink);grid-template-rows:auto auto minmax(0,1fr) auto;padding:clamp(10px,1.2vw,20px);display:grid}.shell[data-theme=rust]{--approval:#ff8a3d;--accent:#ffbc75;--muted:#bfac95;--edge:#59412c;--panel:#261b14;--bg:#140e0a}.shell[data-theme=blue-steel]{--approval:#e8c46a;--accent:#85c8ff;--muted:#9cacc4;--edge:#334d69;--panel:#142235;--bg:#0b1421}.shell[data-theme=ultraviolet]{--approval:#f9a8d4;--accent:#c5adff;--muted:#b3a6c9;--edge:#4b3c68;--panel:#241a35;--bg:#140d22}.shell[data-theme=nightshade]{--approval:#8f7cff;--accent:#e59bff;--muted:#c6a7cf;--edge:#673976;--panel:#301739;--bg:#1c0b24}header,.spread,footer,.controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}header{margin-bottom:10px}.shell[data-starting=true]>header,.shell[data-starting=true]>nav,.shell[data-starting=true]>main,.shell[data-starting=true]>footer{visibility:hidden}.brand{width:clamp(240px,32vw,405px);max-width:calc(100vw - 40px);color:var(--accent);text-decoration:none;display:block}header p{color:var(--muted);margin:3px 0 0;font-size:13px}.connection{color:var(--accent);text-align:right}small,.eyebrow{letter-spacing:.04em;font-size:12px}.connection small{color:var(--muted);margin-top:4px;display:block}.lamp{background:var(--muted);border-radius:50%;width:9px;height:9px;margin-right:9px;display:inline-block}.lamp.lit{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb, var(--accent) 40%, transparent)}.working{animation:1.5s ease-in-out infinite pulse}@keyframes pulse{50%{opacity:.3}}nav{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}nav a,button,.button,select{font:inherit;color:var(--accent);border:1px solid var(--edge);background:var(--panel);cursor:pointer;border-radius:3px;padding:7px 11px;font-size:13px;text-decoration:none}button:hover,.button:hover,nav a:hover{border-color:var(--accent)}nav a.active,nav button.active{background:var(--accent);color:var(--bg);border-color:var(--accent)}:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.secondary{margin-bottom:8px}.secondary a,.secondary button{padding:6px 10px;font-size:12px}main{scrollbar-gutter:stable;flex-direction:column;min-width:0;min-height:0;display:flex;overflow:auto}main>*{flex-shrink:0}.panel{border:1px solid var(--edge);border-top:2px solid var(--accent);background:var(--panel);border-radius:4px;min-width:0;padding:clamp(10px,1vw,16px)}h1{color:var(--accent);font-size:20px}h2{letter-spacing:.04em;color:var(--accent);overflow-wrap:anywhere;margin:0 0 10px;font-size:13px}h3{overflow-wrap:anywhere;font-size:13px}p{margin:6px 0;font-size:13px;line-height:1.45}a{color:var(--accent)}.muted,.eyebrow{color:var(--muted)}.notice{color:#ffe0aa;background:#332611;border-left:3px solid #ffc26e;padding:12px 16px}.empty{color:var(--muted);padding:35px 0}.quota-grid{flex:1 0 auto;grid-auto-rows:minmax(220px,1fr);gap:10px;display:grid}.quota-card{flex-direction:column;min-height:0;display:flex;container-type:inline-size}.quota-card>:not(.meter-graphic){flex-shrink:0}.meter-graphic{flex-direction:column;flex:1;min-height:100px;display:flex}.bar-graphic{min-height:65px}.quota-card .gauge{flex:2;height:auto;min-height:16px;margin:7px 0}.quota-card .timeline{flex:1;min-height:8px}.quota-grid.zone{grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));grid-auto-rows:minmax(330px,1fr)}.quota-grid.radial{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));grid-auto-rows:minmax(260px,1fr)}.gauge{background:var(--edge);height:35px;margin:15px 0;overflow:hidden}.gauge>div{background:repeating-linear-gradient(90deg, var(--accent) 0, var(--accent) 9px, transparent 9px, transparent 12px);height:100%;transition:width .5s}.gauge.timeline{height:14px}.pie-wrap{flex:1;min-height:100px;margin:6px 0;position:relative}.pie-wrap svg{width:100%;height:100%;position:absolute;inset:0}.pie-base{fill:var(--edge);stroke:var(--accent);stroke-width:1px}.pie-fill{fill:var(--accent)}.readout{overflow-wrap:anywhere;color:var(--accent);margin:18px 0;font-size:clamp(22px,3vw,34px)}.credit+.credit{border-top:1px solid var(--edge);padding-top:20px}.credit{margin-top:24px}.session-row{grid-template-columns:minmax(210px,1.1fr) minmax(0,1.2fr) minmax(0,1.5fr);align-items:stretch;gap:14px;margin:18px 0;display:grid}.session-totals{grid-template-columns:repeat(auto-fit,minmax(min(145px,100%),1fr));gap:8px;margin:8px 0;display:grid}.session-totals>div{border:1px solid var(--edge);min-width:0;padding:10px}.session-totals dt{color:var(--muted);font-size:11px}.session-totals dd{color:var(--accent);overflow-wrap:anywhere;margin:6px 0 0;font-size:24px}.session-totals.stale dd{color:var(--muted)}.session-row.selected{outline:1px solid var(--accent);outline-offset:4px}.session-row.wide .context{grid-column:2/-1}.detail-controls{flex-wrap:wrap;gap:6px;display:flex}.attention-summary{flex-wrap:wrap;gap:8px;margin-block:8px;display:flex}.attention-summary .approval{color:var(--approval);border-color:var(--approval)}.attention-summary .approval:hover{background:color-mix(in srgb, var(--approval) 12%, var(--panel))}.attention-summary .approval:focus-visible{outline-color:var(--approval)}.attention-note,.attention-badge{color:var(--accent);border-left:3px solid;padding-left:8px}.attention-note.inferred{color:var(--muted)}.attention-badge{font-size:12px}.session-select{text-align:left;overflow-wrap:anywhere;max-width:100%}.status-detail{color:inherit;text-decoration:none}.status-detail:hover{text-decoration:underline}button:disabled{opacity:.4;cursor:default}.session-row .graph-panel{flex-direction:column;grid-column:2/-1;display:flex}.session-row.split .graph-panel{grid-column:auto}.session-row .button,.session-row button{margin-top:8px;display:inline-block}.context pre{max-height:230px;overflow:auto}.session-row .context{flex-direction:column;display:flex}pre{font:inherit;white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7}.full-detail{margin-top:6px}.detail-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;display:flex}.detail-heading h2{flex:250px;min-width:0;margin:0}.detail-metadata{overflow-wrap:anywhere}.detail-workspace{border-top:1px solid var(--edge);flex-direction:column;gap:10px;margin-top:8px;padding-top:4px;display:flex}.detail-context,.detail-workspace .session-actions{min-width:0}.detail-workspace .session-actions{border-top:1px solid var(--edge);padding-top:6px}.full-detail h3{margin-block:8px}.full-detail pre{margin-block:8px;line-height:1.5}.full-detail hr{margin-block:12px}.full-detail .command,.full-detail .notice{padding:8px 10px}.command{background:var(--bg);border-left:3px solid var(--accent);padding:16px}hr{border:0;border-top:1px solid var(--edge);margin:24px 0}.chart{border-bottom:1px solid var(--muted);align-items:flex-end;gap:2px;height:clamp(120px,22vh,320px);margin-top:18px;display:flex}.chart-bar{background:var(--accent);flex:1;min-width:0;max-height:100%}.controls{justify-content:flex-start;margin:20px 0}.summary-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:16px;margin:20px 0;display:grid}.thresholds-panel{padding:clamp(14px,2vw,22px)}.thresholds-panel h1{margin-top:0}.threshold-list{gap:8px;margin-top:16px;display:grid}.threshold-list article{border:1px solid var(--edge);grid-template-columns:minmax(64px,.5fr) minmax(220px,3fr) minmax(64px,.6fr) minmax(120px,1.2fr);align-items:center;gap:12px;padding:10px 12px;display:grid}.threshold-list article.active{border-color:var(--accent);box-shadow:inset 3px 0 0 var(--accent)}.threshold-list article.next{border-color:var(--approval);box-shadow:inset 3px 0 0 var(--approval)}.threshold-list p{color:var(--muted);margin:3px 0 0;font-size:12px}.threshold-trigger{color:var(--accent);font-size:22px;font-weight:800}.threshold-mode,.threshold-state{color:var(--muted);font-size:12px;font-weight:700}.threshold-list article.active .threshold-state{color:var(--accent)}.threshold-list article.next .threshold-state{color:var(--approval)}.heat-scroll{overflow-x:auto}.heatmap{grid-template-rows:repeat(7,13px);grid-auto-columns:minmax(9px,1fr);grid-auto-flow:column;gap:4px;min-width:620px;margin:25px 0;display:grid}.heat-cell{background:var(--accent);border-radius:2px}.heat-cell.zero{background:var(--edge)}.table-scroll{max-height:280px;overflow:auto}table{border-collapse:collapse;width:100%;margin-top:15px}th,td{text-align:left;border-bottom:1px solid var(--edge);padding:8px}summary{cursor:pointer;color:var(--accent);padding-top:14px}footer{border-top:1px solid var(--edge);color:var(--muted);margin-top:8px;padding-top:8px;font-size:11px}footer select{padding:6px}@media (width<=850px){.session-row{grid-template-columns:minmax(0,1fr)}.session-row.wide .context,.session-row .graph-panel{grid-column:auto}.connection{text-align:left}.threshold-list article{grid-template-columns:64px minmax(0,1fr)}.threshold-mode,.threshold-state{grid-column:2}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}} diff --git a/internal/web/dist/assets/index-mFvKL8_v.js b/internal/web/dist/assets/index-mFvKL8_v.js new file mode 100644 index 00000000..6d927887 --- /dev/null +++ b/internal/web/dist/assets/index-mFvKL8_v.js @@ -0,0 +1,50 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible;function d(e){return typeof e==`function`}var f=()=>{};function p(e){return e()}function m(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function g(e,t,n=!1){return e===void 0?n?t():t:e}function _(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var v=1024,y=2048,b=4096,x=8192,S=16384,C=32768,w=1<<25,T=65536,E=1<<19,D=1<<20,ee=1<<25,te=1<<21,O=1<<22,ne=1<<23,re=Symbol(`$state`),ie=Symbol(`component`),ae=Symbol(`legacy props`),oe=Symbol(``),se=Symbol(`attributes`),ce=Symbol(`class`),k=Symbol(`style`),le=Symbol(`text`),ue=Symbol(`form reset`),de=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},fe=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`),pe={},A=Symbol(`uninitialized`),me=`http://www.w3.org/1999/xhtml`;function he(){console.warn(`https://svelte.dev/e/derived_inert`)}function ge(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function _e(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function ve(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var j=!1;function ye(e){j=e}var M;function be(e){if(e===null)throw ge(),pe;return M=e}function xe(){return be(sn(M))}function N(e){if(j){if(sn(M)!==null)throw ge(),pe;M=e}}function Se(e=1){if(j){for(var t=e,n=M;t--;)n=sn(n);M=n}}function Ce(e=!0){for(var t=0,n=M;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=sn(n);e&&n.remove(),n=i}}function we(e){if(!e||e.nodeType!==8)throw ge(),pe;return e.data}function Te(e){return e===this.v}function Ee(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function De(e){return!Ee(e,this.v)}function Oe(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function je(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Me(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ne(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Pe(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Fe(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Ie(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Le(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Re(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function ze(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Be=!1;function Ve(){Be=!0}var He=null;function Ue(e){He=e}function We(e,t=!1,n){He={p:He,i:!1,c:null,e:null,s:e,x:null,r:W,l:Be&&!t?{s:null,u:null,$:[]}:null}}function Ge(e){var t=He,n=t.e;if(n!==null){t.e=null;for(var r of n)bn(r)}return e!==void 0&&(t.x=e),t.i=!0,He=t.p,Ke(e)}function Ke(e={}){return i(e,ie,{value:!0}),e}function qe(){return!Be||He!==null&&He.l===null}var Je=[];function Ye(){var e=Je;Je=[],m(e)}function Xe(e){if(Je.length===0&&!wt){var t=Je;queueMicrotask(()=>{t===Je&&Ye()})}Je.push(e)}function Ze(){for(;Je.length>0;)Ye()}var Qe=~(y|b|v);function $e(e,t){e.f=e.f&Qe|t}function et(e){e.f&512||e.deps===null?$e(e,v):$e(e,b)}function tt(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),$e(e,v)}function nt(e){j&&on(e)!==null&&cn(e)}var rt=!1;function it(){rt||(rt=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ue]?.()})},{capture:!0}))}function at(e){var t=U,n=W;Wn(null),Gn(null);try{return e()}finally{Wn(t),Gn(n)}}function ot(e,t,n,r=n){e.addEventListener(t,()=>at(n));let i=e[ue];e[ue]=i?()=>{i(),r(!0)}:()=>r(!0),it()}function st(e,t,n,r){let i=qe()?dt:mt;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=W,c=ct(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){pn(e,s)}lt()}}var d=ut();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>pt(e))).then(u).catch(e=>pn(e,s)).finally(d)}l?l.then(()=>{c(),f(),lt()}):f()}function ct(){var e=W,t=U,n=He,r=F;return function(i=!0){Gn(e),Wn(t),Ue(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function lt(e=!0){Gn(null),Wn(null),Ue(null),e&&F?.deactivate()}function ut(){var e=W,t=e.b,n=F,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function dt(e){var t=2|y;return W!==null&&(W.f|=E),{ctx:He,deps:null,effects:null,equals:Te,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:W,ac:null}}var ft=Symbol(`obsolete`);function pt(e,t,n){let r=W;r===null&&ke();var i=void 0,a=Vt(A),o=!U,s=new Set;return wn(()=>{var t=W,n=h();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==de&&n.reject(e)}).finally(lt)}catch(e){n.reject(e),lt()}var c=F;if(o){if(t.f&32768)var l=ut();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(ft);else for(let e of s.values())e.reject(ft);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==ft&&(c.activate(),t?(a.f|=ne,Gt(a,t)):(a.f&8388608&&(a.f^=ne),Gt(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),vn(()=>{for(let e of s)e.reject(ft)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function P(e){let t=dt(e);return qn(t),t}function mt(e){let t=dt(e);return t.equals=De,t}function ht(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(de),t.ac=null}),t.fn!==null&&(t.teardown=f),cr(t,0),kn(t))}function yt(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&lr(t)}var bt=null,F=null,xt=null,St=null,Ct=null,wt=!1,Tt=!1,Et=null,Dt=null,Ot=0,kt=1,At=class e{id=kt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){bt===null?bt=this:(bt.#n=this,this.#t=bt),bt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)$e(r,y),t(r);for(r of n.m)$e(r,b),t(r)}this.#p.add(e)}#g(){var e=[];for(let i of this.#c)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=v}}n||e.push(t)}return this.#c=[],e}#_(){this.#e=!0;for(let e of this.#u)this.#d.delete(e),$e(e,y),this.schedule(e);for(let e of this.#d)$e(e,b),this.schedule(e);this.apply();for(var t=Et=[],n=[],r=Dt=[];this.#c.length>0;){Ot++>1e3&&(this.#S(),Mt());for(let e of this.#g())try{this.#v(e,t,n)}catch(t){throw Lt(e),this.#h()||this.discard(),t}}if(F=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(Et=null,Dt=null,this.#h()){this.#x(n),this.#x(t);for(let[e,t]of this.#f)It(e,t);r.length>0&&F.#_();return}let a=this.#y();if(a)this.#x(n),this.#x(t),a.#b(this);else{this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),xt=this,Pt(n),Pt(t),xt=null,this.#s?.resolve();var o=F;if(this.#a===0&&(this.#c.length===0||o!==null)&&this.#S(),this.#c.length>0){if(o!==null){for(let e of this.#c)o.#c.push(e);this.#c=[]}else o=this}o!==null&&(zt.clear(),o.#_())}}#v(e,t,n){e.f^=v;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=v:i&4?t.push(r):rr(r)&&(i&16&&this.#d.add(r),lr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),$e(i,y),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),F=this,this.#_()}#x(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=h()).promise}static ensure(){if(F===null){let t=F=new e;!Tt&&!wt&&Xe(()=>{t.#e||t.flush()})}return F}apply(){St=null}schedule(e){Ct=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)?e.b.defer_effect(e):this.#c.push(e)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?bt=e:t.#t=e,this.linked=!1}}};function jt(e){var t=wt;wt=!0;try{var n;for(e&&(F!==null&&!F.is_fork&&F.flush(),n=e());;){if(Ze(),F===null)return n;F.flush()}}finally{wt=t}}function Mt(){try{Pe()}catch(e){pn(e,Ct)}}var Nt=null;function Pt(e){var t=e.length;if(t!==0){for(var n=0;n0)){zt.clear();for(let e of Nt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)Nt.has(n)&&(Nt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||lr(n)}}Nt.clear()}}Nt=null}}function Ft(e){F.schedule(e)}function It(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),$e(e,v);for(var n=e.first;n!==null;)It(n,t),n=n.next}}function Lt(e){$e(e,v);for(var t=e.first;t!==null;)Lt(t),t=t.next}var Rt=new Set,zt=new Map,Bt=!1;function Vt(e,t){return{f:0,v:e,reactions:null,equals:Te,rv:0,wv:0}}function I(e,t){let n=Vt(e,t);return qn(n),n}function Ht(e,t=!1,n=!0){let r=Vt(e);return t||(r.equals=De),Be&&n&&He!==null&&He.l!==null&&(He.l.s??=[]).push(r),r}function L(e,t,n=!1){return U!==null&&(!Un||U.f&131072)&&qe()&&U.f&4325394&&(Kn===null||!Kn.has(e))&&Re(),Gt(e,n?Xt(t):t,Dt)}var Ut=null,Wt=0;function Gt(e,t,n=null){if(!e.equals(t)){Vn?zt.set(e,t):zt.has(e)||zt.set(e,e.v);var r=At.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&>(t),St===null&&et(t)}e.wv=nr(),Ut=null,Wt=0,Yt(e,y,n),Ut=null,qe()&&W!==null&&W.f&1024&&!(W.f&96)&&(Xn===null?Zn([e]):Xn.push(e)),!r.is_fork&&Rt.size>0&&!Bt&&Kt()}return t}function Kt(){Bt=!1;for(let e of Rt){e.f&1024&&$e(e,b);let t;try{t=rr(e)}catch{t=!0}t&&lr(e)}Rt.clear()}function qt(e,t=1){var n=G(e),r=t===1?n++:n--;return L(e,n),r}function Jt(e){L(e,e.v+1)}function Yt(e,t,n){var r=e.reactions;if(r!==null){var i=qe(),a=r.length;if(Wt+=a,Wt>1e5&&Ut===null&&(Ut=new Set),Ut!==null){if(Ut.has(e))return;Ut.add(e)}for(var o=0;o{if(er===d)return e();var t=U,n=er;Wn(null),tr(d);var r=e();return Wn(t),tr(n),r};return i&&r.set(`length`,I(t.length,u)),new Proxy(t,{defineProperty(e,t,n){`value`in n&&n.configurable!==!1&&n.enumerable!==!1&&n.writable!==!1||Ie();var i=r.get(t);return i===void 0?f(()=>{var e=I(n.value,u);return r.set(t,e),e}):L(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>I(A,u));r.set(t,e),Jt(o)}}else L(n,A),Jt(o);return!0},get(e,n,i){if(n===re)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>I(Xt(s?e[n]:A),u)),r.set(n,o)),o!==void 0){var c=G(o);return c===A?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var n=Reflect.getOwnPropertyDescriptor(e,t),i=r.get(t);if(i!==void 0){var a=G(i);if(a===A)return;if(n&&`value`in n)n.value=a;else return{enumerable:!0,configurable:!0,value:a,writable:!0}}return n},has(e,t){if(t===re)return!0;var n=r.get(t),i=n!==void 0&&n.v!==A||Reflect.has(e,t);return(n!==void 0||W!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>I(i?Xt(e[t]):A,u)),r.set(t,n)),G(n)===A)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;dI(A,u)),r.set(d+``,p)):L(p,A)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>I(void 0,u)),L(c,Xt(n)),r.set(t,c));else{l=c.v!==A;var m=f(()=>Xt(n));L(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&L(g,_+1)}Jt(o)}return!0},ownKeys(e){G(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==A});for(var[n,i]of r)i.v!==A&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Le()}})}function Zt(e){try{if(typeof e==`object`&&e&&re in e)return e[re]}catch{}return e}function Qt(e,t){return Object.is(Zt(e),Zt(t))}var $t,en,tn,nn;function rn(){if($t===void 0){$t=window,en=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;tn=a(t,`firstChild`).get,nn=a(t,`nextSibling`).get,u(e)&&(e[ce]=void 0,e[se]=null,e[k]=void 0,e.__e=void 0),u(n)&&(n[le]=void 0)}}function an(e=``){return document.createTextNode(e)}function on(e){return tn.call(e)}function sn(e){return nn.call(e)}function R(e,t){if(!j)return on(e);var n=on(M);if(n===null)n=M.appendChild(an());else if(t&&n.nodeType!==3){var r=an();return n?.before(r),be(r),r}return t&&dn(n),be(n),n}function z(e,t=!1){if(!j){var n=on(e);return n instanceof Comment&&n.data===``?sn(n):n}if(t){if(M?.nodeType!==3){var r=an();return M?.before(r),be(r),r}dn(M)}return M}function B(e,t=!1){if(!j)return on(e);var n=R(e,t);return N(e),n}function V(e,t=1,n=!1){let r=j?M:e;for(var i;t--;)i=r,r=sn(r);if(!j)return r;if(n){if(r?.nodeType!==3){var a=an();return r===null?i?.after(a):r.before(a),be(a),a}dn(r)}return be(r),r}function cn(e){e.textContent=``}function ln(){return!1}function un(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function dn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function fn(e){var t=W;if(t===null)return U.f|=ne,e;if(!(t.f&32768)&&!(t.f&4))throw e;pn(e,t)}function pn(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function mn(e){W===null&&(U===null&&Ne(e),Me()),Vn&&je(e)}function hn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function gn(e,t){var n=W;n!==null&&n.f&8192&&(e|=x);var r={ctx:He,deps:null,nodes:null,f:e|y|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};F?.register_created_effect(r);var i=r;if(e&4)Et===null?At.ensure().schedule(r):Et.push(r);else if(t!==null){try{lr(r)}catch(e){throw jn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=T))}if(i!==null&&(i.parent=n,n!==null&&hn(i,n),U!==null&&U.f&2&&!(e&64))){var a=U;(a.effects??=[]).push(i)}return r}function _n(){return U!==null&&!Un}function vn(e){let t=gn(8,null);return $e(t,v),t.teardown=e,t}function yn(e){mn(`$effect`);var t=W.f;if(!U&&t&32&&He!==null&&!He.i){var n=He;(n.e??=[]).push(e)}else return bn(e)}function bn(e){return gn(4|D,e)}function xn(e){return mn(`$effect.pre`),gn(8|D,e)}function Sn(e){At.ensure();let t=gn(64|E,e);return(e={})=>new Promise(n=>{e.outro?Pn(t,()=>{jn(t),n(void 0)}):(jn(t),n(void 0))})}function Cn(e){return gn(4,e)}function wn(e){return gn(O|E,e)}function Tn(e,t=0){return gn(8|t,e)}function H(e,t=[],n=[],r=[]){st(r,t,n,t=>{gn(8,()=>{e(...t.map(G))})})}function En(e,t=0){return gn(16|t,e)}function Dn(e){return gn(32|E,e)}function On(e){var t=e.teardown;if(t!==null){let n=Vn,r=U;Hn(!0),Wn(null);try{t.call(null)}catch(t){pn(t,e.parent)}finally{Hn(n),Wn(r)}}}function kn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&at(()=>{e.abort(de)});var r=n.next;n.f&64?n.parent=null:jn(n,t),n=r}}function An(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||jn(t),t=n}}function jn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Mn(e.nodes.start,e.nodes.end),n=!0),e.f|=w,kn(e,t&&!n),cr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();On(e),e.f^=w,e.f|=S;var i=e.parent;i!==null&&i.first!==null&&Nn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Mn(e,t){for(;e!==null;){var n=e===t?null:sn(e);e.remove(),e=n}}function Nn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Pn(e,t,n=!0){var r=[];e.f|=256,Fn(e,r,!0);var i=()=>{n&&jn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Fn(e,t,n){if(!(e.f&8192)){e.f^=x;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);Fn(i,t,o?n:!1)}i=a}}}function In(e){e.f&=-257,Ln(e,!0)}function Ln(e,t){if(!(e.f&256)&&e.f&8192){e.f^=x,e.f&1024||($e(e,y),At.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);Ln(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Rn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:sn(n);t.append(n),n=i}}var zn=null,Bn=!1,Vn=!1;function Hn(e){Vn=e}var U=null,Un=!1;function Wn(e){U=e}var W=null;function Gn(e){W=e}var Kn=null;function qn(e){U!==null&&(U.f&2097152||U.f&2)&&(Kn??=new Set).add(e)}var Jn=null,Yn=0,Xn=null;function Zn(e){Xn=e}var Qn=1,$n=0,er=$n;function tr(e){er=e}function nr(){return++Qn}function rr(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&St===null&&$e(e,v)}return!1}function ir(e,t,n=!0){var r=e.reactions;if(r!==null&&!(Kn!==null&&Kn.has(e)))for(var i=0;i{e.ac.abort(de)}),e.ac=null);try{e.f|=te;var u=e.fn,d=u();e.f|=C;var f=or(e);if(qe()&&Xn!==null&&!Un&&f!==null&&!(e.f&6146))for(var p=0;p0)for(t.length=Yn+Jn.length,r=0;r{s.ac.abort(de),s.ac=null,$e(s,y)}),vt(s),cr(s,0)}}function cr(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,Xe(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function Sr(e,t,n,r,i){var a={capture:r,passive:i},o=xr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&vn(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function K(e,t,n){(t[vr]??={})[e]=n}function Cr(e){for(var t=0;t{Tr=!1,wr=null}));var s=0,c=wr===e&&e[vr];if(c){var l=a.indexOf(c);if(l!==-1&&(t===document||t===window)){e[vr]=t;return}var u=a.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(o=a[s]||e.target,o!==t){i(e,`currentTarget`,{configurable:!0,get(){return o||n}});var d=U,f=W;Wn(null),Gn(null);try{for(var p,m=[];o!==null&&o!==t;){try{var h=o[vr]?.[r];h==null||o.disabled&&e.target!==o||h.call(o,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;s++,o=s{throw e});throw p}}finally{e[vr]=t,delete e.currentTarget,Wn(d),Gn(f)}}}var Dr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function Or(e){return Dr?.createHTML(e)??e}function kr(e){var t=un(`template`);return t.innerHTML=Or(e.replaceAll(``,``)),t.content}function Ar(e,t){var n=W;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function q(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(``);return()=>{if(j)return Ar(M,null),M;i===void 0&&(i=kr(a?e:``+e),n||(i=on(i)));var t=r||en?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=on(t),s=t.lastChild;Ar(o,s)}else Ar(t,t);return t}}function jr(e,t,n=`svg`){var r=!e.startsWith(``),i=!!(t&1),a=`<${n}>${r?e:``+e}`,o;return()=>{if(j)return Ar(M,null),M;if(!o){var e=on(kr(a));if(i)for(o=document.createDocumentFragment();on(e);)o.appendChild(on(e));else o=on(e)}var t=o.cloneNode(!0);if(i){var n=on(t),r=t.lastChild;Ar(n,r)}else Ar(t,t);return t}}function Mr(e,t){return jr(e,t,`svg`)}function Nr(e=``){if(!j){var t=an(e+``);return Ar(t,t),t}var n=M;return n.nodeType===3?dn(n):(n.before(n=an()),be(n)),Ar(n,n),n}function Pr(){if(j)return Ar(M,null),M;var e=document.createDocumentFragment(),t=document.createComment(``),n=an();return e.append(t,n),Ar(t,n),e}function J(e,t){if(j){var n=W;n.f&32768&&n.nodes.end!==null||(n.nodes.end=M),xe()}else e!==null&&e.before(t)}function Fr(){if(j&&M&&M.nodeType===8&&M.textContent?.startsWith(`$`)){let e=M.textContent.substring(1);return xe(),e}return(window.__svelte??={}).uid??=1,`c${window.__svelte.uid++}`}function Ir(e){let t=0,n=Vt(0),r;return()=>{_n()&&(G(n),Tn(()=>(t===0&&(r=pr(()=>e(()=>Jt(n)))),t+=1,()=>{Xe(()=>{--t,t===0&&(r?.(),r=void 0,Jt(n))})})))}}var Lr=T|E;function Rr(e,t,n,r){new zr(e,t,n,r)}var zr=class{parent;is_pending=!1;transform_error;#e;#t=j?M:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=Ir(()=>(this.#m=Vt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=W;t.b=this,t.f|=128,n(e)},this.parent=W.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=En(()=>{if(j){let e=this.#t;xe();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#y():this.#g()}else this.#b()},Lr),j&&(this.#e=M)}#g(){try{this.#a=Dn(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#v(e);Xe(r),t&&(this.#s=Dn(()=>{t(this.#e,()=>e,()=>n)}))}#v(e){var t=!1,n=!1;let r=()=>{t?ve():(t=!0,n&&ze(),this.#s!==null&&Pn(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()}))};return{reset:r,invoke_onerror:()=>{try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){pn(e,this.#i&&this.#i.parent)}}}}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=Dn(()=>e(this.#e)),Xe(()=>{var e=this.#c=document.createDocumentFragment(),t=an(),n=!1;e.append(t),this.#a=this.#S(()=>{try{return Dn(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){pn(e,this.#i.parent)}return null}}),this.#a===null?(this.#c=null,n&&this.#x(F)):this.#u===0&&(this.#e.before(e),this.#c=null,Pn(this.#o,()=>{this.#o=null}),this.#x(F))}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=Dn(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Rn(this.#a,e);let t=this.#n.pending;this.#o=Dn(()=>t(this.#e))}else this.#x(F)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){tt(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=W,n=U,r=He;Gn(this.#i),Wn(this.#i),Ue(this.#i.ctx);try{return At.ensure(),e()}finally{Gn(t),Wn(n),Ue(r)}}#C(e,t){this.has_pending_snippet()?(this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&Pn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))):this.parent&&this.parent.#C(e,t)}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,Xe(()=>{this.#d=!1,this.#m&&Gt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),G(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;F?.is_fork?(this.#a&&F.skip_effect(this.#a),this.#o&&F.skip_effect(this.#o),this.#s&&F.skip_effect(this.#s),F.oncommit(()=>{this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(jn(this.#a),null),this.#o&&=(jn(this.#o),null),this.#s&&=(jn(this.#s),null),j&&(be(this.#t),Se(),be(Ce()));let t=this.#n.failed,n=e=>{let{reset:n,invoke_onerror:r}=this.#v(e);r(),t&&(this.#s=this.#S(()=>{try{return Dn(()=>{var r=W;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return pn(e,this.#i.parent),null}}))};Xe(()=>{var t;try{t=this.transform_error(e)}catch(e){pn(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>pn(e,this.#i&&this.#i.parent)):n(t)})}};function Y(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[le]??=e.nodeValue)&&(e[le]=n,e.nodeValue=`${n}`)}function Br(e,t){return Hr(e,t)}var Vr=new Map;function Hr(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){rn();var l=void 0,u=Sn(()=>{var s=n??t.appendChild(an());Rr(s,{pending:()=>{}},t=>{We({});var n=He;if(o&&(n.c=o),a&&(i.$$events=a),j&&Ar(t,null),l=e(t,i)||Ke(),j&&(W.nodes.end=M,M===null||M.nodeType!==8||M.data!==`]`))throw ge(),pe;Ge()},c);var u=new Set,d=e=>{for(var n=0;n{for(var e of u)for(let n of[t,document]){var r=Vr.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,Er),r.delete(e),r.size===0&&Vr.delete(n)):r.set(e,i)}br.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return Ur.set(l,u),l}var Ur=new WeakMap,Wr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)In(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(In(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(jn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Rn(r,t),t.append(an()),this.#n.set(e,{effect:r,fragment:t})}else jn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Pn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(jn(n.effect),this.#n.delete(e))};ensure(e,t){var n=F,r=ln();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=an();i.append(a),this.#n.set(e,{effect:Dn(()=>t(a)),fragment:i})}else this.#t.set(e,Dn(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else j&&(this.anchor=M),this.#a(n)}};function X(e,t,n=!1){var r;j&&(r=M,xe());var i=new Wr(e),a=n?T:0;function o(e,t){if(j){var n=we(r);if(e!==parseInt(n.substring(1))){var a=Ce();be(a),i.anchor=a,ye(!1),i.ensure(e,t),ye(!0);return}}i.ensure(e,t)}En(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}var Gr=Symbol(`NaN`);function Kr(e,t,n){j&&xe();var r=new Wr(e),i=!qe();En(()=>{var e=t();e!==e&&(e=Gr),i&&typeof e==`object`&&e&&(e={}),r.ensure(e,n)})}function qr(e,t){return t}function Jr(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Yr(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;cn(d),d.append(u),e.items.clear()}Yr(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Yr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Qr(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=ee,ei(d,null,c)):In(d):Pn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:En(()=>{p=G(f);var e=p.length;let t=!1;j&&we(c)===`[!`!=(e===0)&&(c=Ce(),be(c),ye(!1),t=!0);for(var r=new Set,u=F,v=ln(),y=0;ys(c)):(d=Dn(()=>s(Xr??=an())),d.f|=ee)),e>r.size&&Ae(``,``,``),j&&e>0&&be(Ce()),!h){if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u)}t&&ye(!0),G(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,j&&(c=M)}function Zr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Qr(e,t,n,i,a){var o=!!(i&8),s=t.length,c=e.items,l=Zr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v0){var E=i&4&&s===0?n:null;if(o){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function $r(e,t,n,r,i,a,o,s){var c=o&1?o&16?Vt(n):Ht(n,!1,!1):null,l=o&2?Vt(i):null;return{v:c,i:l,e:Dn(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function ei(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=sn(r);if(a.before(r),r===i)return;r=o}}function ti(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function ni(e,t,...n){var r=new Wr(e);En(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},T)}function ri(e,t,n){var r;j&&(r=M,xe());var i=new Wr(e);En(()=>{var e=t()??null;if(j&&we(r)===`[`!=(e!==null)){var a=Ce();be(a),i.anchor=a,ye(!1),i.ensure(e,e&&(t=>n(t,e))),ye(!0)}else i.ensure(e,e&&(t=>n(t,e)))},T)}var ii=[...` +\r\f\xA0\v`];function ai(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||ii.includes(r[o-1]))&&(s===r.length||ii.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function oi(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function si(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function ci(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\/\*.*?\*\//g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(si)),i&&c.push(...Object.keys(i).map(si));var l=0,u=-1;let t=e.length;for(var d=0;d{t.every(vi)||(`__defaultValue`in e&&pi(e,!1),`__value`in e&&mi(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),vn(()=>{t.disconnect()})}function gi(e,t,n=t){var r=new WeakSet,i=!0;ot(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),_i);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&_i(o)}n(a),e.__value=a,F!==null&&r.add(F)}),Cn(()=>{var a=t();if(e===document.activeElement){var o=F;if(r.has(o))return}if(mi(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=_i(s),n(a))}e.__value=a,i=!1})}function _i(e){return`__value`in e?e.__value:e.value}function vi(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var yi=Symbol(`is custom element`),bi=Symbol(`is html`),xi=fe?`link`:`LINK`;function Si(e){if(j){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Q(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Q(e,`checked`,null),e.checked=r}}};e[ue]=n,Xe(n),it()}}function Ci(e,t){var n=wi(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Q(e,t,n,r){var i=wi(e);j&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===xi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[oe]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Ei(e).has(t)?e[t]=n:e.setAttribute(t,n))}function wi(e){return e[se]??={[yi]:e.nodeName.includes(`-`),[bi]:e.namespaceURI===me}}var Ti=new Map;function Ei(e){var t=e.getAttribute(`is`)||e.nodeName,n=Ti.get(t);if(n)return n;Ti.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.add(s);i=l(i)}return n}function Di(e,t,n=t){var r=new WeakSet;ot(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Mi(e)?Ni(a):a,n(a),F!==null&&r.add(F),await ur(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(j&&e.defaultValue!==e.value||pr(t)==null&&e.value)&&(n(Mi(e)?Ni(e.value):e.value),F!==null&&r.add(F)),Tn(()=>{var n=t();if(e===document.activeElement){var i=F;if(r.has(i))return}Mi(e)&&n===Ni(e.value)||(e.type!==`date`||n||e.value)&&n!==e.value&&(e.value=n??``)})}var Oi=new Set;function ki(e,t,n,r,i=r){var a=n.getAttribute(`type`)===`checkbox`,o=e;let s=!1;if(t!==null)for(var c of t)o=o[c]??=[];o.push(n),ot(n,`change`,()=>{var e=n.__value;a&&(e=ji(o,e,n.checked)),i(e)},()=>i(a?[]:null)),Tn(()=>{var e=r();j&&n.defaultChecked!==n.checked?s=!0:a?(e||=[],n.checked=e.includes(n.__value)):n.checked=Qt(n.__value,e)}),vn(()=>{var e=o.indexOf(n);e!==-1&&o.splice(e,1)}),Oi.has(o)||(Oi.add(o),Xe(()=>{o.sort((e,t)=>e.compareDocumentPosition(t)===4?-1:1),Oi.delete(o)})),Xe(()=>{if(s){var e=a?ji(o,e,n.checked):o.find(e=>e.checked)?.__value;i(e)}})}function Ai(e,t,n=t){ot(e,`change`,t=>{n(t?e.defaultChecked:e.checked)}),(j&&e.defaultChecked!==e.checked||pr(t)==null)&&n(e.checked),Tn(()=>{e.checked=!!t()})}function ji(e,t,n){for(var r=new Set,i=0;i{var n=this.#e.get(e);n.delete(t),n.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#r(){return this.#t??=new ResizeObserver(t=>{for(var n of t){e.entries.set(n.target,n);for(var r of this.#e.get(n.target)||[])r(n)}})}}({box:`border-box`});function Fi(e,t,n){var r=Pi.observe(e,()=>n(e[t]));Cn(()=>(pr(()=>n(e[t])),r))}function Ii(e,t){return e===t||e?.[re]===t}function Li(e=Ke(),t,n,r){var i=He.r,a=W;return Cn(()=>{var o,s;return Tn(()=>{o=s,s=r?.()||[],pr(()=>{Ii(n(...s),e)||(t(e,...s),o&&Ii(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Ii(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Ri(e,t,n,r,i){var a=()=>{r(n[e])};n.addEventListener(t,a),i?Tn(()=>{n[e]=i()}):a(),(n===document.body||n===window||n===document)&&vn(()=>{n.removeEventListener(t,a)})}function zi(e=!1){let t=He,n=t.l.u;if(!n)return;let r=()=>mr(t.s);if(e){let e=0,n={},i=dt(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>G(i)}n.b.length&&xn(()=>{Bi(t,r),m(n.b)}),yn(()=>{let e=pr(()=>n.m.map(p));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&yn(()=>{Bi(t,r),m(n.a)})}function Bi(e,t){if(e.l.s)for(let t of e.l.s)G(t);t()}var Vi=!1;function Hi(e){var t=Vi;try{return Vi=!1,[e(),Vi]}finally{Vi=t}}var Ui={get(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(d(r)&&(r=r()),typeof r==`object`&&r&&t in r)return r[t]}},set(e,t,n){let r=e.props.length;for(;r--;){let i=e.props[r];d(i)&&(i=i());let o=a(i,t);if(o&&o.set)return o.set(n),!0}return!1},getOwnPropertyDescriptor(e,t){let n=e.props.length;for(;n--;){let r=e.props[n];if(d(r)&&(r=r()),typeof r==`object`&&r&&t in r){let e=a(r,t);return e&&!e.configurable&&(e.configurable=!0),e}}},has(e,t){if(t===re||t===ae)return!1;for(let n of e.props)if(d(n)&&(n=n()),n!=null&&t in n)return!0;return!1},ownKeys(e){let t=[];for(let n of e.props)if(d(n)&&(n=n()),n){for(let e in n)t.includes(e)||t.push(e);for(let e of Object.getOwnPropertySymbols(n))t.includes(e)||t.push(e)}return t}};function Wi(...e){return new Proxy({props:e},Ui)}function Gi(e,t,n,r){var i=!Be||!!(n&2),o=!!(n&8),s=!!(n&16),c=r,l=!0,u=void 0,d=()=>s&&i?(u??=dt(r),G(u)):(l&&(l=!1,c=s?pr(r):r),c);let f;if(o){var p=re in e||ae in e;f=a(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;o?[m,h]=Hi(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Fe(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?dt:mt)(()=>(v=!1,g()));o&&G(y);var b=W;return(function(e,t){if(arguments.length>0){let n=t?G(y):i&&o?Xt(e):e;return L(y,n),v=!0,c!==void 0&&(c=n),e}return Vn&&v||b.f&16384?y.v:G(y)})}function Ki(e){He===null&&Oe(`onMount`),Be&&He.l!==null?Ji(He).m.push(e):yn(()=>{let t=pr(e);if(typeof t==`function`)return t})}function qi(e){He===null&&Oe(`onDestroy`),Ki(()=>()=>pr(e))}function Ji(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);function Yi(e,t){if(e instanceof RegExp)return{keys:!1,pattern:e};var n,r,i,a,o=[],s=``,c=e.split(`/`);for(c[0]||c.shift();i=c.shift();)n=i[0],n===`*`?(o.push(`wild`),s+=`/(.*)`):n===`:`?(r=i.indexOf(`?`,1),a=i.indexOf(`.`,1),o.push(i.substring(1,~r?r:~a?a:i.length)),s+=~r&&!~a?`(?:/([^/]+?))?`:`/([^/]+?)`,~a&&(s+=(~r?`?`:``)+`\\`+i.substring(a))):s+=`/`+i;return{keys:o,pattern:RegExp(`^`+s+(t?`(?=$|/)`:`/?$`),`i`)}}var Xi=new class{#e=I(Zi());get _loc(){return G(this.#e)}set _loc(e){L(this.#e,e)}#t=P(()=>this._loc.location);get _location(){return G(this.#t)}set _location(e){L(this.#t,e)}#n=P(()=>this._loc.querystring);get _querystring(){return G(this.#n)}set _querystring(e){L(this.#n,e)}#r=I(void 0);get _params(){return G(this.#r)}set _params(e){L(this.#r,e)}get loc(){return this._loc}get location(){return this._location}get querystring(){return this._querystring}get params(){return this._params}constructor(){typeof window<`u`?window.addEventListener(`hashchange`,()=>{this._loc=Zi()}):console.warn(`[svelte-spa-router] window 'window' is not defined, skipping initiation`)}};function Zi(){let e=typeof window<`u`?window.location.href:``,t=e.indexOf(`#/`),n=t>-1?e.substr(t+1):`/`,r=n.indexOf(`?`),i=``;return r>-1&&(i=n.substr(r+1),n=n.substr(0,r)),{location:n,querystring:i}}async function Qi(e){if(!e||e.length<1||e.charAt(0)!=`/`&&e.indexOf(`#/`)!==0)throw Error(`Invalid parameter location`);await ur();let t=(e.charAt(0)==`#`?``:`#`)+e;try{let e={...history.state};delete e.__svelte_spa_router_scrollX,delete e.__svelte_spa_router_scrollY,window.history.replaceState(e,``,t)}catch{console.warn("Caught exception while replacing the current page. If you're running this in the Svelte REPL, please note that the `replace` method might not work in this environment.")}window.dispatchEvent(new Event(`hashchange`))}function $i(e){e?window.scrollTo(e.__svelte_spa_router_scrollX||0,e.__svelte_spa_router_scrollY||0):window.scrollTo(0,0)}function ea(e,t){We(t,!0);let n=Gi(t,`routes`,19,()=>({})),r=Gi(t,`prefix`,3,``),i=Gi(t,`restoreScrollState`,3,!1),a=Gi(t,`onConditionsFailed`,3,()=>{}),o=Gi(t,`onRouteLoaded`,3,()=>{}),s=Gi(t,`onRouteLoading`,3,()=>{}),c=Gi(t,`onRouteEvent`,3,()=>{});class l{path;component;conditions;userData;props;_pattern;_keys;constructor(e,t){let n=e=>typeof e==`object`&&!!e&&e._sveltesparouter===!0;if(!t||typeof t!=`function`&&!n(t))throw Error(`Invalid component object`);if(!e||typeof e==`string`&&(e.length<1||e.charAt(0)!=`/`&&e.charAt(0)!=`*`)||typeof e==`object`&&!(e instanceof RegExp))throw Error(`Invalid value for "path" argument - strings must start with / or *`);let r=Yi(e);if(this.path=e,n(t)){let e=t;this.component=e.component,this.conditions=e.conditions||[],this.userData=e.userData,this.props=e.props||{}}else{let e=t;this.component=()=>Promise.resolve(e),this.conditions=[],this.props={}}this._pattern=r.pattern,this._keys=r.keys}match(e){if(r()){if(typeof r()==`string`){if(e.startsWith(r()))e=e.substr(r().length)||`/`;else return null}else if(r()instanceof RegExp){let t=e.match(r());if(t&&t[0])e=e.substr(t[0].length)||`/`;else return null}}let t=this._pattern.exec(e);if(t===null)return null;if(this._keys===!1)return t;let n={},i=0;for(;i{u.push(new l(t,e))}):Object.keys(n()).forEach(e=>{let t=n();u.push(new l(e,t[e]))});let d=I(null),f=I(null),p=I({}),m=null,h=null;yn(()=>{history.scrollRestoration=i()?`manual`:`auto`}),yn(()=>{if(!i())return;let e=e=>{m=e.state&&(e.state.__svelte_spa_router_scrollY||e.state.__svelte_spa_router_scrollX)?e.state:null};return window.addEventListener(`popstate`,e),()=>window.removeEventListener(`popstate`,e)});async function g(e,t){await ur(),e(t)}yn(()=>{let e=Xi.loc,t=!1;return pr(async()=>{let n=0;for(;n{t=!0}});function _(e){return e&&typeof e==`object`&&Object.keys(e).length?e:null}var v=Pr(),y=z(v),b=e=>{let t=P(()=>G(d));var n=Pr(),r=z(n),i=e=>{var n=Pr();ri(z(n),()=>G(t),(e,t)=>{t(e,Wi({get params(){return G(f)},get onRouteEvent(){return c()}},()=>G(p)))}),J(e,n)},a=e=>{var n=Pr();ri(z(n),()=>G(t),(e,t)=>{t(e,Wi({get onRouteEvent(){return c()}},()=>G(p)))}),J(e,n)};X(r,e=>{G(f)?e(i):e(a,-1)}),J(e,n)};X(y,e=>{G(d)&&e(b)}),J(e,v),Ge()}var ta=[`bars`,`pace`,`pie`,`fuel`,`resets`,`thresholds`];function na(e){return e===`zone`||e===`consumption-pace`?`pace`:typeof e==`string`&&ta.includes(e)?e:`bars`}var ra=`codexometer.web.preferences.v1`,ia={statusLine:null,tab:`quota`,view:`bars`,selected:``,defaultDetail:0,layouts:[]};function aa(){try{let e=JSON.parse(localStorage.getItem(ra)||`null`);return!e||typeof e!=`object`?ia:{statusLine:Array.isArray(e.statusLine)?[...new Set(e.statusLine.filter(e=>typeof e==`string`&&e.length<64))].slice(0,32):null,tab:[`quota`,`sessions`,`usage`].includes(e.tab)?e.tab:`quota`,view:na(e.view),selected:typeof e.selected==`string`?e.selected.slice(0,256):``,defaultDetail:+(e.defaultDetail===1),layouts:Array.isArray(e.layouts)?e.layouts.filter(e=>{if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&t.id.length<=256&&[0,1,2].includes(t.level)}).slice(-100):[]}}catch{return ia}}var oa=Xt(aa()),sa=Xt({open:!1}),ca=Xt({requests:0});function la(){let e=JSON.stringify(oa);try{localStorage.setItem(ra,e)}catch{}}function ua(){return oa.tab===`quota`?`/quota/`+oa.view:`/`+oa.tab}function da(e){return oa.layouts.find(t=>t.id===e)?.level??oa.defaultDetail}function fa(e){oa.defaultDetail=e,oa.layouts=[]}function pa(e,t){oa.layouts=[...oa.layouts.filter(t=>t.id!==e),{id:e,level:Math.max(0,Math.min(2,t))}].slice(-100)}var $=Xt({data:null,connected:!1,error:``}),ma=e=>e==null?`Unavailable`:e.toLocaleString(`en-GB`),ha=e=>!e||String(e).startsWith(`0001-`)?`Not yet available`:new Date(typeof e==`number`?e*1e3:e).toLocaleString(`en-GB`),ga=`codexometer.web.session`,_a=class extends Error{},va;async function ya(e,t,n){if(!va||!$.connected||!$.data?.control||$.data.sessionsError)throw Error(`Session controls unavailable. Check the live connection.`);return await va(e,t,n)}function ba(){let e=new AbortController,t,n=``;va=async(t,r,i)=>{let a=await fetch(`/api/control/`+t,{method:`POST`,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.any([e.signal,AbortSignal.timeout(8e3),...i?[i]:[]]),cache:`no-store`});if(!a.ok)throw a.status===502?Error(`Outcome uncertain. Check Codex before taking another action; nothing was retried.`):new _a(`Action rejected, expired or changed. Refresh and check Codex; nothing was retried.`);return a.json()};try{n=sessionStorage.getItem(ga)||``}catch{}let r=location.hash,i=r.startsWith(`#pair=`)?r.slice(6):``;(i||!r||r===`#`)&&(history.replaceState(null,``,`/#`+ua()),window.dispatchEvent(new HashChangeEvent(`hashchange`)));async function a(){if(i)try{let t=await fetch(`/api/pair`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({secret:i}),signal:e.signal});if(!t.ok)throw Error(`Pairing link expired or already used. Restart --web for a fresh link.`);n=(await t.json()).token;try{sessionStorage.setItem(ga,n)}catch{}}catch(t){e.signal.aborted||($.error=t instanceof Error?t.message:`Pairing failed`);return}n?await o():$.error=`Open the private pairing link printed by codexometer --web in your terminal.`}async function o(){try{let t=await fetch(`/api/events`,{headers:{Authorization:`Bearer ${n}`},signal:e.signal,cache:`no-store`});if(t.status===401){try{sessionStorage.removeItem(ga)}catch{}$.error=`Browser session expired. Restart --web and open its new pairing link.`;return}if(!t.ok||!t.body)throw Error(`Live connection unavailable`);let r=t.body.getReader(),i=new TextDecoder,a=``;for(;!e.signal.aborted;){let{done:e,value:t}=await r.read();if(e)break;a+=i.decode(t,{stream:!0});let n;for(;(n=a.indexOf(` + +`))>=0;){let e=a.slice(0,n);a=a.slice(n+2),e.startsWith(`data: `)&&($.data=JSON.parse(e.slice(6)),$.connected=!0,$.error=``)}}}catch{}finally{$.connected=!1}e.signal.aborted||($.error=`Connection lost — showing last observation. Reconnecting…`,t=setTimeout(o,2500))}return a(),()=>{va=void 0,e.abort(),clearTimeout(t),$.connected=!1}}Ve();var xa=q(`

        Quota refresh failed. Policy state is based on the last successful + observation.

        `),Sa=q(`

        `),Ca=q(`

        The longest Codex quota window selects one active model profile. ASK + creates a per-session review; AUTO applies the profile on the next + eligible check.

        `,1),wa=q(`

        No threshold-based model steps were configured at launch.

        `);function Ta(e,t){We(t,!1),zi();var n=Pr(),r=z(n),i=e=>{var t=Ca(),n=z(t),r=B(n),i=V(n,2),a=e=>{J(e,xa())};X(i,e=>{$.data.quotaError&&e(a)});var o=V(i,2),s=R(o),c=B(s),l=V(s,4);Z(l,5,()=>$.data.thresholds,qr,(e,t)=>{var n=Sa();let r;var i=R(n),a=B(i),o=V(i,2),s=R(o),c=B(s,!0),l=B(V(s,2));N(o);var u=V(o,2),d=B(u,!0),f=B(V(u,2));N(n),H((e,i)=>{r=li(n,1,``,null,r,{active:G(t).state===`ACTIVE`,next:G(t).state===`NEXT`}),Y(a,`${G(t).threshold??``}%`),Y(c,G(t).model),Y(l,`${e??``} REASONING // ${i??``} + SPEED`),Y(d,G(t).mode),Y(f,`${G(t).state??``}${G(t).state===`NEXT`?` // ${G(t).remaining||0} PP TO GO`:``}`)},[()=>G(t).effort.toUpperCase(),()=>G(t).speed.toUpperCase()]),J(e,n)}),N(l),N(o),H(e=>{Y(r,`MODEL STEP POLICY // OBSERVED ${e??``}`),Y(c,`THRESHOLDS // ${$.data.thresholds.length??``} CONFIGURED`)},[()=>ha($.data.quotaAt)]),J(e,t)},a=e=>{J(e,wa())};X(r,e=>{$.data?.thresholds?.length?e(i):e(a,-1)}),J(e,n),Ge()}var Ea=Mr(` `,1),Da=Mr(` `,1),Oa=Mr(` `,1),ka=Mr(` `,1),Aa=q(`
        `,1),ja=q(` `),Ma=q(`
        Quota observations
        Observed atPeriod elapsedConsumedTrail segment
        `),Na=q(`
        OBSERVATION DATA
        `),Pa=q(`
        CONSUMPTIONQUOTA PERIOD ELAPSED
        `,1);function Fa(e,t){let n=Fr();We(t,!0);let r=Gi(t,`trail`,19,()=>[]),i=I(!1),a=I(!0),o=I(`window`),s=[0,25,50,75,100],c=P(()=>t.plot?.known?t.plot.elapsed:t.elapsed),l=I(400),u=I(240),d=P(()=>G(l)-24),f=P(()=>G(u)-48),p=P(()=>Math.max(1,G(d)-48)),m=P(()=>Math.max(1,G(f)-20)),h=P(()=>48+Math.max(0,Math.min(100,G(c)))/100*G(p));function g(e){return G(f)-(e-0)/100*G(m)}let _=P(()=>g(t.used)),v=P(()=>t.used-G(c)),y=P(()=>r().map((e,t)=>`${t===0||e.break?`M`:`L`}${48+e.elapsed/100*G(p)} ${g(e.used)}`).join(` `)),b=P(()=>{let e=0;for(let t=r().length-1;t>0;t--)if(r()[t].break){e=t;break}return r().slice(e)}),x=P(()=>G(b).length<2?0:Math.max(0,Date.parse(G(b).at(-1).at)-Date.parse(G(b)[0].at))),S=P(()=>Object.fromEntries((t.plot?.modes||[]).map(e=>[e.id,e.available])));yn(()=>{G(o)!==`window`&&!G(S)[G(o)]&&L(o,`window`)});let C=P(()=>{let e=t.plot?.modes.find(e=>e.id===G(o));if(!e?.segment)return null;let{x1:n,y1:r,x2:i,y2:a}=e.segment,s=Math.hypot((i-n)/100*G(p),(a-r)/100*G(m)),c=Math.max(3,Math.min(9,Math.floor(s/65)+2));return{path:`M${Array.from({length:c},(e,t)=>{let o=n+(i-n)*t/(c-1),s=r+(a-r)*t/(c-1);return`${48+o/100*G(p)} ${g(s)}`}).join(` L`)}`,projected:e.projected,safe:e.safe}}),w=P(()=>{if(G(b).length===0)return`NO OBSERVATIONS`;if(G(b).length===1)return`ONE OBSERVATION`;let e=Math.floor(G(x)/6e4);if(e<60)return`${e} MIN CONTINUOUS`;let t=Math.floor(e/60);return t<24?`${t}H CONTINUOUS`:`${Math.floor(t/24)}D ${t%24}H CONTINUOUS`});var T=Pa(),E=z(T),D=R(E);let ee;var te=R(D),O=R(te),ne=V(O);N(te);var re=V(te),ie=V(re);Z(ie,17,()=>s,qr,(e,t)=>{var n=Ea(),r=z(n),i=V(r),a=B(i);H(()=>{Q(r,`x1`,48+G(t)/100*G(p)),Q(r,`x2`,48+G(t)/100*G(p)),Q(r,`y2`,G(f)),Q(i,`x`,48+G(t)/100*G(p)),Q(i,`y`,G(f)+20),Y(a,`${G(t)??``}%`)}),J(e,n)});var ae=V(ie);Z(ae,17,()=>s,qr,(e,t)=>{var n=Da(),r=z(n),i=V(r),a=B(i);H((e,n,o)=>{Q(r,`y1`,e),Q(r,`x2`,G(d)),Q(r,`y2`,n),Q(i,`y`,o),Y(a,`${G(t)??``}%`)},[()=>g(G(t)),()=>g(G(t)),()=>g(G(t))+4]),J(e,n)});var oe=V(ae),se=V(oe),ce=V(se),k=e=>{var t=Oa(),n=z(t),i=V(n),a=V(i),o=B(R(a));N(a),H((e,t)=>{Q(n,`d`,G(y)),Q(i,`d`,G(y)),Q(a,`cx`,48+r()[0].elapsed/100*G(p)),Q(a,`cy`,e),Y(o,`First observation: ${t??``}`)},[()=>g(r()[0].used),()=>ha(r()[0].at)]),J(e,t)};X(ce,e=>{G(a)&&r().length&&e(k)});var le=V(ce),ue=e=>{var t=ka(),r=z(t),i=V(r),a=B(R(i));N(i),H(e=>{Q(r,`d`,G(C).path),Q(i,`d`,G(C).path),Q(i,`marker-mid`,`url(#${n}-trend-arrow)`),Y(a,`${G(o)===`window`?`Window-average pace`:`Recent consumption trajectory`} projects ${e??``}% at reset if continued`)},[()=>G(C).projected.toFixed(1)]),J(e,t)};X(le,e=>{G(C)&&e(ue)});var de=V(le,2),fe=V(de),pe=V(fe),A=B(R(pe));N(pe),N(D),N(E);var me=V(E,2),he=R(me),ge=R(he),_e=V(ge,3),ve=B(_e,!0),j=V(_e,2),ye=e=>{var t=Aa(),n=B(V(z(t)));H(e=>Y(n,`TREND // ${e??``}`),[()=>G(C).projected>=100?`QUOTA EXHAUSTION PROJECTED`:`${G(C).projected.toFixed(1)}% PROJECTED AT RESET`]),J(e,t)};X(j,e=>{G(C)&&e(ye)}),N(he);var M=V(he,2),be=R(M),xe=R(be);Si(xe),Se(),N(be);var Ce=V(be,2),we=V(R(Ce),2),Te=R(we);Te.value=Te.__value=`off`;var Ee=V(Te),De=B(Ee);Ee.value=Ee.__value=`halfHour`;var Oe=V(Ee),ke=B(Oe);Oe.value=Oe.__value=`hour`;var Ae=V(Oe),je=B(Ae);Ae.value=Ae.__value=`day`;var Me=V(Ae),Ne=B(Me);Me.value=Me.__value=`window`,N(we),hi(we),N(Ce);var Pe=B(V(Ce,2));N(M),N(me);var Fe=V(me,2),Ie=e=>{var t=Na(),n=V(R(t),2),a=e=>{var t=Ma(),n=R(t),i=V(R(n),2);Z(i,21,r,qr,(e,t,n)=>{var r=ja(),i=R(r),a=R(i),o=B(a,!0);N(i);var s=V(i),c=B(s),l=V(s),u=B(l),d=B(V(l),!0);N(r),H((e,r)=>{Q(a,`datetime`,G(t).at),Y(o,e),Y(c,`${r??``}%`),Y(u,`${G(t).used??``}%`),Y(d,n===0?`First observation`:G(t).break?`Gap before this observation`:`Connected to previous observation`)},[()=>ha(G(t).at),()=>G(t).elapsed.toFixed(1)]),J(e,r)}),N(i),N(n),N(t),J(e,t)};X(n,e=>{G(i)&&e(a)}),N(t),Ri(`open`,`toggle`,t,e=>L(i,e),()=>G(i)),J(e,t)};X(Fe,e=>{r().length&&e(Ie)}),H((e,r,i,a,o,s)=>{Q(D,`viewBox`,`0 0 ${G(l)} ${G(u)}`),Q(D,`aria-label`,e),ee=di(D,``,ee,{"--trend-color":G(C)?.safe?`#115b35`:`#7f1825`}),Q(O,`id`,n),Q(ne,`id`,n+`-trend-arrow`),Q(re,`width`,G(p)),Q(re,`height`,G(m)),Q(re,`fill`,`url(#${n})`),Q(oe,`d`,`M48 20 V${G(f)} H${G(d)}`),Q(se,`y1`,r),Q(se,`x2`,G(d)),Q(se,`y2`,i),Q(de,`x`,48+G(p)/2),Q(de,`y`,G(u)-5),Q(fe,`cx`,G(h)),Q(fe,`cy`,G(_)),Q(pe,`cx`,G(h)),Q(pe,`cy`,G(_)),Y(A,`${t.used??``}% consumed // ${a??``}% of period elapsed`),Y(ge,`${t.used??``}% USED // ${o??``}% TIME ELAPSED`),Y(ve,s),Ee.disabled=!G(S).halfHour,Y(De,`LAST 30 MINUTES${G(S).halfHour?``:` — UNAVAILABLE`}`),Oe.disabled=!G(S).hour,Y(ke,`LAST HOUR${G(S).hour?``:` — UNAVAILABLE`}`),Ae.disabled=!G(S).day,Y(je,`LAST 24 HOURS${G(S).day?``:` — UNAVAILABLE`}`),Me.disabled=!G(S).window,Y(Ne,`FROM WINDOW START${G(S).window?``:` — NO TIME ELAPSED`}`),Y(Pe,`HISTORY // ${G(w)??``}`)},[()=>`Pace: ${t.used}% consumed, ${G(c).toFixed(1)}% of quota period elapsed. ${G(v)>0?`Above`:G(v)<0?`Below`:`On`} the steady-consumption line.${G(a)&&r().length?` Trace path contains ${r().length} ${r().length===1?`observation`:`observations`}; gaps are not interpolated.`:``}`,()=>g(0),()=>g(100),()=>G(c).toFixed(1),()=>G(c).toFixed(1),()=>Math.abs(G(v))<.05?`ON PACE`:G(v)>0?`ABOVE THE LINE — CONSUMING FASTER THAN TIME`:`BELOW THE LINE — WITHIN PACE`]),Fi(E,`clientWidth`,e=>L(l,e)),Fi(E,`clientHeight`,e=>L(u,e)),Ai(xe,()=>G(a),e=>L(a,e)),gi(we,()=>G(o),e=>L(o,e)),J(e,T),Ge()}var Ia=q(` `),La=q(`

        Quota refresh failed. Values below are the last successful observation.

        `),Ra=q(`

        `),za=q(`

        Expiry details unavailable. No listed expiry does not mean no expiry.

        `),Ba=q(`

        `),Va=q(`

        Read-only preview. Use the terminal to redeem a reset.

        The backend may return only some credits. This list does not establish + redemption order.

        `),Ha=q(` `,1),Ua=Mr(``),Wa=Mr(``),Ga=q(`
        `),Ka=q(`

        Cycle duration or reset date unavailable — position cannot be + plotted.

        `),qa=q(`
        EMPTYFULL
        `),Ja=q(`

        `,1),Ya=q(`
        `,1),Xa=q(`

        `),Za=q(`

        `),Qa=q(`

        No quota windows reported yet.

        `),$a=q(`
        `,1),eo=q(`

        All reported windows are shown. API-equivalent learning and quota status + scoring remain in the terminal for this first preview.

        `,1),to=q(` `,1);function no(e,t){We(t,!0);let n=Gi(t,`params`,19,()=>({})),r=P(()=>ta.filter(e=>e!==`thresholds`||!!$.data?.thresholds?.length)),i=I(Xt(Date.now())),a=P(()=>G(r).includes(na(n().view))?na(n().view):`bars`);Ki(()=>{let e=setInterval(()=>L(i,Date.now(),!0),1e3);return()=>clearInterval(e)});function o(e){return!e.duration||e.duration<=0||!e.reset?null:Math.max(0,Math.min(100,100*(1-(e.reset*1e3-G(i))/(e.duration*6e4))))}yn(()=>{oa.view=G(a),(n().view===`zone`||n().view===`consumption-pace`)&&Qi(`/quota/pace`)});function s(e){let t=e/100*Math.PI*2;return`M60 60 L60 14 A46 46 0 ${+(e>50)} 1 ${60+46*Math.sin(t)} ${60-46*Math.cos(t)} Z`}var c=to(),l=z(c);Z(l,21,()=>G(r),qr,(e,t)=>{var n=Ia();let r;var i=B(n,!0);H(e=>{Q(n,`href`,`#/quota/`+G(t)),Q(n,`aria-current`,G(a)===G(t)?`page`:void 0),r=li(n,1,``,null,r,{active:G(a)===G(t)}),Y(i,e)},[()=>G(t)===`fuel`?`FUEL TANK`:G(t).toUpperCase()]),J(e,n)}),N(l);var u=V(l,2),d=e=>{var t=eo(),n=z(t),r=e=>{J(e,La())};X(n,e=>{$.data.quotaError&&e(r)});var i=V(n,2),c=e=>{var t=Ra(),n=B(t);H(()=>Y(n,`Last usage accounting issue: + ${$.data.usageDiagnostic??``}`)),J(e,t)};X(i,e=>{$.data.usageDiagnostic&&e(c)});var l=V(i,2),u=B(l),d=V(l,2),f=e=>{Ta(e,{})},p=e=>{var t=Va(),n=R(t),r=B(n),i=V(n,4),a=e=>{J(e,za())};X(i,e=>{$.data.credits.length||e(a)}),Z(V(i,2),17,()=>$.data.credits,qr,(e,t)=>{var n=Ba(),r=R(n),i=B(r),a=B(V(r,2),!0);N(n),H(e=>{Y(i,`${(G(t).title||`Quota reset`)??``} // ${G(t).status??``}`),Y(a,e)},[()=>G(t).expiryKnown?G(t).expires?`EXPIRES `+ha(G(t).expires):`Does not expire`:`Expiry information unavailable`]),J(e,n)}),Se(2),N(t),H(()=>Y(r,`RESET INVENTORY // ${$.data.creditCount??``} AVAILABLE`)),J(e,t)},m=e=>{var t=$a(),n=z(t);let r;Z(n,21,()=>$.data.meters,qr,(e,t)=>{let n=P(()=>o(G(t)));var r=Za(),i=R(r),c=B(i,!0),l=V(i,2),u=R(l),d=e=>{var n=Ha(),r=z(n),i=B(r),a=B(V(r));H(()=>{Y(i,`FREE ${100-G(t).used}%`),Y(a,`USED ${G(t).used??``}%`)}),J(e,n)},f=e=>{var n=Ha(),r=z(n),i=B(r),a=B(V(r));H(()=>{Y(i,`USED ${G(t).used??``}%`),Y(a,`FREE ${100-G(t).used}%`)}),J(e,n)};X(u,e=>{G(a)===`fuel`?e(d):e(f,-1)}),N(l);var p=V(l,2);let m;var h=R(p),g=e=>{var n=Ga(),r=R(n),i=V(R(r)),a=e=>{J(e,Ua())},o=e=>{var n=Wa();H(e=>Q(n,`d`,e),[()=>s(G(t).used)]),J(e,n)};X(i,e=>{G(t).used>=100?e(a):G(t).used>0&&e(o,1)}),N(r),N(n),H(()=>Q(r,`aria-label`,`${G(t).used}% quota used`)),J(e,n)},_=e=>{var r=Pr(),i=z(r),a=e=>{{let r=P(()=>G(t).trail||[]);Fa(e,{get used(){return G(t).used},get elapsed(){return G(n)},get trail(){return G(r)},get plot(){return G(t).plot}})}},o=e=>{J(e,Ka())};X(i,e=>{G(n)===null?e(o,-1):e(a)}),J(e,r)},v=e=>{var r=Ya(),i=z(r),o=R(i);let s;N(i);var c=V(i,2),l=e=>{J(e,qa())};X(c,e=>{G(a)===`fuel`&&e(l)});var u=V(c,2),d=e=>{var t=Ja(),r=z(t),i=B(r),o=V(r,2),s=R(o);let c;N(o),H(e=>{Y(i,`RESET CYCLE // ${e??``}% ELAPSED`),c=di(s,``,c,{width:`${G(a)===`fuel`?100-G(n):G(n)}%`})},[()=>Math.floor(G(n))]),J(e,t)};X(u,e=>{G(n)!==null&&e(d)}),H(()=>{Q(i,`aria-label`,G(a)===`fuel`?`Fuel remaining`:`Quota used`),Q(i,`aria-valuenow`,G(a)===`fuel`?100-G(t).used:G(t).used),s=di(o,``,s,{width:`${G(a)===`fuel`?100-G(t).used:G(t).used}%`})}),J(e,r)};X(h,e=>{G(a)===`pie`?e(g):G(a)===`pace`?e(_,1):e(v,-1)}),N(p);var y=V(p,2),b=B(y),x=V(y,2),S=e=>{var n=Xa(),r=B(n,!0);H(()=>Y(r,G(t).details)),J(e,n)};X(x,e=>{G(t).details&&e(S)}),N(r),H(e=>{Y(c,G(t).name),m=li(p,1,`meter-graphic`,null,m,{"bar-graphic":G(a)===`bars`||G(a)===`fuel`}),Y(b,`RESETS // ${e??``}`)},[()=>ha(G(t).reset)]),J(e,r)}),N(n);var i=V(n,2),c=e=>{J(e,Qa())};X(i,e=>{$.data.meters.length||e(c)}),H(()=>r=li(n,1,`quota-grid`,null,r,{radial:G(a)===`pie`,zone:G(a)===`pace`})),J(e,t)};X(d,e=>{G(a)===`thresholds`?e(f):G(a)===`resets`?e(p,1):e(m,-1)}),Se(2),H(e=>Y(u,`QUOTA // OBSERVED ${e??``}`),[()=>ha($.data.quotaAt)]),J(e,t)};X(u,e=>{$.data&&e(d)}),J(e,c),Ge()}var ro=q(`
        `),io=q(`

        `,1);function ao(e,t){We(t,!0);let n=Gi(t,`values`,19,()=>[]),r=Gi(t,`label`,3,`Token activity`),i=Gi(t,`capacity`,3,0),a=P(()=>Math.max(0,...n())),o=P(()=>i()>n().length?[...Array(i()-n().length).fill(0),...n()]:n());var s=io(),c=z(s),l=B(c),u=V(c,2);Z(u,21,()=>G(o),qr,(e,t)=>{var n=ro();let r;H((e,t)=>{Q(n,`title`,e),r=di(n,``,r,{height:t})},[()=>G(t).toLocaleString(`en-GB`)+` tokens`,()=>`${100*G(t)/Math.max(1,G(a))}%`]),J(e,n)}),N(u),H((e,t)=>{Y(l,`SCALE // 0 — ${e??``} TOKENS`),Q(u,`aria-label`,t)},[()=>G(a).toLocaleString(`en-GB`),()=>`${r()}. Peak ${G(a).toLocaleString(`en-GB`)} tokens.`]),J(e,s),Ge()}function oo(e){if(!e||![`LAST REPLY`,`LAST ACTIVITY`].includes(e.contextKind))return``;let t=e.text||e.contextKind===`LAST ACTIVITY`&&e.workingCommand||``;return t.trim()?t:``}var so=[{id:`local-statusline`,label:`/statusline`,help:`Choose fields for Codexometer’s detail footer. Saved display preferences only.`,next:`statusline`},{id:`local-usage`,label:`/usage`,help:`Open Codexometer’s usage history. Existing quota and reset views remain available.`,next:`usage`},{id:`local-copy`,label:`/copy`,help:`Copy the selected session’s observed reply or activity using Codexometer’s copy control.`,next:`copy`},{id:`local-theme`,label:`/theme`,help:`Choose a Codexometer display theme. Saved local display preferences only.`,next:`theme`},{id:`local-exit`,label:`/exit`,help:`Leave this Codexometer interface. Codex sessions continue running.`,next:`exit`},{id:`local-quit`,label:`/quit`,help:`Alias for /exit. Codex sessions continue running.`,next:`quit`}],co=[`surface`,`model`,`feature`,`task start`],lo=q(` `),uo=q(``),fo=q(`

        `),po=q(`

        `),mo=q(`
        `),ho=q(`

        `),go=q(`

        `,1),_o=q(`

        `),vo=q(`

        Loading / sending…

        `),yo=q(`
        `),bo=q(`

        `),xo=q(`

         
        `),So=q(`
        `),Co=q(`
        `),wo=q(`

        Review expired. Press Enter to review again.

        `),To=q(`

        `,1),Eo=q(`

        `,1),Do=q(`

        No available matching commands.

        `),Oo=q(` `,1),ko=q(`

        `),Ao=q(`

        Review expired. Review the option again.

        `),jo=q(``),Mo=q(``),No=q(``),Po=q(``),Fo=q(``),Io=q(``),Lo=q(`
        `),Ro=q(`
        `);function zo(e,t){let n=Fr();We(t,!0);let r=e=>{var t=Pr();Z(z(t),19,()=>G(pe),e=>e.id,(e,t,r)=>{var i=uo();let o;var s=R(i),c=B(s,!0),l=V(s),u=B(l),d=V(l),f=e=>{var n=lo(),r=B(n,!0);H(()=>Y(r,G(t).help)),J(e,n)};X(d,e=>{(G(v)?.path===``||G(k))&&e(f)}),N(i),H((e,s)=>{Q(i,`id`,`${n}-${G(r)}`),Q(i,`role`,G(k)?`option`:void 0),Q(i,`aria-selected`,G(k)?G(T)===G(r):void 0),Q(i,`tabindex`,G(k)?-1:void 0),i.disabled=G(g)||G(ge)&&!a(),Q(i,`title`,G(t).help),Q(i,`aria-label`,e),o=li(i,1,`svelte-7bfwr9`,null,o,{suggested:G(T)===G(r)}),Y(c,G(t).label),Y(u,`${G(k)&&G(t).selected?` // CURRENT`:``}${s??``}`)},[()=>G(t).label+(G(k)&&G(t).selected?` // CURRENT`:``)+ae(G(t)),()=>ae(G(t))]),Sr(`focus`,i,()=>{G(k)||ve(G(r))}),K(`click`,i,()=>{ve(G(r)),be(G(t))}),J(e,i)}),J(e,t)},i=Gi(t,`query`,3,``),a=Gi(t,`localOnly`,3,!1),o=Gi(t,`oncopy`,3,()=>{}),s=Gi(t,`onchange`,3,()=>{}),c=Gi(t,`oncomplete`,3,e=>{}),l=so.map(e=>e.next);function u(){return so.map(e=>[`exit`,`quit`].includes(e.next||``)?{...e,help:`Return to Sessions. The local server and Codex sessions remain running.`}:{...e})}function d(){return{title:`/ COMMANDS`,help:`Local Codexometer commands remain available without session control.`,path:``,revision:``,choices:u()}}function f(){L(b,``),L(O,``),L(x,0),L(ne,[],!0)}function p(){w++,L(g,!1),L(h,!1),L(E,i()),f(),L(_,``),G(de)?s()():c()(i())}async function m(e){if(!l.includes(e))return!1;if(e===`copy`&&!oo($.data?.sessions.find(e=>e.id===t.session)))return L(_,`No reply or activity text is available to copy for this session.`),!0;if(e===`copy`){let e=o()();p(),await e}else p(),e===`usage`?location.hash=`/usage`:e===`theme`?ca.requests++:e===`statusline`?sa.open=!0:location.hash=`/sessions`;return!0}let h=I(!1),g=I(!1),_=I(``),v=I(null),y=I(null),b=I(``),x=I(0),S=I(Xt(Date.now())),C=I(``),w=0,T=I(0),E=I(null),D=I(void 0),ee=I(void 0),te=I(void 0),O=I(``),ne=I(Xt([])),re=P(()=>!!G(v)?.inputReview),ie=P(()=>!!G(y)&&!G(re)||!!G(O)||G(ne).length>0);function ae(e){return e.unavailable?e.unavailable.startsWith(`Waiting for idle.`)?` // WAITING FOR IDLE`:` // UNAVAILABLE`:e.next?` →`:e.action?``:` // HELP`}async function oe(e){G(v)&&!(G(_e)&&G(fe))&&L(ne,[...G(ne),{path:G(v).path,index:G(T),input:G(C)}],!0),await M(e)}async function se(){if(!G(ie))return;if(w++,L(g,!1),L(b,``),L(x,0),L(_,``),G(O)){L(O,``),G(D)?.focus();return}if(G(y)&&!G(re)){L(y,null),await ur(),G(D)?.focus();return}let e=G(ne).at(-1);e&&(L(ne,G(ne).slice(0,-1),!0),await M(e.path,e))}function ce(){G(v)&&G(C).trim()&&!G(g)&&!G(ge)&&oe(G(v).path+`/`+encodeURIComponent(G(C).trim()))}let k=P(()=>G(h)&&!!G(v)?.picker&&!G(y)),le=P(()=>G(h)&&!G(v)?.input&&!G(y)),ue=setInterval(()=>{L(S,Date.now(),!0)},1e3);qi(()=>{clearInterval(ue),w++});let de=P(()=>i().trim().startsWith(`/`)&&!i().trim().startsWith(`//`)),fe=P(()=>G(v)?.path===``&&G(de)?i().trim().slice(1).toLowerCase():``),pe=P(()=>(G(v)?.choices||[]).filter(e=>!G(fe)||e.label.toLowerCase().startsWith(`/`+G(fe)))),A=P(()=>G(y)||G(pe)[G(T)]),me=P(()=>!!G(b)&&G(S)G(pe).find(e=>e.id===G(O))),ge=P(()=>!$.connected||!!$.data?.sessionsError),_e=P(()=>G(h)&&G(de)&&(!G(v)||G(v).path===``)&&!G(y));yn(()=>{i(),L(T,0)}),yn(()=>{let e=G(T);G(pe),G(le)&&ur().then(()=>{let t=G(D)?.children[e];if(!t||!G(D))return;let n=G(D).getBoundingClientRect(),r=t.getBoundingClientRect();r.topn.bottom&&(G(D).scrollTop+=r.bottom-n.bottom)})});function ve(e){G(T)!==e&&G(v)?.picker&&(L(O,``),L(b,``),L(x,0),L(_,``),w++),L(T,e,!0)}function j(){w++,L(g,!1),L(h,!1),L(E,i()),f(),c()(i())}function ye(e){let t=!!G(ee)?.contains(e.target);if(!G(h)||!G(le)&&!G(y)&&!G(v)?.input||!G(de)&&!t||G(ge)&&!a()||e.isComposing||e.ctrlKey||e.metaKey||e.altKey)return;if(G(v)?.input){e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),j());return}let n=e.key===`ArrowLeft`,r=e.key.toLowerCase()===`f`,o=e.key.toLowerCase()===`c`;if((o||r||n)&&!t||![`ArrowUp`,`ArrowDown`,`Tab`,`Enter`,`Escape`].includes(e.key)&&!o&&!r&&!n||e.key===`Tab`&&(G(y)||G(v)?.path!==``||e.shiftKey)||e.key===`Enter`&&e.target instanceof Element&&e.target.closest(`button`)&&!G(D)?.contains(e.target)&&!e.target.closest(`[data-command-confirm]`)||G(y)&&!t||G(y)&&[`ArrowUp`,`ArrowDown`].includes(e.key))return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){j();return}if(G(g)||e.repeat&&(o||e.key===`Enter`))return;if(n){G(ie)&&se();return}if(r){M(G(v)?.path||``,void 0,!0);return}if(o){(G(y)?.action||G(k)&&G(O))&&Se();return}if(G(y)){e.key===`Enter`&&G(y).action&&!G(me)&&!G(_)&&xe(G(y));return}if(e.key===`ArrowUp`||e.key===`ArrowDown`){ve(Math.min(Math.max(G(T)+(e.key===`ArrowUp`?-1:1),0),Math.max(G(pe).length-1,0))),!G(k)&&G(D)?.contains(e.target)&&ur().then(()=>(G(D)?.children[G(T)])?.focus());return}if(e.key===`Enter`&&(G(v)?.path===``||G(v)?.path===`goal`)&&/^\/goal\s+\S/.test(i().trim())){let e=G(v)?.path===`goal`?G(pe).find(e=>i().trim().slice(6).trim().toLowerCase()===e.label.toLowerCase()):void 0;if(e){be(e);return}oe(i().trim().slice(1));return}let s=G(pe)[G(T)];s&&(e.key===`Tab`?c()(s.label):G(k)?xe(s):be(s))}yn(()=>{G(ge)&&!a()&&(w++,L(g,!1),f(),G(h)&&(L(h,!1),L(E,i())),L(v,null),L(y,null))}),yn(()=>{G(de)&&!G(h)&&i()!==G(E)&&(!G(ge)||a())&&(f(),L(h,!0),M(``))});async function M(e,n,r=!1){let i=++w;if(G(v)&&L(v,{...G(v),path:e},!0),n&&L(C,n.input,!0),L(g,!0),L(y,null),L(O,``),L(b,``),L(x,0),L(_,``),a())L(v,d(),!0),L(T,n?.index??0,!0),L(g,!1);else try{let a=await ya(`commands`,{session:t.session,command:{mode:`list`,path:e,...r?{refresh:!0}:{}}});i===w&&(a.choices||=[],(e===``||e===`help`)&&(a.choices=[...a.choices.filter(e=>!l.includes(e.label.replace(/^\//,``))),...u()]),L(v,a,!0),L(T,n?Math.min(n.index,Math.max(a.choices.length-1,0)):a.picker?Math.max(a.choices.findIndex(e=>e.selected),0):0,!0),a.picker&&ur().then(()=>G(D)?.focus()),L(C,n?.input??a.value??``,!0),n&&ur().then(()=>{a.input?G(ee)?.querySelector(`input`)?.focus():G(D)?.focus()}),a.inputReview&&a.choices.length===1&&(L(g,!1),be(a.choices[0])))}catch{i===w&&(L(_,`Command catalogue unavailable. Use Codex.`),e===``||e===`help`?(L(v,d(),!0),L(_,``)):L(v,{title:`/`+e,help:``,path:e,revision:``,choices:[]},!0))}finally{i===w&&L(g,!1)}}async function be(e){e.unavailable||G(g)||e.next&&await m(e.next)||G(_)||(G(v)?.picker?(ve(G(pe).findIndex(t=>t.id===e.id)),e.action&&(e.reversible||$.data?.noConfirm)?await xe(e):G(D)?.focus()):e.next?await oe(e.next):await xe(e))}async function xe(e){if(G(g)||G(ge)||!G(v)||e.unavailable||G(_))return;let n=e.action&&(e.reversible||$.data?.noConfirm);if(G(v).picker){if(G(me)&&G(O)===e.id)return;L(O,e.id,!0)}else n||(L(y,e,!0),ur().then(()=>G(te)?.focus()));if(L(b,``),L(x,0),L(_,``),!e.action)return;let r=++w;L(g,!0);try{let n=await ya(`commands`,{session:t.session,command:{mode:`prepare`,path:G(v).path,revision:G(v).revision,choice:e.id}});if(r===w){let e=Date.parse(n.expires);if(!n.confirmation||!Number.isFinite(e)||Date.now()>=e)throw Error(`Review confirmation unavailable`);L(b,n.confirmation,!0),L(x,e,!0)}}catch{r===w&&L(_,`Option changed or unavailable. Refresh before retrying.`)}finally{r===w&&L(g,!1)}n&&r===w&&G(b)&&await Se()}async function Se(){if(!G(b)||G(ge)||G(g)||Date.now()>=G(x)||!G(v)||G(v).picker&&G(O)!==G(pe)[G(T)]?.id)return;let e=G(b);L(b,``),L(g,!0);let n=++w;try{let r=await ya(`commands`,{session:t.session,confirmation:e,command:{mode:`commit`,path:G(v).path}});n===w&&(L(_,r.message,!0),L(h,!1),L(v,null),L(y,null),f(),L(E,null),s()())}catch{n===w&&L(_,`Change unconfirmed. Check Codex before retrying.`)}finally{n===w&&L(g,!1)}}var Ce={handleKey:ye},we=Ro(),Te=R(we),Ee=V(Te,2),De=e=>{var t=fo(),n=B(t,!0);H(()=>Y(n,G(_))),J(e,t)};X(Ee,e=>{G(_)&&!G(h)&&e(De)});var Oe=V(Ee,2),ke=e=>{var i=Lo();let o;var s=R(i),c=e=>{var t=go(),n=z(t),r=B(n,!0),i=V(n,2),a=e=>{var t=mo();Z(t,21,()=>G(v).help.split(` +`),qr,(e,t)=>{var n=po(),r=B(n,!0);H(()=>{Q(n,`title`,G(t)),Y(r,G(t))}),J(e,n)}),N(t),J(e,t)},o=e=>{var t=ho(),n=B(t,!0);H(()=>Y(n,G(v)?.help||`Loading live options…`)),J(e,t)};X(i,e=>{G(v)?.path===`goal`?e(a):e(o,-1)}),H(()=>Y(r,G(v)?.title||`/ COMMANDS`)),J(e,t)};X(s,e=>{G(_e)||e(c)});var l=V(s,2),u=e=>{var t=_o(),n=B(t,!0);H(()=>Y(n,G(_))),J(e,t)};X(l,e=>{G(_)&&e(u)});var d=V(l,2),f=e=>{J(e,vo())};X(d,e=>{G(g)&&e(f)});var p=V(d,2),m=e=>{var t=yo(),r=R(t),i=R(r),o=V(i);Si(o),N(r),N(t),H(e=>{Q(t,`id`,`${n}-input`),Y(i,`${e??``} `),Q(o,`aria-label`,G(v).inputLabel||`Session name`),Q(o,`maxlength`,G(v).inputLimit||512),o.disabled=G(g)||G(ge)&&!a()},[()=>(G(v).inputLabel||`Session name`).toUpperCase()]),Sr(`submit`,t,e=>{e.preventDefault(),ce()}),Di(o,()=>G(C),e=>L(C,e)),J(e,t)},h=e=>{var n=xo(),r=R(n),i=B(r,!0),a=V(r,2),o=B(a,!0),s=V(a,2),c=e=>{var n=bo(),r=R(n),i=V(r),a=e=>{J(e,Nr(`Only this session's saved + name changes.`))},o=P(()=>G(v)?.path.startsWith(`rename/`)),s=e=>{J(e,Nr(`Only this session’s + directory changes; project configuration is not reloaded.`))},c=P(()=>G(v)?.path.startsWith(`cd/`)),l=e=>{J(e,Nr(`Only this session's goal + changes.`))},u=P(()=>G(v)?.path.startsWith(`goal/`)),d=e=>{J(e,Nr(`No change sent yet. Model, reasoning and speed settings can + change token usage and cost. Changes affect subsequent turns of + this session, not global defaults. Automatic quota thresholds + may later supersede model settings.`))};X(i,e=>{G(o)?e(a):G(c)?e(s,1):G(u)?e(l,2):e(d,-1)}),N(n),H(()=>Y(r,`TARGET // ${t.session??``}. `)),J(e,n)};X(s,e=>{G(y).action&&e(c)}),N(n),Li(n,e=>L(te,e),()=>G(te)),H(()=>{Y(i,G(y).label),Y(o,G(y).help||`No additional help supplied by Codex.`)}),J(e,n)},w=e=>{var t=Oo(),i=z(t),a=e=>{var t=So(),i=R(t);r(i),N(t),Li(t,e=>L(D,e),()=>G(D)),H(()=>Q(t,`aria-activedescendant`,`${n}-${G(T)}`)),J(e,t)},o=e=>{var t=Co();let n;var i=R(t);r(i),N(t),Li(t,e=>L(D,e),()=>G(D)),H(()=>n=li(t,1,`command-options svelte-7bfwr9`,null,n,{vertical:G(_e)})),J(e,t)};X(i,e=>{G(k)?e(a):e(o,-1)});var s=V(i,2),c=e=>{var t=Eo(),n=z(t),r=B(n,!0),i=V(n,2),a=e=>{var t=To(),n=z(t),r=B(n),i=V(n,2),a=e=>{J(e,wo())};X(i,e=>{G(b)&&G(S)>=G(x)&&e(a)}),H(()=>Y(r,`REVIEW // ${G(he).label??``}. No change sent yet.`)),J(e,t)};X(i,e=>{G(he)&&e(a)}),H(()=>Y(r,G(pe)[G(T)]?.help)),J(e,t)};X(s,e=>{G(k)&&e(c)});var l=V(s,2),u=e=>{J(e,Do())};X(l,e=>{!G(g)&&!G(pe).length&&e(u)}),J(e,t)};X(p,e=>{G(v)?.input?e(m):G(y)?e(h,1):e(w,-1)});var E=V(p,2),O=e=>{var t=ko(),n=B(t,!0);H(()=>Y(n,G(A).unavailable)),J(e,t)};X(E,e=>{G(A)?.unavailable&&e(O)});var ne=V(E,2),re=e=>{J(e,Ao())};X(ne,e=>{G(b)&&G(S)>=G(x)&&!G(k)&&e(re)});var ae=V(ne,2),oe=R(ae),le=e=>{var t=Pr(),r=z(t),i=e=>{var t=jo(),r=B(t,!0);H(e=>{Q(t,`form`,`${n}-input`),t.disabled=e,Y(r,G(v).reversibleInput||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)},[()=>G(g)||G(ge)||!G(C).trim()]),J(e,t)},o=e=>{var t=Pr(),n=z(t),r=e=>{var t=Mo();H(()=>t.disabled=G(g)||G(ge)&&!a()),K(`click`,t,Se),J(e,t)},i=e=>{var t=No(),n=B(t,!0);H(()=>{t.disabled=G(g)||G(ge)&&!a(),Y(n,G(A).reversible||$.data?.noConfirm?`ENTER APPLY`:`ENTER REVIEW`)}),K(`click`,t,()=>{G(A)&&xe(G(A))}),J(e,t)};X(n,e=>{G(me)&&!G(A).reversible&&!$.data?.noConfirm?e(r):e(i,-1)}),J(e,t)},s=e=>{var t=No(),n=B(t);H(()=>{t.disabled=G(g)||G(ge)&&!a(),Y(n,`ENTER ${G(A).next?`OPEN`:`HELP`}`)}),K(`click`,t,()=>{G(A)&&be(G(A))}),J(e,t)};X(r,e=>{G(v)?.input?e(i):G(A)?.action&&!G(A).unavailable?e(o,1):!G(y)&&G(A)&&!G(A).unavailable&&e(s,2)}),J(e,t)};X(oe,e=>{G(_)||e(le)});var ue=V(oe,2),de=e=>{var t=Po();H(()=>t.disabled=G(g)),K(`click`,t,se),J(e,t)};X(ue,e=>{G(ie)&&e(de)});var fe=V(ue,2),ve=e=>{var t=Fo();H(()=>t.disabled=G(g)),K(`click`,t,()=>M(G(v)?.path||``,void 0,!0)),J(e,t)};X(fe,e=>{G(_e)||e(ve)});var Ce=V(fe,2);N(ae);var we=V(ae,2),Te=e=>{var t=Io(),n=B(t);H(()=>Y(n,`↑/↓ select${G(_e)?` · Tab complete`:``}`)),J(e,t)};X(we,e=>{!G(v)?.input&&!G(y)&&e(Te)}),N(i),Li(i,e=>L(ee,e),()=>G(ee)),H(()=>{Q(i,`aria-label`,G(_e)?`Slash command suggestions`:`Session command options`),o=li(i,1,`svelte-7bfwr9`,null,o,{"command-popup":G(_e)})}),K(`keydown`,i,ye),K(`click`,Ce,j),J(e,i)};return X(Oe,e=>{G(h)&&e(ke)}),N(we),H(()=>Te.disabled=G(ge)&&!a()||G(g)),K(`click`,Te,()=>{L(h,!G(h)),L(E,G(h)?null:i(),!0),L(b,``),G(h)?(L(ne,[],!0),M(``)):j()}),J(e,we),Ge(Ce)}Cr([`click`,`keydown`]);var Bo=q(` `,1),Vo=q(`
        `),Ho=q(`
        /
        `);function Uo(e,t){We(t,!0);let n=P(()=>t.lines.filter(e=>e.kind===`addition`).length),r=P(()=>t.lines.filter(e=>e.kind===`removal`).length);var i=Ho(),a=R(i),o=R(a),s=B(o),c=B(V(o,2));N(a),Z(V(a,2),17,()=>t.lines,qr,(e,t)=>{var n=Vo();let r;var i=R(n),a=e=>{var n=Bo(),r=z(n),i=B(r,!0),a=B(V(r),!0);H(()=>{Y(i,G(t).old||``),Y(a,G(t).new||``)}),J(e,n)};X(i,e=>{G(t).kind!==`heading`&&G(t).kind!==`metadata`&&e(a)});var o=B(V(i),!0);N(n),H(()=>{r=li(n,1,`diff-line svelte-x4gtb6`,null,r,{added:G(t).kind===`addition`,removed:G(t).kind===`removal`,heading:G(t).kind===`heading`}),Y(o,G(t).text)}),J(e,n)}),N(i),H(()=>{Q(a,`aria-label`,`${G(n)} lines added, ${G(r)} lines removed`),Y(s,`+${G(n)??``}`),Y(c,`−${G(r)??``}`)}),J(e,i),Ge()}var Wo=q(`

        `),Go=q(`

        Send this saved prompt now? This starts Codex work and consumes quota.

        `,1),Ko=q(``),qo=q(`

         

        In memory only. Follows session model, reasoning and speed. Closing + Codexometer cancels pending work.

        `),Jo=q(`

        HUMAN APPROVAL REQUIRED

        Managed policy requires approval each time.

        `,1),Yo=q(`

        CURRENT PROFILE

        MODEL / REASONING LEVEL / SPEED

         

        PROPOSED PROFILE

        MODEL / REASONING LEVEL / SPEED

         

        Applied settings remain after Codexometer closes.

        `,1),Xo=q(`

        `),Zo=q(`

         
        `,1),Qo=q(`

        Command unavailable from this observation. Open Codex to inspect the + request.

        `),$o=q(`

        Session controls temporarily unavailable. Check Codex for current state.

        `),es=q(`

        Checking session controls…

        `),ts=q(`

        `),ns=q(`
        About browser controls

        Controls require a supported live request from a connected shared + app-server session. Local observations alone cannot provide them.

        `),rs=q(` `,1),is=q(` `),as=q(`Grants permission beyond this one action. Check the scope + carefully.`),os=q(``),ss=q(``),cs=q(``),ls=q(``),us=q(`

        Not before this time; when quota and idle allow.

        `),ds=q(`

        `,1),fs=q(`

        The existing trigger remains active until saved or deleted. If + it changes or sends while you edit, saving is blocked.

        `),ps=q(` `,1),ms=q(``),hs=q(``),gs=q(``),_s=q(` `,1),vs=q(`
      • `),ys=q(`
        View fixed choices

        Type one of these choices exactly. Your answer stays masked.

          `),bs=q(` `,1),xs=q(`

          `),Ss=q(`

          `,1),Cs=q(` `,1),ws=q(``),Ts=q(`

          `,1),Es=q(`

          `);function Ds(e,t){We(t,!0);let n=[],r=Gi(t,`observedCommand`,3,``),i=Gi(t,`observedFileChanges`,19,()=>[]),a=Gi(t,`review`,3,``),o=Gi(t,`suspended`,3,!1),s=Gi(t,`openScheduler`,3,!1),c=Gi(t,`onProtectedChange`,3,e=>{}),l=Gi(t,`oncopy`,3,()=>{}),u=I(null),d=I(Xt([])),f=I(null),p=I(``),m=I(0),h=I(Xt(Date.now())),g=I(!1),_=I(``),v=I(!1),y=I(!1),b=I(``),x=I(!1),S=I(``),C=I(!1),w=I(``),T=I(`now`),E=I(60),D=I(``),ee=I(!1),te=I(``),O=I(Xt([])),ne=P(()=>G(O).find(e=>e.status!==`sent`)),re=I(void 0),ie=I(void 0);function ae(e){if(G(x)){ur().then(()=>G(re)?.focus());return}if(e.status!==`pending`||G(g)||!G(u)?.id||G(u).kind!==`prompt`||G(u).questions?.length)return;L(x,!0),L(S,e.id,!0),ur().then(()=>G(re)?.focus()),L(d,[e.text],!0),L(T,e.trigger===`quota`?`quota`:`at`,!0),L(p,``),L(w,``);let t=new Date(e.at||0);e.trigger!==`quota`&&L(D,new Date(t.getTime()-t.getTimezoneOffset()*6e4).toISOString().slice(0,16),!0)}yn(()=>{s()&&G(ne)&&!G(C)&&G(u)?.id&&G(u).kind===`prompt`&&!G(u).questions?.length&&(L(C,!0),ae(G(ne)))});async function oe(){if(!a())try{L(O,await ya(`schedules`,{session:t.session},j.signal),!0),G(x)&&!G(O).some(e=>e.id===G(S)&&e.status===`pending`)&&L(p,``),G(w)&&!G(O).some(e=>e.id===G(w)&&e.status===`pending`)&&(L(p,``),L(w,``))}catch{}}async function se(e){try{L(O,await ya(`schedules`,{session:t.session,cancelId:e},j.signal),!0),L(x,!1),L(p,``),L(w,``),L(d,[],!0)}catch(e){L(_,e instanceof Error?e.message:`Unable to cancel trigger.`,!0)}}yn(()=>(c()(G(g)||G(d).some(e=>e.length>0)),()=>c()(!1)));let ce=P(()=>$.data?.sessions.find(e=>e.id===t.session)?.status),k=P(()=>!$.connected||!!$.data?.sessionsError),le=P(()=>a()!==`profile`&&G(u)?.kind===`prompt`&&!G(u).questions?.length&&!!$.data?.profiles?.some(e=>e.session===t.session&&e.pending)),ue=P(()=>!G(k)&&!G(y)&&!!G(u)?.id&&G(u).kind===`approval`&&G(b)!==G(u).id),de=P(()=>G(ue)?G(u).command:r()),fe=P(()=>!!G(p)&&G(h)G(u)?.questions?.length?G(u).questions:[{text:`Follow-up message`,secret:!1,freeText:!0,options:[]}]),A=P(()=>G(u)?.kind===`approval`||G(u)?.kind===`profile`?G(f)!==null:G(d).length===G(pe).length&&G(d).every((e,t)=>e.trim().length>0&&(G(pe)[t].freeText||G(pe)[t].options?.includes(e)))),me=P(()=>G(u)?.kind===`prompt`&&!G(u).questions?.length&&G(T)!==`now`),he=P(()=>G(T)===`delay`?G(h)+G(E)*6e4:Date.parse(G(D))),ge=P(()=>{if(!G(me))return``;if(G(x)&&!G(O).some(e=>e.id===G(S)&&e.status===`pending`))return`Trigger changed, removed or already sent. Go back and reopen it; your draft has not been saved.`;if(!G(d)[0]?.trim())return`Enter a message to schedule.`;if(G(T)===`quota`)return``;if(!Number.isFinite(G(he))||G(he)<=G(h))return`Choose a future date/time or a delay greater than zero.`;let e=new Date(G(h));return e.setFullYear(e.getFullYear()+1),G(he)>=e.getTime()?`Choose a time within one year.`:``});function _e(e){return e===void 0?`Not yet available`:new Date(e).toLocaleString([],{timeZoneName:`short`})}function ve(e){if(e.status!==`pending`)return e.status;if(e.trigger===`at`&&e.at&&Date.parse(e.at)>G(h))return`Due in `+Math.ceil((Date.parse(e.at)-G(h))/6e4)+` min`;let t=G(k)?`waiting for a fresh connection`:e.waitingReason||(e.canSend?`ready; awaiting dispatch`:`waiting for quota and an eligible idle session`);return(e.trigger===`at`?`Time reached — `:``)+t}yn(()=>{(G(k)||o()||G(le)||G(h)>=G(m))&&L(p,``)});let j=new AbortController;Ki(()=>{let e=e=>{e.ctrlKey&&e.key.toLowerCase()===`s`&&!a()&&G(ne)&&(e.preventDefault(),ae(G(ne)))};window.addEventListener(`keydown`,e);let n,r=setInterval(()=>{L(h,Date.now(),!0)},1e3);async function i(){await oe();try{let e=await ya(`offer`,{session:t.session,...a()?{review:a()}:{}},j.signal);if(j.signal.aborted)return;L(y,!1),G(u)?.id!==e.id&&(L(p,``),L(f,null),L(d,Array(Math.max(1,e.questions?.length||0)).fill(``),!0)),L(u,e,!0),G(v)&&e.id&&e.id!==G(b)&&(L(_,``),L(v,!1))}catch{j.signal.aborted||(L(u,null),L(y,!0),L(p,``))}finally{j.signal.aborted||(n=setTimeout(i,2e3))}}return i(),()=>{window.removeEventListener(`keydown`,e),j.abort(),clearTimeout(n),clearInterval(r)}});async function ye(e){if(!e&&G(u)?.kind===`prompt`&&!G(u).questions?.length&&G(d)[0]?.trim().startsWith(`/`)&&!G(d)[0]?.trim().startsWith(`//`)){L(_,`Choose a slash command from COMMANDS; use // for literal slash text.`);return}if(!G(u)?.id||G(g)||G(k)||o()||G(le)||(e?!e.canSend:!G(A)||G(ge)))return;let n=G(u).id;L(g,!0),L(_,``),L(v,!1),L(p,``),L(w,e?.id||``,!0);try{let r=!e&&G(u).kind===`prompt`&&!G(u).questions?.length&&G(T)!==`now`?{trigger:G(T)===`quota`?`quota`:`at`,zone:Intl.DateTimeFormat().resolvedOptions().timeZone,...G(T)===`quota`?{}:{at:(G(T)===`delay`?new Date(Date.now()+G(E)*6e4):new Date(G(D))).toISOString()}}:void 0;L(ee,!!r),L(te,r?r.trigger===`quota`?`After fresh quota becomes available, when the session is idle`:_e(r.at)+` — not before this time; when quota and idle allow`:``,!0);let i=await ya(`prepare`,{session:t.session,...a()?{review:a()}:{},offer:n,...e?{sendId:e.id}:{},...r?{schedule:r}:{},...r&&G(x)?{editId:G(S)}:{},...G(u).kind===`approval`||G(u).kind===`profile`?{choice:G(f)}:{answers:e?[e.text]:[...G(d)]}},j.signal);G(u)?.id!==n||j.signal.aborted||G(k)||o()||G(le)||(L(p,i.confirmation,!0),L(m,Date.parse(i.expires),!0))}catch(e){j.signal.aborted||L(_,e instanceof Error?e.message:`Unable to prepare action.`,!0)}finally{L(g,!1)}$.data?.noConfirm&&G(p)&&!j.signal.aborted&&await M()}async function M(){if(!G(u)?.id||G(g)||o()||G(le)||!G(fe))return;let e=G(u).id,n=G(u).kind,r=G(p);L(p,``),L(g,!0),L(b,e,!0);try{await ya(`commit`,{session:t.session,...a()?{review:a()}:{},offer:e,confirmation:r},j.signal),L(v,!0),L(x,!1),G(ee)&&(L(b,``),await oe()),L(_,G(ee)?`Trigger set. Closing Codexometer cancels it.`:n===`profile`?`Profile decision completed.`:n===`approval`?`Decision sent.`:`Text sent.`,!0)}catch(e){L(_,e instanceof _a?e.message:`Outcome uncertain. Check Codex before taking another action; nothing was retried.`,!0)}finally{L(g,!1),L(w,``),await oe(),L(d,[],!0),L(f,null)}}var be=rs(),xe=z(be),Ce=e=>{var t=Pr();Z(z(t),17,()=>G(O).filter(e=>e.status!==`sent`),e=>e.id,(e,t)=>{var n=qo(),r=R(n),i=B(r,!0),a=V(r,2),s=B(a),c=V(a,2),l=B(c,!0),d=V(c,2),f=B(d,!0),m=V(d,2),h=B(m,!0),v=V(m,2),y=e=>{var t=Wo(),n=B(t,!0);H(()=>Y(n,G(_))),J(e,t)};X(v,e=>{G(_)&&e(y)});var b=V(v,4),x=V(b,2),S=V(x,2),C=e=>{var n=Go(),r=V(z(n),2),i=V(r,2);H(()=>r.disabled=G(g)||G(k)||!G(t).canSend),K(`click`,r,M),K(`click`,i,()=>{L(p,``),L(w,``)}),J(e,n)},T=e=>{var n=Ko();H(()=>n.disabled=G(g)||G(k)||!G(t).canSend||o()),K(`click`,n,()=>ye(G(t))),J(e,n)};X(S,e=>{G(fe)&&G(w)===G(t).id?e(C):e(T,-1)}),N(n),H((e,n)=>{Y(i,G(t).status===`uncertain`?`CHECK TRIGGER — outcome uncertain; not retried`:`SCHEDULED FOLLOW-UP`),Y(s,`TARGET // ${G(t).session??``}`),Y(l,e),Y(f,n),Y(h,G(t).text),b.disabled=G(g)||!G(u)?.id||G(u).kind!==`prompt`||!!G(u).questions?.length||G(t).status!==`pending`,x.disabled=G(g)||G(t).status===`sending`},[()=>G(t).trigger===`quota`?`After confirmed quota recovery, when idle`:`Not before ${_e(G(t).at)}`,()=>ve(G(t))]),K(`click`,b,()=>ae(G(t))),K(`click`,x,()=>se(G(t).id)),J(e,n)}),J(e,t)},we=P(()=>!a()&&G(u)?.kind!==`approval`&&!G(u)?.questions?.length&&![`APPROVAL NEEDED`,`INPUT NEEDED`].includes(G(ce)||``));X(xe,e=>{G(we)&&e(Ce)});var Te=V(xe,2),Ee=e=>{var r=Es(),o=R(r),s=B(o,!0),c=V(o,2),S=e=>{var t=Jo();Se(2),J(e,t)};X(c,e=>{G(u)?.requiredHumanApproval&&!G(k)&&!G(y)&&e(S)});var C=V(c,2),w=e=>{var t=Yo(),n=z(t),r=B(n),i=V(n,6),a=B(i,!0),o=B(V(i,6),!0);Se(2),H(()=>{Y(r,`Your ${G(u).profile.threshold??``}% quota threshold has been reached. Review + the profile for subsequent turns.`),Y(a,G(u).profile.current),Y(o,G(u).profile.proposed)}),J(e,t)};X(C,e=>{G(u)?.profile&&!G(k)&&!G(y)&&e(w)});var O=V(C,2),ne=e=>{var t=Xo();let n;var r=B(t,!0);H(()=>{n=li(t,1,`svelte-1oupzfc`,null,n,{notice:!G(v),sent:G(v)}),Y(r,G(_))}),J(e,t)};X(O,e=>{G(_)&&e(ne)});var ae=V(O,2),oe=e=>{Uo(e,{get lines(){return G(u).fileChanges}})},se=e=>{Uo(e,{get lines(){return i()}})},le=e=>{var t=Zo(),n=z(t),r=B(n,!0),i=B(V(n,2),!0);H(()=>{Y(r,G(ue)?`EXACT COMMAND`:`LAST OBSERVED COMMAND`),Y(i,G(de))}),J(e,t)},me=e=>{J(e,Qo())};X(ae,e=>{G(u)?.fileChanges?.length&&!G(k)&&!G(y)?e(oe):i().length?e(se,1):G(de)?e(le,2):a()!==`profile`&&G(ce)===`APPROVAL NEEDED`&&!G(v)&&e(me,3)});var ve=V(ae,2),j=e=>{J(e,$o())},be=e=>{J(e,es())},xe=e=>{var t=rs(),n=z(t),r=e=>{var t=ts(),n=B(t,!0);H(e=>Y(n,e),[()=>G(ce)===`WORKING`?`Codex is working — nothing to respond to.`:[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(G(ce)||``)?`Respond in Codex for this request.`:`Nothing needs a response right now.`]),J(e,t)};X(n,e=>{(G(ce)===`WORKING`||!G(v)&&!G(g))&&e(r)});var i=V(n,2),a=e=>{J(e,ns())},o=P(()=>[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(G(ce)||``)&&!G(v));X(i,e=>{G(o)&&e(a)}),J(e,t)},Ce=e=>{var r=Ts(),i=z(r),o=B(i),s=V(i,2),c=R(s),_=B(c,!0),v=V(c,2),y=e=>{var r=Pr();Z(z(r),17,()=>G(u).choices||[],qr,(e,r,i)=>{var o=os(),s=R(o);Si(s),s.value=s.__value=i;var c=V(s),l=V(c),u=e=>{var t=is(),n=B(t,!0);H(()=>Y(n,G(r).detail)),J(e,t)};X(l,e=>{G(r).detail&&e(u)});var d=V(l,2),p=e=>{J(e,as())};X(d,e=>{G(r).persistent&&e(p)}),N(o),H(()=>{Q(s,`name`,`decision-`+t.session+`-`+a()),Y(c,` ${G(r).label??``} `)}),ki(n,[],s,()=>G(f),e=>L(f,e)),J(e,o)}),J(e,r)},b=e=>{var n=rs(),r=z(n),i=e=>{var t=ps(),n=z(t),r=V(R(n)),i=R(r),a=e=>{var t=ss();t.value=t.__value=`now`,J(e,t)};X(i,e=>{G(x)||e(a)});var o=V(i);o.value=o.__value=`quota`;var s=V(o);s.value=s.__value=`delay`;var c=V(s);c.value=c.__value=`at`,N(r),hi(r),N(n);var l=V(n,2),u=e=>{var t=cs(),n=V(R(t));Si(n),N(t),Di(n,()=>G(E),e=>L(E,e)),J(e,t)};X(l,e=>{G(T)===`delay`&&e(u)});var d=V(l,2),f=e=>{var t=ls(),n=V(R(t));Si(n),N(t),Di(n,()=>G(D),e=>L(D,e)),J(e,t)};X(d,e=>{G(T)===`at`&&e(f)});var p=V(d,2),m=e=>{var t=ds(),n=z(t),r=B(n),i=V(n,2),a=e=>{J(e,us())};X(i,e=>{G(T)!==`quota`&&e(a)});var o=V(i,2);o.textContent=`Timezone: ${Intl.DateTimeFormat().resolvedOptions().timeZone??``}. + One pending request per session; saving replaces it. Memory + only; Codexometer must stay running. Uses session model, + reasoning and speed.`,H(e=>Y(r,`Will send: ${e??``}`),[()=>G(T)===`quota`?`when quota is available and this session is idle`:Number.isFinite(G(he))?_e(G(he)):`choose a date and time`]),J(e,t)};X(p,e=>{G(T)!==`now`&&e(m)});var h=V(p,2),g=e=>{J(e,fs())};X(h,e=>{G(x)&&e(g)}),gi(r,()=>G(T),e=>L(T,e)),J(e,t)};X(r,e=>{G(u).questions?.length||e(i)}),Z(V(r,2),17,()=>G(pe),qr,(e,n,r)=>{var i=bs(),o=z(i),s=e=>{{let n=P(()=>G(d)[0]||``);Li(zo(e,{get session(){return t.session},get oncopy(){return l()},get query(){return G(n)},oncomplete:e=>{L(d,[e],!0),ur().then(()=>G(re)?.focus())},onchange:()=>{L(d,[``],!0),ur().then(()=>G(re)?.focus())}}),e=>L(ie,e,!0),()=>G(ie))}};X(o,e=>{r===0&&a()!==`profile`&&G(u).kind===`prompt`&&!G(u).questions?.length&&e(s)});var c=V(o,2),f=R(c),p=V(f),m=e=>{var t=ms();Si(t),Di(t,()=>G(d)[r],e=>G(d)[r]=e),J(e,t)},h=e=>{var t=gs(),i=R(t);i.value=i.__value=``,Z(V(i),17,()=>G(n).options||[],qr,(e,t)=>{var n=hs(),r=B(n,!0),i={};H(()=>{Y(r,G(t)),i!==(i=G(t))&&(n.value=(n.__value=i)??``)}),J(e,n)}),N(t),hi(t),gi(t,()=>G(d)[r],e=>G(d)[r]=e),J(e,t)},g=e=>{var t=_s(),i=z(t);nt(i),Li(i,e=>L(re,e),()=>G(re));var a=V(i,2),o=e=>{var t=ts(),r=B(t);H(e=>Y(r,`Suggested answers: ${e??``}`),[()=>G(n).options.join(` · `)]),J(e,t)};X(a,e=>{G(n).options?.length&&e(o)}),K(`keydown`,i,e=>{G(u)?.kind===`prompt`&&!G(u).questions?.length&&G(ie)?.handleKey(e)}),Di(i,()=>G(d)[r],e=>G(d)[r]=e),J(e,t)};X(p,e=>{G(n).secret?e(m):G(n).freeText?e(g,-1):e(h,1)}),N(c);var _=V(c,2),v=e=>{var t=ys(),r=V(R(t),4);Z(r,21,()=>G(n).options||[],qr,(e,t)=>{var n=vs(),r=B(n,!0);H(()=>Y(r,G(t))),J(e,n)}),N(r),N(t),J(e,t)};X(_,e=>{G(n).secret&&!G(n).freeText&&e(v)}),H(()=>Y(f,`${G(n).text??``} `)),J(e,i)}),J(e,n)};X(v,e=>{G(u).kind===`approval`||G(u).kind===`profile`?e(y):e(b,-1)}),N(s);var S=V(s,2),C=e=>{var t=Ss(),n=z(t),r=e=>{var t=xs(),n=B(t);H(()=>Y(n,`TRIGGER // ${G(te)??``}`)),J(e,t)};X(n,e=>{G(ee)&&e(r)});var i=V(n,2),a=B(i),o=V(i,2),s=B(o),c=V(o,2);H(e=>{Y(a,`Check the target and ${G(u).kind===`profile`?`profile above`:G(u).kind===`approval`?G(u).fileChanges?.length?`proposed file changes above`:`exact command and permission scope`:`message above`}. ${G(ee)?`This schedules a follow-up that will send automatically when eligible`:`This will send to Codex`}; it may start work using your quota. + Confirmation expires in ${e??``}s.`),o.disabled=G(g)||G(k),Y(s,`CONFIRM ${(G(u).kind===`approval`||G(u).kind===`profile`?G(u).choices?.[G(f)]?.label:G(ee)?G(x)?`SAVE CHANGES`:`SCHEDULE`:`SEND`)??``}`)},[()=>Math.max(0,Math.ceil((G(m)-G(h))/1e3))]),K(`click`,o,M),K(`click`,c,()=>{L(p,``)}),J(e,t)},w=e=>{var t=Cs(),n=z(t),r=e=>{var t=Wo(),n=B(t,!0);H(()=>Y(n,G(ge))),J(e,t)};X(n,e=>{G(ge)&&e(r)});var i=V(n,2),a=B(i,!0);H(()=>{i.disabled=G(g)||G(k)||!G(A)||!!G(ge),Y(a,G(g)?`SENDING…`:$.data?.noConfirm?G(x)?`SAVE CHANGES`:G(u).kind===`approval`||G(u).kind===`profile`?`SEND DECISION`:G(u).kind===`prompt`&&!G(u).questions?.length&&G(T)!==`now`?`SET TRIGGER`:`SEND`:G(x)?`REVIEW CHANGES`:`REVIEW BEFORE SENDING`)}),K(`click`,i,()=>ye()),J(e,t)};X(S,e=>{G(fe)&&!$.data?.noConfirm?e(C):e(w,-1)});var O=V(S,2),ne=e=>{var t=ws();K(`click`,t,()=>{L(x,!1),L(p,``),L(d,[],!0)}),J(e,t)};X(O,e=>{G(x)&&e(ne)}),H(()=>{Y(o,`TARGET // ${G(u).thread??``} // ${(G(u).directory||`Directory unavailable`)??``}`),s.disabled=G(g)||G(fe)||G(k),Y(_,G(u).kind===`approval`||G(u).kind===`profile`?`Choose a decision`:G(x)?`EDIT SCHEDULED FOLLOW-UP`:`Reply to this session`)}),J(e,r)};X(ve,e=>{G(k)||G(y)?e(j):G(u)?G(u).id?G(b)!==G(u).id&&e(Ce,3):e(xe,2):e(be,1)}),N(r),H(()=>Y(s,a()===`profile`?`QUOTA THRESHOLD`:`SESSION CONTROL // EXPERIMENTAL`)),J(e,r)};X(Te,e=>{!G(le)&&(!G(ne)||G(x)||a()||G(u)?.kind!==`prompt`||G(u).questions?.length)&&e(Ee)}),J(e,be),Ge()}Cr([`click`,`keydown`]);var Os=q(` `);function ks(e,t){We(t,!0);let n=Gi(t,`stale`,3,!1),r=P(()=>n()||!!t.goal?.stale);var i=Pr(),a=z(i),o=e=>{var n=Os();let i;var a=B(n,!0);H((e,o)=>{i=li(n,1,`goal-status svelte-1yfu3xi`,null,i,{stale:G(r),pursuing:!G(r)&&t.goal.status===`active`,blocked:e}),Q(n,`title`,o),Y(a,G(r)?`GOAL STALE`:t.goal.label)},[()=>!G(r)&&[`blocked`,`usageLimited`,`budgetLimited`].includes(t.goal.status),()=>t.goal.objective+` +`+t.goal.tokensUsed.toLocaleString()+(t.goal.tokenBudget===null?` tokens`:` / `+t.goal.tokenBudget.toLocaleString()+` tokens`)]),J(e,n)};X(a,e=>{t.goal&&e(o)}),J(e,i),Ge()}var As=q(` `,1),js=q(`
          `),Ms=q(`

          STATUS LINE // CODEXOMETER

          Choose multiple fields and their order. These display preferences do not + change Codex CLI configuration. Missing values are omitted.

          `),Ns=q(`

          `,1);function Ps(e,t){We(t,!0);let n=Gi(t,`stale`,3,!1),r=I(Xt([])),i=I(!1),a=P(()=>$.data?.statusLineFields||[]),o=e=>[...new Set(e??G(a).filter(e=>e.default).map(e=>e.id))].filter(e=>G(a).some(t=>t.id===e)),s=e=>o(e).map(e=>e===`run-state`&&(n()||!$.connected||$.data?.sessionsError)?`STALE`:t.session.statusLine?.[e]).filter(Boolean).join(` · `),c=P(()=>[...G(r).map(e=>G(a).find(t=>t.id===e)).filter(Boolean),...G(a).filter(e=>!G(r).includes(e.id))]);yn(()=>{sa.open&&!G(i)?(L(r,o(oa.statusLine),!0),L(i,!0)):sa.open||L(i,!1)});function l(e,t){L(r,t?[...G(r),e]:G(r).filter(t=>t!==e),!0)}function u(e,t){let n=G(r).indexOf(e),i=n+t;if(n<0||i<0||i>=G(r).length)return;let a=[...G(r)];[a[n],a[i]]=[a[i],a[n]],L(r,a,!0)}var d=Ns(),p=z(d),m=e=>{var t=Ms(),n=V(R(t),4);Z(n,21,()=>G(c),e=>e.id,(e,t)=>{var n=js(),i=R(n),a=R(i);Si(a);var o=V(a,1,!0),s=B(V(o),!0);N(i);var c=V(i,2),d=e=>{var n=As(),i=z(n),a=V(i,2);H((e,n)=>{Q(i,`aria-label`,`Move `+G(t).label+` earlier`),i.disabled=e,Q(a,`aria-label`,`Move `+G(t).label+` later`),a.disabled=n},[()=>G(r).indexOf(G(t).id)===0,()=>G(r).indexOf(G(t).id)===G(r).length-1]),K(`click`,i,()=>u(G(t).id,-1)),K(`click`,a,()=>u(G(t).id,1)),J(e,n)},f=P(()=>G(r).includes(G(t).id));X(c,e=>{G(f)&&e(d)}),N(n),H(e=>{Q(i,`title`,G(t).help),Ci(a,e),Y(o,G(t).label),Y(s,G(t).help)},[()=>G(r).includes(G(t).id)]),K(`change`,a,e=>l(G(t).id,e.currentTarget.checked)),J(e,n)}),N(n);var i=V(n,2),a=B(i),o=V(i,2),d=V(o,2);N(t),H(e=>Y(a,`Preview // ${e??``}`),[()=>s(G(r))||`—`]),K(`click`,o,()=>{oa.statusLine=[...G(r)],la(),sa.open=!1}),K(`click`,d,()=>{sa.open=!1}),J(e,t)};X(p,e=>{sa.open&&e(m)});var h=V(p,2),g=R(h),_=B(g,!0),v=V(g,2);{let e=P(()=>n()||!$.connected||!!$.data?.sessionsError);ks(v,{get goal(){return t.session.goal},get stale(){return G(e)}})}var y=V(v,2);ni(V(y,2),()=>t.children??f),N(h),H((e,t)=>{Q(g,`title`,e),Y(_,t)},[()=>s(oa.statusLine),()=>s(oa.statusLine)]),K(`click`,y,()=>{sa.open=!sa.open}),J(e,d),Ge()}Cr([`change`,`click`]);var Fs=q(`
          `);function Is(e,t){We(t,!0);let n=Gi(t,`active`,3,!1),r=Gi(t,`compact`,3,!1),i=P(()=>oo(t.session)),a=P(()=>!!G(i)),o=I(!1),s=I(``),c=I(!1);yn(()=>{if(!G(c))return;let e=setTimeout(()=>{L(c,!1)},150);return()=>clearTimeout(e)}),yn(()=>{G(i),t.session.status,L(s,``)});async function l(){if(!G(a)||G(o))return;let e=G(i);L(o,!0),L(c,!0),L(s,``);try{await navigator.clipboard.writeText(e),G(i)===e&&L(s,`Copied.`)}catch{G(i)===e&&L(s,`Clipboard unavailable. Select the visible text and copy it manually.`)}finally{L(o,!1)}}function u(e){!n()||!G(a)||e.defaultPrevented||e.repeat||e.ctrlKey||e.metaKey||e.altKey||e.key.toLowerCase()!==`c`||e.target instanceof Element&&e.target.closest(`input, textarea, select, [contenteditable]`)||(e.preventDefault(),l())}var d={copy:l},f=Pr();Sr(`keydown`,$t,u);var p=z(f),m=e=>{var t=Fs();let n;var i=R(t),a=B(i,!0),u=V(i,2);let d;N(t),H(()=>{n=li(t,1,`session-copy svelte-543j00`,null,n,{compact:r()}),Y(a,G(s)),u.disabled=G(o),d=li(u,1,`svelte-543j00`,null,d,{flashed:G(c)})}),K(`click`,u,l),J(e,t)};return X(p,e=>{G(a)&&e(m)}),J(e,f),Ge(d)}Cr([`click`]);var Ls=q(`

           
          `,1),Rs=q(`

          LATEST GUIDANCE

           
          `,1),zs=q(`

          CONTEXT

           

          `,1),Bs=q(`

          `),Vs=q(`

          `),Hs=q(`
           
          `),Us=q(`

           
          `,1),Ws=q(`
           
          `),Gs=q(`

          Command unavailable from this observation. Open Codex to inspect the + request.

          `),Ks=q(`

          `,1),qs=q(`

          `),Js=q(` `,1),Ys=q(`

          `),Xs=q(`
          `),Zs=q(`

          Session connection or refresh unavailable. Context and telemetry may be + stale.

          `),Qs=q(`

          Some quota profile checks are unavailable. Only sessions with freshly + verified quota and settings can be updated; previous outcome notices remain + visible.

          `),$s=q(` `),ec=q(` `),tc=q(` `),nc=q(``),rc=q(`

          Read only — reply or approve in Codex.

          `),ic=q(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),ac=q(`
          `),oc=q(` `,1),sc=q(`
          `),cc=q(`

          This session is no longer in the current observation. Return to sessions.

          `),lc=q(`

          `),uc=q(``),dc=q(`

          `),fc=q(` `),pc=q(`

          `),mc=q(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),hc=q(`

          `),gc=q(`

          TOKEN ACTIVITY // 30 SECOND SAMPLES

          `),_c=q(`

          TOKENS

          FULL DETAIL →
          `),vc=q(`

          No locally observed sessions yet. Keep Codex running alongside + Codexometer.

          `),yc=q(`

          ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

          `,1),bc=q(`

          SESSION TOTALS

          `,1);function xc(e,t){We(t,!0);let n=(e,t=f,n,r)=>{let i=mt(()=>g(n?.(),!0)),a=mt(()=>g(r?.(),!1));var o=Js(),s=z(o),c=e=>{var n=Ls(),r=z(n),i=B(r,!0),a=B(V(r,2),!0);H(()=>{Y(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),Y(a,t().currentTask)}),J(e,n)};X(s,e=>{t().currentTask&&e(c)});var l=V(s,2),u=e=>{var n=Rs(),r=B(V(z(n),2),!0);H(()=>Y(r,t().latestGuidance)),J(e,n)};X(l,e=>{t().latestGuidance&&e(u)});var d=V(l,2),p=e=>{var n=zs(),r=B(V(z(n),2),!0);Se(2),H(()=>Y(r,t().approvalContext)),J(e,n)};X(d,e=>{G(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=V(d,2),h=e=>{var n=Bs();let r;var i=B(n,!0);H(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),Y(i,e)},[()=>ie(t())]),J(e,n)},_=P(()=>ie(t())&&(!G(a)||G(v)||t().status===`CHECK SESSION`||y(t())));X(m,e=>{G(_)&&e(h)});var b=V(m,2),x=e=>{var n=Vs(),r=B(n,!0);H(e=>Y(r,e),[()=>ae(t())]),J(e,n)};X(b,e=>{G(i)&&e(x)});var S=V(b,2),C=e=>{var n=Hs(),r=B(n,!0);H(()=>Y(r,t().text||`No session context available.`)),J(e,n)};X(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=V(S,2),T=e=>{var n=Us(),r=V(z(n),2),i=R(r),a=V(i),o=e=>{var n=Nr();H(()=>Y(n,`// ${t().commandTiming??``}`)),J(e,n)};X(a,e=>{t().commandTiming&&e(o)});var s=V(a,2),c=e=>{var n=Nr();H(()=>Y(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),J(e,n)};X(s,e=>{!G(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=V(s,2),u=e=>{J(e,Nr(`+`))};X(l,e=>{t().runningLimited&&e(u)}),N(r);var d=B(V(r,2),!0);H(e=>{Y(i,`COMMAND // ${e??``} `),Y(d,t().workingCommand)},[()=>G(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),J(e,n)};X(w,e=>{t().workingCommand&&e(T)});var E=V(w,2),D=e=>{Uo(e,{get lines(){return t().fileChanges}})},ee=e=>{var n=Ks(),r=V(z(n),2),i=B(r,!0),a=V(r,2),o=e=>{var n=Ws(),r=B(n,!0);H(()=>Y(r,t().command)),J(e,n)},s=e=>{J(e,Gs())};X(a,e=>{t().command?e(o):e(s,-1)}),H(()=>Y(i,G(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),J(e,n)};X(E,e=>{(!G(a)||!$.data?.control)&&t().fileChanges?.length?e(D):G(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(ee,1)});var te=V(E,2),O=e=>{var n=qs(),r=B(n);H(()=>Y(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),J(e,n)};X(te,e=>{G(a)||e(O)}),J(e,o)},r=I(void 0),i=Gi(t,`params`,19,()=>({})),a=P(()=>$.data?.sessions||[]),o=P(()=>$.data?.control&&$.data.profiles||[]),s=P(()=>($.data?.triggers||[]).filter(e=>G(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&G(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=I(!1);function d(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}yn(()=>{let e=i().id;e&&pr(()=>{oa.selected=e,pa(e,2)})});let p=P(()=>G(a).find(e=>e.id===i().id)),m=P(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&G(o).some(e=>e.session===i().id&&e.pending)),h=P(()=>G(a).some(e=>e.id===oa.selected)?oa.selected:G(a)[0]?.id),v=P(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=P(()=>[[`OBSERVED TOKENS`,ma(G(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(G(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,G(v)?`—`:ma(G(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=P(()=>G(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=P(()=>G(a).filter(e=>e.status===`TURN COMPLETE`&&(!e.readStateKnown||e.unread)&&!G(s).some(t=>t.session===e.id)&&!G(o).some(t=>t.session===e.id&&t.pending))),w=I(``),T=new Set;async function E(e){if(!$.data?.control||G(v)||!e.unread||!e.readRevision||!e.replyTurn||e.streaming||G(m))return;let t=e.id,n=e.readRevision,r=e.replyTurn,i=JSON.stringify([t,n,r]);if(!T.has(i)){T.add(i);try{await ur();let e=G(a).find(e=>e.id===t);if(!Array.from(document.querySelectorAll(`[data-result-session]`)).some(e=>e.dataset.resultSession===t&&e.dataset.resultTurn===r&&!e.closest(`[inert], [hidden]`)&&document.visibilityState===`visible`&&e.getBoundingClientRect().top0&&e.getBoundingClientRect().width>0&&e.getBoundingClientRect().height>0)||e?.readRevision!==n||e?.replyTurn!==r||G(v))return;await ya(`read`,{session:t,read:{turn:r,revision:n}}),L(w,``)}catch{L(w,`Result changed or could not be marked read. Open it again to retry.`)}finally{T.delete(i)}}}function D(e){O(e);let t=G(a).find(t=>t.id===e);t&&E(t)}let ee=I(``),te=I(``);yn(()=>{let e=i().id||``;e!==G(ee)&&(L(ee,e,!0),L(te,e,!0))}),yn(()=>{if(G(te)&&G(p)?.id===G(te)){let e=G(p);L(te,``),pr(()=>{E(e)})}});function O(e){oa.selected=e,ur().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function ne(e,t){if(O(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;if(n>2)location.hash=`/sessions/`+encodeURIComponent(e);else if(pa(e,n),t>0){let t=G(a).find(t=>t.id===e);t&&E(t)}}function re(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),ne(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||G(h)))e.preventDefault(),ne(i().id||G(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&G(a).length){e.preventDefault();let t=G(a).findIndex(e=>e.id===G(h));O(G(a)[Math.max(0,Math.min(G(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function ie(e){return G(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ae(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var oe=bc();Sr(`keydown`,$t,re);var se=z(oe),ce=e=>{var t=Ys(),n=B(t,!0);H(()=>Y(n,G(w))),J(e,t)};X(se,e=>{G(w)&&e(ce)});var k=V(se,2),le=B(V(R(k),2));N(k);var ue=V(k,2);let de;Z(ue,21,()=>G(b),qr,(e,t)=>{var n=P(()=>_(G(t),2));let r=()=>G(n)[0],i=()=>G(n)[1];var a=Xs();let o;var s=R(a),c=B(s,!0),l=B(V(s,2),!0);N(a),H(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),Y(c,r()),Y(l,i())}),J(e,a)}),N(ue);var fe=V(ue,2),pe=B(fe),A=V(fe,2),me=e=>{J(e,Zs())};X(A,e=>{G(v)&&e(me)});var he=V(A,2),ge=e=>{J(e,Qs())};X(he,e=>{$.data?.profileError&&e(ge)});var _e=V(he,2),ve=e=>{var t=nc(),n=R(t);Z(n,17,()=>G(x),qr,(e,t)=>{var n=$s();let r;var i=B(n);H((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),Y(i,`${G(t).status??``} + ${o??``} // ${(G(t).name||G(t).directory||G(t).id)??``}`)},[()=>G(t).status===`APPROVAL NEEDED`||G(t).status===`INPUT NEEDED`||y(G(t)),()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,n,()=>O(G(t).id)),J(e,n)});var r=V(n,2);Z(r,17,()=>G(o).filter(e=>e.pending&&G(a).some(t=>t.id===e.session)),qr,(e,t)=>{var n=ec(),r=B(n);H((e,a,o)=>{Q(n,`title`,i().id&&i().id!==G(t).session&&G(u)?`Finish sending or clear your current draft before switching sessions.`:`Review this session’s quota threshold`),Q(n,`href`,e),Y(r,`QUOTA THRESHOLD ${a??``} // ${o??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).session)+`?review=profile`,()=>Array.from(G(t).session).slice(-5).join(``).toUpperCase(),()=>G(a).find(e=>e.id===G(t).session)?.name||G(a).find(e=>e.id===G(t).session)?.directory||G(t).session]),K(`click`,n,e=>d(e,G(t).session)),J(e,n)});var l=V(r,2);Z(l,17,()=>G(C),qr,(e,t)=>{var n=tc(),r=B(n);H((e,i)=>{Q(n,`href`,e),Y(r,`TURN COMPLETE ${i??``} // + ${(G(t).name||G(t).directory||G(t).id)??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,n,()=>O(G(t).id)),J(e,n)}),Z(V(l,2),17,()=>G(s),qr,(e,t)=>{var n=tc(),r=B(n);H((e,t,i)=>{Q(n,`href`,e),Y(r,`TRIGGER SET ${t??``} // ${i??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).session),()=>Array.from(G(t).session).slice(-5).join(``).toUpperCase(),()=>G(a).find(e=>e.id===G(t).session)?.name||G(a).find(e=>e.id===G(t).session)?.directory]),K(`click`,n,e=>c(e,G(t).session)),J(e,n)}),N(t),J(e,t)},j=P(()=>(G(x).length||G(C).length||G(o).some(e=>e.pending)||G(s).length)&&!G(v));X(_e,e=>{G(j)&&e(ve)});var ye=V(_e,2),M=e=>{var t=Pr(),a=z(t),s=e=>{var t=sc(),a=R(t),s=R(a);let c;var d=R(s);let f;var h=V(d);N(s);var g=V(s,2);N(a);var _=V(a,2),b=e=>{var t=qs(),n=B(t,!0);H(()=>Y(n,G(p).directory)),J(e,t)};X(_,e=>{G(p).name&&G(p).directory&&e(b)});var x=V(_,2),S=B(x),C=V(x,2);let w;var T=R(C),D=R(T);n(D,()=>G(p),()=>!0,()=>!0),N(T);var ee=V(T,2),te=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{{let t=P(()=>new URLSearchParams(Xi.querystring).get(`schedule`)===`edit`),n=P(()=>G(p).fileChanges||[]);Ds(e,{get session(){return G(p).id},oncopy:()=>G(r)?.copy(),get openScheduler(){return G(t)},get observedCommand(){return G(p).command},get observedFileChanges(){return G(n)},get suspended(){return G(m)},onProtectedChange:e=>{L(u,e,!0)}})}}),J(e,t)},ne=e=>{var t=rc();Kr(V(R(t),2),()=>G(p).id,e=>{zo(e,{get session(){return G(p).id},localOnly:!0,oncopy:()=>G(r)?.copy()})}),N(t),J(e,t)};X(ee,e=>{$.data?.control?e(te):e(ne,-1)}),N(C);var re=V(C,2);Z(re,17,()=>G(o).filter(e=>e.session===G(p).id),e=>e.session,(e,t)=>{var n=ac(),r=R(n),i=e=>{var n=Ys(),r=B(n,!0);H(()=>Y(r,G(t).notice)),J(e,n)};X(r,e=>{G(t).notice&&e(i)});var a=V(r,2),o=e=>{Ds(e,{get session(){return G(p).id},review:`profile`})},s=e=>{var t=ic();H(e=>Q(t,`href`,e),[()=>`#/sessions/`+encodeURIComponent(G(p).id)+`?review=profile`]),J(e,t)};X(a,e=>{G(t).pending&&G(m)?e(o):G(t).pending&&e(s,1)}),N(n),H(()=>Q(n,`id`,`quota-profile-`+G(p).id)),J(e,n)});var ie=V(re,2),ae=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{Ps(e,{get session(){return G(p)},get stale(){return G(v)},children:e=>{var t=Pr(),n=z(t),i=e=>{Li(Is(e,{get session(){return G(p)},active:!0,compact:!0}),e=>L(r,e,!0),()=>G(r))};X(n,e=>{G(m)||e(i)}),J(e,t)},$$slots:{default:!0}})}),J(e,t)},oe=e=>{var t=oc(),n=z(t),i=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{Li(Is(e,{get session(){return G(p)},active:!0}),e=>L(r,e,!0),()=>G(r))}),J(e,t)};X(n,e=>{G(m)||e(i)}),Kr(V(n,2),()=>G(p).id,e=>{Ps(e,{get session(){return G(p)},get stale(){return G(v)}})}),J(e,t)};X(ie,e=>{G(p).goal?e(ae):e(oe,-1)}),N(t),H((e,t,n,r)=>{c=li(s,1,`svelte-mm4wfe`,null,c,{failed:e,reviewed:G(p).status===`TURN COMPLETE`&&G(p).readStateKnown&&!G(p).unread}),f=li(d,1,`lamp lit svelte-mm4wfe`,null,f,{failed:t,working:G(p).status===`WORKING`&&!G(v)}),Y(h,`${n??``} // ${(G(p).name||G(p).directory)??``}`),Y(S,`${r??``} TOKENS // ${G(p).id??``} // CONTEXT SOURCE // ${(G(p).source||`LOCAL`)??``}`),w=di(C,``,w,{display:G(m)?`none`:void 0}),Q(T,`data-result-session`,G(p).id),Q(T,`data-result-turn`,G(p).replyTurn)},[()=>y(G(p))&&!G(v)&&!G(m),()=>y(G(p))&&!G(v),()=>G(v)?`STALE`:G(m)?`QUOTA THRESHOLD`:l(G(p)),()=>ma(G(p).tokens)]),K(`click`,g,()=>{O(i().id),pa(i().id,2)}),Sr(`wheel`,T,()=>{E(G(p))}),J(e,t)},c=e=>{J(e,cc())};X(a,e=>{G(p)?e(s):e(c,-1)}),J(e,t)},be=e=>{var t=yc(),r=z(t),i=V(R(r),2),s=R(i),c=V(s,2);N(i),N(r);var u=V(r,2);Z(u,17,()=>G(a),e=>e.id,(e,t)=>{let r=P(()=>da(G(t).id));var i=_c();let a;var s=R(i),c=R(s),u=e=>{var n=lc(),r=R(n),i=B(r);N(n),H(e=>{Q(r,`aria-pressed`,G(h)===G(t).id),Y(i,`${e??``} // ${G(t).name??``}`)},[()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,r,()=>O(G(t).id)),J(e,n)};X(c,e=>{G(t).name&&e(u)});var f=V(c,2),p=R(f);let m;var g=R(p);let _;var b=V(g,1,!0);N(p),N(f);var x=V(f,2),S=e=>{var n=uc(),r=B(n,!0);H(()=>{Q(n,`aria-pressed`,G(h)===G(t).id),Y(r,G(t).directory||G(t).id)}),K(`click`,n,()=>O(G(t).id)),J(e,n)};X(x,e=>{G(t).name||e(S)});var C=V(x,2),w=R(C);Se(),N(C);var T=V(C,2),ee=e=>{var n=qs(),r=B(n,!0);H(()=>Y(r,G(t).directory)),J(e,n)};X(T,e=>{G(t).name&&G(t).directory&&e(ee)});var te=V(T,2),re=B(te),ie=V(te,2),oe=B(ie),se=V(ie,2);ks(se,{get goal(){return G(t).goal},get stale(){return G(v)}});var ce=V(se,2),k=R(ce),le=V(k,2),ue=B(le,!0),de=V(le,2);N(ce);var fe=V(ce,2),pe=V(fe,2),A=e=>{var n=dc(),r=B(n,!0);H(e=>Y(r,e),[()=>G(t).status===`CHECK SESSION`?`INFERRED INACTIVITY`:y(G(t))?`OPEN DETAIL FOR THE TURN ERROR`:$.data?.control?`OPEN FULL DETAIL OR REPLY IN CODEX`:G(t).status===`APPROVAL NEEDED`?`APPROVE OR DECLINE IN CODEX`:`REPLY IN CODEX`]),J(e,n)},me=P(()=>!G(v)&&([`APPROVAL NEEDED`,`INPUT NEEDED`,`CHECK SESSION`].includes(G(t).status)||y(G(t))));X(pe,e=>{G(me)&&e(A)}),N(s);var he=V(s,2),ge=e=>{var r=hc(),i=R(r),a=R(i),s=B(a,!0),c=V(a,2),l=e=>{var n=fc(),r=B(n,!0);H(e=>{Q(n,`href`,e),Y(r,$.data?.control?`REVIEW IN FULL DETAIL ↗`:`APPROVAL IN CODEX ↗`)},[()=>`#/sessions/`+encodeURIComponent(G(t).id)]),J(e,n)};X(c,e=>{!G(v)&&G(t).status===`APPROVAL NEEDED`&&e(l)}),N(i);var u=V(i,2),f=R(u);n(f,()=>G(t),()=>!1),N(u);var p=V(u,2);Z(p,17,()=>G(o).filter(e=>e.session===G(t).id),qr,(e,n)=>{var r=oc(),i=z(r),a=e=>{var t=pc(),r=B(t,!0);H(()=>Y(r,G(n).notice)),J(e,t)};X(i,e=>{G(n).notice&&e(a)});var o=V(i,2),s=e=>{var n=mc();H(e=>Q(n,`href`,e),[()=>`#/sessions/`+encodeURIComponent(G(t).id)+`?review=profile`]),K(`click`,n,e=>d(e,G(t).id)),J(e,n)};X(o,e=>{G(n).pending&&e(s)}),J(e,r)});var m=V(p,2);{let e=P(()=>G(h)===G(t).id);Is(m,{get session(){return G(t)},get active(){return G(e)}})}N(r),H(e=>{Y(s,e),Q(u,`data-result-session`,G(t).id),Q(u,`data-result-turn`,G(t).replyTurn)},[()=>ae(G(t))]),Sr(`wheel`,u,()=>{E(G(t))}),J(e,r)};X(he,e=>{G(r)>0&&e(ge)});var _e=V(he,2),ve=e=>{var n=gc(),r=V(R(n),2);{let e=P(()=>(G(t).samples||[]).map(e=>e.tokens));ao(r,{get values(){return G(e)},capacity:120})}var i=B(V(r,2));N(n),H(()=>Y(i,`LAST ${(G(t).samples?.length||0)??``} SAMPLES // AUTO SCALE`)),J(e,n)};X(_e,e=>{G(r)<2&&e(ve)}),N(i),H((e,n,o,s,c,l,u)=>{a=li(i,1,`session-row`,null,a,{selected:G(h)===G(t).id,wide:G(r)===2,split:G(r)===1}),Q(i,`aria-label`,`Session `+(G(t).name||G(t).directory||G(t).id)),m=li(p,1,`status-detail svelte-mm4wfe`,null,m,{reviewed:G(t).status===`TURN COMPLETE`&&G(t).readStateKnown&&!G(t).unread,failed:e}),Q(p,`href`,n),_=li(g,1,`lamp lit svelte-mm4wfe`,null,_,{failed:o,working:G(t).status===`WORKING`&&!G(v)}),Y(b,s),Y(w,`${c??``} `),Y(re,`${G(t).agents??``} LINKED AGENTS`),Y(oe,`ACTIVE // ${l??``}`),k.disabled=G(r)===0,Q(le,`aria-expanded`,G(r)>0),Y(ue,G(r)?`HIDE DETAIL`:`SHOW DETAIL`),Q(fe,`href`,u)},[()=>y(G(t))&&!G(v),()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>y(G(t))&&!G(v),()=>G(v)?`STALE`:l(G(t)),()=>ma(G(t).tokens),()=>ha(G(t).activity),()=>`#/sessions/`+encodeURIComponent(G(t).id)]),K(`click`,p,()=>D(G(t).id)),K(`click`,k,()=>ne(G(t).id,-1)),K(`click`,le,()=>{let e=G(r)===0;O(G(t).id),pa(G(t).id,+!!e),e&&E(G(t))}),K(`click`,de,()=>ne(G(t).id,1)),K(`click`,fe,()=>D(G(t).id)),J(e,i)});var f=V(u,2),p=e=>{J(e,vc())};X(f,e=>{G(a).length||e(p)}),K(`click`,s,()=>fa(1)),K(`click`,c,()=>fa(0)),J(e,t)};X(ye,e=>{i().id?e(M):e(be,-1)}),H(e=>{Y(le,`OBSERVED ${e??``}`),de=li(ue,1,`session-totals`,null,de,{stale:G(v)}),Y(pe,`${G(v)?`LAST KNOWN TOTALS — live state counts unavailable. `:``}Tokens + observed since this server started for currently listed sessions; linked + agents are already included. Totals can decrease when a session leaves the + list. History samples every 30 seconds. Not account-wide totals.`)},[()=>ha($.data?.sessionsAt)]),J(e,oe),Ge()}Cr([`click`]);var Sc=q(``),Cc=q(`

          `),wc=q(`

          Relative usage/credits are not tokens or quota percentages. Groupings + describe the same usage, not additional consumption.

          `,1),Tc=q(`// APPROXIMATE`),Ec=q(`

          Partial accounting: totals may still change.

          `),Dc=q(`

          Percentage of this period's historical allowance, not today's limit. May + exceed 100%. This is not a manual/automatic reset log.

          `,1),Oc=q(`

          `,1),kc=q(`

          This optional account report is unavailable. Token history remains + available; missing data does not mean zero usage.

          `),Ac=q(`
          `),jc=q(`
          `),Mc=q(`

          No usage reported for this day.

          `),Nc=q(`

          Selected breakdown unavailable; missing does not mean zero.

          `),Pc=q(`

          `,1);function Fc(e,t){We(t,!0);let n=I(Xt(co[0])),r=I(0),i=P(()=>t.reports?.daily),a=P(()=>t.reports?.plan),o=P(()=>t.mode===`breakdown`?G(i)?.days?.length||0:G(a)?.periods?.length||0),s=P(()=>Math.min(G(r),Math.max(0,G(o)-1))),c=P(()=>G(i)?.days?.[(G(i)?.days?.length||0)-1-G(s)]),l=P(()=>G(a)?.periods?.[G(s)]),u=P(()=>t.mode===`breakdown`?G(i)?.units||``:`%`),d=P(()=>(t.mode===`breakdown`?G(c):G(l))?.views?.[G(n)]),f=P(()=>G(d)?.rows||[]),p=P(()=>G(d)?.total),m=P(()=>G(d)?.level||`unknown`),h=P(()=>G(d)?.peak||1),g=e=>e==null?`UNKNOWN`:e.toLocaleString(`en-GB`,{maximumFractionDigits:2});var _=Pc(),v=z(_),y=R(v),b=V(R(y));Z(b,21,()=>co,qr,(e,t)=>{var n=Sc(),r=B(n,!0),i={};H(e=>{Y(r,e),i!==(i=G(t))&&(n.value=(n.__value=i)??``)},[()=>G(t).charAt(0).toUpperCase()+G(t).slice(1)]),J(e,n)}),N(b),hi(b),N(y);var x=V(y,2),S=V(x,2),C=B(V(S,2),!0);N(v);var w=V(v,2),T=R(w),E=B(T,!0),D=V(T,2),ee=B(D),te=V(D,2),O=e=>{var t=wc(),n=z(t),r=B(n),a=V(n,2),o=e=>{var t=Cc(),n=B(t);H(()=>Y(n,`Data as of ${G(i).dataAsOf??``}`)),J(e,t)};X(a,e=>{G(i).dataAsOf&&e(o)});var s=B(V(a,2));Se(2),H((e,t)=>{Y(r,`Latest fetch ${e??``} // queried ${G(i).from??``} → ${G(i).through??``}. + Reports are fetched from OpenAI and are not saved between runs.`),Y(s,`${(G(c)?.date||`No daily buckets reported`)??``} // ${t??``} + ${G(u)??``}`)},[()=>ha(G(i).fetchedAt),()=>g(G(p))]),J(e,t)},ne=e=>{var t=Oc(),n=z(t),r=R(n);let i;var o=B(r,!0),s=V(r),c=e=>{J(e,Tc())};X(s,e=>{G(a).approximate&&e(c)});var u=V(s);N(n);var d=V(n,2),f=R(d),h=V(f),_=e=>{var t=Nr();H(()=>Y(t,`// Boundary tolerance ${G(a).boundary_tolerance_seconds??``}s`)),J(e,t)};X(h,e=>{G(a).boundary_tolerance_seconds!=null&&e(_)}),N(d);var v=V(d,2),y=e=>{var t=Dc(),n=z(t),r=R(n),i=V(r);let a;var o=B(i);N(n);var s=V(n,2),c=B(s),u=V(s,2),d=e=>{J(e,Ec())};X(u,e=>{G(l).accounting_complete||e(d)}),Se(2),H(e=>{Y(r,`${G(l).window_minutes??``} MIN // ${G(l).plan_type??``} // `),a=li(i,1,`svelte-1fbui7h`,null,a,{muted:G(m)===`unknown`,"quota-near":G(m)===`near`,"quota-full":G(m)===`full`}),Y(o,`USED ${e??``}${G(p)==null?``:`%`}`),Y(c,`${G(l).starts_at??``} → ${G(l).ends_at??``}`)},[()=>g(G(p))]),J(e,t)};X(v,e=>{G(l)&&e(y)}),H(e=>{i=li(r,1,`svelte-1fbui7h`,null,i,{"quality-warning":!G(a).coverage_complete}),Y(o,G(a).coverage_complete?`Reported range complete`:`Partial coverage`),Y(u,` // Latest fetch ${e??``}`),Y(f,`Coverage starts ${(G(a).coverage_start||`unknown`)??``} // Data as of ${(G(a).data_as_of||`unknown`)??``}`)},[()=>ha(G(a).fetchedAt)]),J(e,t)},re=e=>{J(e,kc())};X(te,e=>{t.mode===`breakdown`&&G(i)?e(O):t.mode===`periods`&&G(a)?e(ne,1):e(re,-1)});var ie=V(te,2),ae=e=>{var n=jc(),r=R(n),i=B(V(R(r),2),!0);N(r),Z(V(r,2),17,()=>G(f),qr,(e,n,r)=>{let i=()=>G(n).name,a=()=>G(n).value;var o=Ac();let s;var c=R(o),l=B(c,!0),u=V(c,2),d=R(u);let f;N(u);var p=B(V(u,2));N(o),H((e,n,a)=>{s=li(o,1,`report-row svelte-1fbui7h`,null,s,{unknown:e,alternate:r%2==1}),Q(c,`title`,i()),Y(l,i()),f=di(d,``,f,{width:n}),Y(p,`${a??``}${t.mode===`periods`?`%`:``}`)},[()=>i().trim().toLowerCase()===`unknown`,()=>`${Math.max(0,100*a()/G(h))}%`,()=>g(a())]),J(e,o)}),N(n),H(()=>Y(i,t.mode===`breakdown`?G(u):`QUOTA USED`)),J(e,n)},oe=e=>{J(e,Mc())},se=e=>{J(e,Nc())};X(ie,e=>{G(f).length?e(ae):t.mode===`breakdown`&&G(d)?.knownEmpty?e(oe,1):(G(i)&&t.mode===`breakdown`||G(a)&&t.mode===`periods`)&&e(se,2)}),N(w),H(()=>{x.disabled=G(s)>=G(o)-1,S.disabled=G(s)===0,Y(C,G(o)?`${G(s)+1} / ${G(o)}`:`NO DATA`),Y(E,t.mode===`breakdown`?`DAILY BREAKDOWN`:`QUOTA WINDOWS`),Y(ee,`${(t.mode===`breakdown`?t.reports?.dailyStatus||`UNAVAILABLE`:t.reports?.planStatus||`UNAVAILABLE`)??``} // UTC`)}),gi(b,()=>G(n),e=>L(n,e)),K(`click`,x,()=>L(r,G(s)+1)),K(`click`,S,()=>L(r,G(s)-1)),J(e,_),Ge()}Cr([`click`]);var Ic=864e5;function Lc(e,t){let n=new Date(e);n.setUTCDate(1),n.setUTCMonth(n.getUTCMonth()+t);let r=new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+1,0)).getUTCDate();return n.setUTCDate(Math.min(e.getUTCDate(),r)),n}function Rc(e,t,n){let r=new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()));for(let e=0;;e++){let i=Lc(r,-t),a=new Date(i.getTime()+Ic);if(e===n)return{start:a,end:r};r=i}}var zc=q(``),Bc=q(``,1),Vc=q(`

          History refresh failed. Any displayed history is the last successful + observation.

          `),Hc=q(`

          Token history unavailable; other reports may still be available.

          `),Uc=q(``),Wc=q(`
          `),Gc=q(`

          LESS ░ ▒ ▓ █ MORE // HOVER FOR DATE AND TOKENS

          `,1),Kc=q(`
          `,1),qc=q(` `),Jc=q(`

          LIFETIME TOKENS

          PEAK DAY

          CURRENT STREAK

          DAYS

          LONGEST TURN

          SECONDS

          LONGEST STREAK

          DAYS

          OPENAI // UTC

          Accessible data table
          Date (UTC)Tokens

          `,1),Yc=q(`

          History unavailable or awaiting a matching account observation. Missing + history is not treated as zero usage.

          `),Xc=q(`

          USAGE // ACCOUNT HISTORY

          Account-wide history reported by Codex, not the local Sessions counter. Dates + use UTC. Allowance history is approximate where indicated; reset causes are + not provided.

          `,1);function Zc(e,t){We(t,!0);let n=I(`daily`),r=I(12),i=I(0),a=P(()=>{let e=$.data?.usage?.dailyUsageBuckets;if(!e)return[];let{start:t,end:n}=Rc(new Date,G(r),G(i)),a=new Map;for(let t of e)!Number.isFinite(t.tokens)||t.tokens<0||a.set(t.startDate,(a.get(t.startDate)||0)+t.tokens);let o=[];for(let e=t;e<=n;e=new Date(e.getTime()+864e5)){let t=e.toISOString().slice(0,10);o.push({date:t,tokens:a.get(t)||0})}return o}),o=P(()=>Math.max(1,...G(a).map(e=>e.tokens))),s=P(()=>G(a).length?new Date(G(a)[0].date+`T00:00:00Z`).getUTCDay():0),c=P(()=>{if(G(n)===`monthly`){let e=new Map;for(let t of G(a))e.set(t.date.slice(0,7),(e.get(t.date.slice(0,7))||0)+t.tokens);return[...e].map(([e,t])=>({date:e,tokens:t}))}let e=0;return G(a).map(t=>({date:t.date,tokens:e+=t.tokens}))});var l=Xc(),u=V(z(l),4);Z(u,20,()=>[[`daily`,`Daily`],[`monthly`,`Monthly`],[`cumulative`,`Cumulative`],[`breakdown`,`Breakdown`],[`periods`,`Windows`]],qr,(e,t)=>{var r=P(()=>_(t,2));let a=()=>G(r)[0],o=()=>G(r)[1];var s=zc();let c;var l=B(s,!0);H(()=>{Q(s,`aria-pressed`,G(n)===a()),c=li(s,1,``,null,c,{active:G(n)===a()}),Y(l,o())}),K(`click`,s,()=>{L(n,a(),!0),L(i,0)}),J(e,s)}),N(u);var d=V(u,2),f=R(d),p=e=>{var t=Bc(),n=z(t),a=V(R(n)),o=R(a);o.value=o.__value=6;var s=V(o);s.value=s.__value=12,N(a),hi(a),N(n);var c=V(n),l=V(c);H(()=>l.disabled=G(i)===0),K(`change`,a,()=>L(i,0)),gi(a,()=>G(r),e=>L(r,e)),K(`click`,c,()=>qt(i)),K(`click`,l,()=>qt(i,-1)),J(e,t)};X(f,e=>{G(n)!==`breakdown`&&G(n)!==`periods`&&e(p)}),N(d);var m=V(d,2),h=e=>{J(e,Vc())};X(m,e=>{$.data?.usageError&&e(h)});var g=V(m,2),v=e=>{J(e,Hc())};X(g,e=>{$.data?.usage?.tokenStatus===`UNAVAILABLE`&&G(n)!==`breakdown`&&G(n)!==`periods`&&e(v)});var y=V(g,2),b=e=>{var t=Pr();Kr(z(t),()=>G(n),e=>{{let t=P(()=>$.data?.usage?.reports);Fc(e,{get reports(){return G(t)},get mode(){return G(n)}})}}),J(e,t)},x=e=>{var t=Jc(),r=z(t),i=R(r),l=B(V(R(i),2),!0);N(i);var u=V(i,2),d=B(V(R(u),2),!0);N(u);var f=V(u,2),p=V(R(f),2),m=R(p);Se(),N(p),N(f);var h=V(f,2),g=V(R(h),2),_=R(g);Se(),N(g),N(h);var v=V(h,2),y=V(R(v),2),b=R(y);Se(),N(y),N(v),N(r);var x=V(r,4),S=R(x),C=B(S),w=V(S,2),T=e=>{var t=Gc(),n=z(t),r=R(n),i=R(r);Z(i,17,()=>Array(G(s)),qr,(e,t)=>{J(e,Uc())}),Z(V(i,2),17,()=>G(a),qr,(e,t)=>{var n=Wc();let r,i;H(e=>{r=li(n,1,`heat-cell`,null,r,{zero:G(t).tokens===0}),Q(n,`title`,e),i=di(n,``,i,{opacity:G(t).tokens?.25+.75*G(t).tokens/G(o):1})},[()=>`${G(t).date}: ${ma(G(t).tokens)} tokens`]),J(e,n)}),N(r),N(n),Se(2),J(e,t)},E=e=>{var t=Kc(),r=z(t);{let e=P(()=>G(c).map(e=>e.tokens)),t=P(()=>G(n)+` usage`);ao(r,{get values(){return G(e)},get label(){return G(t)}})}var i=V(r,2),a=R(i),o=B(a,!0),s=B(V(a),!0);N(i),H(e=>{Y(o,G(c)[0]?.date),Y(s,e)},[()=>G(c).at(-1)?.date]),J(e,t)};X(w,e=>{G(n)===`daily`?e(T):e(E,-1)});var D=V(w,2),ee=V(R(D),2),te=R(ee),O=V(R(te));Z(O,21,()=>G(n)===`daily`?G(a):G(c),qr,(e,t)=>{var n=qc(),r=R(n),i=B(r,!0),a=B(V(r),!0);N(n),H(e=>{Y(i,G(t).date),Y(a,e)},[()=>ma(G(t).tokens)]),J(e,n)}),N(O),N(te),N(ee),N(D),N(x);var ne=B(V(x,2));H((e,t,n,r,i,o,s)=>{Y(l,e),Y(d,t),Y(m,`${n??``} `),Y(_,`${r??``} `),Y(b,`${i??``} `),Y(C,`${G(a)[0]?.date??``} — ${o??``}`),Y(ne,`OBSERVED ${s??``} // CUMULATIVE IS FOR THE SELECTED PERIOD`)},[()=>ma($.data.usage.summary.lifetimeTokens),()=>ma($.data.usage.summary.peakDailyTokens),()=>ma($.data.usage.summary.currentStreakDays),()=>ma($.data.usage.summary.longestRunningTurnSec),()=>ma($.data.usage.summary.longestStreakDays),()=>G(a).at(-1)?.date,()=>ha($.data.usageAt)]),J(e,t)},S=e=>{J(e,Yc())};X(y,e=>{G(n)===`breakdown`||G(n)===`periods`?e(b):$.data?.usage&&$.data.usage.dailyUsageBuckets!==null?e(x,1):e(S,-1)}),J(e,l),Ge()}Cr([`click`,`change`]);var Qc=q(`

          Page not found

          Return to Quota

          `,1);function $c(e){var t=Qc();Se(2),J(e,t)}var el=`CODEXOMETER`,tl=[`█▀▀ █▀█ █▀▄ █▀▀ ▀▄▀ █▀█ █▀▄▀█ █▀▀ ▀█▀ █▀▀ █▀█`,`█▄▄ █▄█ █▄▀ ██▄ █ █ █▄█ █ ▀ █ ██▄ █ ██▄ █▀▄`].flatMap(e=>[[...e].map(e=>e===`█`||e===`▀`),[...e].map(e=>e===`█`||e===`▄`)]),nl=tl[0].length,rl=tl.length,il=0,al=[...el].map(e=>{let t=e===`M`?5:3,n={start:il,width:t};return il+=t+1,n}),ol=`ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`,sl=`010 101 111 101.110 111 101 110.111 100 100 111.110 101 101 110.111 100 110 111.111 100 110 100.111 100 101 111.101 101 111 101.111 010 010 111.001 001 101 111.101 110 110 101.100 100 100 111.101 111 101 101.101 111 111 101.111 101 101 111.111 101 111 100.111 101 111 001.111 101 110 101.111 100 001 111.111 010 010 010.101 101 101 111.101 101 101 010.101 101 111 101.101 010 010 101.101 101 010 010.111 001 100 111.111 101 101 111.110 010 010 111.111 001 110 111.111 011 001 111.101 101 111 001.111 110 001 111.100 111 101 111.111 001 010 010.111 111 101 111.111 101 111 001`.split(`.`).map(e=>e.split(` `));function cl(e=el,t=-1,n=!1){let r=``;for(let i=0;i{e|=0,e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}function fl(){let e=ll[Math.floor(Math.random()*ll.length)],t=Math.floor(Math.random()*4294967296),n=dl(t),r=[...el].map((e,t)=>t);for(let e=r.length-1;e>0;e--){let t=Math.floor(n()*(e+1));[r[e],r[t]]=[r[t],r[e]]}return{variant:e,seed:t,order:r}}function pl(e,t){if(e.variant===`typing`){let e=t<1080,n=e?0:Math.min(Math.floor((t-1080)/90)+1,11);return{text:el.slice(0,n).padEnd(11),cursor:n,dot:e?Math.floor(t/180)%2==0:n<11}}if(e.variant===`shuffle`){let n=dl(e.seed^Math.floor(t/70)),r=[...el].map(e=>{let t;do t=ol[Math.floor(n()*36)];while(t===e);return t}),i=Math.min(Math.floor(t/110),11);for(let t of e.order.slice(0,i))r[t]=el[t];return{text:r.join(``),cursor:-1,dot:!1}}return{text:el,cursor:-1,dot:!1}}var ml=Mr(``);function hl(e,t){We(t,!0);let n=Gi(t,`text`,3,el),r=Gi(t,`cursor`,19,()=>-1),i=Gi(t,`dot`,3,!1),a=P(()=>cl(n(),r(),i()));var o=ml(),s=B(o);H(()=>{Q(o,`viewBox`,`0 0 ${nl} ${rl}`),Q(o,`width`,nl),Q(o,`height`,rl),Q(s,`d`,G(a))}),J(e,o),Ge()}var gl=q(`
          `),_l=q(`
          `);function vl(e,t){We(t,!0);let n=I(void 0),r=I(0),i=I(Xt({width:0,height:0,pixelRatio:1})),a=I(Xt({x:0,y:0,width:0})),o=P(()=>G(n)?pl(G(n),G(r)):void 0),s=P(()=>{if(!G(n))return{x:0,y:0,width:0};let e=ul[G(n).variant],t=Math.min(Math.max((G(r)-e-180)/800,0),1),o=t*t*(3-2*t),s=G(i).width+(G(a).width-G(i).width)*o,c=Math.max((G(i).height-G(i).width*rl/nl)/2,0),l=(G(n).variant===`slide`&&G(r)Math.round(e*G(i).pixelRatio)/G(i).pixelRatio;return{x:d(l),y:d(u),width:d(s)}});Ki(()=>{let e=matchMedia(`(prefers-reduced-motion: reduce)`);if(e.matches){t.onfinish();return}L(n,fl(),!0);let o=ul[G(n).variant]+180+800,s=0,c=!1,l=performance.now(),u=()=>{let e=t.target?.getBoundingClientRect();L(i,{width:window.innerWidth,height:window.innerHeight,pixelRatio:window.devicePixelRatio||1},!0),e&&L(a,{x:e.x,y:e.y,width:e.width},!0)},d=()=>{c||(c=!0,cancelAnimationFrame(s),t.onfinish())},f=e=>{e instanceof PointerEvent&&e.button!==0||e instanceof KeyboardEvent&&(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)||e instanceof KeyboardEvent&&[`Shift`,`Control`,`Alt`,`Meta`].includes(e.key)||(e.preventDefault(),e.stopImmediatePropagation(),d())},p=()=>{e.matches&&d()},m=e=>{L(r,Math.max(e-l,0),!0),G(r)>=o?d():s=requestAnimationFrame(m)},h=new ResizeObserver(u);if(t.target){h.observe(t.target),t.target.parentElement&&h.observe(t.target.parentElement);let e=t.target.closest(`header`);e&&h.observe(e)}return u(),window.addEventListener(`resize`,u),document.addEventListener(`keydown`,f,!0),document.addEventListener(`pointerdown`,f,!0),e.addEventListener(`change`,p),s=requestAnimationFrame(m),()=>{c=!0,cancelAnimationFrame(s),h.disconnect(),window.removeEventListener(`resize`,u),document.removeEventListener(`keydown`,f,!0),document.removeEventListener(`pointerdown`,f,!0),e.removeEventListener(`change`,p)}});var c=_l(),l=R(c),u=e=>{var t=gl();let n;hl(R(t),{get text(){return G(o).text},get cursor(){return G(o).cursor},get dot(){return G(o).dot}}),N(t),H(()=>{Q(t,`data-text`,G(o).text),Q(t,`data-cursor`,G(o).dot?G(o).cursor:void 0),n=di(t,``,n,{left:`${G(s).x}px`,top:`${G(s).y}px`,width:`${G(s).width}px`})}),J(e,t)};X(l,e=>{G(o)&&e(u)});var d=V(l,2);N(c),H(()=>Q(c,`data-entrance`,G(n)?.variant)),K(`click`,d,function(...e){t.onfinish?.apply(this,e)}),J(e,c),Ge()}Cr([`click`]);var yl=q(` `),bl=q(`

          `),xl=q(`

          Connecting to your local Codexometer…

          `),Sl=q(``),Cl=q(`

          Your quota. Your sessions. Your command centre.

          `);function wl(e,t){We(t,!0);let n={"/":no,"/quota/:view?":no,"/sessions/:id?":xc,"/usage":Zc,"*":$c},r={quota:/^(?:\/|\/quota(?:\/[^/]+)?\/?)$/,sessions:/^\/sessions(?:\/[^/]+)?\/?$/,usage:/^\/usage\/?$/},i=I(`hacker`),a=I(!0),o=I(void 0);yn(()=>{ca.requests&&ur().then(()=>{G(o)?.focus(),G(o)?.scrollIntoView({block:`nearest`})})});let s=I(void 0),c=[`hacker`,`rust`,`blue-steel`,`ultraviolet`,`nightshade`];yn(()=>{la()}),yn(()=>{if($.data)for(let[e,t]of Object.entries(r))t.test(Xi.location)&&(oa.tab=e)}),Ki(()=>{try{let e=localStorage.getItem(`codexometer.web.theme`);e&&c.includes(e)&&L(i,e,!0)}catch{}return ba()});function l(){try{localStorage.setItem(`codexometer.web.theme`,G(i))}catch{}}var u=Cl(),d=R(u),f=R(d),p=R(f);hl(R(p),{}),N(p),Li(p,e=>L(s,e),()=>G(s)),Se(2),N(f);var m=V(f,2),h=R(m);let g;var v=V(h,1,!0),y=B(V(v));N(m),N(d);var b=V(d,2);Z(b,21,()=>Object.entries(r),qr,(e,t)=>{var n=P(()=>_(G(t),2));let r=()=>G(n)[0],i=()=>G(n)[1],a=P(()=>i().test(Xi.location));var o=yl();let s;var c=B(o,!0);H(e=>{Q(o,`href`,r()===`quota`?`#/quota/`+oa.view:`#/`+r()),Q(o,`aria-current`,G(a)?`page`:void 0),s=li(o,1,``,null,s,{active:G(a)}),Y(c,e)},[()=>r().toUpperCase()]),J(e,o)}),N(b);var x=V(b,2),S=R(x),C=e=>{var t=bl(),n=B(t,!0);H(()=>Y(n,$.error)),J(e,t)};X(S,e=>{$.error&&e(C)});var w=V(S,2),T=e=>{ea(e,{get routes(){return n}})},E=e=>{J(e,xl())};X(w,e=>{$.data?e(T):$.error||e(E,1)}),N(x);var D=V(x,2),ee=R(D),te=B(ee),O=V(ee,2),ne=B(O,!0),re=V(O,2),ie=V(R(re));Z(ie,21,()=>c,qr,(e,t)=>{var n=Sl(),r=B(n,!0),i={};H(e=>{Y(r,e),i!==(i=G(t))&&(n.value=(n.__value=i)??``)},[()=>G(t).replace(`-`,` `).toUpperCase()]),J(e,n)}),N(ie),Li(ie,e=>L(o,e),()=>G(o)),hi(ie),N(re),N(D);var ae=V(D,2),oe=e=>{vl(e,{get target(){return G(s)},onfinish:()=>L(a,!1)})};X(ae,e=>{G(a)&&e(oe)}),N(u),H(()=>{Q(u,`data-theme`,G(i)),Q(u,`data-starting`,G(a)),d.inert=G(a),g=li(h,1,`lamp`,null,g,{lit:$.connected}),Y(v,$.connected?`CONNECTED`:`OFFLINE`),Y(y,`EXPERIMENTAL // ${$.data?.control?`SESSION CONTROL`:`READ ONLY`}`),b.inert=G(a),x.inert=G(a),D.inert=G(a),Y(te,`v${($.data?.version||`…`)??``} // LOCAL ONLY`),Y(ne,$.data?.control?`Session control enabled. Stop the server to revoke access.`:`No actions can be sent from this preview.`)}),K(`change`,ie,l),gi(ie,()=>G(i),e=>L(i,e)),J(e,u),Ge()}Cr([`change`]),Br(wl,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/internal/web/dist/index.html b/internal/web/dist/index.html index 68684b60..b7b988b7 100644 --- a/internal/web/dist/index.html +++ b/internal/web/dist/index.html @@ -5,8 +5,8 @@ Codexometer // Experimental web - - + +
          diff --git a/internal/web/server.go b/internal/web/server.go index 606de933..368bc980 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -137,7 +137,7 @@ func (s *server) handler() http.Handler { }))) mux.Handle("GET /api/events", s.authorize(http.HandlerFunc(s.events))) if s.control != nil { - for _, action := range []string{"offer", "prepare", "commit", "schedules", "commands"} { + for _, action := range []string{"offer", "prepare", "commit", "schedules", "commands", "read"} { mux.Handle("POST /api/control/"+action, s.authorize(http.HandlerFunc(s.control.handle(action, "http://"+s.host)))) } } diff --git a/internal/web/state.go b/internal/web/state.go index cf38c64c..24dbfe99 100644 --- a/internal/web/state.go +++ b/internal/web/state.go @@ -23,6 +23,10 @@ type Source interface { // Deliberately project source types: never serialize approval/input capabilities, // account fingerprints, arbitrary errors, or authentication objects to browsers. type session struct { + ReadStateKnown bool `json:"readStateKnown,omitempty"` + Unread bool `json:"unread,omitempty"` + ReadRevision string `json:"readRevision,omitempty"` + ReplyTurn string `json:"replyTurn,omitempty"` RequiredHumanApproval bool `json:"requiredHumanApproval,omitempty"` Goal *goal `json:"goal,omitempty"` StatusLine map[string]string `json:"statusLine"` @@ -335,6 +339,7 @@ func (s *store) live(l codex.LiveUsageSnapshot, err error, now time.Time) { } } s.state.Sessions = append(s.state.Sessions, session{ + ReadStateKnown: row.ReadState.Known(), Unread: row.ReadState.Unread, ReadRevision: row.ReadState.Revision, ReplyTurn: sessionReplyTurn(row), Goal: projectGoal(row.Goal), ID: row.ID, Name: codex.SanitizeSessionContext(row.Name), Directory: row.WorkingDirectory, Tokens: row.TotalTokens, Agents: row.AgentCount, StatusLine: statusline.Values(statusline.Data{Model: row.ModelSettings.Model, Effort: row.ModelSettings.ReasoningEffort, Speed: row.ModelSettings.ServiceTier, Directory: row.WorkingDirectory, Name: row.Name, ID: row.ID, State: sessionStatus(row), Source: row.Context.Source, Tokens: row.TotalTokens, Agents: row.AgentCount}), @@ -417,3 +422,11 @@ func (s *store) collect(ctx context.Context, source Source, refresh time.Duratio poll(5*time.Minute, func(ctx context.Context) { h, e := source.FetchAccountUsage(ctx); s.usage(h, e, time.Now()) }) return wg.Wait } + +func sessionReplyTurn(row codex.LiveUsageSession) string { + c := row.Context + if c.Kind == codex.SessionContextReply && !c.Streaming && c.ThreadID == row.ID && c.Text != "" { + return c.TurnID + } + return "" +} diff --git a/web/src/Sessions.svelte b/web/src/Sessions.svelte index 424a6220..aae7b6bd 100644 --- a/web/src/Sessions.svelte +++ b/web/src/Sessions.svelte @@ -1,7 +1,13 @@ + diff --git a/web/src/Sessions.svelte b/web/src/Sessions.svelte index aae7b6bd..2c2f9539 100644 --- a/web/src/Sessions.svelte +++ b/web/src/Sessions.svelte @@ -147,19 +147,30 @@ try { await tick(); const current = sessions.find((s) => s.id === id); + const scrollport = document.getElementById('content'); + const clip = scrollport?.getBoundingClientRect(); + const left = clip ? clip.left + scrollport!.clientLeft : 0; + const top = clip ? clip.top + scrollport!.clientTop : 0; + const right = left + (scrollport?.clientWidth || 0); + const bottom = top + (scrollport?.clientHeight || 0); const visible = Array.from( document.querySelectorAll('[data-result-session]'), - ).some( - (node) => + ).some((node) => { + const rect = node.getBoundingClientRect(); + return ( + scrollport?.contains(node) && node.dataset.resultSession === id && node.dataset.resultTurn === turn && !node.closest('[inert], [hidden]') && document.visibilityState === 'visible' && - node.getBoundingClientRect().top < window.innerHeight && - node.getBoundingClientRect().bottom > 0 && - node.getBoundingClientRect().width > 0 && - node.getBoundingClientRect().height > 0, - ); + rect.left < Math.min(window.innerWidth, right) && + rect.right > Math.max(0, left) && + rect.top < Math.min(window.innerHeight, bottom) && + rect.bottom > Math.max(0, top) && + rect.width > 0 && + rect.height > 0 + ); + }); if ( !visible || current?.readRevision !== revision || diff --git a/web/tests/browser.spec.ts b/web/tests/browser.spec.ts index 411ccab7..e83e8973 100644 --- a/web/tests/browser.spec.ts +++ b/web/tests/browser.spec.ts @@ -5295,3 +5295,69 @@ test('managed human approval explains the policy and offers only one-time choice page.getByRole('radio', { name: 'APPROVE ONCE', exact: true }), ).toBeVisible(); }); + +test('clipped partial results stay unread until visible inside the content scrollport', async ({ + page, + pairingURL, +}) => { + const { snapshot } = await mockActions(page, 'prompt'); + const reads: unknown[] = []; + await page.route('**/api/control/read', (route) => { + reads.push(route.request().postDataJSON()); + return route.fulfill({ json: { read: true } }); + }); + await page.goto(pairingURL); + await page.getByRole('link', { name: 'SESSIONS', exact: true }).click(); + const row = page.locator('.session-row').first(); + await row.getByRole('button', { name: 'SHOW DETAIL', exact: true }).click(); + const result = row.locator('[data-result-session]'); + await expect(result).toBeVisible(); + // Place the result behind the footer: inside the browser viewport, but + // outside the application's clipped scrolling pane. + await result.evaluate((node) => { + const main = document.getElementById('content')!; + const offset = + main.getBoundingClientRect().bottom + + 1 - + node.getBoundingClientRect().top; + node.style.transform = `translateY(${offset}px)`; + }); + const unread = { + ...snapshot, + sessions: [ + { + ...snapshot.sessions[0], + readStateKnown: true, + unread: true, + readRevision: 'clip-v1', + replyTurn: 'clip-t1', + }, + ], + }; + await page.evaluate( + (detail) => + window.dispatchEvent(new CustomEvent('test-snapshot', { detail })), + unread, + ); + await expect(row).toContainText('TURN COMPLETE'); + const bounds = await result.evaluate((node) => ({ + top: node.getBoundingClientRect().top, + clip: document.getElementById('content')!.getBoundingClientRect().bottom, + viewport: window.innerHeight, + })); + expect(bounds.top).toBeGreaterThanOrEqual(bounds.clip); + expect(bounds.top).toBeLessThan(bounds.viewport); + await result.dispatchEvent('wheel', { deltaY: 100 }); + await page.waitForTimeout(150); + expect(reads).toHaveLength(0); + // A fresh expansion gesture must also respect the scrollport boundary. + await row.getByRole('button', { name: 'More detail', exact: true }).click(); + await page.waitForTimeout(150); + expect(reads).toHaveLength(0); + await result.evaluate((node) => { + node.style.transform = ''; + }); + await result.scrollIntoViewIfNeeded(); + await result.dispatchEvent('wheel', { deltaY: 100 }); + await expect.poll(() => reads.length).toBe(1); +}); From f610dc33f98499ce8410145c749c9133b341c019 Mon Sep 17 00:00:00 2001 From: merefield Date: Sat, 7 Nov 2026 11:24:32 +0000 Subject: [PATCH 09/10] Keep restored browser detail unread until deliberate review --- .../{index-qTKsT0IC.js => index-DmCO8RLB.js} | 2 +- internal/web/dist/index.html | 2 +- web/src/Sessions.svelte | 3 +- web/tests/browser.spec.ts | 130 +++++++++++++----- 4 files changed, 97 insertions(+), 40 deletions(-) rename internal/web/dist/assets/{index-qTKsT0IC.js => index-DmCO8RLB.js} (97%) diff --git a/internal/web/dist/assets/index-qTKsT0IC.js b/internal/web/dist/assets/index-DmCO8RLB.js similarity index 97% rename from internal/web/dist/assets/index-qTKsT0IC.js rename to internal/web/dist/assets/index-DmCO8RLB.js index be90f16c..8fe89a38 100644 --- a/internal/web/dist/assets/index-qTKsT0IC.js +++ b/internal/web/dist/assets/index-DmCO8RLB.js @@ -33,7 +33,7 @@ stale.

          `),Qs=q(`

          Some quota profile checks are unavailable. Only sessions with freshly verified quota and settings can be updated; previous outcome notices remain visible.

          `),$s=q(` `),ec=q(` `),tc=q(` `),nc=q(``),rc=q(`

          Read only — reply or approve in Codex.

          `),ic=q(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),ac=q(`
          `),oc=q(` `,1),sc=q(`
          `),cc=q(`

          This session is no longer in the current observation. Return to sessions.

          `),lc=q(`

          `),uc=q(``),dc=q(`

          `),fc=q(` `),pc=q(`

          `),mc=q(`QUOTA THRESHOLD // REVIEW PROFILE ↗`),hc=q(`

          `),gc=q(`

          TOKEN ACTIVITY // 30 SECOND SAMPLES

          `),_c=q(`

          TOKENS

          FULL DETAIL →
          `),vc=q(`

          No locally observed sessions yet. Keep Codex running alongside - Codexometer.

          `),yc=q(`

          ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

          `,1),bc=q(`

          SESSION TOTALS

          `,1);function xc(e,t){We(t,!0);let n=(e,t=f,n,r)=>{let i=mt(()=>g(n?.(),!0)),a=mt(()=>g(r?.(),!1));var o=Js(),s=z(o),c=e=>{var n=Ls(),r=z(n),i=B(r,!0),a=B(V(r,2),!0);H(()=>{Y(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),Y(a,t().currentTask)}),J(e,n)};X(s,e=>{t().currentTask&&e(c)});var l=V(s,2),u=e=>{var n=Rs(),r=B(V(z(n),2),!0);H(()=>Y(r,t().latestGuidance)),J(e,n)};X(l,e=>{t().latestGuidance&&e(u)});var d=V(l,2),p=e=>{var n=zs(),r=B(V(z(n),2),!0);Se(2),H(()=>Y(r,t().approvalContext)),J(e,n)};X(d,e=>{G(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=V(d,2),h=e=>{var n=Bs();let r;var i=B(n,!0);H(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),Y(i,e)},[()=>ie(t())]),J(e,n)},_=P(()=>ie(t())&&(!G(a)||G(v)||t().status===`CHECK SESSION`||y(t())));X(m,e=>{G(_)&&e(h)});var b=V(m,2),x=e=>{var n=Vs(),r=B(n,!0);H(e=>Y(r,e),[()=>ae(t())]),J(e,n)};X(b,e=>{G(i)&&e(x)});var S=V(b,2),C=e=>{var n=Hs(),r=B(n,!0);H(()=>Y(r,t().text||`No session context available.`)),J(e,n)};X(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=V(S,2),T=e=>{var n=Us(),r=V(z(n),2),i=R(r),a=V(i),o=e=>{var n=Nr();H(()=>Y(n,`// ${t().commandTiming??``}`)),J(e,n)};X(a,e=>{t().commandTiming&&e(o)});var s=V(a,2),c=e=>{var n=Nr();H(()=>Y(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),J(e,n)};X(s,e=>{!G(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=V(s,2),u=e=>{J(e,Nr(`+`))};X(l,e=>{t().runningLimited&&e(u)}),N(r);var d=B(V(r,2),!0);H(e=>{Y(i,`COMMAND // ${e??``} `),Y(d,t().workingCommand)},[()=>G(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),J(e,n)};X(w,e=>{t().workingCommand&&e(T)});var E=V(w,2),D=e=>{Uo(e,{get lines(){return t().fileChanges}})},ee=e=>{var n=Ks(),r=V(z(n),2),i=B(r,!0),a=V(r,2),o=e=>{var n=Ws(),r=B(n,!0);H(()=>Y(r,t().command)),J(e,n)},s=e=>{J(e,Gs())};X(a,e=>{t().command?e(o):e(s,-1)}),H(()=>Y(i,G(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),J(e,n)};X(E,e=>{(!G(a)||!$.data?.control)&&t().fileChanges?.length?e(D):G(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(ee,1)});var te=V(E,2),O=e=>{var n=qs(),r=B(n);H(()=>Y(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),J(e,n)};X(te,e=>{G(a)||e(O)}),J(e,o)},r=I(void 0),i=Gi(t,`params`,19,()=>({})),a=P(()=>$.data?.sessions||[]),o=P(()=>$.data?.control&&$.data.profiles||[]),s=P(()=>($.data?.triggers||[]).filter(e=>G(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&G(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=I(!1);function d(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}yn(()=>{let e=i().id;e&&pr(()=>{oa.selected=e,pa(e,2)})});let p=P(()=>G(a).find(e=>e.id===i().id)),m=P(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&G(o).some(e=>e.session===i().id&&e.pending)),h=P(()=>G(a).some(e=>e.id===oa.selected)?oa.selected:G(a)[0]?.id),v=P(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=P(()=>[[`OBSERVED TOKENS`,ma(G(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(G(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,G(v)?`—`:ma(G(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=P(()=>G(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=P(()=>G(a).filter(e=>e.status===`TURN COMPLETE`&&(!e.readStateKnown||e.unread)&&!G(s).some(t=>t.session===e.id)&&!G(o).some(t=>t.session===e.id&&t.pending))),w=I(``),T=new Set;async function E(e){if(!$.data?.control||G(v)||!e.unread||!e.readRevision||!e.replyTurn||e.streaming||G(m))return;let t=e.id,n=e.readRevision,r=e.replyTurn,i=JSON.stringify([t,n,r]);if(!T.has(i)){T.add(i);try{await ur();let e=G(a).find(e=>e.id===t),i=document.getElementById(`content`),o=i?.getBoundingClientRect(),s=o?o.left+i.clientLeft:0,c=o?o.top+i.clientTop:0,l=s+(i?.clientWidth||0),u=c+(i?.clientHeight||0);if(!Array.from(document.querySelectorAll(`[data-result-session]`)).some(e=>{let n=e.getBoundingClientRect();return i?.contains(e)&&e.dataset.resultSession===t&&e.dataset.resultTurn===r&&!e.closest(`[inert], [hidden]`)&&document.visibilityState===`visible`&&n.leftMath.max(0,s)&&n.topMath.max(0,c)&&n.width>0&&n.height>0})||e?.readRevision!==n||e?.replyTurn!==r||G(v))return;await ya(`read`,{session:t,read:{turn:r,revision:n}}),L(w,``)}catch{L(w,`Result changed or could not be marked read. Open it again to retry.`)}finally{T.delete(i)}}}function D(e){O(e);let t=G(a).find(t=>t.id===e);t&&E(t)}let ee=I(``),te=I(``);yn(()=>{let e=i().id||``;e!==G(ee)&&(L(ee,e,!0),L(te,e,!0))}),yn(()=>{if(G(te)&&G(p)?.id===G(te)){let e=G(p);L(te,``),pr(()=>{E(e)})}});function O(e){oa.selected=e,ur().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function ne(e,t){if(O(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;if(n>2)location.hash=`/sessions/`+encodeURIComponent(e);else if(pa(e,n),t>0){let t=G(a).find(t=>t.id===e);t&&E(t)}}function re(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),ne(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||G(h)))e.preventDefault(),ne(i().id||G(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&G(a).length){e.preventDefault();let t=G(a).findIndex(e=>e.id===G(h));O(G(a)[Math.max(0,Math.min(G(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function ie(e){return G(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ae(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var oe=bc();Sr(`keydown`,$t,re);var se=z(oe),ce=e=>{var t=Ys(),n=B(t,!0);H(()=>Y(n,G(w))),J(e,t)};X(se,e=>{G(w)&&e(ce)});var k=V(se,2),le=B(V(R(k),2));N(k);var ue=V(k,2);let de;Z(ue,21,()=>G(b),qr,(e,t)=>{var n=P(()=>_(G(t),2));let r=()=>G(n)[0],i=()=>G(n)[1];var a=Xs();let o;var s=R(a),c=B(s,!0),l=B(V(s,2),!0);N(a),H(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),Y(c,r()),Y(l,i())}),J(e,a)}),N(ue);var fe=V(ue,2),pe=B(fe),A=V(fe,2),me=e=>{J(e,Zs())};X(A,e=>{G(v)&&e(me)});var he=V(A,2),ge=e=>{J(e,Qs())};X(he,e=>{$.data?.profileError&&e(ge)});var _e=V(he,2),ve=e=>{var t=nc(),n=R(t);Z(n,17,()=>G(x),qr,(e,t)=>{var n=$s();let r;var i=B(n);H((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),Y(i,`${G(t).status??``} + Codexometer.

          `),yc=q(`

          ↑ ↓ SELECT SESSION // ← LESS DETAIL // → MORE DETAIL // ESC BACK

          `,1),bc=q(`

          SESSION TOTALS

          `,1);function xc(e,t){We(t,!0);let n=(e,t=f,n,r)=>{let i=mt(()=>g(n?.(),!0)),a=mt(()=>g(r?.(),!1));var o=Js(),s=z(o),c=e=>{var n=Ls(),r=z(n),i=B(r,!0),a=B(V(r,2),!0);H(()=>{Y(i,t().contextKind===`LAST REPLY`&&!t().streaming?`TASK`:`CURRENT TASK`),Y(a,t().currentTask)}),J(e,n)};X(s,e=>{t().currentTask&&e(c)});var l=V(s,2),u=e=>{var n=Rs(),r=B(V(z(n),2),!0);H(()=>Y(r,t().latestGuidance)),J(e,n)};X(l,e=>{t().latestGuidance&&e(u)});var d=V(l,2),p=e=>{var n=zs(),r=B(V(z(n),2),!0);Se(2),H(()=>Y(r,t().approvalContext)),J(e,n)};X(d,e=>{G(a)&&t().contextKind===`APPROVAL REQUEST`&&t().approvalContext&&e(p)});var m=V(d,2),h=e=>{var n=Bs();let r;var i=B(n,!0);H(e=>{r=li(n,1,`attention-note`,null,r,{inferred:t().status===`CHECK SESSION`}),Y(i,e)},[()=>ie(t())]),J(e,n)},_=P(()=>ie(t())&&(!G(a)||G(v)||t().status===`CHECK SESSION`||y(t())));X(m,e=>{G(_)&&e(h)});var b=V(m,2),x=e=>{var n=Vs(),r=B(n,!0);H(e=>Y(r,e),[()=>ae(t())]),J(e,n)};X(b,e=>{G(i)&&e(x)});var S=V(b,2),C=e=>{var n=Hs(),r=B(n,!0);H(()=>Y(r,t().text||`No session context available.`)),J(e,n)};X(S,e=>{(t().text||!t().workingCommand)&&e(C)});var w=V(S,2),T=e=>{var n=Us(),r=V(z(n),2),i=R(r),a=V(i),o=e=>{var n=Nr();H(()=>Y(n,`// ${t().commandTiming??``}`)),J(e,n)};X(a,e=>{t().commandTiming&&e(o)});var s=V(a,2),c=e=>{var n=Nr();H(()=>Y(n,`// +${(t().runningCommands||0)-+(t().commandStatus===`running`)} RUNNING`)),J(e,n)};X(s,e=>{!G(v)&&(t().runningCommands||0)>+(t().commandStatus===`running`)&&e(c)});var l=V(s,2),u=e=>{J(e,Nr(`+`))};X(l,e=>{t().runningLimited&&e(u)}),N(r);var d=B(V(r,2),!0);H(e=>{Y(i,`COMMAND // ${e??``} `),Y(d,t().workingCommand)},[()=>G(v)?`UNKNOWN`:(t().commandStatus||`unknown`).toUpperCase()]),J(e,n)};X(w,e=>{t().workingCommand&&e(T)});var E=V(w,2),D=e=>{Uo(e,{get lines(){return t().fileChanges}})},ee=e=>{var n=Ks(),r=V(z(n),2),i=B(r,!0),a=V(r,2),o=e=>{var n=Ws(),r=B(n,!0);H(()=>Y(r,t().command)),J(e,n)},s=e=>{J(e,Gs())};X(a,e=>{t().command?e(o):e(s,-1)}),H(()=>Y(i,G(v)||t().status!==`APPROVAL NEEDED`?`LAST OBSERVED COMMAND`:$.data?.control?`COMMAND REQUEST`:`COMMAND TO APPROVE IN CODEX`)),J(e,n)};X(E,e=>{(!G(a)||!$.data?.control)&&t().fileChanges?.length?e(D):G(a)&&$.data?.control||!t().command&&t().status!==`APPROVAL NEEDED`||e(ee,1)});var te=V(E,2),O=e=>{var n=qs(),r=B(n);H(()=>Y(r,`CONTEXT SOURCE // ${(t().source||`LOCAL`)??``} // OBSERVATION`)),J(e,n)};X(te,e=>{G(a)||e(O)}),J(e,o)},r=I(void 0),i=Gi(t,`params`,19,()=>({})),a=P(()=>$.data?.sessions||[]),o=P(()=>$.data?.control&&$.data.profiles||[]),s=P(()=>($.data?.triggers||[]).filter(e=>G(a).some(t=>t.id===e.session)));function c(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}function l(e){return[`TURN COMPLETE`,`IDLE`,`ACTIVE`].includes(e.status)&&G(s).some(t=>t.session===e.id)?`TRIGGER SET`:e.status}let u=I(!1);function d(e,t){i().id&&i().id!==t&&G(u)?e.preventDefault():O(t)}yn(()=>{let e=i().id;e&&pr(()=>{oa.selected=e,pa(e,2)})});let p=P(()=>G(a).find(e=>e.id===i().id)),m=P(()=>new URLSearchParams(Xi.querystring).get(`review`)===`profile`&&G(o).some(e=>e.session===i().id&&e.pending)),h=P(()=>G(a).some(e=>e.id===oa.selected)?oa.selected:G(a)[0]?.id),v=P(()=>!$.connected||!!$.data?.sessionsError);function y(e){return e.status!==`STALE`&&e.failed===!0}let b=P(()=>[[`OBSERVED TOKENS`,ma(G(a).reduce((e,t)=>e+t.tokens,0))],[`LISTED SESSIONS`,ma(G(a).length)],...[[`WORKING`,`WORKING`],[`AWAITING APPROVAL`,`APPROVAL NEEDED`],[`AWAITING INPUT`,`INPUT NEEDED`],[`ERRORS`,`ERRORS`],[`CHECK · INFERRED`,`CHECK SESSION`]].map(([e,t])=>[e,G(v)?`—`:ma(G(a).filter(e=>t===`ERRORS`?y(e):e.status===t).length)])]),x=P(()=>G(a).filter(e=>[`INPUT NEEDED`,`APPROVAL NEEDED`].includes(e.status)||y(e)).sort((e,t)=>S(e)-S(t)));function S(e){return e.status===`APPROVAL NEEDED`?0:e.status===`INPUT NEEDED`?1:2}let C=P(()=>G(a).filter(e=>e.status===`TURN COMPLETE`&&(!e.readStateKnown||e.unread)&&!G(s).some(t=>t.session===e.id)&&!G(o).some(t=>t.session===e.id&&t.pending))),w=I(``),T=new Set;async function E(e){if(!$.data?.control||G(v)||!e.unread||!e.readRevision||!e.replyTurn||e.streaming||G(m))return;let t=e.id,n=e.readRevision,r=e.replyTurn,i=JSON.stringify([t,n,r]);if(!T.has(i)){T.add(i);try{await ur();let e=G(a).find(e=>e.id===t),i=document.getElementById(`content`),o=i?.getBoundingClientRect(),s=o?o.left+i.clientLeft:0,c=o?o.top+i.clientTop:0,l=s+(i?.clientWidth||0),u=c+(i?.clientHeight||0);if(!Array.from(document.querySelectorAll(`[data-result-session]`)).some(e=>{let n=e.getBoundingClientRect();return i?.contains(e)&&e.dataset.resultSession===t&&e.dataset.resultTurn===r&&!e.closest(`[inert], [hidden]`)&&document.visibilityState===`visible`&&n.leftMath.max(0,s)&&n.topMath.max(0,c)&&n.width>0&&n.height>0})||e?.readRevision!==n||e?.replyTurn!==r||G(v))return;await ya(`read`,{session:t,read:{turn:r,revision:n}}),L(w,``)}catch{L(w,`Result changed or could not be marked read. Open it again to retry.`)}finally{T.delete(i)}}}function D(e){O(e);let t=G(a).find(t=>t.id===e);t&&E(t)}let ee=I(Xt(pr(()=>i().id||``))),te=I(``);yn(()=>{let e=i().id||``;e!==G(ee)&&(L(ee,e,!0),L(te,e,!0))}),yn(()=>{if(G(te)&&G(p)?.id===G(te)){let e=G(p);L(te,``),pr(()=>{E(e)})}});function O(e){oa.selected=e,ur().then(()=>document.querySelector(`.session-row.selected`)?.scrollIntoView({block:`nearest`}))}function ne(e,t){if(O(e),i().id){t<0&&(pa(e,2),location.hash=`/sessions`);return}let n=da(e)+t;if(n>2)location.hash=`/sessions/`+encodeURIComponent(e);else if(pa(e,n),t>0){let t=G(a).find(t=>t.id===e);t&&E(t)}}function re(e){let t=e.target;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||t.closest(`input, textarea, select, [contenteditable="true"]`))){if(e.key===`Escape`&&i().id)e.preventDefault(),ne(i().id,-1);else if([`ArrowLeft`,`ArrowRight`].includes(e.key)&&(i().id||G(h)))e.preventDefault(),ne(i().id||G(h),e.key===`ArrowLeft`?-1:1);else if(!i().id&&[`ArrowUp`,`ArrowDown`].includes(e.key)&&G(a).length){e.preventDefault();let t=G(a).findIndex(e=>e.id===G(h));O(G(a)[Math.max(0,Math.min(G(a).length-1,t+(e.key===`ArrowUp`?-1:1)))].id)}}}function ie(e){return G(v)?`Last observation only — refresh unavailable. Check Codex for current state.`:e.status===`CHECK SESSION`?`INFERRED INACTIVITY — a quiet session, not a confirmed input or approval request. Local tools may still be running.`:y(e)?e.status===`MODEL BUSY`?`CONFIRMED TURN FAILURE — the selected model was at capacity. Choose another model with /model or retry when ready. This is not a quota-exhaustion signal.`:e.status===`MODEL UNAVAILABLE`?`CONFIRMED TURN FAILURE — the provider could not find the selected model. Choose an available model with /model. No automatic retry or model change.`:e.status===`CAPACITY RESTRICTED`?`CONFIRMED TURN FAILURE — capacity is unavailable on a policy-restricted route. Inspect the error before changing settings or retrying. This is not a quota-exhaustion signal; no automatic retry or policy change.`:`CONFIRMED TURN FAILURE — inspect the error below before sending another prompt. No automatic retry or model change.`:$.data?.control&&[`APPROVAL NEEDED`,`INPUT NEEDED`].includes(e.status)?`Open full detail for supported live controls; otherwise reply in Codex.`:e.status===`APPROVAL NEEDED`?`OBSERVED APPROVAL SIGNAL — approve or decline in Codex.`:e.status===`INPUT NEEDED`?`OBSERVED INPUT SIGNAL — reply in Codex.`:e.status===`TURN COMPLETE`?`OBSERVED TURN COMPLETION — informational, not an approval request.`:``}function ae(e){return e.streaming&&e.contextKind===`LAST REPLY`?`REPLY // STREAMING`:e.contextKind||`LAST ACTIVITY`}var oe=bc();Sr(`keydown`,$t,re);var se=z(oe),ce=e=>{var t=Ys(),n=B(t,!0);H(()=>Y(n,G(w))),J(e,t)};X(se,e=>{G(w)&&e(ce)});var k=V(se,2),le=B(V(R(k),2));N(k);var ue=V(k,2);let de;Z(ue,21,()=>G(b),qr,(e,t)=>{var n=P(()=>_(G(t),2));let r=()=>G(n)[0],i=()=>G(n)[1];var a=Xs();let o;var s=R(a),c=B(s,!0),l=B(V(s,2),!0);N(a),H(()=>{o=li(a,1,`svelte-mm4wfe`,null,o,{failed:r()===`ERRORS`&&i()!==`0`&&i()!==`—`}),Y(c,r()),Y(l,i())}),J(e,a)}),N(ue);var fe=V(ue,2),pe=B(fe),A=V(fe,2),me=e=>{J(e,Zs())};X(A,e=>{G(v)&&e(me)});var he=V(A,2),ge=e=>{J(e,Qs())};X(he,e=>{$.data?.profileError&&e(ge)});var _e=V(he,2),ve=e=>{var t=nc(),n=R(t);Z(n,17,()=>G(x),qr,(e,t)=>{var n=$s();let r;var i=B(n);H((e,a,o)=>{r=li(n,1,`button`,null,r,{approval:e}),Q(n,`href`,a),Y(i,`${G(t).status??``} ${o??``} // ${(G(t).name||G(t).directory||G(t).id)??``}`)},[()=>G(t).status===`APPROVAL NEEDED`||G(t).status===`INPUT NEEDED`||y(G(t)),()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,n,()=>O(G(t).id)),J(e,n)});var r=V(n,2);Z(r,17,()=>G(o).filter(e=>e.pending&&G(a).some(t=>t.id===e.session)),qr,(e,t)=>{var n=ec(),r=B(n);H((e,a,o)=>{Q(n,`title`,i().id&&i().id!==G(t).session&&G(u)?`Finish sending or clear your current draft before switching sessions.`:`Review this session’s quota threshold`),Q(n,`href`,e),Y(r,`QUOTA THRESHOLD ${a??``} // ${o??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).session)+`?review=profile`,()=>Array.from(G(t).session).slice(-5).join(``).toUpperCase(),()=>G(a).find(e=>e.id===G(t).session)?.name||G(a).find(e=>e.id===G(t).session)?.directory||G(t).session]),K(`click`,n,e=>d(e,G(t).session)),J(e,n)});var l=V(r,2);Z(l,17,()=>G(C),qr,(e,t)=>{var n=tc(),r=B(n);H((e,i)=>{Q(n,`href`,e),Y(r,`TURN COMPLETE ${i??``} // ${(G(t).name||G(t).directory||G(t).id)??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,n,()=>O(G(t).id)),J(e,n)}),Z(V(l,2),17,()=>G(s),qr,(e,t)=>{var n=tc(),r=B(n);H((e,t,i)=>{Q(n,`href`,e),Y(r,`TRIGGER SET ${t??``} // ${i??``}`)},[()=>`#/sessions/`+encodeURIComponent(G(t).session),()=>Array.from(G(t).session).slice(-5).join(``).toUpperCase(),()=>G(a).find(e=>e.id===G(t).session)?.name||G(a).find(e=>e.id===G(t).session)?.directory]),K(`click`,n,e=>c(e,G(t).session)),J(e,n)}),N(t),J(e,t)},j=P(()=>(G(x).length||G(C).length||G(o).some(e=>e.pending)||G(s).length)&&!G(v));X(_e,e=>{G(j)&&e(ve)});var ye=V(_e,2),M=e=>{var t=Pr(),a=z(t),s=e=>{var t=sc(),a=R(t),s=R(a);let c;var d=R(s);let f;var h=V(d);N(s);var g=V(s,2);N(a);var _=V(a,2),b=e=>{var t=qs(),n=B(t,!0);H(()=>Y(n,G(p).directory)),J(e,t)};X(_,e=>{G(p).name&&G(p).directory&&e(b)});var x=V(_,2),S=B(x),C=V(x,2);let w;var T=R(C),D=R(T);n(D,()=>G(p),()=>!0,()=>!0),N(T);var ee=V(T,2),te=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{{let t=P(()=>new URLSearchParams(Xi.querystring).get(`schedule`)===`edit`),n=P(()=>G(p).fileChanges||[]);Ds(e,{get session(){return G(p).id},oncopy:()=>G(r)?.copy(),get openScheduler(){return G(t)},get observedCommand(){return G(p).command},get observedFileChanges(){return G(n)},get suspended(){return G(m)},onProtectedChange:e=>{L(u,e,!0)}})}}),J(e,t)},ne=e=>{var t=rc();Kr(V(R(t),2),()=>G(p).id,e=>{zo(e,{get session(){return G(p).id},localOnly:!0,oncopy:()=>G(r)?.copy()})}),N(t),J(e,t)};X(ee,e=>{$.data?.control?e(te):e(ne,-1)}),N(C);var re=V(C,2);Z(re,17,()=>G(o).filter(e=>e.session===G(p).id),e=>e.session,(e,t)=>{var n=ac(),r=R(n),i=e=>{var n=Ys(),r=B(n,!0);H(()=>Y(r,G(t).notice)),J(e,n)};X(r,e=>{G(t).notice&&e(i)});var a=V(r,2),o=e=>{Ds(e,{get session(){return G(p).id},review:`profile`})},s=e=>{var t=ic();H(e=>Q(t,`href`,e),[()=>`#/sessions/`+encodeURIComponent(G(p).id)+`?review=profile`]),J(e,t)};X(a,e=>{G(t).pending&&G(m)?e(o):G(t).pending&&e(s,1)}),N(n),H(()=>Q(n,`id`,`quota-profile-`+G(p).id)),J(e,n)});var ie=V(re,2),ae=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{Ps(e,{get session(){return G(p)},get stale(){return G(v)},children:e=>{var t=Pr(),n=z(t),i=e=>{Li(Is(e,{get session(){return G(p)},active:!0,compact:!0}),e=>L(r,e,!0),()=>G(r))};X(n,e=>{G(m)||e(i)}),J(e,t)},$$slots:{default:!0}})}),J(e,t)},oe=e=>{var t=oc(),n=z(t),i=e=>{var t=Pr();Kr(z(t),()=>G(p).id,e=>{Li(Is(e,{get session(){return G(p)},active:!0}),e=>L(r,e,!0),()=>G(r))}),J(e,t)};X(n,e=>{G(m)||e(i)}),Kr(V(n,2),()=>G(p).id,e=>{Ps(e,{get session(){return G(p)},get stale(){return G(v)}})}),J(e,t)};X(ie,e=>{G(p).goal?e(ae):e(oe,-1)}),N(t),H((e,t,n,r)=>{c=li(s,1,`svelte-mm4wfe`,null,c,{failed:e,reviewed:G(p).status===`TURN COMPLETE`&&G(p).readStateKnown&&!G(p).unread}),f=li(d,1,`lamp lit svelte-mm4wfe`,null,f,{failed:t,working:G(p).status===`WORKING`&&!G(v)}),Y(h,`${n??``} // ${(G(p).name||G(p).directory)??``}`),Y(S,`${r??``} TOKENS // ${G(p).id??``} // CONTEXT SOURCE // ${(G(p).source||`LOCAL`)??``}`),w=di(C,``,w,{display:G(m)?`none`:void 0}),Q(T,`data-result-session`,G(p).id),Q(T,`data-result-turn`,G(p).replyTurn)},[()=>y(G(p))&&!G(v)&&!G(m),()=>y(G(p))&&!G(v),()=>G(v)?`STALE`:G(m)?`QUOTA THRESHOLD`:l(G(p)),()=>ma(G(p).tokens)]),K(`click`,g,()=>{O(i().id),pa(i().id,2)}),Sr(`wheel`,T,()=>{E(G(p))}),J(e,t)},c=e=>{J(e,cc())};X(a,e=>{G(p)?e(s):e(c,-1)}),J(e,t)},be=e=>{var t=yc(),r=z(t),i=V(R(r),2),s=R(i),c=V(s,2);N(i),N(r);var u=V(r,2);Z(u,17,()=>G(a),e=>e.id,(e,t)=>{let r=P(()=>da(G(t).id));var i=_c();let a;var s=R(i),c=R(s),u=e=>{var n=lc(),r=R(n),i=B(r);N(n),H(e=>{Q(r,`aria-pressed`,G(h)===G(t).id),Y(i,`${e??``} // ${G(t).name??``}`)},[()=>Array.from(G(t).id).slice(-5).join(``).toUpperCase()]),K(`click`,r,()=>O(G(t).id)),J(e,n)};X(c,e=>{G(t).name&&e(u)});var f=V(c,2),p=R(f);let m;var g=R(p);let _;var b=V(g,1,!0);N(p),N(f);var x=V(f,2),S=e=>{var n=uc(),r=B(n,!0);H(()=>{Q(n,`aria-pressed`,G(h)===G(t).id),Y(r,G(t).directory||G(t).id)}),K(`click`,n,()=>O(G(t).id)),J(e,n)};X(x,e=>{G(t).name||e(S)});var C=V(x,2),w=R(C);Se(),N(C);var T=V(C,2),ee=e=>{var n=qs(),r=B(n,!0);H(()=>Y(r,G(t).directory)),J(e,n)};X(T,e=>{G(t).name&&G(t).directory&&e(ee)});var te=V(T,2),re=B(te),ie=V(te,2),oe=B(ie),se=V(ie,2);ks(se,{get goal(){return G(t).goal},get stale(){return G(v)}});var ce=V(se,2),k=R(ce),le=V(k,2),ue=B(le,!0),de=V(le,2);N(ce);var fe=V(ce,2),pe=V(fe,2),A=e=>{var n=dc(),r=B(n,!0);H(e=>Y(r,e),[()=>G(t).status===`CHECK SESSION`?`INFERRED INACTIVITY`:y(G(t))?`OPEN DETAIL FOR THE TURN ERROR`:$.data?.control?`OPEN FULL DETAIL OR REPLY IN CODEX`:G(t).status===`APPROVAL NEEDED`?`APPROVE OR DECLINE IN CODEX`:`REPLY IN CODEX`]),J(e,n)},me=P(()=>!G(v)&&([`APPROVAL NEEDED`,`INPUT NEEDED`,`CHECK SESSION`].includes(G(t).status)||y(G(t))));X(pe,e=>{G(me)&&e(A)}),N(s);var he=V(s,2),ge=e=>{var r=hc(),i=R(r),a=R(i),s=B(a,!0),c=V(a,2),l=e=>{var n=fc(),r=B(n,!0);H(e=>{Q(n,`href`,e),Y(r,$.data?.control?`REVIEW IN FULL DETAIL ↗`:`APPROVAL IN CODEX ↗`)},[()=>`#/sessions/`+encodeURIComponent(G(t).id)]),J(e,n)};X(c,e=>{!G(v)&&G(t).status===`APPROVAL NEEDED`&&e(l)}),N(i);var u=V(i,2),f=R(u);n(f,()=>G(t),()=>!1),N(u);var p=V(u,2);Z(p,17,()=>G(o).filter(e=>e.session===G(t).id),qr,(e,n)=>{var r=oc(),i=z(r),a=e=>{var t=pc(),r=B(t,!0);H(()=>Y(r,G(n).notice)),J(e,t)};X(i,e=>{G(n).notice&&e(a)});var o=V(i,2),s=e=>{var n=mc();H(e=>Q(n,`href`,e),[()=>`#/sessions/`+encodeURIComponent(G(t).id)+`?review=profile`]),K(`click`,n,e=>d(e,G(t).id)),J(e,n)};X(o,e=>{G(n).pending&&e(s)}),J(e,r)});var m=V(p,2);{let e=P(()=>G(h)===G(t).id);Is(m,{get session(){return G(t)},get active(){return G(e)}})}N(r),H(e=>{Y(s,e),Q(u,`data-result-session`,G(t).id),Q(u,`data-result-turn`,G(t).replyTurn)},[()=>ae(G(t))]),Sr(`wheel`,u,()=>{E(G(t))}),J(e,r)};X(he,e=>{G(r)>0&&e(ge)});var _e=V(he,2),ve=e=>{var n=gc(),r=V(R(n),2);{let e=P(()=>(G(t).samples||[]).map(e=>e.tokens));ao(r,{get values(){return G(e)},capacity:120})}var i=B(V(r,2));N(n),H(()=>Y(i,`LAST ${(G(t).samples?.length||0)??``} SAMPLES // AUTO SCALE`)),J(e,n)};X(_e,e=>{G(r)<2&&e(ve)}),N(i),H((e,n,o,s,c,l,u)=>{a=li(i,1,`session-row`,null,a,{selected:G(h)===G(t).id,wide:G(r)===2,split:G(r)===1}),Q(i,`aria-label`,`Session `+(G(t).name||G(t).directory||G(t).id)),m=li(p,1,`status-detail svelte-mm4wfe`,null,m,{reviewed:G(t).status===`TURN COMPLETE`&&G(t).readStateKnown&&!G(t).unread,failed:e}),Q(p,`href`,n),_=li(g,1,`lamp lit svelte-mm4wfe`,null,_,{failed:o,working:G(t).status===`WORKING`&&!G(v)}),Y(b,s),Y(w,`${c??``} `),Y(re,`${G(t).agents??``} LINKED AGENTS`),Y(oe,`ACTIVE // ${l??``}`),k.disabled=G(r)===0,Q(le,`aria-expanded`,G(r)>0),Y(ue,G(r)?`HIDE DETAIL`:`SHOW DETAIL`),Q(fe,`href`,u)},[()=>y(G(t))&&!G(v),()=>`#/sessions/`+encodeURIComponent(G(t).id),()=>y(G(t))&&!G(v),()=>G(v)?`STALE`:l(G(t)),()=>ma(G(t).tokens),()=>ha(G(t).activity),()=>`#/sessions/`+encodeURIComponent(G(t).id)]),K(`click`,p,()=>D(G(t).id)),K(`click`,k,()=>ne(G(t).id,-1)),K(`click`,le,()=>{let e=G(r)===0;O(G(t).id),pa(G(t).id,+!!e),e&&E(G(t))}),K(`click`,de,()=>ne(G(t).id,1)),K(`click`,fe,()=>D(G(t).id)),J(e,i)});var f=V(u,2),p=e=>{J(e,vc())};X(f,e=>{G(a).length||e(p)}),K(`click`,s,()=>fa(1)),K(`click`,c,()=>fa(0)),J(e,t)};X(ye,e=>{i().id?e(M):e(be,-1)}),H(e=>{Y(le,`OBSERVED ${e??``}`),de=li(ue,1,`session-totals`,null,de,{stale:G(v)}),Y(pe,`${G(v)?`LAST KNOWN TOTALS — live state counts unavailable. `:``}Tokens observed since this server started for currently listed sessions; linked diff --git a/internal/web/dist/index.html b/internal/web/dist/index.html index 57affdbb..ed5c79f7 100644 --- a/internal/web/dist/index.html +++ b/internal/web/dist/index.html @@ -5,7 +5,7 @@ Codexometer // Experimental web - + diff --git a/web/src/Sessions.svelte b/web/src/Sessions.svelte index 2c2f9539..237d91f9 100644 --- a/web/src/Sessions.svelte +++ b/web/src/Sessions.svelte @@ -193,7 +193,8 @@ if (row) void reviewResult(row); } // An arriving result in an already-open page needs a fresh review gesture. - let resultRoute = $state(''); + // Restoring a URL is not a review gesture, including when data arrives late. + let resultRoute = $state(untrack(() => params.id || '')); let pendingResultRoute = $state(''); $effect(() => { const id = params.id || ''; diff --git a/web/tests/browser.spec.ts b/web/tests/browser.spec.ts index e83e8973..6c5d9076 100644 --- a/web/tests/browser.spec.ts +++ b/web/tests/browser.spec.ts @@ -11,42 +11,45 @@ const projections = JSON.parse( // Keep the stream open so tests can distinguish fresh signals from disconnected // cached snapshots and can deliver updates without reloading the presentation. -async function mockStream(page: Page, snapshot: object) { - await page.addInitScript((snapshot) => { - const original = window.fetch.bind(window); - window.fetch = (input, init) => { - if (input === '/api/events') { - document.documentElement.dataset.testStreams = String( - Number(document.documentElement.dataset.testStreams || 0) + 1, - ); - return Promise.resolve( - new Response( - new ReadableStream({ - start(controller) { - const send = (value: unknown) => - controller.enqueue( - new TextEncoder().encode( - 'data: ' + JSON.stringify(value) + '\n\n', - ), +async function mockStream(page: Page, snapshot: object, sendInitial = true) { + await page.addInitScript( + ({ snapshot, sendInitial }) => { + const original = window.fetch.bind(window); + window.fetch = (input, init) => { + if (input === '/api/events') { + document.documentElement.dataset.testStreams = String( + Number(document.documentElement.dataset.testStreams || 0) + 1, + ); + return Promise.resolve( + new Response( + new ReadableStream({ + start(controller) { + const send = (value: unknown) => + controller.enqueue( + new TextEncoder().encode( + 'data: ' + JSON.stringify(value) + '\n\n', + ), + ); + if (sendInitial) send(snapshot); + window.addEventListener( + 'test-disconnect', + () => controller.error(new Error('Test stream closed')), + { once: true }, ); - send(snapshot); - window.addEventListener( - 'test-disconnect', - () => controller.error(new Error('Test stream closed')), - { once: true }, - ); - window.addEventListener('test-snapshot', (event) => - send((event as CustomEvent).detail), - ); - }, - }), - { headers: { 'Content-Type': 'text/event-stream' } }, - ), - ); - } - return original(input, init); - }; - }, snapshot); + window.addEventListener('test-snapshot', (event) => + send((event as CustomEvent).detail), + ); + }, + }), + { headers: { 'Content-Type': 'text/event-stream' } }, + ), + ); + } + return original(input, init); + }; + }, + { snapshot, sendInitial }, + ); } const test = base.extend<{ @@ -824,7 +827,12 @@ test('goal objective, budget and lifecycle commands retain explicit confirmation // Browser contract tests use synthetic actions. The Go tests exercise the real // authorization/confirmation endpoints with fake Codex clients, never live work. -async function mockActions(page: Page, kind = 'approval', noConfirm = false) { +async function mockActions( + page: Page, + kind = 'approval', + noConfirm = false, + sendInitial = true, +) { const snapshot = { control: true, noConfirm, @@ -872,7 +880,7 @@ async function mockActions(page: Page, kind = 'approval', noConfirm = false) { }[], }; const calls: { action: string; body: Record }[] = []; - await mockStream(page, snapshot); + await mockStream(page, snapshot, sendInitial); await page.route('**/api/control/*', async (route) => { const action = route.request().url().split('/').pop()!; const body = route.request().postDataJSON(); @@ -5361,3 +5369,51 @@ test('clipped partial results stay unread until visible inside the content scrol await result.dispatchEvent('wheel', { deltaY: 100 }); await expect.poll(() => reads.length).toBe(1); }); + +test('restoring full detail with a late first snapshot keeps the result unread until review', async ({ + page, + pairingURL, +}) => { + const { snapshot } = await mockActions(page, 'prompt', false, false); + const reads: unknown[] = []; + await page.route('**/api/control/read', (route) => { + reads.push(route.request().postDataJSON()); + return route.fulfill({ json: { read: true } }); + }); + await page.goto(pairingURL); + await page.evaluate(() => { + location.hash = '/sessions/parent'; + }); + await page.reload(); + await expect(page.locator('.startup')).toHaveCount(0); + await expect(page.locator('#content')).not.toHaveAttribute('inert'); + await expect( + page.getByText('Connecting to your local Codexometer…'), + ).toBeVisible(); + const unread = { + ...snapshot, + sessions: [ + { + ...snapshot.sessions[0], + readStateKnown: true, + unread: true, + readRevision: 'restore-v1', + replyTurn: 'restore-t1', + }, + ], + }; + await page.evaluate( + (detail) => + window.dispatchEvent(new CustomEvent('test-snapshot', { detail })), + unread, + ); + await expect(page.locator('.detail-context')).toBeVisible(); + await page.waitForTimeout(150); + expect(reads).toHaveLength(0); + await page.locator('.detail-context').dispatchEvent('wheel', { deltaY: 100 }); + await expect.poll(() => reads.length).toBe(1); + // Leaving and deliberately reopening the result still counts as review. + await page.getByRole('link', { name: 'SESSIONS', exact: true }).click(); + await page.getByRole('link', { name: 'FULL DETAIL →' }).first().click(); + await expect.poll(() => reads.length).toBe(2); +}); From bbccecf21f62b6d1ce4274015933b71f5efb9220 Mon Sep 17 00:00:00 2001 From: merefield Date: Sat, 7 Nov 2026 11:36:22 +0000 Subject: [PATCH 10/10] Use Opt for macOS history shortcut labels --- README.md | 8 ++++---- internal/ui/monitor_history.go | 10 +++++++--- internal/ui/monitor_history_test.go | 9 +++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 40abb171..f52779ff 100644 --- a/README.md +++ b/README.md @@ -1575,10 +1575,10 @@ same action on that session. The presentations are: **Recent turn history:** `Alt+Left` opens the previous completed turn; `Alt+Right` moves forwards, eventually returning to live detail. Click - **Previous**, **Next**, or **Live** for the same navigation. On macOS, use - `Option+Left` / `Option+Right`: the default Terminal.app and Ghostty - word-movement encodings are also recognised while the reply editor is - unfocused. While typing, those encodings continue to move between words; + **Previous**, **Next**, or **Live** for the same navigation. On macOS, the + labels show `Opt` for the Option key. Use `Option+Left` / `Option+Right`: + the default Terminal.app and Ghostty word-movement encodings are also + recognised while the reply editor is unfocused. While typing, those encodings continue to move between words; leave the editor before navigating history. These controls appear when replies have been retained and space permits; narrow layouts shorten the labels, and the hotkeys remain available on short terminals. diff --git a/internal/ui/monitor_history.go b/internal/ui/monitor_history.go index 60096c21..496248d2 100644 --- a/internal/ui/monitor_history.go +++ b/internal/ui/monitor_history.go @@ -267,9 +267,13 @@ func (m Model) historyNavigationButtons(width, height int) []monitorNavigationBu if !older && h.selected == nil { return nil } + modifier := "Alt" + if runtime.GOOS == "darwin" { + modifier = "Opt" + } buttons := []monitorNavigationButton{ - {label: i18n.Text("[ Alt+←: PREVIOUS ]"), action: "history:previous", enabled: older}, - {label: i18n.Text("[ Alt+→: NEXT ]"), action: "history:next", enabled: h.selected != nil}, + {label: strings.Replace(i18n.Text("[ Alt+←: PREVIOUS ]"), "Alt+", modifier+"+", 1), action: "history:previous", enabled: older}, + {label: strings.Replace(i18n.Text("[ Alt+→: NEXT ]"), "Alt+", modifier+"+", 1), action: "history:next", enabled: h.selected != nil}, {label: i18n.Text("[ LIVE ]"), action: "history:live", enabled: h.selected != nil}, } x := 2 @@ -278,7 +282,7 @@ func (m Model) historyNavigationButtons(width, height int) []monitorNavigationBu x += buttons[i].rect.width + 1 } if x > width-2 { - for i, label := range []string{"[Alt+←]", "[Alt+→]", i18n.Text("[ LIVE ]")} { + for i, label := range []string{"[" + modifier + "+←]", "[" + modifier + "+→]", i18n.Text("[ LIVE ]")} { buttons[i].label = label } x = 2 diff --git a/internal/ui/monitor_history_test.go b/internal/ui/monitor_history_test.go index 05f6c427..cbfb29ea 100644 --- a/internal/ui/monitor_history_test.go +++ b/internal/ui/monitor_history_test.go @@ -108,6 +108,15 @@ func TestMonitorHistoryRenderedControlsAndLiveApproval(t *testing.T) { } lines := strings.Split(ansi.Strip(out), "\n") for _, b := range m.historyNavigationButtons(g.contentWidth, g.meterHeight) { + if b.action != "history:live" { + modifier := "Alt+" + if runtime.GOOS == "darwin" { + modifier = "Opt+" + } + if !strings.Contains(b.label, modifier) { + t.Fatalf("history shortcut label does not match platform: %q", b.label) + } + } if got := ansi.Cut(lines[b.rect.y], b.rect.x, b.rect.x+b.rect.width); got != b.label { t.Fatalf("render/hit mismatch: %q vs %q", got, b.label) }