@parlor/agent-ui 0.1.0 → 0.3.0

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 (39) hide show
  1. package/dist/client/agent-ui-client.js.map +1 -1
  2. package/dist/client/confirmations.js.map +1 -1
  3. package/dist/client/environment.js.map +1 -1
  4. package/dist/client/highlight.js.map +1 -1
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/client/json-equal.js.map +1 -1
  7. package/dist/client/registry.js.map +1 -1
  8. package/dist/client/screen.js.map +1 -1
  9. package/dist/client/write.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/manifest.js.map +1 -1
  15. package/dist/pages.d.ts +11 -0
  16. package/dist/pages.d.ts.map +1 -0
  17. package/dist/pages.js +42 -0
  18. package/dist/pages.js.map +1 -0
  19. package/dist/protocol.js.map +1 -1
  20. package/dist/server/agent-ui.js.map +1 -1
  21. package/dist/server/audience.js.map +1 -1
  22. package/dist/server/broker.js.map +1 -1
  23. package/dist/server/confirmations.js.map +1 -1
  24. package/dist/server/directory.js.map +1 -1
  25. package/dist/server/index.js.map +1 -1
  26. package/dist/server/manifest-source.js.map +1 -1
  27. package/dist/server/routes.js.map +1 -1
  28. package/dist/server/schemas.js.map +1 -1
  29. package/dist/server/tools.js.map +1 -1
  30. package/dist/view.js.map +1 -1
  31. package/dist/vite/index.d.ts +1 -1
  32. package/dist/vite/index.d.ts.map +1 -1
  33. package/dist/vite/index.js.map +1 -1
  34. package/dist/vite/manifest.js.map +1 -1
  35. package/dist/vite/plugin.d.ts +8 -2
  36. package/dist/vite/plugin.d.ts.map +1 -1
  37. package/dist/vite/plugin.js +61 -12
  38. package/dist/vite/plugin.js.map +1 -1
  39. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  import { access, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
2
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { isRunnableDevEnvironment, runnerImport, } from "vite";
5
- import { UI_MANIFEST_FILE } from "../manifest.js";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { build as viteBuild, isRunnableDevEnvironment, runnerImport, } from "vite";
5
+ import { UI_MANIFEST_FILE, } from "../manifest.js";
6
6
  import { buildUiManifest } from "./manifest.js";
7
7
  export const DEFAULT_ROUTE_TREE = "src/routeTree.gen.ts";
8
8
  const GENERATED_DIR = ".parlor";
@@ -24,6 +24,40 @@ function withoutStyles() {
24
24
  load: (id) => (id === EMPTY_STYLE ? "export default {};" : undefined),
25
25
  };
26
26
  }
27
+ /**
28
+ * Imports the route tree as one tree-shaken bundle of it and its dependencies, so Node loads
29
+ * one module instead of every file of every library the routes import.
30
+ */
31
+ async function importBundled(entry, root, alias, outDir) {
32
+ const built = (await viteBuild({
33
+ root,
34
+ configFile: false,
35
+ logLevel: "silent",
36
+ publicDir: false,
37
+ resolve: { alias },
38
+ plugins: [withoutStyles()],
39
+ ssr: { noExternal: true },
40
+ build: {
41
+ ssr: entry,
42
+ write: false,
43
+ minify: false,
44
+ copyPublicDir: false,
45
+ rolldownOptions: { output: { codeSplitting: false } },
46
+ },
47
+ }));
48
+ const chunk = built.output.find((output) => output.type === "chunk" && output.isEntry);
49
+ if (!chunk)
50
+ throw new Error(`Bundling ${entry} produced no entry chunk.`);
51
+ await mkdir(outDir, { recursive: true });
52
+ const file = join(outDir, `route-tree.${process.pid}.${Date.now()}.mjs`);
53
+ await writeFile(file, chunk.code);
54
+ try {
55
+ return await import(pathToFileURL(file).href);
56
+ }
57
+ finally {
58
+ await rm(file, { force: true });
59
+ }
60
+ }
27
61
  const STACK_FILE = /(?:\(|at )((?:file:\/\/)?\/[^\s()]+?):\d+:\d+\)?$/;
28
62
  function throwingFile(error) {
29
63
  const stack = error instanceof Error ? (error.stack ?? "") : "";
@@ -44,9 +78,12 @@ export function agentManifest(options) {
44
78
  let root = process.cwd();
45
79
  let logger;
46
80
  let lastWritten;
81
+ let current;
47
82
  const routeTreePath = () => resolve(root, options.routeTree ?? DEFAULT_ROUTE_TREE);
48
- const outFile = () => join(root, GENERATED_DIR, UI_MANIFEST_FILE);
83
+ const generatedDir = () => resolve(root, options.generatedDir ?? GENERATED_DIR);
84
+ const outFile = () => join(generatedDir(), UI_MANIFEST_FILE);
49
85
  const write = async (build) => {
86
+ current = build.manifest;
50
87
  for (const warning of build.warnings)
51
88
  logger?.warn(`[parlor] ${warning}`);
52
89
  const json = `${JSON.stringify(build.manifest, null, 2)}\n`;
@@ -74,7 +111,7 @@ export function agentManifest(options) {
74
111
  if (!environment || !isRunnableDevEnvironment(environment))
75
112
  return;
76
113
  const runner = environment.runner;
77
- const generatedDir = join(root, GENERATED_DIR) + sep;
114
+ const generated = generatedDir() + sep;
78
115
  let timer;
79
116
  let running = Promise.resolve();
80
117
  const generate = () => {
@@ -98,7 +135,7 @@ export function agentManifest(options) {
98
135
  timer = setTimeout(generate, REGENERATE_DEBOUNCE_MS);
99
136
  };
100
137
  const onFile = (file) => {
101
- if (file.startsWith(generatedDir))
138
+ if (file.startsWith(generated))
102
139
  return;
103
140
  if (file === routeTreePath() || runner.evaluatedModules.getModulesByFile(file)) {
104
141
  schedule();
@@ -114,6 +151,7 @@ export function agentManifest(options) {
114
151
  };
115
152
  return {
116
153
  name: "parlor:agent-manifest",
154
+ api: { manifest: () => current },
117
155
  configResolved(config) {
118
156
  root = config.root;
119
157
  logger = config.logger;
@@ -124,16 +162,27 @@ export function agentManifest(options) {
124
162
  async buildStart() {
125
163
  if (this.environment.mode !== "build" || this.environment.name !== "client")
126
164
  return;
127
- const loaded = await loadRouteTree(async (entry) => (await runnerImport(entry, {
128
- root,
129
- configFile: false,
130
- logLevel: "error",
131
- plugins: [withoutStyles()],
132
- })).module);
165
+ const { alias } = this.environment.config.resolve;
166
+ const loaded = await loadRouteTree(async (entry) => {
167
+ try {
168
+ return await importBundled(entry, root, alias, dirname(outFile()));
169
+ }
170
+ catch {
171
+ // The runner loads module by module, so its failure names the module that threw.
172
+ return (await runnerImport(entry, {
173
+ root,
174
+ configFile: false,
175
+ logLevel: "error",
176
+ resolve: { alias },
177
+ plugins: [withoutStyles()],
178
+ })).module;
179
+ }
180
+ });
133
181
  if (!loaded.ok) {
134
182
  logger?.warn(`[parlor] Building without the agent UI manifest: ${loaded.failure}. Keep browser-only code out of the top level of route modules.`);
135
183
  await rm(outFile(), { force: true });
136
184
  lastWritten = undefined;
185
+ current = undefined;
137
186
  return;
138
187
  }
139
188
  await write(manifestFromModule(options.app, loaded.module));
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport {\n type AliasOptions,\n build as viteBuild,\n isRunnableDevEnvironment,\n type Logger,\n type Plugin,\n type Rolldown,\n runnerImport,\n type ViteDevServer,\n} from \"vite\";\n\nimport {\n type ManifestBuild,\n type UiAppInfo,\n UI_MANIFEST_FILE,\n type UiManifest,\n} from \"../manifest.js\";\nimport { buildUiManifest } from \"./manifest.js\";\n\nexport const DEFAULT_ROUTE_TREE = \"src/routeTree.gen.ts\";\nconst GENERATED_DIR = \".parlor\";\nconst REGENERATE_DEBOUNCE_MS = 50;\n\nexport interface AgentManifestOptions {\n readonly app: UiAppInfo;\n readonly routeTree?: string | undefined;\n /** Where the manifest is written, absolute or relative to the root. Defaults to `.parlor`. */\n readonly generatedDir?: string | undefined;\n}\n\nexport function manifestFromModule(app: UiAppInfo, module: unknown): ManifestBuild {\n return buildUiManifest(app, (module as { routeTree?: unknown } | undefined)?.routeTree);\n}\n\nconst STYLE_IMPORT = /\\.(?:css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:\\?|$)/;\nconst EMPTY_STYLE = \"\\0parlor-empty-style\";\n\n/**\n * The manifest needs route modules, never their stylesheets, and Vite's CSS plugin cannot\n * run outside a build (8.3.5 throws), so every style import loads as an empty module.\n */\nfunction withoutStyles(): Plugin {\n return {\n name: \"parlor:manifest-without-styles\",\n enforce: \"pre\",\n resolveId: (source) => (STYLE_IMPORT.test(source) ? EMPTY_STYLE : undefined),\n load: (id) => (id === EMPTY_STYLE ? \"export default {};\" : undefined),\n };\n}\n\n/**\n * Imports the route tree as one tree-shaken bundle of it and its dependencies, so Node loads\n * one module instead of every file of every library the routes import.\n */\nasync function importBundled(\n entry: string,\n root: string,\n alias: AliasOptions,\n outDir: string,\n): Promise<unknown> {\n const built = (await viteBuild({\n root,\n configFile: false,\n logLevel: \"silent\",\n publicDir: false,\n resolve: { alias },\n plugins: [withoutStyles()],\n ssr: { noExternal: true },\n build: {\n ssr: entry,\n write: false,\n minify: false,\n copyPublicDir: false,\n rolldownOptions: { output: { codeSplitting: false } },\n },\n })) as Rolldown.RolldownOutput;\n const chunk = built.output.find(\n (output): output is Rolldown.OutputChunk => output.type === \"chunk\" && output.isEntry,\n );\n if (!chunk) throw new Error(`Bundling ${entry} produced no entry chunk.`);\n await mkdir(outDir, { recursive: true });\n const file = join(outDir, `route-tree.${process.pid}.${Date.now()}.mjs`);\n await writeFile(file, chunk.code);\n try {\n return await import(pathToFileURL(file).href);\n } finally {\n await rm(file, { force: true });\n }\n}\n\nconst STACK_FILE = /(?:\\(|at )((?:file:\\/\\/)?\\/[^\\s()]+?):\\d+:\\d+\\)?$/;\n\nfunction throwingFile(error: unknown): string | undefined {\n const stack = error instanceof Error ? (error.stack ?? \"\") : \"\";\n for (const line of stack.split(\"\\n\")) {\n const file = STACK_FILE.exec(line.trim())?.[1];\n if (file) return file.startsWith(\"file:\") ? fileURLToPath(file) : file;\n }\n return undefined;\n}\n\nfunction routeTreeImportFailure(root: string, routeTree: string, error: unknown): string {\n const file = throwingFile(error);\n const module = relative(root, file && isAbsolute(file) ? file : routeTree);\n const thrown =\n error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n return `${module} threw \"${thrown}\" while the route tree was loaded in Node`;\n}\n\ntype RouteTreeLoad =\n | { readonly ok: true; readonly module: unknown }\n | { readonly ok: false; readonly failure: string };\n\nexport interface AgentManifestApi {\n /** The manifest last generated, until the route tree fails to load. */\n manifest(): UiManifest | undefined;\n}\n\nexport function agentManifest(options: AgentManifestOptions): Plugin<AgentManifestApi> {\n let root = process.cwd();\n let logger: Logger | undefined;\n let lastWritten: string | undefined;\n let current: UiManifest | undefined;\n\n const routeTreePath = () => resolve(root, options.routeTree ?? DEFAULT_ROUTE_TREE);\n const generatedDir = () => resolve(root, options.generatedDir ?? GENERATED_DIR);\n const outFile = () => join(generatedDir(), UI_MANIFEST_FILE);\n\n const write = async (build: ManifestBuild) => {\n current = build.manifest;\n for (const warning of build.warnings) logger?.warn(`[parlor] ${warning}`);\n const json = `${JSON.stringify(build.manifest, null, 2)}\\n`;\n lastWritten ??= await readFile(outFile(), \"utf8\").catch(() => undefined);\n if (json === lastWritten) return;\n await mkdir(dirname(outFile()), { recursive: true });\n const partial = `${outFile()}.${process.pid}.tmp`;\n await writeFile(partial, json);\n await rename(partial, outFile());\n lastWritten = json;\n };\n\n const exists = (path: string) =>\n access(path).then(\n () => true,\n () => false,\n );\n\n const loadRouteTree = async (\n load: (entry: string) => Promise<unknown>,\n ): Promise<RouteTreeLoad> => {\n const entry = routeTreePath();\n try {\n return { ok: true, module: (await exists(entry)) ? await load(entry) : undefined };\n } catch (error) {\n return { ok: false, failure: routeTreeImportFailure(root, entry, error) };\n }\n };\n\n const watchInDev = (server: ViteDevServer) => {\n const environment = server.environments.ssr;\n if (!environment || !isRunnableDevEnvironment(environment)) return;\n const runner = environment.runner;\n const generated = generatedDir() + sep;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let running: Promise<void> = Promise.resolve();\n\n const generate = () => {\n running = running.then(async () => {\n try {\n runner.clearCache();\n const loaded = await loadRouteTree((entry) => runner.import(entry));\n if (!loaded.ok) {\n logger?.error(\n `[parlor] Could not generate the agent UI manifest: ${loaded.failure}.`,\n );\n return;\n }\n await write(manifestFromModule(options.app, loaded.module));\n } catch (error) {\n logger?.error(\n `[parlor] Could not generate the agent UI manifest: ${(error as Error).message}`,\n );\n }\n });\n };\n const schedule = () => {\n clearTimeout(timer);\n timer = setTimeout(generate, REGENERATE_DEBOUNCE_MS);\n };\n const onFile = (file: string) => {\n if (file.startsWith(generated)) return;\n if (file === routeTreePath() || runner.evaluatedModules.getModulesByFile(file)) {\n schedule();\n }\n };\n server.watcher.on(\"change\", onFile);\n server.watcher.on(\"add\", onFile);\n server.watcher.on(\"unlink\", onFile);\n\n if (server.httpServer) server.httpServer.once(\"listening\", generate);\n else generate();\n };\n\n return {\n name: \"parlor:agent-manifest\",\n api: { manifest: () => current },\n configResolved(config) {\n root = config.root;\n logger = config.logger;\n },\n configureServer(server) {\n watchInDev(server);\n },\n async buildStart() {\n if (this.environment.mode !== \"build\" || this.environment.name !== \"client\") return;\n const { alias } = this.environment.config.resolve;\n const loaded = await loadRouteTree(async (entry) => {\n try {\n return await importBundled(entry, root, alias, dirname(outFile()));\n } catch {\n // The runner loads module by module, so its failure names the module that threw.\n return (\n await runnerImport(entry, {\n root,\n configFile: false,\n logLevel: \"error\",\n resolve: { alias },\n plugins: [withoutStyles()],\n })\n ).module;\n }\n });\n if (!loaded.ok) {\n logger?.warn(\n `[parlor] Building without the agent UI manifest: ${loaded.failure}. Keep browser-only code out of the top level of route modules.`,\n );\n await rm(outFile(), { force: true });\n lastWritten = undefined;\n current = undefined;\n return;\n }\n await write(manifestFromModule(options.app, loaded.module));\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parlor/agent-ui",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "homepage": "https://cychien.github.io/parlor",
5
5
  "bugs": "https://github.com/cychien/parlor/issues",
6
6
  "license": "MIT",
@@ -35,8 +35,8 @@
35
35
  "@standard-schema/spec": "^1.1.0",
36
36
  "h3": "^2.0.1",
37
37
  "zod": "^4.6.5",
38
- "@parlor/core": "0.1.0",
39
- "@parlor/sync": "0.1.0"
38
+ "@parlor/core": "0.3.0",
39
+ "@parlor/sync": "0.3.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@tanstack/react-router": "^1.170.45",