@parlor/agent-host 0.4.4 → 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/daemon.d.ts.map +1 -1
- package/dist/daemon.js +24 -1
- package/dist/daemon.js.map +1 -1
- package/dist/link.d.ts +2 -0
- package/dist/link.d.ts.map +1 -1
- package/dist/link.js +16 -1
- package/dist/link.js.map +1 -1
- package/dist/mcp-proxy.d.ts +2 -0
- package/dist/mcp-proxy.d.ts.map +1 -1
- package/dist/mcp-proxy.js +22 -2
- package/dist/mcp-proxy.js.map +1 -1
- package/dist/pool.d.ts +10 -0
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +52 -0
- package/dist/pool.js.map +1 -1
- package/dist/testing/fake-agent.d.ts.map +1 -1
- package/dist/testing/fake-agent.js +4 -1
- package/dist/testing/fake-agent.js.map +1 -1
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +22 -21
- package/dist/turn.js.map +1 -1
- package/dist/warm.d.ts +29 -0
- package/dist/warm.d.ts.map +1 -0
- package/dist/warm.js +68 -0
- package/dist/warm.js.map +1 -0
- package/package.json +9 -9
package/dist/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAY9C,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMzF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,eAAe,CAAC;AAI9D,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,cAAc,CAAC;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAY9C,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMzF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,eAAe,CAAC;AAI9D,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,cAAc,CAAC;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,6GAA6G;IAC7G,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,kFAAkF;IAClF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IACnE,kFAAkF;IAClF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChF,4EAA4E;IAC5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,sFAAsF;AACtF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAiBD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,GAAG,SAAuB,GACtC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAWD,6FAA6F;AAC7F,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,wBAAwB;IAC9C,cAEC;CACF;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAq1BhE"}
|
package/dist/daemon.js
CHANGED
|
@@ -26,6 +26,7 @@ import { selfEntry } from "./self.js";
|
|
|
26
26
|
import { installLoginItem, installRelease } from "./service.js";
|
|
27
27
|
import { agentEnvironment, rereadAgentPath } from "./shell-path.js";
|
|
28
28
|
import { runTurn } from "./turn.js";
|
|
29
|
+
import { warmAgent } from "./warm.js";
|
|
29
30
|
const CONNECT_TIMEOUT_MS = 15_000;
|
|
30
31
|
/** An agent token is asked for again this long before it runs out. */
|
|
31
32
|
const AGENT_TOKEN_MARGIN_MS = 60_000;
|
|
@@ -156,6 +157,27 @@ export function createHostDaemon(deps) {
|
|
|
156
157
|
const drained = new Promise((resolve) => (finishHandover = resolve));
|
|
157
158
|
/** A turn runs once here, even when a pushed turn its app took back is claimed again. */
|
|
158
159
|
const runningTurns = new Set();
|
|
160
|
+
const policyFor = (grant) => grant.dev ? Promise.resolve(DEV_POLICY) : loadPolicy(paths.policy, deps.policy);
|
|
161
|
+
const warming = new Set();
|
|
162
|
+
const warm = (state, agentId) => {
|
|
163
|
+
const { link } = state;
|
|
164
|
+
const key = `${link.grant.appOrigin}\n${agentId}`;
|
|
165
|
+
if (warming.has(key) || stopping.signal.aborted)
|
|
166
|
+
return;
|
|
167
|
+
warming.add(key);
|
|
168
|
+
void policyFor(link.grant)
|
|
169
|
+
.then((policy) => warmAgent(agentId, {
|
|
170
|
+
link,
|
|
171
|
+
profiles,
|
|
172
|
+
launcher: deps.launcher,
|
|
173
|
+
pool: deps.pool,
|
|
174
|
+
proxy: deps.proxy,
|
|
175
|
+
policy,
|
|
176
|
+
}))
|
|
177
|
+
.then((outcome) => logEvent("agent_warmed", { appOrigin: link.grant.appOrigin, agentId, outcome }))
|
|
178
|
+
.catch(() => undefined)
|
|
179
|
+
.finally(() => warming.delete(key));
|
|
180
|
+
};
|
|
159
181
|
const run = (state, claimed, how = "claimed") => {
|
|
160
182
|
const { link } = state;
|
|
161
183
|
if (runningTurns.has(claimed.turnId))
|
|
@@ -166,7 +188,7 @@ export function createHostDaemon(deps) {
|
|
|
166
188
|
turnId: claimed.turnId,
|
|
167
189
|
});
|
|
168
190
|
state.turns += 1;
|
|
169
|
-
const turn = (link.grant
|
|
191
|
+
const turn = policyFor(link.grant)
|
|
170
192
|
.then((policy) => runTurn(claimed, {
|
|
171
193
|
link,
|
|
172
194
|
profiles,
|
|
@@ -421,6 +443,7 @@ export function createHostDaemon(deps) {
|
|
|
421
443
|
fetch: (input, init) => fetch(input, init),
|
|
422
444
|
onWake: () => wake(state),
|
|
423
445
|
onAgentsCheck: () => void checkAgents(),
|
|
446
|
+
onWarm: (_link, agentId) => warm(state, agentId),
|
|
424
447
|
onPushed: (_link, turn) => {
|
|
425
448
|
// Tells the app this computer has the turn, while it already starts on it.
|
|
426
449
|
void link.api.calls
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,OAAO,EACP,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAA4B,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAGL,aAAa,GAEd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,UAAU,EAEV,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAqB,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAiB,WAAW,EAAkC,MAAM,aAAa,CAAC;AACzF,OAAO,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAgB,aAAa,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,eAAe,EAAiB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAsB,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAoB,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,sEAAsE;AACtE,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,SAAS,mBAAmB,CAC1B,KAAe,EACf,OAA2D;IAE3D,OAAO,OAAO,CAAC,MAAM,KAAK,cAAc;QACtC,CAAC,CAAC,6BAA6B,KAAK,CAAC,OAAO,6BAA6B,aAAa,SAAS,KAAK,CAAC,OAAO,UAAU,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG;QAC9I,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,4DAA4D,OAAO,CAAC,SAAS,CAAC,GAAG,6BAA6B,aAAa,GAAG,CAAC;AACrJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAY,EACZ,KAAK,GAAuB,SAAS,EAAE;IAEvC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YAC7D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,MAAM,SAAS,CACb,IAAI,EACJ,mBAAmB,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,EAC9E,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACpD,CAAC;AAgBD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzB,IAAI,GAAG,oBAAoB,CAAC;IAC9C;QACE,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,iGAAiG;IACjG,IAAI,cAAc,GAA4B,EAAE,CAAC;IACjD,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,MAAM,GAAgB,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,OAA2B,CAAC;IAChC,IAAI,OAAO,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,KAAK,GAAG,KAAK,EAAE,IAAa,EAAoC,EAAE;QACtE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;gBAClE,QAAQ,CAAC,cAAc,EAAE;oBACvB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;oBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,gGAAgG;IAChG,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,IAAiB,EAAE,EAAE;QACnD,KAAK,OAAO;aACT,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;aACpB,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClF,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,gFAAgF;IAChF,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,kGAAkG;IAClG,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QAChD,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,mBAAmB;YAAE,OAAO;QACxE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CACzE,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB;;;OAGG;IACH,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAClD,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,SAAS;YACtC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClF,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YACpC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACjF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACzC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,cAAc,GAAe,GAAG,EAAE,CAAC,SAAS,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAE3E,yFAAyF;IACzF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,MAAM,GAAG,GAAG,CACV,KAAgB,EAChB,OAAoB,EACpB,GAAG,GAAyB,SAAS,EACrC,EAAE;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QACvB,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO;QAC7C,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,EAAE;YAC1D,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,CACX,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CACrF;aACE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,OAAO,CAAC,OAAO,EAAE;YACf,IAAI;YACJ,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE;gBACL,GAAG,IAAI,CAAC,KAAK;gBACb,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;oBAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACxC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;oBACpC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC7C,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5C,CAAC;aACF;YACD,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK,IAAI,EAAE,CACjB,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa;gBAC9D,MAAM,EAAE,KAAK,IAAI,EAAE;oBACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC1D,IAAI,CAAC,KAAK,EAAE,aAAa;wBAAE,OAAO;oBAClC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;oBAChD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;aACF;SACF,CAAC,CACH;aACA,IAAI,CACH,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAC3E,CAAC,KAAc,EAAE,EAAE,CACjB,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAC9E;aACA,OAAO,CAAC,GAAG,EAAE;YACZ,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,KAAK,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACrB,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,KAAgB,EAAE,EAAE;QAC3C,GAAG,CAAC;YACF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,KACE,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EACrC,OAAO,EACP,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC7E,CAAC;gBACD,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,QAAQ,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;IACzD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAgB,EAAE,EAAE;QAChC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QAC1C,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7C,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,KAAK;YAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAmB,EAAE,CAAC,CAAC;QACvC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACpC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAChD;QACD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC;QACnD,GAAG,EAAE,gBAAgB;KACtB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,KAA2B,EAA8B,EAAE;QAC1E,MAAM,KAAK,GAAG,KAAK,EAAE,UAAU,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO,SAAS,CAAC;QACzE,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC,CAAC;IAEF,+FAA+F;IAC/F,MAAM,WAAW,GAAG,KAAK,EAAE,KAAe,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QAC/B,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO;QAC5E,MAAM,gBAAgB,CACpB,KAAK,CAAC,MAAM,EACZ;YACE,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI;SACnD,EACD,MAAM,gBAAgB,EAAE,CACzB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,SAAS,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IACpD,0GAA0G;IAC1G,MAAM,QAAQ,GAAG,CAAI,IAAsB,EAAc,EAAE;QACzD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,uFAAuF;IACvF,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAqB,EAAE,CAC9D,QAAQ,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7C,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAe,EAAqB,EAAE;QACvE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,KAAK,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,IAAI,GAAa,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,CAAC;QAC7E,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,yFAAyF;IACzF,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CACzC,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK;YAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEL,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAe,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QAC/B,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QACvE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CACzC,EAAE,GAAG,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EACnC,KAAK,CACN,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAa;YACrB,GAAG,KAAK;YACR,UAAU,EAAE;gBACV,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;aAChD;SACF,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAI,QAAmC,CAAC;IACxC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB;;;OAGG;IACH,MAAM,WAAW,GAAG,GAAkB,EAAE;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;YACrB,GAAG,CAAC;gBACF,UAAU,GAAG,KAAK,CAAC;gBACnB,MAAM,eAAe,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC/C,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC1B,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC7C,MAAM,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAC9D,QAAQ,CAAC,oBAAoB,EAAE;wBAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;qBACrB,CAAC,CACH,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAC/E,CAAC;gBACF,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC,QAAQ,UAAU,EAAE;QACvB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,KAA2B,EAAE,EAAE,CACvD,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,KAAK,GAAG,KAAK,EAAE,UAAU,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO;QAClD,MAAM,oBAAoB,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,gBAAgB,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEL,MAAM,WAAW,GAAG,IAAI,GAAG,EAGxB,CAAC;IACJ,gGAAgG;IAChG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QACtE,OAAO;YACL,SAAS;YACT,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI;YAClD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrB,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE;oBAC7D,OAAO,IAAI,CAAC,KAAK,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;oBAAE,MAAM,IAAI,eAAe,EAAE,CAAC;gBACnE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE;oBAC9D,KAAK,EAAE,GAAG,KAAK,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iBAC3C,CAAC,CAAC;gBACH,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5B,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAC1B,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,aAAa;gBACpB,QAAQ;gBACR,OAAO,EAAE;oBACP,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBAC/B,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE;iBACrC;aACF,CAAC,CAAC,KAAK,OAAO;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,KAAK,EAAE,KAAe,EAAE,EAAE;QACvC,MAAM,gBAAgB,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;gBAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC;QACD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAe,EAAE,IAAc,EAAa,EAAE;QAC1D,KAAK,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAgB,CAAC;QACrB,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE;YAChC,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACjC,QAAQ,EAAE,IAAI;YACd,QAAQ;YACR,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;YAC1C,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK,WAAW,EAAE;YACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACxB,2EAA2E;gBAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK;qBAChB,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;qBACtD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1B,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;YAC3B,SAAS,EAAE,GAAG,EAAE;gBACd,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK;oBAAE,OAAO;gBACxC,IAAI,KAAK,CAAC,GAAG;oBAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;qBAC/B,CAAC;oBACJ,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC;oBACjE,KAAK,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC;yBAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;yBACzB,IAAI,CAAC,GAAG,EAAE,CACT,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CACtE,CAAC;gBACN,CAAC;YACH,CAAC;YACD,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;gBACnC,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC7D,CAAC;SACF,CAAC,CAAC;QACH,KAAK,GAAG;YACN,IAAI;YACJ,IAAI;YACJ,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,SAAS;YACvB,KAAK,EAAE,CAAC;SACT,CAAC;QACF,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,KAAgB,EAAE,EAAE;QAC/C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC3C,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,GAAG,KAAK,SAAS;gBAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;QAC5D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3E,CAAC,CAAC;IAEF,iGAAiG;IACjG,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;QAC7C,OAAO,OAAO;aACX,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;aAC5B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,KAAK,EAAE,EAAE,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE;YACvC,CAAC,CAAC,KAAK,CACV,CAAC;IACN,CAAC,CAAC;IAEF,kGAAkG;IAClG,MAAM,MAAM,GAAG,KAAK,EAAE,KAAgB,EAAE,aAAa,GAAG,KAAK,EAAE,EAAE;QAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE;YACvD,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/C,GAAG,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/C,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,EAC1D,kBAAkB,CACnB,CACF,CAAC;QACF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAC9E,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAqB,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,CAAC;aACvD,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAA0C,CAAC;aAC3E,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO;YACL,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI;YACpD,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;YACnD,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,EAAE,IAAI;SACV,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAE,EAAE;QACzD,MAAM,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACpC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAe,EAAE,EAAE;QACzC,MAAM,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO;QAC5C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAoB,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;QAC7B,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC,CAAC;IAEN,MAAM,MAAM,GAAkB;QAC5B,OAAO;QACP,KAAK,CAAC,KAAK;YACT,IAAI,aAA0B,CAAC;YAC/B,IAAI,WAAsC,CAAC;YAC3C,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9C,aAAa,GAAG,OAAO,CAAC;gBACxB,WAAW,GAAG,MAAM,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,MAAM,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;oBAC7D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACtD,IAAI,SAAS,EAAE,CAAC;wBACd,SAAS,CAAC,KAAK,EAAE,CAAC;wBAClB,MAAM,IAAI,kBAAkB,EAAE,CAAC;oBACjC,CAAC;oBACD,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBACtE,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBAC1C,OAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;wBAC/B,OAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClD,CAAC,CAAC,CAAC;oBACH,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;gBACpD,MAAM,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,cAAc,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;gBAC/C,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC1B,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,aAAa,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,QAAQ,CAAC,gBAAgB,EAAE;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChC,CAAC,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7C,IAAI,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBAC7B,KAAK,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC7D,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CACjE,QAAQ,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,SAAS;YACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC5B,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACvC,IAAI,OAAO;gBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE;YAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,CAAC,EAAE;gBAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,KAAK;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAS;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;YACtE,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,GAAG,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,CAAC;oBAChB,SAAS;oBACT,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;iBAC1D,CAAC,CAAC;YACL,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAC3C,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,IAAI,UAAU;gBAAE,OAAO;YACvB,UAAU,GAAG,IAAI,CAAC;YAClB,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,OAAO,CAAC;YACxB,OAAO,GAAG,SAAS,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,CAAC;YACjB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACpF,QAAQ,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,CAAC,IAAI;YACR,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAChC,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE;wBACtC,MAAM,EAAE,KAAK;wBACb,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;qBAChD,CAAC;oBACF,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;iBACjE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAC1B,CACF,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAAE,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3E,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,OAAO,CAAC;YACxB,OAAO,GAAG,SAAS,CAAC;YACpB,IAAI,OAAO;gBAAE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClF,IAAI,CAAC,UAAU;gBAAE,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,SAAS;YAAE,OAAO;QACzD,SAAS,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAAE,MAAM,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAC/E,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CACd,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5B,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;YACjD,CAAC,CAAC,CACL,CACF,CAAC;YACF,QAAQ,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,MAAc,EAAE,SAAiB,EAAoB,EAAE;QAC/E,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACtD,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEjD,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAC1B,OAA0E,EACxD,EAAE;QACpB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;QAClF,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,OAAqD,CAAC;QAC1D,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC;gBAAE,MAAM,KAAK,CAAC;YACpD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACjE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE;gBACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;gBACzC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,GAAG,EAAE,SAAS;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,OAAuB,EAAoB,EAAE;QACjE,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO;YAAE,MAAM,OAAO,CAAC;QAC1C,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;YACnB,KAAK,OAAO;gBACV,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,KAAK,UAAU;gBACb,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACvD,KAAK,QAAQ;gBACX,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC5D,KAAK,qBAAqB,EAAE,CAAC;gBAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACnC,OAAO;wBACL,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,yCAAyC,QAAQ,CAAC,OAAO,GAAG;qBACpE,CAAC;gBACJ,CAAC;gBACD,MAAM,OAAO,GAAG,iBAAiB,CAAC;oBAChC,SAAS,EAAE,MAAM;oBACjB,QAAQ,EAAE,IAAI;oBACd,QAAQ;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,aAAa,EAAE,KAAK,CAAC,UAAU;iBAChC,CAAC,CAAC;gBACH,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACpC,QAAQ,CAAC,qBAAqB,EAAE;oBAC9B,SAAS,EAAE,MAAM;oBACjB,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACtC,CAAC;YACD,KAAK,sBAAsB,EAAE,CAAC;gBAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACtD,IAAI,CAAC,OAAO;oBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;gBAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/D,CAAC;YACD,KAAK,uBAAuB;gBAC1B,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,SAAS,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC3D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7D,CAAC;YACD,KAAK,YAAY,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7D,CAAC;YACD,KAAK,aAAa,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7D,CAAC;YACD,KAAK,YAAY;gBACf,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,KAAK,YAAY;gBACf,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,KAAK,CAAC,MAAc;QAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,OAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,OAAO,CAAC;iBACjB,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,IAAI,CAAC,MAAM,CAAC,SAAS;oBACnB,MAAM,CAAC,KAAK,CACV,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,IAAI,CACpE,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import {\n chmod,\n mkdir,\n readlink,\n realpath,\n rm,\n symlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { basename, delimiter, dirname, join } from \"node:path\";\n\nimport type { LocalHostStatus } from \"@parlor/capabilities\";\nimport {\n type AgentInfo,\n type ClaimedTurn,\n HOST_PROTOCOL,\n type HostWelcome,\n} from \"@parlor/chat\";\nimport { ActionError, asId, DEV_USER_ID } from \"@parlor/core\";\n\nimport type { AgentLauncher } from \"./acp.js\";\nimport { removeAgentSkills, writeAgentSkills } from \"./agent-skills.js\";\nimport { readUsage, surveyOptions } from \"./agent-survey.js\";\nimport {\n agentNames,\n type AgentToolsDeps,\n registerAgentTools,\n unregisterAgentTools,\n} from \"./agent-tools.js\";\nimport { type AgentProfile, findAgents, loadProfiles } from \"./agents.js\";\nimport { connectControl, type ControlRequest } from \"./control.js\";\nimport { requestDevHostToken } from \"./dev-host.js\";\nimport { type AppGrant, devHostKeys, type GrantStore, type HostKeys } from \"./grants.js\";\nimport { type LearnedNews, learnedStore } from \"./learned.js\";\nimport { onLines } from \"./lines.js\";\nimport { type AppLink, createAppLink } from \"./link.js\";\nimport { withInheritedLock } from \"./lock.js\";\nimport { logEvent, openHostLog } from \"./log.js\";\nimport { AppNotAnswering, type McpProxy } from \"./mcp-proxy.js\";\nimport { computerName, platformName, workspaceOf } from \"./naming.js\";\nimport {\n type LocalPairing,\n pairingDeviceOf,\n startLocalPairing,\n UnrevokedGrant,\n} from \"./pairing.js\";\nimport type { HostPaths } from \"./paths.js\";\nimport { DEV_POLICY, loadPolicy, presenceDueAt, type RemotePolicy } from \"./policy.js\";\nimport type { SessionPool } from \"./pool.js\";\nimport { type LocalPrompter, printable } from \"./prompter.js\";\nimport { compareVersions, RELEASE_KEY, signedRelease } from \"./release.js\";\nimport { revokeGrant } from \"./revoke.js\";\nimport { selfEntry } from \"./self.js\";\nimport { type HostRelease, installLoginItem, installRelease } from \"./service.js\";\nimport { agentEnvironment, rereadAgentPath } from \"./shell-path.js\";\nimport type { TrustStore } from \"./trust.js\";\nimport { runTurn } from \"./turn.js\";\n\nexport interface DaemonDeps {\n readonly release: HostRelease;\n readonly paths: HostPaths;\n readonly grants: GrantStore;\n readonly keys: HostKeys;\n readonly trust: TrustStore;\n readonly pool: SessionPool;\n readonly proxy: McpProxy;\n readonly launcher: AgentLauncher;\n readonly prompter: LocalPrompter;\n readonly policy: RemotePolicy;\n /** The `service.lock` token of the `ensureService` that spawned this daemon, which holds the lock for it. */\n readonly lockToken?: string | undefined;\n}\n\n/**\n * One per user per computer, for every app: an `AppLink` per grant, the session pool,\n * the proxy socket and the control socket. Started only through `ensureService`.\n */\nexport interface HostDaemon {\n start(): Promise<void>;\n /** What the coding agents here know the app by, when the user let them use it. */\n connect(appOrigin: string): Promise<ConnectedTools | undefined>;\n disconnect(appOrigin: string): Promise<ConnectedTools | undefined>;\n /** Lets the coding agents here use the app outside its sidebar, or stops them. */\n agentTools(appOrigin: string, on: boolean): Promise<ConnectedTools | undefined>;\n /** Hands links over to a newer release; running turns finish here first. */\n handover(): Promise<void>;\n stop(): Promise<void>;\n}\n\n/** The app's MCP server name in the coding agents here, and which of them have it. */\nexport interface ConnectedTools {\n readonly name: string;\n readonly agents: string;\n}\n\nconst CONNECT_TIMEOUT_MS = 15_000;\n/** An agent token is asked for again this long before it runs out. */\nconst AGENT_TOKEN_MARGIN_MS = 60_000;\nconst OFFLINE_REPORT_MS = 1_000;\nfunction incompatibleMessage(\n grant: AppGrant,\n welcome: Extract<HostWelcome, { readonly accepted: false }>,\n): string {\n return welcome.reason === \"host_too_old\"\n ? `Update Parlor Host to use ${grant.appName}: it speaks host protocol ${HOST_PROTOCOL}, and ${grant.appName} needs ${welcome.protocols.min}.`\n : `${grant.appName} is older than this Parlor Host: it speaks host protocol ${welcome.protocols.max}, and this computer needs ${HOST_PROTOCOL}.`;\n}\n\nconst shellQuote = (value: string) => `'${value.replaceAll(\"'\", `'\\\\''`)}'`;\n\n/**\n * Agents start `parlor-host mcp-proxy` by name. An entry named otherwise, such as the\n * published `dist/main.js` that `parlor dev` runs with node, gets a shim instead of a link.\n */\nexport async function putHostCommandFirstOnPath(\n root: string,\n entry: string | undefined = selfEntry(),\n): Promise<void> {\n if (!entry) return;\n const bin = join(root, \"bin\");\n const link = join(bin, \"parlor-host\");\n await mkdir(bin, { recursive: true, mode: 0o700 });\n const target = await realpath(entry);\n if (basename(entry).startsWith(\"parlor-host\")) {\n if ((await readlink(link).catch(() => undefined)) !== target) {\n await rm(link, { force: true });\n await symlink(target, link);\n }\n } else {\n await rm(link, { force: true });\n await writeFile(\n link,\n `#!/bin/sh\\nexec ${shellQuote(process.execPath)} ${shellQuote(target)} \"$@\"\\n`,\n { mode: 0o700 },\n );\n }\n const path = (process.env.PATH ?? \"\").split(delimiter).filter((dir) => dir !== bin);\n process.env.PATH = [bin, ...path].join(delimiter);\n}\n\ninterface LinkState {\n readonly link: AppLink;\n readonly keys: HostKeys;\n claiming: Promise<void> | undefined;\n again: boolean;\n incompatible: string | undefined;\n turns: number;\n}\n\n/** The daemon a service runs: once it handed over, `drained` settles after its last turn. */\nexport interface ServiceDaemon extends HostDaemon {\n readonly drained: Promise<void>;\n}\n\nexport class HostAlreadyRunning extends Error {\n override readonly name = \"HostAlreadyRunning\";\n constructor() {\n super(\"Parlor Host is already running on this computer.\");\n }\n}\n\n/** Codex's own CLI throttles its rate-limit reports on the same interval. */\nconst USAGE_READ_FLOOR_MS = 30_000;\n\nexport function createHostDaemon(deps: DaemonDeps): ServiceDaemon {\n const { paths } = deps;\n const links = new Map<string, LinkState>();\n const devTokens = new Map<string, string>();\n const name = computerName();\n const platform = platformName();\n /** As `agents.json` lists them; `profiles` are these with each `binary` set to the CLI found. */\n let listedProfiles: readonly AgentProfile[] = [];\n let profiles: readonly AgentProfile[] = [];\n let agents: AgentInfo[] = [];\n const learned = learnedStore(paths.learned);\n let control: Server | undefined;\n let startup: Promise<void> = Promise.resolve();\n const clients = new Set<Socket>();\n\n const claim = async (link: AppLink): Promise<ClaimedTurn | undefined> => {\n try {\n return await link.api.calls.call(\"hostClaim\", {});\n } catch (error) {\n if (!(error instanceof ActionError && error.code === \"not_found\")) {\n logEvent(\"claim_failed\", {\n appOrigin: link.grant.appOrigin,\n error: String(error),\n });\n }\n return undefined;\n }\n };\n\n /** What an agent said about itself, told to every linked app when it changes what they show. */\n const learn = (agentId: string, news: LearnedNews) => {\n void learned\n .learn(agentId, news)\n .then((changed) => {\n if (!changed) return;\n for (const linked of links.values()) void report(linked).catch(() => undefined);\n })\n .catch(() => undefined);\n };\n\n /** Ends the reads below on stop or handover, so nothing outlives the daemon. */\n const stopping = new AbortController();\n\n const usageReadAt = new Map<string, number>();\n /** The allowance from the agent's own CLI where ACP carries none, at most every 30s per agent. */\n const refreshUsage = async (agentId: string) => {\n const profile = profiles.find((candidate) => candidate.id === agentId);\n const now = Date.now();\n if (!profile || stopping.signal.aborted) return;\n if (now - (usageReadAt.get(agentId) ?? 0) < USAGE_READ_FLOOR_MS) return;\n usageReadAt.set(agentId, now);\n const usage = await readUsage(profile, await agentEnvironment(), now).catch(\n () => undefined,\n );\n if (usage && !stopping.signal.aborted) learn(agentId, { usage });\n };\n\n let surveyed = false;\n /**\n * Options for every agent that has not run a turn yet, so the sidebar can offer a model first.\n * Once per run, when an app first links: a computer no app uses never starts its agents.\n */\n const surveyAgents = async () => {\n if (surveyed) return;\n surveyed = true;\n const env = await agentEnvironment();\n for (const agent of agents) {\n const profile = profiles.find((candidate) => candidate.id === agent.id);\n if (!profile || stopping.signal.aborted) continue;\n void refreshUsage(agent.id);\n if (learned.knows(agent.id)) continue;\n const options = await surveyOptions(profile, deps.launcher, env, stopping.signal);\n if (stopping.signal.aborted) return;\n logEvent(\"agent_surveyed\", { agentId: agent.id, options: options?.length ?? 0 });\n if (options && options.length > 0) learn(agent.id, { options });\n }\n };\n\n const running = new Set<Promise<void>>();\n let handedOver = false;\n let finishing = false;\n let finishHandover: () => void = () => undefined;\n const drained = new Promise<void>((resolve) => (finishHandover = resolve));\n\n /** A turn runs once here, even when a pushed turn its app took back is claimed again. */\n const runningTurns = new Set<string>();\n\n const run = (\n state: LinkState,\n claimed: ClaimedTurn,\n how: \"claimed\" | \"pushed\" = \"claimed\",\n ) => {\n const { link } = state;\n if (runningTurns.has(claimed.turnId)) return;\n runningTurns.add(claimed.turnId);\n logEvent(how === \"pushed\" ? \"turn_pushed\" : \"turn_claimed\", {\n appOrigin: link.grant.appOrigin,\n turnId: claimed.turnId,\n });\n state.turns += 1;\n const turn = (\n link.grant.dev ? Promise.resolve(DEV_POLICY) : loadPolicy(paths.policy, deps.policy)\n )\n .then((policy) =>\n runTurn(claimed, {\n link,\n profiles,\n launcher: deps.launcher,\n pool: deps.pool,\n proxy: deps.proxy,\n trust: {\n ...deps.trust,\n pin: async (appOrigin, device) => {\n await deps.trust.pin(appOrigin, device);\n void report(state).catch(() => undefined);\n },\n forget: async (appOrigin, deviceId) => {\n await deps.trust.forget(appOrigin, deviceId);\n void report(state).catch(() => undefined);\n },\n },\n policy,\n prompter: deps.prompter,\n now: Date.now,\n learned: learn,\n pairing: {\n secret: async () =>\n (await deps.grants.get(link.grant.appOrigin))?.pairingSecret,\n forget: async () => {\n const saved = await deps.grants.get(link.grant.appOrigin);\n if (!saved?.pairingSecret) return;\n const { pairingSecret: _used, ...rest } = saved;\n await deps.grants.save(rest);\n },\n },\n }),\n )\n .then(\n (outcome) => logEvent(\"turn_finished\", { turnId: claimed.turnId, outcome }),\n (error: unknown) =>\n logEvent(\"turn_finished\", { turnId: claimed.turnId, error: String(error) }),\n )\n .finally(() => {\n runningTurns.delete(claimed.turnId);\n void refreshUsage(claimed.agent.agentId);\n state.turns -= 1;\n running.delete(turn);\n settleHandover();\n });\n running.add(turn);\n };\n\n const claimLoop = async (state: LinkState) => {\n do {\n state.again = false;\n for (\n let claimed = await claim(state.link);\n claimed;\n claimed = state.link.mode === \"serving\" ? await claim(state.link) : undefined\n ) {\n run(state, claimed);\n }\n } while (state.again && state.link.mode === \"serving\");\n };\n\n const wake = (state: LinkState) => {\n if (state.link.mode !== \"serving\") return;\n if (state.claiming) {\n state.again = true;\n return;\n }\n state.claiming = claimLoop(state).finally(() => {\n state.claiming = undefined;\n });\n };\n\n const closeLink = async (origin: string, reason: string) => {\n const state = links.get(origin);\n links.delete(origin);\n await state?.link.stop();\n await deps.pool.drop(origin);\n if (state) logEvent(\"link_closed\", { appOrigin: origin, reason });\n };\n\n const toolsDeps = (): AgentToolsDeps => ({\n profiles: profiles.filter((profile) =>\n agents.some((agent) => agent.id === profile.id),\n ),\n hostCommand: join(paths.root, \"bin\", \"parlor-host\"),\n env: agentEnvironment,\n });\n\n const toolsOf = (grant: AppGrant | undefined): ConnectedTools | undefined => {\n const tools = grant?.agentTools;\n if (!tools?.on || !tools.name || !tools.agents?.length) return undefined;\n return {\n name: tools.name,\n agents: agentNames(profiles, { name: tools.name, agents: tools.agents }),\n };\n };\n\n /** The skill that sends the agents to the app's tools when the user names it, kept current. */\n const writeSkills = async (grant: AppGrant) => {\n const tools = grant.agentTools;\n if (grant.dev || !tools?.on || !tools.name || !tools.agents?.length) return;\n await writeAgentSkills(\n tools.agents,\n {\n name: tools.name,\n appName: grant.appName,\n appOrigin: grant.appOrigin,\n account: grant.account.email ?? grant.account.name,\n },\n await agentEnvironment(),\n );\n };\n\n let toolsWork: Promise<unknown> = Promise.resolve();\n /** Registering and removing the app with the agents runs one at a time, on the grant as saved by then. */\n const serially = <T>(work: () => Promise<T>): Promise<T> => {\n const next = toolsWork.then(work, work);\n toolsWork = next.catch(() => undefined);\n return next;\n };\n\n /** Registers the app with the agents here once the user chose it and it is not yet. */\n const ensureAgentTools = (grant: AppGrant): Promise<AppGrant> =>\n serially(() => ensureAgentToolsNow(grant));\n\n const ensureAgentToolsNow = async (grant: AppGrant): Promise<AppGrant> => {\n if (!grant.agentTools?.on || grant.dev) return grant;\n if (grant.agentTools.agents) {\n await writeSkills(grant);\n return grant;\n }\n const registered = await registerAgentTools(toolsDeps(), grant);\n const next: AppGrant = { ...grant, agentTools: { on: true, ...registered } };\n await deps.grants.save(next);\n await writeSkills(next);\n return next;\n };\n\n /** Hands the app to agents installed since it was registered with the ones here then. */\n const handToNewAgents = (origin: string) =>\n serially(async () => {\n const grant = await deps.grants.get(origin);\n if (grant) await handToNewAgentsNow(grant);\n });\n\n const handToNewAgentsNow = async (grant: AppGrant) => {\n const tools = grant.agentTools;\n if (grant.declined || grant.dev || !tools?.on || !tools.agents) return;\n const have = new Set(tools.agents);\n const fresh = toolsDeps().profiles.filter((profile) => !have.has(profile.id));\n if (fresh.length === 0) {\n await writeSkills(grant);\n return;\n }\n const registered = await registerAgentTools(\n { ...toolsDeps(), profiles: fresh },\n grant,\n );\n if (registered.agents.length === 0) {\n await writeSkills(grant);\n return;\n }\n const next: AppGrant = {\n ...grant,\n agentTools: {\n on: true,\n name: registered.name,\n agents: [...tools.agents, ...registered.agents],\n },\n };\n await deps.grants.save(next);\n latest.set(grant.appOrigin, next);\n await writeSkills(next);\n };\n\n let checking: Promise<void> | undefined;\n let checkAgain = false;\n /**\n * Looks for the agents again because a tab asked: one installed since this computer\n * started shows in every app's sidebar, and gets the apps the user let its agents use.\n */\n const checkAgents = (): Promise<void> => {\n if (checking) {\n checkAgain = true;\n return checking;\n }\n checking = (async () => {\n do {\n checkAgain = false;\n await rereadAgentPath();\n const found = await findAgents(listedProfiles);\n profiles = found.profiles;\n agents = [...found.agents];\n for (const grant of await deps.grants.list()) {\n await handToNewAgents(grant.appOrigin).catch((error: unknown) =>\n logEvent(\"agent_tools_failed\", {\n appOrigin: grant.appOrigin,\n error: String(error),\n }),\n );\n }\n await Promise.all(\n [...links.values()].map((state) => report(state, true).catch(() => undefined)),\n );\n logEvent(\"agents_checked\", { agents: agents.map((agent) => agent.id) });\n } while (checkAgain);\n })().finally(() => {\n checking = undefined;\n });\n return checking;\n };\n\n const removeAgentTools = (grant: AppGrant | undefined) =>\n serially(async () => {\n const tools = grant?.agentTools;\n if (!tools?.name || !tools.agents?.length) return;\n await unregisterAgentTools(toolsDeps(), { name: tools.name, agents: tools.agents });\n await removeAgentSkills(tools.agents, tools.name, await agentEnvironment());\n });\n\n const agentTokens = new Map<\n string,\n { readonly token: string; readonly expiresAt: number }\n >();\n /** The grant as last saved, which a link opened before a change still holds the old copy of. */\n const latest = new Map<string, AppGrant>();\n\n deps.proxy.serveOutside((appOrigin) => {\n const state = links.get(appOrigin);\n if (!state || state.link.grant.dev) return undefined;\n const grant = latest.get(appOrigin) ?? state.link.grant;\n if (!grant.agentTools?.on || !grant.agentTools.name) return undefined;\n return {\n appOrigin,\n appName: grant.appName,\n name: grant.agentTools.name,\n account: grant.account.email ?? grant.account.name,\n token: async (agent) => {\n const key = `${grant.grantId}\\n${agent}`;\n const held = agentTokens.get(key);\n if (held && held.expiresAt - AGENT_TOKEN_MARGIN_MS > Date.now())\n return held.token;\n if (state.link.protocol === undefined) throw new AppNotAnswering();\n const fresh = await state.link.api.calls.call(\"hostAgentToken\", {\n agent: `${agent} on ${name}`.slice(0, 120),\n });\n agentTokens.set(key, fresh);\n return fresh.token;\n },\n askHere: async (question) =>\n (await deps.prompter.answerHere({\n appName: grant.appName,\n agent: \"Parlor Host\",\n question,\n choices: [\n { id: \"allow\", label: \"Allow\" },\n { id: \"deny\", label: \"Don't allow\" },\n ],\n })) === \"allow\",\n };\n });\n\n const forget = async (grant: AppGrant) => {\n await removeAgentTools((await deps.grants.get(grant.appOrigin)) ?? grant);\n latest.delete(grant.appOrigin);\n for (const key of agentTokens.keys()) {\n if (key.startsWith(`${grant.grantId}\\n`)) agentTokens.delete(key);\n }\n devTokens.delete(grant.appOrigin);\n await deps.grants.remove(grant.appOrigin);\n await deps.keys.remove(grant.appOrigin);\n await deps.trust.forget(grant.appOrigin);\n await deps.pool.forget(grant);\n };\n\n const open = (grant: AppGrant, keys: HostKeys): LinkState => {\n void surveyAgents().catch(() => undefined);\n const origin = grant.appOrigin;\n latest.set(origin, grant);\n let state: LinkState;\n const link = createAppLink(grant, {\n keys,\n hostVersion: deps.release.version,\n hostName: name,\n platform,\n fetch: (input, init) => fetch(input, init),\n onWake: () => wake(state),\n onAgentsCheck: () => void checkAgents(),\n onPushed: (_link, turn) => {\n // Tells the app this computer has the turn, while it already starts on it.\n void link.api.calls\n .call(\"hostAppend\", { turnId: turn.turnId, items: [] })\n .catch(() => undefined);\n run(state, turn, \"pushed\");\n },\n busy: () => state.turns > 0,\n onRevoked: () => {\n if (links.get(origin) !== state) return;\n if (grant.dev) void reattach(grant);\n else {\n const removedFrom = toolsOf(latest.get(origin) ?? grant)?.agents;\n void closeLink(origin, \"revoked\")\n .then(() => forget(grant))\n .then(() =>\n deps.prompter.disconnected?.({ appName: grant.appName, removedFrom }),\n );\n }\n },\n onIncompatible: (refused, welcome) => {\n state.incompatible = incompatibleMessage(refused, welcome);\n process.stderr.write(`${printable(state.incompatible)}\\n`);\n },\n });\n state = {\n link,\n keys,\n claiming: undefined,\n again: false,\n incompatible: undefined,\n turns: 0,\n };\n links.set(origin, state);\n link.start();\n return state;\n };\n\n const pinnedDevices = async (state: LinkState) => {\n if (state.link.grant.dev) return {};\n const [pinned, policy] = await Promise.all([\n deps.trust.list(state.link.grant.appOrigin),\n loadPolicy(paths.policy, deps.policy),\n ]);\n const presenceDue: Record<string, number> = {};\n for (const device of pinned) {\n const due = presenceDueAt(policy, device);\n if (due !== undefined) presenceDue[device.deviceId] = due;\n }\n return { devices: pinned.map((device) => device.deviceId), presenceDue };\n };\n\n /** The agents with what they said about themselves, and the name they use the app by outside. */\n const describeFor = (origin: string) => {\n const tools = latest.get(origin)?.agentTools;\n return learned\n .describe(agents, Date.now())\n .map((agent) =>\n tools?.on && tools.name && tools.agents?.includes(agent.id)\n ? { ...agent, outsideName: tools.name }\n : agent,\n );\n };\n\n /** `agentsChecked` when the agents were just looked for, which a tab waiting on a check reads. */\n const report = async (state: LinkState, agentsChecked = false) => {\n const reported = state.link.api.calls.call(\"hostReport\", {\n online: true,\n agents: describeFor(state.link.grant.appOrigin),\n ...(await pinnedDevices(state)),\n ...(agentsChecked ? { agentsChecked: true as const } : {}),\n });\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"The app did not answer in time.\")),\n CONNECT_TIMEOUT_MS,\n ),\n );\n try {\n await Promise.race([reported, timeout]);\n } catch (error) {\n throw new Error(\n state.incompatible ?? (error instanceof Error ? error.message : String(error)),\n { cause: error },\n );\n }\n };\n\n const devGrant = async (origin: string): Promise<AppGrant> => {\n const manifest = await fetch(`${origin}/_parlor/manifest`)\n .then((response) => response.json() as Promise<{ app?: { name?: string } }>)\n .catch(() => undefined);\n return {\n appOrigin: origin,\n appName: manifest?.app?.name ?? new URL(origin).host,\n grantId: asId(\"grant\", \"dev\"),\n hostId: asId(\"host\", \"dev\"),\n account: { userId: DEV_USER_ID, name: \"Developer\" },\n workspace: workspaceOf(paths.workspaces, origin),\n createdAt: Date.now(),\n dev: true,\n };\n };\n\n const attach = async (origin: string, hostToken: string) => {\n await closeLink(origin, \"replaced\");\n devTokens.set(origin, hostToken);\n await report(open(await devGrant(origin), devHostKeys(hostToken)), true);\n };\n\n const reattach = async (grant: AppGrant) => {\n await closeLink(grant.appOrigin, \"dev_server_restarted\");\n if (!devTokens.has(grant.appOrigin)) return;\n try {\n const token = await requestDevHostToken(grant.appOrigin);\n if (devTokens.has(grant.appOrigin)) await attach(grant.appOrigin, token);\n } catch (error) {\n logEvent(\"dev_attach_failed\", { appOrigin: grant.appOrigin, error: String(error) });\n }\n };\n\n const status = (): LocalHostStatus => ({\n state: \"running\",\n version: deps.release.version,\n apps: [...links.keys()],\n });\n\n const grantsOf = () =>\n [...links.values()].map(({ link: { grant } }) => ({\n appOrigin: grant.appOrigin,\n appName: grant.appName,\n grantId: grant.grantId,\n }));\n\n const daemon: ServiceDaemon = {\n drained,\n async start() {\n let finishStartup!: () => void;\n let failStartup!: (error: unknown) => void;\n startup = new Promise<void>((resolve, reject) => {\n finishStartup = resolve;\n failStartup = reject;\n });\n startup.catch(() => undefined);\n try {\n await mkdir(paths.root, { recursive: true, mode: 0o700 });\n await withInheritedLock(paths.lock, deps.lockToken, async () => {\n const answering = await connectControl(paths.control);\n if (answering) {\n answering.close();\n throw new HostAlreadyRunning();\n }\n await mkdir(dirname(paths.control), { recursive: true, mode: 0o700 });\n control = createServer(serve);\n await rm(paths.control, { force: true });\n await new Promise<void>((resolve, reject) => {\n control!.once(\"error\", reject);\n control!.listen(paths.control, () => resolve());\n });\n await chmod(paths.control, 0o600);\n });\n openHostLog(join(paths.root, \"logs\", \"daemon.log\"));\n await putHostCommandFirstOnPath(paths.root);\n await deps.proxy.listen(paths.proxy);\n listedProfiles = await loadProfiles(paths.agents);\n const found = await findAgents(listedProfiles);\n profiles = found.profiles;\n agents = [...found.agents];\n await learned.load();\n finishStartup();\n } catch (error) {\n failStartup(error);\n throw error;\n }\n logEvent(\"daemon_started\", {\n version: deps.release.version,\n agents: agents.map((a) => a.id),\n });\n for (const grant of await deps.grants.list()) {\n if (grant.declined) continue;\n void handToNewAgents(grant.appOrigin).catch(() => undefined);\n void report(open(grant, deps.keys), true).catch((error: unknown) =>\n logEvent(\"link_failed\", { appOrigin: grant.appOrigin, error: String(error) }),\n );\n }\n },\n async connect(appOrigin) {\n const saved = await deps.grants.get(appOrigin);\n if (!saved || saved.declined) {\n throw new Error(`This computer is not connected to ${appOrigin}.`);\n }\n const grant = await ensureAgentTools(saved);\n const current = links.get(appOrigin);\n if (current?.link.grant.grantId === grant.grantId) {\n latest.set(appOrigin, grant);\n await report(current, true);\n return toolsOf(grant);\n }\n await closeLink(appOrigin, \"replaced\");\n if (current) await deps.pool.forget(current.link.grant);\n latest.set(appOrigin, grant);\n await report(open(grant, deps.keys), true);\n return toolsOf(grant);\n },\n async agentTools(appOrigin, on) {\n const saved = await deps.grants.get(appOrigin);\n if (!saved || saved.declined || saved.dev) {\n throw new Error(`This computer is not connected to ${appOrigin}.`);\n }\n if (!on) await removeAgentTools(saved);\n const grant = await ensureAgentTools({ ...saved, agentTools: { on } });\n if (!on) await deps.grants.save(grant);\n latest.set(appOrigin, grant);\n const state = links.get(appOrigin);\n if (state) await report(state).catch(() => undefined);\n return toolsOf(grant);\n },\n async disconnect(appOrigin) {\n const state = links.get(appOrigin);\n const grant = (await deps.grants.get(appOrigin)) ?? state?.link.grant;\n if (!grant) throw new Error(`This computer is not connected to ${appOrigin}.`);\n const removed = toolsOf(grant);\n if (state) {\n await state.link.stop({ revoke: true });\n } else {\n await revokeGrant({\n appOrigin,\n appName: grant.appName,\n assert: (request) => deps.keys.assert(appOrigin, request),\n });\n }\n await closeLink(appOrigin, \"disconnected\");\n await forget(grant);\n return removed;\n },\n async handover() {\n if (handedOver) return;\n handedOver = true;\n stopping.abort();\n for (const state of links.values()) state.link.drain();\n await Promise.all([...links.values()].map((state) => state.claiming));\n const closing = control;\n control = undefined;\n closing?.close();\n await Promise.all([rm(paths.control, { force: true }), deps.proxy.stopListening()]);\n logEvent(\"handover_started\", { version: deps.release.version });\n },\n async stop() {\n stopping.abort();\n if (!handedOver) {\n await Promise.all(\n [...links.values()].map((state) =>\n Promise.race([\n state.link.api.calls.call(\"hostReport\", {\n online: false,\n agents: describeFor(state.link.grant.appOrigin),\n }),\n new Promise((resolve) => setTimeout(resolve, OFFLINE_REPORT_MS)),\n ]).catch(() => undefined),\n ),\n );\n }\n for (const origin of [...links.keys()]) await closeLink(origin, \"stopped\");\n for (const socket of clients) socket.destroy();\n const closing = control;\n control = undefined;\n if (closing) await new Promise<void>((resolve) => closing.close(() => resolve()));\n if (!handedOver) await rm(paths.control, { force: true });\n await deps.proxy.close();\n },\n };\n\n const settleHandover = () => {\n if (!handedOver || running.size > 0 || finishing) return;\n finishing = true;\n void (async () => {\n for (const origin of [...links.keys()]) await closeLink(origin, \"handed_over\");\n await Promise.all(\n [...clients].map(\n (socket) =>\n new Promise<void>((resolve) => {\n socket.end(() => resolve());\n setTimeout(resolve, OFFLINE_REPORT_MS).unref();\n }),\n ),\n );\n logEvent(\"handover_finished\", { version: deps.release.version });\n finishHandover();\n })();\n };\n\n const handOverTo = async (binary: string, signature: string): Promise<unknown> => {\n const release = await signedRelease(binary, signature, RELEASE_KEY);\n if (!release) return { ok: false, error: \"unsigned\" };\n if (compareVersions(release.version, deps.release.version) <= 0) {\n return { ok: false, error: \"downgrade\" };\n }\n if (!(await installRelease(paths, { binary, signature }, release))) {\n return { ok: false, error: \"unsigned\" };\n }\n await installLoginItem(paths);\n await daemon.handover();\n setImmediate(settleHandover);\n return { ok: true };\n };\n\n const pairings = new Map<string, LocalPairing>();\n\n const pendingPairing = (appOrigin: string) => {\n const origin = new URL(appOrigin).origin;\n return { origin, pairing: pairings.get(origin) };\n };\n\n const confirmPairing = async (\n request: Extract<ControlRequest, { readonly op: \"confirm_local_pairing\" }>,\n ): Promise<unknown> => {\n const { origin, pairing } = pendingPairing(request.appOrigin);\n if (!pairing) return { ok: false, error: \"No pairing was started for this app.\" };\n pairings.delete(origin);\n let outcome: Awaited<ReturnType<LocalPairing[\"confirm\"]>>;\n try {\n outcome = await pairing.confirm(request.connect);\n } catch (error) {\n if (!(error instanceof UnrevokedGrant)) throw error;\n await deps.grants.save(error.grant);\n return { ok: false, error: \"declined_locally\" };\n }\n if (!outcome.paired) return { ok: false, error: outcome.reason };\n const { grant } = outcome;\n await deps.grants.save(grant);\n const device = pairingDeviceOf(request.device);\n if (device) {\n await deps.trust.pin(grant.appOrigin, {\n deviceId: asId(\"device\", device.deviceId),\n signingKey: device.signingKey,\n presenceKey: device.presenceKey,\n name: device.name,\n platform: device.platform,\n approvedAt: Date.now(),\n via: \"pairing\",\n });\n }\n await daemon.connect(grant.appOrigin);\n return { ok: true };\n };\n\n const handle = async (request: ControlRequest): Promise<unknown> => {\n if (request.op !== \"hello\") await startup;\n switch (request.op) {\n case \"hello\":\n return { ok: true, release: deps.release };\n case \"handover\":\n return handOverTo(request.binary, request.signature);\n case \"status\":\n return { ok: true, status: status(), grants: grantsOf() };\n case \"begin_local_pairing\": {\n const { origin } = pendingPairing(request.appOrigin);\n const existing = await deps.grants.get(origin);\n if (existing && !existing.declined) {\n return {\n ok: false,\n error: `This computer is already connected to ${existing.appName}.`,\n };\n }\n const pairing = startLocalPairing({\n appOrigin: origin,\n hostName: name,\n platform,\n keys: deps.keys,\n workspaceRoot: paths.workspaces,\n });\n pairings.set(origin, pairing);\n const begun = await pairing.pairing;\n logEvent(\"local_pairing_begun\", {\n appOrigin: origin,\n matchingCode: begun.matchingCode,\n });\n return { ok: true, pairing: begun };\n }\n case \"finish_local_pairing\": {\n const { pairing } = pendingPairing(request.appOrigin);\n if (!pairing) return { ok: false, error: \"No pairing was started for this app.\" };\n return { ok: true, ...(await pairing.finish(request.code)) };\n }\n case \"confirm_local_pairing\":\n return confirmPairing(request);\n case \"connect\": {\n const agentTools = await daemon.connect(request.appOrigin);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"disconnect\": {\n const agentTools = await daemon.disconnect(request.appOrigin);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"agent_tools\": {\n const agentTools = await daemon.agentTools(request.appOrigin, request.on);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"dev_attach\":\n await attach(request.appOrigin, request.hostToken);\n return { ok: true };\n case \"dev_detach\":\n devTokens.delete(request.appOrigin);\n await closeLink(request.appOrigin, \"detached\");\n return { ok: true };\n }\n };\n\n function serve(socket: Socket) {\n clients.add(socket);\n socket.on(\"close\", () => clients.delete(socket));\n socket.on(\"error\", () => socket.destroy());\n onLines(socket, (line) => {\n let request: ControlRequest;\n try {\n request = JSON.parse(line) as ControlRequest;\n } catch {\n socket.write(`${JSON.stringify({ ok: false, error: \"Not JSON.\" })}\\n`);\n return;\n }\n void handle(request)\n .catch((error: unknown) => ({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n }))\n .then((reply) => {\n if (!socket.destroyed)\n socket.write(\n `${JSON.stringify(reply ?? { ok: false, error: \"Unknown op.\" })}\\n`,\n );\n });\n });\n }\n\n return daemon;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n chmod,\n mkdir,\n readlink,\n realpath,\n rm,\n symlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { basename, delimiter, dirname, join } from \"node:path\";\n\nimport type { LocalHostStatus } from \"@parlor/capabilities\";\nimport {\n type AgentInfo,\n type ClaimedTurn,\n HOST_PROTOCOL,\n type HostWelcome,\n} from \"@parlor/chat\";\nimport { ActionError, asId, DEV_USER_ID } from \"@parlor/core\";\n\nimport type { AgentLauncher } from \"./acp.js\";\nimport { removeAgentSkills, writeAgentSkills } from \"./agent-skills.js\";\nimport { readUsage, surveyOptions } from \"./agent-survey.js\";\nimport {\n agentNames,\n type AgentToolsDeps,\n registerAgentTools,\n unregisterAgentTools,\n} from \"./agent-tools.js\";\nimport { type AgentProfile, findAgents, loadProfiles } from \"./agents.js\";\nimport { connectControl, type ControlRequest } from \"./control.js\";\nimport { requestDevHostToken } from \"./dev-host.js\";\nimport { type AppGrant, devHostKeys, type GrantStore, type HostKeys } from \"./grants.js\";\nimport { type LearnedNews, learnedStore } from \"./learned.js\";\nimport { onLines } from \"./lines.js\";\nimport { type AppLink, createAppLink } from \"./link.js\";\nimport { withInheritedLock } from \"./lock.js\";\nimport { logEvent, openHostLog } from \"./log.js\";\nimport { AppNotAnswering, type McpProxy } from \"./mcp-proxy.js\";\nimport { computerName, platformName, workspaceOf } from \"./naming.js\";\nimport {\n type LocalPairing,\n pairingDeviceOf,\n startLocalPairing,\n UnrevokedGrant,\n} from \"./pairing.js\";\nimport type { HostPaths } from \"./paths.js\";\nimport { DEV_POLICY, loadPolicy, presenceDueAt, type RemotePolicy } from \"./policy.js\";\nimport type { SessionPool } from \"./pool.js\";\nimport { type LocalPrompter, printable } from \"./prompter.js\";\nimport { compareVersions, RELEASE_KEY, signedRelease } from \"./release.js\";\nimport { revokeGrant } from \"./revoke.js\";\nimport { selfEntry } from \"./self.js\";\nimport { type HostRelease, installLoginItem, installRelease } from \"./service.js\";\nimport { agentEnvironment, rereadAgentPath } from \"./shell-path.js\";\nimport type { TrustStore } from \"./trust.js\";\nimport { runTurn } from \"./turn.js\";\nimport { warmAgent } from \"./warm.js\";\n\nexport interface DaemonDeps {\n readonly release: HostRelease;\n readonly paths: HostPaths;\n readonly grants: GrantStore;\n readonly keys: HostKeys;\n readonly trust: TrustStore;\n readonly pool: SessionPool;\n readonly proxy: McpProxy;\n readonly launcher: AgentLauncher;\n readonly prompter: LocalPrompter;\n readonly policy: RemotePolicy;\n /** The `service.lock` token of the `ensureService` that spawned this daemon, which holds the lock for it. */\n readonly lockToken?: string | undefined;\n}\n\n/**\n * One per user per computer, for every app: an `AppLink` per grant, the session pool,\n * the proxy socket and the control socket. Started only through `ensureService`.\n */\nexport interface HostDaemon {\n start(): Promise<void>;\n /** What the coding agents here know the app by, when the user let them use it. */\n connect(appOrigin: string): Promise<ConnectedTools | undefined>;\n disconnect(appOrigin: string): Promise<ConnectedTools | undefined>;\n /** Lets the coding agents here use the app outside its sidebar, or stops them. */\n agentTools(appOrigin: string, on: boolean): Promise<ConnectedTools | undefined>;\n /** Hands links over to a newer release; running turns finish here first. */\n handover(): Promise<void>;\n stop(): Promise<void>;\n}\n\n/** The app's MCP server name in the coding agents here, and which of them have it. */\nexport interface ConnectedTools {\n readonly name: string;\n readonly agents: string;\n}\n\nconst CONNECT_TIMEOUT_MS = 15_000;\n/** An agent token is asked for again this long before it runs out. */\nconst AGENT_TOKEN_MARGIN_MS = 60_000;\nconst OFFLINE_REPORT_MS = 1_000;\nfunction incompatibleMessage(\n grant: AppGrant,\n welcome: Extract<HostWelcome, { readonly accepted: false }>,\n): string {\n return welcome.reason === \"host_too_old\"\n ? `Update Parlor Host to use ${grant.appName}: it speaks host protocol ${HOST_PROTOCOL}, and ${grant.appName} needs ${welcome.protocols.min}.`\n : `${grant.appName} is older than this Parlor Host: it speaks host protocol ${welcome.protocols.max}, and this computer needs ${HOST_PROTOCOL}.`;\n}\n\nconst shellQuote = (value: string) => `'${value.replaceAll(\"'\", `'\\\\''`)}'`;\n\n/**\n * Agents start `parlor-host mcp-proxy` by name. An entry named otherwise, such as the\n * published `dist/main.js` that `parlor dev` runs with node, gets a shim instead of a link.\n */\nexport async function putHostCommandFirstOnPath(\n root: string,\n entry: string | undefined = selfEntry(),\n): Promise<void> {\n if (!entry) return;\n const bin = join(root, \"bin\");\n const link = join(bin, \"parlor-host\");\n await mkdir(bin, { recursive: true, mode: 0o700 });\n const target = await realpath(entry);\n if (basename(entry).startsWith(\"parlor-host\")) {\n if ((await readlink(link).catch(() => undefined)) !== target) {\n await rm(link, { force: true });\n await symlink(target, link);\n }\n } else {\n await rm(link, { force: true });\n await writeFile(\n link,\n `#!/bin/sh\\nexec ${shellQuote(process.execPath)} ${shellQuote(target)} \"$@\"\\n`,\n { mode: 0o700 },\n );\n }\n const path = (process.env.PATH ?? \"\").split(delimiter).filter((dir) => dir !== bin);\n process.env.PATH = [bin, ...path].join(delimiter);\n}\n\ninterface LinkState {\n readonly link: AppLink;\n readonly keys: HostKeys;\n claiming: Promise<void> | undefined;\n again: boolean;\n incompatible: string | undefined;\n turns: number;\n}\n\n/** The daemon a service runs: once it handed over, `drained` settles after its last turn. */\nexport interface ServiceDaemon extends HostDaemon {\n readonly drained: Promise<void>;\n}\n\nexport class HostAlreadyRunning extends Error {\n override readonly name = \"HostAlreadyRunning\";\n constructor() {\n super(\"Parlor Host is already running on this computer.\");\n }\n}\n\n/** Codex's own CLI throttles its rate-limit reports on the same interval. */\nconst USAGE_READ_FLOOR_MS = 30_000;\n\nexport function createHostDaemon(deps: DaemonDeps): ServiceDaemon {\n const { paths } = deps;\n const links = new Map<string, LinkState>();\n const devTokens = new Map<string, string>();\n const name = computerName();\n const platform = platformName();\n /** As `agents.json` lists them; `profiles` are these with each `binary` set to the CLI found. */\n let listedProfiles: readonly AgentProfile[] = [];\n let profiles: readonly AgentProfile[] = [];\n let agents: AgentInfo[] = [];\n const learned = learnedStore(paths.learned);\n let control: Server | undefined;\n let startup: Promise<void> = Promise.resolve();\n const clients = new Set<Socket>();\n\n const claim = async (link: AppLink): Promise<ClaimedTurn | undefined> => {\n try {\n return await link.api.calls.call(\"hostClaim\", {});\n } catch (error) {\n if (!(error instanceof ActionError && error.code === \"not_found\")) {\n logEvent(\"claim_failed\", {\n appOrigin: link.grant.appOrigin,\n error: String(error),\n });\n }\n return undefined;\n }\n };\n\n /** What an agent said about itself, told to every linked app when it changes what they show. */\n const learn = (agentId: string, news: LearnedNews) => {\n void learned\n .learn(agentId, news)\n .then((changed) => {\n if (!changed) return;\n for (const linked of links.values()) void report(linked).catch(() => undefined);\n })\n .catch(() => undefined);\n };\n\n /** Ends the reads below on stop or handover, so nothing outlives the daemon. */\n const stopping = new AbortController();\n\n const usageReadAt = new Map<string, number>();\n /** The allowance from the agent's own CLI where ACP carries none, at most every 30s per agent. */\n const refreshUsage = async (agentId: string) => {\n const profile = profiles.find((candidate) => candidate.id === agentId);\n const now = Date.now();\n if (!profile || stopping.signal.aborted) return;\n if (now - (usageReadAt.get(agentId) ?? 0) < USAGE_READ_FLOOR_MS) return;\n usageReadAt.set(agentId, now);\n const usage = await readUsage(profile, await agentEnvironment(), now).catch(\n () => undefined,\n );\n if (usage && !stopping.signal.aborted) learn(agentId, { usage });\n };\n\n let surveyed = false;\n /**\n * Options for every agent that has not run a turn yet, so the sidebar can offer a model first.\n * Once per run, when an app first links: a computer no app uses never starts its agents.\n */\n const surveyAgents = async () => {\n if (surveyed) return;\n surveyed = true;\n const env = await agentEnvironment();\n for (const agent of agents) {\n const profile = profiles.find((candidate) => candidate.id === agent.id);\n if (!profile || stopping.signal.aborted) continue;\n void refreshUsage(agent.id);\n if (learned.knows(agent.id)) continue;\n const options = await surveyOptions(profile, deps.launcher, env, stopping.signal);\n if (stopping.signal.aborted) return;\n logEvent(\"agent_surveyed\", { agentId: agent.id, options: options?.length ?? 0 });\n if (options && options.length > 0) learn(agent.id, { options });\n }\n };\n\n const running = new Set<Promise<void>>();\n let handedOver = false;\n let finishing = false;\n let finishHandover: () => void = () => undefined;\n const drained = new Promise<void>((resolve) => (finishHandover = resolve));\n\n /** A turn runs once here, even when a pushed turn its app took back is claimed again. */\n const runningTurns = new Set<string>();\n\n const policyFor = (grant: AppGrant) =>\n grant.dev ? Promise.resolve(DEV_POLICY) : loadPolicy(paths.policy, deps.policy);\n\n const warming = new Set<string>();\n const warm = (state: LinkState, agentId: string) => {\n const { link } = state;\n const key = `${link.grant.appOrigin}\\n${agentId}`;\n if (warming.has(key) || stopping.signal.aborted) return;\n warming.add(key);\n void policyFor(link.grant)\n .then((policy) =>\n warmAgent(agentId, {\n link,\n profiles,\n launcher: deps.launcher,\n pool: deps.pool,\n proxy: deps.proxy,\n policy,\n }),\n )\n .then((outcome) =>\n logEvent(\"agent_warmed\", { appOrigin: link.grant.appOrigin, agentId, outcome }),\n )\n .catch(() => undefined)\n .finally(() => warming.delete(key));\n };\n\n const run = (\n state: LinkState,\n claimed: ClaimedTurn,\n how: \"claimed\" | \"pushed\" = \"claimed\",\n ) => {\n const { link } = state;\n if (runningTurns.has(claimed.turnId)) return;\n runningTurns.add(claimed.turnId);\n logEvent(how === \"pushed\" ? \"turn_pushed\" : \"turn_claimed\", {\n appOrigin: link.grant.appOrigin,\n turnId: claimed.turnId,\n });\n state.turns += 1;\n const turn = policyFor(link.grant)\n .then((policy) =>\n runTurn(claimed, {\n link,\n profiles,\n launcher: deps.launcher,\n pool: deps.pool,\n proxy: deps.proxy,\n trust: {\n ...deps.trust,\n pin: async (appOrigin, device) => {\n await deps.trust.pin(appOrigin, device);\n void report(state).catch(() => undefined);\n },\n forget: async (appOrigin, deviceId) => {\n await deps.trust.forget(appOrigin, deviceId);\n void report(state).catch(() => undefined);\n },\n },\n policy,\n prompter: deps.prompter,\n now: Date.now,\n learned: learn,\n pairing: {\n secret: async () =>\n (await deps.grants.get(link.grant.appOrigin))?.pairingSecret,\n forget: async () => {\n const saved = await deps.grants.get(link.grant.appOrigin);\n if (!saved?.pairingSecret) return;\n const { pairingSecret: _used, ...rest } = saved;\n await deps.grants.save(rest);\n },\n },\n }),\n )\n .then(\n (outcome) => logEvent(\"turn_finished\", { turnId: claimed.turnId, outcome }),\n (error: unknown) =>\n logEvent(\"turn_finished\", { turnId: claimed.turnId, error: String(error) }),\n )\n .finally(() => {\n runningTurns.delete(claimed.turnId);\n void refreshUsage(claimed.agent.agentId);\n state.turns -= 1;\n running.delete(turn);\n settleHandover();\n });\n running.add(turn);\n };\n\n const claimLoop = async (state: LinkState) => {\n do {\n state.again = false;\n for (\n let claimed = await claim(state.link);\n claimed;\n claimed = state.link.mode === \"serving\" ? await claim(state.link) : undefined\n ) {\n run(state, claimed);\n }\n } while (state.again && state.link.mode === \"serving\");\n };\n\n const wake = (state: LinkState) => {\n if (state.link.mode !== \"serving\") return;\n if (state.claiming) {\n state.again = true;\n return;\n }\n state.claiming = claimLoop(state).finally(() => {\n state.claiming = undefined;\n });\n };\n\n const closeLink = async (origin: string, reason: string) => {\n const state = links.get(origin);\n links.delete(origin);\n await state?.link.stop();\n await deps.pool.drop(origin);\n if (state) logEvent(\"link_closed\", { appOrigin: origin, reason });\n };\n\n const toolsDeps = (): AgentToolsDeps => ({\n profiles: profiles.filter((profile) =>\n agents.some((agent) => agent.id === profile.id),\n ),\n hostCommand: join(paths.root, \"bin\", \"parlor-host\"),\n env: agentEnvironment,\n });\n\n const toolsOf = (grant: AppGrant | undefined): ConnectedTools | undefined => {\n const tools = grant?.agentTools;\n if (!tools?.on || !tools.name || !tools.agents?.length) return undefined;\n return {\n name: tools.name,\n agents: agentNames(profiles, { name: tools.name, agents: tools.agents }),\n };\n };\n\n /** The skill that sends the agents to the app's tools when the user names it, kept current. */\n const writeSkills = async (grant: AppGrant) => {\n const tools = grant.agentTools;\n if (grant.dev || !tools?.on || !tools.name || !tools.agents?.length) return;\n await writeAgentSkills(\n tools.agents,\n {\n name: tools.name,\n appName: grant.appName,\n appOrigin: grant.appOrigin,\n account: grant.account.email ?? grant.account.name,\n },\n await agentEnvironment(),\n );\n };\n\n let toolsWork: Promise<unknown> = Promise.resolve();\n /** Registering and removing the app with the agents runs one at a time, on the grant as saved by then. */\n const serially = <T>(work: () => Promise<T>): Promise<T> => {\n const next = toolsWork.then(work, work);\n toolsWork = next.catch(() => undefined);\n return next;\n };\n\n /** Registers the app with the agents here once the user chose it and it is not yet. */\n const ensureAgentTools = (grant: AppGrant): Promise<AppGrant> =>\n serially(() => ensureAgentToolsNow(grant));\n\n const ensureAgentToolsNow = async (grant: AppGrant): Promise<AppGrant> => {\n if (!grant.agentTools?.on || grant.dev) return grant;\n if (grant.agentTools.agents) {\n await writeSkills(grant);\n return grant;\n }\n const registered = await registerAgentTools(toolsDeps(), grant);\n const next: AppGrant = { ...grant, agentTools: { on: true, ...registered } };\n await deps.grants.save(next);\n await writeSkills(next);\n return next;\n };\n\n /** Hands the app to agents installed since it was registered with the ones here then. */\n const handToNewAgents = (origin: string) =>\n serially(async () => {\n const grant = await deps.grants.get(origin);\n if (grant) await handToNewAgentsNow(grant);\n });\n\n const handToNewAgentsNow = async (grant: AppGrant) => {\n const tools = grant.agentTools;\n if (grant.declined || grant.dev || !tools?.on || !tools.agents) return;\n const have = new Set(tools.agents);\n const fresh = toolsDeps().profiles.filter((profile) => !have.has(profile.id));\n if (fresh.length === 0) {\n await writeSkills(grant);\n return;\n }\n const registered = await registerAgentTools(\n { ...toolsDeps(), profiles: fresh },\n grant,\n );\n if (registered.agents.length === 0) {\n await writeSkills(grant);\n return;\n }\n const next: AppGrant = {\n ...grant,\n agentTools: {\n on: true,\n name: registered.name,\n agents: [...tools.agents, ...registered.agents],\n },\n };\n await deps.grants.save(next);\n latest.set(grant.appOrigin, next);\n await writeSkills(next);\n };\n\n let checking: Promise<void> | undefined;\n let checkAgain = false;\n /**\n * Looks for the agents again because a tab asked: one installed since this computer\n * started shows in every app's sidebar, and gets the apps the user let its agents use.\n */\n const checkAgents = (): Promise<void> => {\n if (checking) {\n checkAgain = true;\n return checking;\n }\n checking = (async () => {\n do {\n checkAgain = false;\n await rereadAgentPath();\n const found = await findAgents(listedProfiles);\n profiles = found.profiles;\n agents = [...found.agents];\n for (const grant of await deps.grants.list()) {\n await handToNewAgents(grant.appOrigin).catch((error: unknown) =>\n logEvent(\"agent_tools_failed\", {\n appOrigin: grant.appOrigin,\n error: String(error),\n }),\n );\n }\n await Promise.all(\n [...links.values()].map((state) => report(state, true).catch(() => undefined)),\n );\n logEvent(\"agents_checked\", { agents: agents.map((agent) => agent.id) });\n } while (checkAgain);\n })().finally(() => {\n checking = undefined;\n });\n return checking;\n };\n\n const removeAgentTools = (grant: AppGrant | undefined) =>\n serially(async () => {\n const tools = grant?.agentTools;\n if (!tools?.name || !tools.agents?.length) return;\n await unregisterAgentTools(toolsDeps(), { name: tools.name, agents: tools.agents });\n await removeAgentSkills(tools.agents, tools.name, await agentEnvironment());\n });\n\n const agentTokens = new Map<\n string,\n { readonly token: string; readonly expiresAt: number }\n >();\n /** The grant as last saved, which a link opened before a change still holds the old copy of. */\n const latest = new Map<string, AppGrant>();\n\n deps.proxy.serveOutside((appOrigin) => {\n const state = links.get(appOrigin);\n if (!state || state.link.grant.dev) return undefined;\n const grant = latest.get(appOrigin) ?? state.link.grant;\n if (!grant.agentTools?.on || !grant.agentTools.name) return undefined;\n return {\n appOrigin,\n appName: grant.appName,\n name: grant.agentTools.name,\n account: grant.account.email ?? grant.account.name,\n token: async (agent) => {\n const key = `${grant.grantId}\\n${agent}`;\n const held = agentTokens.get(key);\n if (held && held.expiresAt - AGENT_TOKEN_MARGIN_MS > Date.now())\n return held.token;\n if (state.link.protocol === undefined) throw new AppNotAnswering();\n const fresh = await state.link.api.calls.call(\"hostAgentToken\", {\n agent: `${agent} on ${name}`.slice(0, 120),\n });\n agentTokens.set(key, fresh);\n return fresh.token;\n },\n askHere: async (question) =>\n (await deps.prompter.answerHere({\n appName: grant.appName,\n agent: \"Parlor Host\",\n question,\n choices: [\n { id: \"allow\", label: \"Allow\" },\n { id: \"deny\", label: \"Don't allow\" },\n ],\n })) === \"allow\",\n };\n });\n\n const forget = async (grant: AppGrant) => {\n await removeAgentTools((await deps.grants.get(grant.appOrigin)) ?? grant);\n latest.delete(grant.appOrigin);\n for (const key of agentTokens.keys()) {\n if (key.startsWith(`${grant.grantId}\\n`)) agentTokens.delete(key);\n }\n devTokens.delete(grant.appOrigin);\n await deps.grants.remove(grant.appOrigin);\n await deps.keys.remove(grant.appOrigin);\n await deps.trust.forget(grant.appOrigin);\n await deps.pool.forget(grant);\n };\n\n const open = (grant: AppGrant, keys: HostKeys): LinkState => {\n void surveyAgents().catch(() => undefined);\n const origin = grant.appOrigin;\n latest.set(origin, grant);\n let state: LinkState;\n const link = createAppLink(grant, {\n keys,\n hostVersion: deps.release.version,\n hostName: name,\n platform,\n fetch: (input, init) => fetch(input, init),\n onWake: () => wake(state),\n onAgentsCheck: () => void checkAgents(),\n onWarm: (_link, agentId) => warm(state, agentId),\n onPushed: (_link, turn) => {\n // Tells the app this computer has the turn, while it already starts on it.\n void link.api.calls\n .call(\"hostAppend\", { turnId: turn.turnId, items: [] })\n .catch(() => undefined);\n run(state, turn, \"pushed\");\n },\n busy: () => state.turns > 0,\n onRevoked: () => {\n if (links.get(origin) !== state) return;\n if (grant.dev) void reattach(grant);\n else {\n const removedFrom = toolsOf(latest.get(origin) ?? grant)?.agents;\n void closeLink(origin, \"revoked\")\n .then(() => forget(grant))\n .then(() =>\n deps.prompter.disconnected?.({ appName: grant.appName, removedFrom }),\n );\n }\n },\n onIncompatible: (refused, welcome) => {\n state.incompatible = incompatibleMessage(refused, welcome);\n process.stderr.write(`${printable(state.incompatible)}\\n`);\n },\n });\n state = {\n link,\n keys,\n claiming: undefined,\n again: false,\n incompatible: undefined,\n turns: 0,\n };\n links.set(origin, state);\n link.start();\n return state;\n };\n\n const pinnedDevices = async (state: LinkState) => {\n if (state.link.grant.dev) return {};\n const [pinned, policy] = await Promise.all([\n deps.trust.list(state.link.grant.appOrigin),\n loadPolicy(paths.policy, deps.policy),\n ]);\n const presenceDue: Record<string, number> = {};\n for (const device of pinned) {\n const due = presenceDueAt(policy, device);\n if (due !== undefined) presenceDue[device.deviceId] = due;\n }\n return { devices: pinned.map((device) => device.deviceId), presenceDue };\n };\n\n /** The agents with what they said about themselves, and the name they use the app by outside. */\n const describeFor = (origin: string) => {\n const tools = latest.get(origin)?.agentTools;\n return learned\n .describe(agents, Date.now())\n .map((agent) =>\n tools?.on && tools.name && tools.agents?.includes(agent.id)\n ? { ...agent, outsideName: tools.name }\n : agent,\n );\n };\n\n /** `agentsChecked` when the agents were just looked for, which a tab waiting on a check reads. */\n const report = async (state: LinkState, agentsChecked = false) => {\n const reported = state.link.api.calls.call(\"hostReport\", {\n online: true,\n agents: describeFor(state.link.grant.appOrigin),\n ...(await pinnedDevices(state)),\n ...(agentsChecked ? { agentsChecked: true as const } : {}),\n });\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"The app did not answer in time.\")),\n CONNECT_TIMEOUT_MS,\n ),\n );\n try {\n await Promise.race([reported, timeout]);\n } catch (error) {\n throw new Error(\n state.incompatible ?? (error instanceof Error ? error.message : String(error)),\n { cause: error },\n );\n }\n };\n\n const devGrant = async (origin: string): Promise<AppGrant> => {\n const manifest = await fetch(`${origin}/_parlor/manifest`)\n .then((response) => response.json() as Promise<{ app?: { name?: string } }>)\n .catch(() => undefined);\n return {\n appOrigin: origin,\n appName: manifest?.app?.name ?? new URL(origin).host,\n grantId: asId(\"grant\", \"dev\"),\n hostId: asId(\"host\", \"dev\"),\n account: { userId: DEV_USER_ID, name: \"Developer\" },\n workspace: workspaceOf(paths.workspaces, origin),\n createdAt: Date.now(),\n dev: true,\n };\n };\n\n const attach = async (origin: string, hostToken: string) => {\n await closeLink(origin, \"replaced\");\n devTokens.set(origin, hostToken);\n await report(open(await devGrant(origin), devHostKeys(hostToken)), true);\n };\n\n const reattach = async (grant: AppGrant) => {\n await closeLink(grant.appOrigin, \"dev_server_restarted\");\n if (!devTokens.has(grant.appOrigin)) return;\n try {\n const token = await requestDevHostToken(grant.appOrigin);\n if (devTokens.has(grant.appOrigin)) await attach(grant.appOrigin, token);\n } catch (error) {\n logEvent(\"dev_attach_failed\", { appOrigin: grant.appOrigin, error: String(error) });\n }\n };\n\n const status = (): LocalHostStatus => ({\n state: \"running\",\n version: deps.release.version,\n apps: [...links.keys()],\n });\n\n const grantsOf = () =>\n [...links.values()].map(({ link: { grant } }) => ({\n appOrigin: grant.appOrigin,\n appName: grant.appName,\n grantId: grant.grantId,\n }));\n\n const daemon: ServiceDaemon = {\n drained,\n async start() {\n let finishStartup!: () => void;\n let failStartup!: (error: unknown) => void;\n startup = new Promise<void>((resolve, reject) => {\n finishStartup = resolve;\n failStartup = reject;\n });\n startup.catch(() => undefined);\n try {\n await mkdir(paths.root, { recursive: true, mode: 0o700 });\n await withInheritedLock(paths.lock, deps.lockToken, async () => {\n const answering = await connectControl(paths.control);\n if (answering) {\n answering.close();\n throw new HostAlreadyRunning();\n }\n await mkdir(dirname(paths.control), { recursive: true, mode: 0o700 });\n control = createServer(serve);\n await rm(paths.control, { force: true });\n await new Promise<void>((resolve, reject) => {\n control!.once(\"error\", reject);\n control!.listen(paths.control, () => resolve());\n });\n await chmod(paths.control, 0o600);\n });\n openHostLog(join(paths.root, \"logs\", \"daemon.log\"));\n await putHostCommandFirstOnPath(paths.root);\n await deps.proxy.listen(paths.proxy);\n listedProfiles = await loadProfiles(paths.agents);\n const found = await findAgents(listedProfiles);\n profiles = found.profiles;\n agents = [...found.agents];\n await learned.load();\n finishStartup();\n } catch (error) {\n failStartup(error);\n throw error;\n }\n logEvent(\"daemon_started\", {\n version: deps.release.version,\n agents: agents.map((a) => a.id),\n });\n for (const grant of await deps.grants.list()) {\n if (grant.declined) continue;\n void handToNewAgents(grant.appOrigin).catch(() => undefined);\n void report(open(grant, deps.keys), true).catch((error: unknown) =>\n logEvent(\"link_failed\", { appOrigin: grant.appOrigin, error: String(error) }),\n );\n }\n },\n async connect(appOrigin) {\n const saved = await deps.grants.get(appOrigin);\n if (!saved || saved.declined) {\n throw new Error(`This computer is not connected to ${appOrigin}.`);\n }\n const grant = await ensureAgentTools(saved);\n const current = links.get(appOrigin);\n if (current?.link.grant.grantId === grant.grantId) {\n latest.set(appOrigin, grant);\n await report(current, true);\n return toolsOf(grant);\n }\n await closeLink(appOrigin, \"replaced\");\n if (current) await deps.pool.forget(current.link.grant);\n latest.set(appOrigin, grant);\n await report(open(grant, deps.keys), true);\n return toolsOf(grant);\n },\n async agentTools(appOrigin, on) {\n const saved = await deps.grants.get(appOrigin);\n if (!saved || saved.declined || saved.dev) {\n throw new Error(`This computer is not connected to ${appOrigin}.`);\n }\n if (!on) await removeAgentTools(saved);\n const grant = await ensureAgentTools({ ...saved, agentTools: { on } });\n if (!on) await deps.grants.save(grant);\n latest.set(appOrigin, grant);\n const state = links.get(appOrigin);\n if (state) await report(state).catch(() => undefined);\n return toolsOf(grant);\n },\n async disconnect(appOrigin) {\n const state = links.get(appOrigin);\n const grant = (await deps.grants.get(appOrigin)) ?? state?.link.grant;\n if (!grant) throw new Error(`This computer is not connected to ${appOrigin}.`);\n const removed = toolsOf(grant);\n if (state) {\n await state.link.stop({ revoke: true });\n } else {\n await revokeGrant({\n appOrigin,\n appName: grant.appName,\n assert: (request) => deps.keys.assert(appOrigin, request),\n });\n }\n await closeLink(appOrigin, \"disconnected\");\n await forget(grant);\n return removed;\n },\n async handover() {\n if (handedOver) return;\n handedOver = true;\n stopping.abort();\n for (const state of links.values()) state.link.drain();\n await Promise.all([...links.values()].map((state) => state.claiming));\n const closing = control;\n control = undefined;\n closing?.close();\n await Promise.all([rm(paths.control, { force: true }), deps.proxy.stopListening()]);\n logEvent(\"handover_started\", { version: deps.release.version });\n },\n async stop() {\n stopping.abort();\n if (!handedOver) {\n await Promise.all(\n [...links.values()].map((state) =>\n Promise.race([\n state.link.api.calls.call(\"hostReport\", {\n online: false,\n agents: describeFor(state.link.grant.appOrigin),\n }),\n new Promise((resolve) => setTimeout(resolve, OFFLINE_REPORT_MS)),\n ]).catch(() => undefined),\n ),\n );\n }\n for (const origin of [...links.keys()]) await closeLink(origin, \"stopped\");\n for (const socket of clients) socket.destroy();\n const closing = control;\n control = undefined;\n if (closing) await new Promise<void>((resolve) => closing.close(() => resolve()));\n if (!handedOver) await rm(paths.control, { force: true });\n await deps.proxy.close();\n },\n };\n\n const settleHandover = () => {\n if (!handedOver || running.size > 0 || finishing) return;\n finishing = true;\n void (async () => {\n for (const origin of [...links.keys()]) await closeLink(origin, \"handed_over\");\n await Promise.all(\n [...clients].map(\n (socket) =>\n new Promise<void>((resolve) => {\n socket.end(() => resolve());\n setTimeout(resolve, OFFLINE_REPORT_MS).unref();\n }),\n ),\n );\n logEvent(\"handover_finished\", { version: deps.release.version });\n finishHandover();\n })();\n };\n\n const handOverTo = async (binary: string, signature: string): Promise<unknown> => {\n const release = await signedRelease(binary, signature, RELEASE_KEY);\n if (!release) return { ok: false, error: \"unsigned\" };\n if (compareVersions(release.version, deps.release.version) <= 0) {\n return { ok: false, error: \"downgrade\" };\n }\n if (!(await installRelease(paths, { binary, signature }, release))) {\n return { ok: false, error: \"unsigned\" };\n }\n await installLoginItem(paths);\n await daemon.handover();\n setImmediate(settleHandover);\n return { ok: true };\n };\n\n const pairings = new Map<string, LocalPairing>();\n\n const pendingPairing = (appOrigin: string) => {\n const origin = new URL(appOrigin).origin;\n return { origin, pairing: pairings.get(origin) };\n };\n\n const confirmPairing = async (\n request: Extract<ControlRequest, { readonly op: \"confirm_local_pairing\" }>,\n ): Promise<unknown> => {\n const { origin, pairing } = pendingPairing(request.appOrigin);\n if (!pairing) return { ok: false, error: \"No pairing was started for this app.\" };\n pairings.delete(origin);\n let outcome: Awaited<ReturnType<LocalPairing[\"confirm\"]>>;\n try {\n outcome = await pairing.confirm(request.connect);\n } catch (error) {\n if (!(error instanceof UnrevokedGrant)) throw error;\n await deps.grants.save(error.grant);\n return { ok: false, error: \"declined_locally\" };\n }\n if (!outcome.paired) return { ok: false, error: outcome.reason };\n const { grant } = outcome;\n await deps.grants.save(grant);\n const device = pairingDeviceOf(request.device);\n if (device) {\n await deps.trust.pin(grant.appOrigin, {\n deviceId: asId(\"device\", device.deviceId),\n signingKey: device.signingKey,\n presenceKey: device.presenceKey,\n name: device.name,\n platform: device.platform,\n approvedAt: Date.now(),\n via: \"pairing\",\n });\n }\n await daemon.connect(grant.appOrigin);\n return { ok: true };\n };\n\n const handle = async (request: ControlRequest): Promise<unknown> => {\n if (request.op !== \"hello\") await startup;\n switch (request.op) {\n case \"hello\":\n return { ok: true, release: deps.release };\n case \"handover\":\n return handOverTo(request.binary, request.signature);\n case \"status\":\n return { ok: true, status: status(), grants: grantsOf() };\n case \"begin_local_pairing\": {\n const { origin } = pendingPairing(request.appOrigin);\n const existing = await deps.grants.get(origin);\n if (existing && !existing.declined) {\n return {\n ok: false,\n error: `This computer is already connected to ${existing.appName}.`,\n };\n }\n const pairing = startLocalPairing({\n appOrigin: origin,\n hostName: name,\n platform,\n keys: deps.keys,\n workspaceRoot: paths.workspaces,\n });\n pairings.set(origin, pairing);\n const begun = await pairing.pairing;\n logEvent(\"local_pairing_begun\", {\n appOrigin: origin,\n matchingCode: begun.matchingCode,\n });\n return { ok: true, pairing: begun };\n }\n case \"finish_local_pairing\": {\n const { pairing } = pendingPairing(request.appOrigin);\n if (!pairing) return { ok: false, error: \"No pairing was started for this app.\" };\n return { ok: true, ...(await pairing.finish(request.code)) };\n }\n case \"confirm_local_pairing\":\n return confirmPairing(request);\n case \"connect\": {\n const agentTools = await daemon.connect(request.appOrigin);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"disconnect\": {\n const agentTools = await daemon.disconnect(request.appOrigin);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"agent_tools\": {\n const agentTools = await daemon.agentTools(request.appOrigin, request.on);\n return { ok: true, ...(agentTools ? { agentTools } : {}) };\n }\n case \"dev_attach\":\n await attach(request.appOrigin, request.hostToken);\n return { ok: true };\n case \"dev_detach\":\n devTokens.delete(request.appOrigin);\n await closeLink(request.appOrigin, \"detached\");\n return { ok: true };\n }\n };\n\n function serve(socket: Socket) {\n clients.add(socket);\n socket.on(\"close\", () => clients.delete(socket));\n socket.on(\"error\", () => socket.destroy());\n onLines(socket, (line) => {\n let request: ControlRequest;\n try {\n request = JSON.parse(line) as ControlRequest;\n } catch {\n socket.write(`${JSON.stringify({ ok: false, error: \"Not JSON.\" })}\\n`);\n return;\n }\n void handle(request)\n .catch((error: unknown) => ({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n }))\n .then((reply) => {\n if (!socket.destroyed)\n socket.write(\n `${JSON.stringify(reply ?? { ok: false, error: \"Unknown op.\" })}\\n`,\n );\n });\n });\n }\n\n return daemon;\n}\n"]}
|
package/dist/link.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface AppLinkDeps {
|
|
|
21
21
|
readonly onWake: (link: AppLink) => void;
|
|
22
22
|
/** A tab asked this computer to look again for the agents installed on it. */
|
|
23
23
|
readonly onAgentsCheck?: ((link: AppLink) => void) | undefined;
|
|
24
|
+
/** A tab may soon start a thread with this agent here, so it may start now. */
|
|
25
|
+
readonly onWarm?: ((link: AppLink, agentId: string) => void) | undefined;
|
|
24
26
|
/** The app claimed a turn for this computer and pushed it, saving the claim. */
|
|
25
27
|
readonly onPushed?: ((link: AppLink, turn: ClaimedTurn) => void) | undefined;
|
|
26
28
|
/** Whether a turn runs on this link, which keeps a poll deployment's `/sync` at the active interval. */
|
package/dist/link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,WAAW,EAGhB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,iBAAiB,EAAyB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,cAAc,OAAQ,CAAC;AACpC,eAAO,MAAM,YAAY,QAAS,CAAC;AAKnC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAChD,6FAA6F;IAC7F,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/D,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzE,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7E,wGAAwG;IACxG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC9C,qFAAqF;IACrF,QAAQ,CAAC,cAAc,EAAE,CACvB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;KAAE,CAAC,KACxD,IAAI,CAAC;CACX;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAElE,2FAA2F;AAC3F,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;IACd,6FAA6F;IAC7F,KAAK,IAAI,IAAI,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAgHD,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CA2NzE"}
|
package/dist/link.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CHAT_ACTIVITY_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_CHANNEL, CHAT_TAG, HOST_PROTOCOL, } from "@parlor/chat";
|
|
1
|
+
import { CHAT_ACTIVITY_TAG, CHAT_AGENT_WARM_TAG, CHAT_AGENTS_CHECK_TAG, CHAT_CHANNEL, CHAT_TAG, HOST_PROTOCOL, } from "@parlor/chat";
|
|
2
2
|
import { MAX_STREAM_BODY_BYTES } from "@parlor/chat/server";
|
|
3
3
|
import { createActionClient, createPluginClient, } from "@parlor/client";
|
|
4
4
|
import { BUILD_HEADER } from "@parlor/sync";
|
|
@@ -15,6 +15,17 @@ const MAX_BATCH_BYTES = (MAX_STREAM_BODY_BYTES * 3) / 4;
|
|
|
15
15
|
class LinkDown extends Error {
|
|
16
16
|
name = "LinkDown";
|
|
17
17
|
}
|
|
18
|
+
/** The agents tabs asked this computer, of all the user's, to start. */
|
|
19
|
+
function warmedHere(events, hostId) {
|
|
20
|
+
const agents = new Set();
|
|
21
|
+
for (const event of events) {
|
|
22
|
+
for (const [head, host, agentId] of event.tags) {
|
|
23
|
+
if (head === CHAT_AGENT_WARM_TAG && host === hostId && typeof agentId === "string")
|
|
24
|
+
agents.add(agentId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return agents;
|
|
28
|
+
}
|
|
18
29
|
function coalesce(frames) {
|
|
19
30
|
const merged = [];
|
|
20
31
|
for (const frame of frames) {
|
|
@@ -259,6 +270,10 @@ export function createAppLink(grant, deps) {
|
|
|
259
270
|
deps.onWake(link);
|
|
260
271
|
if (modeNow() === "serving" && heads.includes(CHAT_AGENTS_CHECK_TAG))
|
|
261
272
|
deps.onAgentsCheck?.(link);
|
|
273
|
+
if (modeNow() === "serving") {
|
|
274
|
+
for (const agentId of warmedHere(events, grant.hostId))
|
|
275
|
+
deps.onWarm?.(link, agentId);
|
|
276
|
+
}
|
|
262
277
|
},
|
|
263
278
|
channels: [
|
|
264
279
|
{
|
package/dist/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CHAT_ACTIVITY_TAG,\n CHAT_AGENTS_CHECK_TAG,\n CHAT_CHANNEL,\n CHAT_TAG,\n type ClaimedTurn,\n HOST_PROTOCOL,\n type HostFrame,\n type HostStreamBatch,\n type HostWelcome,\n type PushedTurn,\n} from \"@parlor/chat\";\nimport { type ChatHostActionMap, MAX_STREAM_BODY_BYTES } from \"@parlor/chat/server\";\nimport {\n createActionClient,\n createPluginClient,\n type PluginClient,\n} from \"@parlor/client\";\nimport type { TurnId } from \"@parlor/core\";\nimport { BUILD_HEADER } from \"@parlor/sync\";\nimport { createSyncClient, type SyncClient } from \"@parlor/sync/client\";\n\nimport type { AppGrant, HostKeys } from \"./grants.js\";\nimport { logEvent } from \"./log.js\";\nimport { revokeGrant } from \"./revoke.js\";\n\nexport const RECONNECT_MAX_MS = 4_000;\nexport const ACTIVE_POLL_MS = 2_000;\nexport const IDLE_POLL_MS = 15_000;\n\nconst USER_ACTIVE_WINDOW_MS = 2 * 60_000;\nconst REQUEST_TIMEOUT_MS = 10_000;\n\nexport interface HostApi {\n readonly calls: PluginClient<ChatHostActionMap>;\n /** At most one post in flight per turn; frames produced meanwhile coalesce into the next. */\n stream(batch: HostStreamBatch): void;\n heartbeat(): Promise<void>;\n}\n\nexport interface AppLinkDeps {\n readonly keys: HostKeys;\n readonly hostVersion: string;\n readonly hostName: string;\n readonly platform: string;\n readonly fetch: typeof fetch;\n /** A turn may be waiting: claim until not_found, then ask for running turns' signals. */\n readonly onWake: (link: AppLink) => void;\n /** A tab asked this computer to look again for the agents installed on it. */\n readonly onAgentsCheck?: ((link: AppLink) => void) | undefined;\n /** The app claimed a turn for this computer and pushed it, saving the claim. */\n readonly onPushed?: ((link: AppLink, turn: ClaimedTurn) => void) | undefined;\n /** Whether a turn runs on this link, which keeps a poll deployment's `/sync` at the active interval. */\n readonly busy?: (() => boolean) | undefined;\n /** Any 401, or the stream closed for revocation. */\n readonly onRevoked: (grant: AppGrant) => void;\n /** No shared protocol: shown locally (\"update Parlor Host\"); the link stays down. */\n readonly onIncompatible: (\n grant: AppGrant,\n welcome: Extract<HostWelcome, { readonly accepted: false }>,\n ) => void;\n}\n\n/**\n * `idle` until started; `serving` wakes the host for turns; `draining` stays up for the\n * turns it runs but wakes nobody (a newer service took over the claiming); `closed` is final.\n */\nexport type LinkMode = \"idle\" | \"serving\" | \"draining\" | \"closed\";\n\n/** The host's whole conversation with one app, each request carrying a fresh assertion. */\nexport interface AppLink {\n readonly grant: AppGrant;\n readonly api: HostApi;\n /** Set once `hostHello` was welcomed; every other call waits for it. */\n readonly protocol: number | undefined;\n readonly mode: LinkMode;\n start(): void;\n /** Stops waking the host and keeps everything else, so running turns finish on this link. */\n drain(): void;\n /** With `revoke`, a refused revoke throws and leaves the link running. */\n stop(options?: { readonly revoke?: boolean | undefined }): Promise<void>;\n}\n\ntype Accepted = Extract<HostWelcome, { readonly accepted: true }>;\n\nconst RETRY_BASE_MS = 250;\nconst MAX_BATCH_BYTES = (MAX_STREAM_BODY_BYTES * 3) / 4;\n\nclass LinkDown extends Error {\n override readonly name = \"LinkDown\";\n}\n\ninterface TurnStream {\n pending: HostFrame[];\n posting: Promise<void> | undefined;\n}\n\nfunction coalesce(frames: readonly HostFrame[]): HostFrame[] {\n const merged: HostFrame[] = [];\n for (const frame of frames) {\n const last = merged.at(-1);\n if (\n last?.type === \"delta\" &&\n frame.type === \"delta\" &&\n last.itemId === frame.itemId &&\n last.offset + last.text.length === frame.offset\n ) {\n merged[merged.length - 1] = { ...last, text: last.text + frame.text };\n } else {\n merged.push(frame);\n }\n }\n return merged;\n}\n\nfunction batches(frames: readonly HostFrame[]): HostFrame[][] {\n const out: HostFrame[][] = [];\n let current: HostFrame[] = [];\n let bytes = 0;\n for (const frame of frames) {\n const size = JSON.stringify(frame).length;\n if (current.length > 0 && bytes + size > MAX_BATCH_BYTES) {\n out.push(current);\n current = [];\n bytes = 0;\n }\n current.push(frame);\n bytes += size;\n }\n if (current.length > 0) out.push(current);\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nclass RequestTimeout extends Error {\n override readonly name = \"RequestTimeout\";\n constructor(ms: number) {\n super(`The app did not answer within ${ms} ms.`);\n }\n}\n\nfunction untilHeaders(inner: typeof fetch, ms: number): typeof fetch {\n return async (input, init) => {\n const own = new AbortController();\n const timer = setTimeout(() => own.abort(new RequestTimeout(ms)), ms);\n const signal = init?.signal ? AbortSignal.any([init.signal, own.signal]) : own.signal;\n try {\n return await inner(input, { ...init, signal });\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\n/** The turn a `chat` channel frame pushes to this computer; the channel's other frames are for tabs. */\nfunction pushedTurnOf(data: string): ClaimedTurn | undefined {\n try {\n const frame = JSON.parse(data) as Partial<PushedTurn>;\n return frame.type === \"claimed\" && frame.turn ? frame.turn : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction adaptivePoll(advertised: boolean, busy: () => boolean) {\n let activeUntil = 0;\n const idle = () => advertised && !busy() && Date.now() >= activeUntil;\n return {\n pollEveryMs: () => (idle() ? IDLE_POLL_MS : ACTIVE_POLL_MS),\n touch: () => {\n const wasIdle = idle();\n activeUntil = Date.now() + USER_ACTIVE_WINDOW_MS;\n return wasIdle;\n },\n };\n}\n\nexport function createAppLink(grant: AppGrant, deps: AppLinkDeps): AppLink {\n const origin = grant.appOrigin.replace(/\\/+$/, \"\");\n let welcome: Accepted | undefined;\n let mode: LinkMode = \"idle\";\n const modeNow = (): LinkMode => mode;\n let revoked = false;\n let sync: SyncClient | undefined;\n let heartbeat: NodeJS.Timeout | undefined;\n const streams = new Map<TurnId, TurnStream>();\n\n let admit: () => void = () => undefined;\n let refuse: (error: Error) => void = () => undefined;\n const welcomed = new Promise<void>((resolve, reject) => {\n admit = resolve;\n refuse = reject;\n });\n welcomed.catch(() => undefined);\n\n const signedFetch: typeof fetch = async (input, init) => {\n if (mode === \"closed\") throw new LinkDown(\"This app's link is closed.\");\n const request = new Request(input, init);\n const method = request.method === \"GET\" ? \"GET\" : \"POST\";\n const assertion = await deps.keys.assert(origin, { method, url: request.url });\n const headers = new Headers(request.headers);\n headers.set(\"authorization\", `ParlorHost ${assertion}`);\n const response = await deps.fetch(new Request(request, { headers }));\n sync?.observeBuild(response.headers.get(BUILD_HEADER));\n logEvent(\"http_request\", {\n method,\n path: new URL(request.url).pathname,\n status: response.status,\n });\n if (response.status === 401 && !revoked && modeNow() !== \"closed\") {\n revoked = true;\n queueMicrotask(() => deps.onRevoked(grant));\n }\n return response;\n };\n\n const timedFetch = untilHeaders(signedFetch, REQUEST_TIMEOUT_MS);\n\n const plugin = createPluginClient<ChatHostActionMap>(\n createActionClient({ baseUrl: origin, fetch: timedFetch }),\n \"chat\",\n );\n\n const drained = async (turnId: TurnId | undefined) => {\n if (turnId === undefined) return;\n while (true) {\n const posting = streams.get(turnId)?.posting;\n if (!posting) return;\n await posting;\n }\n };\n\n const invoke: PluginClient<ChatHostActionMap>[\"invoke\"] = async (\n name,\n input,\n options,\n ) => {\n if (name !== \"hostHello\") await welcomed;\n if (name === \"hostAppend\" || name === \"hostFinish\") {\n await drained((input as { readonly turnId?: TurnId }).turnId);\n }\n return plugin.invoke(name, input, options);\n };\n const calls: PluginClient<ChatHostActionMap> = {\n invoke,\n call: async (name, input, options) => (await invoke(name, input, options)).data,\n };\n\n const post = (path: string, body: unknown) =>\n timedFetch(`${origin}/_parlor/chat/${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const flush = async (turnId: TurnId, stream: TurnStream) => {\n while (stream.pending.length > 0) {\n if (mode === \"closed\") break;\n const frames = coalesce(stream.pending);\n stream.pending = [];\n for (const chunk of batches(frames)) {\n await post(\"stream\", { turnId, frames: chunk }).catch(() => undefined);\n }\n }\n stream.posting = undefined;\n if (stream.pending.length === 0) streams.delete(turnId);\n };\n\n const api: HostApi = {\n calls,\n stream(batch) {\n if (mode === \"closed\" || batch.frames.length === 0) return;\n let stream = streams.get(batch.turnId);\n if (!stream) {\n stream = { pending: [], posting: undefined };\n streams.set(batch.turnId, stream);\n }\n stream.pending.push(...batch.frames);\n if (!stream.posting) stream.posting = flush(batch.turnId, stream);\n },\n async heartbeat() {\n await welcomed;\n await post(\"heartbeat\", {});\n },\n };\n\n const close = () => {\n mode = \"closed\";\n sync?.stop();\n sync = undefined;\n if (heartbeat) clearInterval(heartbeat);\n heartbeat = undefined;\n refuse(new LinkDown(\"This app's link is closed.\"));\n };\n\n const hello = async (): Promise<HostWelcome | undefined> => {\n for (let attempt = 0; ; attempt += 1) {\n if (mode !== \"serving\" && mode !== \"draining\") return undefined;\n try {\n return await plugin.call(\"hostHello\", {\n protocols: { min: 1, max: HOST_PROTOCOL },\n hostVersion: deps.hostVersion,\n name: deps.hostName,\n platform: deps.platform,\n agents: [],\n });\n } catch {\n if (revoked || modeNow() === \"closed\") return undefined;\n await sleep(Math.min(RETRY_BASE_MS * 2 ** attempt, RECONNECT_MAX_MS));\n }\n }\n };\n\n const link: AppLink = {\n grant,\n api,\n get protocol() {\n return welcome?.protocol;\n },\n get mode() {\n return mode;\n },\n start() {\n if (mode !== \"idle\") return;\n mode = \"serving\";\n void hello().then((answer) => {\n if (!answer || modeNow() === \"closed\") return;\n if (!answer.accepted) {\n close();\n logEvent(\"link_closed\", { appOrigin: origin, reason: \"incompatible\" });\n deps.onIncompatible(grant, answer);\n return;\n }\n welcome = answer;\n admit();\n const polling = adaptivePoll(\n answer.userActivity === true,\n () => deps.busy?.() ?? false,\n );\n sync = createSyncClient({\n request: (path, init) => signedFetch(`${origin}${path}`, init),\n coalesceMs: 0,\n reconnectMaxMs: RECONNECT_MAX_MS,\n pollEveryMs: polling.pollEveryMs,\n onEvents: (events) => {\n const heads = events.flatMap((event) => event.tags.map((tag) => tag[0]));\n if (heads.some((head) => head === CHAT_TAG || head === CHAT_ACTIVITY_TAG)) {\n if (polling.touch()) sync?.reconnectNow();\n }\n if (modeNow() === \"serving\" && heads.includes(CHAT_TAG)) deps.onWake(link);\n if (modeNow() === \"serving\" && heads.includes(CHAT_AGENTS_CHECK_TAG))\n deps.onAgentsCheck?.(link);\n },\n channels: [\n {\n event: CHAT_CHANNEL,\n opened: () => undefined,\n closed: () => undefined,\n receive: (data) => {\n const turn = pushedTurnOf(data);\n if (turn && modeNow() === \"serving\") deps.onPushed?.(link, turn);\n },\n },\n ],\n onUnauthorized: () => undefined,\n onError: () => undefined,\n });\n sync.start();\n heartbeat = setInterval(\n () => void api.heartbeat().catch(() => undefined),\n answer.heartbeatMs,\n );\n heartbeat.unref();\n if (modeNow() === \"serving\") deps.onWake(link);\n });\n },\n drain() {\n if (mode === \"serving\") mode = \"draining\";\n },\n async stop(options = {}) {\n if (options.revoke && !grant.dev) {\n await revokeGrant({\n appOrigin: origin,\n appName: grant.appName,\n assert: (request) => deps.keys.assert(origin, request),\n fetch: deps.fetch,\n });\n }\n close();\n },\n };\n return link;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CHAT_ACTIVITY_TAG,\n CHAT_AGENT_WARM_TAG,\n CHAT_AGENTS_CHECK_TAG,\n CHAT_CHANNEL,\n CHAT_TAG,\n type ClaimedTurn,\n HOST_PROTOCOL,\n type HostFrame,\n type HostStreamBatch,\n type HostWelcome,\n type PushedTurn,\n} from \"@parlor/chat\";\nimport { type ChatHostActionMap, MAX_STREAM_BODY_BYTES } from \"@parlor/chat/server\";\nimport {\n createActionClient,\n createPluginClient,\n type PluginClient,\n} from \"@parlor/client\";\nimport type { TurnId } from \"@parlor/core\";\nimport { BUILD_HEADER } from \"@parlor/sync\";\nimport { createSyncClient, type SyncClient } from \"@parlor/sync/client\";\n\nimport type { AppGrant, HostKeys } from \"./grants.js\";\nimport { logEvent } from \"./log.js\";\nimport { revokeGrant } from \"./revoke.js\";\n\nexport const RECONNECT_MAX_MS = 4_000;\nexport const ACTIVE_POLL_MS = 2_000;\nexport const IDLE_POLL_MS = 15_000;\n\nconst USER_ACTIVE_WINDOW_MS = 2 * 60_000;\nconst REQUEST_TIMEOUT_MS = 10_000;\n\nexport interface HostApi {\n readonly calls: PluginClient<ChatHostActionMap>;\n /** At most one post in flight per turn; frames produced meanwhile coalesce into the next. */\n stream(batch: HostStreamBatch): void;\n heartbeat(): Promise<void>;\n}\n\nexport interface AppLinkDeps {\n readonly keys: HostKeys;\n readonly hostVersion: string;\n readonly hostName: string;\n readonly platform: string;\n readonly fetch: typeof fetch;\n /** A turn may be waiting: claim until not_found, then ask for running turns' signals. */\n readonly onWake: (link: AppLink) => void;\n /** A tab asked this computer to look again for the agents installed on it. */\n readonly onAgentsCheck?: ((link: AppLink) => void) | undefined;\n /** A tab may soon start a thread with this agent here, so it may start now. */\n readonly onWarm?: ((link: AppLink, agentId: string) => void) | undefined;\n /** The app claimed a turn for this computer and pushed it, saving the claim. */\n readonly onPushed?: ((link: AppLink, turn: ClaimedTurn) => void) | undefined;\n /** Whether a turn runs on this link, which keeps a poll deployment's `/sync` at the active interval. */\n readonly busy?: (() => boolean) | undefined;\n /** Any 401, or the stream closed for revocation. */\n readonly onRevoked: (grant: AppGrant) => void;\n /** No shared protocol: shown locally (\"update Parlor Host\"); the link stays down. */\n readonly onIncompatible: (\n grant: AppGrant,\n welcome: Extract<HostWelcome, { readonly accepted: false }>,\n ) => void;\n}\n\n/**\n * `idle` until started; `serving` wakes the host for turns; `draining` stays up for the\n * turns it runs but wakes nobody (a newer service took over the claiming); `closed` is final.\n */\nexport type LinkMode = \"idle\" | \"serving\" | \"draining\" | \"closed\";\n\n/** The host's whole conversation with one app, each request carrying a fresh assertion. */\nexport interface AppLink {\n readonly grant: AppGrant;\n readonly api: HostApi;\n /** Set once `hostHello` was welcomed; every other call waits for it. */\n readonly protocol: number | undefined;\n readonly mode: LinkMode;\n start(): void;\n /** Stops waking the host and keeps everything else, so running turns finish on this link. */\n drain(): void;\n /** With `revoke`, a refused revoke throws and leaves the link running. */\n stop(options?: { readonly revoke?: boolean | undefined }): Promise<void>;\n}\n\ntype Accepted = Extract<HostWelcome, { readonly accepted: true }>;\n\nconst RETRY_BASE_MS = 250;\nconst MAX_BATCH_BYTES = (MAX_STREAM_BODY_BYTES * 3) / 4;\n\nclass LinkDown extends Error {\n override readonly name = \"LinkDown\";\n}\n\ninterface TurnStream {\n pending: HostFrame[];\n posting: Promise<void> | undefined;\n}\n\n/** The agents tabs asked this computer, of all the user's, to start. */\nfunction warmedHere(\n events: readonly { readonly tags: readonly (readonly (string | number)[])[] }[],\n hostId: string,\n): Set<string> {\n const agents = new Set<string>();\n for (const event of events) {\n for (const [head, host, agentId] of event.tags) {\n if (head === CHAT_AGENT_WARM_TAG && host === hostId && typeof agentId === \"string\")\n agents.add(agentId);\n }\n }\n return agents;\n}\n\nfunction coalesce(frames: readonly HostFrame[]): HostFrame[] {\n const merged: HostFrame[] = [];\n for (const frame of frames) {\n const last = merged.at(-1);\n if (\n last?.type === \"delta\" &&\n frame.type === \"delta\" &&\n last.itemId === frame.itemId &&\n last.offset + last.text.length === frame.offset\n ) {\n merged[merged.length - 1] = { ...last, text: last.text + frame.text };\n } else {\n merged.push(frame);\n }\n }\n return merged;\n}\n\nfunction batches(frames: readonly HostFrame[]): HostFrame[][] {\n const out: HostFrame[][] = [];\n let current: HostFrame[] = [];\n let bytes = 0;\n for (const frame of frames) {\n const size = JSON.stringify(frame).length;\n if (current.length > 0 && bytes + size > MAX_BATCH_BYTES) {\n out.push(current);\n current = [];\n bytes = 0;\n }\n current.push(frame);\n bytes += size;\n }\n if (current.length > 0) out.push(current);\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nclass RequestTimeout extends Error {\n override readonly name = \"RequestTimeout\";\n constructor(ms: number) {\n super(`The app did not answer within ${ms} ms.`);\n }\n}\n\nfunction untilHeaders(inner: typeof fetch, ms: number): typeof fetch {\n return async (input, init) => {\n const own = new AbortController();\n const timer = setTimeout(() => own.abort(new RequestTimeout(ms)), ms);\n const signal = init?.signal ? AbortSignal.any([init.signal, own.signal]) : own.signal;\n try {\n return await inner(input, { ...init, signal });\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\n/** The turn a `chat` channel frame pushes to this computer; the channel's other frames are for tabs. */\nfunction pushedTurnOf(data: string): ClaimedTurn | undefined {\n try {\n const frame = JSON.parse(data) as Partial<PushedTurn>;\n return frame.type === \"claimed\" && frame.turn ? frame.turn : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction adaptivePoll(advertised: boolean, busy: () => boolean) {\n let activeUntil = 0;\n const idle = () => advertised && !busy() && Date.now() >= activeUntil;\n return {\n pollEveryMs: () => (idle() ? IDLE_POLL_MS : ACTIVE_POLL_MS),\n touch: () => {\n const wasIdle = idle();\n activeUntil = Date.now() + USER_ACTIVE_WINDOW_MS;\n return wasIdle;\n },\n };\n}\n\nexport function createAppLink(grant: AppGrant, deps: AppLinkDeps): AppLink {\n const origin = grant.appOrigin.replace(/\\/+$/, \"\");\n let welcome: Accepted | undefined;\n let mode: LinkMode = \"idle\";\n const modeNow = (): LinkMode => mode;\n let revoked = false;\n let sync: SyncClient | undefined;\n let heartbeat: NodeJS.Timeout | undefined;\n const streams = new Map<TurnId, TurnStream>();\n\n let admit: () => void = () => undefined;\n let refuse: (error: Error) => void = () => undefined;\n const welcomed = new Promise<void>((resolve, reject) => {\n admit = resolve;\n refuse = reject;\n });\n welcomed.catch(() => undefined);\n\n const signedFetch: typeof fetch = async (input, init) => {\n if (mode === \"closed\") throw new LinkDown(\"This app's link is closed.\");\n const request = new Request(input, init);\n const method = request.method === \"GET\" ? \"GET\" : \"POST\";\n const assertion = await deps.keys.assert(origin, { method, url: request.url });\n const headers = new Headers(request.headers);\n headers.set(\"authorization\", `ParlorHost ${assertion}`);\n const response = await deps.fetch(new Request(request, { headers }));\n sync?.observeBuild(response.headers.get(BUILD_HEADER));\n logEvent(\"http_request\", {\n method,\n path: new URL(request.url).pathname,\n status: response.status,\n });\n if (response.status === 401 && !revoked && modeNow() !== \"closed\") {\n revoked = true;\n queueMicrotask(() => deps.onRevoked(grant));\n }\n return response;\n };\n\n const timedFetch = untilHeaders(signedFetch, REQUEST_TIMEOUT_MS);\n\n const plugin = createPluginClient<ChatHostActionMap>(\n createActionClient({ baseUrl: origin, fetch: timedFetch }),\n \"chat\",\n );\n\n const drained = async (turnId: TurnId | undefined) => {\n if (turnId === undefined) return;\n while (true) {\n const posting = streams.get(turnId)?.posting;\n if (!posting) return;\n await posting;\n }\n };\n\n const invoke: PluginClient<ChatHostActionMap>[\"invoke\"] = async (\n name,\n input,\n options,\n ) => {\n if (name !== \"hostHello\") await welcomed;\n if (name === \"hostAppend\" || name === \"hostFinish\") {\n await drained((input as { readonly turnId?: TurnId }).turnId);\n }\n return plugin.invoke(name, input, options);\n };\n const calls: PluginClient<ChatHostActionMap> = {\n invoke,\n call: async (name, input, options) => (await invoke(name, input, options)).data,\n };\n\n const post = (path: string, body: unknown) =>\n timedFetch(`${origin}/_parlor/chat/${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const flush = async (turnId: TurnId, stream: TurnStream) => {\n while (stream.pending.length > 0) {\n if (mode === \"closed\") break;\n const frames = coalesce(stream.pending);\n stream.pending = [];\n for (const chunk of batches(frames)) {\n await post(\"stream\", { turnId, frames: chunk }).catch(() => undefined);\n }\n }\n stream.posting = undefined;\n if (stream.pending.length === 0) streams.delete(turnId);\n };\n\n const api: HostApi = {\n calls,\n stream(batch) {\n if (mode === \"closed\" || batch.frames.length === 0) return;\n let stream = streams.get(batch.turnId);\n if (!stream) {\n stream = { pending: [], posting: undefined };\n streams.set(batch.turnId, stream);\n }\n stream.pending.push(...batch.frames);\n if (!stream.posting) stream.posting = flush(batch.turnId, stream);\n },\n async heartbeat() {\n await welcomed;\n await post(\"heartbeat\", {});\n },\n };\n\n const close = () => {\n mode = \"closed\";\n sync?.stop();\n sync = undefined;\n if (heartbeat) clearInterval(heartbeat);\n heartbeat = undefined;\n refuse(new LinkDown(\"This app's link is closed.\"));\n };\n\n const hello = async (): Promise<HostWelcome | undefined> => {\n for (let attempt = 0; ; attempt += 1) {\n if (mode !== \"serving\" && mode !== \"draining\") return undefined;\n try {\n return await plugin.call(\"hostHello\", {\n protocols: { min: 1, max: HOST_PROTOCOL },\n hostVersion: deps.hostVersion,\n name: deps.hostName,\n platform: deps.platform,\n agents: [],\n });\n } catch {\n if (revoked || modeNow() === \"closed\") return undefined;\n await sleep(Math.min(RETRY_BASE_MS * 2 ** attempt, RECONNECT_MAX_MS));\n }\n }\n };\n\n const link: AppLink = {\n grant,\n api,\n get protocol() {\n return welcome?.protocol;\n },\n get mode() {\n return mode;\n },\n start() {\n if (mode !== \"idle\") return;\n mode = \"serving\";\n void hello().then((answer) => {\n if (!answer || modeNow() === \"closed\") return;\n if (!answer.accepted) {\n close();\n logEvent(\"link_closed\", { appOrigin: origin, reason: \"incompatible\" });\n deps.onIncompatible(grant, answer);\n return;\n }\n welcome = answer;\n admit();\n const polling = adaptivePoll(\n answer.userActivity === true,\n () => deps.busy?.() ?? false,\n );\n sync = createSyncClient({\n request: (path, init) => signedFetch(`${origin}${path}`, init),\n coalesceMs: 0,\n reconnectMaxMs: RECONNECT_MAX_MS,\n pollEveryMs: polling.pollEveryMs,\n onEvents: (events) => {\n const heads = events.flatMap((event) => event.tags.map((tag) => tag[0]));\n if (heads.some((head) => head === CHAT_TAG || head === CHAT_ACTIVITY_TAG)) {\n if (polling.touch()) sync?.reconnectNow();\n }\n if (modeNow() === \"serving\" && heads.includes(CHAT_TAG)) deps.onWake(link);\n if (modeNow() === \"serving\" && heads.includes(CHAT_AGENTS_CHECK_TAG))\n deps.onAgentsCheck?.(link);\n if (modeNow() === \"serving\") {\n for (const agentId of warmedHere(events, grant.hostId))\n deps.onWarm?.(link, agentId);\n }\n },\n channels: [\n {\n event: CHAT_CHANNEL,\n opened: () => undefined,\n closed: () => undefined,\n receive: (data) => {\n const turn = pushedTurnOf(data);\n if (turn && modeNow() === \"serving\") deps.onPushed?.(link, turn);\n },\n },\n ],\n onUnauthorized: () => undefined,\n onError: () => undefined,\n });\n sync.start();\n heartbeat = setInterval(\n () => void api.heartbeat().catch(() => undefined),\n answer.heartbeatMs,\n );\n heartbeat.unref();\n if (modeNow() === \"serving\") deps.onWake(link);\n });\n },\n drain() {\n if (mode === \"serving\") mode = \"draining\";\n },\n async stop(options = {}) {\n if (options.revoke && !grant.dev) {\n await revokeGrant({\n appOrigin: origin,\n appName: grant.appName,\n assert: (request) => deps.keys.assert(origin, request),\n fetch: deps.fetch,\n });\n }\n close();\n },\n };\n return link;\n}\n"]}
|