@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.
- package/cli/commands/serve.js +80 -80
- package/package.json +1 -1
package/cli/commands/serve.js
CHANGED
|
@@ -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-
|
|
751
|
-
.btn-
|
|
752
|
-
.btn-
|
|
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
|
-
.
|
|
770
|
-
.
|
|
771
|
-
.
|
|
772
|
-
.
|
|
773
|
-
.
|
|
774
|
-
.
|
|
775
|
-
.
|
|
776
|
-
.
|
|
777
|
-
.
|
|
778
|
-
.
|
|
779
|
-
.
|
|
780
|
-
.
|
|
781
|
-
.
|
|
782
|
-
.
|
|
783
|
-
.
|
|
784
|
-
@media (max-width:720px){.
|
|
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="
|
|
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="
|
|
1083
|
-
<div class="
|
|
1082
|
+
<div class="tintin-panel" id="tintin-panel">
|
|
1083
|
+
<div class="tintin-head">
|
|
1084
1084
|
<div>
|
|
1085
|
-
<div class="
|
|
1086
|
-
<div class="
|
|
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="
|
|
1088
|
+
<button class="btn-cancel" onclick="toggleTinTinPanel()">Close</button>
|
|
1089
1089
|
</div>
|
|
1090
|
-
<div class="
|
|
1091
|
-
<div class="
|
|
1090
|
+
<div class="tintin-grid">
|
|
1091
|
+
<div class="tintin-field">
|
|
1092
1092
|
<label>App slug</label>
|
|
1093
|
-
<input class="
|
|
1093
|
+
<input class="tintin-input" id="tintin-app" value="clauth-dashboard" spellcheck="false" autocomplete="off">
|
|
1094
1094
|
</div>
|
|
1095
|
-
<div class="
|
|
1095
|
+
<div class="tintin-field">
|
|
1096
1096
|
<label>CWD</label>
|
|
1097
|
-
<input class="
|
|
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="
|
|
1101
|
-
<div class="
|
|
1102
|
-
<button class="btn-monkey" id="
|
|
1103
|
-
<button class="btn-check" onclick="
|
|
1104
|
-
<span class="
|
|
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="
|
|
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
|
-
// ──
|
|
1509
|
-
let
|
|
1508
|
+
// ── TinTin local CLI dispatch sidebar ──
|
|
1509
|
+
let tintinPollTimer = null;
|
|
1510
1510
|
|
|
1511
|
-
function
|
|
1512
|
-
const panel = document.getElementById("
|
|
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
|
|
1518
|
-
const prompt = document.getElementById("
|
|
1519
|
-
const app = document.getElementById("
|
|
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:
|
|
1521
|
+
if (prompt) prompt.value = "Reply exactly: tintin-dashboard-ok";
|
|
1522
1522
|
}
|
|
1523
1523
|
|
|
1524
|
-
function
|
|
1525
|
-
const el = document.getElementById("
|
|
1524
|
+
function setTinTinStatus(text) {
|
|
1525
|
+
const el = document.getElementById("tintin-status");
|
|
1526
1526
|
if (el) el.textContent = text || "";
|
|
1527
1527
|
}
|
|
1528
1528
|
|
|
1529
|
-
function
|
|
1530
|
-
const el = document.getElementById("
|
|
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
|
|
1538
|
-
const sendBtn = document.getElementById("
|
|
1539
|
-
const promptEl = document.getElementById("
|
|
1540
|
-
const appEl = document.getElementById("
|
|
1541
|
-
const cwdEl = document.getElementById("
|
|
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
|
-
|
|
1546
|
+
setTinTinStatus("prompt required");
|
|
1547
1547
|
return;
|
|
1548
1548
|
}
|
|
1549
|
-
if (
|
|
1550
|
-
clearTimeout(
|
|
1551
|
-
|
|
1549
|
+
if (tintinPollTimer) {
|
|
1550
|
+
clearTimeout(tintinPollTimer);
|
|
1551
|
+
tintinPollTimer = null;
|
|
1552
1552
|
}
|
|
1553
|
-
const jobId = "
|
|
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
|
-
|
|
1568
|
-
|
|
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
|
-
|
|
1578
|
-
|
|
1577
|
+
setTinTinStatus("dispatch failed");
|
|
1578
|
+
setTinTinResult(JSON.stringify(result, null, 2), true);
|
|
1579
1579
|
return;
|
|
1580
1580
|
}
|
|
1581
|
-
|
|
1582
|
-
|
|
1581
|
+
setTinTinStatus("spawned pid " + result.pid + " - polling");
|
|
1582
|
+
pollTinTinJob(jobId, 0);
|
|
1583
1583
|
} catch (err) {
|
|
1584
|
-
|
|
1585
|
-
|
|
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
|
|
1587
|
+
if (sendBtn) { sendBtn.disabled = false; sendBtn.textContent = "Dispatch"; }
|
|
1588
1588
|
}
|
|
1589
1589
|
}
|
|
1590
1590
|
|
|
1591
|
-
async function
|
|
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
|
-
|
|
1597
|
-
|
|
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
|
-
|
|
1602
|
-
|
|
1601
|
+
setTinTinStatus("running pid " + (job.pid || "?") + " - " + (attempt + 1));
|
|
1602
|
+
tintinPollTimer = setTimeout(function() { pollTinTinJob(jobId, attempt + 1); }, 1500);
|
|
1603
1603
|
return;
|
|
1604
1604
|
}
|
|
1605
|
-
|
|
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
|
-
|
|
1615
|
+
setTinTinResult(out, true);
|
|
1616
1616
|
} catch (err) {
|
|
1617
|
-
|
|
1618
|
-
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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),
|