@parlor/client 0.2.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/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
@@ -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;AAa3E,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 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
+ {"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"]}
@@ -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) or `computer` (answered
13
- * on the computer; choices disabled). `data-state` is `open`, `answered` or `closed`.
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;;;;;GAKG;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"}
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) or `computer` (answered
10
- * on the computer; choices disabled). `data-state` is `open`, `answered` or `closed`.
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":"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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) or `computer` (answered\n * on the computer; choices 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
+ {"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,11 +1,11 @@
1
1
  import type { AgentConfirmation, AgentUiClient } from "@parlor/agent-ui/client";
2
2
  import type { CapabilityHandle, LocalAgentHost } from "@parlor/capabilities";
3
- import { type ChatItem, type HostSummary, type ThreadSummary } from "@parlor/chat";
3
+ import { type AgentOption, type AgentUsage, type ChatItem, type HostSummary, type ThreadSummary } from "@parlor/chat";
4
4
  import type { ChatUserActionMap } from "@parlor/chat/server";
5
5
  import { type Tag } from "@parlor/core";
6
6
  import type { ClientChannel } from "@parlor/sync";
7
7
  import type { PluginClient } from "../../plugin-client.js";
8
- import type { DeviceLinker, DeviceSource, HostAuthorizer } from "../../session.js";
8
+ import type { ComputerDisconnector, DeviceLinker, DeviceSource, HostAuthorizer } from "../../session.js";
9
9
  /** One agent the user can talk to; `key` is `<hostId>/<agentId>`. */
10
10
  export interface AgentChoice {
11
11
  readonly key: string;
@@ -14,6 +14,16 @@ export interface AgentChoice {
14
14
  readonly online: boolean;
15
15
  readonly ready: boolean;
16
16
  readonly problem: string | undefined;
17
+ /** What a prompt to this agent may choose, such as its model; empty until it has said. */
18
+ readonly options: readonly AgentChoiceOption[];
19
+ /** The account's allowance, as the agent last reported it. */
20
+ readonly usage: AgentUsage | undefined;
21
+ /** The name this agent knows the app by outside the sidebar, when the user let it use the app there. */
22
+ readonly outsideName: string | undefined;
23
+ }
24
+ export interface AgentChoiceOption extends AgentOption {
25
+ /** The value the next prompt runs with: this device's choice, or the agent's own. */
26
+ readonly selected: string;
17
27
  }
18
28
  /** How this client adds a computer, decided by the `localAgentHost` capability. */
19
29
  export type ConnectOption = {
@@ -118,6 +128,10 @@ export interface ChatCommands {
118
128
  /** A `presence` ask triggers the OS prompt first; a `computer` ask refuses. */
119
129
  answer(askId: string, choice: string, values?: Readonly<Record<string, string | number | boolean>>): Promise<void>;
120
130
  choose(agentKey: string): void;
131
+ /** Chooses a value of the chosen agent's option for this device's next prompts to it. */
132
+ setOption(optionId: string, value: string): void;
133
+ /** Disconnects a computer: its agents leave the sidebar and stop using the app outside it. */
134
+ disconnect(hostId: string): Promise<void>;
121
135
  /** `undefined` opens the most recent thread, if there is one. */
122
136
  openThread(threadId: string | undefined): void;
123
137
  /** Starts a blank thread; it exists on the server once the first prompt is sent. */
@@ -157,7 +171,7 @@ export interface ChatRuntimeDeps {
157
171
  readonly transport: () => "sse" | "poll" | undefined;
158
172
  readonly onNegotiated: (listener: (transport: "sse" | "poll") => void) => () => void;
159
173
  readonly isHidden?: (() => boolean) | undefined;
160
- readonly auth: Partial<DeviceSource & HostAuthorizer & DeviceLinker> | undefined;
174
+ readonly auth: Partial<DeviceSource & HostAuthorizer & DeviceLinker & ComputerDisconnector> | undefined;
161
175
  readonly localHost: Promise<CapabilityHandle<LocalAgentHost>>;
162
176
  readonly threadId: string | undefined;
163
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/react/chat/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/react/chat/runtime.ts"],"names":[],"mappings":"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"}
@@ -64,6 +64,7 @@ export function createChatRuntime(deps) {
64
64
  let draft = "";
65
65
  let failure;
66
66
  let chosen;
67
+ let optionChoices = readOptionChoices();
67
68
  let sending = false;
68
69
  let pendingSend;
69
70
  let startedNew = false;
@@ -121,14 +122,27 @@ export function createChatRuntime(deps) {
121
122
  return undefined;
122
123
  return refusedLast(hostId, deviceId) ? 0 : due - PRESENCE_MARGIN_MS;
123
124
  };
124
- const choices = () => hosts.flatMap((host) => host.agents.map((agent) => ({
125
- key: `${host.id}/${agent.id}`,
126
- name: agent.name,
127
- hostName: host.name,
128
- online: host.online,
129
- ready: agent.ready,
130
- problem: agent.problem,
131
- })));
125
+ /** This device's choices for `agentKey` that its agent still offers. */
126
+ const chosenOptions = (agentKey, options) => Object.fromEntries(Object.entries(optionChoices[agentKey] ?? {}).filter(([id, value]) => options.some((option) => option.id === id && option.values.some((candidate) => candidate.id === value))));
127
+ const choices = () => hosts.flatMap((host) => host.agents.map((agent) => {
128
+ const key = `${host.id}/${agent.id}`;
129
+ const offered = agent.options ?? [];
130
+ const picked = chosenOptions(key, offered);
131
+ return {
132
+ key,
133
+ name: agent.name,
134
+ hostName: host.name,
135
+ online: host.online,
136
+ ready: agent.ready,
137
+ problem: agent.problem,
138
+ options: offered.map((option) => ({
139
+ ...option,
140
+ selected: picked[option.id] ?? option.current,
141
+ })),
142
+ usage: agent.usage,
143
+ outsideName: agent.outsideName,
144
+ };
145
+ }));
132
146
  const waitOn = (reason, hostId) => ({
133
147
  reason,
134
148
  hostId,
@@ -477,6 +491,10 @@ export function createChatRuntime(deps) {
477
491
  try {
478
492
  await reporting(async () => {
479
493
  const agent = { hostId: asId("host", hostId), agentId };
494
+ const offered = hosts
495
+ .find((host) => host.id === hostId)
496
+ ?.agents.find((candidate) => candidate.id === agentId)?.options;
497
+ const options = chosenOptions(agentKey, offered ?? []);
480
498
  const signed = deps.auth?.device
481
499
  ? await signPrompt({
482
500
  threadId: attempt.threadId,
@@ -490,7 +508,12 @@ export function createChatRuntime(deps) {
490
508
  turnId: attempt.turnId,
491
509
  itemId: attempt.itemId,
492
510
  clientId: deps.clientId,
493
- prompt: { text: attempt.text, agent, ...(signed ? { signed } : {}) },
511
+ prompt: {
512
+ text: attempt.text,
513
+ agent,
514
+ ...(signed ? { signed } : {}),
515
+ ...(Object.keys(options).length > 0 ? { options } : {}),
516
+ },
494
517
  });
495
518
  settle();
496
519
  if (epoch !== generation)
@@ -663,7 +686,7 @@ export function createChatRuntime(deps) {
663
686
  };
664
687
  await whenSetUp(() => reporting(async () => {
665
688
  const found = deps.auth?.device ? await deviceOf() : undefined;
666
- if (ask.approval === "presence" && !found) {
689
+ if ((ask.approval === "presence" || ask.approval === "device") && !found) {
667
690
  throw new NeedsDevice("This question needs a device that can confirm it is you.");
668
691
  }
669
692
  const signed = await found?.signAnswer(toSign, {
@@ -766,6 +789,25 @@ export function createChatRuntime(deps) {
766
789
  chosen = agentKey;
767
790
  emit();
768
791
  },
792
+ async disconnect(hostId) {
793
+ if (!deps.auth?.disconnectComputer) {
794
+ throw new Error("This app cannot disconnect computers.");
795
+ }
796
+ await deps.auth.disconnectComputer(hostId);
797
+ await refreshHosts();
798
+ emit();
799
+ },
800
+ setOption(optionId, value) {
801
+ const agentKey = state.agent?.key;
802
+ if (agentKey === undefined)
803
+ return;
804
+ optionChoices = {
805
+ ...optionChoices,
806
+ [agentKey]: { ...optionChoices[agentKey], [optionId]: value },
807
+ };
808
+ writeOptionChoices(optionChoices);
809
+ emit();
810
+ },
769
811
  openThread(target) {
770
812
  switchTo(target === undefined ? undefined : asId("thread", target), false);
771
813
  },
@@ -837,6 +879,7 @@ export function createChatRuntime(deps) {
837
879
  announceActivity();
838
880
  });
839
881
  const offConfirmations = agentUi.confirmations.subscribe(emit);
882
+ const offLink = deps.auth?.subscribeLink?.(() => void refreshLink());
840
883
  emit();
841
884
  announceActivity();
842
885
  void initial();
@@ -854,6 +897,7 @@ export function createChatRuntime(deps) {
854
897
  offResume();
855
898
  offNegotiated();
856
899
  offConfirmations();
900
+ offLink?.();
857
901
  stopWatching?.();
858
902
  stopWatching = undefined;
859
903
  watched = undefined;
@@ -936,4 +980,20 @@ export function createChatRuntime(deps) {
936
980
  }
937
981
  return runtime;
938
982
  }
983
+ const OPTION_CHOICES_KEY = "parlor:agent-options";
984
+ function readOptionChoices() {
985
+ try {
986
+ const stored = JSON.parse(globalThis.localStorage?.getItem(OPTION_CHOICES_KEY) ?? "{}");
987
+ return stored && typeof stored === "object" ? stored : {};
988
+ }
989
+ catch {
990
+ return {};
991
+ }
992
+ }
993
+ function writeOptionChoices(choices) {
994
+ try {
995
+ globalThis.localStorage?.setItem(OPTION_CHOICES_KEY, JSON.stringify(choices));
996
+ }
997
+ catch { }
998
+ }
939
999
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/react/chat/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentConfirmation, AgentUiClient } from \"@parlor/agent-ui/client\";\nimport type { CapabilityHandle, LocalAgentHost } from \"@parlor/capabilities\";\nimport {\n CHAT_CHANNEL,\n CHAT_TAG,\n type ChatFrame,\n type AnswerToSign,\n type ChatItem,\n foldThread,\n type HostSummary,\n HOSTS_TAG,\n isPromptTooLong,\n type ItemSignature,\n type LoggedItem,\n parseChatFrame,\n PROMPT_LIMIT_MESSAGE,\n type PromptToSign,\n type ThreadSummary,\n type TurnStatus,\n} from \"@parlor/chat\";\nimport type { ChatUserActionMap } from \"@parlor/chat/server\";\nimport {\n ActionError,\n asId,\n type ItemId,\n type Tag,\n tagsOverlap,\n type ThreadId,\n type TurnId,\n} from \"@parlor/core\";\nimport type { ClientChannel } from \"@parlor/sync\";\n\nimport { generateClientId } from \"../../action-client.js\";\nimport type { PluginClient } from \"../../plugin-client.js\";\nimport type {\n DeviceLinker,\n DeviceSource,\n HostAuthorizer,\n SessionDevice,\n} from \"../../session.js\";\nimport {\n applyFrame,\n mergeSnapshot,\n NO_OPEN_TURNS,\n type OpenTurns,\n pruneOpen,\n} from \"./open-turns.js\";\n\n/** One agent the user can talk to; `key` is `<hostId>/<agentId>`. */\nexport interface AgentChoice {\n readonly key: string;\n readonly name: string;\n readonly hostName: string;\n readonly online: boolean;\n readonly ready: boolean;\n readonly problem: string | undefined;\n}\n\n/** How this client adds a computer, decided by the `localAgentHost` capability. */\nexport type ConnectOption =\n | { readonly kind: \"command\"; readonly command: string }\n | { readonly kind: \"here\"; start(): Promise<void> };\n\n/**\n * `waiting`: a prompt waits for a computer, which `ChatState.wait` names: one that must\n * still approve this device, or one that is offline while the prompt queues.\n * `unavailable`: this backend has no chat, this user may not use it, or the first read\n * failed and is being retried; `ChatState.unavailable` says which.\n */\nexport type ChatStatus =\n | \"loading\"\n | \"idle\"\n | \"sending\"\n | \"waiting\"\n | \"running\"\n | \"unavailable\";\n\n/**\n * Why chat is `unavailable`: `forbidden` when the app's chat `access` refuses this user,\n * so the agent should not show at all; `not_found` when the server has no chat;\n * `unauthenticated` when nobody is signed in; `error` while a failed read is retried.\n */\nexport interface ChatUnavailable {\n readonly reason: \"forbidden\" | \"not_found\" | \"unauthenticated\" | \"error\";\n}\n\nexport interface ChatWait {\n readonly reason: \"offline\" | \"approval\";\n readonly hostId: string;\n readonly hostName: string;\n}\n\n/**\n * Whether this device may send: `linked` (or nothing to link), `checking` until it knows, or\n * `unlinked` with the code it shows once `startLink` made one. A device links once, from a\n * device already linked or from the computer.\n */\nexport type LinkState =\n | { readonly status: \"linked\" | \"checking\" }\n | {\n readonly status: \"unlinked\";\n readonly hostName: string;\n readonly code?: string | undefined;\n /** What a linked phone's camera opens to link this device: `<app>/link#d=…&c=…`. */\n readonly qr?: string | undefined;\n /** What to run on the computer to link this device there instead, while `code` is shown. */\n readonly command?: string | undefined;\n readonly expiresAt?: string | undefined;\n /** The code shown last ran out; `startLink` shows a new one. */\n readonly expired: boolean;\n /** No other device is linked yet to link this one, so only the computer can, with `command`. */\n readonly onlyComputer: boolean;\n readonly busy: boolean;\n readonly error?: string | undefined;\n };\n\n/**\n * Set while an action waits for this device to be set up: on a browser, the first prompt\n * would otherwise open a passkey prompt with no warning. `explain` until the user picks,\n * `passkey` while the browser asks, `cancelled` once they dismissed it.\n */\nexport interface DeviceSetup {\n readonly step: \"explain\" | \"passkey\" | \"cancelled\";\n}\n\nexport interface ChatState {\n readonly status: ChatStatus;\n /** Set exactly while `status` is `waiting`; approval wins when both reasons hold. */\n readonly wait: ChatWait | undefined;\n /** Set exactly while `status` is `unavailable`. */\n readonly unavailable: ChatUnavailable | undefined;\n readonly thread: ThreadSummary | undefined;\n readonly threads: readonly ThreadSummary[];\n /** Older threads exist past `threads`; `loadMoreThreads` reads them. */\n readonly moreThreads: boolean;\n readonly items: readonly ChatItem<AgentConfirmation>[];\n /** The thread has items before the first one shown; `loadOlder` reads them. */\n readonly hasOlder: boolean;\n /** Set while `loadOlder` or `loadMoreThreads` reads. */\n readonly loadingOlder: boolean;\n readonly hosts: readonly HostSummary[];\n readonly agents: readonly AgentChoice[];\n readonly agent: AgentChoice | undefined;\n readonly connect: ConnectOption;\n readonly draft: string;\n /** Why the last send, stop or answer failed; cleared by the next one that succeeds. */\n readonly error: string | undefined;\n readonly setup: DeviceSetup | undefined;\n readonly link: LinkState;\n /**\n * The chosen agent's computer wants this device to confirm it is the user again, so\n * sending asks for Face ID or Touch ID first.\n */\n readonly presenceDue: boolean;\n}\n\nexport interface ChatCommands {\n setDraft(text: string): void;\n /** Signs the draft (or `text`) and sends it to the chosen agent; idempotent per call. */\n send(text?: string): Promise<void>;\n stop(): Promise<void>;\n /** Sends a prompt again as a new turn in its thread, signed anew. */\n resend(promptItemId: string): Promise<void>;\n /** Reads the thread's next earlier page while `hasOlder`. */\n loadOlder(): Promise<void>;\n /** Reads the next older threads while `moreThreads`. */\n loadMoreThreads(): Promise<void>;\n /** A `presence` ask triggers the OS prompt first; a `computer` ask refuses. */\n answer(\n askId: string,\n choice: string,\n values?: Readonly<Record<string, string | number | boolean>>,\n ): Promise<void>;\n choose(agentKey: string): void;\n /** `undefined` opens the most recent thread, if there is one. */\n openThread(threadId: string | undefined): void;\n /** Starts a blank thread; it exists on the server once the first prompt is sent. */\n newThread(): void;\n /** Shows this device's link code, after Face ID or Touch ID unless `presence` is false. */\n startLink(options?: { readonly presence?: boolean }): Promise<void>;\n}\n\nexport interface DeviceSetupCommands {\n /** Sets this device up, with a passkey or without one, then runs what waited for it. */\n setUpDevice(options: { readonly passkey: boolean }): Promise<void>;\n /** Drops what waited for the setup; the draft stays. */\n dismissSetup(): void;\n}\n\nexport interface ChatRuntime extends ChatCommands, DeviceSetupCommands {\n subscribe(listener: () => void): () => void;\n get(): ChatState;\n start(): () => void;\n /**\n * Called by a UI that explains the device setup, until it unmounts. Without one, the first\n * prompt enrolls the device directly, as before.\n */\n explainSetup(): () => void;\n}\n\nexport interface ChatRuntimeDeps {\n readonly calls: PluginClient<ChatUserActionMap>;\n readonly clientId: string;\n readonly appOrigin: string;\n readonly agentUi: AgentUiClient;\n readonly addChannel: (channel: ClientChannel) => () => void;\n readonly onSyncTags: (listener: (tags: readonly Tag[]) => void) => () => void;\n readonly onResume: (listener: () => void) => () => void;\n /** What the server negotiated for sync; `undefined` until it has. */\n readonly transport: () => \"sse\" | \"poll\" | undefined;\n readonly onNegotiated: (listener: (transport: \"sse\" | \"poll\") => void) => () => void;\n readonly isHidden?: (() => boolean) | undefined;\n readonly auth: Partial<DeviceSource & HostAuthorizer & DeviceLinker> | undefined;\n readonly localHost: Promise<CapabilityHandle<LocalAgentHost>>;\n readonly threadId: string | undefined;\n}\n\nexport const HOST_GRANTS_TAG = \"parlor_auth_hosts\";\nexport const DEVICES_TAG = \"parlor_auth_devices\";\n\nconst LINKED: LinkState = { status: \"linked\" };\nconst CHECKING: LinkState = { status: \"checking\" };\n\nconst READ_RETRY_BASE_MS = 1_000;\nconst READ_RETRY_MAX_MS = 30_000;\nconst ACTIVITY_PING_MS = 60_000;\nconst UNFIXABLE_BY_RETRY: ReadonlySet<string> = new Set([\n \"not_found\",\n \"unauthenticated\",\n \"forbidden\",\n]);\n\nconst retryable = (error: unknown) =>\n !(error instanceof ActionError && UNFIXABLE_BY_RETRY.has(error.code));\n\nconst unavailableBecause = (error: unknown): ChatUnavailable[\"reason\"] =>\n error instanceof ActionError &&\n (error.code === \"forbidden\" ||\n error.code === \"not_found\" ||\n error.code === \"unauthenticated\")\n ? error.code\n : \"error\";\n\ntype StaleRead = \"lists\" | \"hosts\";\n\ninterface PendingSend {\n readonly text: string;\n readonly agent: string;\n readonly openedIn: ThreadId | undefined;\n readonly threadId: ThreadId;\n readonly turnId: TurnId;\n readonly itemId: ItemId;\n}\n\nconst mint = <K extends \"thread\" | \"turn\" | \"item\">(kind: K) =>\n asId(kind, generateClientId());\n\nconst isActive = (turn: TurnStatus) =>\n turn.state === \"queued\" || turn.state === \"running\";\n\nconst exceedsPromptLimit = (error: ActionError): boolean =>\n error.issues?.some(\n (issue) => issue.code === \"too_big\" && issue.path.join(\".\") === \"prompt.text\",\n ) ?? false;\n\nclass NeedsDevice extends Error {\n override readonly name = \"NeedsDevice\";\n}\n\n/** Prompts are signed with presence this long before the computer's deadline, for clock skew. */\nconst PRESENCE_MARGIN_MS = 10 * 60_000;\nconst LONGEST_TIMEOUT_MS = 2 ** 31 - 1;\n\nconst readable = (error: unknown): string => {\n if (error instanceof NeedsDevice) return error.message;\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n return \"Face ID or Touch ID was cancelled.\";\n }\n if (!(error instanceof ActionError)) return \"Could not reach the server.\";\n if (error.issues === undefined) return error.message;\n return exceedsPromptLimit(error)\n ? PROMPT_LIMIT_MESSAGE\n : \"That message could not be sent. Try again.\";\n};\n\nconst bySeq = (a: LoggedItem, b: LoggedItem) => a.seq - b.seq;\n\nexport function createChatRuntime(deps: ChatRuntimeDeps): ChatRuntime {\n const { calls, agentUi } = deps;\n const listeners = new Set<() => void>();\n\n let threadId = deps.threadId === undefined ? undefined : asId(\"thread\", deps.threadId);\n let loaded: \"no\" | \"yes\" | \"failed\" = \"no\";\n let thread: ThreadSummary | undefined;\n let threads: readonly ThreadSummary[] = [];\n let olderThreads: readonly ThreadSummary[] = [];\n let moreThreads = false;\n let hasOlder = false;\n let loadingOlder = false;\n let hosts: readonly HostSummary[] = [];\n let items = new Map<string, LoggedItem>();\n let turns: readonly TurnStatus[] = [];\n let open: OpenTurns = NO_OPEN_TURNS;\n let beforeLoad: ChatFrame[] = [];\n let draft = \"\";\n let failure: string | undefined;\n let chosen: string | undefined;\n let sending = false;\n let pendingSend: PendingSend | undefined;\n let startedNew = false;\n let connect: ConnectOption = {\n kind: \"command\",\n command: `npx @parlor/agent-host connect ${deps.appOrigin}`,\n };\n let stopWatching: (() => void) | undefined;\n let watched: ThreadId | undefined;\n let running = false;\n let channelOpen = false;\n let staleAfterLoad = false;\n let dirty = false;\n const staleReads = new Set<StaleRead>();\n let unfixable = false;\n let unavailable: ChatUnavailable | undefined;\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let retryDelay = READ_RETRY_BASE_MS;\n let lastPing: number | undefined;\n let pingRefused = false;\n let generation = 0;\n let device: SessionDevice | undefined;\n let linkInfo: Awaited<ReturnType<DeviceLinker[\"linkState\"]>> | undefined;\n let linking:\n | {\n readonly deviceId: string;\n readonly code: string;\n readonly qr: string;\n readonly expiresAt: string;\n }\n | undefined;\n let linkBusy = false;\n let linkError: string | undefined;\n let linkExpired = false;\n let linkTimer: ReturnType<typeof setTimeout> | undefined;\n let presenceTimer: ReturnType<typeof setTimeout> | undefined;\n let setup: DeviceSetup | undefined;\n let afterSetup: (() => Promise<void>) | undefined;\n let explainers = 0;\n const resends = new Map<ItemId, PendingSend>();\n const answerIds = new Map<string, ItemId>();\n const stopIds = new Map<TurnId, ItemId>();\n\n const refusedLast = (hostId: string, deviceId: string): boolean => {\n const last = [...turns].reverse().find((turn) => turn.agent.hostId === hostId);\n if (last?.failure !== \"device_rejected\") return false;\n return [...items.values()].some(\n (item) =>\n item.turnId === last.turnId &&\n item.kind === \"prompt\" &&\n item.body.signed?.deviceId === deviceId,\n );\n };\n\n /**\n * When the computer behind `agentKey` wants this device's next prompt signed with presence:\n * by its report, or now if it refused this device's last prompt, whatever the clocks say.\n */\n const presenceDueAt = (agentKey: string): number | undefined => {\n const deviceId = device?.id ?? linkInfo?.deviceId;\n if (deviceId === undefined) return undefined;\n const hostId = agentKey.split(\"/\")[0]!;\n const due = hosts.find((host) => host.id === hostId)?.presenceDue?.[deviceId];\n if (due === undefined) return undefined;\n return refusedLast(hostId, deviceId) ? 0 : due - PRESENCE_MARGIN_MS;\n };\n\n const choices = (): AgentChoice[] =>\n hosts.flatMap((host) =>\n host.agents.map((agent) => ({\n key: `${host.id}/${agent.id}`,\n name: agent.name,\n hostName: host.name,\n online: host.online,\n ready: agent.ready,\n problem: agent.problem,\n })),\n );\n\n const waitOn = (reason: ChatWait[\"reason\"], hostId: string): ChatWait => ({\n reason,\n hostId,\n hostName: hosts.find((host) => host.id === hostId)?.name ?? \"your computer\",\n });\n\n const linkOf = (): LinkState => {\n if (!deps.auth?.linkState) return LINKED;\n const reporting = hosts.filter((host) => host.online && host.devices !== undefined);\n if (reporting.length === 0) return LINKED;\n if (!linkInfo) return CHECKING;\n const { deviceId } = linkInfo;\n if (\n linkInfo.pairing ||\n linkInfo.vouched ||\n (deviceId !== undefined &&\n reporting.some((host) => host.devices?.includes(deviceId)))\n ) {\n return LINKED;\n }\n const listing = hosts.filter((host) => host.devices !== undefined);\n return {\n status: \"unlinked\",\n hostName: reporting[0]!.name,\n code: linking?.code,\n qr: linking?.qr,\n command: linking && `npx @parlor/agent-host link ${deps.appOrigin} ${linking.code}`,\n expiresAt: linking?.expiresAt,\n expired: linkExpired,\n onlyComputer: listing.every((host) => host.devices!.every((id) => id === deviceId)),\n busy: linkBusy,\n error: linkError,\n };\n };\n\n const waitOf = (): ChatWait | undefined => {\n const approving = turns.find(awaitsApproval);\n if (approving) return waitOn(\"approval\", approving.agent.hostId);\n const offline = turns.find(\n (turn) =>\n turn.state === \"queued\" &&\n hosts.some((host) => host.id === turn.agent.hostId && !host.online),\n );\n return offline && waitOn(\"offline\", offline.agent.hostId);\n };\n\n const compute = (): ChatState => {\n const agents = choices();\n const wanted =\n chosen ??\n (thread?.agent ? `${thread.agent.hostId}/${thread.agent.agentId}` : undefined);\n const agent =\n agents.find((choice) => choice.key === wanted) ??\n agents.find((choice) => choice.online && choice.ready) ??\n agents[0];\n const wait = loaded === \"yes\" && !sending ? waitOf() : undefined;\n const due = agent && presenceDueAt(agent.key);\n const status: ChatStatus =\n loaded === \"failed\"\n ? \"unavailable\"\n : loaded === \"no\"\n ? \"loading\"\n : sending\n ? \"sending\"\n : wait\n ? \"waiting\"\n : turns.some(isActive) || open.turns.size > 0\n ? \"running\"\n : \"idle\";\n return {\n status,\n wait,\n unavailable: loaded === \"failed\" ? unavailable : undefined,\n thread,\n threads: [\n ...threads,\n ...olderThreads.filter(\n (older) => !threads.some((shown) => shown.id === older.id),\n ),\n ],\n moreThreads,\n hasOlder,\n loadingOlder,\n items: foldThread({\n items: [...items.values()].sort(bySeq),\n open: [...open.turns.values()],\n turns,\n confirmations: agentUi.confirmations.get().filter((c) => c.threadId === threadId),\n deviceId: device?.id,\n }),\n hosts,\n agents,\n agent,\n connect,\n draft,\n error: failure,\n setup,\n link: linkOf(),\n presenceDue: due !== undefined && Date.now() >= due,\n };\n };\n\n /** Re-emits once the chosen computer's presence deadline arrives, so the hint shows unprompted. */\n const watchPresence = () => {\n clearTimeout(presenceTimer);\n presenceTimer = undefined;\n const due = running && state.agent ? presenceDueAt(state.agent.key) : undefined;\n if (due === undefined || state.presenceDue) return;\n presenceTimer = setTimeout(emit, Math.min(due - Date.now(), LONGEST_TIMEOUT_MS));\n };\n\n let state = compute();\n const emit = () => {\n state = compute();\n watchPresence();\n for (const listener of [...listeners]) listener();\n };\n\n const watch = () => {\n if (watched === threadId) return;\n stopWatching?.();\n watched = threadId;\n stopWatching = threadId === undefined ? undefined : agentUi.watch(threadId);\n };\n\n const absorb = (page: {\n readonly items: readonly LoggedItem[];\n readonly turns?: readonly TurnStatus[] | undefined;\n }) => {\n items = new Map(items);\n for (const item of page.items) items.set(item.id, item);\n if (page.turns) {\n const fresh = new Map(page.turns.map((turn) => [turn.turnId, turn]));\n turns = [...turns.filter((turn) => !fresh.has(turn.turnId)), ...page.turns];\n }\n open = pruneOpen(open, items, turns);\n };\n\n const oldestSeq = (): number | undefined =>\n items.size === 0\n ? undefined\n : Math.min(...[...items.values()].map((item) => item.seq));\n\n const takeThreads = (snapshot: {\n readonly threads: readonly ThreadSummary[];\n readonly moreThreads?: boolean | undefined;\n }) => {\n threads = snapshot.threads;\n if (olderThreads.length === 0) moreThreads = snapshot.moreThreads === true;\n };\n\n const load = async (target: ThreadId | undefined) => {\n const epoch = generation;\n const snapshot = await calls.call(\"open\", target ? { threadId: target } : {});\n if (epoch !== generation) return;\n staleReads.clear();\n takeThreads(snapshot);\n hosts = snapshot.hosts;\n const page = startedNew && target === undefined ? undefined : snapshot.page;\n thread = page?.thread;\n threadId = page?.thread?.id ?? target;\n if (page) {\n const oldest = oldestSeq();\n absorb(page);\n const first = page.items[0];\n if (oldest === undefined || (first !== undefined && first.seq <= oldest)) {\n hasOlder = page.hasMore;\n }\n }\n open = mergeSnapshot(open, channelOpen && page ? page.open : []);\n const replay = beforeLoad;\n beforeLoad = [];\n loaded = \"yes\";\n retryDelay = READ_RETRY_BASE_MS;\n for (const frame of replay) {\n if (frame.threadId === threadId) open = applyFrame(open, frame);\n }\n open = pruneOpen(open, items, turns);\n watch();\n };\n\n const refreshLists = async () => {\n const epoch = generation;\n const fresh = await calls.call(\"open\", {});\n if (epoch !== generation || threadId !== undefined) return;\n takeThreads(fresh);\n hosts = fresh.hosts;\n emit();\n };\n\n const refreshHosts = async () => {\n const fresh = await calls.call(\"hosts\", {});\n hosts = fresh;\n emit();\n };\n\n const readLists = async () => {\n if (threadId === undefined && !startedNew && draft.trim() === \"\") {\n await load(undefined);\n emit();\n } else await refreshLists();\n };\n\n const staleReaders: Record<StaleRead, () => Promise<void>> = {\n lists: readLists,\n hosts: refreshHosts,\n };\n\n const cancelRetry = () => {\n if (retryTimer !== undefined) globalThis.clearTimeout(retryTimer);\n retryTimer = undefined;\n };\n\n const clearRetry = () => {\n cancelRetry();\n retryDelay = READ_RETRY_BASE_MS;\n };\n\n const scheduleRetry = () => {\n if (!running || retryTimer !== undefined) return;\n const wait = retryDelay;\n retryDelay = Math.min(retryDelay * 2, READ_RETRY_MAX_MS);\n retryTimer = globalThis.setTimeout(() => {\n retryTimer = undefined;\n void mend();\n }, wait);\n };\n\n const settled = () => {\n if (!dirty && staleReads.size === 0) clearRetry();\n };\n\n const rereadStale = async (kind: StaleRead) => {\n const epoch = generation;\n try {\n await staleReaders[kind]();\n staleReads.delete(kind);\n settled();\n } catch (error) {\n if (epoch !== generation) return;\n staleReads.add(kind);\n if (retryable(error)) scheduleRetry();\n }\n };\n\n let refreshing = false;\n let refreshAgain = false;\n const refresh = async () => {\n if (refreshing) {\n refreshAgain = true;\n return;\n }\n refreshing = true;\n try {\n do {\n refreshAgain = false;\n if (loaded !== \"yes\" || threadId === undefined) break;\n const epoch = generation;\n const target = threadId;\n if (turns.some(isActive)) {\n await load(target);\n } else {\n const lastSeq = Math.max(0, ...[...items.values()].map((item) => item.seq));\n const fresh = await calls.call(\"items\", {\n threadId: target,\n afterSeq: lastSeq,\n });\n if (epoch !== generation) break;\n absorb({ items: fresh });\n const known = new Set(turns.map((turn) => turn.turnId));\n if (fresh.some((item) => !known.has(item.turnId))) await load(target);\n }\n dirty = false;\n settled();\n emit();\n } while (refreshAgain);\n } catch (error) {\n refreshAgain = false;\n dirty = true;\n if (retryable(error)) scheduleRetry();\n } finally {\n refreshing = false;\n }\n };\n\n const reporting = async (command: () => Promise<void>) => {\n try {\n await command();\n } catch (error) {\n failure = readable(error);\n emit();\n throw error;\n }\n if (failure !== undefined) {\n failure = undefined;\n emit();\n }\n };\n\n const awaitsApproval = (turn: TurnStatus): boolean => {\n if (!isActive(turn)) return false;\n let waiting = false;\n for (const item of [...items.values()].sort(bySeq)) {\n if (item.turnId !== turn.turnId) continue;\n if (item.kind === \"event\" && item.body.event === \"device_pending\") waiting = true;\n else if (item.author !== \"user\") waiting = false;\n }\n return waiting;\n };\n\n const deviceOf = async (): Promise<SessionDevice | undefined> => {\n const found = await deps.auth?.device?.();\n device = found ?? device;\n return found;\n };\n\n const refreshLink = async () => {\n if (!deps.auth?.linkState) return;\n try {\n linkInfo = await deps.auth.linkState();\n } catch {\n return;\n }\n if (linking && linking.deviceId !== linkInfo.deviceId) linking = undefined;\n emit();\n };\n\n const whenSetUp = async (action: () => Promise<void>): Promise<void> => {\n if (\n explainers > 0 &&\n device === undefined &&\n (await deps.auth?.deviceSetup?.()) === \"needed\"\n ) {\n afterSetup = action;\n setup = { step: \"explain\" };\n emit();\n return;\n }\n await action();\n };\n\n const signPrompt = async (prompt: PromptToSign): Promise<ItemSignature | undefined> => {\n const own = await deviceOf();\n if (!own) return undefined;\n const due = presenceDueAt(`${prompt.agent.hostId}/${prompt.agent.agentId}`);\n return due !== undefined && Date.now() >= due\n ? own.signPrompt(prompt, { presence: true })\n : own.signPrompt(prompt);\n };\n\n const submit = async (\n attempt: PendingSend,\n agentKey: string,\n settle: () => void,\n ): Promise<void> => {\n const [hostId, agentId] = agentKey.split(\"/\") as [string, string];\n const epoch = generation;\n sending = true;\n emit();\n try {\n await reporting(async () => {\n const agent = { hostId: asId(\"host\", hostId), agentId };\n const signed = deps.auth?.device\n ? await signPrompt({\n threadId: attempt.threadId,\n turnId: attempt.turnId,\n agent,\n text: attempt.text,\n })\n : undefined;\n await calls.call(\"send\", {\n threadId: attempt.threadId,\n turnId: attempt.turnId,\n itemId: attempt.itemId,\n clientId: deps.clientId,\n prompt: { text: attempt.text, agent, ...(signed ? { signed } : {}) },\n });\n settle();\n if (epoch !== generation) return;\n startedNew = false;\n threadId = attempt.threadId;\n watch();\n await load(threadId);\n });\n } finally {\n sending = false;\n emit();\n }\n };\n\n const activeTurn = (): TurnStatus | undefined => [...turns].reverse().find(isActive);\n\n const switchTo = (target: ThreadId | undefined, blank: boolean) => {\n generation += 1;\n threadId = target;\n startedNew = blank;\n thread = undefined;\n items = new Map();\n turns = [];\n hasOlder = false;\n open = NO_OPEN_TURNS;\n beforeLoad = [];\n pendingSend = undefined;\n stopIds.clear();\n answerIds.clear();\n dirty = false;\n staleReads.clear();\n clearRetry();\n watch();\n if (blank && loaded === \"yes\") {\n emit();\n return;\n }\n loaded = \"no\";\n emit();\n void loadFirst().then(emit);\n };\n\n const runtime: ChatRuntime = {\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n get: () => state,\n setDraft(text) {\n draft = text;\n emit();\n announceActivity();\n },\n async send(text = draft) {\n announceActivity();\n const prompt = text.trim();\n const target = state.agent;\n if (!prompt || isPromptTooLong(prompt) || !target || sending || loaded !== \"yes\") {\n return;\n }\n const retrying =\n pendingSend?.text === prompt &&\n pendingSend.agent === target.key &&\n pendingSend.openedIn === threadId;\n const attempt =\n retrying && pendingSend\n ? pendingSend\n : (pendingSend = {\n text: prompt,\n agent: target.key,\n openedIn: threadId,\n threadId: threadId ?? mint(\"thread\"),\n turnId: mint(\"turn\"),\n itemId: mint(\"item\"),\n });\n await whenSetUp(() =>\n submit(attempt, target.key, () => {\n pendingSend = undefined;\n if (draft.trim() === prompt) draft = \"\";\n }),\n );\n },\n async loadOlder() {\n const target = threadId;\n const before = oldestSeq();\n if (target === undefined || before === undefined || !hasOlder || loadingOlder)\n return;\n const epoch = generation;\n loadingOlder = true;\n emit();\n try {\n await reporting(async () => {\n const older = await calls.call(\"history\", {\n threadId: target,\n beforeSeq: before,\n });\n if (epoch !== generation) return;\n absorb(older);\n hasOlder = older.hasMore;\n });\n } finally {\n loadingOlder = false;\n emit();\n }\n },\n async loadMoreThreads() {\n const last = olderThreads.at(-1) ?? threads.at(-1);\n if (!last || !moreThreads || loadingOlder) return;\n loadingOlder = true;\n emit();\n try {\n await reporting(async () => {\n const next = await calls.call(\"threadsBefore\", {\n before: { updatedAt: last.updatedAt, id: last.id },\n });\n olderThreads = [...olderThreads, ...next.threads];\n moreThreads = next.hasMore;\n });\n } finally {\n loadingOlder = false;\n emit();\n }\n },\n async resend(promptItemId) {\n const prompt = state.items.find(\n (item) => item.kind === \"prompt\" && item.id === promptItemId,\n );\n if (prompt?.kind !== \"prompt\" || sending || loaded !== \"yes\" || !threadId) return;\n const key = `${prompt.agent.hostId}/${prompt.agent.agentId}`;\n let attempt = resends.get(prompt.id);\n if (!attempt) {\n attempt = {\n text: prompt.text,\n agent: key,\n openedIn: threadId,\n threadId,\n turnId: mint(\"turn\"),\n itemId: mint(\"item\"),\n };\n resends.set(prompt.id, attempt);\n }\n await whenSetUp(() => submit(attempt, key, () => resends.delete(prompt.id)));\n },\n async stop() {\n const turn = activeTurn();\n if (!turn || threadId === undefined) return;\n const itemId = stopIds.get(turn.turnId) ?? mint(\"item\");\n stopIds.set(turn.turnId, itemId);\n const target = threadId;\n await reporting(async () => {\n await calls.call(\"cancel\", { threadId: target, turnId: turn.turnId, itemId });\n await refresh();\n });\n },\n async answer(askId, choice, values) {\n const ask = state.items.find((item) => item.kind === \"ask\" && item.id === askId);\n if (!ask || ask.kind !== \"ask\" || ask.answer.state !== \"open\" || !threadId) return;\n if (ask.approval === \"computer\") {\n throw new Error(\"This question is answered on your computer.\");\n }\n const itemId = answerIds.get(askId) ?? mint(\"item\");\n answerIds.set(askId, itemId);\n const target = threadId;\n const toSign: AnswerToSign = {\n threadId: target,\n askId: ask.id,\n choice,\n ...(values ? { values } : {}),\n };\n await whenSetUp(() =>\n reporting(async () => {\n const found = deps.auth?.device ? await deviceOf() : undefined;\n if (ask.approval === \"presence\" && !found) {\n throw new NeedsDevice(\n \"This question needs a device that can confirm it is you.\",\n );\n }\n const signed = await found?.signAnswer(toSign, {\n presence: ask.approval === \"presence\",\n });\n await calls.call(\"answer\", {\n threadId: target,\n turnId: ask.turnId,\n itemId,\n answer: {\n askId: ask.id,\n choice,\n ...(values ? { values } : {}),\n ...(signed ? { signed } : {}),\n },\n });\n answerIds.delete(askId);\n await refresh();\n }),\n );\n },\n async setUpDevice({ passkey }) {\n if (setup === undefined || setup.step === \"passkey\") return;\n setup = { step: \"passkey\" };\n emit();\n try {\n device = (await deps.auth?.device?.({ presence: passkey })) ?? device;\n } catch (error) {\n if (error instanceof Error && error.name === \"PresenceSetupCancelled\") {\n setup = { step: \"cancelled\" };\n emit();\n return;\n }\n setup = undefined;\n afterSetup = undefined;\n failure = readable(error);\n emit();\n return;\n }\n const waiting = afterSetup;\n setup = undefined;\n afterSetup = undefined;\n emit();\n await waiting?.();\n },\n dismissSetup() {\n setup = undefined;\n afterSetup = undefined;\n emit();\n },\n async startLink(options) {\n if (!deps.auth?.startLink || linkBusy) return;\n linkBusy = true;\n linkError = undefined;\n emit();\n try {\n const started = await deps.auth.startLink(options);\n linking = {\n deviceId: started.deviceId,\n code: started.code,\n qr: `${deps.appOrigin}/link#${new URLSearchParams({ d: started.deviceId, c: started.commitment })}`,\n expiresAt: started.expiresAt,\n };\n linkExpired = false;\n clearTimeout(linkTimer);\n linkTimer = setTimeout(\n () => {\n linking = undefined;\n linkExpired = true;\n emit();\n },\n Math.min(\n Math.max(0, Date.parse(started.expiresAt) - Date.now()),\n LONGEST_TIMEOUT_MS,\n ),\n );\n linkInfo = {\n vouched: false,\n pairing: false,\n ...linkInfo,\n deviceId: started.deviceId,\n };\n } catch (error) {\n linkError =\n error instanceof Error && error.name === \"PresenceSetupCancelled\"\n ? \"Face ID or Touch ID was cancelled. Try again, or link without it.\"\n : readable(error);\n } finally {\n linkBusy = false;\n emit();\n }\n },\n explainSetup() {\n explainers += 1;\n return () => {\n explainers -= 1;\n if (explainers === 0 && setup !== undefined) runtime.dismissSetup();\n };\n },\n choose(agentKey) {\n chosen = agentKey;\n emit();\n },\n openThread(target) {\n switchTo(target === undefined ? undefined : asId(\"thread\", target), false);\n },\n newThread() {\n switchTo(undefined, true);\n },\n start() {\n running = true;\n const detachChannel = deps.addChannel({\n event: CHAT_CHANNEL,\n opened: () => {\n channelOpen = true;\n if (loaded === \"yes\" && turns.some(isActive) && !refreshing) void refresh();\n },\n receive(data) {\n const frame = parseChatFrame(data);\n if (!frame) return;\n if (loaded === \"no\") {\n beforeLoad.push(frame);\n return;\n }\n if (loaded !== \"yes\" || frame.threadId !== threadId) return;\n open = applyFrame(open, frame);\n emit();\n },\n closed: () => {\n channelOpen = false;\n },\n });\n const offTags = deps.onSyncTags((tags) => {\n const mine = tags.some((tag) =>\n tagsOverlap(tag, threadId === undefined ? [CHAT_TAG] : [CHAT_TAG, threadId]),\n );\n const computers = tags.some(\n (tag) => tagsOverlap(tag, [HOSTS_TAG]) || tagsOverlap(tag, [HOST_GRANTS_TAG]),\n );\n if (tags.some((tag) => tagsOverlap(tag, [DEVICES_TAG]))) void refreshLink();\n if (loaded === \"failed\" && (mine || computers)) {\n cancelRetry();\n void loadFirst().then(emit);\n } else if (loaded === \"no\") {\n if (mine || computers) staleAfterLoad = true;\n } else {\n if (mine && threadId !== undefined) void refresh();\n else if (mine) void rereadStale(\"lists\");\n if (computers) void rereadStale(\"hosts\");\n }\n });\n const offResume = deps.onResume(() => {\n if (loaded === \"failed\") {\n if (!unfixable) {\n cancelRetry();\n void loadFirst().then(emit);\n }\n } else if (loaded === \"no\") staleAfterLoad = true;\n else void refresh();\n });\n const offNegotiated = deps.onNegotiated((transport) => {\n if (transport === \"poll\") announceActivity();\n });\n const offConfirmations = agentUi.confirmations.subscribe(emit);\n emit();\n announceActivity();\n void initial();\n return () => {\n running = false;\n channelOpen = false;\n generation += 1;\n clearRetry();\n clearTimeout(presenceTimer);\n presenceTimer = undefined;\n clearTimeout(linkTimer);\n linkTimer = undefined;\n detachChannel();\n offTags();\n offResume();\n offNegotiated();\n offConfirmations();\n stopWatching?.();\n stopWatching = undefined;\n watched = undefined;\n };\n },\n };\n\n async function mend() {\n if (loaded === \"failed\") await loadFirst();\n else if (loaded === \"yes\") {\n if (dirty) await refresh();\n for (const kind of [...staleReads]) await rereadStale(kind);\n }\n emit();\n }\n\n function announceActivity() {\n if (!running || pingRefused || deps.transport() !== \"poll\") return;\n if (deps.isHidden?.() === true) return;\n const now = Date.now();\n if (lastPing !== undefined && now - lastPing < ACTIVITY_PING_MS) return;\n lastPing = now;\n calls.call(\"userActive\", {}).catch((error: unknown) => {\n if (\n error instanceof ActionError &&\n (error.code === \"not_found\" || error.code === \"forbidden\")\n ) {\n pingRefused = true;\n }\n });\n }\n\n async function loadFirst() {\n try {\n await load(threadId);\n unfixable = false;\n } catch (error) {\n if (running) {\n loaded = \"failed\";\n unavailable = { reason: unavailableBecause(error) };\n unfixable = !retryable(error);\n if (!unfixable) scheduleRetry();\n }\n return;\n }\n if (staleAfterLoad) {\n staleAfterLoad = false;\n await refresh();\n }\n }\n\n async function initial() {\n void deps.localHost.then((handle) => {\n const authorizeHost = deps.auth?.authorizeHost;\n if (!handle.available || !authorizeHost || !running) return;\n connect = {\n kind: \"here\",\n start: async () => {\n const own = await deps.auth?.device?.();\n const outcome = await handle.api.connect({\n appOrigin: deps.appOrigin,\n authorize: authorizeHost,\n ...(own ? { device: own.keys } : {}),\n });\n if (!outcome.connected) throw new Error(`Connecting failed: ${outcome.reason}`);\n await refreshHosts();\n await refreshLink();\n },\n };\n emit();\n });\n void refreshLink();\n await loadFirst();\n announceActivity();\n emit();\n }\n\n return runtime;\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/react/chat/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentConfirmation, AgentUiClient } from \"@parlor/agent-ui/client\";\nimport type { CapabilityHandle, LocalAgentHost } from \"@parlor/capabilities\";\nimport {\n type AgentOption,\n type AgentUsage,\n CHAT_CHANNEL,\n CHAT_TAG,\n type ChatFrame,\n type AnswerToSign,\n type ChatItem,\n foldThread,\n type HostSummary,\n HOSTS_TAG,\n isPromptTooLong,\n type ItemSignature,\n type LoggedItem,\n parseChatFrame,\n PROMPT_LIMIT_MESSAGE,\n type PromptToSign,\n type ThreadSummary,\n type TurnStatus,\n} from \"@parlor/chat\";\nimport type { ChatUserActionMap } from \"@parlor/chat/server\";\nimport {\n ActionError,\n asId,\n type ItemId,\n type Tag,\n tagsOverlap,\n type ThreadId,\n type TurnId,\n} from \"@parlor/core\";\nimport type { ClientChannel } from \"@parlor/sync\";\n\nimport { generateClientId } from \"../../action-client.js\";\nimport type { PluginClient } from \"../../plugin-client.js\";\nimport type {\n ComputerDisconnector,\n DeviceLinker,\n DeviceSource,\n HostAuthorizer,\n SessionDevice,\n} from \"../../session.js\";\nimport {\n applyFrame,\n mergeSnapshot,\n NO_OPEN_TURNS,\n type OpenTurns,\n pruneOpen,\n} from \"./open-turns.js\";\n\n/** One agent the user can talk to; `key` is `<hostId>/<agentId>`. */\nexport interface AgentChoice {\n readonly key: string;\n readonly name: string;\n readonly hostName: string;\n readonly online: boolean;\n readonly ready: boolean;\n readonly problem: string | undefined;\n /** What a prompt to this agent may choose, such as its model; empty until it has said. */\n readonly options: readonly AgentChoiceOption[];\n /** The account's allowance, as the agent last reported it. */\n readonly usage: AgentUsage | undefined;\n /** The name this agent knows the app by outside the sidebar, when the user let it use the app there. */\n readonly outsideName: string | undefined;\n}\n\nexport interface AgentChoiceOption extends AgentOption {\n /** The value the next prompt runs with: this device's choice, or the agent's own. */\n readonly selected: string;\n}\n\n/** How this client adds a computer, decided by the `localAgentHost` capability. */\nexport type ConnectOption =\n | { readonly kind: \"command\"; readonly command: string }\n | { readonly kind: \"here\"; start(): Promise<void> };\n\n/**\n * `waiting`: a prompt waits for a computer, which `ChatState.wait` names: one that must\n * still approve this device, or one that is offline while the prompt queues.\n * `unavailable`: this backend has no chat, this user may not use it, or the first read\n * failed and is being retried; `ChatState.unavailable` says which.\n */\nexport type ChatStatus =\n | \"loading\"\n | \"idle\"\n | \"sending\"\n | \"waiting\"\n | \"running\"\n | \"unavailable\";\n\n/**\n * Why chat is `unavailable`: `forbidden` when the app's chat `access` refuses this user,\n * so the agent should not show at all; `not_found` when the server has no chat;\n * `unauthenticated` when nobody is signed in; `error` while a failed read is retried.\n */\nexport interface ChatUnavailable {\n readonly reason: \"forbidden\" | \"not_found\" | \"unauthenticated\" | \"error\";\n}\n\nexport interface ChatWait {\n readonly reason: \"offline\" | \"approval\";\n readonly hostId: string;\n readonly hostName: string;\n}\n\n/**\n * Whether this device may send: `linked` (or nothing to link), `checking` until it knows, or\n * `unlinked` with the code it shows once `startLink` made one. A device links once, from a\n * device already linked or from the computer.\n */\nexport type LinkState =\n | { readonly status: \"linked\" | \"checking\" }\n | {\n readonly status: \"unlinked\";\n readonly hostName: string;\n readonly code?: string | undefined;\n /** What a linked phone's camera opens to link this device: `<app>/link#d=…&c=…`. */\n readonly qr?: string | undefined;\n /** What to run on the computer to link this device there instead, while `code` is shown. */\n readonly command?: string | undefined;\n readonly expiresAt?: string | undefined;\n /** The code shown last ran out; `startLink` shows a new one. */\n readonly expired: boolean;\n /** No other device is linked yet to link this one, so only the computer can, with `command`. */\n readonly onlyComputer: boolean;\n readonly busy: boolean;\n readonly error?: string | undefined;\n };\n\n/**\n * Set while an action waits for this device to be set up: on a browser, the first prompt\n * would otherwise open a passkey prompt with no warning. `explain` until the user picks,\n * `passkey` while the browser asks, `cancelled` once they dismissed it.\n */\nexport interface DeviceSetup {\n readonly step: \"explain\" | \"passkey\" | \"cancelled\";\n}\n\nexport interface ChatState {\n readonly status: ChatStatus;\n /** Set exactly while `status` is `waiting`; approval wins when both reasons hold. */\n readonly wait: ChatWait | undefined;\n /** Set exactly while `status` is `unavailable`. */\n readonly unavailable: ChatUnavailable | undefined;\n readonly thread: ThreadSummary | undefined;\n readonly threads: readonly ThreadSummary[];\n /** Older threads exist past `threads`; `loadMoreThreads` reads them. */\n readonly moreThreads: boolean;\n readonly items: readonly ChatItem<AgentConfirmation>[];\n /** The thread has items before the first one shown; `loadOlder` reads them. */\n readonly hasOlder: boolean;\n /** Set while `loadOlder` or `loadMoreThreads` reads. */\n readonly loadingOlder: boolean;\n readonly hosts: readonly HostSummary[];\n readonly agents: readonly AgentChoice[];\n readonly agent: AgentChoice | undefined;\n readonly connect: ConnectOption;\n readonly draft: string;\n /** Why the last send, stop or answer failed; cleared by the next one that succeeds. */\n readonly error: string | undefined;\n readonly setup: DeviceSetup | undefined;\n readonly link: LinkState;\n /**\n * The chosen agent's computer wants this device to confirm it is the user again, so\n * sending asks for Face ID or Touch ID first.\n */\n readonly presenceDue: boolean;\n}\n\nexport interface ChatCommands {\n setDraft(text: string): void;\n /** Signs the draft (or `text`) and sends it to the chosen agent; idempotent per call. */\n send(text?: string): Promise<void>;\n stop(): Promise<void>;\n /** Sends a prompt again as a new turn in its thread, signed anew. */\n resend(promptItemId: string): Promise<void>;\n /** Reads the thread's next earlier page while `hasOlder`. */\n loadOlder(): Promise<void>;\n /** Reads the next older threads while `moreThreads`. */\n loadMoreThreads(): Promise<void>;\n /** A `presence` ask triggers the OS prompt first; a `computer` ask refuses. */\n answer(\n askId: string,\n choice: string,\n values?: Readonly<Record<string, string | number | boolean>>,\n ): Promise<void>;\n choose(agentKey: string): void;\n /** Chooses a value of the chosen agent's option for this device's next prompts to it. */\n setOption(optionId: string, value: string): void;\n /** Disconnects a computer: its agents leave the sidebar and stop using the app outside it. */\n disconnect(hostId: string): Promise<void>;\n /** `undefined` opens the most recent thread, if there is one. */\n openThread(threadId: string | undefined): void;\n /** Starts a blank thread; it exists on the server once the first prompt is sent. */\n newThread(): void;\n /** Shows this device's link code, after Face ID or Touch ID unless `presence` is false. */\n startLink(options?: { readonly presence?: boolean }): Promise<void>;\n}\n\nexport interface DeviceSetupCommands {\n /** Sets this device up, with a passkey or without one, then runs what waited for it. */\n setUpDevice(options: { readonly passkey: boolean }): Promise<void>;\n /** Drops what waited for the setup; the draft stays. */\n dismissSetup(): void;\n}\n\nexport interface ChatRuntime extends ChatCommands, DeviceSetupCommands {\n subscribe(listener: () => void): () => void;\n get(): ChatState;\n start(): () => void;\n /**\n * Called by a UI that explains the device setup, until it unmounts. Without one, the first\n * prompt enrolls the device directly, as before.\n */\n explainSetup(): () => void;\n}\n\nexport interface ChatRuntimeDeps {\n readonly calls: PluginClient<ChatUserActionMap>;\n readonly clientId: string;\n readonly appOrigin: string;\n readonly agentUi: AgentUiClient;\n readonly addChannel: (channel: ClientChannel) => () => void;\n readonly onSyncTags: (listener: (tags: readonly Tag[]) => void) => () => void;\n readonly onResume: (listener: () => void) => () => void;\n /** What the server negotiated for sync; `undefined` until it has. */\n readonly transport: () => \"sse\" | \"poll\" | undefined;\n readonly onNegotiated: (listener: (transport: \"sse\" | \"poll\") => void) => () => void;\n readonly isHidden?: (() => boolean) | undefined;\n readonly auth:\n | Partial<DeviceSource & HostAuthorizer & DeviceLinker & ComputerDisconnector>\n | undefined;\n readonly localHost: Promise<CapabilityHandle<LocalAgentHost>>;\n readonly threadId: string | undefined;\n}\n\nexport const HOST_GRANTS_TAG = \"parlor_auth_hosts\";\nexport const DEVICES_TAG = \"parlor_auth_devices\";\n\nconst LINKED: LinkState = { status: \"linked\" };\nconst CHECKING: LinkState = { status: \"checking\" };\n\nconst READ_RETRY_BASE_MS = 1_000;\nconst READ_RETRY_MAX_MS = 30_000;\nconst ACTIVITY_PING_MS = 60_000;\nconst UNFIXABLE_BY_RETRY: ReadonlySet<string> = new Set([\n \"not_found\",\n \"unauthenticated\",\n \"forbidden\",\n]);\n\nconst retryable = (error: unknown) =>\n !(error instanceof ActionError && UNFIXABLE_BY_RETRY.has(error.code));\n\nconst unavailableBecause = (error: unknown): ChatUnavailable[\"reason\"] =>\n error instanceof ActionError &&\n (error.code === \"forbidden\" ||\n error.code === \"not_found\" ||\n error.code === \"unauthenticated\")\n ? error.code\n : \"error\";\n\ntype StaleRead = \"lists\" | \"hosts\";\n\ninterface PendingSend {\n readonly text: string;\n readonly agent: string;\n readonly openedIn: ThreadId | undefined;\n readonly threadId: ThreadId;\n readonly turnId: TurnId;\n readonly itemId: ItemId;\n}\n\nconst mint = <K extends \"thread\" | \"turn\" | \"item\">(kind: K) =>\n asId(kind, generateClientId());\n\nconst isActive = (turn: TurnStatus) =>\n turn.state === \"queued\" || turn.state === \"running\";\n\nconst exceedsPromptLimit = (error: ActionError): boolean =>\n error.issues?.some(\n (issue) => issue.code === \"too_big\" && issue.path.join(\".\") === \"prompt.text\",\n ) ?? false;\n\nclass NeedsDevice extends Error {\n override readonly name = \"NeedsDevice\";\n}\n\n/** Prompts are signed with presence this long before the computer's deadline, for clock skew. */\nconst PRESENCE_MARGIN_MS = 10 * 60_000;\nconst LONGEST_TIMEOUT_MS = 2 ** 31 - 1;\n\nconst readable = (error: unknown): string => {\n if (error instanceof NeedsDevice) return error.message;\n if (error instanceof Error && error.name === \"NotAllowedError\") {\n return \"Face ID or Touch ID was cancelled.\";\n }\n if (!(error instanceof ActionError)) return \"Could not reach the server.\";\n if (error.issues === undefined) return error.message;\n return exceedsPromptLimit(error)\n ? PROMPT_LIMIT_MESSAGE\n : \"That message could not be sent. Try again.\";\n};\n\nconst bySeq = (a: LoggedItem, b: LoggedItem) => a.seq - b.seq;\n\nexport function createChatRuntime(deps: ChatRuntimeDeps): ChatRuntime {\n const { calls, agentUi } = deps;\n const listeners = new Set<() => void>();\n\n let threadId = deps.threadId === undefined ? undefined : asId(\"thread\", deps.threadId);\n let loaded: \"no\" | \"yes\" | \"failed\" = \"no\";\n let thread: ThreadSummary | undefined;\n let threads: readonly ThreadSummary[] = [];\n let olderThreads: readonly ThreadSummary[] = [];\n let moreThreads = false;\n let hasOlder = false;\n let loadingOlder = false;\n let hosts: readonly HostSummary[] = [];\n let items = new Map<string, LoggedItem>();\n let turns: readonly TurnStatus[] = [];\n let open: OpenTurns = NO_OPEN_TURNS;\n let beforeLoad: ChatFrame[] = [];\n let draft = \"\";\n let failure: string | undefined;\n let chosen: string | undefined;\n let optionChoices = readOptionChoices();\n let sending = false;\n let pendingSend: PendingSend | undefined;\n let startedNew = false;\n let connect: ConnectOption = {\n kind: \"command\",\n command: `npx @parlor/agent-host connect ${deps.appOrigin}`,\n };\n let stopWatching: (() => void) | undefined;\n let watched: ThreadId | undefined;\n let running = false;\n let channelOpen = false;\n let staleAfterLoad = false;\n let dirty = false;\n const staleReads = new Set<StaleRead>();\n let unfixable = false;\n let unavailable: ChatUnavailable | undefined;\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let retryDelay = READ_RETRY_BASE_MS;\n let lastPing: number | undefined;\n let pingRefused = false;\n let generation = 0;\n let device: SessionDevice | undefined;\n let linkInfo: Awaited<ReturnType<DeviceLinker[\"linkState\"]>> | undefined;\n let linking:\n | {\n readonly deviceId: string;\n readonly code: string;\n readonly qr: string;\n readonly expiresAt: string;\n }\n | undefined;\n let linkBusy = false;\n let linkError: string | undefined;\n let linkExpired = false;\n let linkTimer: ReturnType<typeof setTimeout> | undefined;\n let presenceTimer: ReturnType<typeof setTimeout> | undefined;\n let setup: DeviceSetup | undefined;\n let afterSetup: (() => Promise<void>) | undefined;\n let explainers = 0;\n const resends = new Map<ItemId, PendingSend>();\n const answerIds = new Map<string, ItemId>();\n const stopIds = new Map<TurnId, ItemId>();\n\n const refusedLast = (hostId: string, deviceId: string): boolean => {\n const last = [...turns].reverse().find((turn) => turn.agent.hostId === hostId);\n if (last?.failure !== \"device_rejected\") return false;\n return [...items.values()].some(\n (item) =>\n item.turnId === last.turnId &&\n item.kind === \"prompt\" &&\n item.body.signed?.deviceId === deviceId,\n );\n };\n\n /**\n * When the computer behind `agentKey` wants this device's next prompt signed with presence:\n * by its report, or now if it refused this device's last prompt, whatever the clocks say.\n */\n const presenceDueAt = (agentKey: string): number | undefined => {\n const deviceId = device?.id ?? linkInfo?.deviceId;\n if (deviceId === undefined) return undefined;\n const hostId = agentKey.split(\"/\")[0]!;\n const due = hosts.find((host) => host.id === hostId)?.presenceDue?.[deviceId];\n if (due === undefined) return undefined;\n return refusedLast(hostId, deviceId) ? 0 : due - PRESENCE_MARGIN_MS;\n };\n\n /** This device's choices for `agentKey` that its agent still offers. */\n const chosenOptions = (\n agentKey: string,\n options: readonly AgentOption[],\n ): Record<string, string> =>\n Object.fromEntries(\n Object.entries(optionChoices[agentKey] ?? {}).filter(([id, value]) =>\n options.some(\n (option) =>\n option.id === id && option.values.some((candidate) => candidate.id === value),\n ),\n ),\n );\n\n const choices = (): AgentChoice[] =>\n hosts.flatMap((host) =>\n host.agents.map((agent) => {\n const key = `${host.id}/${agent.id}`;\n const offered = agent.options ?? [];\n const picked = chosenOptions(key, offered);\n return {\n key,\n name: agent.name,\n hostName: host.name,\n online: host.online,\n ready: agent.ready,\n problem: agent.problem,\n options: offered.map((option) => ({\n ...option,\n selected: picked[option.id] ?? option.current,\n })),\n usage: agent.usage,\n outsideName: agent.outsideName,\n };\n }),\n );\n\n const waitOn = (reason: ChatWait[\"reason\"], hostId: string): ChatWait => ({\n reason,\n hostId,\n hostName: hosts.find((host) => host.id === hostId)?.name ?? \"your computer\",\n });\n\n const linkOf = (): LinkState => {\n if (!deps.auth?.linkState) return LINKED;\n const reporting = hosts.filter((host) => host.online && host.devices !== undefined);\n if (reporting.length === 0) return LINKED;\n if (!linkInfo) return CHECKING;\n const { deviceId } = linkInfo;\n if (\n linkInfo.pairing ||\n linkInfo.vouched ||\n (deviceId !== undefined &&\n reporting.some((host) => host.devices?.includes(deviceId)))\n ) {\n return LINKED;\n }\n const listing = hosts.filter((host) => host.devices !== undefined);\n return {\n status: \"unlinked\",\n hostName: reporting[0]!.name,\n code: linking?.code,\n qr: linking?.qr,\n command: linking && `npx @parlor/agent-host link ${deps.appOrigin} ${linking.code}`,\n expiresAt: linking?.expiresAt,\n expired: linkExpired,\n onlyComputer: listing.every((host) => host.devices!.every((id) => id === deviceId)),\n busy: linkBusy,\n error: linkError,\n };\n };\n\n const waitOf = (): ChatWait | undefined => {\n const approving = turns.find(awaitsApproval);\n if (approving) return waitOn(\"approval\", approving.agent.hostId);\n const offline = turns.find(\n (turn) =>\n turn.state === \"queued\" &&\n hosts.some((host) => host.id === turn.agent.hostId && !host.online),\n );\n return offline && waitOn(\"offline\", offline.agent.hostId);\n };\n\n const compute = (): ChatState => {\n const agents = choices();\n const wanted =\n chosen ??\n (thread?.agent ? `${thread.agent.hostId}/${thread.agent.agentId}` : undefined);\n const agent =\n agents.find((choice) => choice.key === wanted) ??\n agents.find((choice) => choice.online && choice.ready) ??\n agents[0];\n const wait = loaded === \"yes\" && !sending ? waitOf() : undefined;\n const due = agent && presenceDueAt(agent.key);\n const status: ChatStatus =\n loaded === \"failed\"\n ? \"unavailable\"\n : loaded === \"no\"\n ? \"loading\"\n : sending\n ? \"sending\"\n : wait\n ? \"waiting\"\n : turns.some(isActive) || open.turns.size > 0\n ? \"running\"\n : \"idle\";\n return {\n status,\n wait,\n unavailable: loaded === \"failed\" ? unavailable : undefined,\n thread,\n threads: [\n ...threads,\n ...olderThreads.filter(\n (older) => !threads.some((shown) => shown.id === older.id),\n ),\n ],\n moreThreads,\n hasOlder,\n loadingOlder,\n items: foldThread({\n items: [...items.values()].sort(bySeq),\n open: [...open.turns.values()],\n turns,\n confirmations: agentUi.confirmations.get().filter((c) => c.threadId === threadId),\n deviceId: device?.id,\n }),\n hosts,\n agents,\n agent,\n connect,\n draft,\n error: failure,\n setup,\n link: linkOf(),\n presenceDue: due !== undefined && Date.now() >= due,\n };\n };\n\n /** Re-emits once the chosen computer's presence deadline arrives, so the hint shows unprompted. */\n const watchPresence = () => {\n clearTimeout(presenceTimer);\n presenceTimer = undefined;\n const due = running && state.agent ? presenceDueAt(state.agent.key) : undefined;\n if (due === undefined || state.presenceDue) return;\n presenceTimer = setTimeout(emit, Math.min(due - Date.now(), LONGEST_TIMEOUT_MS));\n };\n\n let state = compute();\n const emit = () => {\n state = compute();\n watchPresence();\n for (const listener of [...listeners]) listener();\n };\n\n const watch = () => {\n if (watched === threadId) return;\n stopWatching?.();\n watched = threadId;\n stopWatching = threadId === undefined ? undefined : agentUi.watch(threadId);\n };\n\n const absorb = (page: {\n readonly items: readonly LoggedItem[];\n readonly turns?: readonly TurnStatus[] | undefined;\n }) => {\n items = new Map(items);\n for (const item of page.items) items.set(item.id, item);\n if (page.turns) {\n const fresh = new Map(page.turns.map((turn) => [turn.turnId, turn]));\n turns = [...turns.filter((turn) => !fresh.has(turn.turnId)), ...page.turns];\n }\n open = pruneOpen(open, items, turns);\n };\n\n const oldestSeq = (): number | undefined =>\n items.size === 0\n ? undefined\n : Math.min(...[...items.values()].map((item) => item.seq));\n\n const takeThreads = (snapshot: {\n readonly threads: readonly ThreadSummary[];\n readonly moreThreads?: boolean | undefined;\n }) => {\n threads = snapshot.threads;\n if (olderThreads.length === 0) moreThreads = snapshot.moreThreads === true;\n };\n\n const load = async (target: ThreadId | undefined) => {\n const epoch = generation;\n const snapshot = await calls.call(\"open\", target ? { threadId: target } : {});\n if (epoch !== generation) return;\n staleReads.clear();\n takeThreads(snapshot);\n hosts = snapshot.hosts;\n const page = startedNew && target === undefined ? undefined : snapshot.page;\n thread = page?.thread;\n threadId = page?.thread?.id ?? target;\n if (page) {\n const oldest = oldestSeq();\n absorb(page);\n const first = page.items[0];\n if (oldest === undefined || (first !== undefined && first.seq <= oldest)) {\n hasOlder = page.hasMore;\n }\n }\n open = mergeSnapshot(open, channelOpen && page ? page.open : []);\n const replay = beforeLoad;\n beforeLoad = [];\n loaded = \"yes\";\n retryDelay = READ_RETRY_BASE_MS;\n for (const frame of replay) {\n if (frame.threadId === threadId) open = applyFrame(open, frame);\n }\n open = pruneOpen(open, items, turns);\n watch();\n };\n\n const refreshLists = async () => {\n const epoch = generation;\n const fresh = await calls.call(\"open\", {});\n if (epoch !== generation || threadId !== undefined) return;\n takeThreads(fresh);\n hosts = fresh.hosts;\n emit();\n };\n\n const refreshHosts = async () => {\n const fresh = await calls.call(\"hosts\", {});\n hosts = fresh;\n emit();\n };\n\n const readLists = async () => {\n if (threadId === undefined && !startedNew && draft.trim() === \"\") {\n await load(undefined);\n emit();\n } else await refreshLists();\n };\n\n const staleReaders: Record<StaleRead, () => Promise<void>> = {\n lists: readLists,\n hosts: refreshHosts,\n };\n\n const cancelRetry = () => {\n if (retryTimer !== undefined) globalThis.clearTimeout(retryTimer);\n retryTimer = undefined;\n };\n\n const clearRetry = () => {\n cancelRetry();\n retryDelay = READ_RETRY_BASE_MS;\n };\n\n const scheduleRetry = () => {\n if (!running || retryTimer !== undefined) return;\n const wait = retryDelay;\n retryDelay = Math.min(retryDelay * 2, READ_RETRY_MAX_MS);\n retryTimer = globalThis.setTimeout(() => {\n retryTimer = undefined;\n void mend();\n }, wait);\n };\n\n const settled = () => {\n if (!dirty && staleReads.size === 0) clearRetry();\n };\n\n const rereadStale = async (kind: StaleRead) => {\n const epoch = generation;\n try {\n await staleReaders[kind]();\n staleReads.delete(kind);\n settled();\n } catch (error) {\n if (epoch !== generation) return;\n staleReads.add(kind);\n if (retryable(error)) scheduleRetry();\n }\n };\n\n let refreshing = false;\n let refreshAgain = false;\n const refresh = async () => {\n if (refreshing) {\n refreshAgain = true;\n return;\n }\n refreshing = true;\n try {\n do {\n refreshAgain = false;\n if (loaded !== \"yes\" || threadId === undefined) break;\n const epoch = generation;\n const target = threadId;\n if (turns.some(isActive)) {\n await load(target);\n } else {\n const lastSeq = Math.max(0, ...[...items.values()].map((item) => item.seq));\n const fresh = await calls.call(\"items\", {\n threadId: target,\n afterSeq: lastSeq,\n });\n if (epoch !== generation) break;\n absorb({ items: fresh });\n const known = new Set(turns.map((turn) => turn.turnId));\n if (fresh.some((item) => !known.has(item.turnId))) await load(target);\n }\n dirty = false;\n settled();\n emit();\n } while (refreshAgain);\n } catch (error) {\n refreshAgain = false;\n dirty = true;\n if (retryable(error)) scheduleRetry();\n } finally {\n refreshing = false;\n }\n };\n\n const reporting = async (command: () => Promise<void>) => {\n try {\n await command();\n } catch (error) {\n failure = readable(error);\n emit();\n throw error;\n }\n if (failure !== undefined) {\n failure = undefined;\n emit();\n }\n };\n\n const awaitsApproval = (turn: TurnStatus): boolean => {\n if (!isActive(turn)) return false;\n let waiting = false;\n for (const item of [...items.values()].sort(bySeq)) {\n if (item.turnId !== turn.turnId) continue;\n if (item.kind === \"event\" && item.body.event === \"device_pending\") waiting = true;\n else if (item.author !== \"user\") waiting = false;\n }\n return waiting;\n };\n\n const deviceOf = async (): Promise<SessionDevice | undefined> => {\n const found = await deps.auth?.device?.();\n device = found ?? device;\n return found;\n };\n\n const refreshLink = async () => {\n if (!deps.auth?.linkState) return;\n try {\n linkInfo = await deps.auth.linkState();\n } catch {\n return;\n }\n if (linking && linking.deviceId !== linkInfo.deviceId) linking = undefined;\n emit();\n };\n\n const whenSetUp = async (action: () => Promise<void>): Promise<void> => {\n if (\n explainers > 0 &&\n device === undefined &&\n (await deps.auth?.deviceSetup?.()) === \"needed\"\n ) {\n afterSetup = action;\n setup = { step: \"explain\" };\n emit();\n return;\n }\n await action();\n };\n\n const signPrompt = async (prompt: PromptToSign): Promise<ItemSignature | undefined> => {\n const own = await deviceOf();\n if (!own) return undefined;\n const due = presenceDueAt(`${prompt.agent.hostId}/${prompt.agent.agentId}`);\n return due !== undefined && Date.now() >= due\n ? own.signPrompt(prompt, { presence: true })\n : own.signPrompt(prompt);\n };\n\n const submit = async (\n attempt: PendingSend,\n agentKey: string,\n settle: () => void,\n ): Promise<void> => {\n const [hostId, agentId] = agentKey.split(\"/\") as [string, string];\n const epoch = generation;\n sending = true;\n emit();\n try {\n await reporting(async () => {\n const agent = { hostId: asId(\"host\", hostId), agentId };\n const offered = hosts\n .find((host) => host.id === hostId)\n ?.agents.find((candidate) => candidate.id === agentId)?.options;\n const options = chosenOptions(agentKey, offered ?? []);\n const signed = deps.auth?.device\n ? await signPrompt({\n threadId: attempt.threadId,\n turnId: attempt.turnId,\n agent,\n text: attempt.text,\n })\n : undefined;\n await calls.call(\"send\", {\n threadId: attempt.threadId,\n turnId: attempt.turnId,\n itemId: attempt.itemId,\n clientId: deps.clientId,\n prompt: {\n text: attempt.text,\n agent,\n ...(signed ? { signed } : {}),\n ...(Object.keys(options).length > 0 ? { options } : {}),\n },\n });\n settle();\n if (epoch !== generation) return;\n startedNew = false;\n threadId = attempt.threadId;\n watch();\n await load(threadId);\n });\n } finally {\n sending = false;\n emit();\n }\n };\n\n const activeTurn = (): TurnStatus | undefined => [...turns].reverse().find(isActive);\n\n const switchTo = (target: ThreadId | undefined, blank: boolean) => {\n generation += 1;\n threadId = target;\n startedNew = blank;\n thread = undefined;\n items = new Map();\n turns = [];\n hasOlder = false;\n open = NO_OPEN_TURNS;\n beforeLoad = [];\n pendingSend = undefined;\n stopIds.clear();\n answerIds.clear();\n dirty = false;\n staleReads.clear();\n clearRetry();\n watch();\n if (blank && loaded === \"yes\") {\n emit();\n return;\n }\n loaded = \"no\";\n emit();\n void loadFirst().then(emit);\n };\n\n const runtime: ChatRuntime = {\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n get: () => state,\n setDraft(text) {\n draft = text;\n emit();\n announceActivity();\n },\n async send(text = draft) {\n announceActivity();\n const prompt = text.trim();\n const target = state.agent;\n if (!prompt || isPromptTooLong(prompt) || !target || sending || loaded !== \"yes\") {\n return;\n }\n const retrying =\n pendingSend?.text === prompt &&\n pendingSend.agent === target.key &&\n pendingSend.openedIn === threadId;\n const attempt =\n retrying && pendingSend\n ? pendingSend\n : (pendingSend = {\n text: prompt,\n agent: target.key,\n openedIn: threadId,\n threadId: threadId ?? mint(\"thread\"),\n turnId: mint(\"turn\"),\n itemId: mint(\"item\"),\n });\n await whenSetUp(() =>\n submit(attempt, target.key, () => {\n pendingSend = undefined;\n if (draft.trim() === prompt) draft = \"\";\n }),\n );\n },\n async loadOlder() {\n const target = threadId;\n const before = oldestSeq();\n if (target === undefined || before === undefined || !hasOlder || loadingOlder)\n return;\n const epoch = generation;\n loadingOlder = true;\n emit();\n try {\n await reporting(async () => {\n const older = await calls.call(\"history\", {\n threadId: target,\n beforeSeq: before,\n });\n if (epoch !== generation) return;\n absorb(older);\n hasOlder = older.hasMore;\n });\n } finally {\n loadingOlder = false;\n emit();\n }\n },\n async loadMoreThreads() {\n const last = olderThreads.at(-1) ?? threads.at(-1);\n if (!last || !moreThreads || loadingOlder) return;\n loadingOlder = true;\n emit();\n try {\n await reporting(async () => {\n const next = await calls.call(\"threadsBefore\", {\n before: { updatedAt: last.updatedAt, id: last.id },\n });\n olderThreads = [...olderThreads, ...next.threads];\n moreThreads = next.hasMore;\n });\n } finally {\n loadingOlder = false;\n emit();\n }\n },\n async resend(promptItemId) {\n const prompt = state.items.find(\n (item) => item.kind === \"prompt\" && item.id === promptItemId,\n );\n if (prompt?.kind !== \"prompt\" || sending || loaded !== \"yes\" || !threadId) return;\n const key = `${prompt.agent.hostId}/${prompt.agent.agentId}`;\n let attempt = resends.get(prompt.id);\n if (!attempt) {\n attempt = {\n text: prompt.text,\n agent: key,\n openedIn: threadId,\n threadId,\n turnId: mint(\"turn\"),\n itemId: mint(\"item\"),\n };\n resends.set(prompt.id, attempt);\n }\n await whenSetUp(() => submit(attempt, key, () => resends.delete(prompt.id)));\n },\n async stop() {\n const turn = activeTurn();\n if (!turn || threadId === undefined) return;\n const itemId = stopIds.get(turn.turnId) ?? mint(\"item\");\n stopIds.set(turn.turnId, itemId);\n const target = threadId;\n await reporting(async () => {\n await calls.call(\"cancel\", { threadId: target, turnId: turn.turnId, itemId });\n await refresh();\n });\n },\n async answer(askId, choice, values) {\n const ask = state.items.find((item) => item.kind === \"ask\" && item.id === askId);\n if (!ask || ask.kind !== \"ask\" || ask.answer.state !== \"open\" || !threadId) return;\n if (ask.approval === \"computer\") {\n throw new Error(\"This question is answered on your computer.\");\n }\n const itemId = answerIds.get(askId) ?? mint(\"item\");\n answerIds.set(askId, itemId);\n const target = threadId;\n const toSign: AnswerToSign = {\n threadId: target,\n askId: ask.id,\n choice,\n ...(values ? { values } : {}),\n };\n await whenSetUp(() =>\n reporting(async () => {\n const found = deps.auth?.device ? await deviceOf() : undefined;\n if ((ask.approval === \"presence\" || ask.approval === \"device\") && !found) {\n throw new NeedsDevice(\n \"This question needs a device that can confirm it is you.\",\n );\n }\n const signed = await found?.signAnswer(toSign, {\n presence: ask.approval === \"presence\",\n });\n await calls.call(\"answer\", {\n threadId: target,\n turnId: ask.turnId,\n itemId,\n answer: {\n askId: ask.id,\n choice,\n ...(values ? { values } : {}),\n ...(signed ? { signed } : {}),\n },\n });\n answerIds.delete(askId);\n await refresh();\n }),\n );\n },\n async setUpDevice({ passkey }) {\n if (setup === undefined || setup.step === \"passkey\") return;\n setup = { step: \"passkey\" };\n emit();\n try {\n device = (await deps.auth?.device?.({ presence: passkey })) ?? device;\n } catch (error) {\n if (error instanceof Error && error.name === \"PresenceSetupCancelled\") {\n setup = { step: \"cancelled\" };\n emit();\n return;\n }\n setup = undefined;\n afterSetup = undefined;\n failure = readable(error);\n emit();\n return;\n }\n const waiting = afterSetup;\n setup = undefined;\n afterSetup = undefined;\n emit();\n await waiting?.();\n },\n dismissSetup() {\n setup = undefined;\n afterSetup = undefined;\n emit();\n },\n async startLink(options) {\n if (!deps.auth?.startLink || linkBusy) return;\n linkBusy = true;\n linkError = undefined;\n emit();\n try {\n const started = await deps.auth.startLink(options);\n linking = {\n deviceId: started.deviceId,\n code: started.code,\n qr: `${deps.appOrigin}/link#${new URLSearchParams({ d: started.deviceId, c: started.commitment })}`,\n expiresAt: started.expiresAt,\n };\n linkExpired = false;\n clearTimeout(linkTimer);\n linkTimer = setTimeout(\n () => {\n linking = undefined;\n linkExpired = true;\n emit();\n },\n Math.min(\n Math.max(0, Date.parse(started.expiresAt) - Date.now()),\n LONGEST_TIMEOUT_MS,\n ),\n );\n linkInfo = {\n vouched: false,\n pairing: false,\n ...linkInfo,\n deviceId: started.deviceId,\n };\n } catch (error) {\n linkError =\n error instanceof Error && error.name === \"PresenceSetupCancelled\"\n ? \"Face ID or Touch ID was cancelled. Try again, or link without it.\"\n : readable(error);\n } finally {\n linkBusy = false;\n emit();\n }\n },\n explainSetup() {\n explainers += 1;\n return () => {\n explainers -= 1;\n if (explainers === 0 && setup !== undefined) runtime.dismissSetup();\n };\n },\n choose(agentKey) {\n chosen = agentKey;\n emit();\n },\n async disconnect(hostId) {\n if (!deps.auth?.disconnectComputer) {\n throw new Error(\"This app cannot disconnect computers.\");\n }\n await deps.auth.disconnectComputer(hostId);\n await refreshHosts();\n emit();\n },\n setOption(optionId, value) {\n const agentKey = state.agent?.key;\n if (agentKey === undefined) return;\n optionChoices = {\n ...optionChoices,\n [agentKey]: { ...optionChoices[agentKey], [optionId]: value },\n };\n writeOptionChoices(optionChoices);\n emit();\n },\n openThread(target) {\n switchTo(target === undefined ? undefined : asId(\"thread\", target), false);\n },\n newThread() {\n switchTo(undefined, true);\n },\n start() {\n running = true;\n const detachChannel = deps.addChannel({\n event: CHAT_CHANNEL,\n opened: () => {\n channelOpen = true;\n if (loaded === \"yes\" && turns.some(isActive) && !refreshing) void refresh();\n },\n receive(data) {\n const frame = parseChatFrame(data);\n if (!frame) return;\n if (loaded === \"no\") {\n beforeLoad.push(frame);\n return;\n }\n if (loaded !== \"yes\" || frame.threadId !== threadId) return;\n open = applyFrame(open, frame);\n emit();\n },\n closed: () => {\n channelOpen = false;\n },\n });\n const offTags = deps.onSyncTags((tags) => {\n const mine = tags.some((tag) =>\n tagsOverlap(tag, threadId === undefined ? [CHAT_TAG] : [CHAT_TAG, threadId]),\n );\n const computers = tags.some(\n (tag) => tagsOverlap(tag, [HOSTS_TAG]) || tagsOverlap(tag, [HOST_GRANTS_TAG]),\n );\n if (tags.some((tag) => tagsOverlap(tag, [DEVICES_TAG]))) void refreshLink();\n if (loaded === \"failed\" && (mine || computers)) {\n cancelRetry();\n void loadFirst().then(emit);\n } else if (loaded === \"no\") {\n if (mine || computers) staleAfterLoad = true;\n } else {\n if (mine && threadId !== undefined) void refresh();\n else if (mine) void rereadStale(\"lists\");\n if (computers) void rereadStale(\"hosts\");\n }\n });\n const offResume = deps.onResume(() => {\n if (loaded === \"failed\") {\n if (!unfixable) {\n cancelRetry();\n void loadFirst().then(emit);\n }\n } else if (loaded === \"no\") staleAfterLoad = true;\n else void refresh();\n });\n const offNegotiated = deps.onNegotiated((transport) => {\n if (transport === \"poll\") announceActivity();\n });\n const offConfirmations = agentUi.confirmations.subscribe(emit);\n const offLink = deps.auth?.subscribeLink?.(() => void refreshLink());\n emit();\n announceActivity();\n void initial();\n return () => {\n running = false;\n channelOpen = false;\n generation += 1;\n clearRetry();\n clearTimeout(presenceTimer);\n presenceTimer = undefined;\n clearTimeout(linkTimer);\n linkTimer = undefined;\n detachChannel();\n offTags();\n offResume();\n offNegotiated();\n offConfirmations();\n offLink?.();\n stopWatching?.();\n stopWatching = undefined;\n watched = undefined;\n };\n },\n };\n\n async function mend() {\n if (loaded === \"failed\") await loadFirst();\n else if (loaded === \"yes\") {\n if (dirty) await refresh();\n for (const kind of [...staleReads]) await rereadStale(kind);\n }\n emit();\n }\n\n function announceActivity() {\n if (!running || pingRefused || deps.transport() !== \"poll\") return;\n if (deps.isHidden?.() === true) return;\n const now = Date.now();\n if (lastPing !== undefined && now - lastPing < ACTIVITY_PING_MS) return;\n lastPing = now;\n calls.call(\"userActive\", {}).catch((error: unknown) => {\n if (\n error instanceof ActionError &&\n (error.code === \"not_found\" || error.code === \"forbidden\")\n ) {\n pingRefused = true;\n }\n });\n }\n\n async function loadFirst() {\n try {\n await load(threadId);\n unfixable = false;\n } catch (error) {\n if (running) {\n loaded = \"failed\";\n unavailable = { reason: unavailableBecause(error) };\n unfixable = !retryable(error);\n if (!unfixable) scheduleRetry();\n }\n return;\n }\n if (staleAfterLoad) {\n staleAfterLoad = false;\n await refresh();\n }\n }\n\n async function initial() {\n void deps.localHost.then((handle) => {\n const authorizeHost = deps.auth?.authorizeHost;\n if (!handle.available || !authorizeHost || !running) return;\n connect = {\n kind: \"here\",\n start: async () => {\n const own = await deps.auth?.device?.();\n const outcome = await handle.api.connect({\n appOrigin: deps.appOrigin,\n authorize: authorizeHost,\n ...(own ? { device: own.keys } : {}),\n });\n if (!outcome.connected) throw new Error(`Connecting failed: ${outcome.reason}`);\n await refreshHosts();\n await refreshLink();\n },\n };\n emit();\n });\n void refreshLink();\n await loadFirst();\n announceActivity();\n emit();\n }\n\n return runtime;\n}\n\nconst OPTION_CHOICES_KEY = \"parlor:agent-options\";\n\ntype OptionChoices = Readonly<Record<string, Readonly<Record<string, string>>>>;\n\nfunction readOptionChoices(): OptionChoices {\n try {\n const stored: unknown = JSON.parse(\n globalThis.localStorage?.getItem(OPTION_CHOICES_KEY) ?? \"{}\",\n );\n return stored && typeof stored === \"object\" ? (stored as OptionChoices) : {};\n } catch {\n return {};\n }\n}\n\nfunction writeOptionChoices(choices: OptionChoices): void {\n try {\n globalThis.localStorage?.setItem(OPTION_CHOICES_KEY, JSON.stringify(choices));\n } catch {}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../../src/react/chat/use-chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5D,0EAA0E;AAC1E,wBAAgB,OAAO,IAAI,SAAS,GAAG,YAAY,CAoBlD"}
1
+ {"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../../src/react/chat/use-chat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5D,0EAA0E;AAC1E,wBAAgB,OAAO,IAAI,SAAS,GAAG,YAAY,CAsBlD"}
@@ -14,6 +14,8 @@ export function useChat() {
14
14
  loadOlder: runtime.loadOlder,
15
15
  loadMoreThreads: runtime.loadMoreThreads,
16
16
  choose: runtime.choose,
17
+ setOption: runtime.setOption,
18
+ disconnect: runtime.disconnect,
17
19
  openThread: runtime.openThread,
18
20
  newThread: runtime.newThread,
19
21
  startLink: runtime.startLink,
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat.js","sourceRoot":"","sources":["../../../src/react/chat/use-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5D,0EAA0E;AAC1E,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,KAAK;QACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,EACF,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { useMemo } from \"react\";\n\nimport { useChatRuntime, useChatState } from \"./context.js\";\nimport type { ChatCommands, ChatState } from \"./runtime.js\";\n\n/** The chat's state and commands, for what the primitives do not draw. */\nexport function useChat(): ChatState & ChatCommands {\n const runtime = useChatRuntime(\"useChat\");\n const state = useChatState(\"useChat\");\n return useMemo(\n () => ({\n ...state,\n setDraft: runtime.setDraft,\n send: runtime.send,\n stop: runtime.stop,\n answer: runtime.answer,\n resend: runtime.resend,\n loadOlder: runtime.loadOlder,\n loadMoreThreads: runtime.loadMoreThreads,\n choose: runtime.choose,\n openThread: runtime.openThread,\n newThread: runtime.newThread,\n startLink: runtime.startLink,\n }),\n [state, runtime],\n );\n}\n"]}
1
+ {"version":3,"file":"use-chat.js","sourceRoot":"","sources":["../../../src/react/chat/use-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5D,0EAA0E;AAC1E,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,KAAK;QACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,EACF,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { useMemo } from \"react\";\n\nimport { useChatRuntime, useChatState } from \"./context.js\";\nimport type { ChatCommands, ChatState } from \"./runtime.js\";\n\n/** The chat's state and commands, for what the primitives do not draw. */\nexport function useChat(): ChatState & ChatCommands {\n const runtime = useChatRuntime(\"useChat\");\n const state = useChatState(\"useChat\");\n return useMemo(\n () => ({\n ...state,\n setDraft: runtime.setDraft,\n send: runtime.send,\n stop: runtime.stop,\n answer: runtime.answer,\n resend: runtime.resend,\n loadOlder: runtime.loadOlder,\n loadMoreThreads: runtime.loadMoreThreads,\n choose: runtime.choose,\n setOption: runtime.setOption,\n disconnect: runtime.disconnect,\n openThread: runtime.openThread,\n newThread: runtime.newThread,\n startLink: runtime.startLink,\n }),\n [state, runtime],\n );\n}\n"]}
@@ -4,7 +4,7 @@ export * as Chat from "./agent-ui/chat.js";
4
4
  export type { ChatAskChoiceProps, ChatAskFormProps, ChatAskProps, } from "./chat/chat-ask.js";
5
5
  export type { ChatRootProps } from "./chat/chat-root.js";
6
6
  export type { ChatThreadProps } from "./chat/chat-thread.js";
7
- export type { AgentChoice, ChatCommands, ChatState, ChatStatus, ChatUnavailable, ChatWait, ConnectOption, DeviceSetup, DeviceSetupCommands, LinkState, } from "./chat/runtime.js";
7
+ export type { AgentChoice, AgentChoiceOption, ChatCommands, ChatState, ChatStatus, ChatUnavailable, ChatWait, ConnectOption, DeviceSetup, DeviceSetupCommands, LinkState, } from "./chat/runtime.js";
8
8
  export { useChat } from "./chat/use-chat.js";
9
9
  export { useDeviceSetup } from "./chat/use-device-setup.js";
10
10
  export { type RemoveDeviceState, useDevices } from "./use-devices.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,QAAQ,EACR,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,KAAK,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EACL,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,UAAU,EACV,eAAe,EACf,QAAQ,EACR,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,KAAK,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EACL,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAoB3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAA0B,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAwB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAwB,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EAEjB,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAwB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export type {\n AgentActivity,\n AgentActivityKind,\n AgentOutcome,\n AgentConfirmation,\n} from \"@parlor/agent-ui/client\";\nexport type { AgentActivityState } from \"./agent-ui/activity-state.js\";\nexport * as Chat from \"./agent-ui/chat.js\";\nexport type {\n ChatAskChoiceProps,\n ChatAskFormProps,\n ChatAskProps,\n} from \"./chat/chat-ask.js\";\nexport type { ChatRootProps } from \"./chat/chat-root.js\";\nexport type { ChatThreadProps } from \"./chat/chat-thread.js\";\nexport type {\n AgentChoice,\n ChatCommands,\n ChatState,\n ChatStatus,\n ChatUnavailable,\n ChatWait,\n ConnectOption,\n DeviceSetup,\n DeviceSetupCommands,\n LinkState,\n} from \"./chat/runtime.js\";\nexport { useChat } from \"./chat/use-chat.js\";\nexport { useDeviceSetup } from \"./chat/use-device-setup.js\";\nexport { type RemoveDeviceState, useDevices } from \"./use-devices.js\";\nexport { type LinkDeviceState, useLinkDevice } from \"./use-link-device.js\";\nexport type { ChatItem } from \"@parlor/chat\";\nexport { useAgentActivity } from \"./agent-ui/use-agent-activity.js\";\nexport { useAgentConfirmations } from \"./agent-ui/use-agent-confirmations.js\";\nexport { type AgentViewHandle, useAgentView } from \"./agent-ui/use-agent-view.js\";\nexport {\n type ActionQueryContext,\n actionQueryOptions,\n ensureActionQueryData,\n} from \"./action-query.js\";\nexport {\n type ActionMutationOptions,\n type ActionQueryOptions,\n type ActionSuspenseQueryOptions,\n useActionMutation,\n useActionQuery,\n useActionSuspenseQuery,\n} from \"./hooks.js\";\nexport {\n FrameworkProvider,\n type FrameworkProviderProps,\n useActionClient,\n useSession,\n} from \"./provider.js\";\nexport { type CapabilityState, useCapability } from \"./use-capability.js\";\nexport { invalidateForEvents, ReadTagRegistry } from \"./sync.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAC;AAqB3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAA0B,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAwB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAwB,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAEL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,iBAAiB,EACjB,cAAc,EACd,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iBAAiB,EAEjB,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAwB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export type {\n AgentActivity,\n AgentActivityKind,\n AgentOutcome,\n AgentConfirmation,\n} from \"@parlor/agent-ui/client\";\nexport type { AgentActivityState } from \"./agent-ui/activity-state.js\";\nexport * as Chat from \"./agent-ui/chat.js\";\nexport type {\n ChatAskChoiceProps,\n ChatAskFormProps,\n ChatAskProps,\n} from \"./chat/chat-ask.js\";\nexport type { ChatRootProps } from \"./chat/chat-root.js\";\nexport type { ChatThreadProps } from \"./chat/chat-thread.js\";\nexport type {\n AgentChoice,\n AgentChoiceOption,\n ChatCommands,\n ChatState,\n ChatStatus,\n ChatUnavailable,\n ChatWait,\n ConnectOption,\n DeviceSetup,\n DeviceSetupCommands,\n LinkState,\n} from \"./chat/runtime.js\";\nexport { useChat } from \"./chat/use-chat.js\";\nexport { useDeviceSetup } from \"./chat/use-device-setup.js\";\nexport { type RemoveDeviceState, useDevices } from \"./use-devices.js\";\nexport { type LinkDeviceState, useLinkDevice } from \"./use-link-device.js\";\nexport type { ChatItem } from \"@parlor/chat\";\nexport { useAgentActivity } from \"./agent-ui/use-agent-activity.js\";\nexport { useAgentConfirmations } from \"./agent-ui/use-agent-confirmations.js\";\nexport { type AgentViewHandle, useAgentView } from \"./agent-ui/use-agent-view.js\";\nexport {\n type ActionQueryContext,\n actionQueryOptions,\n ensureActionQueryData,\n} from \"./action-query.js\";\nexport {\n type ActionMutationOptions,\n type ActionQueryOptions,\n type ActionSuspenseQueryOptions,\n useActionMutation,\n useActionQuery,\n useActionSuspenseQuery,\n} from \"./hooks.js\";\nexport {\n FrameworkProvider,\n type FrameworkProviderProps,\n useActionClient,\n useSession,\n} from \"./provider.js\";\nexport { type CapabilityState, useCapability } from \"./use-capability.js\";\nexport { invalidateForEvents, ReadTagRegistry } from \"./sync.js\";\n"]}
package/dist/session.d.ts CHANGED
@@ -90,6 +90,8 @@ export interface DeviceLinker {
90
90
  /** It approved `connect` on the computer, so its first prompt links it. */
91
91
  readonly pairing: boolean;
92
92
  }>;
93
+ /** Called when another tab changes what `linkState` reads, such as approving `connect`. */
94
+ subscribeLink?(listener: () => void): () => void;
93
95
  /** Enrolls this device, with Face ID or Touch ID unless `presence` is false, and shows its code. */
94
96
  startLink(options?: {
95
97
  readonly presence?: boolean;
@@ -116,6 +118,10 @@ export interface DeviceLinker {
116
118
  /** Removes a device, confirmed with Face ID or Touch ID; throws `LinkOnComputer` without them. */
117
119
  removeDevice(id: string): Promise<void>;
118
120
  }
121
+ /** Ends a computer's connection: its sidebar turns and its coding agents both lose the app. */
122
+ export interface ComputerDisconnector {
123
+ disconnectComputer(hostId: string): Promise<void>;
124
+ }
119
125
  /** What `FrameworkProvider` takes as `auth`; signing, host pairing and linking are optional. */
120
- export type FrameworkAuth = SessionSource & Partial<DeviceSource & HostAuthorizer & DeviceLinker>;
126
+ export type FrameworkAuth = SessionSource & Partial<DeviceSource & HostAuthorizer & DeviceLinker & ComputerDisconnector>;
121
127
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAmFA,6FAA6F;AAC7F,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrB,IAAI,GAAG,gBAAgB,CAAC;CAC3C","sourcesContent":["import type { HostPairing, PairingDevice } from \"@parlor/capabilities\";\nimport type { AnswerToSign, ItemSignature, PromptToSign } from \"@parlor/chat\";\nimport type { DeviceId } from \"@parlor/core\";\n\nexport interface SessionUser {\n readonly id: string;\n readonly name: string;\n readonly email: string;\n}\n\n/** `anonymous`: the server signs nobody in, so everyone uses the app without an account. */\nexport type SessionSnapshot =\n | { readonly status: \"loading\" }\n | { readonly status: \"anonymous\" }\n | { readonly status: \"signed-out\" }\n | { readonly status: \"signed-in\"; readonly user: SessionUser };\n\n/**\n * Who is signed in on this device, as the app's auth client sees it. `current` returns the\n * same object until the session changes.\n */\nexport interface SessionSource {\n current(): SessionSnapshot;\n subscribe(listener: () => void): () => void;\n}\n\n/** This device's signing identity, as the chat needs it. */\nexport interface SessionDevice {\n readonly id: DeviceId;\n /** The public half of its keys, as the account registered them. */\n readonly keys: PairingDevice;\n /** With `presence`, the platform asks for Touch ID, Face ID or a passkey first. */\n signPrompt(\n prompt: PromptToSign,\n options?: { readonly presence?: boolean },\n ): Promise<ItemSignature>;\n /** With `presence`, the platform asks for Touch ID, Face ID or a passkey first. */\n signAnswer(\n answer: AnswerToSign,\n options: { readonly presence: boolean },\n ): Promise<ItemSignature>;\n}\n\nexport interface DeviceSource {\n /**\n * Enrolls this device with the account on first use; undefined where it cannot sign.\n * `presence: false` enrolls it without a presence key. Rejects with the capability's\n * `PresenceSetupCancelled` when the user dismisses the passkey prompt.\n */\n device(options?: { readonly presence?: boolean }): Promise<SessionDevice | undefined>;\n /** `needed` while the first `device()` would ask the user to create a passkey. */\n deviceSetup?(): Promise<\"needed\" | \"ready\">;\n}\n\nexport interface HostAuthorizer {\n /** For pairing the host on this computer: a code for it, approved by this session. */\n authorizeHost(pairing: HostPairing): Promise<string>;\n}\n\n/** A device waiting to be linked, its keys checked against the code it shows. */\nexport interface PendingLink {\n readonly id: string;\n readonly name: string;\n readonly platform: string;\n readonly commitment: string;\n /** The short code the device shows, for `parlor-host link` on the computer. */\n readonly code: string;\n}\n\n/** One of the account's devices, as the devices list shows it. */\nexport interface AccountDevice {\n readonly id: string;\n readonly name: string;\n readonly platform: string;\n /** This device. */\n readonly current: boolean;\n readonly createdAt: string;\n readonly vouched: boolean;\n readonly linking: boolean;\n /** The device whose vouch linked it last. */\n readonly linkedBy?: string | undefined;\n}\n\n/** Thrown by `vouch` on a device with no presence key: the computer itself links it then. */\nexport class LinkOnComputer extends Error {\n override readonly name = \"LinkOnComputer\";\n}\n\n/** Linking devices: a new one shows a code, a linked one checks it and vouches for it. */\nexport interface DeviceLinker {\n /** Never prompts: a device not created yet reads as none. */\n linkState(): Promise<{\n readonly deviceId?: string | undefined;\n readonly vouched: boolean;\n /** It approved `connect` on the computer, so its first prompt links it. */\n readonly pairing: boolean;\n }>;\n /** Enrolls this device, with Face ID or Touch ID unless `presence` is false, and shows its code. */\n startLink(options?: { readonly presence?: boolean }): Promise<{\n readonly deviceId: string;\n readonly code: string;\n /** The whole hash the code is the start of; the QR carries it. */\n readonly commitment: string;\n readonly expiresAt: string;\n }>;\n /**\n * The device showing `code`, or the one whose QR named its id and whole commitment; throws\n * when the keys the app returns do not match.\n */\n resolveLink(\n from: string | { readonly deviceId: string; readonly commitment: string },\n ): Promise<PendingLink>;\n /** Vouches with this device's presence key; throws `LinkOnComputer` when it has none. */\n vouch(link: PendingLink): Promise<void>;\n /** Whether this device has a presence key to vouch with; never prompts. */\n canVouch(): Promise<boolean>;\n listDevices(): Promise<readonly AccountDevice[]>;\n /** Removes a device, confirmed with Face ID or Touch ID; throws `LinkOnComputer` without them. */\n removeDevice(id: string): Promise<void>;\n}\n\n/** What `FrameworkProvider` takes as `auth`; signing, host pairing and linking are optional. */\nexport type FrameworkAuth = SessionSource &\n Partial<DeviceSource & HostAuthorizer & DeviceLinker>;\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAmFA,6FAA6F;AAC7F,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrB,IAAI,GAAG,gBAAgB,CAAC;CAC3C","sourcesContent":["import type { HostPairing, PairingDevice } from \"@parlor/capabilities\";\nimport type { AnswerToSign, ItemSignature, PromptToSign } from \"@parlor/chat\";\nimport type { DeviceId } from \"@parlor/core\";\n\nexport interface SessionUser {\n readonly id: string;\n readonly name: string;\n readonly email: string;\n}\n\n/** `anonymous`: the server signs nobody in, so everyone uses the app without an account. */\nexport type SessionSnapshot =\n | { readonly status: \"loading\" }\n | { readonly status: \"anonymous\" }\n | { readonly status: \"signed-out\" }\n | { readonly status: \"signed-in\"; readonly user: SessionUser };\n\n/**\n * Who is signed in on this device, as the app's auth client sees it. `current` returns the\n * same object until the session changes.\n */\nexport interface SessionSource {\n current(): SessionSnapshot;\n subscribe(listener: () => void): () => void;\n}\n\n/** This device's signing identity, as the chat needs it. */\nexport interface SessionDevice {\n readonly id: DeviceId;\n /** The public half of its keys, as the account registered them. */\n readonly keys: PairingDevice;\n /** With `presence`, the platform asks for Touch ID, Face ID or a passkey first. */\n signPrompt(\n prompt: PromptToSign,\n options?: { readonly presence?: boolean },\n ): Promise<ItemSignature>;\n /** With `presence`, the platform asks for Touch ID, Face ID or a passkey first. */\n signAnswer(\n answer: AnswerToSign,\n options: { readonly presence: boolean },\n ): Promise<ItemSignature>;\n}\n\nexport interface DeviceSource {\n /**\n * Enrolls this device with the account on first use; undefined where it cannot sign.\n * `presence: false` enrolls it without a presence key. Rejects with the capability's\n * `PresenceSetupCancelled` when the user dismisses the passkey prompt.\n */\n device(options?: { readonly presence?: boolean }): Promise<SessionDevice | undefined>;\n /** `needed` while the first `device()` would ask the user to create a passkey. */\n deviceSetup?(): Promise<\"needed\" | \"ready\">;\n}\n\nexport interface HostAuthorizer {\n /** For pairing the host on this computer: a code for it, approved by this session. */\n authorizeHost(pairing: HostPairing): Promise<string>;\n}\n\n/** A device waiting to be linked, its keys checked against the code it shows. */\nexport interface PendingLink {\n readonly id: string;\n readonly name: string;\n readonly platform: string;\n readonly commitment: string;\n /** The short code the device shows, for `parlor-host link` on the computer. */\n readonly code: string;\n}\n\n/** One of the account's devices, as the devices list shows it. */\nexport interface AccountDevice {\n readonly id: string;\n readonly name: string;\n readonly platform: string;\n /** This device. */\n readonly current: boolean;\n readonly createdAt: string;\n readonly vouched: boolean;\n readonly linking: boolean;\n /** The device whose vouch linked it last. */\n readonly linkedBy?: string | undefined;\n}\n\n/** Thrown by `vouch` on a device with no presence key: the computer itself links it then. */\nexport class LinkOnComputer extends Error {\n override readonly name = \"LinkOnComputer\";\n}\n\n/** Linking devices: a new one shows a code, a linked one checks it and vouches for it. */\nexport interface DeviceLinker {\n /** Never prompts: a device not created yet reads as none. */\n linkState(): Promise<{\n readonly deviceId?: string | undefined;\n readonly vouched: boolean;\n /** It approved `connect` on the computer, so its first prompt links it. */\n readonly pairing: boolean;\n }>;\n /** Called when another tab changes what `linkState` reads, such as approving `connect`. */\n subscribeLink?(listener: () => void): () => void;\n /** Enrolls this device, with Face ID or Touch ID unless `presence` is false, and shows its code. */\n startLink(options?: { readonly presence?: boolean }): Promise<{\n readonly deviceId: string;\n readonly code: string;\n /** The whole hash the code is the start of; the QR carries it. */\n readonly commitment: string;\n readonly expiresAt: string;\n }>;\n /**\n * The device showing `code`, or the one whose QR named its id and whole commitment; throws\n * when the keys the app returns do not match.\n */\n resolveLink(\n from: string | { readonly deviceId: string; readonly commitment: string },\n ): Promise<PendingLink>;\n /** Vouches with this device's presence key; throws `LinkOnComputer` when it has none. */\n vouch(link: PendingLink): Promise<void>;\n /** Whether this device has a presence key to vouch with; never prompts. */\n canVouch(): Promise<boolean>;\n listDevices(): Promise<readonly AccountDevice[]>;\n /** Removes a device, confirmed with Face ID or Touch ID; throws `LinkOnComputer` without them. */\n removeDevice(id: string): Promise<void>;\n}\n\n/** Ends a computer's connection: its sidebar turns and its coding agents both lose the app. */\nexport interface ComputerDisconnector {\n disconnectComputer(hostId: string): Promise<void>;\n}\n\n/** What `FrameworkProvider` takes as `auth`; signing, host pairing and linking are optional. */\nexport type FrameworkAuth = SessionSource &\n Partial<DeviceSource & HostAuthorizer & DeviceLinker & ComputerDisconnector>;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parlor/client",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "homepage": "https://cychien.github.io/parlor",
5
5
  "bugs": "https://github.com/cychien/parlor/issues",
6
6
  "license": "MIT",
@@ -33,11 +33,11 @@
33
33
  }
34
34
  },
35
35
  "dependencies": {
36
- "@parlor/agent-ui": "0.2.0",
37
- "@parlor/chat": "0.2.0",
38
- "@parlor/capabilities": "0.2.0",
39
- "@parlor/core": "0.2.0",
40
- "@parlor/sync": "0.2.0"
36
+ "@parlor/agent-ui": "0.3.0",
37
+ "@parlor/core": "0.3.0",
38
+ "@parlor/chat": "0.3.0",
39
+ "@parlor/sync": "0.3.0",
40
+ "@parlor/capabilities": "0.3.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@tanstack/react-query": "^5.104.1",