diff --git a/client/main.tsx b/client/main.tsx
index d813fef..a5b37e4 100644
--- a/client/main.tsx
+++ b/client/main.tsx
@@ -71,7 +71,7 @@ function conversationUI(id: string) {
const form = (
);
const input = form.querySelector("input")!;
diff --git a/client/web/dist/main.js b/client/web/dist/main.js
index 8d9426c..733f2cd 100644
--- a/client/web/dist/main.js
+++ b/client/web/dist/main.js
@@ -72,7 +72,9 @@ function conversationUI(id) {
if (typeof event.data !== "string") return;
const message = JSON.parse(event.data);
const scrolledToBottom = chatlog.scrollTop + 16 >= chatlog.scrollHeight - chatlog.clientHeight;
- if ("u" in message) {
+ if ("i" in message) {
+ window.history.replaceState(null, "", "#" + message.i);
+ } else if ("u" in message) {
chatlog.append(/* @__PURE__ */ jsx("article", { className: "user", children: message.u }));
} else if ("f" in message) {
chatlog.append(/* @__PURE__ */ jsx("article", { className: "assistant", children: message.f }));
@@ -88,7 +90,7 @@ function conversationUI(id) {
}
if (scrolledToBottom) chatlog.scrollTop = chatlog.scrollHeight - chatlog.clientHeight;
});
- const form = /* @__PURE__ */ jsx("form", { children: /* @__PURE__ */ jsx("input", { type: "text", required: true }) });
+ const form = /* @__PURE__ */ jsx("form", { children: /* @__PURE__ */ jsx("input", { type: "text", placeholder: "Enter a prompt\u2026", required: true }) });
const input = form.querySelector("input");
form.addEventListener("submit", (e) => {
e.preventDefault();
diff --git a/client/web/dist/main.js.map b/client/web/dist/main.js.map
index 66792dc..d2d6b79 100644
--- a/client/web/dist/main.js.map
+++ b/client/web/dist/main.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
"sources": ["https://jsr.io/@char/aftercare/0.2.0/src/elem.ts", "https://jsr.io/@char/aftercare/0.2.0/src/jsx.ts", "../../main.tsx"],
- "sourcesContent": ["type GenericElement = HTMLElement | SVGElement;\n\ntype IsNullish = [T] extends [null] ? true : [T] extends [undefined] ? true : false;\ntype IsFunctionIsh =\n IsNullish extends true\n ? false\n : // deno-lint-ignore ban-types\n T extends Function | null | undefined\n ? true\n : false;\n\nexport type ElementProps = {\n [K in keyof E as IsFunctionIsh extends true ? never : K]?: E[K];\n};\n\nexport interface ElementExtras {\n classList?: string[];\n dataset?: Partial>;\n /** extra function to run on the element */\n _tap?: (elem: E) => void;\n}\n\nexport type TagName = keyof HTMLElementTagNameMap;\nexport type CustomTagType = new () => T;\nexport type ElementType = T extends TagName\n ? HTMLElementTagNameMap[T]\n : T extends CustomTagType\n ? E\n : never;\n\nexport function elem(\n tag: T,\n attrs: ElementProps> = {},\n children: (Element | string | Text)[] = [],\n extras: ElementExtras> = {},\n): ElementType {\n const element = typeof tag === \"string\" ? document.createElement(tag) : new tag();\n\n Object.assign(\n element,\n Object.fromEntries(Object.entries(attrs).filter(([_k, v]) => v !== undefined)),\n );\n\n if (extras.classList) extras.classList.forEach(c => element.classList.add(c));\n if (extras.dataset && (element instanceof HTMLElement || element instanceof SVGElement))\n Object.entries(extras.dataset)\n .filter(([_k, v]) => v !== undefined)\n .forEach(([k, v]) => (element.dataset[k] = v));\n\n const childNodes = children.map(e =>\n typeof e === \"string\" ? document.createTextNode(e) : e,\n );\n element.append(...childNodes);\n\n if (extras._tap) extras._tap(element as ElementType);\n\n return element as ElementType;\n}\n\nexport function rewrite(element: Element, children: (Element | string | Text)[] = []) {\n element.innerHTML = \"\";\n const nodes = children.map(e => (typeof e === \"string\" ? document.createTextNode(e) : e));\n element.append(...nodes);\n}\n", "import {\n type CustomTagType,\n elem,\n type ElementExtras,\n type ElementProps,\n type ElementType,\n type TagName,\n} from \"./elem.ts\";\n\n// deno-lint-ignore no-namespace\nnamespace JSX {\n export type Element = HTMLElement | SVGElement;\n export type IntrinsicElements = {\n [K in TagName]: Omit>, \"children\"> & {\n children?: JSX.Element | JSX.Element[] | undefined;\n } & Partial>>;\n };\n}\n\nfunction Fragment(props: Record, _key?: string): never {\n return jsx(undefined, props, _key) as never;\n}\n\nfunction jsx(\n tag: T | undefined,\n props: Record,\n _key?: string,\n): ElementType {\n if (tag === undefined) {\n throw new Error(\"fragments are not supported\");\n }\n\n const { children = [], classList, dataset, _tap, ...attrs } = props;\n const childrenArray = Array.isArray(children) ? children : [children];\n const extras = { classList, dataset, _tap } as ElementExtras>;\n return elem(tag, attrs as ElementProps>, childrenArray, extras);\n}\n\nexport { Fragment, jsx, jsx as jsxDEV, jsx as jsxs };\nexport type { JSX };\n", "const main = document.querySelector(\"main\")!;\n\nasync function nav() {\n const nav = ;\n\n const conversations = await fetch(\"/api/conversation\").then(r => r.json());\n for (const conversation of conversations) {\n const button = ;\n button.addEventListener(\"click\", e => {\n e.preventDefault();\n\n main.append(conversationUI(conversation.id));\n nav.remove();\n });\n\n nav.append(button);\n }\n\n nav.append(\n ,\n );\n\n return nav;\n}\n\nfunction conversationUI(id: string) {\n window.location.hash = `#${id}`;\n\n const socket = new WebSocket(`/api/conversation/${id}/connect`);\n\n const chatlog = ;\n const inFlightMessages = new Map();\n\n socket.addEventListener(\"message\", event => {\n if (typeof event.data !== \"string\") return;\n const message = JSON.parse(event.data);\n\n const scrolledToBottom =\n chatlog.scrollTop + 16 >= chatlog.scrollHeight - chatlog.clientHeight;\n\n if (\"u\" in message) {\n chatlog.append({message.u});\n } else if (\"f\" in message) {\n chatlog.append({message.f});\n } else if (\"s\" in message) {\n const article = ;\n inFlightMessages.set(message.s, article);\n chatlog.append(article);\n } else if (\"r\" in message && \"c\" in message) {\n const article = inFlightMessages.get(message.r)!;\n article.append(message.c);\n } else if (\"d\" in message) {\n inFlightMessages.delete(message.d);\n }\n\n if (scrolledToBottom) chatlog.scrollTop = chatlog.scrollHeight - chatlog.clientHeight;\n });\n\n const form = (\n \n );\n const input = form.querySelector(\"input\")!;\n form.addEventListener(\"submit\", e => {\n e.preventDefault();\n socket.send(input.value);\n input.value = \"\";\n });\n\n return (\n \n );\n}\n\nconst showUI = async () => {\n main.innerHTML = \"\";\n\n if (window.location.hash) {\n main.append(conversationUI(window.location.hash.substring(1)));\n } else {\n main.append(await nav());\n }\n};\n\nawait showUI();\nwindow.addEventListener(\"hashchange\", async () => {\n await showUI();\n});\n"],
- "mappings": "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",
+ "sourcesContent": ["type GenericElement = HTMLElement | SVGElement;\n\ntype IsNullish = [T] extends [null] ? true : [T] extends [undefined] ? true : false;\ntype IsFunctionIsh =\n IsNullish extends true\n ? false\n : // deno-lint-ignore ban-types\n T extends Function | null | undefined\n ? true\n : false;\n\nexport type ElementProps = {\n [K in keyof E as IsFunctionIsh extends true ? never : K]?: E[K];\n};\n\nexport interface ElementExtras {\n classList?: string[];\n dataset?: Partial>;\n /** extra function to run on the element */\n _tap?: (elem: E) => void;\n}\n\nexport type TagName = keyof HTMLElementTagNameMap;\nexport type CustomTagType = new () => T;\nexport type ElementType = T extends TagName\n ? HTMLElementTagNameMap[T]\n : T extends CustomTagType\n ? E\n : never;\n\nexport function elem(\n tag: T,\n attrs: ElementProps> = {},\n children: (Element | string | Text)[] = [],\n extras: ElementExtras> = {},\n): ElementType {\n const element = typeof tag === \"string\" ? document.createElement(tag) : new tag();\n\n Object.assign(\n element,\n Object.fromEntries(Object.entries(attrs).filter(([_k, v]) => v !== undefined)),\n );\n\n if (extras.classList) extras.classList.forEach(c => element.classList.add(c));\n if (extras.dataset && (element instanceof HTMLElement || element instanceof SVGElement))\n Object.entries(extras.dataset)\n .filter(([_k, v]) => v !== undefined)\n .forEach(([k, v]) => (element.dataset[k] = v));\n\n const childNodes = children.map(e =>\n typeof e === \"string\" ? document.createTextNode(e) : e,\n );\n element.append(...childNodes);\n\n if (extras._tap) extras._tap(element as ElementType);\n\n return element as ElementType;\n}\n\nexport function rewrite(element: Element, children: (Element | string | Text)[] = []) {\n element.innerHTML = \"\";\n const nodes = children.map(e => (typeof e === \"string\" ? document.createTextNode(e) : e));\n element.append(...nodes);\n}\n", "import {\n type CustomTagType,\n elem,\n type ElementExtras,\n type ElementProps,\n type ElementType,\n type TagName,\n} from \"./elem.ts\";\n\n// deno-lint-ignore no-namespace\nnamespace JSX {\n export type Element = HTMLElement | SVGElement;\n export type IntrinsicElements = {\n [K in TagName]: Omit>, \"children\"> & {\n children?: JSX.Element | JSX.Element[] | undefined;\n } & Partial>>;\n };\n}\n\nfunction Fragment(props: Record, _key?: string): never {\n return jsx(undefined, props, _key) as never;\n}\n\nfunction jsx(\n tag: T | undefined,\n props: Record,\n _key?: string,\n): ElementType {\n if (tag === undefined) {\n throw new Error(\"fragments are not supported\");\n }\n\n const { children = [], classList, dataset, _tap, ...attrs } = props;\n const childrenArray = Array.isArray(children) ? children : [children];\n const extras = { classList, dataset, _tap } as ElementExtras>;\n return elem(tag, attrs as ElementProps>, childrenArray, extras);\n}\n\nexport { Fragment, jsx, jsx as jsxDEV, jsx as jsxs };\nexport type { JSX };\n", "const main = document.querySelector(\"main\")!;\n\nasync function nav() {\n const nav = ;\n\n const conversations = await fetch(\"/api/conversation\").then(r => r.json());\n for (const conversation of conversations) {\n const button = ;\n button.addEventListener(\"click\", e => {\n e.preventDefault();\n\n main.append(conversationUI(conversation.id));\n nav.remove();\n });\n\n nav.append(button);\n }\n\n nav.append(\n ,\n );\n\n return nav;\n}\n\nfunction conversationUI(id: string) {\n window.location.hash = `#${id}`;\n\n const socket = new WebSocket(`/api/conversation/${id}/connect`);\n\n const chatlog = ;\n const inFlightMessages = new Map();\n\n socket.addEventListener(\"message\", event => {\n if (typeof event.data !== \"string\") return;\n const message = JSON.parse(event.data);\n\n const scrolledToBottom =\n chatlog.scrollTop + 16 >= chatlog.scrollHeight - chatlog.clientHeight;\n\n if (\"i\" in message) {\n window.history.replaceState(null, \"\", \"#\" + message.i);\n } else if (\"u\" in message) {\n chatlog.append({message.u});\n } else if (\"f\" in message) {\n chatlog.append({message.f});\n } else if (\"s\" in message) {\n const article = ;\n inFlightMessages.set(message.s, article);\n chatlog.append(article);\n } else if (\"r\" in message && \"c\" in message) {\n const article = inFlightMessages.get(message.r)!;\n article.append(message.c);\n } else if (\"d\" in message) {\n inFlightMessages.delete(message.d);\n }\n\n if (scrolledToBottom) chatlog.scrollTop = chatlog.scrollHeight - chatlog.clientHeight;\n });\n\n const form = (\n \n );\n const input = form.querySelector(\"input\")!;\n form.addEventListener(\"submit\", e => {\n e.preventDefault();\n socket.send(input.value);\n input.value = \"\";\n });\n\n return (\n \n );\n}\n\nconst showUI = async () => {\n main.innerHTML = \"\";\n\n if (window.location.hash) {\n main.append(conversationUI(window.location.hash.substring(1)));\n } else {\n main.append(await nav());\n }\n};\n\nawait showUI();\nwindow.addEventListener(\"hashchange\", async () => {\n await showUI();\n});\n"],
+ "mappings": "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",
"names": ["nav"]
}