1import { fetch } from "https://esm.town/v/std/fetch";
2import { OpenAI } from "https://esm.town/v/std/openai";
3import { z } from "npm:zod";
238 try {
239 console.log("Sending to /questionnaire:", payload);
240 const resp = await fetch('/questionnaire', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });
241 setLoading(false); clearErr();
242 if (!resp.ok) {
273 console.log("Sending to /execute:", finalPayload);
274 if (!finalPayload || !finalPayload.task || !finalPayload.data) { throw new Error("Invalid data for execution."); }
275 const resp = await fetch('/execute', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(finalPayload) });
276 setLoading(false);
277 const resData = await resp.json();
135 const lastSunday = today.startOf("week").minus({ days: 1 });
136
137 // Fetch relevant memories using the utility function
138 const memories = await getRelevantMemories();
139
67 const [currentPage, setCurrentPage] = useState(1);
68
69 const fetchMemories = useCallback(async () => {
70 setLoading(true);
71 setError(null);
72 try {
73 const response = await fetch(API_BASE);
74 if (!response.ok) {
75 throw new Error(`HTTP error! status: ${response.status}`);
78 setMemories(data);
79 } catch (e) {
80 console.error("Failed to fetch memories:", e);
81 setError(e.message || "Failed to fetch memories.");
82 } finally {
83 setLoading(false);
86
87 useEffect(() => {
88 fetchMemories();
89 }, [fetchMemories]);
90
91 const handleAddMemory = async (e: React.FormEvent) => {
100
101 try {
102 const response = await fetch(API_BASE, {
103 method: "POST",
104 headers: { "Content-Type": "application/json" },
112 setNewMemoryTags("");
113 setShowAddForm(false);
114 await fetchMemories();
115 } catch (e) {
116 console.error("Failed to add memory:", e);
123
124 try {
125 const response = await fetch(`${API_BASE}/${id}`, {
126 method: "DELETE",
127 });
129 throw new Error(`HTTP error! status: ${response.status}`);
130 }
131 await fetchMemories();
132 } catch (e) {
133 console.error("Failed to delete memory:", e);
155
156 try {
157 const response = await fetch(`${API_BASE}/${editingMemory.id}`, {
158 method: "PUT",
159 headers: { "Content-Type": "application/json" },
164 }
165 setEditingMemory(null);
166 await fetchMemories();
167 } catch (e) {
168 console.error("Failed to update memory:", e);
135 ));
136
137// HTTP vals expect an exported "fetch handler"
138export default app.fetch;
163```
164
1655. **fetchTranspiledJavaScript** - Fetch and transpile TypeScript to JavaScript:
166```ts
167const jsCode = await fetchTranspiledJavaScript("https://esm.town/v/username/project/path/to/file.ts");
168```
169
242
243 // Inject data to avoid extra round-trips
244 const initialData = await fetchInitialData();
245 const dataScript = `<script>
246 window.__INITIAL_DATA__ = ${JSON.stringify(initialData)};
300
3015. **API Design:**
302 - `fetch` handler is the entry point for HTTP vals
303 - Run the Hono app with `export default app.fetch // This is the entry point for HTTP vals`
304 - Properly handle CORS if needed for external access
82 const [cookieAndTeaMode, setCookieAndTeaMode] = useState(false);
83
84 // Fetch images from backend instead of blob storage directly
85 useEffect(() => {
86 // Set default background color in case image doesn't load
89 }
90
91 // Fetch avatar image
92 fetch("/api/images/stevens.jpg")
93 .then((response) => {
94 if (response.ok) return response.blob();
103 });
104
105 // Fetch wood background
106 fetch("/api/images/wood.jpg")
107 .then((response) => {
108 if (response.ok) return response.blob();
129 }, []);
130
131 const fetchMemories = useCallback(async () => {
132 setLoading(true);
133 setError(null);
134 try {
135 const response = await fetch(API_BASE);
136 if (!response.ok) {
137 throw new Error(`HTTP error! status: ${response.status}`);
154 }
155 } catch (e) {
156 console.error("Failed to fetch memories:", e);
157 setError(e.message || "Failed to fetch memories.");
158 } finally {
159 setLoading(false);
162
163 useEffect(() => {
164 fetchMemories();
165 }, [fetchMemories]);
166
167 const handleAddMemory = async (e: React.FormEvent) => {
176
177 try {
178 const response = await fetch(API_BASE, {
179 method: "POST",
180 headers: { "Content-Type": "application/json" },
188 setNewMemoryTags("");
189 setShowAddForm(false);
190 await fetchMemories();
191 } catch (e) {
192 console.error("Failed to add memory:", e);
199
200 try {
201 const response = await fetch(`${API_BASE}/${id}`, {
202 method: "DELETE",
203 });
205 throw new Error(`HTTP error! status: ${response.status}`);
206 }
207 await fetchMemories();
208 } catch (e) {
209 console.error("Failed to delete memory:", e);
231
232 try {
233 const response = await fetch(`${API_BASE}/${editingMemory.id}`, {
234 method: "PUT",
235 headers: { "Content-Type": "application/json" },
240 }
241 setEditingMemory(null);
242 await fetchMemories();
243 } catch (e) {
244 console.error("Failed to update memory:", e);
125 try {
126 // Load the moi.md file content
127 const moiContent = await fetch(new URL('./moi.md', import.meta.url).toString())
128 .then(res => res.text())
129 .catch(() => {
302});
303
304export default app.fetch;
125 try {
126 // Load the moi.md file content
127 const moiContent = await fetch(new URL('./moi.md', import.meta.url).toString())
128 .then(res => res.text())
129 .catch(() => {
302});
303
304export default app.fetch;
1import { fetch } from "https://esm.town/v/std/fetch";
2import { OpenAI } from "https://esm.town/v/std/openai"; // Assuming OpenAI library is available
3import { z } from "npm:zod"; // Using Zod for input validation
173
174 try {
175 const response = await fetch('/generate', {
176 method: 'POST',
177 headers: { 'Content-Type': 'application/json' },
287
288 try {
289 const response = await fetch('/test', {
290 method: 'POST',
291 headers: { 'Content-Type': 'application/json' },
1import { fetch } from "https://esm.town/v/std/fetch";
2import { OpenAI } from "https://esm.town/v/std/openai";
3import { z } from "npm:zod";
87 const setupInForQ = (q) => { clrInArea(); currentQ = q; let inp; const commonEnter = (ev) => { if (ev.key === 'Enter' && !ev.shiftKey) { ev.preventDefault(); sendHandler(); } }; switch (q.type) { case 'select': inp = document.createElement('select'); inp.id = 'user-input'; inp.className = 'form-control'; (q.opts || []).forEach(opt => { const o = document.createElement('option'); o.value = opt.value; o.textContent = opt.label; inp.appendChild(o); }); break; case 'textarea': inp = document.createElement('textarea'); inp.id = 'user-input'; inp.rows = 3; inp.placeholder = "Enter details..."; inp.className = 'form-control'; inp.addEventListener('keypress', commonEnter); break; case 'number': inp = document.createElement('input'); inp.type = 'number'; inp.id = 'user-input'; inp.placeholder = "Enter number..."; if (q.min != null) inp.min = q.min; if (q.max != null) inp.max = q.max; inp.className = 'form-control'; inp.addEventListener('keypress', commonEnter); break; default: inp = document.createElement('input'); inp.type = 'text'; inp.id = 'user-input'; inp.placeholder = "Your answer..."; inp.className = 'form-control'; inp.addEventListener('keypress', commonEnter); break; } const btn = document.createElement('button'); btn.id = 'send-button'; btn.textContent = 'Send'; btn.onclick = sendHandler; inputArea.append(inp, btn); enableInput(true); inp.focus(); };
88 const sendHandler = async () => { const inp = document.getElementById('user-input'); if (!inp || !currentQ) return; let answer = inp.value; if (currentQ.type === 'number') { const num = parseFloat(answer); answer = !isNaN(num) ? num : (answer.trim() === '' ? '' : answer); } clrErr(); let displayAnswer = typeof answer === 'number' ? answer.toString() : answer; if (currentQ.type === 'select') { const opt = Array.from(inp.options).find(o => o.value === answer); displayAnswer = opt ? opt.text : answer; if (answer === "") displayAnswer = "(Skipped)"; } else if (typeof answer === 'string' && !answer.trim() && currentQ.type !== 'textarea') { displayAnswer = "(No input)"; } if (displayAnswer && !["(Skipped)", "(No input)"].includes(displayAnswer)) addUser(displayAnswer); else if (typeof answer === 'string' && !answer.trim() && currentQ.type === 'textarea') addUser("(Empty details)"); const lastAns = { field: currentQ.fld, value: answer }; clrInArea(); enableInput(false); setLoad(true); await sendToSrv({ task: task, sessionId: sid, lastAnswer: lastAns, state: srvState }); };
89 const sendToSrv = async (pld) => { try { console.log("-> /questionnaire:", pld); const resp = await fetch('/questionnaire', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(pld) }); setLoad(false); clrErr(); if (!resp.ok) { let msg = \`Server error: \${resp.status} \${resp.statusText}\`; try { msg += \` - \${(await resp.json()).error || 'Details unavailable'}\` } catch(e){} throw new Error(msg); } const data = await resp.json(); console.log("<- /questionnaire:", data); sid = data.sid; srvState = data.state; if (data.error) { showErr(data.error); if (currentQ) { addBot(\`Issue: \${data.error}. Try again.\`); setupInForQ(currentQ); } else { addBot(\`Error: \${data.error}. Select task again.\`); showTasks(); } return; } if (data.isDone) { addBot("Info gathered. Processing..."); enableInput(false); clrInArea(); setLoad(true); await execWf(data.data); } else if (data.nextQ) { addBot(data.nextQ.txt); setupInForQ(data.nextQ); } else { showErr("Unexpected server response."); enableInput(false); addBot("Something went wrong. Refresh and try again."); } } catch (err) { console.error("Comm error:", err); setLoad(false); showErr(\`Comm error: \${err.message}\`); enableInput(false); addBot("Connection issue. Refresh to start over."); } };
90 const execWf = async (finalPld) => { enableInput(false); try { console.log("-> /execute:", finalPld); if (!finalPld?.task || !finalPld.data) throw new Error("Invalid execution payload."); const resp = await fetch('/execute', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(finalPld) }); setLoad(false); const resData = await resp.json(); console.log("<- /execute:", resData); resDisp.style.display = 'block'; setTimeout(() => resDisp.classList.add('visible'), 10); resCont.innerHTML = ''; logCont.innerHTML = ''; if (!resp.ok || resData.error) { const msg = resData.error || \`Exec failed: Status \${resp.status}\`; resCont.innerHTML = \`<div class="error-message">\${esc(msg)}</div>\`; if(resData.dtls) resCont.innerHTML += \`<p>Details: \${esc(typeof resData.dtls === 'string' ? resData.dtls : JSON.stringify(resData.dtls))}</p>\`; addBot(\`Error processing request: \${esc(msg)}\`); } else { resCont.innerHTML = fmtRes(resData.result, finalPld.task); addBot("Request complete! See results."); } logCont.innerHTML = fmtLogs(resData.logs); clrInArea(); showTasks(); } catch (err) { console.error("Exec error:", err); setLoad(false); resDisp.style.display = 'block'; setTimeout(() => resDisp.classList.add('visible'), 10); resCont.innerHTML = \`<div class="error-message">Execution failed: \${esc(err.message)}</div>\`; logCont.innerHTML = fmtLogs(null); addBot("Critical error during execution. Check logs or retry."); clrInArea(); showTasks(); } };
91 const fmtList = (items, tag='li') => items && items.length > 0 ? \`<ul>\${items.map(i => \`<$\{tag\}>\${esc(i)}</\$\{tag\}>\`).join('')}</ul>\` : '';
92 const fmtDictList = (items) => items && items.length > 0 ? \`<ul>\${items.map(d => \`<li><strong>\${esc(d.dx || d.diagnosis)}</strong>\${(d.rationale) ? \`: \${esc(d.rationale)}\` : ''}</li>\`).join('')}</ul>\` : '';