@absolutejs/absolute 0.19.0-beta.226 → 0.19.0-beta.228

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.
Files changed (75) hide show
  1. package/.absolutejs/eslint-cache +1 -0
  2. package/.absolutejs/prettier.cache.json +42 -19
  3. package/.absolutejs/vue-tsc.tsbuildinfo +1 -1
  4. package/.claude/settings.local.json +2 -1
  5. package/ROADMAP.md +0 -25
  6. package/dist/{Image-y5bdvj57.vue → Image-b3r6hxqk.vue} +6 -1
  7. package/dist/ai/index.js +529 -0
  8. package/dist/ai/index.js.map +13 -0
  9. package/dist/ai/providers/anthropic.js +396 -0
  10. package/dist/ai/providers/anthropic.js.map +10 -0
  11. package/dist/ai/providers/ollama.js +233 -0
  12. package/dist/ai/providers/ollama.js.map +10 -0
  13. package/dist/ai/providers/openai.js +355 -0
  14. package/dist/ai/providers/openai.js.map +10 -0
  15. package/dist/ai-client/angular/ai/index.js +532 -0
  16. package/dist/ai-client/react/ai/index.js +499 -0
  17. package/dist/ai-client/vue/ai/index.js +460 -0
  18. package/dist/angular/ai/index.js +668 -0
  19. package/dist/angular/ai/index.js.map +15 -0
  20. package/dist/angular/components/image.component.js +1 -1
  21. package/dist/angular/index.js +11 -1
  22. package/dist/angular/index.js.map +3 -3
  23. package/dist/build.js +48 -2
  24. package/dist/build.js.map +4 -4
  25. package/dist/index.js +50 -2
  26. package/dist/index.js.map +6 -6
  27. package/dist/react/ai/index.js +635 -0
  28. package/dist/react/ai/index.js.map +16 -0
  29. package/dist/react/components/index.js +11 -1
  30. package/dist/react/components/index.js.map +2 -2
  31. package/dist/react/hooks/index.js +11 -1
  32. package/dist/react/hooks/index.js.map +2 -2
  33. package/dist/react/index.js +11 -1
  34. package/dist/react/index.js.map +3 -3
  35. package/dist/src/ai/client/actions.d.ts +46 -0
  36. package/dist/src/ai/client/connection.d.ts +9 -0
  37. package/dist/src/ai/client/messageStore.d.ts +12 -0
  38. package/dist/src/ai/conversationManager.d.ts +11 -0
  39. package/dist/src/ai/index.d.ts +3 -0
  40. package/dist/src/ai/protocol.d.ts +4 -0
  41. package/dist/src/ai/providers/anthropic.d.ts +3 -0
  42. package/dist/src/ai/providers/ollama.d.ts +6 -0
  43. package/dist/src/ai/providers/openai.d.ts +7 -0
  44. package/dist/src/ai/streamAI.d.ts +2 -0
  45. package/dist/src/angular/ai/ai-stream.service.d.ts +15 -0
  46. package/dist/src/angular/ai/index.d.ts +1 -0
  47. package/dist/src/react/ai/AIStreamProvider.d.ts +13 -0
  48. package/dist/src/react/ai/index.d.ts +2 -0
  49. package/dist/src/react/ai/useAIStream.d.ts +8 -0
  50. package/dist/src/svelte/ai/createAIStream.d.ts +10 -0
  51. package/dist/src/svelte/ai/index.d.ts +1 -0
  52. package/dist/src/vue/ai/index.d.ts +1 -0
  53. package/dist/src/vue/ai/useAIStream.d.ts +22 -0
  54. package/dist/svelte/ai/index.js +590 -0
  55. package/dist/svelte/ai/index.js.map +15 -0
  56. package/dist/svelte/components/Image.svelte +6 -1
  57. package/dist/svelte/index.js +11 -1
  58. package/dist/svelte/index.js.map +3 -3
  59. package/dist/types/ai.d.ts +188 -0
  60. package/dist/types/anthropic.d.ts +18 -0
  61. package/dist/types/index.d.ts +1 -0
  62. package/dist/types/typeGuards.d.ts +3 -0
  63. package/dist/vue/ai/index.js +596 -0
  64. package/dist/vue/ai/index.js.map +15 -0
  65. package/dist/vue/components/Image.vue +6 -1
  66. package/dist/vue/components/index.js +12 -2
  67. package/dist/vue/components/index.js.map +1 -1
  68. package/dist/vue/index.js +11 -1
  69. package/dist/vue/index.js.map +3 -3
  70. package/package.json +36 -1
  71. package/scripts/build.ts +33 -0
  72. package/types/ai.ts +235 -0
  73. package/types/anthropic.ts +17 -0
  74. package/types/index.ts +1 -0
  75. package/types/typeGuards.ts +72 -1
@@ -61,14 +61,24 @@ var __export = (target, all) => {
61
61
  set: __exportSetter.bind(all, name)
62
62
  });
63
63
  };
64
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
65
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
66
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
67
+ r = Reflect.decorate(decorators, target, key, desc);
68
+ else
69
+ for (var i = decorators.length - 1;i >= 0; i--)
70
+ if (d = decorators[i])
71
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
72
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
73
+ };
64
74
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
65
75
  var __require = import.meta.require;
66
76
 
67
77
  // src/vue/components/Image.vue
68
- var Image_default = "../../Image-y5bdvj57.vue";
78
+ var Image_default = "../../Image-b3r6hxqk.vue";
69
79
  export {
70
80
  Image_default as Image
71
81
  };
72
82
 
73
- //# debugId=E2108018C2BEE3EE64756E2164756E21
83
+ //# debugId=2637FFD98D31F52864756E2164756E21
74
84
  //# sourceMappingURL=index.js.map
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "E2108018C2BEE3EE64756E2164756E21",
7
+ "debugId": "2637FFD98D31F52864756E2164756E21",
8
8
  "names": []
9
9
  }
package/dist/vue/index.js CHANGED
@@ -61,6 +61,16 @@ var __export = (target, all) => {
61
61
  set: __exportSetter.bind(all, name)
62
62
  });
63
63
  };
64
+ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
65
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
66
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
67
+ r = Reflect.decorate(decorators, target, key, desc);
68
+ else
69
+ for (var i = decorators.length - 1;i >= 0; i--)
70
+ if (d = decorators[i])
71
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
72
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
73
+ };
64
74
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
65
75
  var __require = import.meta.require;
66
76
 
@@ -362,5 +372,5 @@ export {
362
372
  handleVuePageRequest
363
373
  };
364
374
 
365
- //# debugId=4A22AD08D929C19064756E2164756E21
375
+ //# debugId=9B7951B8122AD1EC64756E2164756E21
366
376
  //# sourceMappingURL=index.js.map
@@ -4,11 +4,11 @@
4
4
  "sourcesContent": [
5
5
  "export const ssrErrorPage = (framework: string, error: unknown) => {\n\tconst frameworkColors: Record<string, string> = {\n\t\tangular: '#dd0031',\n\t\thtml: '#e34c26',\n\t\thtmx: '#1a365d',\n\t\treact: '#61dafb',\n\t\tsvelte: '#ff3e00',\n\t\tvue: '#42b883'\n\t};\n\n\tconst accent = frameworkColors[framework] ?? '#94a3b8';\n\tconst label = framework.charAt(0).toUpperCase() + framework.slice(1);\n\tconst message = error instanceof Error ? error.message : String(error);\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>SSR Error - AbsoluteJS</title>\n<style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,rgba(30,41,59,0.98) 100%);color:#e2e8f0;font-family:\"JetBrains Mono\",\"Fira Code\",ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;line-height:1.6;display:flex;align-items:flex-start;justify-content:center;padding:32px}\n.card{max-width:720px;width:100%;background:rgba(30,41,59,0.6);border:1px solid rgba(71,85,105,0.5);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5),0 0 0 1px rgba(255,255,255,0.05);overflow:hidden}\n.header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px;background:rgba(15,23,42,0.5);border-bottom:1px solid rgba(71,85,105,0.4)}\n.brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}\n.badge{padding:5px 10px;border-radius:8px;font-size:12px;font-weight:600;background:${accent};color:#fff;opacity:0.95;box-shadow:0 2px 4px rgba(0,0,0,0.2)}\n.kind{color:#94a3b8;font-size:13px;font-weight:500}\n.content{padding:24px}\n.label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}\n.message{margin:0;padding:16px 20px;background:rgba(239,68,68,0.12);border:1px solid rgba(239,68,68,0.25);border-radius:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;color:#fca5a5;font-size:13px;line-height:1.5}\n.hint{margin-top:20px;padding:12px 20px;background:rgba(71,85,105,0.3);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:13px}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<div class=\"header\">\n<div style=\"display:flex;align-items:center;gap:12px\">\n<span class=\"brand\">AbsoluteJS</span>\n<span class=\"badge\">${label}</span>\n</div>\n<span class=\"kind\">Server Render Error</span>\n</div>\n<div class=\"content\">\n<div class=\"label\">What went wrong</div>\n<pre class=\"message\">${message.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')}</pre>\n<div class=\"hint\">A component threw during server-side rendering. Check the terminal for the full stack trace.</div>\n</div>\n</div>\n</body>\n</html>`;\n};\n",
6
6
  "const normalizeSlug = (str: string) =>\n\tstr\n\t\t.trim()\n\t\t.replace(/\\s+/g, '-')\n\t\t.replace(/[^A-Za-z0-9\\-_]+/g, '')\n\t\t.replace(/[-_]{2,}/g, '-');\n\nexport const toKebab = (str: string) =>\n\tnormalizeSlug(str)\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t.toLowerCase();\nexport const toPascal = (str: string) => {\n\tif (!str.includes('-') && !str.includes('_')) {\n\t\treturn str.charAt(0).toUpperCase() + str.slice(1);\n\t}\n\n\treturn normalizeSlug(str)\n\t\t.split(/[-_]/)\n\t\t.filter(Boolean)\n\t\t.map(\n\t\t\t(segment) =>\n\t\t\t\tsegment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()\n\t\t)\n\t\t.join('');\n};\nexport const toScreamingSnake = (str: string) =>\n\tstr.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase();\n",
7
- "import { basename } from 'node:path';\nimport type { ConventionsMap } from '../../types/conventions';\nimport { toPascal } from './stringModifiers';\n\n// Use globalThis so the conventions map is shared across all bundles.\n// The main bundle (dist/index.js) calls setConventions, but framework\n// bundles (dist/svelte/index.js, etc.) need to read the same map.\nconst CONVENTIONS_KEY = '__absoluteConventions';\n\nconst getMap = (): ConventionsMap =>\n\t(globalThis as Record<string, unknown>)[CONVENTIONS_KEY] as ConventionsMap ?? {};\n\nexport const setConventions = (map: ConventionsMap) => {\n\t(globalThis as Record<string, unknown>)[CONVENTIONS_KEY] = map;\n};\n\nexport const getConventions = () => getMap();\n\nexport const resolveErrorConventionPath = (\n\tframework: keyof ConventionsMap,\n\tpageName: string\n) => {\n\tconst fw = getMap()[framework];\n\tif (!fw) return undefined;\n\n\treturn fw.pages?.[pageName]?.error ?? fw.defaults?.error;\n};\n\nexport const resolveNotFoundConventionPath = (\n\tframework: keyof ConventionsMap\n) => getMap()[framework]?.defaults?.notFound;\n\n/**\n * Derive a PascalCase page name from a compiled server path.\n * Example: \"/build/svelte/pages/SvelteExample.abc123.js\" → \"SvelteExample\"\n */\nexport const derivePageName = (pagePath: string) => {\n\tconst base = basename(pagePath);\n\t// Strip hash and extension: \"SvelteExample.abc123.js\" → \"SvelteExample\"\n\tconst dotIndex = base.indexOf('.');\n\tconst name = dotIndex > 0 ? base.slice(0, dotIndex) : base;\n\n\treturn toPascal(name);\n};\n\nconst isDev = () => process.env.NODE_ENV === 'development';\n\nconst buildErrorProps = (error: unknown) => {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconst stack = isDev() && error instanceof Error ? error.stack : undefined;\n\n\treturn { error: { message, stack } };\n};\n\nexport const renderConventionError = async (\n\tframework: keyof ConventionsMap,\n\tpageName: string,\n\terror: unknown\n) => {\n\tconst conventionPath = resolveErrorConventionPath(framework, pageName);\n\tif (!conventionPath) return null;\n\n\tconst errorProps = buildErrorProps(error);\n\n\ttry {\n\t\tif (framework === 'react') {\n\t\t\tconst { createElement } = await import('react');\n\t\t\tconst { renderToReadableStream } = await import(\n\t\t\t\t'react-dom/server'\n\t\t\t);\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst firstKey = Object.keys(mod)[0];\n\t\t\tconst ErrorComponent = mod.default ?? (firstKey ? mod[firstKey] : undefined);\n\t\t\tconst element = createElement(ErrorComponent, errorProps);\n\t\t\tconst stream = await renderToReadableStream(element);\n\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'svelte') {\n\t\t\tconst { render } = await import('svelte/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst ErrorComponent = mod.default;\n\t\t\tconst { head, body } = render(ErrorComponent, {\n\t\t\t\tprops: errorProps\n\t\t\t});\n\t\t\tconst html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'vue') {\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToString } = await import('vue/server-renderer');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst ErrorComponent = mod.default;\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(ErrorComponent, errorProps)\n\t\t\t});\n\t\t\tlet body = await renderToString(app);\n\n\t\t\t// Vue SSR escapes quotes inside <component is=\"style\"> tags.\n\t\t\t// Extract style content, unescape it, and move to <head>.\n\t\t\tlet styles = '';\n\t\t\tbody = body.replace(\n\t\t\t\t/<style>([\\s\\S]*?)<\\/style>/g,\n\t\t\t\t(_, css: string) => {\n\t\t\t\t\tstyles += `<style>${css.replace(/&quot;/g, '\"').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')}</style>`;\n\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${styles}</head><body><div id=\"root\">${body}</div></body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'angular') {\n\t\t\t// Angular error pages are rendered as plain HTML templates\n\t\t\t// since the full Angular SSR pipeline is too heavy for error pages\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst renderError = mod.default ?? mod.renderError;\n\t\t\tif (typeof renderError === 'function') {\n\t\t\t\tconst html = renderError(errorProps);\n\n\t\t\t\treturn new Response(html, {\n\t\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\t\tstatus: 500\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (renderError) {\n\t\tconst message =\n\t\t\trenderError instanceof Error ? renderError.message : '';\n\t\tif (\n\t\t\tmessage.includes('Cannot find module') ||\n\t\t\tmessage.includes('Cannot find package') ||\n\t\t\tmessage.includes('not found in module')\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Convention error page for ${framework} failed: missing framework package. ` +\n\t\t\t\t\t`Ensure the ${framework} runtime is installed (e.g. bun add ${framework === 'react' ? 'react react-dom' : framework}).`\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Failed to render ${framework} convention error page:`,\n\t\t\t\trenderError\n\t\t\t);\n\t\t}\n\t}\n\n\treturn null;\n};\n\nexport const renderConventionNotFound = async (\n\tframework: keyof ConventionsMap\n) => {\n\tconst conventionPath = resolveNotFoundConventionPath(framework);\n\tif (!conventionPath) return null;\n\n\ttry {\n\t\tif (framework === 'react') {\n\t\t\tconst { createElement } = await import('react');\n\t\t\tconst { renderToReadableStream } = await import(\n\t\t\t\t'react-dom/server'\n\t\t\t);\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst nfKey = Object.keys(mod)[0];\n\t\t\tconst NotFoundComponent =\n\t\t\t\tmod.default ?? (nfKey ? mod[nfKey] : undefined);\n\t\t\tconst element = createElement(NotFoundComponent);\n\t\t\tconst stream = await renderToReadableStream(element);\n\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'svelte') {\n\t\t\tconst { render } = await import('svelte/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst NotFoundComponent = mod.default;\n\t\t\tconst { head, body } = render(NotFoundComponent);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'vue') {\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToString } = await import('vue/server-renderer');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst NotFoundComponent = mod.default;\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(NotFoundComponent)\n\t\t\t});\n\t\t\tlet body = await renderToString(app);\n\n\t\t\tlet styles = '';\n\t\t\tbody = body.replace(\n\t\t\t\t/<style>([\\s\\S]*?)<\\/style>/g,\n\t\t\t\t(_, css: string) => {\n\t\t\t\t\tstyles += `<style>${css.replace(/&quot;/g, '\"').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')}</style>`;\n\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${styles}</head><body><div id=\"root\">${body}</div></body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'angular') {\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst renderNotFound = mod.default ?? mod.renderNotFound;\n\t\t\tif (typeof renderNotFound === 'function') {\n\t\t\t\tconst html = renderNotFound();\n\n\t\t\t\treturn new Response(html, {\n\t\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\t\tstatus: 404\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (renderError) {\n\t\tconst message =\n\t\t\trenderError instanceof Error ? renderError.message : '';\n\t\tif (\n\t\t\tmessage.includes('Cannot find module') ||\n\t\t\tmessage.includes('Cannot find package') ||\n\t\t\tmessage.includes('not found in module')\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Convention not-found page for ${framework} failed: missing framework package. ` +\n\t\t\t\t\t`Ensure the ${framework} runtime is installed (e.g. bun add ${framework === 'react' ? 'react react-dom' : framework}).`\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Failed to render ${framework} convention not-found page:`,\n\t\t\t\trenderError\n\t\t\t);\n\t\t}\n\t}\n\n\treturn null;\n};\n\nconst NOT_FOUND_PRIORITY: (keyof ConventionsMap)[] = [\n\t'react',\n\t'svelte',\n\t'vue',\n\t'angular'\n];\n\nexport const renderFirstNotFound = async () => {\n\tfor (const framework of NOT_FOUND_PRIORITY) {\n\t\tif (!getMap()[framework]?.defaults?.notFound) continue;\n\t\tconst response = await renderConventionNotFound(framework);\n\t\tif (response) return response;\n\t}\n\n\treturn null;\n};\n",
7
+ "import { basename } from 'node:path';\nimport type { ConventionsMap } from '../../types/conventions';\nimport { toPascal } from './stringModifiers';\n\n// Use globalThis so the conventions map is shared across all bundles.\n// The main bundle (dist/index.js) calls setConventions, but framework\n// bundles (dist/svelte/index.js, etc.) need to read the same map.\nconst CONVENTIONS_KEY = '__absoluteConventions';\n\nconst getMap = (): ConventionsMap =>\n\t((globalThis as Record<string, unknown>)[\n\t\tCONVENTIONS_KEY\n\t] as ConventionsMap) ?? {};\n\nexport const setConventions = (map: ConventionsMap) => {\n\t(globalThis as Record<string, unknown>)[CONVENTIONS_KEY] = map;\n};\n\nexport const getConventions = () => getMap();\n\nexport const resolveErrorConventionPath = (\n\tframework: keyof ConventionsMap,\n\tpageName: string\n) => {\n\tconst fw = getMap()[framework];\n\tif (!fw) return undefined;\n\n\treturn fw.pages?.[pageName]?.error ?? fw.defaults?.error;\n};\n\nexport const resolveNotFoundConventionPath = (\n\tframework: keyof ConventionsMap\n) => getMap()[framework]?.defaults?.notFound;\n\n/**\n * Derive a PascalCase page name from a compiled server path.\n * Example: \"/build/svelte/pages/SvelteExample.abc123.js\" → \"SvelteExample\"\n */\nexport const derivePageName = (pagePath: string) => {\n\tconst base = basename(pagePath);\n\t// Strip hash and extension: \"SvelteExample.abc123.js\" → \"SvelteExample\"\n\tconst dotIndex = base.indexOf('.');\n\tconst name = dotIndex > 0 ? base.slice(0, dotIndex) : base;\n\n\treturn toPascal(name);\n};\n\nconst isDev = () => process.env.NODE_ENV === 'development';\n\nconst buildErrorProps = (error: unknown) => {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tconst stack = isDev() && error instanceof Error ? error.stack : undefined;\n\n\treturn { error: { message, stack } };\n};\n\nexport const renderConventionError = async (\n\tframework: keyof ConventionsMap,\n\tpageName: string,\n\terror: unknown\n) => {\n\tconst conventionPath = resolveErrorConventionPath(framework, pageName);\n\tif (!conventionPath) return null;\n\n\tconst errorProps = buildErrorProps(error);\n\n\ttry {\n\t\tif (framework === 'react') {\n\t\t\tconst { createElement } = await import('react');\n\t\t\tconst { renderToReadableStream } = await import('react-dom/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst firstKey = Object.keys(mod)[0];\n\t\t\tconst ErrorComponent =\n\t\t\t\tmod.default ?? (firstKey ? mod[firstKey] : undefined);\n\t\t\tconst element = createElement(ErrorComponent, errorProps);\n\t\t\tconst stream = await renderToReadableStream(element);\n\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'svelte') {\n\t\t\tconst { render } = await import('svelte/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst ErrorComponent = mod.default;\n\t\t\tconst { head, body } = render(ErrorComponent, {\n\t\t\t\tprops: errorProps\n\t\t\t});\n\t\t\tconst html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'vue') {\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToString } = await import('vue/server-renderer');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst ErrorComponent = mod.default;\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(ErrorComponent, errorProps)\n\t\t\t});\n\t\t\tlet body = await renderToString(app);\n\n\t\t\t// Vue SSR escapes quotes inside <component is=\"style\"> tags.\n\t\t\t// Extract style content, unescape it, and move to <head>.\n\t\t\tlet styles = '';\n\t\t\tbody = body.replace(\n\t\t\t\t/<style>([\\s\\S]*?)<\\/style>/g,\n\t\t\t\t(_, css: string) => {\n\t\t\t\t\tstyles += `<style>${css\n\t\t\t\t\t\t.replace(/&quot;/g, '\"')\n\t\t\t\t\t\t.replace(/&amp;/g, '&')\n\t\t\t\t\t\t.replace(/&lt;/g, '<')\n\t\t\t\t\t\t.replace(/&gt;/g, '>')}</style>`;\n\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${styles}</head><body><div id=\"root\">${body}</div></body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 500\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'angular') {\n\t\t\t// Angular error pages are rendered as plain HTML templates\n\t\t\t// since the full Angular SSR pipeline is too heavy for error pages\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst renderError = mod.default ?? mod.renderError;\n\t\t\tif (typeof renderError === 'function') {\n\t\t\t\tconst html = renderError(errorProps);\n\n\t\t\t\treturn new Response(html, {\n\t\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\t\tstatus: 500\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (renderError) {\n\t\tconst message = renderError instanceof Error ? renderError.message : '';\n\t\tif (\n\t\t\tmessage.includes('Cannot find module') ||\n\t\t\tmessage.includes('Cannot find package') ||\n\t\t\tmessage.includes('not found in module')\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Convention error page for ${framework} failed: missing framework package. ` +\n\t\t\t\t\t`Ensure the ${framework} runtime is installed (e.g. bun add ${framework === 'react' ? 'react react-dom' : framework}).`\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Failed to render ${framework} convention error page:`,\n\t\t\t\trenderError\n\t\t\t);\n\t\t}\n\t}\n\n\treturn null;\n};\n\nexport const renderConventionNotFound = async (\n\tframework: keyof ConventionsMap\n) => {\n\tconst conventionPath = resolveNotFoundConventionPath(framework);\n\tif (!conventionPath) return null;\n\n\ttry {\n\t\tif (framework === 'react') {\n\t\t\tconst { createElement } = await import('react');\n\t\t\tconst { renderToReadableStream } = await import('react-dom/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst nfKey = Object.keys(mod)[0];\n\t\t\tconst NotFoundComponent =\n\t\t\t\tmod.default ?? (nfKey ? mod[nfKey] : undefined);\n\t\t\tconst element = createElement(NotFoundComponent);\n\t\t\tconst stream = await renderToReadableStream(element);\n\n\t\t\treturn new Response(stream, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'svelte') {\n\t\t\tconst { render } = await import('svelte/server');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst NotFoundComponent = mod.default;\n\t\t\tconst { head, body } = render(NotFoundComponent);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${head}</head><body>${body}</body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'vue') {\n\t\t\tconst { createSSRApp, h } = await import('vue');\n\t\t\tconst { renderToString } = await import('vue/server-renderer');\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst NotFoundComponent = mod.default;\n\t\t\tconst app = createSSRApp({\n\t\t\t\trender: () => h(NotFoundComponent)\n\t\t\t});\n\t\t\tlet body = await renderToString(app);\n\n\t\t\tlet styles = '';\n\t\t\tbody = body.replace(\n\t\t\t\t/<style>([\\s\\S]*?)<\\/style>/g,\n\t\t\t\t(_, css: string) => {\n\t\t\t\t\tstyles += `<style>${css\n\t\t\t\t\t\t.replace(/&quot;/g, '\"')\n\t\t\t\t\t\t.replace(/&amp;/g, '&')\n\t\t\t\t\t\t.replace(/&lt;/g, '<')\n\t\t\t\t\t\t.replace(/&gt;/g, '>')}</style>`;\n\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t);\n\t\t\tconst html = `<!DOCTYPE html><html><head>${styles}</head><body><div id=\"root\">${body}</div></body></html>`;\n\n\t\t\treturn new Response(html, {\n\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\tstatus: 404\n\t\t\t});\n\t\t}\n\n\t\tif (framework === 'angular') {\n\t\t\tconst mod = await import(conventionPath);\n\t\t\tconst renderNotFound = mod.default ?? mod.renderNotFound;\n\t\t\tif (typeof renderNotFound === 'function') {\n\t\t\t\tconst html = renderNotFound();\n\n\t\t\t\treturn new Response(html, {\n\t\t\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\t\t\tstatus: 404\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (renderError) {\n\t\tconst message = renderError instanceof Error ? renderError.message : '';\n\t\tif (\n\t\t\tmessage.includes('Cannot find module') ||\n\t\t\tmessage.includes('Cannot find package') ||\n\t\t\tmessage.includes('not found in module')\n\t\t) {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Convention not-found page for ${framework} failed: missing framework package. ` +\n\t\t\t\t\t`Ensure the ${framework} runtime is installed (e.g. bun add ${framework === 'react' ? 'react react-dom' : framework}).`\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`[SSR] Failed to render ${framework} convention not-found page:`,\n\t\t\t\trenderError\n\t\t\t);\n\t\t}\n\t}\n\n\treturn null;\n};\n\nconst NOT_FOUND_PRIORITY: (keyof ConventionsMap)[] = [\n\t'react',\n\t'svelte',\n\t'vue',\n\t'angular'\n];\n\nexport const renderFirstNotFound = async () => {\n\tfor (const framework of NOT_FOUND_PRIORITY) {\n\t\tif (!getMap()[framework]?.defaults?.notFound) continue;\n\t\tconst response = await renderConventionNotFound(framework);\n\t\tif (response) return response;\n\t}\n\n\treturn null;\n};\n",
8
8
  "import type { Component as VueComponent } from 'vue';\nimport { ssrErrorPage } from '../utils/ssrErrorPage';\nimport {\n\tderivePageName,\n\trenderConventionError\n} from '../utils/resolveConvention';\n\nlet ssrDirty = false;\n\nconst buildDirtyResponse = (\n\theadTag: string,\n\tindexPath: string,\n\tmaybeProps: Record<string, unknown> | undefined\n) => {\n\tconst propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(maybeProps ?? {})};`;\n\tconst dirtyFlag = 'window.__SSR_DIRTY__=true;';\n\tconst html =\n\t\t`<!DOCTYPE html><html>${headTag}<body><div id=\"root\"></div>` +\n\t\t`<script>${propsScript}${dirtyFlag}</script>` +\n\t\t`<script type=\"module\" src=\"${indexPath}\"></script>` +\n\t\t`</body></html>`;\n\n\treturn new Response(html, {\n\t\theaders: { 'Content-Type': 'text/html' }\n\t});\n};\n\nexport const handleVuePageRequest = async <\n\tProps extends Record<string, unknown> = Record<never, never>\n>(\n\t_PageComponent: VueComponent<Props>,\n\tpagePath: string,\n\tindexPath: string,\n\theadTag: `<head>${string}</head>` = '<head></head>',\n\t...props: keyof Props extends never ? [] : [props: NoInfer<Props>]\n) => {\n\tconst [maybeProps] = props;\n\n\tif (ssrDirty) {\n\t\treturn buildDirtyResponse(headTag, indexPath, maybeProps);\n\t}\n\n\ttry {\n\t\tconst { default: ImportedPageComponent } = await import(pagePath);\n\t\tconst { createSSRApp, h } = await import('vue');\n\t\tconst { renderToWebStream } = await import('vue/server-renderer');\n\n\t\tconst app = createSSRApp({\n\t\t\trender: () => h(ImportedPageComponent, maybeProps ?? null)\n\t\t});\n\n\t\tconst bodyStream = renderToWebStream(app);\n\n\t\tconst head = `<!DOCTYPE html><html>${headTag}<body><div id=\"root\">`;\n\t\tconst tail = `</div><script>window.__INITIAL_PROPS__=${JSON.stringify(\n\t\t\tmaybeProps ?? {}\n\t\t)}</script><script type=\"module\" src=\"${indexPath}\"></script></body></html>`;\n\n\t\tconst stream = new ReadableStream({\n\t\t\tstart(controller) {\n\t\t\t\tcontroller.enqueue(head);\n\t\t\t\tconst reader = bodyStream.getReader();\n\t\t\t\tconst pumpLoop = () => {\n\t\t\t\t\treader\n\t\t\t\t\t\t.read()\n\t\t\t\t\t\t.then(({ done, value }) =>\n\t\t\t\t\t\t\tdone\n\t\t\t\t\t\t\t\t? (controller.enqueue(tail), controller.close())\n\t\t\t\t\t\t\t\t: (controller.enqueue(value), pumpLoop())\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.catch((err) => controller.error(err));\n\t\t\t\t};\n\t\t\t\tpumpLoop();\n\t\t\t}\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: { 'Content-Type': 'text/html' }\n\t\t});\n\t} catch (error) {\n\t\tconsole.error('[SSR] Vue render error:', error);\n\n\t\tconst pageName = derivePageName(pagePath);\n\t\tconst conventionResponse = await renderConventionError(\n\t\t\t'vue',\n\t\t\tpageName,\n\t\t\terror\n\t\t);\n\t\tif (conventionResponse) return conventionResponse;\n\n\t\treturn new Response(ssrErrorPage('vue', error), {\n\t\t\theaders: { 'Content-Type': 'text/html' },\n\t\t\tstatus: 500\n\t\t});\n\t}\n};\n\nexport const invalidateVueSsrCache = () => {\n\tssrDirty = true;\n};\n",
9
9
  "export { handleVuePageRequest } from './pageHandler';\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "4A22AD08D929C19064756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "9B7951B8122AD1EC64756E2164756E21",
13
13
  "names": []
14
14
  }
package/package.json CHANGED
@@ -54,10 +54,31 @@
54
54
  "import": "./dist/index.js",
55
55
  "types": "./dist/src/index.d.ts"
56
56
  },
57
+ "./ai": {
58
+ "import": "./dist/ai/index.js",
59
+ "types": "./dist/src/ai/index.d.ts"
60
+ },
61
+ "./ai/anthropic": {
62
+ "import": "./dist/ai/providers/anthropic.js",
63
+ "types": "./dist/src/ai/providers/anthropic.d.ts"
64
+ },
65
+ "./ai/openai": {
66
+ "import": "./dist/ai/providers/openai.js",
67
+ "types": "./dist/src/ai/providers/openai.d.ts"
68
+ },
69
+ "./ai/ollama": {
70
+ "import": "./dist/ai/providers/ollama.js",
71
+ "types": "./dist/src/ai/providers/ollama.d.ts"
72
+ },
57
73
  "./angular": {
58
74
  "import": "./dist/angular/index.js",
59
75
  "types": "./dist/src/angular/index.d.ts"
60
76
  },
77
+ "./angular/ai": {
78
+ "browser": "./dist/ai-client/angular/ai/index.js",
79
+ "import": "./dist/angular/ai/index.js",
80
+ "types": "./dist/src/angular/ai/index.d.ts"
81
+ },
61
82
  "./build": {
62
83
  "import": "./dist/build.js",
63
84
  "types": "./dist/src/build.d.ts"
@@ -75,6 +96,11 @@
75
96
  "import": "./dist/react/components/index.js",
76
97
  "types": "./dist/src/react/components/index.d.ts"
77
98
  },
99
+ "./react/ai": {
100
+ "browser": "./dist/ai-client/react/ai/index.js",
101
+ "import": "./dist/react/ai/index.js",
102
+ "types": "./dist/src/react/ai/index.d.ts"
103
+ },
78
104
  "./react/hooks": {
79
105
  "import": "./dist/react/hooks/index.js",
80
106
  "types": "./dist/src/react/hooks/index.d.ts"
@@ -83,6 +109,10 @@
83
109
  "import": "./dist/svelte/index.js",
84
110
  "types": "./dist/src/svelte/index.d.ts"
85
111
  },
112
+ "./svelte/ai": {
113
+ "import": "./dist/svelte/ai/index.js",
114
+ "types": "./dist/src/svelte/ai/index.d.ts"
115
+ },
86
116
  "./svelte/components/Head.svelte": {
87
117
  "types": "./dist/svelte/components/Head.svelte.d.ts",
88
118
  "import": "./dist/svelte/components/Head.svelte"
@@ -111,6 +141,11 @@
111
141
  "import": "./dist/vue/index.js",
112
142
  "types": "./dist/src/vue/index.d.ts"
113
143
  },
144
+ "./vue/ai": {
145
+ "browser": "./dist/ai-client/vue/ai/index.js",
146
+ "import": "./dist/vue/ai/index.js",
147
+ "types": "./dist/src/vue/ai/index.d.ts"
148
+ },
114
149
  "./vue/components": {
115
150
  "import": "./dist/vue/components/index.js",
116
151
  "types": "./dist/src/vue/components/index.d.ts"
@@ -218,5 +253,5 @@
218
253
  "typecheck": "bun run src/cli/index.ts typecheck --config example/absolute.config.ts"
219
254
  },
220
255
  "types": "./dist/src/index.d.ts",
221
- "version": "0.19.0-beta.226"
256
+ "version": "0.19.0-beta.228"
222
257
  }
package/scripts/build.ts CHANGED
@@ -8,12 +8,20 @@ const DIST = 'dist';
8
8
  const SERVER_ENTRY_POINTS = [
9
9
  'src/index.ts',
10
10
  'src/build.ts',
11
+ 'src/ai/index.ts',
12
+ 'src/ai/providers/anthropic.ts',
13
+ 'src/ai/providers/openai.ts',
14
+ 'src/ai/providers/ollama.ts',
11
15
  'src/angular/index.ts',
16
+ 'src/angular/ai/index.ts',
12
17
  'src/react/index.ts',
18
+ 'src/react/ai/index.ts',
13
19
  'src/react/components/index.ts',
14
20
  'src/react/hooks/index.ts',
15
21
  'src/svelte/index.ts',
22
+ 'src/svelte/ai/index.ts',
16
23
  'src/vue/index.ts',
24
+ 'src/vue/ai/index.ts',
17
25
  'src/vue/components/index.ts'
18
26
  ];
19
27
 
@@ -96,6 +104,31 @@ async function build() {
96
104
  process.exit(1);
97
105
  }
98
106
 
107
+ console.log('Building AI client hooks (browser target)...');
108
+ const aiBrowserBuild = await Bun.build({
109
+ entrypoints: [
110
+ 'src/react/ai/index.ts',
111
+ 'src/vue/ai/index.ts',
112
+ 'src/angular/ai/index.ts'
113
+ ],
114
+ outdir: join(DIST, 'ai-client'),
115
+ target: 'browser',
116
+ external: [
117
+ 'react',
118
+ 'react-dom',
119
+ 'react/jsx-runtime',
120
+ 'react/jsx-dev-runtime',
121
+ 'vue',
122
+ '@angular/core'
123
+ ]
124
+ });
125
+
126
+ if (!aiBrowserBuild.success) {
127
+ console.error('AI client build failed:');
128
+ for (const log of aiBrowserBuild.logs) console.error(log);
129
+ process.exit(1);
130
+ }
131
+
99
132
  console.log('Building CLI...');
100
133
  const cliBuild = await Bun.build({
101
134
  entrypoints: ['src/cli/index.ts'],
package/types/ai.ts ADDED
@@ -0,0 +1,235 @@
1
+ /* AI/LLM streaming types for WebSocket-based AI communication */
2
+
3
+ /* ─── Provider types ─── */
4
+
5
+ export type AIUsage = {
6
+ inputTokens: number;
7
+ outputTokens: number;
8
+ };
9
+
10
+ export type AITextChunk = {
11
+ type: 'text';
12
+ content: string;
13
+ };
14
+
15
+ export type AIToolUseChunk = {
16
+ type: 'tool_use';
17
+ id: string;
18
+ name: string;
19
+ input: unknown;
20
+ };
21
+
22
+ export type AIDoneChunk = {
23
+ type: 'done';
24
+ usage?: AIUsage;
25
+ };
26
+
27
+ export type AIChunk = AITextChunk | AIToolUseChunk | AIDoneChunk;
28
+
29
+ export type AIProviderStreamParams = {
30
+ model: string;
31
+ messages: AIProviderMessage[];
32
+ tools?: AIProviderToolDefinition[];
33
+ systemPrompt?: string;
34
+ signal?: AbortSignal;
35
+ };
36
+
37
+ export type AIProviderMessage = {
38
+ role: 'user' | 'assistant' | 'system';
39
+ content: string | AIProviderContentBlock[];
40
+ };
41
+
42
+ export type AIProviderContentBlock =
43
+ | { type: 'text'; content: string }
44
+ | { type: 'tool_use'; id: string; name: string; input: unknown }
45
+ | { type: 'tool_result'; tool_use_id: string; content: string };
46
+
47
+ export type AIProviderToolDefinition = {
48
+ name: string;
49
+ description: string;
50
+ input_schema: Record<string, unknown>;
51
+ };
52
+
53
+ export type AIProviderConfig = {
54
+ stream: (params: AIProviderStreamParams) => AsyncIterable<AIChunk>;
55
+ };
56
+
57
+ /* ─── Tool types ─── */
58
+
59
+ export type AIToolDefinition = {
60
+ description: string;
61
+ input: Record<string, unknown>;
62
+ handler: (input: unknown) => Promise<string> | string;
63
+ };
64
+
65
+ export type AIToolMap = Record<string, AIToolDefinition>;
66
+
67
+ /* ─── Wire protocol: Client → Server ─── */
68
+
69
+ export type AIMessageRequest = {
70
+ type: 'message';
71
+ content: string;
72
+ conversationId?: string;
73
+ };
74
+
75
+ export type AICancelRequest = {
76
+ type: 'cancel';
77
+ conversationId: string;
78
+ };
79
+
80
+ export type AIBranchRequest = {
81
+ type: 'branch';
82
+ messageId: string;
83
+ content: string;
84
+ conversationId: string;
85
+ };
86
+
87
+ export type AIClientMessage =
88
+ | AIMessageRequest
89
+ | AICancelRequest
90
+ | AIBranchRequest;
91
+
92
+ /* ─── Wire protocol: Server → Client ─── */
93
+
94
+ export type AIChunkMessage = {
95
+ type: 'chunk';
96
+ content: string;
97
+ messageId: string;
98
+ conversationId: string;
99
+ };
100
+
101
+ export type AIToolStatusMessage = {
102
+ type: 'tool_status';
103
+ name: string;
104
+ status: 'running' | 'complete';
105
+ input?: unknown;
106
+ result?: string;
107
+ messageId: string;
108
+ conversationId: string;
109
+ };
110
+
111
+ export type AICompleteMessage = {
112
+ type: 'complete';
113
+ messageId: string;
114
+ conversationId: string;
115
+ usage?: AIUsage;
116
+ };
117
+
118
+ export type AIErrorMessage = {
119
+ type: 'error';
120
+ message: string;
121
+ messageId?: string;
122
+ conversationId?: string;
123
+ };
124
+
125
+ export type AIServerMessage =
126
+ | AIChunkMessage
127
+ | AIToolStatusMessage
128
+ | AICompleteMessage
129
+ | AIErrorMessage;
130
+
131
+ /* ─── Conversation state ─── */
132
+
133
+ export type AIRole = 'user' | 'assistant' | 'system';
134
+
135
+ export type AIToolCall = {
136
+ id: string;
137
+ name: string;
138
+ input: unknown;
139
+ result?: string;
140
+ };
141
+
142
+ export type AIMessage = {
143
+ id: string;
144
+ role: AIRole;
145
+ content: string;
146
+ conversationId: string;
147
+ parentId?: string;
148
+ toolCalls?: AIToolCall[];
149
+ isStreaming?: boolean;
150
+ timestamp: number;
151
+ };
152
+
153
+ export type AIConversation = {
154
+ id: string;
155
+ messages: AIMessage[];
156
+ activeStreamAbort?: AbortController;
157
+ };
158
+
159
+ /* ─── Configuration ─── */
160
+
161
+ export type StreamAIOptions = {
162
+ provider: AIProviderConfig;
163
+ model: string;
164
+ messages?: AIProviderMessage[];
165
+ systemPrompt?: string;
166
+ tools?: AIToolMap;
167
+ onChunk?: (chunk: AITextChunk) => AITextChunk | void;
168
+ onComplete?: (fullResponse: string, usage?: AIUsage) => void;
169
+ onToolUse?: (name: string, input: unknown, result: string) => void;
170
+ maxTurns?: number;
171
+ signal?: AbortSignal;
172
+ };
173
+
174
+ /* ─── Client-side state ─── */
175
+
176
+ export type AIStreamState = {
177
+ conversations: Map<string, AIConversation>;
178
+ activeConversationId: string | null;
179
+ isStreaming: boolean;
180
+ error: string | null;
181
+ };
182
+
183
+ export type AIStoreAction =
184
+ | {
185
+ type: 'chunk';
186
+ conversationId: string;
187
+ messageId: string;
188
+ content: string;
189
+ }
190
+ | {
191
+ type: 'tool_status';
192
+ conversationId: string;
193
+ messageId: string;
194
+ name: string;
195
+ status: 'running' | 'complete';
196
+ input?: unknown;
197
+ result?: string;
198
+ }
199
+ | {
200
+ type: 'complete';
201
+ conversationId: string;
202
+ messageId: string;
203
+ usage?: AIUsage;
204
+ }
205
+ | { type: 'error'; message: string }
206
+ | {
207
+ type: 'send';
208
+ content: string;
209
+ conversationId: string;
210
+ messageId: string;
211
+ }
212
+ | { type: 'cancel' }
213
+ | {
214
+ type: 'branch';
215
+ oldConversationId: string;
216
+ newConversationId: string;
217
+ fromMessageId: string;
218
+ }
219
+ | { type: 'set_conversation'; conversationId: string };
220
+
221
+ /* ─── WebSocket interface ─── */
222
+
223
+ export type AIWebSocket = {
224
+ send(data: string): void;
225
+ readyState: number;
226
+ };
227
+
228
+ /* ─── Connection options ─── */
229
+
230
+ export type AIConnectionOptions = {
231
+ protocols?: string[];
232
+ reconnect?: boolean;
233
+ pingInterval?: number;
234
+ maxReconnectAttempts?: number;
235
+ };
@@ -0,0 +1,17 @@
1
+ export type AnthropicConfig = {
2
+ apiKey: string;
3
+ baseUrl?: string;
4
+ };
5
+
6
+ export type AnthropicMessage = {
7
+ content: string | Array<Record<string, unknown>>;
8
+ role: 'user' | 'assistant';
9
+ };
10
+
11
+ export type AnthropicSSEState = {
12
+ buffer: string;
13
+ currentToolId: string;
14
+ currentToolName: string;
15
+ toolInputJson: string;
16
+ usage: { inputTokens: number; outputTokens: number } | undefined;
17
+ };
package/types/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './ai';
1
2
  export * from './angular';
2
3
  export * from './conventions';
3
4
  export * from './build';
@@ -1,6 +1,77 @@
1
+ import type { AIClientMessage, AIServerMessage } from './ai';
1
2
  import type { HMRClientMessage } from './messages';
2
3
 
3
- /* Type guard for client messages */
4
+ /* Type guard for AI client messages */
5
+ export const isValidAIClientMessage = (
6
+ data: unknown
7
+ ): data is AIClientMessage => {
8
+ if (!data || typeof data !== 'object') {
9
+ return false;
10
+ }
11
+
12
+ if (!('type' in data) || typeof data.type !== 'string') {
13
+ return false;
14
+ }
15
+
16
+ switch (data.type) {
17
+ case 'message':
18
+ return 'content' in data && typeof data.content === 'string';
19
+ case 'cancel':
20
+ return (
21
+ 'conversationId' in data &&
22
+ typeof data.conversationId === 'string'
23
+ );
24
+ case 'branch':
25
+ return (
26
+ 'messageId' in data &&
27
+ typeof data.messageId === 'string' &&
28
+ 'content' in data &&
29
+ typeof data.content === 'string' &&
30
+ 'conversationId' in data &&
31
+ typeof data.conversationId === 'string'
32
+ );
33
+ default:
34
+ return false;
35
+ }
36
+ };
37
+
38
+ /* Type guard for AI server messages */
39
+ export const isValidAIServerMessage = (
40
+ data: unknown
41
+ ): data is AIServerMessage => {
42
+ if (!data || typeof data !== 'object') {
43
+ return false;
44
+ }
45
+
46
+ if (!('type' in data) || typeof data.type !== 'string') {
47
+ return false;
48
+ }
49
+
50
+ switch (data.type) {
51
+ case 'chunk':
52
+ return (
53
+ 'content' in data &&
54
+ typeof data.content === 'string' &&
55
+ 'messageId' in data &&
56
+ 'conversationId' in data
57
+ );
58
+ case 'tool_status':
59
+ return (
60
+ 'name' in data &&
61
+ 'status' in data &&
62
+ 'messageId' in data &&
63
+ 'conversationId' in data
64
+ );
65
+ case 'complete':
66
+ return 'messageId' in data && 'conversationId' in data;
67
+ case 'error':
68
+ return 'message' in data && typeof data.message === 'string';
69
+ default:
70
+ return false;
71
+ }
72
+ };
73
+
74
+ /* Type guard for HMR client messages */
4
75
  export const isValidHMRClientMessage = (
5
76
  data: unknown
6
77
  ): data is HMRClientMessage => {