You can access search results via JSON API by adding format=json
to your query:
https://codesearch.val.run/$1?q=api&page=18&format=json
For typeahead suggestions, use the /typeahead
endpoint:
https://codesearch.val.run/typeahead?q=api
Returns an array of strings in format "username" or "username/projectName"
Found 18893 results for "api"(1135ms)
13- Generate code in TypeScript or TSX
14- Add appropriate TypeScript types and interfaces for all data structures
15- Prefer official SDKs or libraries than writing API calls directly
16- Ask the user to supply API or library documentation if you are at all unsure about it
17- **Never bake in secrets into the code** - always use environment variables
18- Include comments explaining complex logic (avoid commenting obvious operations)
23### 1. HTTP Trigger
2425- Create web APIs and endpoints
26- Handle HTTP requests and responses
27- Example structure:
173However, it's *extremely importing* to note that `parseProject` and other Standard Library utilities ONLY RUN ON THE SERVER.
174If you need access to this data on the client, run it in the server and pass it to the client by splicing it into the HTML page
175or by making an API request for it.
176177## Val Town Platform Specifics
181- **AI Image:** To inline generate an AI image use: `<img src="https://maxm-imggenurl.web.val.run/the-description-of-your-image" />`
182- **Storage:** DO NOT use the Deno KV module for storage
183- **Browser APIs:** DO NOT use the `alert()`, `prompt()`, or `confirm()` methods
184- **Weather Data:** Use open-meteo for weather data (doesn't require API keys) unless otherwise specified
185- **View Source:** Add a view source link by importing & using `import.meta.url.replace("ems.sh", "val.town)"` (or passing this data to the client) and include `target="_top"` attribute
186- **Error Debugging:** Add `<script src="https://esm.town/v/std/catch"></script>` to HTML to capture client-side errors
187- **Error Handling:** Only use try...catch when there's a clear local resolution; Avoid catches that merely log or return 500s. Let errors bubble up with full context
188- **Environment Variables:** Use `Deno.env.get('keyname')` when you need to, but generally prefer APIs that don't require keys
189- **Imports:** Use `https://esm.sh` for npm and Deno dependencies to ensure compatibility on server and browser
190- **Storage Strategy:** Only use backend storage if explicitly required; prefer simple static client-side sites
224### Backend (Hono) Best Practices
225226- Hono is the recommended API framework
227- Main entry point should be `backend/index.ts`
228- **Static asset serving:** Use the utility functions to read and serve project files:
248});
249```
250- Create RESTful API routes for CRUD operations
251- Always include this snippet at the top-level Hono app to re-throwing errors to see full stack traces:
252```ts
285- For files in the project, use `readFile` helpers
2862875. **API Design:**
288- `fetch` handler is the entry point for HTTP vals
289- Run the Hono app with `export default app.fetch // This is the entry point for HTTP vals`
1// --- [SYSTEM PROMPT] Underwriter Task Suggestion ---
2const underwriterTaskSuggestionSystemPromptTemplate = `
3You are an AI assistant for a professional loan underwriter. Your goal is to suggest a comprehensive list of essential underwriting tasks based on the provided loan document package text. These tasks should cover the core pillars of underwriting: Capital, Capacity, Collateral, and Credit. Return your suggestions STRICTLY as a JSON object. The JSON object's keys are category names. Values are arrays of objects, each with "task" (a string describing the task) and "is_high_priority" (boolean). Foundational tasks that are critical for an initial assessment should be marked as "is_high_priority: true".
45Example Categories & Tasks:
6- "Borrower Profile & Capacity": "Calculate the Debt-to-Income (DTI) ratio for all borrowers.", "Verify employment history and income stability.", "Identify all sources of qualifying income."
7- "Asset & Capital Analysis": "Verify and sum all liquid assets for down payment and reserves.", "Identify any large, unusual, or unsourced deposits in bank statements.", "Confirm the source of down payment funds."
8- "Credit & Liability Review": "Identify all listed liabilities and compare against the credit report.", "Flag any undisclosed debts or liabilities found in bank statements.", "Analyze the credit report for derogatory events (late payments, collections, bankruptcies)."
9- "Collateral & Loan Terms": "Extract the property address and appraised value.", "Identify the loan type (e.g., Conventional, FHA, VA), term, and interest rate.", "Verify the Loan-to-Value (LTV) ratio."
175<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
176<style>
177@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
178@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}:root{--sidebar-expanded-width:260px;--sidebar-collapsed-width:70px;--sidebar-transition-duration:0.3s;--brand-color:#1E40AF;--brand-color-light:#3B82F6;--text-dark:#111827;--text-medium:#374151;--text-light:#6B7280;--bg-main:#F9FAFB;--bg-card:#FFFFFF;--border-color:#E5E7EB}body{font-family:'Inter',-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;margin:0;background-color:var(--bg-main);color:var(--text-medium);display:flex;min-height:100vh;font-size:16px;overflow-x:hidden}.app-container{display:flex;width:100%}.sidebar{width:var(--sidebar-expanded-width);background-color:#1F2937;color:#E5E7EB;height:100vh;position:fixed;left:0;top:0;box-shadow:3px 0 10px rgba(0,0,0,.1);display:flex;flex-direction:column;transition:width var(--sidebar-transition-duration) ease-in-out;z-index:100}.sidebar.collapsed{width:var(--sidebar-collapsed-width)}.sidebar.collapsed .sidebar-header h2,.sidebar.collapsed .sidebar-header .tagline,.sidebar.collapsed .nav-item .nav-item-text-main,.sidebar.collapsed .sidebar-footer .footer-text{display:none}.sidebar .nav-item svg{margin-right:12px;width:20px;height:20px;opacity:.8;flex-shrink:0}.sidebar.collapsed .nav-item svg{margin-right:0}.sidebar.collapsed .nav-item{justify-content:center;padding-left:0;padding-right:0}.sidebar-header{text-align:center;padding:0 20px;margin-bottom:25px}.sidebar-header h2{font-size:1.8em;color:var(--brand-color-light);font-weight:600;letter-spacing:.5px;margin:0}.sidebar-header .tagline{font-size:.8em;color:#9CA3AF;margin-top:2px}.hamburger-container{display:flex;align-items:center;justify-content:flex-start;padding:10px 20px;height:40px}.sidebar.collapsed .hamburger-container{justify-content:center;padding:10px 0}.hamburger-menu{display:inline-block;cursor:pointer;background:0 0;border:none;padding:10px;position:relative;width:30px;height:22px;box-sizing:content-box}.hamburger-box{width:30px;height:22px;display:inline-block;position:relative}.hamburger-inner{display:block;top:50%;margin-top:-1px}.hamburger-inner,.hamburger-inner::after,.hamburger-inner::before{width:30px;height:2px;background-color:#e2e8f0;border-radius:4px;position:absolute;transition-property:transform;transition-duration:.15s;transition-timing-function:ease}.hamburger-inner::after,.hamburger-inner::before{content:"";display:block}.hamburger-inner::before{top:-8px}.hamburger-inner::after{bottom:-8px}.sidebar:not(.collapsed) .hamburger-menu .hamburger-inner{transform:rotate(180deg)}.sidebar:not(.collapsed) .hamburger-menu .hamburger-inner::before{transform:translateY(8px) rotate(45deg)}.sidebar:not(.collapsed) .hamburger-menu .hamburger-inner::after{transform:translateY(-8px) rotate(-45deg)}.nav-menu{list-style:none;padding:0;margin:0;flex-grow:1}.nav-item{display:flex;align-items:center;padding:14px 20px;margin-bottom:8px;cursor:pointer;transition:background-color .2s ease,color .2s ease;font-weight:500;white-space:nowrap;position:relative}.nav-item-text-main{transition:opacity .2s ease-in-out}.nav-item-text-hover{display:none}.sidebar.collapsed .nav-item .nav-item-text-main{opacity:0}.nav-item:hover{background-color:#374151;color:#fff}.nav-item.active{background-color:var(--brand-color-light);color:#fff;font-weight:600}.nav-item.active svg{opacity:1}.sidebar.collapsed .nav-item .nav-item-text-hover{position:absolute;left:calc(var(--sidebar-collapsed-width) - 10px);top:50%;transform:translateY(-50%) translateX(-15px) scale(.9);background-color:#374151;color:#fff;padding:10px 15px;border-radius:4px;font-size:.9em;white-space:nowrap;z-index:110;opacity:0;pointer-events:none;transition:opacity .2s ease,transform .2s ease;box-shadow:2px 2px 8px rgba(0,0,0,.2)}.sidebar.collapsed .nav-item:hover .nav-item-text-hover{opacity:1;transform:translateY(-50%) translateX(0) scale(1);pointer-events:auto}.sidebar-footer{font-size:.8em;color:#9CA3AF;text-align:center;padding:15px 20px;border-top:1px solid #374151;white-space:nowrap}.sidebar-footer a{color:#60A5FA;text-decoration:none}.sidebar-footer a:hover{text-decoration:underline}.main-content{margin-left:var(--sidebar-expanded-width);padding:30px 40px;flex-grow:1;overflow-y:auto;transition:margin-left var(--sidebar-transition-duration) ease-in-out;width:calc(100% - var(--sidebar-expanded-width))}.sidebar.collapsed+.main-content{margin-left:var(--sidebar-collapsed-width);width:calc(100% - var(--sidebar-collapsed-width))}.view{display:none;animation:fadeIn .4s ease-out}.view.active-view{display:block}.view>h1{font-size:2.2em;color:var(--text-dark);margin-bottom:25px;border-bottom:2px solid var(--border-color);padding-bottom:15px}.card{background-color:var(--bg-card);border-radius:8px;padding:25px;margin-bottom:25px;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);border:1px solid var(--border-color)}.card h2,.card h3{color:var(--text-dark);margin-top:0;border-bottom:1px solid var(--border-color);padding-bottom:10px;margin-bottom:15px}button,.button{padding:10px 18px;border:none;border-radius:5px;font-size:1rem;font-weight:500;cursor:pointer;transition:background-color .2s ease,transform .1s ease;display:inline-flex;align-items:center;justify-content:center;gap:8px;text-decoration:none}.button-primary{background-color:var(--brand-color);color:#fff}.button-primary:hover{background-color:#1D4ED8;transform:translateY(-1px)}.button-primary:disabled{background-color:#9CA3AF;cursor:not-allowed}.button-primary .spinner{display:none;width:16px;height:16px;border:2px solid hsla(0,0%,100%,.3);border-radius:50%;border-top-color:#fff;animation:spin .8s linear infinite}.button-primary.loading .spinner{display:inline-block}.button-primary.loading span{margin-right:8px}.button-secondary{background-color:#E5E7EB;color:var(--text-dark)}.button-secondary:hover{background-color:#D1D5DB}.button-danger{background-color:#DC2626;color:#fff}.button-danger:hover{background-color:#B91C1C}label{display:block;margin-bottom:8px;font-weight:600;color:var(--text-medium)}input[type=file],input[type=text],textarea,input[type=number]{width:100%;padding:10px;margin-bottom:15px;border:1px solid #D1D5DB;border-radius:4px;font-size:1rem;box-sizing:border-box}input[type=file]{padding:8px;background-color:#F9FAFB}textarea{min-height:100px;resize:vertical}#status-container{margin-top:20px;font-family:monospace;font-size:.9em;line-height:1.4;max-height:250px;overflow-y:auto;padding:10px;border:1px solid var(--border-color);border-radius:4px;background-color:#F9FAFB}.status-entry{margin-bottom:8px;padding:10px 15px;border-radius:4px;white-space:pre-wrap;word-wrap:break-word;animation:fadeIn .3s ease-out;font-size:.95em}.status-entry.info{background-color:#EFF6FF;color:#1E40AF;border-left:4px solid var(--brand-color-light)}.status-entry.error{background-color:#FEF2F2;color:#B91C1C;border-left:4px solid #EF4444;font-weight:700}.status-entry.progress{background-color:#F0FDF4;color:#166534;border-left:4px solid #22C55E}#structured-results-container{margin-top:20px}.result-block{margin-bottom:20px;padding:20px;background-color:#F9FAFB;border:1px solid var(--border-color);border-radius:6px}.result-block h3{margin-top:0;color:var(--text-dark);font-size:1.25em;border-bottom:1px solid var(--border-color);padding-bottom:8px;margin-bottom:12px}.result-block p{margin:6px 0;line-height:1.6}.result-block p strong{color:var(--text-dark);min-width:170px;display:inline-block}.result-block pre{background-color:#F3F4F6;padding:12px;border-radius:4px;white-space:pre-wrap;word-wrap:break-word;font-size:.9em;max-height:280px;overflow-y:auto;border:1px solid #D1D5DB}.loan-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px}.summary-metric{background:#fff;padding:15px;border-radius:6px;border:1px solid var(--border-color)}.summary-metric-label{font-size:.9em;color:var(--text-light);margin-bottom:5px;display:block}.summary-metric-value{font-size:1.5em;font-weight:600;color:var(--text-dark)}.finding-card{border:1px solid #D1D5DB;border-radius:6px;padding:18px;margin-bottom:18px;background-color:var(--bg-card);box-shadow:0 1px 2px rgba(0,0,0,.05);position:relative;overflow:hidden}.finding-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:5px;background-color:#D1D5DB}.finding-card.red-flag::before{background-color:#EF4444}.finding-card.asset-analysis::before{background-color:#22C55E}.finding-card.income-verification::before{background-color:#3B82F6}.finding-card.credit-anomaly::before{background-color:#F97316}.finding-card h4{margin-top:0;margin-bottom:10px;color:var(--text-dark);font-size:1.1em;display:flex;align-items:center;}.finding-card p{font-size:.95em;margin:5px 0}.finding-card p strong{color:var(--text-medium);min-width:140px}.severity-badge{display:inline-block;padding:3px 10px;border-radius:12px;font-size:0.85em;font-weight:600;color:#fff}.severity-badge.high{background-color:#B91C1C}.severity-badge.medium{background-color:#D97706}.severity-badge.low{background-color:#16A34A}.severity-badge.info{background-color:#6B7280}.disclaimer{font-size:.8em;color:var(--text-light);text-align:center;margin-top:12px;padding:8px;background-color:#F3F4F6;border-radius:4px}.history-list{list-style:none;padding:0}.history-item{display:flex;flex-direction:column;padding:20px;margin-bottom:15px;border:1px solid var(--border-color);border-radius:6px;background-color:var(--bg-card);box-shadow:0 1px 2px rgba(0,0,0,.05)}.history-item strong{font-size:1.1em;color:var(--text-dark);margin-bottom:5px;display:block}.history-item .meta{font-size:.9em;color:var(--text-light);margin-bottom:12px}.history-item .actions{margin-top:15px;display:flex;gap:10px;flex-wrap:wrap}.suggestion-group{margin-bottom:15px}.suggestion-group-header{display:flex;align-items:center;margin-bottom:8px;background-color:#F3F4F6;padding:8px 12px;border-radius:4px;cursor:pointer}.suggestion-group-header input[type=checkbox]{margin-right:10px;height:17px;width:17px}.suggestion-group-header label{font-weight:600;font-size:1.05em;color:var(--text-dark);margin-bottom:0;flex-grow:1;cursor:pointer}#iq-suggested-tasks-list{max-height:350px;overflow-y:auto;border:1px solid var(--border-color);padding:10px;border-radius:4px;background-color:#F9FAFB}.suggestion-item-label{display:flex;align-items:center;width:100%;margin-bottom:6px;font-weight:400;padding:10px;border-radius:4px;cursor:pointer;transition:background-color .2s;border:1px solid transparent;background-color:var(--bg-card);box-shadow:0 1px 2px rgba(0,0,0,.05)}.suggestion-item-label:hover{background-color:#F3F4F6}.suggestion-item-label.high-priority-task{border-left:3px solid var(--brand-color-light)}.suggestion-item-label input[type=checkbox]{margin-right:10px;accent-color:var(--brand-color);height:16px;width:16px;flex-shrink:0}.magnifying-glass-loader{display:none;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;background-color:rgba(255,255,255,.8);border-radius:8px;margin-top:20px}.magnifying-glass-loader .glass{width:50px;height:50px;border:5px solid var(--brand-color);border-radius:50%;position:relative;animation:magnify-anim 1.5s infinite linear}.magnifying-glass-loader .handle{width:8px;height:25px;background:var(--brand-color);position:relative;top:-12px;left:25px;transform:rotate(45deg)}.magnifying-glass-loader p{margin-top:25px;font-size:1.1em;font-weight:500;color:var(--text-dark);letter-spacing:.5px}@keyframes magnify-anim{0%{transform:scale(1) rotate(0)}50%{transform:scale(1.2) rotate(180deg)}100%{transform:scale(1) rotate(360deg)}}.lex-wizard-nav{display:flex;justify-content:space-around;margin-bottom:30px;border-bottom:2px solid var(--border-color)}.wizard-step{padding:15px 10px;color:var(--text-light);border-bottom:4px solid transparent;flex-grow:1;text-align:center;font-weight:500;position:relative;transition:color .2s ease,border-color .2s ease}.wizard-step .step-number{display:inline-block;width:24px;height:24px;line-height:24px;border-radius:50%;background-color:var(--text-light);color:#fff;margin-right:8px;transition:background-color .2s ease}.wizard-step .step-label{display:inline-block;vertical-align:middle}.wizard-step.active{color:var(--brand-color);border-bottom-color:var(--brand-color-light);font-weight:600}.wizard-step.active .step-number{background-color:var(--brand-color-light)}.wizard-step.completed{color:var(--text-dark);cursor:pointer}.wizard-step.completed .step-number{background-color:var(--text-dark)}.wizard-step.completed:hover{background-color:#F3F4F6}.wizard-pane{display:none}.wizard-pane.active{display:block;animation:fadeIn .4s ease-out}
179.copilot-card{margin-top:25px;border:1px solid var(--border-color);border-radius:8px;}.copilot-card h3{font-size:1.3em;padding:15px 20px;margin:0;background-color:#F3F4F6;border-bottom:1px solid var(--border-color);}.copilot-content{padding:20px;}.copilot-item{background-color:#fff;padding:15px;border-radius:6px;margin-bottom:15px;border:1px solid var(--border-color);box-shadow:0 1px 2px rgba(0,0,0,.05);}.copilot-item h4{display:flex;align-items:center;gap:10px;font-size:1.1em;margin-top:0;color:var(--text-dark);}.copilot-item p{margin:4px 0;line-height:1.5;}.copilot-item strong{color:var(--text-medium);}.impact-chip{background-color:#E0F2FE;color:#0C4A6E;padding:4px 10px;border-radius:12px;font-size:0.9em;font-weight:500;display:inline-block;margin-top:8px;}
880return JSON.parse(content);
881} catch (error) {
882const errMsg = `AI API Error (${agentName}): ${error.message}`;
883log.push({ agent: agentName, type: "error", message: errMsg });
884console.error(errMsg, error);
885return { error: "AI_API_ERROR", message: errMsg, details: error.toString() };
886}
887}