privateboard 0.1.0 → 0.1.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "privateboard",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "PrivateBoard · your private board meeting, on call. Local-first, multi-agent thinking amplifier.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -238,7 +238,7 @@
238
238
  <div class="lock-icon">▰</div>
239
239
  <div class="lock-text">
240
240
  in-room notes are private to each thinker.
241
- <a href="prototype-dashboard.html" class="lock-link">sign in →</a>
241
+ <a href="/" class="lock-link">sign in →</a>
242
242
  to see what they have said and where their stance shifted.
243
243
  </div>
244
244
  </div>
@@ -248,8 +248,8 @@
248
248
  <footer class="agent-card-foot">
249
249
  <div class="meta private-only">tenure · <span class="lime agent-tenure"></span></div>
250
250
  <div class="meta public-only">first room · <span class="lime">free</span></div>
251
- <a href="prototype-dashboard.html#convene" class="agent-card-cta private-only">[ ◆ Convene with them ]</a>
252
- <a href="prototype-dashboard.html#convene" class="agent-card-cta public-only">[ → Sign in to convene ]</a>
251
+ <a href="/#convene" class="agent-card-cta private-only">[ ◆ Convene with them ]</a>
252
+ <a href="/#convene" class="agent-card-cta public-only">[ → Sign in to convene ]</a>
253
253
  </footer>
254
254
  </div>
255
255
  </div>
@@ -1063,7 +1063,8 @@
1063
1063
  cursor: pointer;
1064
1064
  transition: background 0.1s;
1065
1065
  }
1066
- .ap-id-menu-item:last-child { border-bottom: none; }
1066
+ .ap-id-menu-item:last-child,
1067
+ .ap-id-menu-item:has(+ .ap-id-menu-divider) { border-bottom: none; }
1067
1068
  .ap-id-menu-item:hover { background: var(--panel-2); }
1068
1069
  .ap-id-menu-mark { font-family: var(--mono); font-size: 11px; color: var(--lime); }
1069
1070
  /* Disabled state · used for the chair's locked-avatar row. Looks like
@@ -1315,7 +1316,7 @@
1315
1316
  }
1316
1317
 
1317
1318
  /* ─── Skills v2 · uploaded Skill.md files ────────────────────────────
1318
- Replaces the prototype inventory grid. Pattern · radar at top,
1319
+ Replaces the legacy inventory grid. Pattern · radar at top,
1319
1320
  per-skill rows below, drop-zone at the foot. PRD: docs/PRD-skills.md. */
1320
1321
  .ap-skills-v2 {
1321
1322
  display: flex;
@@ -1977,7 +1978,7 @@
1977
1978
  /* Popover — anchored under the trigger. Mirrors the room composer's
1978
1979
  .cmp-dd-pop dropdown: tight rows, mono micro-type hint inline with
1979
1980
  the label, provider section headers, hairline scrollbar. One
1980
- coherent dropdown vocabulary across the prototype. */
1981
+ coherent dropdown vocabulary across the app. */
1981
1982
  .ap-model-picker {
1982
1983
  position: fixed;
1983
1984
  z-index: 9100;
@@ -2813,7 +2814,7 @@
2813
2814
 
2814
2815
  .ap-memory-row.editing .ap-memory-actions { visibility: hidden; }
2815
2816
 
2816
- /* ─── Memory · legacy prototype tile gallery (kept for callers
2817
+ /* ─── Memory · legacy tile gallery (kept for callers
2817
2818
  that still pass `p.memory` shape). v1 profiles render the
2818
2819
  .ap-memory list above and never enter this block. */
2819
2820
  .ap-memory-gallery {
@@ -605,7 +605,7 @@
605
605
 
606
606
  function renderMetrics(p, slug) {
607
607
  const m = p.metrics || {};
608
- // Real model takes precedence over the prototype's hardcoded value.
608
+ // Real (live) model takes precedence over any hardcoded fallback.
609
609
  const model = liveModelFor(slug) || m.model || { name: "—", deck: "" };
610
610
  const cell = (lbl, vHTML, opts) => `
611
611
  <div class="cell">
@@ -1209,7 +1209,7 @@
1209
1209
  }
1210
1210
 
1211
1211
  /* ─── Skills v2 · uploaded Skill.md files ────────────────────────────
1212
- Replaces the prototype localStorage skill grid. Skills are real,
1212
+ Replaces the legacy localStorage skill grid. Skills are real,
1213
1213
  server-persisted, and feed both the ability radar and the Pass-1
1214
1214
  orchestrator router. PRD: docs/PRD-skills.md. */
1215
1215
 
@@ -2362,7 +2362,8 @@
2362
2362
  return {
2363
2363
  room: document.querySelector('[data-main-view="room"]'),
2364
2364
  agent: document.querySelector('[data-main-view="agent"]'),
2365
- reports: document.querySelector('[data-main-view="reports"]')
2365
+ reports: document.querySelector('[data-main-view="reports"]'),
2366
+ notes: document.querySelector('[data-main-view="notes"]'),
2366
2367
  };
2367
2368
  }
2368
2369
 
@@ -2373,11 +2374,17 @@
2373
2374
  v.agent.setAttribute("hidden", "");
2374
2375
  v.agent.innerHTML = "";
2375
2376
  }
2376
- // The All Reports view is the third main pane; hide it when
2377
- // returning to a room so its placeholder card / list never bleeds
2378
- // through under the room view.
2377
+ // Hide every other top-level pane so its content / placeholder
2378
+ // doesn't bleed through under the room view. Each view is just
2379
+ // the same `.main-view` CSS box — without explicitly hiding the
2380
+ // siblings, two of them stack and the user sees a leaked
2381
+ // "All Notes" / "All Reports" empty state.
2379
2382
  if (v.reports) v.reports.setAttribute("hidden", "");
2383
+ if (v.notes) v.notes.setAttribute("hidden", "");
2380
2384
  document.querySelectorAll(".agent-row.active").forEach((r) => r.classList.remove("active"));
2385
+ document.querySelectorAll("[data-notes-trigger].active").forEach((el) => el.classList.remove("active"));
2386
+ document.querySelectorAll("[data-reports-trigger].active").forEach((el) => el.classList.remove("active"));
2387
+ currentlyOpenSlug = null;
2381
2388
  }
2382
2389
 
2383
2390
  /** Build a minimal profile object from a live /api/agents record so
@@ -2423,7 +2430,15 @@
2423
2430
  };
2424
2431
  }
2425
2432
 
2433
+ // Track the currently-open profile so other modules (user-settings)
2434
+ // can ask us to re-fetch skill state after they mutate keys. Without
2435
+ // this, the web-search toggle row keeps its `data-key-configured="0"`
2436
+ // attribute baked from the first render and the user gets the
2437
+ // "configure key" prompt forever after they actually configured it.
2438
+ let currentlyOpenSlug = null;
2439
+
2426
2440
  function open(slug) {
2441
+ currentlyOpenSlug = slug;
2427
2442
  let p = PROFILES[slug];
2428
2443
  // Live agent record (DB row · includes seeded directors too,
2429
2444
  // since they live in the agents table). Custom directors created
@@ -2449,10 +2464,14 @@
2449
2464
  if (!v.agent) return;
2450
2465
  v.agent.innerHTML = pageHTML(p, slug);
2451
2466
  if (v.room) v.room.setAttribute("hidden", "");
2452
- // If the user came from All Reports, hide that pane too — without
2453
- // this, both views render simultaneously and the reports placeholder
2454
- // card overlays the agent profile.
2467
+ // Hide the other top-level panes (All Reports / All Notes) so
2468
+ // their placeholder / list doesn't render under the agent profile.
2469
+ // Without these, opening agent profile from "All Notes" leaks the
2470
+ // notes empty-state through the agent view.
2455
2471
  if (v.reports) v.reports.setAttribute("hidden", "");
2472
+ if (v.notes) v.notes.setAttribute("hidden", "");
2473
+ document.querySelectorAll("[data-notes-trigger].active").forEach((el) => el.classList.remove("active"));
2474
+ document.querySelectorAll("[data-reports-trigger].active").forEach((el) => el.classList.remove("active"));
2456
2475
  v.agent.removeAttribute("hidden");
2457
2476
  // Centralized sidebar-focus handler · also clears New room /
2458
2477
  // New agent highlights and any stale session-row highlight, since
@@ -3320,6 +3339,13 @@
3320
3339
 
3321
3340
  window.openAgentProfile = open;
3322
3341
  window.closeAgentProfile = showRoom;
3342
+ // Re-fetch the open profile's skills (incl. per-skill keyConfigured
3343
+ // flags) so the web-search toggle row's cached `data-key-configured`
3344
+ // refreshes after the user adds a key in Preferences. No-op when no
3345
+ // profile is currently open.
3346
+ window.refreshAgentProfileSkills = function () {
3347
+ if (currentlyOpenSlug) loadSkillsForV2(currentlyOpenSlug);
3348
+ };
3323
3349
 
3324
3350
  if (document.readyState === "loading") {
3325
3351
  document.addEventListener("DOMContentLoaded", init);