Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions api/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</script>

<script>
/* ─── theme boot · v5 · page ────────────────────────────────────
/* ─── theme boot · v6 · page ────────────────────────────────────
Set the theme before anything paints. Generated from @robertblust/design —
editing it here does nothing, because the next `npm run design` overwrites it.

Expand Down Expand Up @@ -149,13 +149,14 @@
try {
if (window.top !== window && /[?&]embed(&|$)/.test(location.search)) document.documentElement.setAttribute("data-embed", "");
} catch (e) {}
// A conversation the tab keeps open: the keys are chat.js's, `chat` and `chat-size`, read
// the way it reads them. Never in a frame, which takes no chat of its own.
// A conversation the tab keeps open: the keys are chat.js's, `chat` in the tab's storage and
// `chat-size` in the browser's, read the way it reads them. Never in a frame, which takes no
// chat of its own.
try {
var r = document.documentElement, c = JSON.parse(sessionStorage.getItem("chat") || "null");
if (c && c.open && window.top === window) {
r.setAttribute("data-chat-waiting", location.host);
var z = JSON.parse(sessionStorage.getItem("chat-size") || "null");
var z = JSON.parse(localStorage.getItem("chat-size") || "null");
if (z && z.w && z.h) { r.style.setProperty("--rbchat-kept-w", z.w + "px"); r.style.setProperty("--rbchat-kept-h", z.h + "px"); }
}
} catch (e) {}
Expand Down
2 changes: 1 addition & 1 deletion api/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
117e6694f85fc5795148bd09805cb3f3a69ef6cd25aa20698a721405b050dacf
02cbb467db5b72734f7a16c291a325c7600e54d5c9a270bd7fef59d01f3c6f68
9 changes: 5 additions & 4 deletions billing/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</script>

<script>
/* ─── theme boot · v5 · page ────────────────────────────────────
/* ─── theme boot · v6 · page ────────────────────────────────────
Set the theme before anything paints. Generated from @robertblust/design —
editing it here does nothing, because the next `npm run design` overwrites it.

Expand Down Expand Up @@ -149,13 +149,14 @@
try {
if (window.top !== window && /[?&]embed(&|$)/.test(location.search)) document.documentElement.setAttribute("data-embed", "");
} catch (e) {}
// A conversation the tab keeps open: the keys are chat.js's, `chat` and `chat-size`, read
// the way it reads them. Never in a frame, which takes no chat of its own.
// A conversation the tab keeps open: the keys are chat.js's, `chat` in the tab's storage and
// `chat-size` in the browser's, read the way it reads them. Never in a frame, which takes no
// chat of its own.
try {
var r = document.documentElement, c = JSON.parse(sessionStorage.getItem("chat") || "null");
if (c && c.open && window.top === window) {
r.setAttribute("data-chat-waiting", location.host);
var z = JSON.parse(sessionStorage.getItem("chat-size") || "null");
var z = JSON.parse(localStorage.getItem("chat-size") || "null");
if (z && z.w && z.h) { r.style.setProperty("--rbchat-kept-w", z.w + "px"); r.style.setProperty("--rbchat-kept-h", z.h + "px"); }
}
} catch (e) {}
Expand Down
2 changes: 1 addition & 1 deletion billing/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0abf83bfed6898c570db89679b932c97b0ab36ce44d3530517dc335b7a5a9748
0e20ece60c5ce29baca8d8bab674af671d82e1be872f622fafb614cccc114804
41 changes: 26 additions & 15 deletions chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -714,21 +714,22 @@
// rendered, each answer with the entities it cited. Every access is wrapped, because a
// browser with site data blocked throws on the first read and the chat still has to work.
var STORE_KEY = "chat";
// How big the panel is, kept beside the conversation and for the same lifetime: a size is a
// choice about this tab's reading, not a preference to carry to the next visit, and the
// conversation it frames goes when the tab goes. Its own key, because it outlives any one
// conversation: a visitor who sizes the panel, empties it and asks again keeps the size.
// How big the panel is, kept in `localStorage` as `lang` and `theme` are: a size is a choice
// about how this visitor reads the chat on this screen, so it holds in every tab and on the
// next visit, where the conversation it frames goes when its tab goes. Its own key, because it
// is no part of any conversation: a link opened in a new tab finds the panel at the size the
// visitor gave it, with nothing else carried over.
var SIZE_KEY = "chat-size";
var MIN_W = 320, MIN_H = 260, STEP = 24;
function stored(){
try { var raw = sessionStorage.getItem(STORE_KEY); return raw ? JSON.parse(raw) : null; }
catch (e) { return null; }
}
function storedSize(){
try { var raw = sessionStorage.getItem(SIZE_KEY); var v = raw ? JSON.parse(raw) : null; return v && v.w && v.h ? v : null; }
try { var raw = localStorage.getItem(SIZE_KEY); var v = raw ? JSON.parse(raw) : null; return v && v.w && v.h ? v : null; }
catch (e) { return null; }
}
function keepSize(w, h){ try { sessionStorage.setItem(SIZE_KEY, JSON.stringify({ w: w, h: h })); } catch (e) {} }
function keepSize(w, h){ try { localStorage.setItem(SIZE_KEY, JSON.stringify({ w: w, h: h })); } catch (e) {} }

// Where the visitor was reading, kept with the conversation so the back button returns them
// to it and not to the end. A place is a turn and a distance into its bubble, not a pixel
Expand Down Expand Up @@ -1872,9 +1873,10 @@
var introPick = null;
// The question a link carries, waiting: a card the visitor acts on, built from the strings and
// never from markup, so whatever the link says is shown as text. Send hands it to send() as if
// typed, Edit puts it in the input to change, and Discard drops it. Under the notice while the
// intro stands, since that is what the visitor reads first; at the end of a conversation the
// tab already holds, since the intro is then out of sight above it.
// typed, Edit puts it in the input to change, and Discard drops it. It stands right after the
// intro's prompt line, where a question the visitor typed would stand, so the hello, the notice
// and what the panel offers read in the order they always do and the question is the last thing
// in the log; at the end of a conversation the tab already holds, for the same reason.
function askCard(){
var s = strings(langNow()).ask, card = el("div", "rbchat-ask"), row = el("div", "rbchat-ask-row");
card.setAttribute("role", "group"); card.setAttribute("aria-label", s.label);
Expand All @@ -1892,9 +1894,10 @@
askEl = card;
return card;
}
// Wherever the card stands it is the last thing in the log, so the log's end is where it shows.
function showAsk(){
if (!linkAsk || (askEl && askEl.isConnected)) return;
log.appendChild(askCard());
if (!linkAsk) return;
if (!(askEl && askEl.isConnected)) log.appendChild(askCard());
log.scrollTop = log.scrollHeight;
}

Expand All @@ -1919,11 +1922,11 @@
hello.appendChild(el("span", "rbchat-h2", lines[1]));
introEl.appendChild(hello);
notice = el("p", "rbchat-notice"); introEl.appendChild(notice); writeNotice();
if (linkAsk && !messages.length) introEl.appendChild(askCard());
var groups = el("div", "rbchat-groups"); introEl.appendChild(groups);
var promptLine = el("p", "rbchat-prompt-line", "› " + s.prompt + " ");
// The block cursor waits here while the intro plays, and hands over to the command line.
promptLine.appendChild(el("span", "rbchat-cur")); introEl.appendChild(promptLine);
if (linkAsk && !messages.length) introEl.appendChild(askCard());
log.insertBefore(introEl, log.firstChild);
if (!play || still()) finishIntro();
facts(function(f){
Expand Down Expand Up @@ -1956,6 +1959,8 @@
// A restored conversation has moved past the intro: its menus are spent, and the rows a
// number picks stay those of the menu after the last answer.
if (messages.length) spendIntro(); else { menuRows = rows.concat(picked).map(function(r){ return r[0]; }); keysLine(); }
// The menus are drawn above a waiting question and would push it out of sight.
if (askEl && askEl.parentNode === introEl) log.scrollTop = log.scrollHeight;
if (!introEl.classList.contains("rbchat-still")) playIntro();
});
});
Expand Down Expand Up @@ -2080,7 +2085,13 @@
for (var b = 0; b < labels.length; b++) labels[b].textContent = strings(answerLang(turns, langNow())).askNext;
}
// A language switch redraws the intro in the new language, finished, where the log holds one.
if (introEl && log) { var keep_ = log.scrollTop; introEl.parentNode && introEl.parentNode.removeChild(introEl); introEl = null; intro(false); log.scrollTop = keep_; }
// A waiting question is redrawn with it, and the button that held the focus holds it again:
// a page sets its language after the panel has opened, and Enter still has to send.
if (introEl && log) {
var keep_ = log.scrollTop, held = askEl && askEl.contains(document.activeElement) ? Array.prototype.indexOf.call(askEl.querySelectorAll("button"), document.activeElement) : -1;
introEl.parentNode && introEl.parentNode.removeChild(introEl); introEl = null; intro(false); log.scrollTop = keep_;
if (held >= 0 && askEl) askEl.querySelectorAll("button")[held].focus({ preventScroll: true });
}
// The chips standing under an answer are drawn again from the titles they were picked as, so a
// model question reads in the new language and a number key sends what its row now shows.
if (qBox && qPicked && qPicked.length) { var was_ = qPicked.slice(); hideQuestions(); offer(was_); }
Expand Down Expand Up @@ -2111,7 +2122,7 @@
// something to clear: an empty panel shows no control for emptying it. A conversation has no
// length at which it must start over, so this is the only door; its reset takes the turns,
// the log and the tab's copy together; the panel's size stays, being a choice
// about this tab's reading rather than part of the conversation.
// about how the visitor reads rather than part of the conversation.
newBtn = el("button", "rbchat-new"); newBtn.type = "button"; newBtn.hidden = true;
// The glyph is an arrow come back round, not a plus: a plus beside the cross read as "add",
// and what the button does is start over. The note under it names the action for a pointer
Expand Down Expand Up @@ -2206,7 +2217,7 @@
// Double-click gives the stylesheet's size back and forgets the stored one, as the stage's
// gutter does: otherwise the only way back is to drag until it looks right again.
grip.addEventListener("dblclick", function(){
try { sessionStorage.removeItem(SIZE_KEY); } catch (e) {}
try { localStorage.removeItem(SIZE_KEY); } catch (e) {}
unsize();
});
grip.addEventListener("keydown", function(ev){
Expand Down
9 changes: 5 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
</script>

<script>
/* ─── theme boot · v5 · page ────────────────────────────────────
/* ─── theme boot · v6 · page ────────────────────────────────────
Set the theme before anything paints. Generated from @robertblust/design —
editing it here does nothing, because the next `npm run design` overwrites it.

Expand Down Expand Up @@ -151,13 +151,14 @@
try {
if (window.top !== window && /[?&]embed(&|$)/.test(location.search)) document.documentElement.setAttribute("data-embed", "");
} catch (e) {}
// A conversation the tab keeps open: the keys are chat.js's, `chat` and `chat-size`, read
// the way it reads them. Never in a frame, which takes no chat of its own.
// A conversation the tab keeps open: the keys are chat.js's, `chat` in the tab's storage and
// `chat-size` in the browser's, read the way it reads them. Never in a frame, which takes no
// chat of its own.
try {
var r = document.documentElement, c = JSON.parse(sessionStorage.getItem("chat") || "null");
if (c && c.open && window.top === window) {
r.setAttribute("data-chat-waiting", location.host);
var z = JSON.parse(sessionStorage.getItem("chat-size") || "null");
var z = JSON.parse(localStorage.getItem("chat-size") || "null");
if (z && z.w && z.h) { r.style.setProperty("--rbchat-kept-w", z.w + "px"); r.style.setProperty("--rbchat-kept-h", z.h + "px"); }
}
} catch (e) {}
Expand Down
5 changes: 3 additions & 2 deletions model.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"commit": "57707b03bc351f0b5a038ba1167f56b6f8478379",
"commit": "d2efc960525abb769ca51041ad29d32bf51c0bc3",
"core": "0.69.0",
"root": "GuestGraph",
"rootId": "01a0d2e2-f788-788d-ac26-56e9ef94fdd2",
Expand Down Expand Up @@ -13817,8 +13817,9 @@
"fields": {
"id": "01a108de-7c37-7b65-a051-0ca54a5997b0",
"source": "Local",
"mechanism": "session-storage",
"mechanism": "local-storage",
"necessity": "optional",
"duration": "Until the visitor clears it",
"surfaces": [
"chat.guestgraph.io chat"
]
Expand Down
9 changes: 5 additions & 4 deletions model/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</script>

<script>
/* ─── theme boot · v5 · page ────────────────────────────────────
/* ─── theme boot · v6 · page ────────────────────────────────────
Set the theme before anything paints. Generated from @robertblust/design —
editing it here does nothing, because the next `npm run design` overwrites it.

Expand Down Expand Up @@ -149,13 +149,14 @@
try {
if (window.top !== window && /[?&]embed(&|$)/.test(location.search)) document.documentElement.setAttribute("data-embed", "");
} catch (e) {}
// A conversation the tab keeps open: the keys are chat.js's, `chat` and `chat-size`, read
// the way it reads them. Never in a frame, which takes no chat of its own.
// A conversation the tab keeps open: the keys are chat.js's, `chat` in the tab's storage and
// `chat-size` in the browser's, read the way it reads them. Never in a frame, which takes no
// chat of its own.
try {
var r = document.documentElement, c = JSON.parse(sessionStorage.getItem("chat") || "null");
if (c && c.open && window.top === window) {
r.setAttribute("data-chat-waiting", location.host);
var z = JSON.parse(sessionStorage.getItem("chat-size") || "null");
var z = JSON.parse(localStorage.getItem("chat-size") || "null");
if (z && z.w && z.h) { r.style.setProperty("--rbchat-kept-w", z.w + "px"); r.style.setProperty("--rbchat-kept-h", z.h + "px"); }
}
} catch (e) {}
Expand Down
2 changes: 1 addition & 1 deletion model/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
50510204bf2876ed03ba933106ee38c87bbeeb798065f993a8b728b6ea85a650
42a1b3d74a3ae0c49bef54f027e28ab85acd78c908104e68a2c2f0c2f222bb9f
2 changes: 1 addition & 1 deletion og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2dddb6a90e5bf59305e5807bb30c6c356d596d6c999929c0ea431b9de17cbba5
5bcf8837c4e2a0c81533477c7bbd6bf9ce7681e1064b75e1af372aa15f8e97a3
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"pin:check": "node pin-check.mjs"
},
"devDependencies": {
"@robertblust/design": "github:robertblust/design#v0.155.0",
"@robertblust/design": "github:robertblust/design#v0.156.0",
"companygraph-mcp-server": "github:companygraph/mcp-server#v0.69.0",
"pdf-lib": "^1.17.1",
"playwright": "^1.63.0",
Expand Down
11 changes: 6 additions & 5 deletions principles/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
</script>

<script>
/* ─── theme boot · v5 · page ────────────────────────────────────
/* ─── theme boot · v6 · page ────────────────────────────────────
Set the theme before anything paints. Generated from @robertblust/design —
editing it here does nothing, because the next `npm run design` overwrites it.

Expand Down Expand Up @@ -149,13 +149,14 @@
try {
if (window.top !== window && /[?&]embed(&|$)/.test(location.search)) document.documentElement.setAttribute("data-embed", "");
} catch (e) {}
// A conversation the tab keeps open: the keys are chat.js's, `chat` and `chat-size`, read
// the way it reads them. Never in a frame, which takes no chat of its own.
// A conversation the tab keeps open: the keys are chat.js's, `chat` in the tab's storage and
// `chat-size` in the browser's, read the way it reads them. Never in a frame, which takes no
// chat of its own.
try {
var r = document.documentElement, c = JSON.parse(sessionStorage.getItem("chat") || "null");
if (c && c.open && window.top === window) {
r.setAttribute("data-chat-waiting", location.host);
var z = JSON.parse(sessionStorage.getItem("chat-size") || "null");
var z = JSON.parse(localStorage.getItem("chat-size") || "null");
if (z && z.w && z.h) { r.style.setProperty("--rbchat-kept-w", z.w + "px"); r.style.setProperty("--rbchat-kept-h", z.h + "px"); }
}
} catch (e) {}
Expand Down Expand Up @@ -317,7 +318,7 @@ <h3 data-de="Der Kern bleibt offen">The core stays open</h3>
</article>
</section>

<p class="derived" data-de="Erzeugt aus <a href='https://github.com/guestgraph/mental-model'>guestgraph/mental-model</a>@57707b0 – <code class='mono'>model/vision.md</code> und <code class='mono'>model/values/</code>. Dieses Repository ist eine Instanz von <a href='https://companygraph.io/'>CompanyGraph</a>, einem Meta-Modell, das ein Unternehmen als Graph aus Markdown beschreibt.">Generated from <a href="https://github.com/guestgraph/mental-model">guestgraph/mental-model</a>@57707b0 — <code class="mono">model/vision.md</code> and <code class="mono">model/values/</code>. That repository is an instance of <a href="https://companygraph.io/">CompanyGraph</a>, a meta-model for describing a company as a graph of Markdown.</p>
<p class="derived" data-de="Erzeugt aus <a href='https://github.com/guestgraph/mental-model'>guestgraph/mental-model</a>@d2efc96 – <code class='mono'>model/vision.md</code> und <code class='mono'>model/values/</code>. Dieses Repository ist eine Instanz von <a href='https://companygraph.io/'>CompanyGraph</a>, einem Meta-Modell, das ein Unternehmen als Graph aus Markdown beschreibt.">Generated from <a href="https://github.com/guestgraph/mental-model">guestgraph/mental-model</a>@d2efc96 — <code class="mono">model/vision.md</code> and <code class="mono">model/values/</code>. That repository is an instance of <a href="https://companygraph.io/">CompanyGraph</a>, a meta-model for describing a company as a graph of Markdown.</p>
<!-- principles:end -->
</div>
</main>
Expand Down
2 changes: 1 addition & 1 deletion principles/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
534bea22b0571585cbf19f06df9e094760c5011971ceef7d765d57f338d8fe77
5488e06d1a8ea72a2253c6cc5dfd17da50ea6ac6091c3d03544be3d10a135545
Loading
Loading