@parlor/agent-ui 0.0.0-stage → 0.2.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/client/agent-ui-client.d.ts +60 -0
  4. package/dist/client/agent-ui-client.d.ts.map +1 -0
  5. package/dist/client/agent-ui-client.js +407 -0
  6. package/dist/client/agent-ui-client.js.map +1 -0
  7. package/dist/client/confirmations.d.ts +34 -0
  8. package/dist/client/confirmations.d.ts.map +1 -0
  9. package/dist/client/confirmations.js +95 -0
  10. package/dist/client/confirmations.js.map +1 -0
  11. package/dist/client/environment.d.ts +37 -0
  12. package/dist/client/environment.d.ts.map +1 -0
  13. package/dist/client/environment.js +79 -0
  14. package/dist/client/environment.js.map +1 -0
  15. package/dist/client/highlight.d.ts +12 -0
  16. package/dist/client/highlight.d.ts.map +1 -0
  17. package/dist/client/highlight.js +98 -0
  18. package/dist/client/highlight.js.map +1 -0
  19. package/dist/client/index.d.ts +7 -0
  20. package/dist/client/index.d.ts.map +1 -0
  21. package/dist/client/index.js +7 -0
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/client/json-equal.d.ts +2 -0
  24. package/dist/client/json-equal.d.ts.map +1 -0
  25. package/dist/client/json-equal.js +20 -0
  26. package/dist/client/json-equal.js.map +1 -0
  27. package/dist/client/registry.d.ts +54 -0
  28. package/dist/client/registry.d.ts.map +1 -0
  29. package/dist/client/registry.js +280 -0
  30. package/dist/client/registry.js.map +1 -0
  31. package/dist/client/screen.d.ts +20 -0
  32. package/dist/client/screen.d.ts.map +1 -0
  33. package/dist/client/screen.js +196 -0
  34. package/dist/client/screen.js.map +1 -0
  35. package/dist/client/write.d.ts +13 -0
  36. package/dist/client/write.d.ts.map +1 -0
  37. package/dist/client/write.js +101 -0
  38. package/dist/client/write.js.map +1 -0
  39. package/dist/index.d.ts +5 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/manifest.d.ts +44 -0
  44. package/dist/manifest.d.ts.map +1 -0
  45. package/dist/manifest.js +23 -0
  46. package/dist/manifest.js.map +1 -0
  47. package/dist/pages.d.ts +11 -0
  48. package/dist/pages.d.ts.map +1 -0
  49. package/dist/pages.js +42 -0
  50. package/dist/pages.js.map +1 -0
  51. package/dist/protocol.d.ts +206 -0
  52. package/dist/protocol.d.ts.map +1 -0
  53. package/dist/protocol.js +152 -0
  54. package/dist/protocol.js.map +1 -0
  55. package/dist/server/agent-ui.d.ts +36 -0
  56. package/dist/server/agent-ui.d.ts.map +1 -0
  57. package/dist/server/agent-ui.js +89 -0
  58. package/dist/server/agent-ui.js.map +1 -0
  59. package/dist/server/audience.d.ts +9 -0
  60. package/dist/server/audience.d.ts.map +1 -0
  61. package/dist/server/audience.js +15 -0
  62. package/dist/server/audience.js.map +1 -0
  63. package/dist/server/broker.d.ts +29 -0
  64. package/dist/server/broker.d.ts.map +1 -0
  65. package/dist/server/broker.js +152 -0
  66. package/dist/server/broker.js.map +1 -0
  67. package/dist/server/confirmations.d.ts +40 -0
  68. package/dist/server/confirmations.d.ts.map +1 -0
  69. package/dist/server/confirmations.js +230 -0
  70. package/dist/server/confirmations.js.map +1 -0
  71. package/dist/server/directory.d.ts +41 -0
  72. package/dist/server/directory.d.ts.map +1 -0
  73. package/dist/server/directory.js +193 -0
  74. package/dist/server/directory.js.map +1 -0
  75. package/dist/server/index.d.ts +10 -0
  76. package/dist/server/index.d.ts.map +1 -0
  77. package/dist/server/index.js +10 -0
  78. package/dist/server/index.js.map +1 -0
  79. package/dist/server/manifest-source.d.ts +10 -0
  80. package/dist/server/manifest-source.d.ts.map +1 -0
  81. package/dist/server/manifest-source.js +36 -0
  82. package/dist/server/manifest-source.js.map +1 -0
  83. package/dist/server/routes.d.ts +11 -0
  84. package/dist/server/routes.d.ts.map +1 -0
  85. package/dist/server/routes.js +38 -0
  86. package/dist/server/routes.js.map +1 -0
  87. package/dist/server/schemas.d.ts +69 -0
  88. package/dist/server/schemas.d.ts.map +1 -0
  89. package/dist/server/schemas.js +78 -0
  90. package/dist/server/schemas.js.map +1 -0
  91. package/dist/server/tools.d.ts +49 -0
  92. package/dist/server/tools.d.ts.map +1 -0
  93. package/dist/server/tools.js +312 -0
  94. package/dist/server/tools.js.map +1 -0
  95. package/dist/view.d.ts +54 -0
  96. package/dist/view.d.ts.map +1 -0
  97. package/dist/view.js +15 -0
  98. package/dist/view.js.map +1 -0
  99. package/dist/vite/index.d.ts +3 -0
  100. package/dist/vite/index.d.ts.map +1 -0
  101. package/dist/vite/index.js +3 -0
  102. package/dist/vite/index.js.map +1 -0
  103. package/dist/vite/manifest.d.ts +5 -0
  104. package/dist/vite/manifest.d.ts.map +1 -0
  105. package/dist/vite/manifest.js +107 -0
  106. package/dist/vite/manifest.js.map +1 -0
  107. package/dist/vite/plugin.d.ts +16 -0
  108. package/dist/vite/plugin.d.ts.map +1 -0
  109. package/dist/vite/plugin.js +192 -0
  110. package/dist/vite/plugin.js.map +1 -0
  111. package/package.json +65 -3
@@ -0,0 +1,101 @@
1
+ import { jsonEqual } from "./json-equal.js";
2
+ export { jsonEqual };
3
+ export function notMounted(input) {
4
+ const target = input.key === undefined ? input.view : `${input.view} ${input.key}`;
5
+ return {
6
+ code: "not_mounted",
7
+ message: `${target} is not on screen. Call ui_screen to see what is.`,
8
+ };
9
+ }
10
+ export function userEditing(registry, target, changed, env) {
11
+ const document = env.document;
12
+ if (!document?.hasFocus())
13
+ return [];
14
+ const active = document.activeElement;
15
+ if (!active || active === registry.agentFocus() || registry.owner(active) !== target) {
16
+ return [];
17
+ }
18
+ const name = active.getAttribute("name");
19
+ return name !== null && changed.includes(name) ? [name] : [];
20
+ }
21
+ const NO_FIELDS = new Set();
22
+ export function agentFieldsOf(writes, current) {
23
+ if (writes.size === 0)
24
+ return NO_FIELDS;
25
+ return new Set([...writes.keys()].filter((field) => jsonEqual(current[field], writes.get(field))));
26
+ }
27
+ function refused(view, fields, detail) {
28
+ return {
29
+ code: "not_writable",
30
+ message: `${view.name}: ${detail}`,
31
+ issues: fields.map((path) => ({ path, message: "Not writable" })),
32
+ };
33
+ }
34
+ function unlistedFields(view, changed) {
35
+ const { writable } = view;
36
+ if (writable === true)
37
+ return [];
38
+ return changed.filter((field) => writable === false || !writable.includes(field));
39
+ }
40
+ function writableDetail(view) {
41
+ const { writable } = view;
42
+ return writable === false || writable === true || writable.length === 0
43
+ ? "this view is read-only."
44
+ : `only ${writable.join(", ")} can be written.`;
45
+ }
46
+ const pick = (source, fields) => Object.fromEntries(fields.filter((f) => Object.hasOwn(source, f)).map((f) => [f, source[f]]));
47
+ const segmentOf = (segment) => String(typeof segment === "object" ? segment.key : segment);
48
+ export async function setView(registry, input, env) {
49
+ const target = registry.find(input);
50
+ if (!target)
51
+ return notMounted(input);
52
+ const { view, binding } = target;
53
+ const changed = Object.keys(input.value);
54
+ const unlisted = unlistedFields(view, changed);
55
+ if (unlisted.length > 0 || !binding.set) {
56
+ return refused(view, unlisted.length > 0 ? unlisted : changed, writableDetail(view));
57
+ }
58
+ const editing = userEditing(registry, target, changed, env);
59
+ if (editing.length > 0) {
60
+ return {
61
+ code: "user_editing",
62
+ message: `The user is typing in ${editing.join(", ")}. Wait, or ask them.`,
63
+ issues: editing.map((path) => ({ path, message: "The user is typing here." })),
64
+ };
65
+ }
66
+ const checked = await view.schema["~standard"].validate({
67
+ ...binding.get(),
68
+ ...input.value,
69
+ });
70
+ if (checked.issues) {
71
+ return {
72
+ code: "invalid_value",
73
+ message: `${view.name} would be invalid with this value.`,
74
+ issues: checked.issues.map(({ path, message }) => ({
75
+ path: path?.map(segmentOf).join(".") ?? "",
76
+ message,
77
+ })),
78
+ };
79
+ }
80
+ const parsed = checked.value;
81
+ const dropped = changed.filter((field) => !Object.hasOwn(parsed, field));
82
+ if (dropped.length > 0) {
83
+ return refused(view, dropped, `${dropped.join(", ")} is not a field of this view.`);
84
+ }
85
+ const accepted = pick(parsed, changed);
86
+ const previous = target.writes;
87
+ registry.remember(target, accepted);
88
+ try {
89
+ await binding.set(parsed, changed);
90
+ }
91
+ catch (error) {
92
+ registry.restore(target, previous);
93
+ throw error;
94
+ }
95
+ const value = registry.find(input)?.binding.get() ?? parsed;
96
+ const normalised = changed.filter((field) => !jsonEqual(value[field], accepted[field]));
97
+ if (normalised.length > 0)
98
+ registry.remember(target, pick(value, normalised));
99
+ return { value, agentFields: [...agentFieldsOf(target.writes, value)] };
100
+ }
101
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/client/write.ts"],"names":[],"mappings":"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","sourcesContent":["import type { UiError, UiOpInput, UiOpResults } from \"../protocol.js\";\nimport type { AnyAgentView } from \"../view.js\";\nimport type { BrowserEnvironment } from \"./environment.js\";\nimport { jsonEqual } from \"./json-equal.js\";\nimport type { AgentWrites, MountedView, ViewRegistryRuntime } from \"./registry.js\";\n\nexport { jsonEqual };\n\nexport function notMounted(input: { view: string; key?: string | undefined }): UiError {\n const target = input.key === undefined ? input.view : `${input.view} ${input.key}`;\n return {\n code: \"not_mounted\",\n message: `${target} is not on screen. Call ui_screen to see what is.`,\n };\n}\n\nexport function userEditing(\n registry: Pick<ViewRegistryRuntime, \"owner\" | \"agentFocus\">,\n target: MountedView,\n changed: readonly string[],\n env: Pick<BrowserEnvironment, \"document\">,\n): readonly string[] {\n const document = env.document;\n if (!document?.hasFocus()) return [];\n const active = document.activeElement;\n if (!active || active === registry.agentFocus() || registry.owner(active) !== target) {\n return [];\n }\n const name = active.getAttribute(\"name\");\n return name !== null && changed.includes(name) ? [name] : [];\n}\n\nconst NO_FIELDS: ReadonlySet<string> = new Set();\n\nexport function agentFieldsOf(\n writes: AgentWrites,\n current: Readonly<Record<string, unknown>>,\n): ReadonlySet<string> {\n if (writes.size === 0) return NO_FIELDS;\n return new Set(\n [...writes.keys()].filter((field) => jsonEqual(current[field], writes.get(field))),\n );\n}\n\nfunction refused(view: AnyAgentView, fields: readonly string[], detail: string): UiError {\n return {\n code: \"not_writable\",\n message: `${view.name}: ${detail}`,\n issues: fields.map((path) => ({ path, message: \"Not writable\" })),\n };\n}\n\nfunction unlistedFields(view: AnyAgentView, changed: readonly string[]): string[] {\n const { writable } = view;\n if (writable === true) return [];\n return changed.filter((field) => writable === false || !writable.includes(field));\n}\n\nfunction writableDetail(view: AnyAgentView): string {\n const { writable } = view;\n return writable === false || writable === true || writable.length === 0\n ? \"this view is read-only.\"\n : `only ${writable.join(\", \")} can be written.`;\n}\n\nconst pick = (source: Readonly<Record<string, unknown>>, fields: readonly string[]) =>\n Object.fromEntries(\n fields.filter((f) => Object.hasOwn(source, f)).map((f) => [f, source[f]]),\n );\n\nconst segmentOf = (segment: PropertyKey | { readonly key: PropertyKey }) =>\n String(typeof segment === \"object\" ? segment.key : segment);\n\nexport async function setView(\n registry: ViewRegistryRuntime,\n input: UiOpInput<\"set\">,\n env: Pick<BrowserEnvironment, \"document\">,\n): Promise<UiOpResults[\"set\"] | UiError> {\n const target = registry.find(input);\n if (!target) return notMounted(input);\n const { view, binding } = target;\n const changed = Object.keys(input.value);\n\n const unlisted = unlistedFields(view, changed);\n if (unlisted.length > 0 || !binding.set) {\n return refused(view, unlisted.length > 0 ? unlisted : changed, writableDetail(view));\n }\n const editing = userEditing(registry, target, changed, env);\n if (editing.length > 0) {\n return {\n code: \"user_editing\",\n message: `The user is typing in ${editing.join(\", \")}. Wait, or ask them.`,\n issues: editing.map((path) => ({ path, message: \"The user is typing here.\" })),\n };\n }\n\n const checked = await view.schema[\"~standard\"].validate({\n ...binding.get(),\n ...input.value,\n });\n if (checked.issues) {\n return {\n code: \"invalid_value\",\n message: `${view.name} would be invalid with this value.`,\n issues: checked.issues.map(({ path, message }) => ({\n path: path?.map(segmentOf).join(\".\") ?? \"\",\n message,\n })),\n };\n }\n const parsed = checked.value;\n const dropped = changed.filter((field) => !Object.hasOwn(parsed, field));\n if (dropped.length > 0) {\n return refused(view, dropped, `${dropped.join(\", \")} is not a field of this view.`);\n }\n\n const accepted = pick(parsed, changed);\n const previous = target.writes;\n registry.remember(target, accepted);\n try {\n await binding.set(parsed, changed);\n } catch (error) {\n registry.restore(target, previous);\n throw error;\n }\n\n const value = registry.find(input)?.binding.get() ?? parsed;\n const normalised = changed.filter((field) => !jsonEqual(value[field], accepted[field]));\n if (normalised.length > 0) registry.remember(target, pick(value, normalised));\n return { value, agentFields: [...agentFieldsOf(target.writes, value)] };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export { type AgentRouteData, type JsonSchema, type ManifestBuild, type RouteEntry, routeHref, type UiAppInfo, UI_MANIFEST_FILE, type UiManifest, type ViewEntry, } from "./manifest.js";
2
+ export { type AgentOrigin, type AttentionSnapshot, type ClientMessage, type ClientSummary, type FocusSnapshot, type ItemSnapshot, type JsonObject, type KeyedViewSnapshot, type LeaveNotice, MAX_WATCHED_THREADS, type MatchedRouteSnapshot, type NotFoundRouteSnapshot, type PresenceUpdate, type QuerySnapshot, type QueryStatus, type RecentRef, type RouteSnapshot, type ScreenSnapshot, type SelectionSnapshot, type SingleViewSnapshot, type TruncatedValue, UI_CHANNEL, UI_ERROR_CODES, UI_OPS, type UiError, type UiErrorCode, type UiOp, type UiOpInput, type UiOpInputs, uiOpReadOnly, uiOps, type UiOpResults, type UiReply, type UiRequest, type ViewSnapshot, } from "./protocol.js";
3
+ export { type AgentViewBinding, type AgentViewConfig, type AgentViewDefinition, type AnyAgentView, defineAgentView, isAgentView, type IsWritable, type ViewField, type ViewRef, type ViewSchema, type ViewSetter, type ViewValue, type WritableField, } from "./view.js";
4
+ export { pagePattern, UNROUTED_HEADER } from "./pages.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,SAAS,EACT,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,UAAU,EACV,cAAc,EACd,MAAM,EACN,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,SAAS,EACd,KAAK,UAAU,EACf,YAAY,EACZ,KAAK,EACL,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,eAAe,EACf,WAAW,EACX,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { routeHref, UI_MANIFEST_FILE, } from "./manifest.js";
2
+ export { MAX_WATCHED_THREADS, UI_CHANNEL, UI_ERROR_CODES, UI_OPS, uiOpReadOnly, uiOps, } from "./protocol.js";
3
+ export { defineAgentView, isAgentView, } from "./view.js";
4
+ export { pagePattern, UNROUTED_HEADER } from "./pages.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,SAAS,EAET,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAUL,mBAAmB,EAYnB,UAAU,EACV,cAAc,EACd,MAAM,EAMN,YAAY,EACZ,KAAK,GAKN,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,eAAe,EACf,WAAW,GAQZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export {\n type AgentRouteData,\n type JsonSchema,\n type ManifestBuild,\n type RouteEntry,\n routeHref,\n type UiAppInfo,\n UI_MANIFEST_FILE,\n type UiManifest,\n type ViewEntry,\n} from \"./manifest.js\";\nexport {\n type AgentOrigin,\n type AttentionSnapshot,\n type ClientMessage,\n type ClientSummary,\n type FocusSnapshot,\n type ItemSnapshot,\n type JsonObject,\n type KeyedViewSnapshot,\n type LeaveNotice,\n MAX_WATCHED_THREADS,\n type MatchedRouteSnapshot,\n type NotFoundRouteSnapshot,\n type PresenceUpdate,\n type QuerySnapshot,\n type QueryStatus,\n type RecentRef,\n type RouteSnapshot,\n type ScreenSnapshot,\n type SelectionSnapshot,\n type SingleViewSnapshot,\n type TruncatedValue,\n UI_CHANNEL,\n UI_ERROR_CODES,\n UI_OPS,\n type UiError,\n type UiErrorCode,\n type UiOp,\n type UiOpInput,\n type UiOpInputs,\n uiOpReadOnly,\n uiOps,\n type UiOpResults,\n type UiReply,\n type UiRequest,\n type ViewSnapshot,\n} from \"./protocol.js\";\nexport {\n type AgentViewBinding,\n type AgentViewConfig,\n type AgentViewDefinition,\n type AnyAgentView,\n defineAgentView,\n isAgentView,\n type IsWritable,\n type ViewField,\n type ViewRef,\n type ViewSchema,\n type ViewSetter,\n type ViewValue,\n type WritableField,\n} from \"./view.js\";\nexport { pagePattern, UNROUTED_HEADER } from \"./pages.js\";\n"]}
@@ -0,0 +1,44 @@
1
+ import type { StaticDataRouteOption } from "@tanstack/router-core";
2
+ import type { AnyAgentView } from "./view.js";
3
+ declare module "@tanstack/router-core" {
4
+ interface StaticDataRouteOption {
5
+ readonly description?: string | undefined;
6
+ readonly views?: readonly AnyAgentView[] | undefined;
7
+ }
8
+ }
9
+ export type AgentRouteData = Pick<StaticDataRouteOption, "description" | "views">;
10
+ export declare const UI_MANIFEST_FILE = "ui-manifest.json";
11
+ export type JsonSchema = Readonly<Record<string, unknown>>;
12
+ export interface UiAppInfo {
13
+ readonly id: string;
14
+ readonly name: string;
15
+ readonly description?: string | undefined;
16
+ readonly scheme?: string | undefined;
17
+ }
18
+ export interface RouteEntry {
19
+ readonly path: string;
20
+ readonly description?: string | undefined;
21
+ readonly params: readonly string[];
22
+ readonly search?: JsonSchema | undefined;
23
+ readonly views: readonly string[];
24
+ }
25
+ export interface ViewEntry {
26
+ readonly name: string;
27
+ readonly description: string;
28
+ readonly keyed: boolean;
29
+ readonly schema?: JsonSchema | undefined;
30
+ readonly writable: readonly string[];
31
+ }
32
+ export interface UiManifest {
33
+ readonly protocol: 1;
34
+ readonly app: UiAppInfo;
35
+ readonly buildId?: string | undefined;
36
+ readonly routes: readonly RouteEntry[];
37
+ readonly views: readonly ViewEntry[];
38
+ }
39
+ export interface ManifestBuild {
40
+ readonly manifest: UiManifest;
41
+ readonly warnings: readonly string[];
42
+ }
43
+ export declare function routeHref(route: RouteEntry, params: Readonly<Record<string, string>> | undefined, search: Readonly<Record<string, unknown>> | undefined): string;
44
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,qBAAqB;QAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;KACtD;CACF;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC;AAElF,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,EACpD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACpD,MAAM,CAkBR"}
@@ -0,0 +1,23 @@
1
+ export const UI_MANIFEST_FILE = "ui-manifest.json";
2
+ export function routeHref(route, params, search) {
3
+ const path = route.path
4
+ .split("/")
5
+ .map((segment) => {
6
+ if (!segment.startsWith("$"))
7
+ return segment;
8
+ const value = params?.[segment === "$" ? "_splat" : segment.slice(1)] ?? "";
9
+ return segment === "$"
10
+ ? value.split("/").map(encodeURIComponent).join("/")
11
+ : encodeURIComponent(value);
12
+ })
13
+ .join("/");
14
+ const query = new URLSearchParams();
15
+ for (const [key, value] of Object.entries(search ?? {})) {
16
+ if (value === undefined)
17
+ continue;
18
+ query.set(key, typeof value === "string" ? value : JSON.stringify(value));
19
+ }
20
+ const queryString = query.toString();
21
+ return queryString ? `${path}?${queryString}` : path;
22
+ }
23
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAwCnD,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,MAAoD,EACpD,MAAqD;IAErD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5E,OAAO,OAAO,KAAK,GAAG;YACpB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACpD,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC","sourcesContent":["import type { StaticDataRouteOption } from \"@tanstack/router-core\";\n\nimport type { AnyAgentView } from \"./view.js\";\n\ndeclare module \"@tanstack/router-core\" {\n interface StaticDataRouteOption {\n readonly description?: string | undefined;\n readonly views?: readonly AnyAgentView[] | undefined;\n }\n}\n\nexport type AgentRouteData = Pick<StaticDataRouteOption, \"description\" | \"views\">;\n\nexport const UI_MANIFEST_FILE = \"ui-manifest.json\";\n\nexport type JsonSchema = Readonly<Record<string, unknown>>;\n\nexport interface UiAppInfo {\n readonly id: string;\n readonly name: string;\n readonly description?: string | undefined;\n readonly scheme?: string | undefined;\n}\n\nexport interface RouteEntry {\n readonly path: string;\n readonly description?: string | undefined;\n readonly params: readonly string[];\n readonly search?: JsonSchema | undefined;\n readonly views: readonly string[];\n}\n\nexport interface ViewEntry {\n readonly name: string;\n readonly description: string;\n readonly keyed: boolean;\n readonly schema?: JsonSchema | undefined;\n readonly writable: readonly string[];\n}\n\nexport interface UiManifest {\n readonly protocol: 1;\n readonly app: UiAppInfo;\n readonly buildId?: string | undefined;\n readonly routes: readonly RouteEntry[];\n readonly views: readonly ViewEntry[];\n}\n\nexport interface ManifestBuild {\n readonly manifest: UiManifest;\n readonly warnings: readonly string[];\n}\n\nexport function routeHref(\n route: RouteEntry,\n params: Readonly<Record<string, string>> | undefined,\n search: Readonly<Record<string, unknown>> | undefined,\n): string {\n const path = route.path\n .split(\"/\")\n .map((segment) => {\n if (!segment.startsWith(\"$\")) return segment;\n const value = params?.[segment === \"$\" ? \"_splat\" : segment.slice(1)] ?? \"\";\n return segment === \"$\"\n ? value.split(\"/\").map(encodeURIComponent).join(\"/\")\n : encodeURIComponent(value);\n })\n .join(\"/\");\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(search ?? {})) {\n if (value === undefined) continue;\n query.set(key, typeof value === \"string\" ? value : JSON.stringify(value));\n }\n const queryString = query.toString();\n return queryString ? `${path}?${queryString}` : path;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Marks the 404 the app's server answers when none of its routes match, so the host serves
3
+ * the app's document instead and the page shows its own not-found view.
4
+ */
5
+ export declare const UNROUTED_HEADER = "x-parlor-unrouted";
6
+ /**
7
+ * Matches the URL paths, with or without a query string, that the page route at `path`
8
+ * renders, case-insensitively like the router.
9
+ */
10
+ export declare function pagePattern(path: string): RegExp;
11
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAyBnD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD"}
package/dist/pages.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Marks the 404 the app's server answers when none of its routes match, so the host serves
3
+ * the app's document instead and the page shows its own not-found view.
4
+ */
5
+ export const UNROUTED_HEADER = "x-parlor-unrouted";
6
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
+ /** Mirrors `parseSegment` in `@tanstack/router-core`, erring towards matching more. */
8
+ function segmentSource(segment) {
9
+ if (segment === "$")
10
+ return { source: "(?:/.*)?", rest: true };
11
+ if (segment.startsWith("$"))
12
+ return { source: "/[^/]+", rest: false };
13
+ const open = segment.indexOf("{");
14
+ const close = segment.indexOf("}", open);
15
+ const optional = segment[open + 1] === "-";
16
+ const nameStart = open + (optional ? 3 : 2);
17
+ if (open < 0 || close < 0 || segment[nameStart - 1] !== "$") {
18
+ return { source: `/${escape(segment)}`, rest: false };
19
+ }
20
+ const prefix = escape(segment.slice(0, open));
21
+ const suffix = escape(segment.slice(close + 1));
22
+ if (optional)
23
+ return { source: `(?:/${prefix}[^/]+${suffix})?`, rest: false };
24
+ if (nameStart === close)
25
+ return { source: `/${prefix}.*`, rest: true };
26
+ return { source: `/${prefix}[^/]+${suffix}`, rest: false };
27
+ }
28
+ /**
29
+ * Matches the URL paths, with or without a query string, that the page route at `path`
30
+ * renders, case-insensitively like the router.
31
+ */
32
+ export function pagePattern(path) {
33
+ let source = "";
34
+ for (const segment of path.split("/").filter(Boolean)) {
35
+ const next = segmentSource(segment);
36
+ source += next.source;
37
+ if (next.rest)
38
+ break;
39
+ }
40
+ return new RegExp(`^${source}/?(?:\\?.*)?$`, "i");
41
+ }
42
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE7E,uFAAuF;AACvF,SAAS,aAAa,CAAC,OAAe;IAIpC,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,QAAQ,MAAM,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9E,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvE,OAAO,EAAE,MAAM,EAAE,IAAI,MAAM,QAAQ,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM;IACvB,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,eAAe,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC","sourcesContent":["/**\n * Marks the 404 the app's server answers when none of its routes match, so the host serves\n * the app's document instead and the page shows its own not-found view.\n */\nexport const UNROUTED_HEADER = \"x-parlor-unrouted\";\n\nconst escape = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Mirrors `parseSegment` in `@tanstack/router-core`, erring towards matching more. */\nfunction segmentSource(segment: string): {\n readonly source: string;\n readonly rest: boolean;\n} {\n if (segment === \"$\") return { source: \"(?:/.*)?\", rest: true };\n if (segment.startsWith(\"$\")) return { source: \"/[^/]+\", rest: false };\n const open = segment.indexOf(\"{\");\n const close = segment.indexOf(\"}\", open);\n const optional = segment[open + 1] === \"-\";\n const nameStart = open + (optional ? 3 : 2);\n if (open < 0 || close < 0 || segment[nameStart - 1] !== \"$\") {\n return { source: `/${escape(segment)}`, rest: false };\n }\n const prefix = escape(segment.slice(0, open));\n const suffix = escape(segment.slice(close + 1));\n if (optional) return { source: `(?:/${prefix}[^/]+${suffix})?`, rest: false };\n if (nameStart === close) return { source: `/${prefix}.*`, rest: true };\n return { source: `/${prefix}[^/]+${suffix}`, rest: false };\n}\n\n/**\n * Matches the URL paths, with or without a query string, that the page route at `path`\n * renders, case-insensitively like the router.\n */\nexport function pagePattern(path: string): RegExp {\n let source = \"\";\n for (const segment of path.split(\"/\").filter(Boolean)) {\n const next = segmentSource(segment);\n source += next.source;\n if (next.rest) break;\n }\n return new RegExp(`^${source}/?(?:\\\\?.*)?$`, \"i\");\n}\n"]}
@@ -0,0 +1,206 @@
1
+ import type { ActionSource } from "@parlor/core";
2
+ import type { ViewRef } from "./view.js";
3
+ export declare const UI_CHANNEL = "ui";
4
+ /** Presence names at most this many watched chat threads; a client sending more is truncated. */
5
+ export declare const MAX_WATCHED_THREADS = 8;
6
+ export interface UiOpInputs {
7
+ readonly screen: Readonly<Record<string, never>>;
8
+ readonly navigate: {
9
+ readonly to: string;
10
+ readonly params?: Readonly<Record<string, string>> | undefined;
11
+ readonly search?: Readonly<Record<string, unknown>> | undefined;
12
+ readonly replace?: boolean | undefined;
13
+ };
14
+ readonly set: {
15
+ readonly view: string;
16
+ readonly key?: string | undefined;
17
+ readonly value: JsonObject;
18
+ };
19
+ readonly highlight: {
20
+ readonly view: string;
21
+ readonly key?: string | undefined;
22
+ readonly field?: string | undefined;
23
+ };
24
+ }
25
+ export type UiOp = keyof UiOpInputs;
26
+ export type UiOpInput<O extends UiOp> = UiOpInputs[O];
27
+ export interface UiOpResults {
28
+ readonly screen: ScreenSnapshot;
29
+ readonly navigate: {
30
+ readonly screen: ScreenSnapshot;
31
+ };
32
+ readonly set: {
33
+ readonly value: JsonObject;
34
+ readonly agentFields: readonly string[];
35
+ };
36
+ readonly highlight: {
37
+ readonly shown: number;
38
+ };
39
+ }
40
+ interface UiOpSpec<O extends UiOp> {
41
+ readonly readOnly: boolean;
42
+ readonly input: (value: unknown) => UiOpInput<O> | undefined;
43
+ }
44
+ export declare const uiOps: {
45
+ readonly [O in UiOp]: UiOpSpec<O>;
46
+ };
47
+ export declare const UI_OPS: readonly UiOp[];
48
+ export declare const isUiOp: (value: unknown) => value is UiOp;
49
+ export declare const LEGACY_UI_OPS: readonly UiOp[];
50
+ export declare const uiOpReadOnly: {
51
+ readonly [O in UiOp]: boolean;
52
+ };
53
+ export interface AgentOrigin {
54
+ readonly via: Extract<ActionSource, "mcp" | "agent">;
55
+ readonly name?: string | undefined;
56
+ }
57
+ export type UiRequest = {
58
+ readonly [O in UiOp]: {
59
+ readonly id: string;
60
+ readonly op: O;
61
+ readonly input: UiOpInput<O>;
62
+ readonly origin: AgentOrigin;
63
+ readonly timeoutMs: number;
64
+ };
65
+ }[UiOp];
66
+ export declare const UI_ERROR_CODES: readonly ["unknown_route", "unknown_client", "ambiguous_client", "not_mounted", "not_writable", "invalid_value", "user_editing", "unsupported_op", "busy", "timeout", "outcome_unknown", "internal"];
67
+ export type UiErrorCode = (typeof UI_ERROR_CODES)[number];
68
+ export interface UiError {
69
+ readonly code: UiErrorCode;
70
+ readonly message: string;
71
+ readonly issues?: readonly {
72
+ readonly path: string;
73
+ readonly message: string;
74
+ }[] | undefined;
75
+ }
76
+ export type UiReply = {
77
+ readonly type: "reply";
78
+ readonly id: string;
79
+ readonly ok: true;
80
+ readonly result: unknown;
81
+ } | {
82
+ readonly type: "reply";
83
+ readonly id: string;
84
+ readonly ok: false;
85
+ readonly error: UiError;
86
+ };
87
+ export interface PresenceUpdate {
88
+ readonly type: "presence";
89
+ readonly focused: boolean;
90
+ readonly visible: boolean;
91
+ readonly platform: string;
92
+ readonly buildId?: string | undefined;
93
+ readonly ops?: readonly string[] | undefined;
94
+ readonly canConfirm?: boolean | undefined;
95
+ /** Chat threads this client shows; a confirmation bound to one reaches every watcher. */
96
+ readonly watching?: readonly string[] | undefined;
97
+ }
98
+ export interface LeaveNotice {
99
+ readonly type: "leave";
100
+ }
101
+ export interface ConfirmationAnswer {
102
+ readonly type: "answer";
103
+ readonly id: string;
104
+ readonly approve: boolean;
105
+ }
106
+ export type ClientMessage = UiReply | PresenceUpdate | LeaveNotice | ConfirmationAnswer;
107
+ export interface ConfirmationPrompt {
108
+ readonly id: string;
109
+ readonly action: string;
110
+ readonly description: string;
111
+ readonly input: unknown;
112
+ readonly origin: AgentOrigin;
113
+ readonly expiresInMs: number;
114
+ /** The chat thread whose turn asked; the chat renders the card inline there. */
115
+ readonly threadId?: string | undefined;
116
+ }
117
+ export interface ConfirmationsFrame {
118
+ readonly type: "confirmations";
119
+ readonly items: readonly ConfirmationPrompt[];
120
+ }
121
+ export type UiFrame = UiRequest | ConfirmationsFrame;
122
+ export type JsonObject = {
123
+ readonly [key: string]: unknown;
124
+ };
125
+ export interface TruncatedValue {
126
+ readonly truncated: true;
127
+ readonly bytes: number;
128
+ }
129
+ export interface MatchedRouteSnapshot {
130
+ readonly notFound: false;
131
+ readonly path: string;
132
+ readonly params: Readonly<Record<string, string>>;
133
+ readonly search: JsonObject;
134
+ readonly url: string;
135
+ }
136
+ export interface NotFoundRouteSnapshot {
137
+ readonly notFound: true;
138
+ readonly url: string;
139
+ }
140
+ export type RouteSnapshot = MatchedRouteSnapshot | NotFoundRouteSnapshot;
141
+ export type QueryStatus = "pending" | "error" | "success";
142
+ export interface QuerySnapshot {
143
+ readonly action: string;
144
+ readonly input: unknown;
145
+ readonly status: QueryStatus;
146
+ }
147
+ export interface SingleViewSnapshot {
148
+ readonly value: JsonObject | TruncatedValue;
149
+ readonly shown?: number | undefined;
150
+ }
151
+ export interface ItemSnapshot {
152
+ readonly key: string;
153
+ readonly value: JsonObject | TruncatedValue;
154
+ readonly shown: number;
155
+ }
156
+ export interface KeyedViewSnapshot {
157
+ readonly items: readonly ItemSnapshot[];
158
+ readonly offscreen: number;
159
+ }
160
+ export type ViewSnapshot = SingleViewSnapshot | KeyedViewSnapshot;
161
+ export interface RecentRef extends ViewRef {
162
+ readonly agoMs: number;
163
+ }
164
+ export interface FocusSnapshot {
165
+ readonly view?: string | undefined;
166
+ readonly key?: string | undefined;
167
+ readonly field?: string | undefined;
168
+ readonly label?: string | undefined;
169
+ }
170
+ export interface SelectionSnapshot {
171
+ readonly text: string;
172
+ readonly within: ViewRef;
173
+ readonly truncated: boolean;
174
+ }
175
+ export interface AttentionSnapshot {
176
+ readonly focus: FocusSnapshot | null;
177
+ readonly selection: SelectionSnapshot | null;
178
+ readonly lastInteracted: RecentRef | null;
179
+ readonly lastEntered: RecentRef | null;
180
+ readonly focal: ViewRef | null;
181
+ }
182
+ export interface ScreenSnapshot {
183
+ readonly route: RouteSnapshot | null;
184
+ readonly queries: readonly QuerySnapshot[];
185
+ readonly views: Readonly<Record<string, ViewSnapshot>>;
186
+ readonly attention: AttentionSnapshot;
187
+ readonly truncated: boolean;
188
+ }
189
+ export interface ClientSummary {
190
+ readonly id: string;
191
+ readonly platform: string;
192
+ readonly buildId?: string | undefined;
193
+ readonly focused: boolean;
194
+ readonly visible: boolean;
195
+ readonly seenAgoMs: number;
196
+ }
197
+ export type ParsedUiFrame = {
198
+ readonly ok: true;
199
+ readonly frame: UiFrame;
200
+ } | {
201
+ readonly ok: false;
202
+ readonly id: string | undefined;
203
+ };
204
+ export declare function parseUiFrame(data: string): ParsedUiFrame;
205
+ export {};
206
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}