@parlor/chat 0.4.0 → 0.4.2

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
@@ -1,7 +1,7 @@
1
1
  export { CHAT_EVENTS, type ChatEvent } from "./events.js";
2
2
  export type { Author, AuthorOf, ChatItemBody, ChatItemKind, HostItemDraft, HostItemKind, ItemSignature, LoggedItem, UserItemKind, } from "./items.js";
3
3
  export { type AppliedFrame, applyFrame } from "./open-turns.js";
4
- export { isPromptTooLong, MAX_PROMPT_CHARS, PROMPT_LIMIT_MESSAGE } from "./limits.js";
4
+ export { AGENT_OPTION_LIMITS, clipAgentOptions, isPromptTooLong, MAX_PROMPT_CHARS, PROMPT_LIMIT_MESSAGE, } from "./limits.js";
5
5
  export type { AgentInfo, AgentOption, AgentOptionValue, AgentRef, AgentUsage, AgentUsageWindow, AnswerToSign, ChatOwner, ChatSnapshot, ClaimedDevice, ClaimedTurn, HostSummary, OpenItem, OpenTurn, PromptToSign, ThreadHistory, ThreadList, ThreadPage, ThreadSummary, TurnFailure, TurnOutcome, TurnSignals, TurnState, TurnStatus, } from "./model.js";
6
6
  export { CHAT_CHANNEL, CHAT_PLUGIN, type ChatFrame, HOST_PROTOCOL, type HostFrame, type HostHello, type HostStreamBatch, type HostWelcome, parseChatFrame, PUSHED_TURNS_PROTOCOL, type PushedTurn, type ProtocolRange, type StreamingKind, } from "./protocol.js";
7
7
  export { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from "./tags.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,SAAS,EACd,aAAa,EACb,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,SAAS,EACd,aAAa,EACb,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { CHAT_EVENTS } from "./events.js";
2
2
  export { applyFrame } from "./open-turns.js";
3
- export { isPromptTooLong, MAX_PROMPT_CHARS, PROMPT_LIMIT_MESSAGE } from "./limits.js";
3
+ export { AGENT_OPTION_LIMITS, clipAgentOptions, isPromptTooLong, MAX_PROMPT_CHARS, PROMPT_LIMIT_MESSAGE, } from "./limits.js";
4
4
  export { CHAT_CHANNEL, CHAT_PLUGIN, HOST_PROTOCOL, parseChatFrame, PUSHED_TURNS_PROTOCOL, } from "./protocol.js";
5
5
  export { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from "./tags.js";
6
6
  export { foldThread, } from "./view.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAY1D,OAAO,EAAqB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA2BtF,OAAO,EACL,YAAY,EACZ,WAAW,EAEX,aAAa,EAKb,cAAc,EACd,qBAAqB,GAItB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAKL,UAAU,GAGX,MAAM,WAAW,CAAC","sourcesContent":["export { CHAT_EVENTS, type ChatEvent } from \"./events.js\";\nexport type {\n Author,\n AuthorOf,\n ChatItemBody,\n ChatItemKind,\n HostItemDraft,\n HostItemKind,\n ItemSignature,\n LoggedItem,\n UserItemKind,\n} from \"./items.js\";\nexport { type AppliedFrame, applyFrame } from \"./open-turns.js\";\nexport { isPromptTooLong, MAX_PROMPT_CHARS, PROMPT_LIMIT_MESSAGE } from \"./limits.js\";\nexport type {\n AgentInfo,\n AgentOption,\n AgentOptionValue,\n AgentRef,\n AgentUsage,\n AgentUsageWindow,\n AnswerToSign,\n ChatOwner,\n ChatSnapshot,\n ClaimedDevice,\n ClaimedTurn,\n HostSummary,\n OpenItem,\n OpenTurn,\n PromptToSign,\n ThreadHistory,\n ThreadList,\n ThreadPage,\n ThreadSummary,\n TurnFailure,\n TurnOutcome,\n TurnSignals,\n TurnState,\n TurnStatus,\n} from \"./model.js\";\nexport {\n CHAT_CHANNEL,\n CHAT_PLUGIN,\n type ChatFrame,\n HOST_PROTOCOL,\n type HostFrame,\n type HostHello,\n type HostStreamBatch,\n type HostWelcome,\n parseChatFrame,\n PUSHED_TURNS_PROTOCOL,\n type PushedTurn,\n type ProtocolRange,\n type StreamingKind,\n} from \"./protocol.js\";\nexport { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from \"./tags.js\";\nexport {\n type AskState,\n type ChatItem,\n type FoldedKind,\n type FoldInput,\n foldThread,\n type ItemFolders,\n type ThreadConfirmation,\n} from \"./view.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAY1D,OAAO,EAAqB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AA2BrB,OAAO,EACL,YAAY,EACZ,WAAW,EAEX,aAAa,EAKb,cAAc,EACd,qBAAqB,GAItB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAKL,UAAU,GAGX,MAAM,WAAW,CAAC","sourcesContent":["export { CHAT_EVENTS, type ChatEvent } from \"./events.js\";\nexport type {\n Author,\n AuthorOf,\n ChatItemBody,\n ChatItemKind,\n HostItemDraft,\n HostItemKind,\n ItemSignature,\n LoggedItem,\n UserItemKind,\n} from \"./items.js\";\nexport { type AppliedFrame, applyFrame } from \"./open-turns.js\";\nexport {\n AGENT_OPTION_LIMITS,\n clipAgentOptions,\n isPromptTooLong,\n MAX_PROMPT_CHARS,\n PROMPT_LIMIT_MESSAGE,\n} from \"./limits.js\";\nexport type {\n AgentInfo,\n AgentOption,\n AgentOptionValue,\n AgentRef,\n AgentUsage,\n AgentUsageWindow,\n AnswerToSign,\n ChatOwner,\n ChatSnapshot,\n ClaimedDevice,\n ClaimedTurn,\n HostSummary,\n OpenItem,\n OpenTurn,\n PromptToSign,\n ThreadHistory,\n ThreadList,\n ThreadPage,\n ThreadSummary,\n TurnFailure,\n TurnOutcome,\n TurnSignals,\n TurnState,\n TurnStatus,\n} from \"./model.js\";\nexport {\n CHAT_CHANNEL,\n CHAT_PLUGIN,\n type ChatFrame,\n HOST_PROTOCOL,\n type HostFrame,\n type HostHello,\n type HostStreamBatch,\n type HostWelcome,\n parseChatFrame,\n PUSHED_TURNS_PROTOCOL,\n type PushedTurn,\n type ProtocolRange,\n type StreamingKind,\n} from \"./protocol.js\";\nexport { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from \"./tags.js\";\nexport {\n type AskState,\n type ChatItem,\n type FoldedKind,\n type FoldInput,\n foldThread,\n type ItemFolders,\n type ThreadConfirmation,\n} from \"./view.js\";\n"]}
package/dist/limits.d.ts CHANGED
@@ -1,4 +1,21 @@
1
+ import type { AgentOption } from "./model.js";
1
2
  export declare const MAX_PROMPT_CHARS = 32000;
2
3
  export declare const PROMPT_LIMIT_MESSAGE: string;
3
4
  export declare const isPromptTooLong: (text: string) => boolean;
5
+ /** What a computer may report of one agent's options; longer display text is cut, never refused. */
6
+ export declare const AGENT_OPTION_LIMITS: {
7
+ readonly options: 10;
8
+ readonly values: 50;
9
+ readonly id: 200;
10
+ readonly optionName: 100;
11
+ readonly category: 50;
12
+ readonly valueName: 200;
13
+ readonly description: 500;
14
+ };
15
+ /**
16
+ * An agent's options within `AGENT_OPTION_LIMITS`: names and descriptions cut to length, the
17
+ * first values kept with the current one among them, and an option or value whose id is too
18
+ * long to send back dropped, as choosing it could not work.
19
+ */
20
+ export declare function clipAgentOptions(options: readonly AgentOption[]): AgentOption[];
4
21
  //# sourceMappingURL=limits.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,eAAO,MAAM,oBAAoB,QAAoF,CAAC;AAEtH,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,OACR,CAAC"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,eAAO,MAAM,oBAAoB,QAAoF,CAAC;AAEtH,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,OACR,CAAC;AAExC,oGAAoG;AACpG,eAAO,MAAM,mBAAmB;aAC9B,OAAO,EAAE,EAAE;aACX,MAAM,EAAE,EAAE;aACV,EAAE,EAAE,GAAG;aACP,UAAU,EAAE,GAAG;aACf,QAAQ,EAAE,EAAE;aACZ,SAAS,EAAE,GAAG;aACd,WAAW,EAAE,GAAG;CACR,CAAC;AAKX;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CA+B/E"}
package/dist/limits.js CHANGED
@@ -1,4 +1,49 @@
1
1
  export const MAX_PROMPT_CHARS = 32_000;
2
2
  export const PROMPT_LIMIT_MESSAGE = `Messages can be at most ${MAX_PROMPT_CHARS.toLocaleString("en-US")} characters.`;
3
3
  export const isPromptTooLong = (text) => text.trim().length > MAX_PROMPT_CHARS;
4
+ /** What a computer may report of one agent's options; longer display text is cut, never refused. */
5
+ export const AGENT_OPTION_LIMITS = {
6
+ options: 10,
7
+ values: 50,
8
+ id: 200,
9
+ optionName: 100,
10
+ category: 50,
11
+ valueName: 200,
12
+ description: 500,
13
+ };
14
+ const clip = (text, max) => text.length > max ? `${text.slice(0, max - 1)}…` : text;
15
+ /**
16
+ * An agent's options within `AGENT_OPTION_LIMITS`: names and descriptions cut to length, the
17
+ * first values kept with the current one among them, and an option or value whose id is too
18
+ * long to send back dropped, as choosing it could not work.
19
+ */
20
+ export function clipAgentOptions(options) {
21
+ const limits = AGENT_OPTION_LIMITS;
22
+ return options
23
+ .filter((option) => option.id.length <= limits.id && option.current.length <= limits.id)
24
+ .slice(0, limits.options)
25
+ .map((option) => {
26
+ const fitting = option.values.filter((value) => value.id.length <= limits.id);
27
+ const current = fitting.find((value) => value.id === option.current);
28
+ const first = fitting.slice(0, limits.values);
29
+ const kept = current && !first.includes(current)
30
+ ? [...first.slice(0, limits.values - 1), current]
31
+ : first;
32
+ return {
33
+ id: option.id,
34
+ name: clip(option.name, limits.optionName),
35
+ ...(option.category === undefined
36
+ ? {}
37
+ : { category: clip(option.category, limits.category) }),
38
+ current: option.current,
39
+ values: kept.map((value) => ({
40
+ id: value.id,
41
+ name: clip(value.name, limits.valueName),
42
+ ...(value.description === undefined
43
+ ? {}
44
+ : { description: clip(value.description, limits.description) }),
45
+ })),
46
+ };
47
+ });
48
+ }
4
49
  //# sourceMappingURL=limits.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;AAEtH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE,CACvD,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC","sourcesContent":["export const MAX_PROMPT_CHARS = 32_000;\n\nexport const PROMPT_LIMIT_MESSAGE = `Messages can be at most ${MAX_PROMPT_CHARS.toLocaleString(\"en-US\")} characters.`;\n\nexport const isPromptTooLong = (text: string): boolean =>\n text.trim().length > MAX_PROMPT_CHARS;\n"]}
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentOption, AgentOptionValue } from \"./model.js\";\n\nexport const MAX_PROMPT_CHARS = 32_000;\n\nexport const PROMPT_LIMIT_MESSAGE = `Messages can be at most ${MAX_PROMPT_CHARS.toLocaleString(\"en-US\")} characters.`;\n\nexport const isPromptTooLong = (text: string): boolean =>\n text.trim().length > MAX_PROMPT_CHARS;\n\n/** What a computer may report of one agent's options; longer display text is cut, never refused. */\nexport const AGENT_OPTION_LIMITS = {\n options: 10,\n values: 50,\n id: 200,\n optionName: 100,\n category: 50,\n valueName: 200,\n description: 500,\n} as const;\n\nconst clip = (text: string, max: number) =>\n text.length > max ? `${text.slice(0, max - 1)}…` : text;\n\n/**\n * An agent's options within `AGENT_OPTION_LIMITS`: names and descriptions cut to length, the\n * first values kept with the current one among them, and an option or value whose id is too\n * long to send back dropped, as choosing it could not work.\n */\nexport function clipAgentOptions(options: readonly AgentOption[]): AgentOption[] {\n const limits = AGENT_OPTION_LIMITS;\n return options\n .filter(\n (option) => option.id.length <= limits.id && option.current.length <= limits.id,\n )\n .slice(0, limits.options)\n .map((option) => {\n const fitting = option.values.filter((value) => value.id.length <= limits.id);\n const current = fitting.find((value) => value.id === option.current);\n const first = fitting.slice(0, limits.values);\n const kept =\n current && !first.includes(current)\n ? [...first.slice(0, limits.values - 1), current]\n : first;\n return {\n id: option.id,\n name: clip(option.name, limits.optionName),\n ...(option.category === undefined\n ? {}\n : { category: clip(option.category, limits.category) }),\n current: option.current,\n values: kept.map((value): AgentOptionValue => ({\n id: value.id,\n name: clip(value.name, limits.valueName),\n ...(value.description === undefined\n ? {}\n : { description: clip(value.description, limits.description) }),\n })),\n };\n });\n}\n"]}
@@ -158,6 +158,7 @@ export declare function hostSession(deps: ChatActionDeps): {
158
158
  turnId: TurnId;
159
159
  clientId: string;
160
160
  agentId: string;
161
+ scope: string;
161
162
  }) => Promise<Delegation>;
162
163
  claim: (host: ChatHost, db: ChatDb) => Promise<ClaimedTurn | undefined>;
163
164
  release: (host: ChatHost, thread: ThreadId, turn: TurnId) => Promise<boolean>;
@@ -180,7 +181,7 @@ export declare function hostChatActions(deps: ChatActionDeps, session?: HostSess
180
181
  version: z.ZodOptional<z.ZodString>;
181
182
  ready: z.ZodBoolean;
182
183
  problem: z.ZodOptional<z.ZodString>;
183
- options: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
184
+ options: z.ZodOptional<z.ZodReadonly<z.ZodPipe<z.ZodArray<z.ZodObject<{
184
185
  id: z.ZodString;
185
186
  name: z.ZodString;
186
187
  category: z.ZodOptional<z.ZodString>;
@@ -190,7 +191,17 @@ export declare function hostChatActions(deps: ChatActionDeps, session?: HostSess
190
191
  name: z.ZodString;
191
192
  description: z.ZodOptional<z.ZodString>;
192
193
  }, z.core.$strip>>>;
193
- }, z.core.$strip>>>>;
194
+ }, z.core.$strip>>, z.ZodTransform<import("../model.js").AgentOption[], {
195
+ id: string;
196
+ name: string;
197
+ category?: string | undefined;
198
+ current: string;
199
+ values: readonly {
200
+ id: string;
201
+ name: string;
202
+ description?: string | undefined;
203
+ }[];
204
+ }[]>>>>;
194
205
  usage: z.ZodOptional<z.ZodObject<{
195
206
  windows: z.ZodReadonly<z.ZodArray<z.ZodObject<{
196
207
  id: z.ZodString;
@@ -215,7 +226,7 @@ export declare function hostChatActions(deps: ChatActionDeps, session?: HostSess
215
226
  version: z.ZodOptional<z.ZodString>;
216
227
  ready: z.ZodBoolean;
217
228
  problem: z.ZodOptional<z.ZodString>;
218
- options: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
229
+ options: z.ZodOptional<z.ZodReadonly<z.ZodPipe<z.ZodArray<z.ZodObject<{
219
230
  id: z.ZodString;
220
231
  name: z.ZodString;
221
232
  category: z.ZodOptional<z.ZodString>;
@@ -225,7 +236,17 @@ export declare function hostChatActions(deps: ChatActionDeps, session?: HostSess
225
236
  name: z.ZodString;
226
237
  description: z.ZodOptional<z.ZodString>;
227
238
  }, z.core.$strip>>>;
228
- }, z.core.$strip>>>>;
239
+ }, z.core.$strip>>, z.ZodTransform<import("../model.js").AgentOption[], {
240
+ id: string;
241
+ name: string;
242
+ category?: string | undefined;
243
+ current: string;
244
+ values: readonly {
245
+ id: string;
246
+ name: string;
247
+ description?: string | undefined;
248
+ }[];
249
+ }[]>>>>;
229
250
  usage: z.ZodOptional<z.ZodObject<{
230
251
  windows: z.ZodReadonly<z.ZodArray<z.ZodObject<{
231
252
  id: z.ZodString;
@@ -490,7 +511,7 @@ export declare function chatActions(deps: ChatActionDeps, session?: HostSession)
490
511
  version: z.ZodOptional<z.ZodString>;
491
512
  ready: z.ZodBoolean;
492
513
  problem: z.ZodOptional<z.ZodString>;
493
- options: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
514
+ options: z.ZodOptional<z.ZodReadonly<z.ZodPipe<z.ZodArray<z.ZodObject<{
494
515
  id: z.ZodString;
495
516
  name: z.ZodString;
496
517
  category: z.ZodOptional<z.ZodString>;
@@ -500,7 +521,17 @@ export declare function chatActions(deps: ChatActionDeps, session?: HostSession)
500
521
  name: z.ZodString;
501
522
  description: z.ZodOptional<z.ZodString>;
502
523
  }, z.core.$strip>>>;
503
- }, z.core.$strip>>>>;
524
+ }, z.core.$strip>>, z.ZodTransform<import("../model.js").AgentOption[], {
525
+ id: string;
526
+ name: string;
527
+ category?: string | undefined;
528
+ current: string;
529
+ values: readonly {
530
+ id: string;
531
+ name: string;
532
+ description?: string | undefined;
533
+ }[];
534
+ }[]>>>>;
504
535
  usage: z.ZodOptional<z.ZodObject<{
505
536
  windows: z.ZodReadonly<z.ZodArray<z.ZodObject<{
506
537
  id: z.ZodString;
@@ -525,7 +556,7 @@ export declare function chatActions(deps: ChatActionDeps, session?: HostSession)
525
556
  version: z.ZodOptional<z.ZodString>;
526
557
  ready: z.ZodBoolean;
527
558
  problem: z.ZodOptional<z.ZodString>;
528
- options: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodObject<{
559
+ options: z.ZodOptional<z.ZodReadonly<z.ZodPipe<z.ZodArray<z.ZodObject<{
529
560
  id: z.ZodString;
530
561
  name: z.ZodString;
531
562
  category: z.ZodOptional<z.ZodString>;
@@ -535,7 +566,17 @@ export declare function chatActions(deps: ChatActionDeps, session?: HostSession)
535
566
  name: z.ZodString;
536
567
  description: z.ZodOptional<z.ZodString>;
537
568
  }, z.core.$strip>>>;
538
- }, z.core.$strip>>>>;
569
+ }, z.core.$strip>>, z.ZodTransform<import("../model.js").AgentOption[], {
570
+ id: string;
571
+ name: string;
572
+ category?: string | undefined;
573
+ current: string;
574
+ values: readonly {
575
+ id: string;
576
+ name: string;
577
+ description?: string | undefined;
578
+ }[];
579
+ }[]>>>>;
539
580
  usage: z.ZodOptional<z.ZodObject<{
540
581
  windows: z.ZodReadonly<z.ZodArray<z.ZodObject<{
541
582
  id: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"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"}
@@ -245,18 +245,20 @@ export function hostSession(deps) {
245
245
  clientId: turn.clientId,
246
246
  agent: await agentNameOf(host, db, turn.agentId),
247
247
  ttlMs: deps.leaseMs,
248
+ scope: turn.scope,
248
249
  });
249
250
  };
250
251
  /** The next turn waiting for `host`, claimed for it with its token and context; undefined when none waits. */
251
252
  const claim = async (host, db) => {
252
253
  await requireWelcome(host, db);
253
254
  await deps.reconcile(host);
254
- const claimed = await deps.transact(host, async (tx) => {
255
+ const stored = await deps.transact(host, async (tx) => {
255
256
  const taken = await deps.store.claimTurn(tx, host, host.host, deps.leaseMs);
256
257
  return { result: taken, threadId: taken?.id };
257
258
  });
258
- if (!claimed)
259
+ if (!stored)
259
260
  return undefined;
261
+ const { owner = host, ...claimed } = stored;
260
262
  try {
261
263
  const deviceId = claimed.prompt.body.signed?.deviceId;
262
264
  const [token, device, account, page] = await Promise.all([
@@ -265,10 +267,11 @@ export function hostSession(deps) {
265
267
  turnId: claimed.turnId,
266
268
  clientId: claimed.clientId,
267
269
  agentId: claimed.agent.agentId,
270
+ scope: owner.scope,
268
271
  }),
269
272
  deviceId ? deps.auth.device?.(host.userId, deviceId) : undefined,
270
273
  deps.auth.account?.(host.userId),
271
- deps.store.readPage(db, host, claimed.id, CONTEXT_HISTORY_ITEMS),
274
+ deps.store.readPage(db, owner, claimed.id, CONTEXT_HISTORY_ITEMS),
272
275
  ]);
273
276
  const context = turnContext({
274
277
  appName: deps.appName,
@@ -436,7 +439,11 @@ export function hostChatActions(deps, session = hostSession(deps)) {
436
439
  threadId: input.items.length > 0 ? result.threadId : undefined,
437
440
  };
438
441
  });
439
- const token = await mint(host, dbOf(ctx), { ...appended, turnId: input.turnId });
442
+ const token = await mint(host, dbOf(ctx), {
443
+ ...appended,
444
+ turnId: input.turnId,
445
+ scope: (appended.owner ?? host).scope,
446
+ });
440
447
  return { id: appended.threadId, leaseUntil: appended.leaseUntil, token };
441
448
  },
442
449
  }),
@@ -457,7 +464,7 @@ export function hostChatActions(deps, session = hostSession(deps)) {
457
464
  const result = await deps.store.finishTurn(tx, host, host.host, input.turnId, input.outcome);
458
465
  return { result, threadId: result.threadId };
459
466
  });
460
- deps.relay.settle(host, finished.threadId, input.turnId);
467
+ deps.relay.settle(finished.owner ?? host, finished.threadId, input.turnId);
461
468
  return { id: finished.threadId };
462
469
  },
463
470
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ActionContext,\n ActionError,\n type HostId,\n type ThreadId,\n type TurnId,\n} from \"@parlor/core\";\nimport { type ActionsOf, createRegistry } from \"@parlor/core/registry\";\nimport { type AuthProvider, type Delegation, HOST_GRANTS_TAG } from \"@parlor/server\";\nimport { z } from \"zod\";\n\nimport { idSchema } from \"../id-schemas.js\";\nimport { chatItemBodies, hostItemDraft, type LoggedItem } from \"../items.js\";\nimport type {\n AgentInfo,\n ChatOwner,\n ChatSnapshot,\n ThreadHistory,\n ThreadList,\n ClaimedTurn,\n HostSummary,\n TurnSignals,\n} from \"../model.js\";\nimport { HOST_PROTOCOL, type HostWelcome, PUSHED_TURNS_PROTOCOL } from \"../protocol.js\";\nimport {\n CHAT_ACTIVITY_TAG,\n CHAT_AGENTS_CHECK_TAG,\n CHAT_TAG,\n HOSTS_TAG,\n} from \"../tags.js\";\nimport { turnContext } from \"./context.js\";\nimport type { LiveRelay } from \"./live.js\";\nimport { type ChatHost, chatAction } from \"./party.js\";\nimport type { TurnPush } from \"./push.js\";\nimport { agentInfoSchema, TURN_FAILURES } from \"./rows.js\";\n\nconst presenceDueSchema = z\n .record(z.string().min(1).max(64), z.number().int().nonnegative())\n .refine((due) => Object.keys(due).length <= 256, \"At most 256 devices.\");\nimport {\n type ChatDb,\n type ChatStore,\n type StoredHost,\n THREAD_LIST_LIMIT,\n} from \"./store.js\";\n\nexport { CHAT_ACTIVITY_TAG, CHAT_TAG, HOSTS_TAG, HOST_GRANTS_TAG };\n\nexport interface Written<T> {\n readonly result: T;\n readonly threadId: ThreadId | undefined;\n}\n\nexport interface ChatActionDeps {\n readonly enforcing: boolean;\n /**\n * Runs `work` in one transaction with the thread's sync event. Actions that call the auth\n * provider do so outside it, because a provider may read through another connection\n * (PGlite has one, and the transaction holds it).\n */\n /** Runs `work` in one transaction and wakes only `owner`'s tabs and computers. */\n readonly transact: <T>(\n owner: ChatOwner,\n work: (tx: ChatDb) => Promise<Written<T>>,\n ) => Promise<T>;\n /** Commits the lapsed leases and liveness of `owner`, with the sync events they owe. */\n readonly reconcile: (owner: ChatOwner) => Promise<void>;\n /** Drops the owner's computer rows whose grant is gone; best effort, never fails a read. */\n readonly pruneHosts: (owner: ChatOwner, hostIds: readonly HostId[]) => Promise<void>;\n readonly auth: AuthProvider;\n readonly store: ChatStore;\n readonly relay: LiveRelay;\n readonly leaseMs: number;\n readonly heartbeatMs: number;\n readonly maxQueued: number;\n readonly instructions: string | undefined;\n readonly appName: string;\n readonly appOrigin: () => string;\n /** Hands a queued turn straight to its computer; without it computers only claim. */\n readonly pushed?: TurnPush | undefined;\n}\n\nconst threadId = idSchema(\"thread\");\nconst turnId = idSchema(\"turn\");\nconst itemId = idSchema(\"item\");\nconst afterSeq = z.number().int().min(0);\n\nconst MIN_HOST_PROTOCOL = 2;\nconst CONTEXT_HISTORY_ITEMS = 200;\n/** An agent outside a turn asks again well inside the revocation horizon. */\nconst AGENT_TOKEN_TTL_MS = 10 * 60_000;\nconst TERMINAL: ReadonlySet<string> = new Set([\"done\", \"failed\", \"cancelled\"]);\n\nconst dbOf = (ctx: ActionContext) => ctx.db as ChatDb;\n\nasync function activeHosts(\n deps: ChatActionDeps,\n db: ChatDb,\n owner: ChatOwner,\n): Promise<StoredHost[]> {\n const hosts = await deps.store.listHosts(db, owner);\n const { hostActive } = deps.auth;\n if (!hostActive) return hosts;\n const holding = await Promise.all(\n hosts.map((host) => hostActive.call(deps.auth, host.grantId)),\n );\n const gone = hosts.filter((_host, at) => !holding[at]);\n if (gone.length > 0) {\n await deps.pruneHosts(\n owner,\n gone.map((host) => host.id),\n );\n }\n return hosts.filter((_host, at) => holding[at]);\n}\n\nconst summaryOf = ({\n grantId: _grantId,\n protocol: _protocol,\n ...summary\n}: StoredHost): HostSummary => summary;\n\nexport function userChatActions(deps: ChatActionDeps) {\n const { enforcing } = deps;\n return {\n open: chatAction(\"user\", enforcing, {\n description:\n \"The sidebar's first paint in one round trip: threads, computers, and a thread's last page with what streams now.\",\n input: z.object({\n threadId: threadId.optional(),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: (input) => [\n [CHAT_TAG, ...(input.threadId ? [input.threadId] : [])],\n [HOSTS_TAG],\n [HOST_GRANTS_TAG],\n ],\n run: async (input, user, ctx): Promise<ChatSnapshot> => {\n const db = dbOf(ctx);\n const [threads, hosts, page] = await Promise.all([\n deps.store.listThreads(db, user),\n activeHosts(deps, db, user),\n deps.store.readPage(db, user, input.threadId, input.limit),\n ]);\n const thread = page.thread;\n const open = thread ? deps.relay.open(user, thread.id) : [];\n const streaming = open.filter((turn) => {\n const state = page.turns.find((status) => status.turnId === turn.turnId)?.state;\n const ended = state !== undefined && TERMINAL.has(state);\n if (ended) deps.relay.settle(user, turn.threadId, turn.turnId);\n return !ended;\n });\n return {\n threads,\n ...(threads.length >= THREAD_LIST_LIMIT ? { moreThreads: true } : {}),\n hosts: hosts.map(summaryOf),\n page: { ...page, open: streaming },\n };\n },\n }),\n items: chatAction(\"user\", enforcing, {\n description: \"A thread's items after a sequence number.\",\n input: z.object({ threadId, afterSeq }),\n reads: (input) => [[CHAT_TAG, input.threadId]],\n run: (input, user, ctx): Promise<LoggedItem[]> =>\n deps.store.readItemsAfter(dbOf(ctx), user, input.threadId, input.afterSeq),\n }),\n history: chatAction(\"user\", enforcing, {\n description:\n \"A thread's items before a sequence number, oldest first, with their turns; hasMore while older ones remain.\",\n input: z.object({\n threadId,\n beforeSeq: z.number().int().min(1),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: (input) => [[CHAT_TAG, input.threadId]],\n run: async (input, user, ctx): Promise<ThreadHistory> => {\n const read = deps.store.readItemsBefore?.bind(deps.store);\n if (!read)\n throw new ActionError(\"not_found\", \"This chat store keeps no history.\");\n return read(dbOf(ctx), user, input.threadId, input.beforeSeq, input.limit);\n },\n }),\n threadsBefore: chatAction(\"user\", enforcing, {\n description:\n \"The user's threads updated before a thread, newest first, for the list past what open returned.\",\n input: z.object({\n before: z.object({ updatedAt: z.number().int().min(0), id: threadId }),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: [CHAT_TAG],\n run: async (input, user, ctx): Promise<ThreadList> => {\n const list = deps.store.listThreadsBefore?.bind(deps.store);\n if (!list)\n throw new ActionError(\"not_found\", \"This chat store keeps no history.\");\n return list(dbOf(ctx), user, input.before, input.limit);\n },\n }),\n hosts: chatAction(\"user\", enforcing, {\n description: \"The user's computers and the agents on them.\",\n input: z.object({}),\n reads: [HOSTS_TAG, HOST_GRANTS_TAG],\n run: async (_input, user, ctx): Promise<HostSummary[]> =>\n (await activeHosts(deps, dbOf(ctx), user)).map(summaryOf),\n }),\n send: chatAction(\"user\", enforcing, {\n description: \"Send a prompt to an agent on one of the user's computers.\",\n input: z.object({\n threadId,\n turnId,\n itemId,\n clientId: z.string().min(1).max(128),\n prompt: chatItemBodies.prompt.body,\n }),\n run: async (\n input,\n user,\n ctx,\n ): Promise<{ readonly id: string; readonly turnId: string }> => {\n const hosts = await activeHosts(deps, dbOf(ctx), user);\n const host = hosts.find(\n (candidate) => candidate.id === input.prompt.agent.hostId,\n );\n if (!host) throw new ActionError(\"not_found\", \"Computer not found\");\n const sent = await deps.transact(user, async (tx) => {\n await deps.store.appendUserItems(tx, user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"prompt\", body: input.prompt }],\n turn: {\n turnId: input.turnId,\n agent: input.prompt.agent,\n clientId: input.clientId,\n deviceId: user.deviceId,\n maxQueued: deps.maxQueued,\n },\n });\n return {\n result: { id: input.threadId, turnId: input.turnId },\n threadId: input.threadId,\n };\n });\n if (host.protocol >= PUSHED_TURNS_PROTOCOL) deps.pushed?.offer(user, host.id);\n return sent;\n },\n }),\n answer: chatAction(\"user\", enforcing, {\n description: \"Answer the agent's permission prompt or question.\",\n input: z.object({ threadId, turnId, itemId, answer: chatItemBodies.answer.body }),\n run: async (input, user): Promise<{ readonly id: string }> => {\n const { signed } = input.answer;\n if (signed && deps.auth.device) {\n const device = await deps.auth.device(user.userId, signed.deviceId);\n if (!device) {\n throw new ActionError(\"forbidden\", \"This device cannot answer.\");\n }\n }\n return deps.transact(user, async (tx) => {\n await deps.store.appendUserItems(tx, user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"answer\", body: input.answer }],\n });\n return { result: { id: input.threadId }, threadId: input.threadId };\n });\n },\n }),\n cancel: chatAction(\"user\", enforcing, {\n description: \"Stop the running turn; what the agent already said is kept.\",\n input: z.object({ threadId, turnId, itemId }),\n writes: [CHAT_TAG],\n run: async (input, user, ctx): Promise<{ readonly id: string }> => {\n await deps.store.appendUserItems(dbOf(ctx), user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"cancel\", body: {} }],\n });\n return { id: input.threadId };\n },\n }),\n userActive: chatAction(\"user\", enforcing, {\n description:\n \"Tell the user's computers a tab is in use, so a polling computer speeds up; carries no content and writes no table.\",\n input: z.object({}),\n writes: [CHAT_ACTIVITY_TAG],\n run: (): { readonly ok: true } => ({ ok: true }),\n }),\n checkAgents: chatAction(\"user\", enforcing, {\n description:\n \"Ask the user's computers to look again for the coding agents installed on them; each reports what it found, stamped `agentsCheckedAt`. Answers when it asked, by the same clock.\",\n input: z.object({}),\n writes: [CHAT_AGENTS_CHECK_TAG],\n run: (): { readonly askedAt: number } => ({ askedAt: Date.now() }),\n }),\n };\n}\n\n/**\n * What the server keeps about the computers it serves: which said hello, their agents'\n * names, and how a turn is claimed for one, by `hostClaim` or pushed to it.\n */\nexport function hostSession(deps: ChatActionDeps) {\n const welcomed = new Set<HostId>();\n const welcome = async (host: ChatHost, db: ChatDb) => {\n const hosts = await deps.store.listHosts(db, host);\n const known = hosts.find((candidate) => candidate.id === host.host.hostId);\n if (!known) throw new ActionError(\"forbidden\", \"Say hello before anything else.\");\n if (known.protocol < MIN_HOST_PROTOCOL) {\n await deps.pruneHosts(host, [known.id]);\n throw new ActionError(\"forbidden\", \"Say hello before anything else.\");\n }\n welcomed.add(known.id);\n return known;\n };\n const requireWelcome = async (host: ChatHost, db: ChatDb) => {\n if (!welcomed.has(host.host.hostId)) await welcome(host, db);\n };\n const agentNames = new Map<HostId, ReadonlyMap<string, string>>();\n const learnAgents = (hostId: HostId, agents: readonly AgentInfo[]) => {\n agentNames.set(hostId, new Map(agents.map((agent) => [agent.id, agent.name])));\n };\n const agentNameOf = async (host: ChatHost, db: ChatDb, agentId: string) => {\n if (!agentNames.has(host.host.hostId)) {\n const known = (await deps.store.listHosts(db, host)).find(\n (candidate) => candidate.id === host.host.hostId,\n );\n if (known) learnAgents(known.id, known.agents);\n }\n return agentNames.get(host.host.hostId)?.get(agentId) ?? agentId;\n };\n const mint = async (\n host: ChatHost,\n db: ChatDb,\n turn: { threadId: ThreadId; turnId: TurnId; clientId: string; agentId: string },\n ) => {\n if (!deps.auth.delegate) {\n throw new ActionError(\"internal\", \"The auth provider cannot mint turn tokens.\");\n }\n return deps.auth.delegate(host.host, {\n threadId: turn.threadId,\n turnId: turn.turnId,\n clientId: turn.clientId,\n agent: await agentNameOf(host, db, turn.agentId),\n ttlMs: deps.leaseMs,\n });\n };\n /** The next turn waiting for `host`, claimed for it with its token and context; undefined when none waits. */\n const claim = async (host: ChatHost, db: ChatDb): Promise<ClaimedTurn | undefined> => {\n await requireWelcome(host, db);\n await deps.reconcile(host);\n const claimed = await deps.transact(host, async (tx) => {\n const taken = await deps.store.claimTurn(tx, host, host.host, deps.leaseMs);\n return { result: taken, threadId: taken?.id };\n });\n if (!claimed) return undefined;\n try {\n const deviceId = claimed.prompt.body.signed?.deviceId;\n const [token, device, account, page] = await Promise.all([\n mint(host, db, {\n threadId: claimed.id,\n turnId: claimed.turnId,\n clientId: claimed.clientId,\n agentId: claimed.agent.agentId,\n }),\n deviceId ? deps.auth.device?.(host.userId, deviceId) : undefined,\n deps.auth.account?.(host.userId),\n deps.store.readPage(db, host, claimed.id, CONTEXT_HISTORY_ITEMS),\n ]);\n const context = turnContext({\n appName: deps.appName,\n appOrigin: deps.appOrigin(),\n account,\n device,\n instructions: deps.instructions,\n history: page.items.filter((item) => item.seq < claimed.prompt.seq),\n });\n return { ...claimed, device, context, token };\n } catch (error) {\n await release(host, claimed.id, claimed.turnId).catch(() => false);\n throw error;\n }\n };\n /** Puts a claimed turn back in the queue, waking the computer to claim it again. */\n const release = (host: ChatHost, thread: ThreadId, turn: TurnId) =>\n deps.transact(host, async (tx) => {\n const released = await deps.store.releaseClaim(tx, host, host.host, turn);\n return { result: released, threadId: thread };\n });\n return {\n welcome,\n requireWelcome,\n learnAgents,\n agentNameOf,\n mint,\n claim,\n release,\n welcomed,\n };\n}\n\nexport type HostSession = ReturnType<typeof hostSession>;\n\n/** What the user's computers call; `hostHello` first on every link. */\nexport function hostChatActions(\n deps: ChatActionDeps,\n session: HostSession = hostSession(deps),\n) {\n const { enforcing } = deps;\n const { welcome, requireWelcome, learnAgents, mint, welcomed } = session;\n return {\n hostHello: chatAction(\"host\", enforcing, {\n description:\n \"A link's first call: agree on the host protocol and report this computer online with its agents.\",\n input: z.object({\n protocols: z.object({\n min: z.number().int().min(1),\n max: z.number().int().min(1),\n }),\n hostVersion: z.string().min(1).max(32),\n name: z.string().min(1).max(80),\n platform: z.string().min(1).max(32),\n agents: z.array(agentInfoSchema).max(32),\n devices: z.array(z.string().min(1).max(64)).max(256).optional(),\n presenceDue: presenceDueSchema.optional(),\n }),\n writes: [HOSTS_TAG],\n run: async (input, host, ctx): Promise<HostWelcome & { readonly id: string }> => {\n const id = host.host.hostId;\n const protocols = { min: MIN_HOST_PROTOCOL, max: HOST_PROTOCOL };\n const refuse = async (reason: \"host_too_old\" | \"app_too_old\") => {\n welcomed.delete(id);\n await deps.store.pruneHosts(dbOf(ctx), host, [id]);\n return { id, accepted: false as const, reason, protocols };\n };\n if (input.protocols.max < protocols.min) return refuse(\"host_too_old\");\n const protocol = Math.min(input.protocols.max, protocols.max);\n if (protocol < input.protocols.min) return refuse(\"app_too_old\");\n await deps.store.reportHost(dbOf(ctx), host, host.host, {\n protocol,\n name: input.name,\n platform: input.platform,\n agents: input.agents,\n devices: input.devices,\n presenceDue: input.presenceDue,\n online: true,\n ttlMs: 2 * deps.heartbeatMs,\n });\n learnAgents(id, input.agents);\n welcomed.add(id);\n return {\n id,\n accepted: true,\n protocol,\n leaseMs: deps.leaseMs,\n heartbeatMs: deps.heartbeatMs,\n userActivity: true,\n };\n },\n }),\n hostReport: chatAction(\"host\", enforcing, {\n description:\n \"This computer went offline, changed its agents, or looked for them again (`agentsChecked`).\",\n input: z.object({\n online: z.boolean(),\n agents: z.array(agentInfoSchema).max(32),\n devices: z.array(z.string().min(1).max(64)).max(256).optional(),\n presenceDue: presenceDueSchema.optional(),\n agentsChecked: z.literal(true).optional(),\n }),\n writes: [HOSTS_TAG],\n run: async (\n input,\n host,\n ctx,\n ): Promise<{ readonly id: string; readonly onlineUntil: number }> => {\n const db = dbOf(ctx);\n const known = await welcome(host, db);\n const { onlineUntil } = await deps.store.reportHost(db, host, host.host, {\n protocol: known.protocol,\n name: known.name,\n platform: known.platform,\n agents: input.agents,\n devices: input.devices,\n presenceDue: input.presenceDue,\n agentsCheckedAt: input.agentsChecked ? Date.now() : undefined,\n online: input.online,\n ttlMs: 2 * deps.heartbeatMs,\n });\n learnAgents(host.host.hostId, input.agents);\n return { id: host.host.hostId, onlineUntil };\n },\n }),\n hostAgentToken: chatAction(\"host\", enforcing, {\n description:\n \"A token for an agent on this computer outside any turn, such as Claude Code in a terminal, to call the app's actions as the user; revoked with the grant.\",\n input: z.object({ agent: z.string().min(1).max(120) }),\n run: async ({ agent }, host, ctx): Promise<Delegation> => {\n await requireWelcome(host, dbOf(ctx));\n if (!deps.auth.delegateAgent) {\n throw new ActionError(\n \"not_found\",\n \"This app's agents run only in its sidebar.\",\n );\n }\n return deps.auth.delegateAgent(host.host, { agent, ttlMs: AGENT_TOKEN_TTL_MS });\n },\n }),\n hostClaim: chatAction(\"host\", enforcing, {\n description:\n \"Take the next turn addressed to this computer with its turn token; not_found when none waits.\",\n input: z.object({}),\n run: async (_input, host, ctx): Promise<ClaimedTurn> => {\n const claimed = await session.claim(host, dbOf(ctx));\n if (!claimed) throw new ActionError(\"not_found\", \"No turn is waiting.\");\n return claimed;\n },\n }),\n hostSignals: chatAction(\"host\", enforcing, {\n description: \"Answers and stop requests for the turns this computer runs.\",\n input: z.object({ turns: z.array(z.object({ turnId, afterSeq })).max(16) }),\n run: async (input, host, ctx): Promise<TurnSignals[]> => {\n for (const turn of input.turns) deps.pushed?.confirm(turn.turnId);\n const db = dbOf(ctx);\n await requireWelcome(host, db);\n const signals = await deps.store.readSignals(db, host, host.host, input.turns);\n return Promise.all(\n signals.map(async (batch): Promise<TurnSignals> => {\n const answering = new Set(\n batch.items.flatMap((item) =>\n item.kind === \"answer\" && item.body.signed\n ? [item.body.signed.deviceId]\n : [],\n ),\n );\n const devices = (\n await Promise.all(\n [...answering].map((deviceId) =>\n deps.auth.device?.(host.userId, deviceId),\n ),\n )\n ).filter((device) => device !== undefined);\n return devices.length > 0 ? { ...batch, devices } : batch;\n }),\n );\n },\n }),\n hostAppend: chatAction(\"host\", enforcing, {\n description:\n \"Append finished items of a running turn and extend its lease; no items only renews it.\",\n input: z.object({ turnId, items: z.array(hostItemDraft).max(64) }),\n run: async (\n input,\n host,\n ctx,\n ): Promise<{\n readonly id: string;\n readonly leaseUntil: number;\n readonly token: ClaimedTurn[\"token\"];\n }> => {\n deps.pushed?.confirm(input.turnId);\n await requireWelcome(host, dbOf(ctx));\n const appended = await deps.transact(host, async (tx) => {\n const result = await deps.store.appendHostItems(\n tx,\n host,\n host.host,\n input.turnId,\n input.items,\n deps.leaseMs,\n );\n return {\n result,\n threadId: input.items.length > 0 ? result.threadId : undefined,\n };\n });\n const token = await mint(host, dbOf(ctx), { ...appended, turnId: input.turnId });\n return { id: appended.threadId, leaseUntil: appended.leaseUntil, token };\n },\n }),\n hostFinish: chatAction(\"host\", enforcing, {\n description: \"End a turn, once.\",\n input: z.object({\n turnId,\n outcome: z.discriminatedUnion(\"state\", [\n z.object({ state: z.literal(\"done\"), stopReason: z.string() }),\n z.object({ state: z.literal(\"cancelled\") }),\n z.object({ state: z.literal(\"failed\"), reason: z.enum(TURN_FAILURES) }),\n ]),\n }),\n run: async (input, host, ctx): Promise<{ readonly id: string }> => {\n deps.pushed?.confirm(input.turnId);\n await requireWelcome(host, dbOf(ctx));\n const finished = await deps.transact(host, async (tx) => {\n const result = await deps.store.finishTurn(\n tx,\n host,\n host.host,\n input.turnId,\n input.outcome,\n );\n return { result, threadId: result.threadId };\n });\n deps.relay.settle(host, finished.threadId, input.turnId);\n return { id: finished.threadId };\n },\n }),\n };\n}\n\n/**\n * The chat's actions at `/_parlor/chat/actions/<name>`: plugin actions, so never on MCP\n * and never callable by an agent. Writes return the thread or host id as `id`.\n */\nexport function chatActions(\n deps: ChatActionDeps,\n session: HostSession = hostSession(deps),\n) {\n return createRegistry({ ...userChatActions(deps), ...hostChatActions(deps, session) });\n}\n\nexport type ChatActionRegistry = ReturnType<typeof chatActions>;\nexport type ChatActionMap = ActionsOf<ChatActionRegistry>;\nexport type ChatUserActionMap = ReturnType<typeof userChatActions>;\nexport type ChatHostActionMap = ReturnType<typeof hostChatActions>;\n"]}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ActionContext,\n ActionError,\n type HostId,\n type ThreadId,\n type TurnId,\n} from \"@parlor/core\";\nimport { type ActionsOf, createRegistry } from \"@parlor/core/registry\";\nimport { type AuthProvider, type Delegation, HOST_GRANTS_TAG } from \"@parlor/server\";\nimport { z } from \"zod\";\n\nimport { idSchema } from \"../id-schemas.js\";\nimport { chatItemBodies, hostItemDraft, type LoggedItem } from \"../items.js\";\nimport type {\n AgentInfo,\n ChatOwner,\n ChatSnapshot,\n ThreadHistory,\n ThreadList,\n ClaimedTurn,\n HostSummary,\n TurnSignals,\n} from \"../model.js\";\nimport { HOST_PROTOCOL, type HostWelcome, PUSHED_TURNS_PROTOCOL } from \"../protocol.js\";\nimport {\n CHAT_ACTIVITY_TAG,\n CHAT_AGENTS_CHECK_TAG,\n CHAT_TAG,\n HOSTS_TAG,\n} from \"../tags.js\";\nimport { turnContext } from \"./context.js\";\nimport type { LiveRelay } from \"./live.js\";\nimport { type ChatHost, chatAction } from \"./party.js\";\nimport type { TurnPush } from \"./push.js\";\nimport { agentInfoSchema, TURN_FAILURES } from \"./rows.js\";\n\nconst presenceDueSchema = z\n .record(z.string().min(1).max(64), z.number().int().nonnegative())\n .refine((due) => Object.keys(due).length <= 256, \"At most 256 devices.\");\nimport {\n type ChatDb,\n type ChatStore,\n type StoredHost,\n THREAD_LIST_LIMIT,\n} from \"./store.js\";\n\nexport { CHAT_ACTIVITY_TAG, CHAT_TAG, HOSTS_TAG, HOST_GRANTS_TAG };\n\nexport interface Written<T> {\n readonly result: T;\n readonly threadId: ThreadId | undefined;\n}\n\nexport interface ChatActionDeps {\n readonly enforcing: boolean;\n /**\n * Runs `work` in one transaction with the thread's sync event. Actions that call the auth\n * provider do so outside it, because a provider may read through another connection\n * (PGlite has one, and the transaction holds it).\n */\n /** Runs `work` in one transaction and wakes only `owner`'s tabs and computers. */\n readonly transact: <T>(\n owner: ChatOwner,\n work: (tx: ChatDb) => Promise<Written<T>>,\n ) => Promise<T>;\n /** Commits the lapsed leases and liveness of `owner`, with the sync events they owe. */\n readonly reconcile: (owner: ChatOwner) => Promise<void>;\n /** Drops the owner's computer rows whose grant is gone; best effort, never fails a read. */\n readonly pruneHosts: (owner: ChatOwner, hostIds: readonly HostId[]) => Promise<void>;\n readonly auth: AuthProvider;\n readonly store: ChatStore;\n readonly relay: LiveRelay;\n readonly leaseMs: number;\n readonly heartbeatMs: number;\n readonly maxQueued: number;\n readonly instructions: string | undefined;\n readonly appName: string;\n readonly appOrigin: () => string;\n /** Hands a queued turn straight to its computer; without it computers only claim. */\n readonly pushed?: TurnPush | undefined;\n}\n\nconst threadId = idSchema(\"thread\");\nconst turnId = idSchema(\"turn\");\nconst itemId = idSchema(\"item\");\nconst afterSeq = z.number().int().min(0);\n\nconst MIN_HOST_PROTOCOL = 2;\nconst CONTEXT_HISTORY_ITEMS = 200;\n/** An agent outside a turn asks again well inside the revocation horizon. */\nconst AGENT_TOKEN_TTL_MS = 10 * 60_000;\nconst TERMINAL: ReadonlySet<string> = new Set([\"done\", \"failed\", \"cancelled\"]);\n\nconst dbOf = (ctx: ActionContext) => ctx.db as ChatDb;\n\nasync function activeHosts(\n deps: ChatActionDeps,\n db: ChatDb,\n owner: ChatOwner,\n): Promise<StoredHost[]> {\n const hosts = await deps.store.listHosts(db, owner);\n const { hostActive } = deps.auth;\n if (!hostActive) return hosts;\n const holding = await Promise.all(\n hosts.map((host) => hostActive.call(deps.auth, host.grantId)),\n );\n const gone = hosts.filter((_host, at) => !holding[at]);\n if (gone.length > 0) {\n await deps.pruneHosts(\n owner,\n gone.map((host) => host.id),\n );\n }\n return hosts.filter((_host, at) => holding[at]);\n}\n\nconst summaryOf = ({\n grantId: _grantId,\n protocol: _protocol,\n ...summary\n}: StoredHost): HostSummary => summary;\n\nexport function userChatActions(deps: ChatActionDeps) {\n const { enforcing } = deps;\n return {\n open: chatAction(\"user\", enforcing, {\n description:\n \"The sidebar's first paint in one round trip: threads, computers, and a thread's last page with what streams now.\",\n input: z.object({\n threadId: threadId.optional(),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: (input) => [\n [CHAT_TAG, ...(input.threadId ? [input.threadId] : [])],\n [HOSTS_TAG],\n [HOST_GRANTS_TAG],\n ],\n run: async (input, user, ctx): Promise<ChatSnapshot> => {\n const db = dbOf(ctx);\n const [threads, hosts, page] = await Promise.all([\n deps.store.listThreads(db, user),\n activeHosts(deps, db, user),\n deps.store.readPage(db, user, input.threadId, input.limit),\n ]);\n const thread = page.thread;\n const open = thread ? deps.relay.open(user, thread.id) : [];\n const streaming = open.filter((turn) => {\n const state = page.turns.find((status) => status.turnId === turn.turnId)?.state;\n const ended = state !== undefined && TERMINAL.has(state);\n if (ended) deps.relay.settle(user, turn.threadId, turn.turnId);\n return !ended;\n });\n return {\n threads,\n ...(threads.length >= THREAD_LIST_LIMIT ? { moreThreads: true } : {}),\n hosts: hosts.map(summaryOf),\n page: { ...page, open: streaming },\n };\n },\n }),\n items: chatAction(\"user\", enforcing, {\n description: \"A thread's items after a sequence number.\",\n input: z.object({ threadId, afterSeq }),\n reads: (input) => [[CHAT_TAG, input.threadId]],\n run: (input, user, ctx): Promise<LoggedItem[]> =>\n deps.store.readItemsAfter(dbOf(ctx), user, input.threadId, input.afterSeq),\n }),\n history: chatAction(\"user\", enforcing, {\n description:\n \"A thread's items before a sequence number, oldest first, with their turns; hasMore while older ones remain.\",\n input: z.object({\n threadId,\n beforeSeq: z.number().int().min(1),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: (input) => [[CHAT_TAG, input.threadId]],\n run: async (input, user, ctx): Promise<ThreadHistory> => {\n const read = deps.store.readItemsBefore?.bind(deps.store);\n if (!read)\n throw new ActionError(\"not_found\", \"This chat store keeps no history.\");\n return read(dbOf(ctx), user, input.threadId, input.beforeSeq, input.limit);\n },\n }),\n threadsBefore: chatAction(\"user\", enforcing, {\n description:\n \"The user's threads updated before a thread, newest first, for the list past what open returned.\",\n input: z.object({\n before: z.object({ updatedAt: z.number().int().min(0), id: threadId }),\n limit: z.number().int().min(1).max(500).default(200),\n }),\n reads: [CHAT_TAG],\n run: async (input, user, ctx): Promise<ThreadList> => {\n const list = deps.store.listThreadsBefore?.bind(deps.store);\n if (!list)\n throw new ActionError(\"not_found\", \"This chat store keeps no history.\");\n return list(dbOf(ctx), user, input.before, input.limit);\n },\n }),\n hosts: chatAction(\"user\", enforcing, {\n description: \"The user's computers and the agents on them.\",\n input: z.object({}),\n reads: [HOSTS_TAG, HOST_GRANTS_TAG],\n run: async (_input, user, ctx): Promise<HostSummary[]> =>\n (await activeHosts(deps, dbOf(ctx), user)).map(summaryOf),\n }),\n send: chatAction(\"user\", enforcing, {\n description: \"Send a prompt to an agent on one of the user's computers.\",\n input: z.object({\n threadId,\n turnId,\n itemId,\n clientId: z.string().min(1).max(128),\n prompt: chatItemBodies.prompt.body,\n }),\n run: async (\n input,\n user,\n ctx,\n ): Promise<{ readonly id: string; readonly turnId: string }> => {\n const hosts = await activeHosts(deps, dbOf(ctx), user);\n const host = hosts.find(\n (candidate) => candidate.id === input.prompt.agent.hostId,\n );\n if (!host) throw new ActionError(\"not_found\", \"Computer not found\");\n const sent = await deps.transact(user, async (tx) => {\n await deps.store.appendUserItems(tx, user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"prompt\", body: input.prompt }],\n turn: {\n turnId: input.turnId,\n agent: input.prompt.agent,\n clientId: input.clientId,\n deviceId: user.deviceId,\n maxQueued: deps.maxQueued,\n },\n });\n return {\n result: { id: input.threadId, turnId: input.turnId },\n threadId: input.threadId,\n };\n });\n if (host.protocol >= PUSHED_TURNS_PROTOCOL) deps.pushed?.offer(user, host.id);\n return sent;\n },\n }),\n answer: chatAction(\"user\", enforcing, {\n description: \"Answer the agent's permission prompt or question.\",\n input: z.object({ threadId, turnId, itemId, answer: chatItemBodies.answer.body }),\n run: async (input, user): Promise<{ readonly id: string }> => {\n const { signed } = input.answer;\n if (signed && deps.auth.device) {\n const device = await deps.auth.device(user.userId, signed.deviceId);\n if (!device) {\n throw new ActionError(\"forbidden\", \"This device cannot answer.\");\n }\n }\n return deps.transact(user, async (tx) => {\n await deps.store.appendUserItems(tx, user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"answer\", body: input.answer }],\n });\n return { result: { id: input.threadId }, threadId: input.threadId };\n });\n },\n }),\n cancel: chatAction(\"user\", enforcing, {\n description: \"Stop the running turn; what the agent already said is kept.\",\n input: z.object({ threadId, turnId, itemId }),\n writes: [CHAT_TAG],\n run: async (input, user, ctx): Promise<{ readonly id: string }> => {\n await deps.store.appendUserItems(dbOf(ctx), user, {\n threadId: input.threadId,\n turnId: input.turnId,\n items: [{ id: input.itemId, kind: \"cancel\", body: {} }],\n });\n return { id: input.threadId };\n },\n }),\n userActive: chatAction(\"user\", enforcing, {\n description:\n \"Tell the user's computers a tab is in use, so a polling computer speeds up; carries no content and writes no table.\",\n input: z.object({}),\n writes: [CHAT_ACTIVITY_TAG],\n run: (): { readonly ok: true } => ({ ok: true }),\n }),\n checkAgents: chatAction(\"user\", enforcing, {\n description:\n \"Ask the user's computers to look again for the coding agents installed on them; each reports what it found, stamped `agentsCheckedAt`. Answers when it asked, by the same clock.\",\n input: z.object({}),\n writes: [CHAT_AGENTS_CHECK_TAG],\n run: (): { readonly askedAt: number } => ({ askedAt: Date.now() }),\n }),\n };\n}\n\n/**\n * What the server keeps about the computers it serves: which said hello, their agents'\n * names, and how a turn is claimed for one, by `hostClaim` or pushed to it.\n */\nexport function hostSession(deps: ChatActionDeps) {\n const welcomed = new Set<HostId>();\n const welcome = async (host: ChatHost, db: ChatDb) => {\n const hosts = await deps.store.listHosts(db, host);\n const known = hosts.find((candidate) => candidate.id === host.host.hostId);\n if (!known) throw new ActionError(\"forbidden\", \"Say hello before anything else.\");\n if (known.protocol < MIN_HOST_PROTOCOL) {\n await deps.pruneHosts(host, [known.id]);\n throw new ActionError(\"forbidden\", \"Say hello before anything else.\");\n }\n welcomed.add(known.id);\n return known;\n };\n const requireWelcome = async (host: ChatHost, db: ChatDb) => {\n if (!welcomed.has(host.host.hostId)) await welcome(host, db);\n };\n const agentNames = new Map<HostId, ReadonlyMap<string, string>>();\n const learnAgents = (hostId: HostId, agents: readonly AgentInfo[]) => {\n agentNames.set(hostId, new Map(agents.map((agent) => [agent.id, agent.name])));\n };\n const agentNameOf = async (host: ChatHost, db: ChatDb, agentId: string) => {\n if (!agentNames.has(host.host.hostId)) {\n const known = (await deps.store.listHosts(db, host)).find(\n (candidate) => candidate.id === host.host.hostId,\n );\n if (known) learnAgents(known.id, known.agents);\n }\n return agentNames.get(host.host.hostId)?.get(agentId) ?? agentId;\n };\n const mint = async (\n host: ChatHost,\n db: ChatDb,\n turn: {\n threadId: ThreadId;\n turnId: TurnId;\n clientId: string;\n agentId: string;\n scope: string;\n },\n ) => {\n if (!deps.auth.delegate) {\n throw new ActionError(\"internal\", \"The auth provider cannot mint turn tokens.\");\n }\n return deps.auth.delegate(host.host, {\n threadId: turn.threadId,\n turnId: turn.turnId,\n clientId: turn.clientId,\n agent: await agentNameOf(host, db, turn.agentId),\n ttlMs: deps.leaseMs,\n scope: turn.scope,\n });\n };\n /** The next turn waiting for `host`, claimed for it with its token and context; undefined when none waits. */\n const claim = async (host: ChatHost, db: ChatDb): Promise<ClaimedTurn | undefined> => {\n await requireWelcome(host, db);\n await deps.reconcile(host);\n const stored = await deps.transact(host, async (tx) => {\n const taken = await deps.store.claimTurn(tx, host, host.host, deps.leaseMs);\n return { result: taken, threadId: taken?.id };\n });\n if (!stored) return undefined;\n const { owner = host, ...claimed } = stored;\n try {\n const deviceId = claimed.prompt.body.signed?.deviceId;\n const [token, device, account, page] = await Promise.all([\n mint(host, db, {\n threadId: claimed.id,\n turnId: claimed.turnId,\n clientId: claimed.clientId,\n agentId: claimed.agent.agentId,\n scope: owner.scope,\n }),\n deviceId ? deps.auth.device?.(host.userId, deviceId) : undefined,\n deps.auth.account?.(host.userId),\n deps.store.readPage(db, owner, claimed.id, CONTEXT_HISTORY_ITEMS),\n ]);\n const context = turnContext({\n appName: deps.appName,\n appOrigin: deps.appOrigin(),\n account,\n device,\n instructions: deps.instructions,\n history: page.items.filter((item) => item.seq < claimed.prompt.seq),\n });\n return { ...claimed, device, context, token };\n } catch (error) {\n await release(host, claimed.id, claimed.turnId).catch(() => false);\n throw error;\n }\n };\n /** Puts a claimed turn back in the queue, waking the computer to claim it again. */\n const release = (host: ChatHost, thread: ThreadId, turn: TurnId) =>\n deps.transact(host, async (tx) => {\n const released = await deps.store.releaseClaim(tx, host, host.host, turn);\n return { result: released, threadId: thread };\n });\n return {\n welcome,\n requireWelcome,\n learnAgents,\n agentNameOf,\n mint,\n claim,\n release,\n welcomed,\n };\n}\n\nexport type HostSession = ReturnType<typeof hostSession>;\n\n/** What the user's computers call; `hostHello` first on every link. */\nexport function hostChatActions(\n deps: ChatActionDeps,\n session: HostSession = hostSession(deps),\n) {\n const { enforcing } = deps;\n const { welcome, requireWelcome, learnAgents, mint, welcomed } = session;\n return {\n hostHello: chatAction(\"host\", enforcing, {\n description:\n \"A link's first call: agree on the host protocol and report this computer online with its agents.\",\n input: z.object({\n protocols: z.object({\n min: z.number().int().min(1),\n max: z.number().int().min(1),\n }),\n hostVersion: z.string().min(1).max(32),\n name: z.string().min(1).max(80),\n platform: z.string().min(1).max(32),\n agents: z.array(agentInfoSchema).max(32),\n devices: z.array(z.string().min(1).max(64)).max(256).optional(),\n presenceDue: presenceDueSchema.optional(),\n }),\n writes: [HOSTS_TAG],\n run: async (input, host, ctx): Promise<HostWelcome & { readonly id: string }> => {\n const id = host.host.hostId;\n const protocols = { min: MIN_HOST_PROTOCOL, max: HOST_PROTOCOL };\n const refuse = async (reason: \"host_too_old\" | \"app_too_old\") => {\n welcomed.delete(id);\n await deps.store.pruneHosts(dbOf(ctx), host, [id]);\n return { id, accepted: false as const, reason, protocols };\n };\n if (input.protocols.max < protocols.min) return refuse(\"host_too_old\");\n const protocol = Math.min(input.protocols.max, protocols.max);\n if (protocol < input.protocols.min) return refuse(\"app_too_old\");\n await deps.store.reportHost(dbOf(ctx), host, host.host, {\n protocol,\n name: input.name,\n platform: input.platform,\n agents: input.agents,\n devices: input.devices,\n presenceDue: input.presenceDue,\n online: true,\n ttlMs: 2 * deps.heartbeatMs,\n });\n learnAgents(id, input.agents);\n welcomed.add(id);\n return {\n id,\n accepted: true,\n protocol,\n leaseMs: deps.leaseMs,\n heartbeatMs: deps.heartbeatMs,\n userActivity: true,\n };\n },\n }),\n hostReport: chatAction(\"host\", enforcing, {\n description:\n \"This computer went offline, changed its agents, or looked for them again (`agentsChecked`).\",\n input: z.object({\n online: z.boolean(),\n agents: z.array(agentInfoSchema).max(32),\n devices: z.array(z.string().min(1).max(64)).max(256).optional(),\n presenceDue: presenceDueSchema.optional(),\n agentsChecked: z.literal(true).optional(),\n }),\n writes: [HOSTS_TAG],\n run: async (\n input,\n host,\n ctx,\n ): Promise<{ readonly id: string; readonly onlineUntil: number }> => {\n const db = dbOf(ctx);\n const known = await welcome(host, db);\n const { onlineUntil } = await deps.store.reportHost(db, host, host.host, {\n protocol: known.protocol,\n name: known.name,\n platform: known.platform,\n agents: input.agents,\n devices: input.devices,\n presenceDue: input.presenceDue,\n agentsCheckedAt: input.agentsChecked ? Date.now() : undefined,\n online: input.online,\n ttlMs: 2 * deps.heartbeatMs,\n });\n learnAgents(host.host.hostId, input.agents);\n return { id: host.host.hostId, onlineUntil };\n },\n }),\n hostAgentToken: chatAction(\"host\", enforcing, {\n description:\n \"A token for an agent on this computer outside any turn, such as Claude Code in a terminal, to call the app's actions as the user; revoked with the grant.\",\n input: z.object({ agent: z.string().min(1).max(120) }),\n run: async ({ agent }, host, ctx): Promise<Delegation> => {\n await requireWelcome(host, dbOf(ctx));\n if (!deps.auth.delegateAgent) {\n throw new ActionError(\n \"not_found\",\n \"This app's agents run only in its sidebar.\",\n );\n }\n return deps.auth.delegateAgent(host.host, { agent, ttlMs: AGENT_TOKEN_TTL_MS });\n },\n }),\n hostClaim: chatAction(\"host\", enforcing, {\n description:\n \"Take the next turn addressed to this computer with its turn token; not_found when none waits.\",\n input: z.object({}),\n run: async (_input, host, ctx): Promise<ClaimedTurn> => {\n const claimed = await session.claim(host, dbOf(ctx));\n if (!claimed) throw new ActionError(\"not_found\", \"No turn is waiting.\");\n return claimed;\n },\n }),\n hostSignals: chatAction(\"host\", enforcing, {\n description: \"Answers and stop requests for the turns this computer runs.\",\n input: z.object({ turns: z.array(z.object({ turnId, afterSeq })).max(16) }),\n run: async (input, host, ctx): Promise<TurnSignals[]> => {\n for (const turn of input.turns) deps.pushed?.confirm(turn.turnId);\n const db = dbOf(ctx);\n await requireWelcome(host, db);\n const signals = await deps.store.readSignals(db, host, host.host, input.turns);\n return Promise.all(\n signals.map(async (batch): Promise<TurnSignals> => {\n const answering = new Set(\n batch.items.flatMap((item) =>\n item.kind === \"answer\" && item.body.signed\n ? [item.body.signed.deviceId]\n : [],\n ),\n );\n const devices = (\n await Promise.all(\n [...answering].map((deviceId) =>\n deps.auth.device?.(host.userId, deviceId),\n ),\n )\n ).filter((device) => device !== undefined);\n return devices.length > 0 ? { ...batch, devices } : batch;\n }),\n );\n },\n }),\n hostAppend: chatAction(\"host\", enforcing, {\n description:\n \"Append finished items of a running turn and extend its lease; no items only renews it.\",\n input: z.object({ turnId, items: z.array(hostItemDraft).max(64) }),\n run: async (\n input,\n host,\n ctx,\n ): Promise<{\n readonly id: string;\n readonly leaseUntil: number;\n readonly token: ClaimedTurn[\"token\"];\n }> => {\n deps.pushed?.confirm(input.turnId);\n await requireWelcome(host, dbOf(ctx));\n const appended = await deps.transact(host, async (tx) => {\n const result = await deps.store.appendHostItems(\n tx,\n host,\n host.host,\n input.turnId,\n input.items,\n deps.leaseMs,\n );\n return {\n result,\n threadId: input.items.length > 0 ? result.threadId : undefined,\n };\n });\n const token = await mint(host, dbOf(ctx), {\n ...appended,\n turnId: input.turnId,\n scope: (appended.owner ?? host).scope,\n });\n return { id: appended.threadId, leaseUntil: appended.leaseUntil, token };\n },\n }),\n hostFinish: chatAction(\"host\", enforcing, {\n description: \"End a turn, once.\",\n input: z.object({\n turnId,\n outcome: z.discriminatedUnion(\"state\", [\n z.object({ state: z.literal(\"done\"), stopReason: z.string() }),\n z.object({ state: z.literal(\"cancelled\") }),\n z.object({ state: z.literal(\"failed\"), reason: z.enum(TURN_FAILURES) }),\n ]),\n }),\n run: async (input, host, ctx): Promise<{ readonly id: string }> => {\n deps.pushed?.confirm(input.turnId);\n await requireWelcome(host, dbOf(ctx));\n const finished = await deps.transact(host, async (tx) => {\n const result = await deps.store.finishTurn(\n tx,\n host,\n host.host,\n input.turnId,\n input.outcome,\n );\n return { result, threadId: result.threadId };\n });\n deps.relay.settle(finished.owner ?? host, finished.threadId, input.turnId);\n return { id: finished.threadId };\n },\n }),\n };\n}\n\n/**\n * The chat's actions at `/_parlor/chat/actions/<name>`: plugin actions, so never on MCP\n * and never callable by an agent. Writes return the thread or host id as `id`.\n */\nexport function chatActions(\n deps: ChatActionDeps,\n session: HostSession = hostSession(deps),\n) {\n return createRegistry({ ...userChatActions(deps), ...hostChatActions(deps, session) });\n}\n\nexport type ChatActionRegistry = ReturnType<typeof chatActions>;\nexport type ChatActionMap = ActionsOf<ChatActionRegistry>;\nexport type ChatUserActionMap = ReturnType<typeof userChatActions>;\nexport type ChatHostActionMap = ReturnType<typeof hostChatActions>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,SAAS,EAEd,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW1E,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAM3D,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,KAAK,SAAS,EACd,uBAAuB,EACvB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,KAAK,gBAAgB,EACrB,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,OAAO,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AAEpB,yFAAyF;AACzF,eAAO,MAAM,wBAAwB,0GACoE,CAAC;AAE1G,eAAO,MAAM,cAAc,gIACoG,CAAC;AAEhI,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,8FAA8F;IAC9F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;CAChD;AAED,oFAAoF;AACpF,eAAO,MAAM,YAAY,QAAwB,CAAC;AASlD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,YAAY,CAmH5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,SAAS,EAEd,KAAK,MAAM,EAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAW1E,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAM3D,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,KAAK,SAAS,EACd,uBAAuB,EACvB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,KAAK,gBAAgB,EACrB,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,OAAO,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AAEpB,yFAAyF;AACzF,eAAO,MAAM,wBAAwB,0GACoE,CAAC;AAE1G,eAAO,MAAM,cAAc,gIACoG,CAAC;AAEhI,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,8FAA8F;IAC9F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;CAChD;AAED,oFAAoF;AACpF,eAAO,MAAM,YAAY,QAAwB,CAAC;AASlD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,YAAY,CAoH5D"}
@@ -1,4 +1,4 @@
1
- import { userAudience } from "@parlor/agent-ui/server";
1
+ import { accountAudience, userAudience } from "@parlor/agent-ui/server";
2
2
  import { DEV_USER_ID, userOf, } from "@parlor/core";
3
3
  import { REVOCATION_HORIZON_MS } from "@parlor/server";
4
4
  import { CHAT_PLUGIN } from "../protocol.js";
@@ -58,7 +58,7 @@ export function chat(options = {}) {
58
58
  }
59
59
  const relay = (options.relay ?? inProcessRelay)();
60
60
  const db = () => database.read();
61
- const ownStream = (owner) => userAudience(owner.scope, owner.userId);
61
+ const ownStream = (owner) => accountAudience(owner.userId) ?? userAudience(owner.scope, owner.userId);
62
62
  const transact = (owner, work) => database.transaction(async (tx) => {
63
63
  const { result, threadId } = await work(tx);
64
64
  if (threadId !== undefined)