@parlor/agent-ui 0.0.0-stage → 0.1.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 (107) 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 +4 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +4 -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/protocol.d.ts +206 -0
  48. package/dist/protocol.d.ts.map +1 -0
  49. package/dist/protocol.js +152 -0
  50. package/dist/protocol.js.map +1 -0
  51. package/dist/server/agent-ui.d.ts +36 -0
  52. package/dist/server/agent-ui.d.ts.map +1 -0
  53. package/dist/server/agent-ui.js +89 -0
  54. package/dist/server/agent-ui.js.map +1 -0
  55. package/dist/server/audience.d.ts +9 -0
  56. package/dist/server/audience.d.ts.map +1 -0
  57. package/dist/server/audience.js +15 -0
  58. package/dist/server/audience.js.map +1 -0
  59. package/dist/server/broker.d.ts +29 -0
  60. package/dist/server/broker.d.ts.map +1 -0
  61. package/dist/server/broker.js +152 -0
  62. package/dist/server/broker.js.map +1 -0
  63. package/dist/server/confirmations.d.ts +40 -0
  64. package/dist/server/confirmations.d.ts.map +1 -0
  65. package/dist/server/confirmations.js +230 -0
  66. package/dist/server/confirmations.js.map +1 -0
  67. package/dist/server/directory.d.ts +41 -0
  68. package/dist/server/directory.d.ts.map +1 -0
  69. package/dist/server/directory.js +193 -0
  70. package/dist/server/directory.js.map +1 -0
  71. package/dist/server/index.d.ts +10 -0
  72. package/dist/server/index.d.ts.map +1 -0
  73. package/dist/server/index.js +10 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/manifest-source.d.ts +10 -0
  76. package/dist/server/manifest-source.d.ts.map +1 -0
  77. package/dist/server/manifest-source.js +36 -0
  78. package/dist/server/manifest-source.js.map +1 -0
  79. package/dist/server/routes.d.ts +11 -0
  80. package/dist/server/routes.d.ts.map +1 -0
  81. package/dist/server/routes.js +38 -0
  82. package/dist/server/routes.js.map +1 -0
  83. package/dist/server/schemas.d.ts +69 -0
  84. package/dist/server/schemas.d.ts.map +1 -0
  85. package/dist/server/schemas.js +78 -0
  86. package/dist/server/schemas.js.map +1 -0
  87. package/dist/server/tools.d.ts +49 -0
  88. package/dist/server/tools.d.ts.map +1 -0
  89. package/dist/server/tools.js +312 -0
  90. package/dist/server/tools.js.map +1 -0
  91. package/dist/view.d.ts +54 -0
  92. package/dist/view.d.ts.map +1 -0
  93. package/dist/view.js +15 -0
  94. package/dist/view.js.map +1 -0
  95. package/dist/vite/index.d.ts +3 -0
  96. package/dist/vite/index.d.ts.map +1 -0
  97. package/dist/vite/index.js +3 -0
  98. package/dist/vite/index.js.map +1 -0
  99. package/dist/vite/manifest.d.ts +5 -0
  100. package/dist/vite/manifest.d.ts.map +1 -0
  101. package/dist/vite/manifest.js +107 -0
  102. package/dist/vite/manifest.js.map +1 -0
  103. package/dist/vite/plugin.d.ts +10 -0
  104. package/dist/vite/plugin.d.ts.map +1 -0
  105. package/dist/vite/plugin.js +143 -0
  106. package/dist/vite/plugin.js.map +1 -0
  107. package/package.json +65 -3
@@ -0,0 +1,193 @@
1
+ import { isUiOp, LEGACY_UI_OPS, } from "../protocol.js";
2
+ import { audienceOf } from "./audience.js";
3
+ export class ClientDirectory {
4
+ #now;
5
+ #byId = new Map();
6
+ #byScope = new Map();
7
+ #unannounced = new Map();
8
+ #listeners = new Set();
9
+ constructor(now = Date.now) {
10
+ this.#now = now;
11
+ }
12
+ subscribe(listener) {
13
+ this.#listeners.add(listener);
14
+ return () => this.#listeners.delete(listener);
15
+ }
16
+ connect(stream) {
17
+ const { clientId } = stream;
18
+ if (clientId === undefined)
19
+ return () => { };
20
+ const connection = {
21
+ ...stream,
22
+ scope: audienceOf(stream.scope, stream.principal),
23
+ };
24
+ this.#keepUnannounced(clientId, [
25
+ ...(this.#unannounced.get(clientId) ?? []),
26
+ connection,
27
+ ]);
28
+ return () => this.#disconnect(clientId, connection);
29
+ }
30
+ touch(clientId, scope) {
31
+ if (clientId === undefined)
32
+ return;
33
+ const entry = this.#byId.get(clientId);
34
+ if (!entry || entry.client.scope !== scope)
35
+ return;
36
+ entry.client = { ...entry.client, seenAt: this.#now() };
37
+ this.#notify(entry.client, "updated");
38
+ }
39
+ presence(clientId, scope, update) {
40
+ const announcing = this.#takeUnannounced(clientId, scope);
41
+ let entry = this.#byId.get(clientId);
42
+ if (entry && entry.client.scope !== scope) {
43
+ if (announcing.length === 0)
44
+ return "rejected";
45
+ this.#forget(entry);
46
+ entry = undefined;
47
+ }
48
+ if (!entry && announcing.length === 0)
49
+ return "rejected";
50
+ const client = {
51
+ id: clientId,
52
+ scope,
53
+ platform: update.platform,
54
+ buildId: update.buildId,
55
+ focused: update.focused,
56
+ visible: update.visible,
57
+ ops: update.ops ? update.ops.filter(isUiOp) : LEGACY_UI_OPS,
58
+ canConfirm: update.canConfirm ?? false,
59
+ watching: update.watching ?? [],
60
+ seenAt: this.#now(),
61
+ };
62
+ if (entry) {
63
+ entry.client = client;
64
+ }
65
+ else {
66
+ entry = { client, connections: [] };
67
+ this.#byId.set(clientId, entry);
68
+ this.#scopeSet(scope).add(entry);
69
+ }
70
+ entry.connections.push(...announcing);
71
+ const outcome = announcing.length > 0 ? "registered" : "updated";
72
+ this.#notify(client, outcome === "registered" ? "joined" : "updated");
73
+ return outcome;
74
+ }
75
+ leave(clientId, scope) {
76
+ const entry = this.#byId.get(clientId);
77
+ if (!entry || entry.client.scope !== scope)
78
+ return false;
79
+ const released = entry.connections.splice(0);
80
+ this.#forget(entry);
81
+ this.#keepUnannounced(clientId, [
82
+ ...(this.#unannounced.get(clientId) ?? []),
83
+ ...released,
84
+ ]);
85
+ return true;
86
+ }
87
+ connected(scope, clientId) {
88
+ return this.#byId.get(clientId)?.client.scope === scope;
89
+ }
90
+ targets(scope) {
91
+ return [...(this.#byScope.get(scope) ?? [])].map((entry) => this.#targetOf(entry));
92
+ }
93
+ target(clientId) {
94
+ const entry = this.#byId.get(clientId);
95
+ return entry && this.#targetOf(entry);
96
+ }
97
+ select(scope, clientId) {
98
+ const entries = [...(this.#byScope.get(scope) ?? [])];
99
+ if (entries.length === 0)
100
+ return undefined;
101
+ const explicit = clientId === undefined ? undefined : this.#byId.get(clientId);
102
+ if (explicit && explicit.client.scope === scope) {
103
+ return { target: this.#targetOf(explicit), tied: [] };
104
+ }
105
+ const focused = entries.filter((e) => e.client.focused);
106
+ if (focused.length > 0)
107
+ return this.#mostRecent(focused, () => true);
108
+ const visible = entries.filter((e) => e.client.visible);
109
+ const pool = visible.length > 0 ? visible : entries;
110
+ return this.#mostRecent(pool, (a, b) => a.client.seenAt === b.client.seenAt);
111
+ }
112
+ summaries(scope) {
113
+ return [...(this.#byScope.get(scope) ?? [])].map((entry) => this.summary(entry.client));
114
+ }
115
+ summary(client) {
116
+ return {
117
+ id: client.id,
118
+ platform: client.platform,
119
+ ...(client.buildId === undefined ? {} : { buildId: client.buildId }),
120
+ focused: client.focused,
121
+ visible: client.visible,
122
+ seenAgoMs: Math.max(0, this.#now() - client.seenAt),
123
+ };
124
+ }
125
+ #mostRecent(pool, ties) {
126
+ let best = pool[0];
127
+ for (const entry of pool)
128
+ if (entry.client.seenAt >= best.client.seenAt)
129
+ best = entry;
130
+ const tied = pool.filter((entry) => entry !== best && ties(entry, best));
131
+ return { target: this.#targetOf(best), tied: tied.map((entry) => entry.client) };
132
+ }
133
+ #targetOf(entry) {
134
+ return {
135
+ client: entry.client,
136
+ send: (data) => {
137
+ const connection = entry.connections.at(-1);
138
+ if (!connection)
139
+ return false;
140
+ connection.send(data);
141
+ return true;
142
+ },
143
+ };
144
+ }
145
+ #takeUnannounced(clientId, scope) {
146
+ const waiting = this.#unannounced.get(clientId) ?? [];
147
+ this.#keepUnannounced(clientId, waiting.filter((connection) => connection.scope !== scope));
148
+ return waiting.filter((connection) => connection.scope === scope);
149
+ }
150
+ #keepUnannounced(clientId, connections) {
151
+ if (connections.length > 0)
152
+ this.#unannounced.set(clientId, connections);
153
+ else
154
+ this.#unannounced.delete(clientId);
155
+ }
156
+ #disconnect(clientId, connection) {
157
+ const waiting = this.#unannounced.get(clientId);
158
+ if (waiting?.includes(connection)) {
159
+ this.#keepUnannounced(clientId, waiting.filter((candidate) => candidate !== connection));
160
+ return;
161
+ }
162
+ const entry = this.#byId.get(clientId);
163
+ const index = entry?.connections.indexOf(connection) ?? -1;
164
+ if (!entry || index === -1)
165
+ return;
166
+ entry.connections.splice(index, 1);
167
+ if (entry.connections.length === 0)
168
+ this.#forget(entry);
169
+ }
170
+ #forget(entry) {
171
+ if (this.#byId.get(entry.client.id) !== entry)
172
+ return;
173
+ this.#byId.delete(entry.client.id);
174
+ const peers = this.#byScope.get(entry.client.scope);
175
+ peers?.delete(entry);
176
+ if (peers?.size === 0)
177
+ this.#byScope.delete(entry.client.scope);
178
+ this.#notify(entry.client, "left");
179
+ }
180
+ #notify(client, change) {
181
+ for (const listener of this.#listeners)
182
+ listener(client.scope, client.id, change);
183
+ }
184
+ #scopeSet(scope) {
185
+ let set = this.#byScope.get(scope);
186
+ if (!set) {
187
+ set = new Set();
188
+ this.#byScope.set(scope, set);
189
+ }
190
+ return set;
191
+ }
192
+ }
193
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/server/directory.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,MAAM,EACN,aAAa,GAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwC3C,MAAM,OAAO,eAAe;IACjB,IAAI,CAAe;IACnB,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjC,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzC,YAAY,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEtD,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEnD,YAAY,GAAG,GAAiB,IAAI,CAAC,GAAG;QACtC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,QAA2B;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,MAAyB;QAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAC5B,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAsB;YACpC,GAAG,MAAM;YACT,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;SAClD,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1C,UAAU;SACX,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,QAA4B,EAAE,KAAa;QAC/C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO;QACnD,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,KAAa,EAAE,MAAsB;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACzD,MAAM,MAAM,GAAoB;YAC9B,EAAE,EAAE,QAAQ;YACZ,KAAK;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa;YAC3D,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;YACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;SACpB,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,KAAa;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1C,GAAG,QAAQ;SACZ,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAgB;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,QAAgB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAiB;QACrC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAChD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACxD,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACpD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACzD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAuB;QAC7B,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACpE,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAa,EAAE,IAAqC;QAC9D,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,IAAI,GAAG,KAAK,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACzE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,SAAS,CAAC,KAAY;QACpB,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;gBACb,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,UAAU;oBAAE,OAAO,KAAK,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,QAAgB,EAAE,KAAa;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,gBAAgB,CACnB,QAAQ,EACR,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,CAC3D,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,gBAAgB,CAAC,QAAgB,EAAE,WAAgC;QACjE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;;YACpE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,UAA6B;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,CACnB,QAAQ,EACR,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,UAAU,CAAC,CACxD,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO;QACnC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,KAAY;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK;YAAE,OAAO;QACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,MAAuB,EAAE,MAAuB;QACtD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU;YAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { type AgentUi, type AgentUiDependencies, type AgentUiOptions, createAgentUi, DEFAULT_UI_TIMEOUT_MS, type ExternalUiPolicy, webOriginFromEnv, } from "./agent-ui.js";
2
+ export { audienceOf, userAudience } from "./audience.js";
3
+ export { type ConfirmationOutcome, type ConfirmationRequest, type ConfirmationThread, DEFAULT_CONFIRM_TIMEOUT_MS, } from "./confirmations.js";
4
+ export { fileManifestSource, type UiManifestInput, type UiManifestSource, } from "./manifest-source.js";
5
+ export { type BrokerOptions, UiBroker, UiFailure, type UiReceipt } from "./broker.js";
6
+ export { ClientDirectory, type ClientTarget, type ConnectedClient, type PresenceOutcome, type Selection, } from "./directory.js";
7
+ export { type AgentUiRouteOptions, MAX_CLIENT_MESSAGE_BYTES, registerAgentUiRoutes, } from "./routes.js";
8
+ export { parseClientMessage, uiOpInputs } from "./schemas.js";
9
+ export { type AgentTool, type AgentToolContext, type HighlightToolResult, type NavigateToolResult, type ScreenToolResult, type SetToolResult, UI_MANIFEST_RESOURCE, UI_TOOLS, type UiToolName, type UnreachableResult, } from "./tools.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,aAAa,EACb,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,mBAAmB,EACxB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,oBAAoB,EACpB,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { createAgentUi, DEFAULT_UI_TIMEOUT_MS, webOriginFromEnv, } from "./agent-ui.js";
2
+ export { audienceOf, userAudience } from "./audience.js";
3
+ export { DEFAULT_CONFIRM_TIMEOUT_MS, } from "./confirmations.js";
4
+ export { fileManifestSource, } from "./manifest-source.js";
5
+ export { UiBroker, UiFailure } from "./broker.js";
6
+ export { ClientDirectory, } from "./directory.js";
7
+ export { MAX_CLIENT_MESSAGE_BYTES, registerAgentUiRoutes, } from "./routes.js";
8
+ export { parseClientMessage, uiOpInputs } from "./schemas.js";
9
+ export { UI_MANIFEST_RESOURCE, UI_TOOLS, } from "./tools.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,EACb,qBAAqB,EAErB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAIL,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,GAGnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAsB,QAAQ,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACtF,OAAO,EACL,eAAe,GAKhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAOL,oBAAoB,EACpB,QAAQ,GAGT,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { UiManifest, ViewEntry } from "../manifest.js";
2
+ export type UiManifestInput = Omit<UiManifest, "views"> & {
3
+ readonly views: readonly (Omit<ViewEntry, "writable"> & {
4
+ readonly writable?: readonly string[] | undefined;
5
+ })[];
6
+ };
7
+ export type UiManifestSource = () => UiManifestInput | undefined;
8
+ export declare function normalizeManifest(manifest: UiManifestInput): UiManifest;
9
+ export declare function fileManifestSource(path: string): UiManifestSource;
10
+ //# sourceMappingURL=manifest-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-source.d.ts","sourceRoot":"","sources":["../../src/server/manifest-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG;IACxD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG;QACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;KACnD,CAAC,EAAE,CAAC;CACN,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,eAAe,GAAG,SAAS,CAAC;AAEjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,UAAU,CAKvE;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAqBjE"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync, statSync } from "node:fs";
2
+ export function normalizeManifest(manifest) {
3
+ return {
4
+ ...manifest,
5
+ views: manifest.views.map((view) => ({ ...view, writable: view.writable ?? [] })),
6
+ };
7
+ }
8
+ function readManifest(path) {
9
+ return normalizeManifest(JSON.parse(readFileSync(path, "utf8")));
10
+ }
11
+ export function fileManifestSource(path) {
12
+ let mtimeMs;
13
+ let manifest;
14
+ return () => {
15
+ let stat;
16
+ try {
17
+ stat = statSync(path);
18
+ }
19
+ catch {
20
+ mtimeMs = undefined;
21
+ manifest = undefined;
22
+ return undefined;
23
+ }
24
+ if (stat.mtimeMs === mtimeMs)
25
+ return manifest;
26
+ try {
27
+ manifest = readManifest(path);
28
+ mtimeMs = stat.mtimeMs;
29
+ }
30
+ catch {
31
+ return manifest;
32
+ }
33
+ return manifest;
34
+ };
35
+ }
36
+ //# sourceMappingURL=manifest-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-source.js","sourceRoot":"","sources":["../../src/server/manifest-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYjD,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;KAClF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAoB,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,OAA2B,CAAC;IAChC,IAAI,QAAgC,CAAC;IACrC,OAAO,GAAG,EAAE;QACV,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,SAAS,CAAC;YACpB,QAAQ,GAAG,SAAS,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { H3 } from "h3";
2
+ import type { AgentUi } from "./agent-ui.js";
3
+ export declare const MAX_CLIENT_MESSAGE_BYTES: number;
4
+ export interface AgentUiRouteOptions {
5
+ readonly basePath: string;
6
+ readonly agentUi: AgentUi;
7
+ readonly audience: (request: Request) => string | Promise<string>;
8
+ readonly clientId: (request: Request) => string | undefined;
9
+ }
10
+ export declare function registerAgentUiRoutes(app: H3, options: AgentUiRouteOptions): void;
11
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,wBAAwB,QAAa,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7D;AAID,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA6BjF"}
@@ -0,0 +1,38 @@
1
+ import { parseClientMessage } from "./schemas.js";
2
+ export const MAX_CLIENT_MESSAGE_BYTES = 256 * 1024;
3
+ const status = (code) => new Response(null, { status: code });
4
+ export function registerAgentUiRoutes(app, options) {
5
+ const { basePath, agentUi, audience, clientId } = options;
6
+ app.post(`${basePath}/ui`, async (event) => {
7
+ const request = event.req;
8
+ if (Number(request.headers.get("content-length") ?? 0) > MAX_CLIENT_MESSAGE_BYTES) {
9
+ return status(413);
10
+ }
11
+ const body = await request.text();
12
+ if (new TextEncoder().encode(body).byteLength > MAX_CLIENT_MESSAGE_BYTES) {
13
+ return status(413);
14
+ }
15
+ const id = clientId(request);
16
+ if (!id)
17
+ return status(400);
18
+ let json;
19
+ try {
20
+ json = JSON.parse(body);
21
+ }
22
+ catch {
23
+ return status(400);
24
+ }
25
+ const message = parseClientMessage(json);
26
+ if (!message)
27
+ return status(400);
28
+ const receipt = agentUi.receive(id, await audience(request), message);
29
+ if (!receipt.accepted)
30
+ return status(404);
31
+ if (receipt.next === undefined)
32
+ return status(204);
33
+ return new Response(receipt.next, {
34
+ headers: { "content-type": "application/json" },
35
+ });
36
+ });
37
+ }
38
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,GAAG,IAAI,CAAC;AASnD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAEtE,MAAM,UAAU,qBAAqB,CAAC,GAAO,EAAE,OAA4B;IACzE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1D,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC;QAC1B,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,wBAAwB,EAAE,CAAC;YAClF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,wBAAwB,EAAE,CAAC;YACzE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;YAChC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { z } from "zod";
2
+ import { type ClientMessage } from "../protocol.js";
3
+ export declare const uiOpInputs: {
4
+ screen: z.ZodObject<{}, z.core.$strip>;
5
+ navigate: z.ZodObject<{
6
+ to: z.ZodString;
7
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
8
+ search: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
9
+ replace: z.ZodOptional<z.ZodBoolean>;
10
+ }, z.core.$strip>;
11
+ set: z.ZodObject<{
12
+ view: z.ZodString;
13
+ key: z.ZodOptional<z.ZodString>;
14
+ value: z.ZodRecord<z.ZodString, z.ZodUnknown>;
15
+ }, z.core.$strip>;
16
+ highlight: z.ZodObject<{
17
+ view: z.ZodString;
18
+ key: z.ZodOptional<z.ZodString>;
19
+ field: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>;
21
+ };
22
+ export declare const clientMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
23
+ type: z.ZodLiteral<"reply">;
24
+ id: z.ZodString;
25
+ ok: z.ZodLiteral<true>;
26
+ result: z.ZodUnknown;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ type: z.ZodLiteral<"reply">;
29
+ id: z.ZodString;
30
+ ok: z.ZodLiteral<false>;
31
+ error: z.ZodObject<{
32
+ code: z.ZodEnum<{
33
+ ambiguous_client: "ambiguous_client";
34
+ busy: "busy";
35
+ internal: "internal";
36
+ invalid_value: "invalid_value";
37
+ not_mounted: "not_mounted";
38
+ not_writable: "not_writable";
39
+ outcome_unknown: "outcome_unknown";
40
+ timeout: "timeout";
41
+ unknown_client: "unknown_client";
42
+ unknown_route: "unknown_route";
43
+ unsupported_op: "unsupported_op";
44
+ user_editing: "user_editing";
45
+ }>;
46
+ message: z.ZodString;
47
+ issues: z.ZodOptional<z.ZodArray<z.ZodObject<{
48
+ path: z.ZodString;
49
+ message: z.ZodString;
50
+ }, z.core.$strip>>>;
51
+ }, z.core.$strip>;
52
+ }, z.core.$strip>, z.ZodObject<{
53
+ type: z.ZodLiteral<"presence">;
54
+ focused: z.ZodBoolean;
55
+ visible: z.ZodBoolean;
56
+ platform: z.ZodString;
57
+ buildId: z.ZodOptional<z.ZodString>;
58
+ ops: z.ZodOptional<z.ZodArray<z.ZodString>>;
59
+ canConfirm: z.ZodOptional<z.ZodBoolean>;
60
+ watching: z.ZodCatch<z.ZodOptional<z.ZodPipe<z.ZodArray<z.ZodUnknown>, z.ZodTransform<string[], unknown[]>>>>;
61
+ }, z.core.$strip>, z.ZodObject<{
62
+ type: z.ZodLiteral<"leave">;
63
+ }, z.core.$strip>, z.ZodObject<{
64
+ type: z.ZodLiteral<"answer">;
65
+ id: z.ZodString;
66
+ approve: z.ZodBoolean;
67
+ }, z.core.$strip>]>;
68
+ export declare function parseClientMessage(body: unknown): ClientMessage | undefined;
69
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,aAAa,EAAuC,MAAM,gBAAgB,CAAC;AAEzF,eAAO,MAAM,UAAU;IACrB,MAAM;IACN,QAAQ;;;;;;IAeR,GAAG;;;;;IAOH,SAAS;;;;;CAQV,CAAC;AAkBF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAyB9B,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CAG3E"}
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import { MAX_WATCHED_THREADS, UI_ERROR_CODES } from "../protocol.js";
3
+ export const uiOpInputs = {
4
+ screen: z.object({}),
5
+ navigate: z.object({
6
+ to: z.string(),
7
+ params: z
8
+ .record(z.string(), z.string())
9
+ .optional()
10
+ .describe('Values for the $params in the path, e.g. { "taskId": "..." }.'),
11
+ search: z
12
+ .record(z.string(), z.unknown())
13
+ .optional()
14
+ .describe("Search params for the page, as its entry in the list names them."),
15
+ replace: z
16
+ .boolean()
17
+ .optional()
18
+ .describe("Replace the current history entry instead of pushing one."),
19
+ }),
20
+ set: z.object({
21
+ view: z.string().describe("A writable view's name, as listed."),
22
+ key: z.string().optional().describe("The item's key, for a keyed view."),
23
+ value: z
24
+ .record(z.string(), z.unknown())
25
+ .describe("The fields to write; others keep their current value."),
26
+ }),
27
+ highlight: z.object({
28
+ view: z.string().describe("A view's name, as ui_screen reports it."),
29
+ key: z.string().optional().describe("The item's key, for a keyed view."),
30
+ field: z
31
+ .string()
32
+ .optional()
33
+ .describe("A field inside the view to focus, by its input name."),
34
+ }),
35
+ };
36
+ const errorSchema = z.object({
37
+ code: z.enum(UI_ERROR_CODES),
38
+ message: z.string(),
39
+ issues: z.array(z.object({ path: z.string(), message: z.string() })).optional(),
40
+ });
41
+ const watchingSchema = z
42
+ .array(z.unknown())
43
+ .transform((ids) => ids
44
+ .filter((id) => typeof id === "string" && id !== "")
45
+ .slice(0, MAX_WATCHED_THREADS))
46
+ .optional()
47
+ .catch(undefined);
48
+ export const clientMessageSchema = z.union([
49
+ z.object({
50
+ type: z.literal("reply"),
51
+ id: z.string().min(1),
52
+ ok: z.literal(true),
53
+ result: z.unknown(),
54
+ }),
55
+ z.object({
56
+ type: z.literal("reply"),
57
+ id: z.string().min(1),
58
+ ok: z.literal(false),
59
+ error: errorSchema,
60
+ }),
61
+ z.object({
62
+ type: z.literal("presence"),
63
+ focused: z.boolean(),
64
+ visible: z.boolean(),
65
+ platform: z.string(),
66
+ buildId: z.string().optional(),
67
+ ops: z.array(z.string()).optional(),
68
+ canConfirm: z.boolean().optional(),
69
+ watching: watchingSchema,
70
+ }),
71
+ z.object({ type: z.literal("leave") }),
72
+ z.object({ type: z.literal("answer"), id: z.string().min(1), approve: z.boolean() }),
73
+ ]);
74
+ export function parseClientMessage(body) {
75
+ const parsed = clientMessageSchema.safeParse(body);
76
+ return parsed.success ? parsed.data : undefined;
77
+ }
78
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/server/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ import { type UiManifest } from "../manifest.js";
3
+ import { type AgentOrigin, type ClientSummary, type ScreenSnapshot, type UiOp, type UiOpResults } from "../protocol.js";
4
+ import { type UiBroker } from "./broker.js";
5
+ import type { ClientDirectory } from "./directory.js";
6
+ export type UiToolName = `ui_${UiOp}`;
7
+ export declare const UI_TOOLS: readonly UiToolName[];
8
+ export declare const UI_MANIFEST_RESOURCE = "parlor://manifest";
9
+ export interface AgentToolContext {
10
+ readonly scope: string;
11
+ readonly clientId?: string | undefined;
12
+ readonly origin: AgentOrigin;
13
+ readonly signal?: AbortSignal | undefined;
14
+ readonly webOrigin?: string | undefined;
15
+ }
16
+ export interface AgentTool<I extends z.ZodObject = z.ZodObject> {
17
+ readonly name: UiToolName;
18
+ readonly description: string;
19
+ readonly input: I;
20
+ readonly readOnly: boolean;
21
+ run(input: z.output<I>, ctx: AgentToolContext): Promise<unknown>;
22
+ }
23
+ export interface ScreenToolResult extends ScreenSnapshot {
24
+ readonly client: ClientSummary;
25
+ readonly otherClients: readonly ClientSummary[];
26
+ readonly tiedWith?: readonly string[] | undefined;
27
+ }
28
+ export interface NavigateToolResult {
29
+ readonly client: ClientSummary;
30
+ readonly screen: ScreenSnapshot;
31
+ }
32
+ export type SetToolResult = UiOpResults["set"] & {
33
+ readonly client: ClientSummary;
34
+ };
35
+ export type HighlightToolResult = UiOpResults["highlight"] & {
36
+ readonly client: ClientSummary;
37
+ };
38
+ export interface UnreachableResult {
39
+ readonly reachable: false;
40
+ readonly reason: "no_client";
41
+ readonly href?: string | undefined;
42
+ }
43
+ export interface UiToolDeps {
44
+ readonly directory: ClientDirectory;
45
+ readonly broker: UiBroker;
46
+ }
47
+ export declare function createUiTools(deps: UiToolDeps): (manifest: UiManifest | undefined) => readonly AgentTool[];
48
+ export declare function uiInstructions(): string;
49
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,QAAQ,EAAa,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,gBAAgB,CAAC;AAGjE,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,EAAE,CAAC;AAItC,eAAO,MAAM,QAAQ,EAAE,SAAS,UAAU,EAAyB,CAAC;AAEpE,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;IAC5D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG;IAC3D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3B;AA4JD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,GACf,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAmM5D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAavC"}