@parlor/client 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.
- package/README.md +2 -0
- package/dist/action-client.d.ts +2 -0
- package/dist/action-client.d.ts.map +1 -1
- package/dist/action-client.js +13 -4
- package/dist/action-client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin-client.js.map +1 -1
- package/dist/query-keys.js.map +1 -1
- package/dist/react/action-query.d.ts +26 -0
- package/dist/react/action-query.d.ts.map +1 -0
- package/dist/react/action-query.js +33 -0
- package/dist/react/action-query.js.map +1 -0
- package/dist/react/agent-ui/activity-state.js.map +1 -1
- package/dist/react/agent-ui/chat-activity.js.map +1 -1
- package/dist/react/agent-ui/chat-confirm.js.map +1 -1
- package/dist/react/agent-ui/chat.js.map +1 -1
- package/dist/react/agent-ui/dev.js.map +1 -1
- package/dist/react/agent-ui/runtime.js.map +1 -1
- package/dist/react/agent-ui/use-agent-activity.js.map +1 -1
- package/dist/react/agent-ui/use-agent-confirmations.js.map +1 -1
- package/dist/react/agent-ui/use-agent-view.js.map +1 -1
- package/dist/react/chat/ask-fields.js.map +1 -1
- package/dist/react/chat/chat-ask.d.ts +3 -2
- package/dist/react/chat/chat-ask.d.ts.map +1 -1
- package/dist/react/chat/chat-ask.js +3 -2
- package/dist/react/chat/chat-ask.js.map +1 -1
- package/dist/react/chat/chat-composer.d.ts.map +1 -1
- package/dist/react/chat/chat-composer.js +1 -1
- package/dist/react/chat/chat-composer.js.map +1 -1
- package/dist/react/chat/chat-root.js.map +1 -1
- package/dist/react/chat/chat-thread.js.map +1 -1
- package/dist/react/chat/context.js.map +1 -1
- package/dist/react/chat/create.js.map +1 -1
- package/dist/react/chat/open-turns.js.map +1 -1
- package/dist/react/chat/runtime.d.ts +29 -4
- package/dist/react/chat/runtime.d.ts.map +1 -1
- package/dist/react/chat/runtime.js +82 -11
- package/dist/react/chat/runtime.js.map +1 -1
- package/dist/react/chat/use-chat.d.ts.map +1 -1
- package/dist/react/chat/use-chat.js +2 -0
- package/dist/react/chat/use-chat.js.map +1 -1
- package/dist/react/chat/use-device-setup.js.map +1 -1
- package/dist/react/hooks.d.ts +7 -1
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/hooks.js +17 -13
- package/dist/react/hooks.js.map +1 -1
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts +6 -3
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.js +61 -11
- package/dist/react/provider.js.map +1 -1
- package/dist/react/retry.js.map +1 -1
- package/dist/react/sync-bridge.d.ts +4 -1
- package/dist/react/sync-bridge.d.ts.map +1 -1
- package/dist/react/sync-bridge.js.map +1 -1
- package/dist/react/sync.d.ts +41 -2
- package/dist/react/sync.d.ts.map +1 -1
- package/dist/react/sync.js +127 -9
- package/dist/react/sync.js.map +1 -1
- package/dist/react/use-capability.js.map +1 -1
- package/dist/react/use-devices.js.map +1 -1
- package/dist/react/use-link-device.js.map +1 -1
- package/dist/register.js.map +1 -1
- package/dist/router/errors.d.ts +13 -0
- package/dist/router/errors.d.ts.map +1 -0
- package/dist/router/errors.js +16 -0
- package/dist/router/errors.js.map +1 -0
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +4 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/mount.d.ts +22 -0
- package/dist/router/mount.d.ts.map +1 -0
- package/dist/router/mount.js +27 -0
- package/dist/router/mount.js.map +1 -0
- package/dist/router/router.d.ts +29 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +44 -0
- package/dist/router/router.js.map +1 -0
- package/dist/session.d.ts +7 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +2 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/render.d.ts +18 -0
- package/dist/ssr/render.d.ts.map +1 -0
- package/dist/ssr/render.js +96 -0
- package/dist/ssr/render.js.map +1 -0
- package/package.json +15 -7
package/README.md
CHANGED
|
@@ -18,4 +18,6 @@ export function Health() {
|
|
|
18
18
|
}
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
+
`@parlor/client/router` gives TanStack Router loaders the same cache, so a page can load its data before it renders and links can preload it. Its `mount` starts the app, hydrating a page the server rendered.
|
|
22
|
+
|
|
21
23
|
In an app, register the actions once in `src/parlor.d.ts` so names and inputs are typed. Docs: https://cychien.github.io/parlor/guides/pages-and-hooks/
|
package/dist/action-client.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface CallOptions {
|
|
|
14
14
|
export interface ActionEnvelope<T> {
|
|
15
15
|
readonly data: T;
|
|
16
16
|
readonly tags: readonly Tag[];
|
|
17
|
+
/** The sync cursor a read's data reflects, when the server tracks it. */
|
|
18
|
+
readonly cursor?: string | undefined;
|
|
17
19
|
}
|
|
18
20
|
export interface ActionClient<T extends ActionMap> {
|
|
19
21
|
readonly clientId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-client.d.ts","sourceRoot":"","sources":["../src/action-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EAEjB,KAAK,GAAG,EACT,MAAM,cAAc,CAAC;AAWtB,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"action-client.d.ts","sourceRoot":"","sources":["../src/action-client.ts"],"names":[],"mappings":"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"}
|
package/dist/action-client.js
CHANGED
|
@@ -34,7 +34,11 @@ export async function invokeAt(request, path, input, options = {}) {
|
|
|
34
34
|
throw await toActionError(response, options.missingIsNotFound ? { missingIsNotFound: true } : {});
|
|
35
35
|
}
|
|
36
36
|
const body = (await response.json());
|
|
37
|
-
return {
|
|
37
|
+
return {
|
|
38
|
+
data: body.data,
|
|
39
|
+
tags: body.tags ?? [],
|
|
40
|
+
...(typeof body.cursor === "string" ? { cursor: body.cursor } : {}),
|
|
41
|
+
};
|
|
38
42
|
}
|
|
39
43
|
export function resolveServerOrigin() {
|
|
40
44
|
return injectedServerUrl() || globalThis.location?.origin || "";
|
|
@@ -63,17 +67,22 @@ export function appOrigin(serverUrl = resolveServerOrigin(), injected = injected
|
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
69
|
export function createActionClient(options = {}) {
|
|
66
|
-
const { baseUrl = injectedServerUrl(), basePath = DEFAULT_BASE_PATH, headers,
|
|
70
|
+
const { baseUrl = injectedServerUrl(), basePath = DEFAULT_BASE_PATH, headers, } = options;
|
|
71
|
+
// Drawn on first use: workerd allows no random values while a module loads.
|
|
72
|
+
let clientId = options.clientId;
|
|
73
|
+
const ownId = () => (clientId ??= generateClientId());
|
|
67
74
|
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
68
75
|
const request = async (path, init = {}) => fetchImpl(`${baseUrl}${path}`, {
|
|
69
76
|
...init,
|
|
70
|
-
headers: await resolveHeaders(headers,
|
|
77
|
+
headers: await resolveHeaders(headers, ownId(), init.headers),
|
|
71
78
|
});
|
|
72
79
|
const invoke = async (name, input, callOptions = {}) => {
|
|
73
80
|
return invokeAt(request, `${basePath}/actions/${name}`, input, callOptions);
|
|
74
81
|
};
|
|
75
82
|
return {
|
|
76
|
-
clientId
|
|
83
|
+
get clientId() {
|
|
84
|
+
return ownId();
|
|
85
|
+
},
|
|
77
86
|
basePath,
|
|
78
87
|
request,
|
|
79
88
|
invoke,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-client.js","sourceRoot":"","sources":["../src/action-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,aAAa,GAEd,MAAM,cAAc,CAAC;AAEtB,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AACxC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAExC,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAI,OAAO,IAAiD,CAAC,GAAG,CAAC;IAC1E,OAAO,GAAG,EAAE,iBAAiB,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;
|
|
1
|
+
{"version":3,"file":"action-client.js","sourceRoot":"","sources":["../src/action-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionError,\n type ActionInput,\n type ActionMap,\n type ActionOutput,\n SHELL_ORIGINS,\n type Tag,\n} from \"@parlor/core\";\n\nconst DEFAULT_BASE_PATH = \"/_parlor\";\nconst SOURCE_HEADER = \"x-parlor-source\";\nconst CLIENT_HEADER = \"x-parlor-client\";\n\nfunction injectedServerUrl(): string {\n const env = (import.meta as { env?: { PARLOR_SERVER_URL?: string } }).env;\n return env?.PARLOR_SERVER_URL ?? \"\";\n}\n\nexport function generateClientId(): string {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n}\n\nexport type HeadersProvider = HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n\nexport interface ActionClientOptions {\n readonly baseUrl?: string | undefined;\n readonly basePath?: string | undefined;\n readonly fetch?: typeof fetch | undefined;\n readonly headers?: HeadersProvider | undefined;\n readonly clientId?: string | undefined;\n}\n\nexport interface CallOptions {\n readonly signal?: AbortSignal | undefined;\n}\n\nexport interface ActionEnvelope<T> {\n readonly data: T;\n readonly tags: readonly Tag[];\n /** The sync cursor a read's data reflects, when the server tracks it. */\n readonly cursor?: string | undefined;\n}\n\nexport interface ActionClient<T extends ActionMap> {\n readonly clientId: string;\n readonly basePath: string;\n call<K extends keyof T & string>(\n name: K,\n input: ActionInput<T[K]>,\n options?: CallOptions,\n ): Promise<ActionOutput<T[K]>>;\n invoke<K extends keyof T & string>(\n name: K,\n input: ActionInput<T[K]>,\n options?: CallOptions,\n ): Promise<ActionEnvelope<ActionOutput<T[K]>>>;\n request(path: string, init?: RequestInit): Promise<Response>;\n}\n\nasync function resolveHeaders(\n provider: HeadersProvider | undefined,\n clientId: string,\n extra?: HeadersInit,\n): Promise<Headers> {\n const headers = new Headers(\n typeof provider === \"function\" ? await provider() : provider,\n );\n new Headers(extra).forEach((value, key) => headers.set(key, value));\n headers.set(SOURCE_HEADER, \"ui\");\n headers.set(CLIENT_HEADER, clientId);\n return headers;\n}\n\nexport async function toActionError(\n response: Response,\n options: { readonly missingIsNotFound?: boolean } = {},\n): Promise<ActionError> {\n const body: unknown = await response.json().catch(() => undefined);\n if (ActionError.isBody(body)) return ActionError.fromBody(body);\n const code =\n options.missingIsNotFound && response.status === 404 ? \"not_found\" : \"internal\";\n return new ActionError(code, `Action request failed with HTTP ${response.status}`);\n}\n\nexport async function invokeAt<T extends ActionMap, K extends keyof T & string>(\n request: ActionClient<ActionMap>[\"request\"],\n path: string,\n input: ActionInput<T[K]>,\n options: CallOptions & { readonly missingIsNotFound?: boolean } = {},\n): Promise<ActionEnvelope<ActionOutput<T[K]>>> {\n const response = await request(path, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input ?? {}),\n signal: options.signal ?? null,\n });\n if (!response.ok) {\n throw await toActionError(\n response,\n options.missingIsNotFound ? { missingIsNotFound: true } : {},\n );\n }\n const body = (await response.json()) as {\n data: ActionOutput<T[K]>;\n tags?: Tag[];\n cursor?: string;\n };\n return {\n data: body.data,\n tags: body.tags ?? [],\n ...(typeof body.cursor === \"string\" ? { cursor: body.cursor } : {}),\n };\n}\n\nexport function resolveServerOrigin(): string {\n return injectedServerUrl() || globalThis.location?.origin || \"\";\n}\n\nfunction injectedAppOrigin(): string {\n const env = (import.meta as { env?: { PARLOR_APP_ORIGIN?: string } }).env;\n return env?.PARLOR_APP_ORIGIN ?? \"\";\n}\n\n/**\n * The one name of this app's backend on every surface: the page's own origin when it is\n * served over http(s) and is not a shell's webview origin, else the shell's `server.url`.\n * `parlor dev` running several targets names the web target's origin for all of them.\n * Statements are signed for it and the host is paired with it.\n */\nexport function appOrigin(\n serverUrl: string = resolveServerOrigin(),\n injected: string = injectedAppOrigin(),\n): string {\n if (injected) return new URL(injected).origin;\n const page = globalThis.location?.origin ?? \"\";\n if (/^https?:\\/\\//.test(page) && !SHELL_ORIGINS.includes(page)) return page;\n try {\n return new URL(serverUrl).origin;\n } catch {\n return serverUrl;\n }\n}\n\nexport function createActionClient<T extends ActionMap>(\n options: ActionClientOptions = {},\n): ActionClient<T> {\n const {\n baseUrl = injectedServerUrl(),\n basePath = DEFAULT_BASE_PATH,\n headers,\n } = options;\n // Drawn on first use: workerd allows no random values while a module loads.\n let clientId = options.clientId;\n const ownId = () => (clientId ??= generateClientId());\n const fetchImpl = options.fetch ?? globalThis.fetch;\n\n const request = async (path: string, init: RequestInit = {}) =>\n fetchImpl(`${baseUrl}${path}`, {\n ...init,\n headers: await resolveHeaders(headers, ownId(), init.headers),\n });\n\n const invoke = async <K extends keyof T & string>(\n name: K,\n input: ActionInput<T[K]>,\n callOptions: CallOptions = {},\n ): Promise<ActionEnvelope<ActionOutput<T[K]>>> => {\n return invokeAt<T, K>(request, `${basePath}/actions/${name}`, input, callOptions);\n };\n\n return {\n get clientId() {\n return ownId();\n },\n basePath,\n request,\n invoke,\n call: async (name, input, callOptions) =>\n (await invoke(name, input, callOptions)).data,\n };\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { type ActionClient, appOrigin, type ActionClientOptions, type ActionEnve
|
|
|
2
2
|
export { type AgentViewBinding, type AgentViewDefinition, type AnyAgentView, defineAgentView, type WritableField, } from "@parlor/agent-ui";
|
|
3
3
|
export { ACTION_QUERY_PREFIX, actionQueryKey } from "./query-keys.js";
|
|
4
4
|
export { createPluginClient, type PluginClient } from "./plugin-client.js";
|
|
5
|
-
export type { AccountDevice, DeviceLinker, DeviceSource, FrameworkAuth, HostAuthorizer, PendingLink, SessionDevice, SessionSnapshot, SessionSource, SessionUser, } from "./session.js";
|
|
5
|
+
export type { AccountDevice, ComputerDisconnector, DeviceLinker, DeviceSource, FrameworkAuth, HostAuthorizer, PendingLink, SessionDevice, SessionSnapshot, SessionSource, SessionUser, } from "./session.js";
|
|
6
6
|
export { LinkOnComputer } from "./session.js";
|
|
7
7
|
export type { Register, RegisteredActions } from "./register.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,SAAS,EACT,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAIT,kBAAkB,EAClB,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAIT,kBAAkB,EAClB,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,eAAe,GAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAc3E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export {\n type ActionClient,\n appOrigin,\n type ActionClientOptions,\n type ActionEnvelope,\n type CallOptions,\n createActionClient,\n generateClientId,\n type HeadersProvider,\n} from \"./action-client.js\";\nexport {\n type AgentViewBinding,\n type AgentViewDefinition,\n type AnyAgentView,\n defineAgentView,\n type WritableField,\n} from \"@parlor/agent-ui\";\nexport { ACTION_QUERY_PREFIX, actionQueryKey } from \"./query-keys.js\";\nexport { createPluginClient, type PluginClient } from \"./plugin-client.js\";\nexport type {\n AccountDevice,\n ComputerDisconnector,\n DeviceLinker,\n DeviceSource,\n FrameworkAuth,\n HostAuthorizer,\n PendingLink,\n SessionDevice,\n SessionSnapshot,\n SessionSource,\n SessionUser,\n} from \"./session.js\";\nexport { LinkOnComputer } from \"./session.js\";\nexport type { Register, RegisteredActions } from \"./register.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-client.js","sourceRoot":"","sources":["../src/plugin-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKjE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA0E,EAC1E,MAAc;IAEd,MAAM,MAAM,GAA8B,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CACjE,QAAQ,CACN,MAAM,CAAC,OAAO,EACd,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,YAAY,IAAI,EAAE,EAC9C,KAAK,EACL,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CACxC,CAAC;IACJ,OAAO;QACL,MAAM;QACN,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI;KAChF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"plugin-client.js","sourceRoot":"","sources":["../src/plugin-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKjE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA0E,EAC1E,MAAc;IAEd,MAAM,MAAM,GAA8B,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CACjE,QAAQ,CACN,MAAM,CAAC,OAAO,EACd,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,YAAY,IAAI,EAAE,EAC9C,KAAK,EACL,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CACxC,CAAC;IACJ,OAAO;QACL,MAAM;QACN,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI;KAChF,CAAC;AACJ,CAAC","sourcesContent":["import type { ActionMap } from \"@parlor/core\";\n\nimport { type ActionClient, invokeAt } from \"./action-client.js\";\n\n/** A plugin's actions at `/_parlor/<plugin>/actions/<name>`, typed by its registry. */\nexport type PluginClient<T extends ActionMap> = Pick<ActionClient<T>, \"call\" | \"invoke\">;\n\n/**\n * Reuses the app client's base URL, headers provider (the session) and client id, so a\n * plugin's actions travel exactly like the app's. A server without the plugin answers\n * `not_found`.\n */\nexport function createPluginClient<T extends ActionMap>(\n client: Pick<ActionClient<ActionMap>, \"basePath\" | \"clientId\" | \"request\">,\n plugin: string,\n): PluginClient<T> {\n const invoke: PluginClient<T>[\"invoke\"] = (name, input, options) =>\n invokeAt<T, typeof name>(\n client.request,\n `${client.basePath}/${plugin}/actions/${name}`,\n input,\n { ...options, missingIsNotFound: true },\n );\n return {\n invoke,\n call: async (name, input, options) => (await invoke(name, input, options)).data,\n };\n}\n"]}
|
package/dist/query-keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../src/query-keys.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAElE,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAc;IACzD,OAAO,CAAC,GAAG,mBAAmB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAU,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../src/query-keys.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAElE,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAc;IACzD,OAAO,CAAC,GAAG,mBAAmB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAU,CAAC;AAC9D,CAAC","sourcesContent":["export const ACTION_QUERY_PREFIX = [\"_parlor\", \"action\"] as const;\n\nexport function actionQueryKey(name: string, input: unknown) {\n return [...ACTION_QUERY_PREFIX, name, input ?? {}] as const;\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ActionError, ActionInput, ActionOutput } from "@parlor/core";
|
|
2
|
+
import { type QueryClient } from "@tanstack/react-query";
|
|
3
|
+
import type { ActionClient } from "../action-client.js";
|
|
4
|
+
import type { RegisteredActions } from "../register.js";
|
|
5
|
+
type Actions = RegisteredActions;
|
|
6
|
+
type Name = keyof Actions & string;
|
|
7
|
+
/** What reading an action outside a component needs; a router made by `createParlorRouter` passes it to every loader. */
|
|
8
|
+
export interface ActionQueryContext {
|
|
9
|
+
readonly client: ActionClient<RegisteredActions>;
|
|
10
|
+
readonly queryClient: QueryClient;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The query `useActionQuery(name, input)` runs, for `queryClient.prefetchQuery`, `useQueries`
|
|
14
|
+
* and the like. It reads the same cache entry and records the same read tags, so sync keeps it fresh.
|
|
15
|
+
*/
|
|
16
|
+
export declare function actionQueryOptions<K extends Name>({ client, queryClient }: ActionQueryContext, name: K, input: ActionInput<Actions[K]>): import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<unknown, ActionError, unknown, readonly unknown[]>, "queryFn"> & {
|
|
17
|
+
queryFn?: import("@tanstack/react-query").QueryFunction<unknown, readonly unknown[], never>;
|
|
18
|
+
} & import("@tanstack/react-query").QueryKeyWithDataTag<readonly unknown[], unknown, ActionError>;
|
|
19
|
+
/**
|
|
20
|
+
* The action's cached data, fetched first when there is none or when a write it reads has
|
|
21
|
+
* invalidated it since. A route `loader` awaits it so the page renders with its data, and
|
|
22
|
+
* `useActionSuspenseQuery` with the same name and input reads it and keeps it fresh.
|
|
23
|
+
*/
|
|
24
|
+
export declare function ensureActionQueryData<K extends Name>(context: ActionQueryContext, name: K, input: ActionInput<Actions[K]>): Promise<ActionOutput<Actions[K]>>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=action-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-query.d.ts","sourceRoot":"","sources":["../../src/react/action-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAW,KAAK,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AAEhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,KAAK,OAAO,GAAG,iBAAiB,CAAC;AACjC,KAAK,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM,CAAC;AAEnC,yHAAyH;AACzH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,IAAI,EAC/C,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,kBAAkB,EAC3C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;;kGAc/B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,IAAI,EAClD,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAKnC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { hashKey, queryOptions } from "@tanstack/react-query";
|
|
2
|
+
import { actionQueryKey } from "../query-keys.js";
|
|
3
|
+
import { actionRetry } from "./retry.js";
|
|
4
|
+
import { readTagsOf } from "./sync.js";
|
|
5
|
+
/** Sync refetches what a write makes out of date, so action data stays fresh until then. */
|
|
6
|
+
const freshUntilInvalidated = ({ state, }) => (state.data === undefined || state.isInvalidated ? 0 : "static");
|
|
7
|
+
/**
|
|
8
|
+
* The query `useActionQuery(name, input)` runs, for `queryClient.prefetchQuery`, `useQueries`
|
|
9
|
+
* and the like. It reads the same cache entry and records the same read tags, so sync keeps it fresh.
|
|
10
|
+
*/
|
|
11
|
+
export function actionQueryOptions({ client, queryClient }, name, input) {
|
|
12
|
+
const queryKey = actionQueryKey(name, input);
|
|
13
|
+
return queryOptions({
|
|
14
|
+
queryKey,
|
|
15
|
+
queryFn: ({ signal, client: cache }) => readTagsOf(cache).read(hashKey(queryKey), () => client.invoke(name, input, { signal })),
|
|
16
|
+
retry: actionRetry(queryClient.getDefaultOptions().queries?.retry),
|
|
17
|
+
...(queryClient.getDefaultOptions().queries?.staleTime === undefined
|
|
18
|
+
? { staleTime: freshUntilInvalidated }
|
|
19
|
+
: {}),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The action's cached data, fetched first when there is none or when a write it reads has
|
|
24
|
+
* invalidated it since. A route `loader` awaits it so the page renders with its data, and
|
|
25
|
+
* `useActionSuspenseQuery` with the same name and input reads it and keeps it fresh.
|
|
26
|
+
*/
|
|
27
|
+
export function ensureActionQueryData(context, name, input) {
|
|
28
|
+
return context.queryClient.query({
|
|
29
|
+
...actionQueryOptions(context, name, input),
|
|
30
|
+
staleTime: freshUntilInvalidated,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=action-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-query.js","sourceRoot":"","sources":["../../src/react/action-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAoB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAWvC,4FAA4F;AAC5F,MAAM,qBAAqB,GAAG,CAAC,EAC7B,KAAK,GAGN,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAE,MAAM,EAAE,WAAW,EAAsB,EAC3C,IAAO,EACP,KAA8B;IAE9B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,YAAY,CAAkE;QACnF,QAAQ;QACR,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CACrC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CACvC;QACH,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;QAClE,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS;YAClE,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE;YACtC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA2B,EAC3B,IAAO,EACP,KAA8B;IAE9B,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;QAC/B,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;QAC3C,SAAS,EAAE,qBAAqB;KACjC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ActionError, ActionInput, ActionOutput } from \"@parlor/core\";\nimport { hashKey, type QueryClient, queryOptions } from \"@tanstack/react-query\";\n\nimport type { ActionClient } from \"../action-client.js\";\nimport { actionQueryKey } from \"../query-keys.js\";\nimport type { RegisteredActions } from \"../register.js\";\nimport { actionRetry } from \"./retry.js\";\nimport { readTagsOf } from \"./sync.js\";\n\ntype Actions = RegisteredActions;\ntype Name = keyof Actions & string;\n\n/** What reading an action outside a component needs; a router made by `createParlorRouter` passes it to every loader. */\nexport interface ActionQueryContext {\n readonly client: ActionClient<RegisteredActions>;\n readonly queryClient: QueryClient;\n}\n\n/** Sync refetches what a write makes out of date, so action data stays fresh until then. */\nconst freshUntilInvalidated = ({\n state,\n}: {\n readonly state: { readonly data: unknown; readonly isInvalidated: boolean };\n}) => (state.data === undefined || state.isInvalidated ? 0 : \"static\");\n\n/**\n * The query `useActionQuery(name, input)` runs, for `queryClient.prefetchQuery`, `useQueries`\n * and the like. It reads the same cache entry and records the same read tags, so sync keeps it fresh.\n */\nexport function actionQueryOptions<K extends Name>(\n { client, queryClient }: ActionQueryContext,\n name: K,\n input: ActionInput<Actions[K]>,\n) {\n const queryKey = actionQueryKey(name, input);\n return queryOptions<ActionOutput<Actions[K]>, ActionError, ActionOutput<Actions[K]>>({\n queryKey,\n queryFn: ({ signal, client: cache }) =>\n readTagsOf(cache).read(hashKey(queryKey), () =>\n client.invoke(name, input, { signal }),\n ),\n retry: actionRetry(queryClient.getDefaultOptions().queries?.retry),\n ...(queryClient.getDefaultOptions().queries?.staleTime === undefined\n ? { staleTime: freshUntilInvalidated }\n : {}),\n });\n}\n\n/**\n * The action's cached data, fetched first when there is none or when a write it reads has\n * invalidated it since. A route `loader` awaits it so the page renders with its data, and\n * `useActionSuspenseQuery` with the same name and input reads it and keeps it fresh.\n */\nexport function ensureActionQueryData<K extends Name>(\n context: ActionQueryContext,\n name: K,\n input: ActionInput<Actions[K]>,\n): Promise<ActionOutput<Actions[K]>> {\n return context.queryClient.query({\n ...actionQueryOptions(context, name, input),\n staleTime: freshUntilInvalidated,\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-state.js","sourceRoot":"","sources":["../../../src/react/agent-ui/activity-state.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,mBAAmB,CACjC,EAAE,IAAI,EAAE,IAAI,EAAiB,EAC7B,KAA4B;IAE5B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACrC,IAAI,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAChD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9C,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC"}
|
|
1
|
+
{"version":3,"file":"activity-state.js","sourceRoot":"","sources":["../../../src/react/agent-ui/activity-state.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,mBAAmB,CACjC,EAAE,IAAI,EAAE,IAAI,EAAiB,EAC7B,KAA4B;IAE5B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACrC,IAAI,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAChD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9C,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import type { AgentOrigin, UiErrorCode } from \"@parlor/agent-ui\";\nimport type { AgentActivity, AgentActivityKind } from \"@parlor/agent-ui/client\";\n\nexport type AgentActivityState =\n | { readonly status: \"idle\" }\n | {\n readonly status: \"busy\";\n readonly op: AgentActivityKind;\n readonly origin: AgentOrigin;\n }\n | {\n readonly status: \"done\";\n readonly op: AgentActivityKind;\n readonly origin: AgentOrigin;\n }\n | {\n readonly status: \"refused\";\n readonly op: AgentActivityKind;\n readonly origin: AgentOrigin;\n readonly code: UiErrorCode;\n };\n\nexport function deriveActivityState(\n { busy, last }: AgentActivity,\n faded: AgentActivity[\"last\"],\n): AgentActivityState {\n if (!last) return { status: \"idle\" };\n const { op, origin, outcome } = last;\n if (busy) return { status: \"busy\", op, origin };\n if (last === faded) return { status: \"idle\" };\n if (outcome?.status === \"refused\") {\n return { status: \"refused\", op, origin, code: outcome.code };\n }\n return { status: \"done\", op, origin };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-activity.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat-activity.tsx"],"names":[],"mappings":";AACA,OAAO,EAAuC,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,EAA2B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAyB,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,MAAM,GAAG,iBAAiB,EAC1B,QAAQ,EACR,GAAG,KAAK,EACU;IAClB,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,eACH,QAAQ,KACd,KAAK,gBACG,KAAK,CAAC,MAAM,aACf,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,YAEtD,QAAQ,CAAC,KAAK,CAAC,GACX,CACR,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"chat-activity.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat-activity.tsx"],"names":[],"mappings":";AACA,OAAO,EAAuC,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,EAA2B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAyB,CAAC;IAC5D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;QACzD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,MAAM,GAAG,iBAAiB,EAC1B,QAAQ,EACR,GAAG,KAAK,EACU;IAClB,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,eACH,QAAQ,KACd,KAAK,gBACG,KAAK,CAAC,MAAM,aACf,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,YAEtD,QAAQ,CAAC,KAAK,CAAC,GACX,CACR,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentActivity } from \"@parlor/agent-ui/client\";\nimport { type ComponentProps, type ReactNode, useEffect, useState } from \"react\";\n\nimport { type AgentActivityState, deriveActivityState } from \"./activity-state.js\";\nimport { useAgentActivity } from \"./use-agent-activity.js\";\n\nconst DEFAULT_LINGER_MS = 2000;\n\nfunction useActivityState(lingerMs: number): AgentActivityState {\n const activity = useAgentActivity();\n const [faded, setFaded] = useState<AgentActivity[\"last\"]>();\n const { busy, last } = activity;\n useEffect(() => {\n if (busy || !last) return;\n const timer = setTimeout(() => setFaded(last), lingerMs);\n return () => clearTimeout(timer);\n }, [busy, last, lingerMs]);\n return deriveActivityState(activity, faded);\n}\n\nexport interface ChatActivityProps extends Omit<ComponentProps<\"span\">, \"children\"> {\n /** Milliseconds a finished event stays `done` or `refused` before it reads `idle`. */\n readonly linger?: number;\n readonly children: (state: AgentActivityState) => ReactNode;\n}\n\n/**\n * A polite live region that says what an agent is doing on this screen. The app writes the\n * words; style it through `[data-state]` and `[data-op]`.\n */\nexport function Activity({\n linger = DEFAULT_LINGER_MS,\n children,\n ...props\n}: ChatActivityProps) {\n const state = useActivityState(linger);\n return (\n <span\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n data-state={state.status}\n data-op={state.status === \"idle\" ? undefined : state.op}\n >\n {children(state)}\n </span>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-confirm.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat-confirm.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-confirm.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat-confirm.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { AgentConfirmation } from \"@parlor/agent-ui/client\";\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n use,\n useCallback,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { useAgentConfirmations } from \"./use-agent-confirmations.js\";\n\ninterface ConfirmContext {\n readonly confirmation: AgentConfirmation;\n readonly labelId: string;\n}\n\nconst ConfirmScope = createContext<ConfirmContext | undefined>(undefined);\n\ninterface ListContext {\n readonly register: (id: string, element: HTMLElement) => () => void;\n readonly releasingFocus: (id: string) => void;\n}\n\nconst ListScope = createContext<ListContext | undefined>(undefined);\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null): (() => void) | void {\n if (typeof ref === \"function\") return ref(value);\n if (ref) {\n ref.current = value;\n return () => {\n ref.current = null;\n };\n }\n}\n\nfunction useConfirm(part: string): ConfirmContext {\n const scope = use(ConfirmScope);\n if (!scope) throw new Error(`${part} must be rendered inside Chat.Confirm.`);\n return scope;\n}\n\nexport interface ChatConfirmationsProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /** Shown while no agent request waits. */\n readonly empty?: ReactNode;\n readonly children: (confirmation: AgentConfirmation) => ReactNode;\n}\n\n/**\n * Lists the agent requests waiting for this user, newest last. Rendering it is what tells\n * the server this client can show a confirmation, so keep it mounted wherever the user can\n * answer. `data-pending` carries the count while any wait. When the card holding focus goes\n * away, focus moves to the next card, or to the list when none is left, so it never falls\n * out of an enclosing dialog.\n */\nexport function Confirmations({\n empty,\n children,\n ref,\n ...props\n}: ChatConfirmationsProps) {\n const confirmations = useAgentConfirmations();\n const list = useRef<HTMLDivElement | null>(null);\n const cards = useRef(new Map<string, HTMLElement>());\n const shownIds = useRef<readonly string[]>([]);\n const releasedId = useRef<string | undefined>(undefined);\n const attach = useCallback(\n (element: HTMLDivElement | null) => {\n list.current = element;\n const detach = assignRef(ref, element);\n return () => {\n list.current = null;\n if (detach) detach();\n else assignRef(ref, null);\n };\n },\n [ref],\n );\n const scope = useMemo<ListContext>(\n () => ({\n register: (id, element) => {\n cards.current.set(id, element);\n return () => {\n cards.current.delete(id);\n };\n },\n releasingFocus: (id) => {\n releasedId.current = id;\n },\n }),\n [],\n );\n\n useLayoutEffect(() => {\n const released = releasedId.current;\n releasedId.current = undefined;\n const ids = confirmations.map((confirmation) => confirmation.id);\n const previousIds = shownIds.current;\n shownIds.current = ids;\n const listElement = list.current;\n if (released === undefined || !listElement) return;\n const active = document.activeElement;\n if (active && active !== document.body && listElement.contains(active)) return;\n const index = previousIds.indexOf(released);\n const nextId = ids[Math.min(index, ids.length - 1)];\n (nextId === undefined\n ? listElement\n : (cards.current.get(nextId) ?? listElement)\n ).focus();\n });\n\n return (\n <ListScope value={scope}>\n <div\n aria-live=\"polite\"\n tabIndex={-1}\n {...props}\n ref={attach}\n data-pending={confirmations.length > 0 ? confirmations.length : undefined}\n >\n {confirmations.length === 0\n ? empty\n : confirmations.map((confirmation) => (\n <Fragment key={confirmation.id}>{children(confirmation)}</Fragment>\n ))}\n </div>\n </ListScope>\n );\n}\n\nexport interface ChatConfirmProps extends ComponentProps<\"div\"> {\n readonly confirmation: AgentConfirmation;\n}\n\n/**\n * One request as a labelled group. Escape inside it declines, and stops there so an\n * enclosing dialog stays open. It never takes focus by itself, but it can hold it\n * (`tabIndex` -1) so `Chat.Confirmations` can keep focus in the list.\n */\nexport function Confirm({ confirmation, onKeyDown, ref, ...props }: ChatConfirmProps) {\n const labelId = useId();\n const list = use(ListScope);\n const group = useRef<HTMLDivElement | null>(null);\n const { id } = confirmation;\n useLayoutEffect(() => {\n const element = group.current;\n if (!list || !element) return;\n const unregister = list.register(id, element);\n return () => {\n if (element.contains(document.activeElement)) list.releasingFocus(id);\n unregister();\n };\n }, [list, id]);\n const attach = useCallback(\n (element: HTMLDivElement | null) => {\n group.current = element;\n const detach = assignRef(ref, element);\n return () => {\n if (detach) detach();\n else assignRef(ref, null);\n };\n },\n [ref],\n );\n const decline = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n confirmation.decline();\n };\n return (\n <ConfirmScope value={{ confirmation, labelId }}>\n <div\n role=\"group\"\n aria-labelledby={labelId}\n data-action={confirmation.action}\n tabIndex={-1}\n {...props}\n ref={attach}\n onKeyDown={decline}\n />\n </ConfirmScope>\n );\n}\n\nexport function ConfirmLabel(props: Omit<ComponentProps<\"p\">, \"id\">) {\n const { labelId } = useConfirm(\"Chat.ConfirmLabel\");\n return <p {...props} id={labelId} />;\n}\n\nexport function Approve({ onClick, ...props }: ComponentProps<\"button\">) {\n const { confirmation } = useConfirm(\"Chat.Approve\");\n return (\n <button\n type=\"button\"\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) confirmation.approve();\n }}\n />\n );\n}\n\nexport function Decline({ onClick, ...props }: ComponentProps<\"button\">) {\n const { confirmation } = useConfirm(\"Chat.Decline\");\n return (\n <button\n type=\"button\"\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) confirmation.decline();\n }}\n />\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,OAAO,EACP,YAAY,EACZ,aAAa,EACb,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/react/agent-ui/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,OAAO,EACP,OAAO,EACP,YAAY,EACZ,aAAa,EACb,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["export { Activity } from \"./chat-activity.js\";\nexport {\n Approve,\n Confirm,\n ConfirmLabel,\n Confirmations,\n Decline,\n} from \"./chat-confirm.js\";\nexport { Ask, AskChoice, AskForm } from \"../chat/chat-ask.js\";\nexport { Composer, Input, Send, Status, Stop } from \"../chat/chat-composer.js\";\nexport { Root } from \"../chat/chat-root.js\";\nexport { LoadOlder, Thread } from \"../chat/chat-thread.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/react/agent-ui/dev.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/react/agent-ui/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScreenSnapshot } from \"@parlor/agent-ui\";\nimport type { AgentUiClient } from \"@parlor/agent-ui/client\";\n\ndeclare global {\n interface Window {\n __parlor?:\n | { readonly clientId: string; screen(): Promise<ScreenSnapshot> }\n | undefined;\n }\n}\n\nconst TOGGLE_HINT = \"Alt+Shift+A\";\nconst MAX_LOG = 10;\n\nfunction overlay(agentUi: AgentUiClient, clientId: string): () => void {\n const panel = document.createElement(\"aside\");\n panel.setAttribute(\"aria-label\", \"Parlor agent UI\");\n panel.hidden = true;\n Object.assign(panel.style, {\n position: \"fixed\",\n right: \"12px\",\n bottom: \"12px\",\n width: \"min(420px, calc(100vw - 24px))\",\n maxHeight: \"60vh\",\n overflow: \"auto\",\n zIndex: \"2147483647\",\n background: \"#111\",\n color: \"#eee\",\n font: \"12px/1.4 ui-monospace, monospace\",\n padding: \"12px\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 24px rgba(0, 0, 0, 0.3)\",\n });\n const header = document.createElement(\"div\");\n const log = document.createElement(\"ol\");\n log.style.margin = \"8px 0\";\n log.style.paddingLeft = \"28px\";\n const snapshot = document.createElement(\"pre\");\n snapshot.style.margin = \"0\";\n snapshot.style.whiteSpace = \"pre-wrap\";\n panel.append(header, log, snapshot);\n document.body.append(panel);\n\n const entries: string[] = [];\n let lastStarted: number | undefined;\n const render = () => {\n header.textContent = `client ${clientId} (${TOGGLE_HINT} to close)`;\n log.replaceChildren(\n ...entries.map((text) =>\n Object.assign(document.createElement(\"li\"), { textContent: text }),\n ),\n );\n void agentUi.screen().then((screen) => {\n snapshot.textContent = JSON.stringify(screen, null, 2);\n });\n };\n const unsubscribe = agentUi.activity.subscribe(() => {\n const { busy, last } = agentUi.activity.get();\n if (!busy || !last || last.at === lastStarted) return;\n lastStarted = last.at;\n const via = last.origin.name\n ? `${last.origin.via} ${last.origin.name}`\n : last.origin.via;\n entries.unshift(`${new Date(last.at).toLocaleTimeString()} ${last.op} from ${via}`);\n entries.length = Math.min(entries.length, MAX_LOG);\n if (!panel.hidden) render();\n });\n let refresh: ReturnType<typeof setInterval> | undefined;\n const onKey = (event: KeyboardEvent) => {\n if (!(event.altKey && event.shiftKey && event.code === \"KeyA\")) return;\n panel.hidden = !panel.hidden;\n clearInterval(refresh);\n if (panel.hidden) return;\n render();\n refresh = setInterval(render, 1000);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n clearInterval(refresh);\n unsubscribe();\n panel.remove();\n };\n}\n\nexport function installAgentUiDevtools(\n agentUi: AgentUiClient,\n clientId: string,\n): () => void {\n window.__parlor = { clientId, screen: () => agentUi.screen() };\n const removeOverlay = overlay(agentUi, clientId);\n return () => {\n removeOverlay();\n delete window.__parlor;\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/react/agent-ui/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAS1D,SAAS,eAAe,CAAC,WAAwB;IAC/C,OAAO,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,cAAc,CAAC,WAAwB,EAAE,SAAiB;IACjE,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,WAAW,EAAE,CAAC;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7D,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,MAAM,GACc;IACpB,OAAO,mBAAmB,CAAC;QACzB,MAAM;QACN,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,EAAE,CACX,WAAW;iBACR,aAAa,EAAE;iBACf,OAAO,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAC1D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACf,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC1D,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;gBAC3D,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;aAC3B,CAAC,CAAC;YACP,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC;SAC/D;QACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,KAAK,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,OAAO;aACpC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,CAAC;QACD,QAAQ,EAAE,cAAc,EAAE;QAC1B,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG;KACzB,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/react/agent-ui/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAS1D,SAAS,eAAe,CAAC,WAAwB;IAC/C,OAAO,WAAW,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,cAAc,CAAC,WAAwB,EAAE,SAAiB;IACjE,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,WAAW,EAAE,CAAC;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7D,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,MAAM,GACc;IACpB,OAAO,mBAAmB,CAAC;QACzB,MAAM;QACN,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,EAAE,CACX,WAAW;iBACR,aAAa,EAAE;iBACf,OAAO,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAC1D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACf,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC1D,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;gBAC3D,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;aAC3B,CAAC,CAAC;YACP,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC;SAC/D;QACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,KAAK,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,OAAO;aACpC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,CAAC;QACD,QAAQ,EAAE,cAAc,EAAE;QAC1B,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG;KACzB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { type AgentUiClient, createAgentUiClient } from \"@parlor/agent-ui/client\";\nimport { detectPlatform } from \"@parlor/capabilities\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport type { AnyRouter } from \"@tanstack/react-router\";\n\nimport type { ActionClient } from \"../../action-client.js\";\nimport { ACTION_QUERY_PREFIX } from \"../../query-keys.js\";\nimport type { RegisteredActions } from \"../../register.js\";\n\nexport interface AgentUiRuntimeInput {\n readonly client: ActionClient<RegisteredActions>;\n readonly queryClient: QueryClient;\n readonly router: AnyRouter | undefined;\n}\n\nfunction fetchingActions(queryClient: QueryClient): number {\n return queryClient.isFetching({ queryKey: ACTION_QUERY_PREFIX });\n}\n\nfunction actionsSettled(queryClient: QueryClient, timeoutMs: number): Promise<void> {\n if (fetchingActions(queryClient) === 0) return Promise.resolve();\n return new Promise((resolve) => {\n const done = () => {\n unsubscribe();\n clearTimeout(timer);\n resolve();\n };\n const unsubscribe = queryClient.getQueryCache().subscribe(() => {\n if (fetchingActions(queryClient) === 0) done();\n });\n const timer = setTimeout(done, timeoutMs);\n });\n}\n\nexport function createAgentUiRuntime({\n client,\n queryClient,\n router,\n}: AgentUiRuntimeInput): AgentUiClient {\n return createAgentUiClient({\n router,\n queries: {\n active: () =>\n queryClient\n .getQueryCache()\n .findAll({ queryKey: ACTION_QUERY_PREFIX, type: \"active\" })\n .map((query) => ({\n action: String(query.queryKey[ACTION_QUERY_PREFIX.length]),\n input: query.queryKey[ACTION_QUERY_PREFIX.length + 1] ?? {},\n status: query.state.status,\n })),\n settled: (timeoutMs) => actionsSettled(queryClient, timeoutMs),\n },\n send: async (message) => {\n const response = await client.request(`${client.basePath}/ui`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(message),\n keepalive: message.type !== \"reply\",\n });\n return response.status === 200 ? response.text() : undefined;\n },\n platform: detectPlatform(),\n dev: import.meta.env.DEV,\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-activity.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-activity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC;IAC5C,OAAO,oBAAoB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC"}
|
|
1
|
+
{"version":3,"file":"use-agent-activity.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-activity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC;IAC5C,OAAO,oBAAoB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { AgentActivity } from \"@parlor/agent-ui/client\";\nimport { useSyncExternalStore } from \"react\";\n\nimport { useFramework } from \"../provider.js\";\n\nexport function useAgentActivity(): AgentActivity {\n const { activity } = useFramework().agentUi;\n return useSyncExternalStore(activity.subscribe, activity.get, activity.get);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-confirmations.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-confirmations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC;IACjD,OAAO,oBAAoB,CACzB,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,GAAG,EACjB,aAAa,CAAC,GAAG,CAClB,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"use-agent-confirmations.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-confirmations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC,OAAO,CAAC;IACjD,OAAO,oBAAoB,CACzB,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,GAAG,EACjB,aAAa,CAAC,GAAG,CAClB,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentConfirmation } from \"@parlor/agent-ui/client\";\nimport { useSyncExternalStore } from \"react\";\n\nimport { useFramework } from \"../provider.js\";\n\n/**\n * The agent requests waiting for this user's approval on this client, newest last. Headless:\n * the app draws the card and calls `approve` or `decline`. Rendering this hook is what tells\n * the server this client can show a confirmation; render it where it is always mounted.\n */\nexport function useAgentConfirmations(): readonly AgentConfirmation[] {\n const { confirmations } = useFramework().agentUi;\n return useSyncExternalStore(\n confirmations.subscribe,\n confirmations.get,\n confirmations.get,\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-view.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,SAAS,UAAU,CAAC,OAAuC;IACzD,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC;IACzB,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,OAA4B;IAE5B,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAoD,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAwB,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"use-agent-view.js","sourceRoot":"","sources":["../../../src/react/agent-ui/use-agent-view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW9C,SAAS,UAAU,CAAC,OAAuC;IACzD,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC;IACzB,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,OAA4B;IAE5B,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAoD,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAwB,CAAC;AAC9D,CAAC","sourcesContent":["import type { AgentViewBinding, AnyAgentView, WritableField } from \"@parlor/agent-ui\";\nimport { agentFieldsOf, type AnyViewBinding } from \"@parlor/agent-ui/client\";\nimport { useEffect, useInsertionEffect, useState, useSyncExternalStore } from \"react\";\nimport { flushSync } from \"react-dom\";\n\nimport { useFramework } from \"../provider.js\";\n\nexport interface AgentViewHandle<D extends AnyAgentView = AnyAgentView> {\n readonly ref: (element: Element | null) => void;\n /**\n * Fields the agent wrote that still hold what it wrote, for the app to style; the user\n * changing a field removes it. Always empty for a read-only view.\n */\n readonly agentFields: ReadonlySet<WritableField<D>>;\n}\n\nfunction committing(binding: AgentViewBinding<AnyAgentView>): AnyViewBinding {\n const { set } = binding;\n if (!set) return binding;\n return {\n key: binding.key,\n get: binding.get,\n set: (next, changed) => flushSync(() => set(next, changed)),\n };\n}\n\nexport function useAgentView<D extends AnyAgentView>(\n view: D,\n binding: AgentViewBinding<D>,\n): AgentViewHandle<D> {\n const { agentUi } = useFramework();\n const erased = committing(binding as unknown as AgentViewBinding<AnyAgentView>);\n const [slot] = useState(() => agentUi.views.track(view, erased));\n useInsertionEffect(() => slot.bind(erased));\n useEffect(() => slot.mount(binding.key), [slot, binding.key]);\n const writes = useSyncExternalStore(slot.subscribeWrites, slot.writes, slot.writes);\n const agentFields = agentFieldsOf(writes, writes.size === 0 ? {} : binding.get());\n return { ref: slot.ref, agentFields } as AgentViewHandle<D>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-fields.js","sourceRoot":"","sources":["../../../src/react/chat/ask-fields.ts"],"names":[],"mappings":"AAUA,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,SAAS,MAAM,CAAC,MAA+B;IAC7C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3C,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5C,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9C;YACE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,IAAuC;IAC/D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC7D,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjC,GAAG,MAAM,CAAC,MAAM,CAAC;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,MAA2B,EAAE,IAAqB;IAC1E,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,CAAC;YAAE,SAAS;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;aAC7D,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE;YAAE,SAAS;aACjC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;YACtE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ask-fields.js","sourceRoot":"","sources":["../../../src/react/chat/ask-fields.ts"],"names":[],"mappings":"AAUA,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,SAAS,MAAM,CAAC,MAA+B;IAC7C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3C,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5C,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9C;YACE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,IAAuC;IAC/D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC7D,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjC,GAAG,MAAM,CAAC,MAAM,CAAC;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,MAA2B,EAAE,IAAqB;IAC1E,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,CAAC;YAAE,SAAS;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;aAC7D,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE;YAAE,SAAS;aACjC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;YACtE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["export interface AskField {\n readonly name: string;\n readonly label: string;\n readonly type: \"number\" | \"checkbox\" | \"text\";\n readonly integer: boolean;\n readonly required: boolean;\n}\n\nexport type AskValues = Record<string, string | number | boolean>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nfunction typeOf(schema: Record<string, unknown>): Pick<AskField, \"type\" | \"integer\"> {\n switch (schema.type) {\n case \"integer\":\n return { type: \"number\", integer: true };\n case \"number\":\n return { type: \"number\", integer: false };\n case \"boolean\":\n return { type: \"checkbox\", integer: false };\n default:\n return { type: \"text\", integer: false };\n }\n}\n\n/** One field per property of a form ask's JSON Schema object, in schema order. */\nexport function askFields(form: Readonly<Record<string, unknown>>): AskField[] {\n const properties = isRecord(form.properties) ? form.properties : {};\n const required = Array.isArray(form.required) ? form.required : [];\n return Object.entries(properties).map(([name, property]) => {\n const schema = isRecord(property) ? property : {};\n return {\n name,\n label: typeof schema.title === \"string\" ? schema.title : name,\n required: required.includes(name),\n ...typeOf(schema),\n };\n });\n}\n\n/** What a filled form answers: numbers as numbers, checkboxes as booleans, blanks left out. */\nexport function askValues(fields: readonly AskField[], form: HTMLFormElement): AskValues {\n const values: AskValues = {};\n for (const field of fields) {\n const input = form.elements.namedItem(field.name);\n if (!(input instanceof HTMLInputElement)) continue;\n if (field.type === \"checkbox\") values[field.name] = input.checked;\n else if (input.value === \"\") continue;\n else if (field.type === \"number\") values[field.name] = Number(input.value);\n else values[field.name] = input.value;\n }\n return values;\n}\n"]}
|
|
@@ -9,8 +9,9 @@ export interface ChatAskProps extends ComponentProps<"div"> {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* The agent's own permission prompt or question: `role="group"` named by its question.
|
|
12
|
-
* `data-approval` is `presence` (answering triggers the OS prompt)
|
|
13
|
-
*
|
|
12
|
+
* `data-approval` is `presence` (answering triggers the OS prompt), `device` (answered by
|
|
13
|
+
* the device that sent the prompt) or `computer` (answered on the computer; choices
|
|
14
|
+
* disabled). `data-state` is `open`, `answered` or `closed`.
|
|
14
15
|
* Escape declines.
|
|
15
16
|
*/
|
|
16
17
|
export declare function Ask({ item, onKeyDown, ...props }: ChatAskProps): ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-ask.d.ts","sourceRoot":"","sources":["../../../src/react/chat/chat-ask.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAKf,KAAK,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAOrE,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,KAAK,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"chat-ask.d.ts","sourceRoot":"","sources":["../../../src/react/chat/chat-ask.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAKf,KAAK,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAOrE,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,KAAK,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,GAAG,SAAS,CAyB1E;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,GAAG,SAAS,CAmBtF;AAID,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,GAAG,SAAS,CA2BrF"}
|
|
@@ -6,8 +6,9 @@ const AskScope = createContext(undefined);
|
|
|
6
6
|
const report = (error) => console.error("[parlor] The chat could not answer:", error);
|
|
7
7
|
/**
|
|
8
8
|
* The agent's own permission prompt or question: `role="group"` named by its question.
|
|
9
|
-
* `data-approval` is `presence` (answering triggers the OS prompt)
|
|
10
|
-
*
|
|
9
|
+
* `data-approval` is `presence` (answering triggers the OS prompt), `device` (answered by
|
|
10
|
+
* the device that sent the prompt) or `computer` (answered on the computer; choices
|
|
11
|
+
* disabled). `data-state` is `open`, `answered` or `closed`.
|
|
11
12
|
* Escape declines.
|
|
12
13
|
*/
|
|
13
14
|
export function Ask({ item, onKeyDown, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-ask.js","sourceRoot":"","sources":["../../../src/react/chat/chat-ask.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,aAAa,EAGb,GAAG,EACH,OAAO,GACR,MAAM,OAAO,CAAC;AAEf,OAAO,EAAiB,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,QAAQ,GAAG,aAAa,CAAsB,SAAS,CAAC,CAAC;AAE/D,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;AAM9D
|
|
1
|
+
{"version":3,"file":"chat-ask.js","sourceRoot":"","sources":["../../../src/react/chat/chat-ask.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { AgentConfirmation } from \"@parlor/agent-ui/client\";\nimport type { ChatItem } from \"@parlor/chat\";\nimport {\n type ComponentProps,\n createContext,\n type KeyboardEvent,\n type ReactNode,\n use,\n useMemo,\n} from \"react\";\n\nimport { type AskField, askFields, askValues } from \"./ask-fields.js\";\nimport { useChatRuntime } from \"./context.js\";\n\ntype AskItem = Extract<ChatItem<AgentConfirmation>, { kind: \"ask\" }>;\n\nconst AskScope = createContext<AskItem | undefined>(undefined);\n\nconst report = (error: unknown) =>\n console.error(\"[parlor] The chat could not answer:\", error);\n\nexport interface ChatAskProps extends ComponentProps<\"div\"> {\n readonly item: AskItem;\n}\n\n/**\n * The agent's own permission prompt or question: `role=\"group\"` named by its question.\n * `data-approval` is `presence` (answering triggers the OS prompt), `device` (answered by\n * the device that sent the prompt) or `computer` (answered on the computer; choices\n * disabled). `data-state` is `open`, `answered` or `closed`.\n * Escape declines.\n */\nexport function Ask({ item, onKeyDown, ...props }: ChatAskProps): ReactNode {\n const runtime = useChatRuntime(\"Chat.Ask\");\n const decline = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.key !== \"Escape\") return;\n const rejection = item.choices.find((choice) => choice.effect.startsWith(\"reject\"));\n if (!rejection || item.answer.state !== \"open\" || item.approval === \"computer\")\n return;\n event.preventDefault();\n event.stopPropagation();\n runtime.answer(item.id, rejection.id).catch(report);\n };\n return (\n <AskScope value={item}>\n <div\n role=\"group\"\n aria-label={item.question}\n tabIndex={-1}\n {...props}\n data-approval={item.approval}\n data-state={item.answer.state}\n onKeyDown={decline}\n />\n </AskScope>\n );\n}\n\nexport interface ChatAskChoiceProps extends ComponentProps<\"button\"> {\n readonly choice: AskItem[\"choices\"][number];\n}\n\n/** `type=\"button\"`; answers the enclosing ask with this choice. */\nexport function AskChoice({ choice, onClick, ...props }: ChatAskChoiceProps): ReactNode {\n const runtime = useChatRuntime(\"Chat.AskChoice\");\n const ask = use(AskScope);\n if (!ask) throw new Error(\"Chat.AskChoice must be rendered inside Chat.Ask.\");\n return (\n <button\n type=\"button\"\n disabled={ask.approval === \"computer\" || ask.answer.state !== \"open\"}\n data-effect={choice.effect}\n aria-pressed={\n ask.answer.state === \"answered\" ? ask.answer.choice === choice.id : undefined\n }\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) runtime.answer(ask.id, choice.id).catch(report);\n }}\n />\n );\n}\n\nconst isAllow = (choice: AskItem[\"choices\"][number]) => choice.effect.startsWith(\"allow\");\n\nexport type ChatAskFormProps = ComponentProps<\"form\">;\n\n/**\n * A form ask's `<form>`: one `<input name=\"{property}\">` per property of its schema (`number`\n * for numbers and integers, `checkbox` for booleans, text otherwise). Submitting answers the\n * ask with its allow choice and the values typed per the schema. Its children, a submit\n * button for one, go after the inputs. Everything is disabled once the ask is not open or\n * is answered on the computer. Renders nothing for an ask without a form.\n */\nexport function AskForm({ onSubmit, children, ...props }: ChatAskFormProps): ReactNode {\n const runtime = useChatRuntime(\"Chat.AskForm\");\n const ask = use(AskScope);\n if (!ask) throw new Error(\"Chat.AskForm must be rendered inside Chat.Ask.\");\n const { form } = ask;\n const fields = useMemo(() => (form ? askFields(form) : []), [form]);\n const accept = ask.choices.find(isAllow);\n if (!form || !accept) return null;\n return (\n <form\n {...props}\n onSubmit={(event) => {\n onSubmit?.(event);\n event.preventDefault();\n runtime\n .answer(ask.id, accept.id, askValues(fields, event.currentTarget))\n .catch(report);\n }}\n >\n <fieldset disabled={ask.approval === \"computer\" || ask.answer.state !== \"open\"}>\n {fields.map((field) => (\n <AskInput key={field.name} field={field} />\n ))}\n {children}\n </fieldset>\n </form>\n );\n}\n\nfunction AskInput({ field }: { readonly field: AskField }): ReactNode {\n return (\n <label data-type={field.type}>\n <span>{field.label}</span>\n <input\n name={field.name}\n type={field.type}\n required={field.required && field.type !== \"checkbox\"}\n step={field.type === \"number\" ? (field.integer ? 1 : \"any\") : undefined}\n />\n </label>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-composer.d.ts","sourceRoot":"","sources":["../../../src/react/chat/chat-composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAQtE,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAiBlF;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC,GAAG,SAAS,CAuBxE;AAED,gFAAgF;AAChF,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAOhF;AAED,4FAA4F;AAC5F,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAgBtC;AAgBD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"chat-composer.d.ts","sourceRoot":"","sources":["../../../src/react/chat/chat-composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAQtE,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAiBlF;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC,GAAG,SAAS,CAuBxE;AAED,gFAAgF;AAChF,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAOhF;AAED,4FAA4F;AAC5F,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,OAAO,EACP,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAgBtC;AAgBD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,SAAS,CAa7E"}
|
|
@@ -76,6 +76,6 @@ function statusText({ status, wait, setup, link, presenceDue }) {
|
|
|
76
76
|
*/
|
|
77
77
|
export function Status({ children, ...props }) {
|
|
78
78
|
const state = useChatState("Chat.Status");
|
|
79
|
-
return (_jsx("p", { role: "status", ...props, "data-status": state.status, "data-wait": state.wait?.reason, children: children ?? statusText(state) }));
|
|
79
|
+
return (_jsx("p", { role: "status", ...props, "data-status": state.status, "data-wait": state.wait?.reason, "data-unavailable": state.unavailable?.reason, children: children ?? statusText(state) }));
|
|
80
80
|
}
|
|
81
81
|
//# sourceMappingURL=chat-composer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-composer.js","sourceRoot":"","sources":["../../../src/react/chat/chat-composer.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chat-composer.js","sourceRoot":"","sources":["../../../src/react/chat/chat-composer.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\n\nimport { canSend, useChatRuntime, useChatState } from \"./context.js\";\nimport type { ChatState } from \"./runtime.js\";\n\nconst report = (error: unknown) =>\n console.error(\"[parlor] The chat could not do that:\", error);\n\n/** A `<form>` whose submit sends the draft; `data-running` while a turn runs. */\nexport function Composer({ onSubmit, ...props }: ComponentProps<\"form\">): ReactNode {\n const runtime = useChatRuntime(\"Chat.Composer\");\n const state = useChatState(\"Chat.Composer\");\n const submit = (\n event: Parameters<NonNullable<ComponentProps<\"form\">[\"onSubmit\"]>>[0],\n ) => {\n onSubmit?.(event);\n event.preventDefault();\n if (canSend(state)) runtime.send().catch(report);\n };\n return (\n <form\n {...props}\n onSubmit={submit}\n data-running={state.status === \"running\" ? \"\" : undefined}\n />\n );\n}\n\n/**\n * A `<textarea>` bound to the draft: Enter sends, Shift+Enter breaks the line, IME\n * composition never sends. Disabled while no agent can be chosen.\n */\nexport function Input({\n onChange,\n onKeyDown,\n ...props\n}: Omit<ComponentProps<\"textarea\">, \"value\" | \"defaultValue\">): ReactNode {\n const runtime = useChatRuntime(\"Chat.Input\");\n const state = useChatState(\"Chat.Input\");\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.key !== \"Enter\" || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n if (canSend(state)) runtime.send().catch(report);\n };\n return (\n <textarea\n aria-label=\"Message\"\n disabled={state.agent === undefined || state.status === \"unavailable\"}\n {...props}\n value={state.draft}\n onChange={(event) => {\n onChange?.(event);\n runtime.setDraft(event.target.value);\n }}\n onKeyDown={keyDown}\n />\n );\n}\n\n/** `type=\"submit\"`; disabled while the draft is empty or no agent is chosen. */\nexport function Send({ children, ...props }: ComponentProps<\"button\">): ReactNode {\n const state = useChatState(\"Chat.Send\");\n return (\n <button type=\"submit\" disabled={!canSend(state)} {...props}>\n {children ?? \"Send\"}\n </button>\n );\n}\n\n/** `type=\"button\"`; rendered only while a turn runs. Stops it, keeping the partial text. */\nexport function Stop({\n children,\n onClick,\n ...props\n}: ComponentProps<\"button\">): ReactNode {\n const runtime = useChatRuntime(\"Chat.Stop\");\n const state = useChatState(\"Chat.Stop\");\n if (state.status !== \"running\" && state.status !== \"waiting\") return null;\n return (\n <button\n type=\"button\"\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) runtime.stop().catch(report);\n }}\n >\n {children ?? \"Stop\"}\n </button>\n );\n}\n\nfunction statusText({ status, wait, setup, link, presenceDue }: ChatState): string {\n if (setup?.step === \"passkey\") return \"Waiting for the passkey\";\n if (link.status === \"unlinked\") return \"Link this device to send messages\";\n if (wait) {\n return wait.reason === \"offline\"\n ? `Waiting for ${wait.hostName} to come online`\n : `Waiting for ${wait.hostName} to approve this device`;\n }\n if (status === \"sending\") return \"Sending...\";\n if (status === \"running\") return \"Working...\";\n if (presenceDue) return \"Sending will ask for Face ID or Touch ID\";\n return \"\";\n}\n\n/**\n * The chat's state in words, for a live region: a `p[role=status]` that is empty when\n * there is nothing to say, so a wait never shows without text. `children` replaces the text.\n */\nexport function Status({ children, ...props }: ComponentProps<\"p\">): ReactNode {\n const state = useChatState(\"Chat.Status\");\n return (\n <p\n role=\"status\"\n {...props}\n data-status={state.status}\n data-wait={state.wait?.reason}\n data-unavailable={state.unavailable?.reason}\n >\n {children ?? statusText(state)}\n </p>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-root.js","sourceRoot":"","sources":["../../../src/react/chat/chat-root.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQhD;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IACxD,OAAO,CACL,KAAC,QAAQ,IAA0B,QAAQ,EAAE,QAAQ,YAClD,QAAQ,IADI,gBAAgB,EAAE,CAEtB,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IACrD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAClE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CACxC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,OAAO,YAAG,QAAQ,GAAa,CAAC;AAC3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"chat-root.js","sourceRoot":"","sources":["../../../src/react/chat/chat-root.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQhD;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IACxD,OAAO,CACL,KAAC,QAAQ,IAA0B,QAAQ,EAAE,QAAQ,YAClD,QAAQ,IADI,gBAAgB,EAAE,CAEtB,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAiB;IACrD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAClE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CACxC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,OAAO,YAAG,QAAQ,GAAa,CAAC;AAC3D,CAAC","sourcesContent":["import { type ReactNode, useEffect, useMemo } from \"react\";\n\nimport { useFramework, useIdentityEpoch } from \"../provider.js\";\nimport { ChatScope } from \"./context.js\";\nimport { createRootRuntime } from \"./create.js\";\n\nexport interface ChatRootProps {\n /** The thread to show. When omitted, the most recent one, or a blank one for a user with none. */\n readonly threadId?: string | undefined;\n readonly children: ReactNode;\n}\n\n/**\n * Owns one chat runtime for its subtree: the `chat` channel on the existing sync stream,\n * its thread in presence `watching` so inline confirmations reach this client, and the\n * confirmation subscription. Renders no DOM of its own. When the signed-in user changes,\n * the subtree remounts with a fresh runtime, so nothing of the previous user remains.\n */\nexport function Root({ threadId, children }: ChatRootProps): ReactNode {\n return (\n <UserChat key={useIdentityEpoch()} threadId={threadId}>\n {children}\n </UserChat>\n );\n}\n\nfunction UserChat({ threadId, children }: ChatRootProps): ReactNode {\n const { client, agentUi, auth, sync } = useFramework();\n const runtime = useMemo(\n () => createRootRuntime({ client, agentUi, auth, sync, threadId }),\n [client, agentUi, auth, sync, threadId],\n );\n\n useEffect(() => runtime.start(), [runtime]);\n\n return <ChatScope value={runtime}>{children}</ChatScope>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-thread.js","sourceRoot":"","sources":["../../../src/react/chat/chat-thread.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat-thread.js","sourceRoot":"","sources":["../../../src/react/chat/chat-thread.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { AgentConfirmation } from \"@parlor/agent-ui/client\";\nimport type { ChatItem } from \"@parlor/chat\";\nimport {\n type ComponentProps,\n Fragment,\n type ReactNode,\n type UIEvent,\n useCallback,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nimport { useChatRuntime, useChatState } from \"./context.js\";\n\nexport interface ChatThreadProps extends Omit<ComponentProps<\"ol\">, \"children\"> {\n readonly children: (item: ChatItem<AgentConfirmation>) => ReactNode;\n readonly empty?: ReactNode;\n /** The first row while the thread has earlier items, such as a `Chat.LoadOlder`. */\n readonly older?: ReactNode;\n}\n\nconst NEAR_END_PX = 24;\n\nconst flag = (value: boolean) => (value ? \"true\" : \"false\");\n\n/**\n * `role=\"log\"`, one `<li data-kind data-streaming>` per item keyed by item id, so a\n * streamed reply keeps its row when its durable twin lands. Stays scrolled to the end\n * while the user is there and never steals focus; `data-status` mirrors the chat status.\n */\nexport function Thread({\n children,\n empty,\n older,\n ref,\n onScroll,\n ...props\n}: ChatThreadProps) {\n const { items, status, hasOlder } = useChatState(\"Chat.Thread\");\n const list = useRef<HTMLOListElement | null>(null);\n const atEnd = useRef(true);\n const anchor = useRef<{ readonly first?: string | undefined; readonly height: number }>(\n {\n height: 0,\n },\n );\n const attach = useCallback(\n (element: HTMLOListElement | null) => {\n list.current = element;\n if (typeof ref === \"function\") return ref(element);\n if (ref) {\n ref.current = element;\n return () => {\n ref.current = null;\n };\n }\n },\n [ref],\n );\n const track = (event: UIEvent<HTMLOListElement>) => {\n onScroll?.(event);\n const element = event.currentTarget;\n atEnd.current =\n element.scrollHeight - element.scrollTop - element.clientHeight <= NEAR_END_PX;\n };\n useLayoutEffect(() => {\n const element = list.current;\n if (!element) return;\n const first = items[0]?.id;\n const before = anchor.current;\n if (atEnd.current) element.scrollTop = element.scrollHeight;\n else if (\n before.first !== undefined &&\n first !== before.first &&\n items.some((item) => item.id === before.first)\n ) {\n element.scrollTop += element.scrollHeight - before.height;\n }\n anchor.current = { first, height: element.scrollHeight };\n });\n\n return (\n <Fragment>\n <ol role=\"log\" {...props} ref={attach} onScroll={track} data-status={status}>\n {hasOlder && older !== undefined ? <li data-kind=\"older\">{older}</li> : null}\n {items.map((item) => (\n <li\n key={item.id}\n data-item-id={item.id}\n data-kind={item.kind}\n data-streaming={\"streaming\" in item ? flag(item.streaming) : undefined}\n data-interrupted={\n item.kind === \"reply\" || item.kind === \"reasoning\"\n ? flag(item.interrupted)\n : undefined\n }\n >\n {children(item)}\n </li>\n ))}\n </ol>\n {items.length === 0 ? empty : null}\n </Fragment>\n );\n}\n\n/** `type=\"button\"`; rendered only while the thread has earlier items, which it reads. */\nexport function LoadOlder({ children, onClick, ...props }: ComponentProps<\"button\">) {\n const runtime = useChatRuntime(\"Chat.LoadOlder\");\n const { hasOlder, loadingOlder } = useChatState(\"Chat.LoadOlder\");\n if (!hasOlder) return null;\n return (\n <button\n type=\"button\"\n disabled={loadingOlder}\n {...props}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n runtime.loadOlder().catch((error: unknown) => {\n console.error(\"[parlor] The chat could not do that:\", error);\n });\n }\n }}\n >\n {children ?? (loadingOlder ? \"Loading…\" : \"Show earlier messages\")}\n </button>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/react/chat/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAIjE,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAA0B,SAAS,CAAC,CAAC;AAE3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACzB,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC9B,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,KAAK,KAAK,SAAS;QACnB,KAAK,CAAC,KAAK;QACX,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CACtF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/react/chat/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAIjE,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAA0B,SAAS,CAAC,CAAC;AAE3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACzB,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC9B,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,KAAK,KAAK,SAAS;QACnB,KAAK,CAAC,KAAK;QACX,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CACtF,CAAC;AACJ,CAAC","sourcesContent":["import { isPromptTooLong } from \"@parlor/chat\";\nimport { createContext, use, useSyncExternalStore } from \"react\";\n\nimport type { ChatRuntime, ChatState } from \"./runtime.js\";\n\nexport const ChatScope = createContext<ChatRuntime | undefined>(undefined);\n\nexport function useChatRuntime(part: string): ChatRuntime {\n const runtime = use(ChatScope);\n if (!runtime) throw new Error(`${part} must be rendered inside Chat.Root.`);\n return runtime;\n}\n\nexport function useChatState(part: string): ChatState {\n const runtime = useChatRuntime(part);\n return useSyncExternalStore(runtime.subscribe, runtime.get, runtime.get);\n}\n\nexport function canSend(state: ChatState): boolean {\n const { agent } = state;\n return (\n state.draft.trim() !== \"\" &&\n state.setup === undefined &&\n state.link.status === \"linked\" &&\n !isPromptTooLong(state.draft) &&\n agent !== undefined &&\n agent.ready &&\n (state.status === \"idle\" || state.status === \"running\" || state.status === \"waiting\")\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/react/chat/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,EAAqB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAI5D,OAAO,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUnE,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACxD,OAAO,iBAAiB,CAAC;QACvB,KAAK,EAAE,kBAAkB,CAAoB,MAAM,EAAE,MAAM,CAAC;QAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,SAAS,EAAE;QACtB,OAAO;QACP,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACjD,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;QACjC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QACvD,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,QAAQ;QACjE,IAAI;QACJ,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC;QAC5C,QAAQ;KACT,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/react/chat/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,EAAqB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAI5D,OAAO,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUnE,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACxD,OAAO,iBAAiB,CAAC;QACvB,KAAK,EAAE,kBAAkB,CAAoB,MAAM,EAAE,MAAM,CAAC;QAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,SAAS,EAAE;QACtB,OAAO;QACP,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACjD,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE;QACjC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QACvD,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,KAAK,QAAQ;QACjE,IAAI;QACJ,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC;QAC5C,QAAQ;KACT,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { AgentUiClient } from \"@parlor/agent-ui/client\";\nimport { localAgentHost, resolveCapability } from \"@parlor/capabilities\";\nimport type { ChatUserActionMap } from \"@parlor/chat/server\";\n\nimport { type ActionClient, appOrigin } from \"../../action-client.js\";\nimport { createPluginClient } from \"../../plugin-client.js\";\nimport type { RegisteredActions } from \"../../register.js\";\nimport type { FrameworkAuth } from \"../../session.js\";\nimport type { FrameworkSync } from \"../sync-bridge.js\";\nimport { type ChatRuntime, createChatRuntime } from \"./runtime.js\";\n\nexport interface RootRuntimeInput {\n readonly client: ActionClient<RegisteredActions>;\n readonly agentUi: AgentUiClient;\n readonly auth: FrameworkAuth | undefined;\n readonly sync: FrameworkSync;\n readonly threadId: string | undefined;\n}\n\nexport function createRootRuntime(input: RootRuntimeInput): ChatRuntime {\n const { client, agentUi, auth, sync, threadId } = input;\n return createChatRuntime({\n calls: createPluginClient<ChatUserActionMap>(client, \"chat\"),\n clientId: client.clientId,\n appOrigin: appOrigin(),\n agentUi,\n addChannel: (channel) => sync.addChannel(channel),\n onSyncTags: (listener) =>\n sync.onEvents((events) => listener(events.flatMap((event) => event.tags))),\n onResume: (listener) => sync.onResume(listener),\n transport: () => sync.transport(),\n onNegotiated: (listener) => sync.onNegotiated(listener),\n isHidden: () => globalThis.document?.visibilityState === \"hidden\",\n auth,\n localHost: resolveCapability(localAgentHost),\n threadId,\n });\n}\n"]}
|