reasonix 0.29.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dashboard/app.css CHANGED
@@ -812,6 +812,9 @@ main { padding: 32px 40px 60px 32px; min-width: 0; }
812
812
  }
813
813
  .chip-f:hover { background: var(--bg-hover); color: var(--fg-1); }
814
814
  .chip-f.active { color: var(--c-brand); border-color: var(--c-brand); background: rgba(121,192,255,.08); }
815
+ .chip-f.static { cursor: default; }
816
+ .chip-f.static:hover { background: var(--bg-elev); color: var(--fg-2); }
817
+ .chip-f.static.active:hover { color: var(--c-brand); background: rgba(121,192,255,.08); }
815
818
  .chip-f .ct { color: var(--fg-4); font-size: 10px; }
816
819
  .chip-f.active .ct { color: var(--c-brand); }
817
820
  .chip-f .x { color: var(--fg-4); padding: 0 2px; }
@@ -22978,7 +22978,7 @@ function ChatPanel() {
22978
22978
  <div class="chat-shell">
22979
22979
  <div style="display:flex;align-items:center;gap:12px;margin-bottom:10px">
22980
22980
  <div class="chips" style="padding:0">
22981
- <span class="chip-f active">${MODE === "attached" ? t4("chat.modeMirror") : t4("chat.modeView")}</span>
22981
+ <span class="chip-f static active">${MODE === "attached" ? t4("chat.modeMirror") : t4("chat.modeView")}</span>
22982
22982
  </div>
22983
22983
  <div class="header-pickers" style="margin-left:auto">
22984
22984
  ${effort ? html4`
@@ -23329,6 +23329,7 @@ function HooksPanel() {
23329
23329
  const [drafts, setDrafts] = p2({});
23330
23330
  const [busy, setBusy] = p2(false);
23331
23331
  const [info, setInfo] = p2(null);
23332
+ const [eventFilter, setEventFilter] = p2("all");
23332
23333
  const load = x2(async () => {
23333
23334
  try {
23334
23335
  const r3 = await api("/hooks");
@@ -23381,17 +23382,26 @@ function HooksPanel() {
23381
23382
  `;
23382
23383
  const matrixRows = buildMatrix(data);
23383
23384
  const events = data.events.length > 0 ? data.events : Array.from(new Set(matrixRows.flatMap((r3) => Object.keys(r3.cells))));
23385
+ const visibleRows = eventFilter === "all" ? matrixRows : matrixRows.filter((r3) => r3.cells[eventFilter]?.on);
23384
23386
  const gridCols = `220px repeat(${Math.max(events.length, 1)}, minmax(0, 1fr))`;
23385
23387
  return html4`
23386
23388
  <div style="display:flex;flex-direction:column;gap:6px">
23387
23389
  <div class="chips">
23388
- <span class="chip-f active">${t4("hooks.resolved")} <span class="ct">${data.resolved.length}</span></span>
23389
- ${data.events.map((ev) => html4`<span class="chip-f">${ev}</span>`)}
23390
+ <span
23391
+ class=${`chip-f ${eventFilter === "all" ? "active" : ""}`}
23392
+ onClick=${() => setEventFilter("all")}
23393
+ >${t4("hooks.resolved")} <span class="ct">${data.resolved.length}</span></span>
23394
+ ${data.events.map(
23395
+ (ev) => html4`<span
23396
+ class=${`chip-f ${eventFilter === ev ? "active" : ""}`}
23397
+ onClick=${() => setEventFilter(ev)}
23398
+ >${ev}</span>`
23399
+ )}
23390
23400
  </div>
23391
23401
  ${info ? html4`<div><span class="pill ok">${info}</span></div>` : null}
23392
23402
  ${error ? html4`<div class="card accent-err">${error}</div>` : null}
23393
23403
 
23394
- ${sectionH3(t4("hooks.eventMatrix"), t4("hooks.matrixSub", { scripts: matrixRows.length, s: matrixRows.length === 1 ? "" : "s", events: events.length }))}${matrixRows.length === 0 ? html4`<div class="card" style="color:var(--fg-3)">
23404
+ ${sectionH3(t4("hooks.eventMatrix"), t4("hooks.matrixSub", { scripts: matrixRows.length, s: matrixRows.length === 1 ? "" : "s", events: events.length }))}${visibleRows.length === 0 ? html4`<div class="card" style="color:var(--fg-3)">
23395
23405
  ${t4("hooks.noHooks")}
23396
23406
  </div>` : html4`
23397
23407
  <div class="card" style="padding:10px 14px;overflow-x:auto">
@@ -23400,7 +23410,7 @@ function HooksPanel() {
23400
23410
  <div>${t4("hooks.colScript")}</div>
23401
23411
  ${events.map((ev) => html4`<div>${ev}</div>`)}
23402
23412
  </div>
23403
- ${matrixRows.map(
23413
+ ${visibleRows.map(
23404
23414
  (r3) => html4`
23405
23415
  <div class="row" style=${`grid-template-columns:${gridCols}`}>
23406
23416
  <div class="cell" title=${r3.command}>
@@ -24432,8 +24442,8 @@ function PermissionsPanel() {
24432
24442
  </div>` : null}
24433
24443
 
24434
24444
  <div class="chips">
24435
- <span class="chip-f active">${t4("permissions.project")} <span class="ct">${p3.project.length}</span></span>
24436
- <span class="chip-f">${t4("permissions.builtin")} <span class="ct">${p3.builtin.length}</span></span>
24445
+ <span class="chip-f static active">${t4("permissions.project")} <span class="ct">${p3.project.length}</span></span>
24446
+ <span class="chip-f static">${t4("permissions.builtin")} <span class="ct">${p3.builtin.length}</span></span>
24437
24447
  </div>
24438
24448
 
24439
24449
  ${p3.currentCwd ? html4`
@@ -24533,6 +24543,7 @@ function PlansPanel() {
24533
24543
  const { data, error, loading } = usePoll("/plans", 8e3);
24534
24544
  const [openIdx, setOpenIdx] = p2(null);
24535
24545
  const [filter, setFilter] = p2("");
24546
+ const [statusFilter, setStatusFilter] = p2("all");
24536
24547
  if (loading && !data)
24537
24548
  return html4`<div class="card" style="color:var(--fg-3)">${t4("plans.loading")}</div>`;
24538
24549
  if (error) return html4`<div class="card accent-err">${t4("common.loadingFailed", { name: "plans", error: error.message })}</div>`;
@@ -24541,9 +24552,10 @@ function PlansPanel() {
24541
24552
  return html4`<div class="card" style="color:var(--fg-3)">
24542
24553
  ${t4("plans.noPlans")}
24543
24554
  </div>`;
24544
- const filtered = filter.trim() ? plans.filter(
24555
+ const statusFiltered = statusFilter === "all" ? plans : statusFilter === "active" ? plans.filter((p3) => p3.completionRatio > 0 && p3.completionRatio < 1) : plans.filter((p3) => p3.completionRatio >= 1);
24556
+ const filtered = filter.trim() ? statusFiltered.filter(
24545
24557
  (p3) => p3.session.toLowerCase().includes(filter.toLowerCase()) || (p3.summary ?? "").toLowerCase().includes(filter.toLowerCase())
24546
- ) : plans;
24558
+ ) : statusFiltered;
24547
24559
  const open = openIdx !== null ? plans[openIdx] : null;
24548
24560
  return html4`
24549
24561
  <div class="sessions-grid">
@@ -24558,12 +24570,21 @@ function PlansPanel() {
24558
24570
  />
24559
24571
  </div>
24560
24572
  <div class="chips" style="padding:0 12px 8px">
24561
- <span class="chip-f active">${t4("common.all")} <span class="ct">${plans.length}</span></span>
24562
- <span class="chip-f">
24573
+ <span
24574
+ class=${`chip-f ${statusFilter === "all" ? "active" : ""}`}
24575
+ onClick=${() => setStatusFilter("all")}
24576
+ >${t4("common.all")} <span class="ct">${plans.length}</span></span>
24577
+ <span
24578
+ class=${`chip-f ${statusFilter === "active" ? "active" : ""}`}
24579
+ onClick=${() => setStatusFilter("active")}
24580
+ >
24563
24581
  ${t4("plans.active")}
24564
24582
  <span class="ct">${plans.filter((p3) => p3.completionRatio > 0 && p3.completionRatio < 1).length}</span>
24565
24583
  </span>
24566
- <span class="chip-f">
24584
+ <span
24585
+ class=${`chip-f ${statusFilter === "done" ? "active" : ""}`}
24586
+ onClick=${() => setStatusFilter("done")}
24587
+ >
24567
24588
  ${t4("plans.done")} <span class="ct">${plans.filter((p3) => p3.completionRatio >= 1).length}</span>
24568
24589
  </span>
24569
24590
  </div>
@@ -24742,10 +24763,10 @@ function SemanticPanel() {
24742
24763
  <div style="display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:14px;align-items:start">
24743
24764
  <div style="display:flex;flex-direction:column;gap:10px;min-width:0">
24744
24765
  <div class="chips">
24745
- <span class=${`chip-f ${idx?.exists ? "active" : ""}`}>
24766
+ <span class=${`chip-f static ${idx?.exists ? "active" : ""}`}>
24746
24767
  ${idx?.exists ? t4("semantic.indexBuilt") : t4("semantic.noIndex")}
24747
24768
  </span>
24748
- ${ready ? html4`<span class="chip-f" style="border-color:var(--c-ok);color:var(--c-ok)">${t4("semantic.ready")}</span>` : html4`<span class="chip-f" style="border-color:var(--c-warn);color:var(--c-warn)">${t4("semantic.setupNeeded")}</span>`}
24769
+ ${ready ? html4`<span class="chip-f static" style="border-color:var(--c-ok);color:var(--c-ok)">${t4("semantic.ready")}</span>` : html4`<span class="chip-f static" style="border-color:var(--c-warn);color:var(--c-warn)">${t4("semantic.setupNeeded")}</span>`}
24749
24770
  </div>
24750
24771
  ${info ? html4`<div><span class="pill info">${info}</span></div>` : null}
24751
24772
  ${error ? html4`<div class="card accent-err">${error}</div>` : null}
@@ -25163,7 +25184,7 @@ function ChipFormRow({
25163
25184
  <div style="display:flex;flex-wrap:wrap;gap:4px">
25164
25185
  ${value.map(
25165
25186
  (e3) => html4`
25166
- <span class="chip-f">
25187
+ <span class="chip-f static">
25167
25188
  <span>${e3}</span>
25168
25189
  <span class="x" style="cursor:pointer" onClick=${() => remove(e3)} title="remove">×</span>
25169
25190
  </span>
@@ -25279,7 +25300,7 @@ function SessionsPanel() {
25279
25300
  />
25280
25301
  </div>
25281
25302
  <div class="chips" style="padding:0 12px 8px">
25282
- <span class="chip-f active">${t4("common.all")} <span class="ct">${sessions.length}</span></span>
25303
+ <span class="chip-f static active">${t4("common.all")} <span class="ct">${sessions.length}</span></span>
25283
25304
  </div>
25284
25305
  <div class="ssl-rows">
25285
25306
  ${filtered.map(
@@ -25533,6 +25554,7 @@ function SkillsPanel() {
25533
25554
  const [newName, setNewName] = p2("");
25534
25555
  const [newScope, setNewScope] = p2("global");
25535
25556
  const [filter, setFilter] = p2("");
25557
+ const [scopeFilter, setScopeFilter] = p2("all");
25536
25558
  const load = x2(async () => {
25537
25559
  try {
25538
25560
  setData(await api("/skills"));
@@ -25624,9 +25646,10 @@ description: TODO \u2014 one-line description that helps the model match this sk
25624
25646
  ...data.global.map((s3) => ({ scope: "global", ...s3 })),
25625
25647
  ...data.builtin.map((s3) => ({ scope: "builtin", ...s3 }))
25626
25648
  ];
25627
- const filtered = filter.trim() ? allWith.filter(
25649
+ const scopeFiltered = scopeFilter === "all" ? allWith : allWith.filter((s3) => s3.scope === scopeFilter);
25650
+ const filtered = filter.trim() ? scopeFiltered.filter(
25628
25651
  (s3) => s3.name.toLowerCase().includes(filter.toLowerCase()) || (s3.description ?? "").toLowerCase().includes(filter.toLowerCase())
25629
- ) : allWith;
25652
+ ) : scopeFiltered;
25630
25653
  return html4`
25631
25654
  <div class="sessions-grid">
25632
25655
  <div class="sessions-list">
@@ -25640,10 +25663,22 @@ description: TODO \u2014 one-line description that helps the model match this sk
25640
25663
  />
25641
25664
  </div>
25642
25665
  <div class="chips" style="padding:0 12px 8px">
25643
- <span class="chip-f active">${t4("common.all")} <span class="ct">${allWith.length}</span></span>
25644
- <span class="chip-f">${t4("skills.project")} <span class="ct">${data.project.length}</span></span>
25645
- <span class="chip-f">${t4("skills.global")} <span class="ct">${data.global.length}</span></span>
25646
- <span class="chip-f">${t4("skills.builtin")} <span class="ct">${data.builtin.length}</span></span>
25666
+ <span
25667
+ class=${`chip-f ${scopeFilter === "all" ? "active" : ""}`}
25668
+ onClick=${() => setScopeFilter("all")}
25669
+ >${t4("common.all")} <span class="ct">${allWith.length}</span></span>
25670
+ <span
25671
+ class=${`chip-f ${scopeFilter === "project" ? "active" : ""}`}
25672
+ onClick=${() => setScopeFilter("project")}
25673
+ >${t4("skills.project")} <span class="ct">${data.project.length}</span></span>
25674
+ <span
25675
+ class=${`chip-f ${scopeFilter === "global" ? "active" : ""}`}
25676
+ onClick=${() => setScopeFilter("global")}
25677
+ >${t4("skills.global")} <span class="ct">${data.global.length}</span></span>
25678
+ <span
25679
+ class=${`chip-f ${scopeFilter === "builtin" ? "active" : ""}`}
25680
+ onClick=${() => setScopeFilter("builtin")}
25681
+ >${t4("skills.builtin")} <span class="ct">${data.builtin.length}</span></span>
25647
25682
  </div>
25648
25683
 
25649
25684
  <div style="padding:0 12px 8px;display:flex;gap:6px;flex-wrap:wrap">
@@ -25832,8 +25867,8 @@ function ToolsPanel() {
25832
25867
  return html4`
25833
25868
  <div style="display:flex;flex-direction:column;gap:14px">
25834
25869
  <div class="chips">
25835
- <span class="chip-f active">${t4("common.all")} <span class="ct">${d3.total}</span></span>
25836
- ${d3.planMode ? html4`<span class="chip-f" style="border-color:var(--c-warn);color:var(--c-warn)">${t4("tools.planMode")}</span>` : null}
25870
+ <span class="chip-f static active">${t4("common.all")} <span class="ct">${d3.total}</span></span>
25871
+ ${d3.planMode ? html4`<span class="chip-f static" style="border-color:var(--c-warn);color:var(--c-warn)">${t4("tools.planMode")}</span>` : null}
25837
25872
  </div>
25838
25873
 
25839
25874
  ${d3.tools.length === 0 ? html4`<div class="card" style="color:var(--fg-3)">${t4("tools.noTools")}</div>` : html4`
@@ -25989,8 +26024,8 @@ function UsagePanel() {
25989
26024
  return html4`
25990
26025
  <div style="display:flex;flex-direction:column;gap:6px">
25991
26026
  <div class="chips">
25992
- <span class="chip-f active">${t4("usage.records", { count: u3.recordCount.toLocaleString() })}</span>
25993
- <span class="chip-f">${u3.logSize}</span>
26027
+ <span class="chip-f static active">${t4("usage.records", { count: u3.recordCount.toLocaleString() })}</span>
26028
+ <span class="chip-f static">${u3.logSize}</span>
25994
26029
  </div>
25995
26030
 
25996
26031
  ${series && series.length > 0 ? html4`