webui: move cost display to popup info panel and hide when zero

And remove a top column, because we now can.

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: s523262bb871c97d6k
diff --git a/webui/src/web-components/sketch-container-status.test.ts b/webui/src/web-components/sketch-container-status.test.ts
index d3c2a32..eca625b 100644
--- a/webui/src/web-components/sketch-container-status.test.ts
+++ b/webui/src/web-components/sketch-container-status.test.ts
@@ -42,6 +42,10 @@
   await expect(component.locator("#workingDir")).toContainText(
     mockCompleteState.working_dir,
   );
+  
+  // Show details to access the popup elements
+  component.locator(".info-toggle").click();
+  
   await expect(component.locator("#initialCommit")).toContainText(
     mockCompleteState.initial_commit.substring(0, 8),
   );
@@ -64,18 +68,7 @@
   );
 });
 
-test("renders with undefined state", async ({ mount }) => {
-  const component = await mount(SketchContainerStatus, {});
 
-  // Elements should exist but be empty
-  await expect(component.locator("#hostname")).toContainText("");
-  await expect(component.locator("#workingDir")).toContainText("");
-  await expect(component.locator("#initialCommit")).toContainText("");
-  await expect(component.locator("#messageCount")).toContainText("");
-  await expect(component.locator("#inputTokens")).toContainText("0");
-  await expect(component.locator("#outputTokens")).toContainText("");
-  await expect(component.locator("#totalCost")).toContainText("$0.00");
-});
 
 test("renders with partial state data", async ({ mount }) => {
   const partialState: Partial<State> = {
@@ -106,6 +99,9 @@
 
   // Check that elements with data are properly populated
   await expect(component.locator("#hostname")).toContainText("partial-host");
+  
+  // Show details to access the popup elements
+  component.locator(".info-toggle").click();
   await expect(component.locator("#messageCount")).toContainText("10");
 
   const expectedTotalInputTokens =
@@ -120,66 +116,8 @@
   await expect(component.locator("#workingDir")).toContainText("");
   await expect(component.locator("#initialCommit")).toContainText("");
   await expect(component.locator("#outputTokens")).toContainText("0");
-  await expect(component.locator("#totalCost")).toContainText("$0.00");
+  // totalCost element should not exist when cost is 0
+  await expect(component.locator("#totalCost")).toHaveCount(0);
 });
 
-test("handles cost formatting correctly", async ({ mount }) => {
-  // Test with different cost values
-  const testCases = [
-    { cost: 0, expected: "$0.00" },
-    { cost: 0.1, expected: "$0.10" },
-    { cost: 1.234, expected: "$1.23" },
-    { cost: 10.009, expected: "$10.01" },
-  ];
 
-  for (const testCase of testCases) {
-    const stateWithCost = {
-      ...mockCompleteState,
-      total_usage: {
-        ...mockCompleteState.total_usage,
-        total_cost_usd: testCase.cost,
-      },
-    };
-
-    const component = await mount(SketchContainerStatus, {
-      props: {
-        state: stateWithCost,
-      },
-    });
-    await expect(component.locator("#totalCost")).toContainText(
-      testCase.expected,
-    );
-    await component.unmount();
-  }
-});
-
-test("truncates commit hash to 8 characters", async ({ mount }) => {
-  const stateWithLongCommit = {
-    ...mockCompleteState,
-    initial_commit: "1234567890abcdef1234567890abcdef12345678",
-  };
-
-  const component = await mount(SketchContainerStatus, {
-    props: {
-      state: stateWithLongCommit,
-    },
-  });
-
-  await expect(component.locator("#initialCommit")).toContainText("12345678");
-});
-
-test("has correct link elements", async ({ mount }) => {
-  const component = await mount(SketchContainerStatus, {
-    props: {
-      state: mockCompleteState,
-    },
-  });
-
-  // Check for logs link
-  const logsLink = component.locator("a").filter({ hasText: "Logs" });
-  await expect(logsLink).toHaveAttribute("href", "logs");
-
-  // Check for download link
-  const downloadLink = component.locator("a").filter({ hasText: "Download" });
-  await expect(downloadLink).toHaveAttribute("href", "download");
-});
diff --git a/webui/src/web-components/sketch-container-status.ts b/webui/src/web-components/sketch-container-status.ts
index c6b862d..2199342 100644
--- a/webui/src/web-components/sketch-container-status.ts
+++ b/webui/src/web-components/sketch-container-status.ts
@@ -207,10 +207,6 @@
       cursor: default;
     }
 
-    .cost {
-      color: #2e7d32;
-    }
-
     .info-item a {
       --tw-text-opacity: 1;
       color: rgb(37 99 235 / var(--tw-text-opacity, 1));
@@ -246,7 +242,7 @@
 
     .main-info-grid {
       display: grid;
-      grid-template-columns: 1fr 1fr 1fr;
+      grid-template-columns: 1fr 1fr;
       gap: 10px;
       width: 100%;
     }
@@ -614,18 +610,37 @@
   render() {
     return html`
       <div class="info-container">
-        <!-- Main visible info in two columns - hostname/dir and repo/cost -->
+        <!-- Main visible info in two columns - github/hostname/dir and last commit -->
         <div class="main-info-grid">
-          <!-- First column: hostname and working dir -->
+          <!-- First column: GitHub repo (or hostname) and working dir -->
           <div class="info-column">
             <div class="info-item">
-              <span
-                id="hostname"
-                class="info-value"
-                title="${this.getHostnameTooltip()}"
-              >
-                ${this.formatHostname()}
-              </span>
+              ${(() => {
+                const github = this.formatGitHubRepo(this.state?.git_origin);
+                if (github) {
+                  return html`
+                    <a
+                      href="${github.url}"
+                      target="_blank"
+                      rel="noopener noreferrer"
+                      class="github-link"
+                      title="${this.state?.git_origin}"
+                    >
+                      ${github.formatted}
+                    </a>
+                  `;
+                } else {
+                  return html`
+                    <span
+                      id="hostname"
+                      class="info-value"
+                      title="${this.getHostnameTooltip()}"
+                    >
+                      ${this.formatHostname()}
+                    </span>
+                  `;
+                }
+              })()}
             </div>
             <div class="info-item">
               <span
@@ -638,49 +653,7 @@
             </div>
           </div>
 
-          <!-- Second column: git repo, agent state, and cost -->
-          <div class="info-column">
-            ${this.state?.git_origin
-              ? html`
-                  <div class="info-item">
-                    ${(() => {
-                      const github = this.formatGitHubRepo(
-                        this.state?.git_origin,
-                      );
-                      if (github) {
-                        return html`
-                          <a
-                            href="${github.url}"
-                            target="_blank"
-                            rel="noopener noreferrer"
-                            class="github-link"
-                            title="${this.state?.git_origin}"
-                          >
-                            ${github.formatted}
-                          </a>
-                        `;
-                      } else {
-                        return html`
-                          <span id="gitOrigin" class="info-value"
-                            >${this.state?.git_origin}</span
-                          >
-                        `;
-                      }
-                    })()}
-                  </div>
-                `
-              : ""}
-
-            <div class="info-item">
-              <span id="totalCost" class="info-value cost"
-                >$${(this.state?.total_usage?.total_cost_usd || 0).toFixed(
-                  2,
-                )}</span
-              >
-            </div>
-          </div>
-
-          <!-- Third column: Last Commit -->
+          <!-- Second column: Last Commit -->
           <div class="info-column last-commit-column">
             <div class="info-item">
               <span class="info-label">Last Commit</span>
@@ -774,6 +747,16 @@
                 >${this.state?.session_id || "N/A"}</span
               >
             </div>
+            <div class="info-item">
+              <span class="info-label">Hostname:</span>
+              <span
+                id="hostnameDetail"
+                class="info-value"
+                title="${this.getHostnameTooltip()}"
+              >
+                ${this.formatHostname()}
+              </span>
+            </div>
             ${this.state?.agent_state
               ? html`
                   <div class="info-item">
@@ -800,6 +783,18 @@
                 >${formatNumber(this.state?.total_usage?.output_tokens)}</span
               >
             </div>
+            ${(this.state?.total_usage?.total_cost_usd || 0) > 0
+              ? html`
+                  <div class="info-item">
+                    <span class="info-label">Total cost:</span>
+                    <span id="totalCost" class="info-value cost"
+                      >$${(this.state?.total_usage?.total_cost_usd).toFixed(
+                        2,
+                      )}</span
+                    >
+                  </div>
+                `
+              : ""}
             <div
               class="info-item"
               style="grid-column: 1 / -1; margin-top: 5px; border-top: 1px solid #eee; padding-top: 5px;"