@lifeaitools/clauth 1.19.2 → 1.19.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.
@@ -747,9 +747,9 @@ function dashboardHtml(port, whitelist, isStaged = false, initWriteToken = null)
747
747
  .btn-ccandme{background:linear-gradient(135deg,#1a1a2e,#16213e);color:#a78bfa;border:1px solid #4c1d95;padding:7px 16px;font-size:.85rem;border-radius:7px;cursor:pointer;font-weight:600;transition:all .15s;white-space:nowrap}
748
748
  .btn-ccandme:hover{background:linear-gradient(135deg,#2d1b69,#1e1b4b);border-color:#7c3aed;color:#c4b5fd;transform:translateY(-1px)}
749
749
  .btn-ccandme:disabled{opacity:.5;cursor:not-allowed;transform:none}
750
- .btn-monkey{background:linear-gradient(135deg,#103c2f,#0f2f3f);color:#86efac;border:1px solid #166534;padding:7px 16px;font-size:.85rem;border-radius:7px;cursor:pointer;font-weight:700;transition:all .15s;white-space:nowrap}
751
- .btn-monkey:hover{background:linear-gradient(135deg,#14532d,#155e75);border-color:#22c55e;color:#bbf7d0;transform:translateY(-1px)}
752
- .btn-monkey:disabled{opacity:.5;cursor:not-allowed;transform:none}
750
+ .btn-tintin{background:linear-gradient(135deg,#103c2f,#0f2f3f);color:#86efac;border:1px solid #166534;padding:7px 16px;font-size:.85rem;border-radius:7px;cursor:pointer;font-weight:700;transition:all .15s;white-space:nowrap}
751
+ .btn-tintin:hover{background:linear-gradient(135deg,#14532d,#155e75);border-color:#22c55e;color:#bbf7d0;transform:translateY(-1px)}
752
+ .btn-tintin:disabled{opacity:.5;cursor:not-allowed;transform:none}
753
753
  .btn-claude{background:linear-gradient(135deg,#d97706,#f59e0b);color:#0a0f1a;padding:8px 18px;font-size:.85rem;border-radius:7px;border:none;cursor:pointer;font-weight:700;letter-spacing:.3px;transition:all .15s;white-space:nowrap}
754
754
  .btn-claude:hover{filter:brightness(1.1);transform:translateY(-1px)}
755
755
  .btn-claude:disabled{opacity:.4;cursor:not-allowed;transform:none;filter:none}
@@ -766,22 +766,22 @@ function dashboardHtml(port, whitelist, isStaged = false, initWriteToken = null)
766
766
  .build-label{font-size:.85rem;color:#94a3b8;flex:1}
767
767
  .build-label strong{color:#e2e8f0}
768
768
  .build-meta{font-family:'Courier New',monospace;font-size:.75rem;color:#64748b}
769
- .monkey-panel{display:none;position:fixed;top:0;right:0;bottom:0;z-index:80;width:min(420px,calc(100vw - 24px));background:#081c1a;border-left:1px solid #14532d;padding:1rem 1.25rem;box-shadow:-22px 0 60px rgba(0,0,0,.42);overflow:auto}
770
- .monkey-panel.open{display:block}
771
- .monkey-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:.8rem}
772
- .monkey-title{font-size:.95rem;font-weight:700;color:#dcfce7}
773
- .monkey-sub{font-size:.78rem;color:#6ee7b7;margin-top:2px}
774
- .monkey-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}
775
- .monkey-field{display:flex;flex-direction:column;gap:4px}
776
- .monkey-field label{font-size:.72rem;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;font-weight:700}
777
- .monkey-input,.monkey-textarea{background:#031312;border:1px solid #14532d;border-radius:6px;color:#e2e8f0;font-family:'Courier New',monospace;font-size:.85rem;padding:8px 10px;outline:none;transition:border-color .15s}
778
- .monkey-input:focus,.monkey-textarea:focus{border-color:#22c55e}
779
- .monkey-textarea{width:100%;min-height:92px;resize:vertical;line-height:1.45;margin-bottom:10px}
780
- .monkey-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
781
- .monkey-status{font-family:'Courier New',monospace;font-size:.78rem;color:#94a3b8}
782
- .monkey-result{display:none;margin-top:12px;background:#020b0a;border:1px solid #134e4a;border-radius:8px;padding:10px;white-space:pre-wrap;word-break:break-word;font-family:'Courier New',monospace;font-size:.82rem;color:#bbf7d0;max-height:240px;overflow:auto}
783
- .monkey-result.open{display:block}
784
- @media (max-width:720px){.monkey-panel{width:100vw}.monkey-grid{grid-template-columns:1fr}}
769
+ .tintin-panel{display:none;position:fixed;top:0;right:0;bottom:0;z-index:80;width:min(420px,calc(100vw - 24px));background:#081c1a;border-left:1px solid #14532d;padding:1rem 1.25rem;box-shadow:-22px 0 60px rgba(0,0,0,.42);overflow:auto}
770
+ .tintin-panel.open{display:block}
771
+ .tintin-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:.8rem}
772
+ .tintin-title{font-size:.95rem;font-weight:700;color:#dcfce7}
773
+ .tintin-sub{font-size:.78rem;color:#6ee7b7;margin-top:2px}
774
+ .tintin-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}
775
+ .tintin-field{display:flex;flex-direction:column;gap:4px}
776
+ .tintin-field label{font-size:.72rem;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em;font-weight:700}
777
+ .tintin-input,.tintin-textarea{background:#031312;border:1px solid #14532d;border-radius:6px;color:#e2e8f0;font-family:'Courier New',monospace;font-size:.85rem;padding:8px 10px;outline:none;transition:border-color .15s}
778
+ .tintin-input:focus,.tintin-textarea:focus{border-color:#22c55e}
779
+ .tintin-textarea{width:100%;min-height:92px;resize:vertical;line-height:1.45;margin-bottom:10px}
780
+ .tintin-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
781
+ .tintin-status{font-family:'Courier New',monospace;font-size:.78rem;color:#94a3b8}
782
+ .tintin-result{display:none;margin-top:12px;background:#020b0a;border:1px solid #134e4a;border-radius:8px;padding:10px;white-space:pre-wrap;word-break:break-word;font-family:'Courier New',monospace;font-size:.82rem;color:#bbf7d0;max-height:240px;overflow:auto}
783
+ .tintin-result.open{display:block}
784
+ @media (max-width:720px){.tintin-panel{width:100vw}.tintin-grid{grid-template-columns:1fr}}
785
785
  .mcp-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
786
786
  .mcp-label{font-size:.72rem;color:#64748b;min-width:80px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}
787
787
  .mcp-val{flex:1;font-family:'Courier New',monospace;font-size:.82rem;color:#60a5fa;background:#0a0f1a;border:1px solid #1e3a5f;border-radius:4px;padding:6px 10px;word-break:break-all;user-select:all}
@@ -950,7 +950,7 @@ function dashboardHtml(port, whitelist, isStaged = false, initWriteToken = null)
950
950
  <button class="btn-refresh" onclick="loadServices()">↻ Refresh</button>
951
951
  <button class="btn-add" onclick="toggleAddService()">+ Add Service</button>
952
952
  <button class="btn-check" id="check-btn" onclick="checkAll()">⬤ Check All</button>
953
- <button class="btn-monkey" id="monkey-btn" onclick="toggleMonkeyPanel()" title="Open Monkey local CLI dispatch test panel">Monkey</button>
953
+ <button class="btn-monkey" id="tintin-btn" onclick="toggleTinTinPanel()" title="Open TinTin local CLI dispatch panel">TinTin</button>
954
954
  <button class="btn-ccandme" id="ccandme-btn" onclick="launchCCandMe()" title="Launch CCandMe — 4-pane WezTerm: Claude + Codex + Me">⚡ CCandMe</button>
955
955
  <button class="btn-lock" id="unlock-writes-btn" onclick="unlockWrites()" title="Enter password to enable saving changes this browser session (needed after a daemon restart when auto-unlocked via --pw)">🔓 Unlock Writes</button>
956
956
  <button class="btn-lock" onclick="lockVault()">🔒 Lock</button>
@@ -1079,31 +1079,31 @@ function dashboardHtml(port, whitelist, isStaged = false, initWriteToken = null)
1079
1079
  </div>
1080
1080
  </div>
1081
1081
 
1082
- <div class="monkey-panel" id="monkey-panel">
1083
- <div class="monkey-head">
1082
+ <div class="tintin-panel" id="tintin-panel">
1083
+ <div class="tintin-head">
1084
1084
  <div>
1085
- <div class="monkey-title">Monkey local CLI dispatch</div>
1086
- <div class="monkey-sub">Tests the same local clauth path the browser sidebar will use: /monkey/dispatch → Claude CLI → /monkey/dispatch/:job_id.</div>
1085
+ <div class="tintin-title">TinTin clauth CLI dispatch</div>
1086
+ <div class="tintin-sub">Dispatches a Claude CLI agent with clauth context. Uses sonnet-4-6 model. Routes: /monkey/dispatch → Claude CLI → /monkey/dispatch/:job_id.</div>
1087
1087
  </div>
1088
- <button class="btn-cancel" onclick="toggleMonkeyPanel()">Close</button>
1088
+ <button class="btn-cancel" onclick="toggleTinTinPanel()">Close</button>
1089
1089
  </div>
1090
- <div class="monkey-grid">
1091
- <div class="monkey-field">
1090
+ <div class="tintin-grid">
1091
+ <div class="tintin-field">
1092
1092
  <label>App slug</label>
1093
- <input class="monkey-input" id="monkey-app" value="clauth-dashboard" spellcheck="false" autocomplete="off">
1093
+ <input class="tintin-input" id="tintin-app" value="clauth-dashboard" spellcheck="false" autocomplete="off">
1094
1094
  </div>
1095
- <div class="monkey-field">
1095
+ <div class="tintin-field">
1096
1096
  <label>CWD</label>
1097
- <input class="monkey-input" id="monkey-cwd" value="C:\\Dev\\regen-root" spellcheck="false" autocomplete="off">
1097
+ <input class="tintin-input" id="tintin-cwd" value="C:\\Dev\\regen-root" spellcheck="false" autocomplete="off">
1098
1098
  </div>
1099
1099
  </div>
1100
- <textarea class="monkey-textarea" id="monkey-prompt" spellcheck="false">Reply exactly: monkey-dashboard-ok</textarea>
1101
- <div class="monkey-actions">
1102
- <button class="btn-monkey" id="monkey-send" onclick="sendMonkeyDashboardMessage()">Dispatch CLI</button>
1103
- <button class="btn-check" onclick="fillMonkeySmoke()" style="padding:7px 12px">Smoke Prompt</button>
1104
- <span class="monkey-status" id="monkey-status">idle</span>
1100
+ <textarea class="tintin-textarea" id="tintin-prompt" spellcheck="false">Reply exactly: tintin-dashboard-ok</textarea>
1101
+ <div class="tintin-actions">
1102
+ <button class="btn-monkey" id="tintin-send" onclick="sendTinTinMessage()">Dispatch</button>
1103
+ <button class="btn-check" onclick="fillTinTinSmoke()" style="padding:7px 12px">Smoke Prompt</button>
1104
+ <span class="tintin-status" id="tintin-status">idle</span>
1105
1105
  </div>
1106
- <div class="monkey-result" id="monkey-result"></div>
1106
+ <div class="tintin-result" id="tintin-result"></div>
1107
1107
  </div>
1108
1108
 
1109
1109
 
@@ -1505,52 +1505,52 @@ async function launchCCandMe() {
1505
1505
  }
1506
1506
  }
1507
1507
 
1508
- // ── Monkey local CLI dispatch test panel ──
1509
- let monkeyPollTimer = null;
1508
+ // ── TinTin local CLI dispatch sidebar ──
1509
+ let tintinPollTimer = null;
1510
1510
 
1511
- function toggleMonkeyPanel() {
1512
- const panel = document.getElementById("monkey-panel");
1511
+ function toggleTinTinPanel() {
1512
+ const panel = document.getElementById("tintin-panel");
1513
1513
  if (!panel) return;
1514
1514
  panel.classList.toggle("open");
1515
1515
  }
1516
1516
 
1517
- function fillMonkeySmoke() {
1518
- const prompt = document.getElementById("monkey-prompt");
1519
- const app = document.getElementById("monkey-app");
1517
+ function fillTinTinSmoke() {
1518
+ const prompt = document.getElementById("tintin-prompt");
1519
+ const app = document.getElementById("tintin-app");
1520
1520
  if (app) app.value = "clauth-dashboard";
1521
- if (prompt) prompt.value = "Reply exactly: monkey-dashboard-ok";
1521
+ if (prompt) prompt.value = "Reply exactly: tintin-dashboard-ok";
1522
1522
  }
1523
1523
 
1524
- function setMonkeyStatus(text) {
1525
- const el = document.getElementById("monkey-status");
1524
+ function setTinTinStatus(text) {
1525
+ const el = document.getElementById("tintin-status");
1526
1526
  if (el) el.textContent = text || "";
1527
1527
  }
1528
1528
 
1529
- function setMonkeyResult(text, open) {
1530
- const el = document.getElementById("monkey-result");
1529
+ function setTinTinResult(text, open) {
1530
+ const el = document.getElementById("tintin-result");
1531
1531
  if (!el) return;
1532
1532
  el.textContent = text || "";
1533
1533
  if (open) el.classList.add("open");
1534
1534
  else el.classList.remove("open");
1535
1535
  }
1536
1536
 
1537
- async function sendMonkeyDashboardMessage() {
1538
- const sendBtn = document.getElementById("monkey-send");
1539
- const promptEl = document.getElementById("monkey-prompt");
1540
- const appEl = document.getElementById("monkey-app");
1541
- const cwdEl = document.getElementById("monkey-cwd");
1537
+ async function sendTinTinMessage() {
1538
+ const sendBtn = document.getElementById("tintin-send");
1539
+ const promptEl = document.getElementById("tintin-prompt");
1540
+ const appEl = document.getElementById("tintin-app");
1541
+ const cwdEl = document.getElementById("tintin-cwd");
1542
1542
  const prompt = (promptEl && promptEl.value || "").trim();
1543
1543
  const appSlug = (appEl && appEl.value || "clauth-dashboard").trim() || "clauth-dashboard";
1544
1544
  const cwd = (cwdEl && cwdEl.value || "").trim();
1545
1545
  if (!prompt) {
1546
- setMonkeyStatus("prompt required");
1546
+ setTinTinStatus("prompt required");
1547
1547
  return;
1548
1548
  }
1549
- if (monkeyPollTimer) {
1550
- clearTimeout(monkeyPollTimer);
1551
- monkeyPollTimer = null;
1549
+ if (tintinPollTimer) {
1550
+ clearTimeout(tintinPollTimer);
1551
+ tintinPollTimer = null;
1552
1552
  }
1553
- const jobId = "monkey-dashboard-" + Date.now();
1553
+ const jobId = "tintin-" + Date.now();
1554
1554
  const body = {
1555
1555
  prompt,
1556
1556
  job_id: jobId,
@@ -1558,14 +1558,14 @@ async function sendMonkeyDashboardMessage() {
1558
1558
  agent_context: {
1559
1559
  app: { slug: appSlug, route: "/clauth-dashboard", origin: window.location.origin },
1560
1560
  repo: { root: cwd, cwd },
1561
- runtime: { agent: "clauth-cli", requested_by: "clauth-dashboard" },
1561
+ runtime: { agent: "clauth-cli", requested_by: "clauth-dashboard", model: "claude-sonnet-4-6" },
1562
1562
  task: { intent: "general_chat", thread_id: jobId }
1563
1563
  }
1564
1564
  };
1565
1565
 
1566
1566
  if (sendBtn) { sendBtn.disabled = true; sendBtn.textContent = "Dispatching..."; }
1567
- setMonkeyStatus("dispatching " + jobId);
1568
- setMonkeyResult("", false);
1567
+ setTinTinStatus("dispatching " + jobId);
1568
+ setTinTinResult("", false);
1569
1569
  try {
1570
1570
  const response = await fetch(BASE + "/monkey/dispatch", {
1571
1571
  method: "POST",
@@ -1574,35 +1574,35 @@ async function sendMonkeyDashboardMessage() {
1574
1574
  });
1575
1575
  const result = await response.json();
1576
1576
  if (!response.ok || result.error) {
1577
- setMonkeyStatus("dispatch failed");
1578
- setMonkeyResult(JSON.stringify(result, null, 2), true);
1577
+ setTinTinStatus("dispatch failed");
1578
+ setTinTinResult(JSON.stringify(result, null, 2), true);
1579
1579
  return;
1580
1580
  }
1581
- setMonkeyStatus("spawned pid " + result.pid + " - polling");
1582
- pollMonkeyDashboardJob(jobId, 0);
1581
+ setTinTinStatus("spawned pid " + result.pid + " - polling");
1582
+ pollTinTinJob(jobId, 0);
1583
1583
  } catch (err) {
1584
- setMonkeyStatus("dispatch error");
1585
- setMonkeyResult(err && err.message ? err.message : String(err), true);
1584
+ setTinTinStatus("dispatch error");
1585
+ setTinTinResult(err && err.message ? err.message : String(err), true);
1586
1586
  } finally {
1587
- if (sendBtn) { sendBtn.disabled = false; sendBtn.textContent = "Dispatch CLI"; }
1587
+ if (sendBtn) { sendBtn.disabled = false; sendBtn.textContent = "Dispatch"; }
1588
1588
  }
1589
1589
  }
1590
1590
 
1591
- async function pollMonkeyDashboardJob(jobId, attempt) {
1591
+ async function pollTinTinJob(jobId, attempt) {
1592
1592
  try {
1593
1593
  const response = await fetch(BASE + "/monkey/dispatch/" + encodeURIComponent(jobId), { cache: "no-store" });
1594
1594
  const job = await response.json();
1595
1595
  if (!response.ok || job.error) {
1596
- setMonkeyStatus("job lookup failed");
1597
- setMonkeyResult(JSON.stringify(job, null, 2), true);
1596
+ setTinTinStatus("job lookup failed");
1597
+ setTinTinResult(JSON.stringify(job, null, 2), true);
1598
1598
  return;
1599
1599
  }
1600
1600
  if (job.status === "running" && attempt < 60) {
1601
- setMonkeyStatus("running pid " + (job.pid || "?") + " - " + (attempt + 1));
1602
- monkeyPollTimer = setTimeout(function() { pollMonkeyDashboardJob(jobId, attempt + 1); }, 1500);
1601
+ setTinTinStatus("running pid " + (job.pid || "?") + " - " + (attempt + 1));
1602
+ tintinPollTimer = setTimeout(function() { pollTinTinJob(jobId, attempt + 1); }, 1500);
1603
1603
  return;
1604
1604
  }
1605
- setMonkeyStatus(job.status + " exit " + job.exit_code);
1605
+ setTinTinStatus(job.status + " exit " + job.exit_code);
1606
1606
  const out = [
1607
1607
  "status: " + job.status,
1608
1608
  "job: " + jobId,
@@ -1612,10 +1612,10 @@ async function pollMonkeyDashboardJob(jobId, attempt) {
1612
1612
  job.stdout || "",
1613
1613
  job.stderr ? "\\nstderr:\\n" + job.stderr : ""
1614
1614
  ].join("\\n");
1615
- setMonkeyResult(out, true);
1615
+ setTinTinResult(out, true);
1616
1616
  } catch (err) {
1617
- setMonkeyStatus("poll error");
1618
- setMonkeyResult(err && err.message ? err.message : String(err), true);
1617
+ setTinTinStatus("poll error");
1618
+ setTinTinResult(err && err.message ? err.message : String(err), true);
1619
1619
  }
1620
1620
  }
1621
1621
 
@@ -7892,20 +7892,20 @@ function buildMonkeyDispatchPrompt({ prompt, job_id, agent_context }) {
7892
7892
  const normalized = normalizeAgentContext(agent_context);
7893
7893
  const jobInstruction = job_id
7894
7894
  ? [
7895
- `Monkey job id: ${job_id}`,
7895
+ `TinTin job id: ${job_id}`,
7896
7896
  "If the prompt does not contain all job details, use clauth at http://127.0.0.1:52437 to fetch exact credentials and query the app database/API directly.",
7897
7897
  "Do not assume agent MCP/plugin tools are available to this spawned CLI process.",
7898
7898
  ].join("\n")
7899
7899
  : "";
7900
7900
 
7901
7901
  const body = prompt || [
7902
- "Process this Monkey job using the provided agent context.",
7902
+ "Process this TinTin job using the provided agent context.",
7903
7903
  jobInstruction,
7904
7904
  "Find the job payload from the consuming app's declared data path before making changes.",
7905
7905
  ].filter(Boolean).join("\n\n");
7906
7906
 
7907
7907
  return [
7908
- "You are a clauth-spawned Monkey CLI worker.",
7908
+ "You are a clauth-spawned TinTin CLI agent (model: claude-sonnet-4-6).",
7909
7909
  "Agent context setup follows. Treat it as the runtime contract for this task.",
7910
7910
  "```json",
7911
7911
  JSON.stringify(normalized, null, 2),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/clauth",
3
- "version": "1.19.2",
3
+ "version": "1.19.3",
4
4
  "description": "Hardware-bound credential vault for the LIFEAI infrastructure stack",
5
5
  "type": "module",
6
6
  "bin": {