@parlor/chat 0.4.3 → 0.4.5
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 +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/items.d.ts +4 -0
- package/dist/items.d.ts.map +1 -1
- package/dist/items.js +4 -1
- package/dist/items.js.map +1 -1
- package/dist/server/actions.d.ts +15 -1
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/actions.js +10 -2
- package/dist/server/actions.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/tags.d.ts +2 -0
- package/dist/tags.d.ts.map +1 -1
- package/dist/tags.js +2 -0
- package/dist/tags.js.map +1 -1
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ export { type AppliedFrame, applyFrame } from "./open-turns.js";
|
|
|
4
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
|
-
export { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from "./tags.js";
|
|
7
|
+
export { CHAT_ACTIVITY_TAG, CHAT_AGENT_WARM_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG, } from "./tags.js";
|
|
8
8
|
export { type AskState, type ChatItem, type FoldedKind, type FoldInput, foldThread, type ItemFolders, type ThreadConfirmation, } from "./view.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,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,
|
|
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,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,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
|
@@ -2,6 +2,6 @@ export { CHAT_EVENTS } from "./events.js";
|
|
|
2
2
|
export { applyFrame } from "./open-turns.js";
|
|
3
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
|
-
export { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG } from "./tags.js";
|
|
5
|
+
export { CHAT_ACTIVITY_TAG, CHAT_AGENT_WARM_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG, } from "./tags.js";
|
|
6
6
|
export { foldThread, } from "./view.js";
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
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,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,
|
|
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,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,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 {\n CHAT_ACTIVITY_TAG,\n CHAT_AGENT_WARM_TAG,\n CHAT_AGENTS_CHECK_TAG,\n CHAT_TAG,\n HOSTS_TAG,\n} 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/items.d.ts
CHANGED
|
@@ -20,6 +20,10 @@ declare const signed: z.ZodObject<{
|
|
|
20
20
|
}, z.core.$strip>;
|
|
21
21
|
pairing: z.ZodOptional<z.ZodString>;
|
|
22
22
|
}, z.core.$strip>;
|
|
23
|
+
export declare const agentRef: z.ZodObject<{
|
|
24
|
+
hostId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@parlor/core").Id<"host">, string>>;
|
|
25
|
+
agentId: z.ZodString;
|
|
26
|
+
}, z.core.$strip>;
|
|
23
27
|
/**
|
|
24
28
|
* The one table of item kinds: who writes each and the body it carries. Types, the
|
|
25
29
|
* server's parsers, the host's append type and the client's view all derive from it.
|
package/dist/items.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAY3C,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;iBASV,CAAC;
|
|
1
|
+
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"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"}
|
package/dist/items.js
CHANGED
|
@@ -20,7 +20,10 @@ const signed = z.object({
|
|
|
20
20
|
.regex(/^[A-Za-z0-9_-]{43}$/)
|
|
21
21
|
.optional(),
|
|
22
22
|
});
|
|
23
|
-
const agentRef = z.object({
|
|
23
|
+
export const agentRef = z.object({
|
|
24
|
+
hostId: idSchema("host"),
|
|
25
|
+
agentId: z.string().min(1),
|
|
26
|
+
});
|
|
24
27
|
const askChoice = z.object({
|
|
25
28
|
id: z.string().min(1),
|
|
26
29
|
label: z.string(),
|
package/dist/items.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items.js","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,SAAS;IACT,sGAAsG;IACtG,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"items.js","sourceRoot":"","sources":["../src/items.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,SAAS;IACT,sGAAsG;IACtG,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;CAC/E,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;YACzB;;;eAGG;YACH,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;SACvE,CAAC;KACH;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;YACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC;iBACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;iBAClE,QAAQ,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC1B,CAAC;KACH;IACD,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;IAC9C,KAAK,EAAE;QACL,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC9E;IACD,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;IACpE,IAAI,EAAE;QACJ,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACpE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;SACzC,CAAC;KACH;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;gBACnB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;aACxD,CAAC,CACH;SACF,CAAC;KACH;IACD,GAAG,EAAE;QACH,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;YAClD;;;;eAIG;YACH,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;SAChE,CAAC;KACH;IACD,KAAK,EAAE;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;YACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;YACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;SACrC,CAAC;KACH;CACO,CAAC;AA0CX,MAAM,KAAK,GAAG,CACZ,IAAO,EAKN,EAAE,CACH,CAAC,CAAC,MAAM,CAAC;IACP,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,IAAyB;CACrD,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACxD,KAAK,CAAC,OAAO,CAAC;IACd,KAAK,CAAC,WAAW,CAAC;IAClB,KAAK,CAAC,MAAM,CAAC;IACb,KAAK,CAAC,MAAM,CAAC;IACb,KAAK,CAAC,KAAK,CAAC;IACZ,KAAK,CAAC,OAAO,CAAC;CACf,CAAC,CAAC","sourcesContent":["import type { ItemId, ThreadId, TurnId } from \"@parlor/core\";\nimport { z } from \"zod\";\n\nimport { CHAT_EVENTS } from \"./events.js\";\nimport { idSchema } from \"./id-schemas.js\";\nimport { MAX_PROMPT_CHARS } from \"./limits.js\";\n\nconst signature = z.object({\n keyId: z.string(),\n presence: z.enum([\"none\", \"user\"]),\n format: z.enum([\"es256-raw\", \"webauthn\"]),\n signature: z.string(),\n authenticatorData: z.string().optional(),\n clientDataJSON: z.string().optional(),\n});\n\nconst signed = z.object({\n deviceId: idSchema(\"device\"),\n at: z.number(),\n signature,\n /** The browser that approved the computer's connect proving it, so the computer trusts it unasked. */\n pairing: z\n .string()\n .regex(/^[A-Za-z0-9_-]{43}$/)\n .optional(),\n});\n\nexport const agentRef = z.object({\n hostId: idSchema(\"host\"),\n agentId: z.string().min(1),\n});\n\nconst askChoice = z.object({\n id: z.string().min(1),\n label: z.string(),\n effect: z.enum([\"allow_once\", \"allow_always\", \"reject_once\", \"reject_always\"]),\n});\n\n/**\n * The one table of item kinds: who writes each and the body it carries. Types, the\n * server's parsers, the host's append type and the client's view all derive from it.\n */\nexport const chatItemBodies = {\n prompt: {\n author: \"user\",\n body: z.object({\n text: z.string().min(1).max(MAX_PROMPT_CHARS),\n agent: agentRef,\n signed: signed.optional(),\n /**\n * The agent's options this turn runs with, by option id. Not signed: the computer runs\n * only values the agent offers, and none of them widens what the agent may do.\n */\n options: z.record(z.string().max(100), z.string().max(200)).optional(),\n }),\n },\n answer: {\n author: \"user\",\n body: z.object({\n askId: idSchema(\"item\"),\n choice: z.string().min(1),\n values: z\n .record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n .optional(),\n signed: signed.optional(),\n }),\n },\n cancel: { author: \"user\", body: z.object({}) },\n reply: {\n author: \"agent\",\n body: z.object({ text: z.string(), interrupted: z.literal(true).optional() }),\n },\n reasoning: { author: \"agent\", body: z.object({ text: z.string() }) },\n tool: {\n author: \"agent\",\n body: z.object({\n title: z.string(),\n tool: z.object({ kind: z.enum([\"app\", \"local\"]), name: z.string() }),\n status: z.enum([\"done\", \"failed\", \"cancelled\"]),\n detail: z.string().max(4_000).optional(),\n }),\n },\n plan: {\n author: \"agent\",\n body: z.object({\n entries: z.array(\n z.object({\n content: z.string(),\n status: z.enum([\"pending\", \"in_progress\", \"completed\"]),\n }),\n ),\n }),\n },\n ask: {\n author: \"agent\",\n body: z.object({\n question: z.string(),\n choices: z.array(askChoice),\n form: z.record(z.string(), z.unknown()).optional(),\n /**\n * Set by the host's policy, never by the app. Absent: any device answers from the\n * chat, without presence. `device`: only the device that sent the turn's prompt, from\n * the chat, without presence.\n */\n approval: z.enum([\"presence\", \"computer\", \"device\"]).optional(),\n }),\n },\n event: {\n author: \"system\",\n body: z.object({\n event: z.enum(CHAT_EVENTS),\n detail: z.string().max(500).optional(),\n itemId: idSchema(\"item\").optional(),\n choice: z.string().min(1).optional(),\n }),\n },\n} as const;\n\ntype Bodies = typeof chatItemBodies;\n\nexport type ChatItemKind = keyof Bodies;\nexport type Author = Bodies[ChatItemKind][\"author\"];\nexport type AuthorOf<K extends ChatItemKind> = Bodies[K][\"author\"];\nexport type ChatItemBody<K extends ChatItemKind> = z.output<Bodies[K][\"body\"]>;\nexport type ItemSignature = z.output<typeof signed>;\n\ntype KindsBy<A extends Author> = {\n [K in ChatItemKind]: AuthorOf<K> extends A ? K : never;\n}[ChatItemKind];\n\n/** Appended only by the user's devices, through the user actions. */\nexport type UserItemKind = KindsBy<\"user\">;\n/** Appended only by the user's computer, through the host actions. */\nexport type HostItemKind = KindsBy<\"agent\" | \"system\">;\n\nexport type LoggedItem<K extends ChatItemKind = ChatItemKind> = {\n [Kind in K]: {\n readonly id: ItemId;\n readonly threadId: ThreadId;\n readonly turnId: TurnId;\n /** Gap-free per thread, assigned under the thread row's lock. */\n readonly seq: number;\n readonly at: number;\n readonly author: AuthorOf<Kind>;\n readonly kind: Kind;\n readonly body: ChatItemBody<Kind>;\n };\n}[K];\n\n/** Its id is `<turnId>.<n>`, chosen by the host, so a retried append is a no-op. */\nexport type HostItemDraft = {\n [K in HostItemKind]: {\n readonly id: ItemId;\n readonly kind: K;\n readonly body: ChatItemBody<K>;\n };\n}[HostItemKind];\n\nconst draft = <K extends HostItemKind>(\n kind: K,\n): z.ZodObject<{\n id: ReturnType<typeof idSchema<\"item\">>;\n kind: z.ZodLiteral<K>;\n body: Bodies[K][\"body\"];\n}> =>\n z.object({\n id: idSchema(\"item\"),\n kind: z.literal(kind),\n body: chatItemBodies[kind].body as Bodies[K][\"body\"],\n });\n\nexport const hostItemDraft = z.discriminatedUnion(\"kind\", [\n draft(\"reply\"),\n draft(\"reasoning\"),\n draft(\"tool\"),\n draft(\"plan\"),\n draft(\"ask\"),\n draft(\"event\"),\n]);\n"]}
|
package/dist/server/actions.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type HostId, type ThreadId, type TurnId } from "@parlor/core";
|
|
1
|
+
import { type HostId, type Tag, type ThreadId, type TurnId } from "@parlor/core";
|
|
2
2
|
import { type ActionsOf } from "@parlor/core/registry";
|
|
3
3
|
import { type AuthProvider, type Delegation, HOST_GRANTS_TAG } from "@parlor/server";
|
|
4
4
|
import { z } from "zod";
|
|
@@ -29,6 +29,8 @@ export interface ChatActionDeps {
|
|
|
29
29
|
readonly reconcile: (owner: ChatOwner) => Promise<void>;
|
|
30
30
|
/** Drops the owner's computer rows whose grant is gone; best effort, never fails a read. */
|
|
31
31
|
readonly pruneHosts: (owner: ChatOwner, hostIds: readonly HostId[]) => Promise<void>;
|
|
32
|
+
/** Wakes `owner`'s tabs and computers with tags that no write carries. */
|
|
33
|
+
readonly announce: (owner: ChatOwner, tags: readonly Tag[]) => Promise<void>;
|
|
32
34
|
readonly auth: AuthProvider;
|
|
33
35
|
readonly store: ChatStore;
|
|
34
36
|
readonly relay: LiveRelay;
|
|
@@ -143,6 +145,12 @@ export declare function userChatActions(deps: ChatActionDeps): {
|
|
|
143
145
|
checkAgents: import("@parlor/core").ActionDefinition<z.ZodObject<{}, z.core.$strip>, {
|
|
144
146
|
readonly askedAt: number;
|
|
145
147
|
}>;
|
|
148
|
+
warmAgent: import("@parlor/core").ActionDefinition<z.ZodObject<{
|
|
149
|
+
hostId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@parlor/core").Id<"host">, string>>;
|
|
150
|
+
agentId: z.ZodString;
|
|
151
|
+
}, z.core.$strip>, {
|
|
152
|
+
readonly ok: true;
|
|
153
|
+
}>;
|
|
146
154
|
};
|
|
147
155
|
/**
|
|
148
156
|
* What the server keeps about the computers it serves: which said hello, their agents'
|
|
@@ -497,6 +505,12 @@ export declare function chatActions(deps: ChatActionDeps, session?: HostSession)
|
|
|
497
505
|
checkAgents: import("@parlor/core").ActionDefinition<z.ZodObject<{}, z.core.$strip>, {
|
|
498
506
|
readonly askedAt: number;
|
|
499
507
|
}>;
|
|
508
|
+
warmAgent: import("@parlor/core").ActionDefinition<z.ZodObject<{
|
|
509
|
+
hostId: z.ZodPipe<z.ZodString, z.ZodTransform<import("@parlor/core").Id<"host">, string>>;
|
|
510
|
+
agentId: z.ZodString;
|
|
511
|
+
}, z.core.$strip>, {
|
|
512
|
+
readonly ok: true;
|
|
513
|
+
}>;
|
|
500
514
|
hostHello: import("@parlor/core").ActionDefinition<z.ZodObject<{
|
|
501
515
|
protocols: z.ZodObject<{
|
|
502
516
|
min: z.ZodNumber;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/server/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/server/actions.js
CHANGED
|
@@ -3,9 +3,9 @@ import { createRegistry } from "@parlor/core/registry";
|
|
|
3
3
|
import { HOST_GRANTS_TAG } from "@parlor/server";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { idSchema } from "../id-schemas.js";
|
|
6
|
-
import { chatItemBodies, hostItemDraft } from "../items.js";
|
|
6
|
+
import { agentRef, chatItemBodies, hostItemDraft } from "../items.js";
|
|
7
7
|
import { HOST_PROTOCOL, PUSHED_TURNS_PROTOCOL } from "../protocol.js";
|
|
8
|
-
import { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG, } from "../tags.js";
|
|
8
|
+
import { CHAT_ACTIVITY_TAG, CHAT_AGENT_WARM_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_TAG, HOSTS_TAG, } from "../tags.js";
|
|
9
9
|
import { turnContext } from "./context.js";
|
|
10
10
|
import { chatAction } from "./party.js";
|
|
11
11
|
import { agentInfoSchema, TURN_FAILURES } from "./rows.js";
|
|
@@ -199,6 +199,14 @@ export function userChatActions(deps) {
|
|
|
199
199
|
writes: [CHAT_AGENTS_CHECK_TAG],
|
|
200
200
|
run: () => ({ askedAt: Date.now() }),
|
|
201
201
|
}),
|
|
202
|
+
warmAgent: chatAction("user", enforcing, {
|
|
203
|
+
description: "Tell one of the user's computers a thread with this agent may start soon, so it starts the agent now; carries no content and writes no table.",
|
|
204
|
+
input: agentRef,
|
|
205
|
+
run: async (input, user) => {
|
|
206
|
+
await deps.announce(user, [[CHAT_AGENT_WARM_TAG, input.hostId, input.agentId]]);
|
|
207
|
+
return { ok: true };
|
|
208
|
+
},
|
|
209
|
+
}),
|
|
202
210
|
};
|
|
203
211
|
}
|
|
204
212
|
/**
|
|
@@ -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: {\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
|
+
{"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 Tag,\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 { agentRef, 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_AGENT_WARM_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 /** Wakes `owner`'s tabs and computers with tags that no write carries. */\n readonly announce: (owner: ChatOwner, tags: readonly Tag[]) => 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 warmAgent: chatAction(\"user\", enforcing, {\n description:\n \"Tell one of the user's computers a thread with this agent may start soon, so it starts the agent now; carries no content and writes no table.\",\n input: agentRef,\n run: async (input, user): Promise<{ readonly ok: true }> => {\n await deps.announce(user, [[CHAT_AGENT_WARM_TAG, input.hostId, input.agentId]]);\n return { ok: true };\n },\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,
|
|
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,CAqH5D"}
|
package/dist/server/index.js
CHANGED
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAEL,WAAW,EAIX,MAAM,GACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAqB,MAAM,gBAAgB,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,QAAQ,EAER,WAAW,EACX,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EACL,iBAAiB,EACjB,QAAQ,EAIR,WAAW,EAGX,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,WAAW,GAEZ,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,EAEd,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,EAEL,UAAU,GAKX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAsB,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAKL,YAAY,GAIb,MAAM,YAAY,CAAC;AAEpB,yFAAyF;AACzF,MAAM,CAAC,MAAM,wBAAwB,GACnC,uGAAuG,CAAC;AAE1G,MAAM,CAAC,MAAM,cAAc,GACzB,6HAA6H,CAAC;AAEhI,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AA2BpC,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,SAAS,eAAe,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,yCAAyC,KAAK,GAAG,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,OAAO,GAAgB,EAAE;IAC5C,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,eAAe;QAC3B,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC;YAChF,MAAM,SAAS,GAAG,eAAe,CAC/B,WAAW,EACX,OAAO,CAAC,SAAS,IAAI,kBAAkB,CACxC,CAAC;YACF,IAAI,OAAO,GAAG,YAAY,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,mBAAmB,OAAO,aAAa,YAAY,gEAAgE,CACpH,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACpB,IAAI,IAAI,CAAC,iBAAiB;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBACvC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC,EAAE,CAAC;YAClD,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAY,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAE,EAAE,CACrC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAA+B,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAC3D,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAChC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,EAAY,CAAC,CAAC;gBACtD,IAAI,QAAQ,KAAK,SAAS;oBACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpE,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;YACL,MAAM,WAAW,GAAG,oBAAoB,CAAC;YACzC,MAAM,SAAS,GAAG,KAAK,EAAE,KAAiB,EAAE,EAAE;gBAC5C,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;oBAAE,OAAO;gBACzD,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBACtC,KAAK,MAAM,MAAM,IAAI,MAAM,YAAY,CAAC,YAAY,CAAC,EAAY,EAAE,KAAK,CAAC,EAAE,CAAC;wBAC1E,MAAM,IAAI,GAAU;4BAClB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACzD,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;yBACrD,CAAC;wBACF,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YACF,MAAM,UAAU,GAAiC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACxE,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChC,YAAY,CAAC,UAAU,CAAC,EAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CACtD,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC,CAAC;YACF,IAAI,KAAiD,CAAC;YACtD,MAAM,IAAI,GAAmB;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ;gBACR,SAAS;gBACT,UAAU;gBACV,IAAI;gBACJ,KAAK,EAAE,YAAY;gBACnB,KAAK;gBACL,OAAO;gBACP,WAAW;gBACX,SAAS;gBACT,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU;gBAClD,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;aAClF,CAAC;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAC3B,OAAO;gBACL,OAAO;gBACP,GAAG,CAAC,MAAM;oBACR,CAAC,CAAC;wBACE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAC/B,MAAM,CAAC;4BACL,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,WAAW;4BACxC,SAAS;4BACT,KAAK;4BACL,QAAQ;yBACT,CAAC;qBACL;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,EAAE,UAAU,CAAC;oBACjB,EAAE;oBACF,KAAK,EAAE,YAAY;oBACnB,KAAK;oBACL,WAAW;oBACX,SAAS;oBACT,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAC9B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;iBACzD,CAAC;gBACF,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,GAAG,EAAE;oBACV,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;wBACvB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;6BAClC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;6BACvB,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;4BACxB,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;wBACtE,CAAC,CAAC,CAAC;oBACP,CAAC,EAAE,WAAW,CAAC,CAAC;oBAChB,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClB,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE;oBACV,aAAa,CAAC,KAAK,CAAC,CAAC;oBACrB,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { accountAudience, userAudience } from \"@parlor/agent-ui/server\";\nimport {\n type DataProvider,\n DEV_USER_ID,\n type Principal,\n type Tag,\n type UserId,\n userOf,\n} from \"@parlor/core\";\nimport { REVOCATION_HORIZON_MS, type ServerPlugin } from \"@parlor/server\";\n\nimport type { ChatOwner } from \"../model.js\";\nimport { CHAT_PLUGIN } from \"../protocol.js\";\nimport {\n CHAT_TAG,\n type ChatActionDeps,\n chatActions,\n HOSTS_TAG,\n hostSession,\n} from \"./actions.js\";\nimport { inProcessRelay, type LiveRelay } from \"./live.js\";\nimport { CHAT_MIGRATIONS } from \"./migrations.js\";\nimport { turnPush } from \"./push.js\";\nimport { chatRoutes } from \"./routes.js\";\nimport { type ChatDb, sqlChatStore } from \"./store.js\";\n\nexport {\n CHAT_ACTIVITY_TAG,\n CHAT_TAG,\n type ChatActionDeps,\n type ChatActionMap,\n type ChatActionRegistry,\n chatActions,\n type ChatHostActionMap,\n type ChatUserActionMap,\n HOST_GRANTS_TAG,\n hostChatActions,\n HOSTS_TAG,\n userChatActions,\n} from \"./actions.js\";\nexport {\n TRANSCRIPT_BUDGET_BYTES,\n turnContext,\n type TurnContextInput,\n} from \"./context.js\";\nexport { chatItemBodies, hostItemDraft } from \"../items.js\";\nexport { idSchema } from \"../id-schemas.js\";\nexport {\n inProcessRelay,\n type LiveRelay,\n MAX_OPEN_BYTES_PER_TURN,\n MAX_OPEN_TURNS,\n} from \"./live.js\";\nexport { CHAT_MIGRATIONS } from \"./migrations.js\";\nexport { CHAT_PLUGIN } from \"../protocol.js\";\nexport {\n type ChatActionConfig,\n chatAction,\n type ChatHost,\n type ChatUser,\n type Party,\n type PartyOf,\n} from \"./party.js\";\nexport { chatRoutes, type ChatRouteDeps, MAX_STREAM_BODY_BYTES } from \"./routes.js\";\nexport {\n type ChatDb,\n type ChatStore,\n type Lapsed,\n type NewTurn,\n sqlChatStore,\n type StreamTurn,\n type TurnHolder,\n type UserDraft,\n} from \"./store.js\";\n\n/** Chat then serves nothing, so the client reads `useChat().status` as `unavailable`. */\nexport const UNAVAILABLE_WITHOUT_AUTH =\n \"chat() is unavailable: no auth provider is configured, so every action runs without a signed-in user.\";\n\nexport const AUTH_UNDEFINED =\n \"auth is undefined. Check the environment variables your auth setup reads, or remove the auth option to run without sign-in.\";\n\n/** Outlives a 30 s network drop plus a 5 s reconnect. */\nexport const DEFAULT_LEASE_MS = 60_000;\nexport const DEFAULT_HEARTBEAT_MS = 30_000;\nexport const DEFAULT_MAX_QUEUED = 4;\n\n/** Who asks to use the chat, with what the server knows to decide. */\nexport interface ChatAccessRequest {\n /** Whose chat it is: the signed-in user, or the user a connected computer works for. */\n readonly userId: UserId;\n readonly principal: Principal;\n readonly scope: string;\n readonly database: DataProvider;\n}\n\nexport type ChatAccess = (request: ChatAccessRequest) => boolean | Promise<boolean>;\n\nexport interface ChatOptions {\n /**\n * Who may use the agent; everyone signed in when absent. A refused user can neither read\n * nor send, their computers take no turns, and auth pairs no computer or device for them.\n */\n readonly access?: ChatAccess | undefined;\n /** App notes for the agent in every fresh session's context, such as an AGENTS.md excerpt. */\n readonly instructions?: string | undefined;\n readonly leaseMs?: number | undefined;\n readonly maxQueued?: number | undefined;\n /** Defaults to `inProcessRelay`; a multi-instance deployment passes one that crosses instances. */\n readonly relay?: (() => LiveRelay) | undefined;\n}\n\n/** A lease past the revocation memory would outlive the revocation of its grant. */\nexport const MAX_LEASE_MS = REVOCATION_HORIZON_MS;\n\nfunction positiveInteger(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`chat(): ${name} must be a positive whole number, got ${value}.`);\n }\n return value;\n}\n\n/**\n * The inline agent's server half: the `parlor_chat_*` log, the user and host actions, the\n * `chat` channel, and the host-only stream and heartbeat routes.\n */\nexport function chat(options: ChatOptions = {}): ServerPlugin {\n return {\n name: CHAT_PLUGIN,\n migrations: CHAT_MIGRATIONS,\n setup(host) {\n const leaseMs = positiveInteger(\"leaseMs\", options.leaseMs ?? DEFAULT_LEASE_MS);\n const maxQueued = positiveInteger(\n \"maxQueued\",\n options.maxQueued ?? DEFAULT_MAX_QUEUED,\n );\n if (leaseMs > MAX_LEASE_MS) {\n throw new Error(\n `chat(): leaseMs ${leaseMs} is above ${MAX_LEASE_MS}, the longest a revoked computer's turn token can be kept out.`,\n );\n }\n const { auth, database } = host;\n if (!database) throw new Error(\"chat() needs a database.\");\n if (!auth?.delegate) {\n if (host.authMisconfigured) throw new Error(AUTH_UNDEFINED);\n console.warn(UNAVAILABLE_WITHOUT_AUTH);\n return {};\n }\n const relay = (options.relay ?? inProcessRelay)();\n const db = () => database.read() as ChatDb;\n const ownStream = (owner: ChatOwner) =>\n accountAudience(owner.userId) ?? userAudience(owner.scope, owner.userId);\n const transact: ChatActionDeps[\"transact\"] = (owner, work) =>\n database.transaction(async (tx) => {\n const { result, threadId } = await work(tx as ChatDb);\n if (threadId !== undefined)\n await host.announce(ownStream(owner), [[CHAT_TAG, threadId]], tx);\n return result;\n });\n const heartbeatMs = DEFAULT_HEARTBEAT_MS;\n const reconcile = async (owner?: ChatOwner) => {\n if (!(await sqlChatStore.hasLapsed(db(), owner))) return;\n await database.transaction(async (tx) => {\n for (const change of await sqlChatStore.expireLapsed(tx as ChatDb, owner)) {\n const tags: Tag[] = [\n ...change.threads.map((threadId) => [CHAT_TAG, threadId]),\n ...change.hosts.map((hostId) => [HOSTS_TAG, hostId]),\n ];\n await host.announce(ownStream(change), tags, tx);\n }\n });\n };\n const pruneHosts: ChatActionDeps[\"pruneHosts\"] = async (owner, hostIds) => {\n try {\n await database.transaction((tx) =>\n sqlChatStore.pruneHosts(tx as ChatDb, owner, hostIds),\n );\n } catch (error) {\n console.warn(\"[parlor] chat: pruning revoked computers failed:\", error);\n }\n };\n let sweep: ReturnType<typeof setInterval> | undefined;\n const deps: ChatActionDeps = {\n enforcing: auth.enforcing,\n transact,\n reconcile,\n pruneHosts,\n auth,\n store: sqlChatStore,\n relay,\n leaseMs,\n heartbeatMs,\n maxQueued,\n instructions: options.instructions,\n appName: process.env.PARLOR_APP_NAME ?? \"this app\",\n appOrigin: () => process.env.PARLOR_ORIGIN ?? process.env.PARLOR_WEB_ORIGIN ?? \"\",\n };\n const session = hostSession(deps);\n const pushed = turnPush({ relay, session, db });\n const actions = chatActions({ ...deps, pushed }, session);\n const { access } = options;\n return {\n actions,\n ...(access\n ? {\n allows: ({ principal, scope }) =>\n access({\n userId: userOf(principal) ?? DEV_USER_ID,\n principal,\n scope,\n database,\n }),\n }\n : {}),\n routes: chatRoutes({\n db,\n store: sqlChatStore,\n relay,\n heartbeatMs,\n reconcile,\n announceHost: (owner, hostId) =>\n host.announce(ownStream(owner), [[HOSTS_TAG, hostId]]),\n }),\n channel: relay.channel,\n start: () => {\n sweep = setInterval(() => {\n (host.ready?.() ?? Promise.resolve())\n .then(() => reconcile())\n .catch((error: unknown) => {\n console.warn(\"[parlor] chat: sweeping lapsed turns failed:\", error);\n });\n }, heartbeatMs);\n sweep.unref?.();\n },\n close: () => {\n clearInterval(sweep);\n pushed.close();\n relay.close();\n },\n };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { accountAudience, userAudience } from \"@parlor/agent-ui/server\";\nimport {\n type DataProvider,\n DEV_USER_ID,\n type Principal,\n type Tag,\n type UserId,\n userOf,\n} from \"@parlor/core\";\nimport { REVOCATION_HORIZON_MS, type ServerPlugin } from \"@parlor/server\";\n\nimport type { ChatOwner } from \"../model.js\";\nimport { CHAT_PLUGIN } from \"../protocol.js\";\nimport {\n CHAT_TAG,\n type ChatActionDeps,\n chatActions,\n HOSTS_TAG,\n hostSession,\n} from \"./actions.js\";\nimport { inProcessRelay, type LiveRelay } from \"./live.js\";\nimport { CHAT_MIGRATIONS } from \"./migrations.js\";\nimport { turnPush } from \"./push.js\";\nimport { chatRoutes } from \"./routes.js\";\nimport { type ChatDb, sqlChatStore } from \"./store.js\";\n\nexport {\n CHAT_ACTIVITY_TAG,\n CHAT_TAG,\n type ChatActionDeps,\n type ChatActionMap,\n type ChatActionRegistry,\n chatActions,\n type ChatHostActionMap,\n type ChatUserActionMap,\n HOST_GRANTS_TAG,\n hostChatActions,\n HOSTS_TAG,\n userChatActions,\n} from \"./actions.js\";\nexport {\n TRANSCRIPT_BUDGET_BYTES,\n turnContext,\n type TurnContextInput,\n} from \"./context.js\";\nexport { chatItemBodies, hostItemDraft } from \"../items.js\";\nexport { idSchema } from \"../id-schemas.js\";\nexport {\n inProcessRelay,\n type LiveRelay,\n MAX_OPEN_BYTES_PER_TURN,\n MAX_OPEN_TURNS,\n} from \"./live.js\";\nexport { CHAT_MIGRATIONS } from \"./migrations.js\";\nexport { CHAT_PLUGIN } from \"../protocol.js\";\nexport {\n type ChatActionConfig,\n chatAction,\n type ChatHost,\n type ChatUser,\n type Party,\n type PartyOf,\n} from \"./party.js\";\nexport { chatRoutes, type ChatRouteDeps, MAX_STREAM_BODY_BYTES } from \"./routes.js\";\nexport {\n type ChatDb,\n type ChatStore,\n type Lapsed,\n type NewTurn,\n sqlChatStore,\n type StreamTurn,\n type TurnHolder,\n type UserDraft,\n} from \"./store.js\";\n\n/** Chat then serves nothing, so the client reads `useChat().status` as `unavailable`. */\nexport const UNAVAILABLE_WITHOUT_AUTH =\n \"chat() is unavailable: no auth provider is configured, so every action runs without a signed-in user.\";\n\nexport const AUTH_UNDEFINED =\n \"auth is undefined. Check the environment variables your auth setup reads, or remove the auth option to run without sign-in.\";\n\n/** Outlives a 30 s network drop plus a 5 s reconnect. */\nexport const DEFAULT_LEASE_MS = 60_000;\nexport const DEFAULT_HEARTBEAT_MS = 30_000;\nexport const DEFAULT_MAX_QUEUED = 4;\n\n/** Who asks to use the chat, with what the server knows to decide. */\nexport interface ChatAccessRequest {\n /** Whose chat it is: the signed-in user, or the user a connected computer works for. */\n readonly userId: UserId;\n readonly principal: Principal;\n readonly scope: string;\n readonly database: DataProvider;\n}\n\nexport type ChatAccess = (request: ChatAccessRequest) => boolean | Promise<boolean>;\n\nexport interface ChatOptions {\n /**\n * Who may use the agent; everyone signed in when absent. A refused user can neither read\n * nor send, their computers take no turns, and auth pairs no computer or device for them.\n */\n readonly access?: ChatAccess | undefined;\n /** App notes for the agent in every fresh session's context, such as an AGENTS.md excerpt. */\n readonly instructions?: string | undefined;\n readonly leaseMs?: number | undefined;\n readonly maxQueued?: number | undefined;\n /** Defaults to `inProcessRelay`; a multi-instance deployment passes one that crosses instances. */\n readonly relay?: (() => LiveRelay) | undefined;\n}\n\n/** A lease past the revocation memory would outlive the revocation of its grant. */\nexport const MAX_LEASE_MS = REVOCATION_HORIZON_MS;\n\nfunction positiveInteger(name: string, value: number): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`chat(): ${name} must be a positive whole number, got ${value}.`);\n }\n return value;\n}\n\n/**\n * The inline agent's server half: the `parlor_chat_*` log, the user and host actions, the\n * `chat` channel, and the host-only stream and heartbeat routes.\n */\nexport function chat(options: ChatOptions = {}): ServerPlugin {\n return {\n name: CHAT_PLUGIN,\n migrations: CHAT_MIGRATIONS,\n setup(host) {\n const leaseMs = positiveInteger(\"leaseMs\", options.leaseMs ?? DEFAULT_LEASE_MS);\n const maxQueued = positiveInteger(\n \"maxQueued\",\n options.maxQueued ?? DEFAULT_MAX_QUEUED,\n );\n if (leaseMs > MAX_LEASE_MS) {\n throw new Error(\n `chat(): leaseMs ${leaseMs} is above ${MAX_LEASE_MS}, the longest a revoked computer's turn token can be kept out.`,\n );\n }\n const { auth, database } = host;\n if (!database) throw new Error(\"chat() needs a database.\");\n if (!auth?.delegate) {\n if (host.authMisconfigured) throw new Error(AUTH_UNDEFINED);\n console.warn(UNAVAILABLE_WITHOUT_AUTH);\n return {};\n }\n const relay = (options.relay ?? inProcessRelay)();\n const db = () => database.read() as ChatDb;\n const ownStream = (owner: ChatOwner) =>\n accountAudience(owner.userId) ?? userAudience(owner.scope, owner.userId);\n const transact: ChatActionDeps[\"transact\"] = (owner, work) =>\n database.transaction(async (tx) => {\n const { result, threadId } = await work(tx as ChatDb);\n if (threadId !== undefined)\n await host.announce(ownStream(owner), [[CHAT_TAG, threadId]], tx);\n return result;\n });\n const heartbeatMs = DEFAULT_HEARTBEAT_MS;\n const reconcile = async (owner?: ChatOwner) => {\n if (!(await sqlChatStore.hasLapsed(db(), owner))) return;\n await database.transaction(async (tx) => {\n for (const change of await sqlChatStore.expireLapsed(tx as ChatDb, owner)) {\n const tags: Tag[] = [\n ...change.threads.map((threadId) => [CHAT_TAG, threadId]),\n ...change.hosts.map((hostId) => [HOSTS_TAG, hostId]),\n ];\n await host.announce(ownStream(change), tags, tx);\n }\n });\n };\n const pruneHosts: ChatActionDeps[\"pruneHosts\"] = async (owner, hostIds) => {\n try {\n await database.transaction((tx) =>\n sqlChatStore.pruneHosts(tx as ChatDb, owner, hostIds),\n );\n } catch (error) {\n console.warn(\"[parlor] chat: pruning revoked computers failed:\", error);\n }\n };\n let sweep: ReturnType<typeof setInterval> | undefined;\n const deps: ChatActionDeps = {\n enforcing: auth.enforcing,\n transact,\n reconcile,\n pruneHosts,\n announce: (owner, tags) => host.announce(ownStream(owner), tags),\n auth,\n store: sqlChatStore,\n relay,\n leaseMs,\n heartbeatMs,\n maxQueued,\n instructions: options.instructions,\n appName: process.env.PARLOR_APP_NAME ?? \"this app\",\n appOrigin: () => process.env.PARLOR_ORIGIN ?? process.env.PARLOR_WEB_ORIGIN ?? \"\",\n };\n const session = hostSession(deps);\n const pushed = turnPush({ relay, session, db });\n const actions = chatActions({ ...deps, pushed }, session);\n const { access } = options;\n return {\n actions,\n ...(access\n ? {\n allows: ({ principal, scope }) =>\n access({\n userId: userOf(principal) ?? DEV_USER_ID,\n principal,\n scope,\n database,\n }),\n }\n : {}),\n routes: chatRoutes({\n db,\n store: sqlChatStore,\n relay,\n heartbeatMs,\n reconcile,\n announceHost: (owner, hostId) =>\n host.announce(ownStream(owner), [[HOSTS_TAG, hostId]]),\n }),\n channel: relay.channel,\n start: () => {\n sweep = setInterval(() => {\n (host.ready?.() ?? Promise.resolve())\n .then(() => reconcile())\n .catch((error: unknown) => {\n console.warn(\"[parlor] chat: sweeping lapsed turns failed:\", error);\n });\n }, heartbeatMs);\n sweep.unref?.();\n },\n close: () => {\n clearInterval(sweep);\n pushed.close();\n relay.close();\n },\n };\n },\n };\n}\n"]}
|
package/dist/tags.d.ts
CHANGED
|
@@ -6,4 +6,6 @@ export declare const HOSTS_TAG = "parlor_chat_hosts";
|
|
|
6
6
|
export declare const CHAT_ACTIVITY_TAG = "parlor_chat_activity";
|
|
7
7
|
/** Emitted when a tab asks the user's computers to look again for the agents installed on them. */
|
|
8
8
|
export declare const CHAT_AGENTS_CHECK_TAG = "parlor_chat_agents_check";
|
|
9
|
+
/** `[tag, hostId, agentId]`: a tab may soon start a thread with that agent, so its computer starts it now. */
|
|
10
|
+
export declare const CHAT_AGENT_WARM_TAG = "parlor_chat_agent_warm";
|
|
9
11
|
//# sourceMappingURL=tags.d.ts.map
|
package/dist/tags.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAC7C,+GAA+G;AAC/G,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AACxD,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,iEAAiE;AACjE,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAC7C,+GAA+G;AAC/G,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AACxD,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,8GAA8G;AAC9G,eAAO,MAAM,mBAAmB,2BAA2B,CAAC"}
|
package/dist/tags.js
CHANGED
|
@@ -6,4 +6,6 @@ export const HOSTS_TAG = "parlor_chat_hosts";
|
|
|
6
6
|
export const CHAT_ACTIVITY_TAG = "parlor_chat_activity";
|
|
7
7
|
/** Emitted when a tab asks the user's computers to look again for the agents installed on them. */
|
|
8
8
|
export const CHAT_AGENTS_CHECK_TAG = "parlor_chat_agents_check";
|
|
9
|
+
/** `[tag, hostId, agentId]`: a tab may soon start a thread with that agent, so its computer starts it now. */
|
|
10
|
+
export const CHAT_AGENT_WARM_TAG = "parlor_chat_agent_warm";
|
|
9
11
|
//# sourceMappingURL=tags.js.map
|
package/dist/tags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAC7C,+GAA+G;AAC/G,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACxD,mGAAmG;AACnG,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC","sourcesContent":["/** Every chat write emits `[\"parlor_chat\", threadId]`, the one event that wakes hosts and other devices. */\nexport const CHAT_TAG = \"parlor_chat\";\n/** Emitted when a computer comes, goes or changes its agents. */\nexport const HOSTS_TAG = \"parlor_chat_hosts\";\n/** Emitted when a signed-in tab is in use, carrying no thread, item or text; it wakes no host's claim loop. */\nexport const CHAT_ACTIVITY_TAG = \"parlor_chat_activity\";\n/** Emitted when a tab asks the user's computers to look again for the agents installed on them. */\nexport const CHAT_AGENTS_CHECK_TAG = \"parlor_chat_agents_check\";\n"]}
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,iEAAiE;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAC7C,+GAA+G;AAC/G,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACxD,mGAAmG;AACnG,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAChE,8GAA8G;AAC9G,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC","sourcesContent":["/** Every chat write emits `[\"parlor_chat\", threadId]`, the one event that wakes hosts and other devices. */\nexport const CHAT_TAG = \"parlor_chat\";\n/** Emitted when a computer comes, goes or changes its agents. */\nexport const HOSTS_TAG = \"parlor_chat_hosts\";\n/** Emitted when a signed-in tab is in use, carrying no thread, item or text; it wakes no host's claim loop. */\nexport const CHAT_ACTIVITY_TAG = \"parlor_chat_activity\";\n/** Emitted when a tab asks the user's computers to look again for the agents installed on them. */\nexport const CHAT_AGENTS_CHECK_TAG = \"parlor_chat_agents_check\";\n/** `[tag, hostId, agentId]`: a tab may soon start a thread with that agent, so its computer starts it now. */\nexport const CHAT_AGENT_WARM_TAG = \"parlor_chat_agent_warm\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parlor/chat",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"homepage": "https://cychien.github.io/parlor",
|
|
5
5
|
"bugs": "https://github.com/cychien/parlor/issues",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,16 +31,16 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"drizzle-orm": "^0.45.4",
|
|
33
33
|
"zod": "^4.6.5",
|
|
34
|
-
"@parlor/
|
|
35
|
-
"@parlor/
|
|
36
|
-
"@parlor/
|
|
37
|
-
"@parlor/sync": "0.4.
|
|
34
|
+
"@parlor/server": "0.4.5",
|
|
35
|
+
"@parlor/agent-ui": "0.4.5",
|
|
36
|
+
"@parlor/core": "0.4.5",
|
|
37
|
+
"@parlor/sync": "0.4.5"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^24.14.0",
|
|
41
41
|
"typescript": "^7.0.2",
|
|
42
42
|
"vitest": "^5.0.3",
|
|
43
|
-
"@parlor/data": "0.4.
|
|
43
|
+
"@parlor/data": "0.4.5"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
46
|
"build": "tsc -p tsconfig.json",
|