@parlor/agent-host 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +16 -2
- package/dist/acp.d.ts +165 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +626 -0
- package/dist/acp.js.map +1 -0
- package/dist/adapter-launch.d.ts +7 -0
- package/dist/adapter-launch.d.ts.map +1 -0
- package/dist/adapter-launch.js +35 -0
- package/dist/adapter-launch.js.map +1 -0
- package/dist/agents.d.ts +32 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +132 -0
- package/dist/agents.js.map +1 -0
- package/dist/assertion.d.ts +9 -0
- package/dist/assertion.d.ts.map +1 -0
- package/dist/assertion.js +22 -0
- package/dist/assertion.js.map +1 -0
- package/dist/control.d.ts +106 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +32 -0
- package/dist/control.js.map +1 -0
- package/dist/daemon.d.ts +50 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +543 -0
- package/dist/daemon.js.map +1 -0
- package/dist/dev-host.d.ts +5 -0
- package/dist/dev-host.d.ts.map +1 -0
- package/dist/dev-host.js +29 -0
- package/dist/dev-host.js.map +1 -0
- package/dist/device-list.d.ts +6 -0
- package/dist/device-list.d.ts.map +1 -0
- package/dist/device-list.js +30 -0
- package/dist/device-list.js.map +1 -0
- package/dist/embedded.d.ts +6 -0
- package/dist/embedded.d.ts.map +1 -0
- package/dist/embedded.js +3 -0
- package/dist/embedded.js.map +1 -0
- package/dist/fold.d.ts +38 -0
- package/dist/fold.d.ts.map +1 -0
- package/dist/fold.js +165 -0
- package/dist/fold.js.map +1 -0
- package/dist/grants.d.ts +54 -0
- package/dist/grants.d.ts.map +1 -0
- package/dist/grants.js +157 -0
- package/dist/grants.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/json-file.d.ts +6 -0
- package/dist/json-file.d.ts.map +1 -0
- package/dist/json-file.js +35 -0
- package/dist/json-file.js.map +1 -0
- package/dist/lines.d.ts +5 -0
- package/dist/lines.d.ts.map +1 -0
- package/dist/lines.js +9 -0
- package/dist/lines.js.map +1 -0
- package/dist/link-device.d.ts +28 -0
- package/dist/link-device.d.ts.map +1 -0
- package/dist/link-device.js +40 -0
- package/dist/link-device.js.map +1 -0
- package/dist/link.d.ts +52 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +277 -0
- package/dist/link.js.map +1 -0
- package/dist/lock.d.ts +7 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +105 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.d.ts +3 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +18 -0
- package/dist/log.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +520 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp-proxy.d.ts +33 -0
- package/dist/mcp-proxy.d.ts.map +1 -0
- package/dist/mcp-proxy.js +317 -0
- package/dist/mcp-proxy.js.map +1 -0
- package/dist/naming.d.ts +7 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +42 -0
- package/dist/naming.js.map +1 -0
- package/dist/pairing.d.ts +68 -0
- package/dist/pairing.d.ts.map +1 -0
- package/dist/pairing.js +312 -0
- package/dist/pairing.js.map +1 -0
- package/dist/paths.d.ts +19 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +23 -0
- package/dist/paths.js.map +1 -0
- package/dist/policy.d.ts +37 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +60 -0
- package/dist/policy.js.map +1 -0
- package/dist/pool.d.ts +34 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +112 -0
- package/dist/pool.js.map +1 -0
- package/dist/prompter.d.ts +33 -0
- package/dist/prompter.d.ts.map +1 -0
- package/dist/prompter.js +98 -0
- package/dist/prompter.js.map +1 -0
- package/dist/release-main.d.ts +2 -0
- package/dist/release-main.d.ts.map +1 -0
- package/dist/release-main.js +50 -0
- package/dist/release-main.js.map +1 -0
- package/dist/release.d.ts +22 -0
- package/dist/release.d.ts.map +1 -0
- package/dist/release.js +81 -0
- package/dist/release.js.map +1 -0
- package/dist/revoke.d.ts +10 -0
- package/dist/revoke.d.ts.map +1 -0
- package/dist/revoke.js +23 -0
- package/dist/revoke.js.map +1 -0
- package/dist/self.d.ts +7 -0
- package/dist/self.d.ts.map +1 -0
- package/dist/self.js +10 -0
- package/dist/self.js.map +1 -0
- package/dist/service.d.ts +97 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +205 -0
- package/dist/service.js.map +1 -0
- package/dist/shell-path.d.ts +10 -0
- package/dist/shell-path.d.ts.map +1 -0
- package/dist/shell-path.js +64 -0
- package/dist/shell-path.js.map +1 -0
- package/dist/skeleton-kit.d.ts +8 -0
- package/dist/skeleton-kit.d.ts.map +1 -0
- package/dist/skeleton-kit.js +143 -0
- package/dist/skeleton-kit.js.map +1 -0
- package/dist/spec-kit.d.ts +102 -0
- package/dist/spec-kit.d.ts.map +1 -0
- package/dist/spec-kit.js +372 -0
- package/dist/spec-kit.js.map +1 -0
- package/dist/testing/fake-agent.d.ts +65 -0
- package/dist/testing/fake-agent.d.ts.map +1 -0
- package/dist/testing/fake-agent.js +238 -0
- package/dist/testing/fake-agent.js.map +1 -0
- package/dist/trust.d.ts +20 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +27 -0
- package/dist/trust.js.map +1 -0
- package/dist/turn.d.ts +32 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +650 -0
- package/dist/turn.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AgentProfile } from "./agents.js";
|
|
2
|
+
export declare function commandOf(profile: AgentProfile): {
|
|
3
|
+
readonly command: string;
|
|
4
|
+
readonly args: readonly string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function launchEnvironment(profile: AgentProfile, env: Readonly<Record<string, string>>): Promise<Record<string, string>>;
|
|
7
|
+
//# sourceMappingURL=adapter-launch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-launch.d.ts","sourceRoot":"","sources":["../src/adapter-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAKpE,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAoBA;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQjC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ADAPTER_BINARY_ENV } from "./agents.js";
|
|
2
|
+
import { adapterKey, embeddedAdapters } from "./embedded.js";
|
|
3
|
+
import { selfInvocation } from "./self.js";
|
|
4
|
+
import { resolveBinary } from "./shell-path.js";
|
|
5
|
+
export function commandOf(profile) {
|
|
6
|
+
if (profile.launch.kind === "native") {
|
|
7
|
+
return { command: profile.launch.command, args: profile.launch.args };
|
|
8
|
+
}
|
|
9
|
+
const embedded = embeddedAdapters.get(adapterKey(profile.launch));
|
|
10
|
+
if (embedded !== undefined) {
|
|
11
|
+
const self = selfInvocation(["adapter", embedded]);
|
|
12
|
+
return {
|
|
13
|
+
command: self.command,
|
|
14
|
+
args: [...self.args, ...(profile.launch.args ?? [])],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
command: "npx",
|
|
19
|
+
args: [
|
|
20
|
+
"--yes",
|
|
21
|
+
`${profile.launch.package}@${profile.launch.version}`,
|
|
22
|
+
...(profile.launch.args ?? []),
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export async function launchEnvironment(profile, env) {
|
|
27
|
+
const variable = profile.launch.kind === "adapter"
|
|
28
|
+
? ADAPTER_BINARY_ENV[profile.launch.package]
|
|
29
|
+
: undefined;
|
|
30
|
+
if (variable === undefined || env[variable] !== undefined)
|
|
31
|
+
return { ...env };
|
|
32
|
+
const found = await resolveBinary(profile.binary, env.PATH ?? "");
|
|
33
|
+
return found === undefined ? { ...env } : { ...env, [variable]: found };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=adapter-launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-launch.js","sourceRoot":"","sources":["../src/adapter-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,UAAU,SAAS,CAAC,OAAqB;IAI7C,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,OAAO;YACP,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YACrD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAqB,EACrB,GAAqC;IAErC,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;QAC/B,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC5C,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;AAC1E,CAAC"}
|
package/dist/agents.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AgentInfo } from "@parlor/chat";
|
|
2
|
+
/** The app picks an agent by `id` only, never by command, so no remote party chooses what runs. */
|
|
3
|
+
export interface AgentProfile {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly launch: AgentLaunch;
|
|
7
|
+
/** The CLI behind it, for the installed-and-logged-in check. */
|
|
8
|
+
readonly binary: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* `adapter`: an npm ACP adapter at an exact version, run from the copy this build embeds
|
|
12
|
+
* and else through `npx`. `native`: an agent CLI that speaks ACP itself, found on the login-shell PATH.
|
|
13
|
+
*/
|
|
14
|
+
export type AgentLaunch = {
|
|
15
|
+
readonly kind: "adapter";
|
|
16
|
+
readonly package: string;
|
|
17
|
+
readonly version: string;
|
|
18
|
+
readonly args?: readonly string[] | undefined;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: "native";
|
|
21
|
+
readonly command: string;
|
|
22
|
+
readonly args: readonly string[];
|
|
23
|
+
};
|
|
24
|
+
export declare const AGENT_PROFILES: readonly AgentProfile[];
|
|
25
|
+
/** Where each adapter looks for the agent CLI it drives; its own search does not survive a single executable. */
|
|
26
|
+
export declare const ADAPTER_BINARY_ENV: Readonly<Record<string, string>>;
|
|
27
|
+
export declare const DETECT_TIMEOUT_MS = 3000;
|
|
28
|
+
/** Built-ins plus the user's own `agents.json`, which only this computer's user edits. */
|
|
29
|
+
export declare function loadProfiles(file: string): Promise<readonly AgentProfile[]>;
|
|
30
|
+
/** What `hostReport` sends: the installed agents; one that is not installed is left out. */
|
|
31
|
+
export declare function detectAgents(profiles: readonly AgentProfile[]): Promise<AgentInfo[]>;
|
|
32
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,mGAAmG;AACnG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC/C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEN,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EA2BjD,CAAC;AAEF,iHAAiH;AACjH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG/D,CAAC;AAEF,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AA4CvC,0FAA0F;AAC1F,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAkBjF;AAkBD,4FAA4F;AAC5F,wBAAsB,YAAY,CAChC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAChC,OAAO,CAAC,SAAS,EAAE,CAAC,CAwBtB"}
|
package/dist/agents.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { agentPath } from "./shell-path.js";
|
|
4
|
+
export const AGENT_PROFILES = [
|
|
5
|
+
{
|
|
6
|
+
id: "claude",
|
|
7
|
+
name: "Claude Code",
|
|
8
|
+
launch: {
|
|
9
|
+
kind: "adapter",
|
|
10
|
+
package: "@agentclientprotocol/claude-agent-acp",
|
|
11
|
+
version: "0.93.0",
|
|
12
|
+
},
|
|
13
|
+
binary: "claude",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "codex",
|
|
17
|
+
name: "Codex",
|
|
18
|
+
launch: {
|
|
19
|
+
kind: "adapter",
|
|
20
|
+
package: "@agentclientprotocol/codex-acp",
|
|
21
|
+
version: "2.2.2",
|
|
22
|
+
},
|
|
23
|
+
binary: "codex",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "gemini",
|
|
27
|
+
name: "Gemini CLI",
|
|
28
|
+
launch: { kind: "native", command: "gemini", args: ["--acp"] },
|
|
29
|
+
binary: "gemini",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
/** Where each adapter looks for the agent CLI it drives; its own search does not survive a single executable. */
|
|
33
|
+
export const ADAPTER_BINARY_ENV = {
|
|
34
|
+
"@agentclientprotocol/claude-agent-acp": "CLAUDE_CODE_EXECUTABLE",
|
|
35
|
+
"@agentclientprotocol/codex-acp": "CODEX_PATH",
|
|
36
|
+
};
|
|
37
|
+
export const DETECT_TIMEOUT_MS = 3_000;
|
|
38
|
+
const isFields = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
39
|
+
const isStrings = (value) => Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
40
|
+
function launchOf(value) {
|
|
41
|
+
if (!isFields(value))
|
|
42
|
+
return undefined;
|
|
43
|
+
if (value.kind === "native" &&
|
|
44
|
+
typeof value.command === "string" &&
|
|
45
|
+
isStrings(value.args)) {
|
|
46
|
+
return { kind: "native", command: value.command, args: value.args };
|
|
47
|
+
}
|
|
48
|
+
if (value.kind === "adapter" &&
|
|
49
|
+
typeof value.package === "string" &&
|
|
50
|
+
typeof value.version === "string" &&
|
|
51
|
+
(value.args === undefined || isStrings(value.args))) {
|
|
52
|
+
return {
|
|
53
|
+
kind: "adapter",
|
|
54
|
+
package: value.package,
|
|
55
|
+
version: value.version,
|
|
56
|
+
args: value.args,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
function profileOf(value) {
|
|
62
|
+
if (!isFields(value))
|
|
63
|
+
return undefined;
|
|
64
|
+
const launch = launchOf(value.launch);
|
|
65
|
+
const { id, name, binary } = value;
|
|
66
|
+
if (!launch || typeof id !== "string" || typeof name !== "string")
|
|
67
|
+
return undefined;
|
|
68
|
+
if (typeof binary !== "string" || id === "")
|
|
69
|
+
return undefined;
|
|
70
|
+
return { id, name, launch, binary };
|
|
71
|
+
}
|
|
72
|
+
/** Built-ins plus the user's own `agents.json`, which only this computer's user edits. */
|
|
73
|
+
export async function loadProfiles(file) {
|
|
74
|
+
let text;
|
|
75
|
+
try {
|
|
76
|
+
text = await readFile(file, "utf8");
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error.code === "ENOENT")
|
|
80
|
+
return AGENT_PROFILES;
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
const listed = JSON.parse(text);
|
|
84
|
+
if (!Array.isArray(listed))
|
|
85
|
+
throw new Error(`${file} must hold a JSON array of agent profiles.`);
|
|
86
|
+
const own = listed.map((entry, at) => {
|
|
87
|
+
const profile = profileOf(entry);
|
|
88
|
+
if (!profile)
|
|
89
|
+
throw new Error(`${file}: entry ${at + 1} is not an agent profile.`);
|
|
90
|
+
return profile;
|
|
91
|
+
});
|
|
92
|
+
const ids = new Set(own.map((profile) => profile.id));
|
|
93
|
+
return [...AGENT_PROFILES.filter((profile) => !ids.has(profile.id)), ...own];
|
|
94
|
+
}
|
|
95
|
+
function versionOf(binary, path) {
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
execFile(binary, ["--version"], { timeout: DETECT_TIMEOUT_MS, env: { ...process.env, PATH: path } }, (error, stdout) => {
|
|
98
|
+
if (error?.code === "ENOENT")
|
|
99
|
+
resolve("missing");
|
|
100
|
+
else if (error)
|
|
101
|
+
resolve("broken");
|
|
102
|
+
else
|
|
103
|
+
resolve(stdout.trim());
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** What `hostReport` sends: the installed agents; one that is not installed is left out. */
|
|
108
|
+
export async function detectAgents(profiles) {
|
|
109
|
+
const path = await agentPath();
|
|
110
|
+
const found = await Promise.all(profiles.map(async (profile) => {
|
|
111
|
+
const output = await versionOf(profile.binary, path);
|
|
112
|
+
if (output === "missing")
|
|
113
|
+
return undefined;
|
|
114
|
+
if (output === "broken") {
|
|
115
|
+
return {
|
|
116
|
+
id: profile.id,
|
|
117
|
+
name: profile.name,
|
|
118
|
+
ready: false,
|
|
119
|
+
problem: `\`${profile.binary} --version\` failed: check that ${profile.name} runs in a terminal.`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const version = /\d+\.\d+\.\d+[\w.-]*/.exec(output)?.[0];
|
|
123
|
+
return {
|
|
124
|
+
id: profile.id,
|
|
125
|
+
name: profile.name,
|
|
126
|
+
ready: true,
|
|
127
|
+
...(version ? { version } : {}),
|
|
128
|
+
};
|
|
129
|
+
}));
|
|
130
|
+
return found.filter((agent) => agent !== undefined);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface AssertionRequest {
|
|
2
|
+
readonly method: "GET" | "POST";
|
|
3
|
+
readonly url: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function hostAssertion(sign: (payload: Uint8Array) => Promise<string>, key: {
|
|
6
|
+
readonly kid: string;
|
|
7
|
+
readonly grantId: string;
|
|
8
|
+
}, request: AssertionRequest, now?: number): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.d.ts","sourceRoot":"","sources":["../src/assertion.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,EAC9C,GAAG,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACvD,OAAO,EAAE,gBAAgB,EACzB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { HOST_ASSERTION_TTL_MS, HOST_ASSERTION_TYP, HOST_AUDIENCE } from "@parlor/auth";
|
|
3
|
+
const encode = (value) => Buffer.from(JSON.stringify(value)).toString("base64url");
|
|
4
|
+
export async function hostAssertion(sign, key, request, now = Date.now()) {
|
|
5
|
+
const target = new URL(request.url);
|
|
6
|
+
target.search = "";
|
|
7
|
+
target.hash = "";
|
|
8
|
+
const iat = Math.floor(now / 1000);
|
|
9
|
+
const header = encode({ alg: "ES256", typ: HOST_ASSERTION_TYP, kid: key.kid });
|
|
10
|
+
const claims = encode({
|
|
11
|
+
aud: HOST_AUDIENCE,
|
|
12
|
+
gid: key.grantId,
|
|
13
|
+
htm: request.method,
|
|
14
|
+
htu: target.href,
|
|
15
|
+
iat,
|
|
16
|
+
exp: iat + HOST_ASSERTION_TTL_MS / 1000,
|
|
17
|
+
jti: randomUUID(),
|
|
18
|
+
});
|
|
19
|
+
const input = `${header}.${claims}`;
|
|
20
|
+
return `${input}.${await sign(new TextEncoder().encode(input))}`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../src/assertion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAExF,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAO3D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAA8C,EAC9C,GAAuD,EACvD,OAAyB,EACzB,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,GAAG,CAAC,OAAO;QAChB,GAAG,EAAE,OAAO,CAAC,MAAM;QACnB,GAAG,EAAE,MAAM,CAAC,IAAI;QAChB,GAAG;QACH,GAAG,EAAE,GAAG,GAAG,qBAAqB,GAAG,IAAI;QACvC,GAAG,EAAE,UAAU,EAAE;KAClB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;IACpC,OAAO,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { HostPairing, LocalHostStatus, PairingDevice } from "@parlor/capabilities";
|
|
2
|
+
import type { HostRelease, ServiceClient } from "./service.js";
|
|
3
|
+
export declare const CONTROL_PROTOCOL = 1;
|
|
4
|
+
/**
|
|
5
|
+
* Newline-delimited JSON on a 0600 Unix socket (a named pipe on Windows), spoken by the
|
|
6
|
+
* `parlor-host` CLI and the desktop shell's Rust side. No TCP listener exists.
|
|
7
|
+
*/
|
|
8
|
+
export type ControlRequest = {
|
|
9
|
+
readonly op: "hello";
|
|
10
|
+
readonly client: ServiceClient;
|
|
11
|
+
} | {
|
|
12
|
+
readonly op: "handover";
|
|
13
|
+
readonly binary: string;
|
|
14
|
+
readonly signature: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly op: "status";
|
|
17
|
+
} | {
|
|
18
|
+
readonly op: "connect";
|
|
19
|
+
readonly appOrigin: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly op: "begin_local_pairing";
|
|
22
|
+
readonly appOrigin: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly op: "finish_local_pairing";
|
|
25
|
+
readonly appOrigin: string;
|
|
26
|
+
readonly code: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly op: "confirm_local_pairing";
|
|
29
|
+
readonly appOrigin: string;
|
|
30
|
+
readonly connect: boolean;
|
|
31
|
+
readonly device?: PairingDevice;
|
|
32
|
+
} | {
|
|
33
|
+
readonly op: "disconnect";
|
|
34
|
+
readonly appOrigin: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly op: "dev_attach";
|
|
37
|
+
readonly appOrigin: string;
|
|
38
|
+
readonly hostToken: string;
|
|
39
|
+
} | {
|
|
40
|
+
readonly op: "dev_detach";
|
|
41
|
+
readonly appOrigin: string;
|
|
42
|
+
};
|
|
43
|
+
export type ControlOp = ControlRequest["op"];
|
|
44
|
+
export interface GrantSummary {
|
|
45
|
+
readonly appOrigin: string;
|
|
46
|
+
readonly appName: string;
|
|
47
|
+
readonly grantId: string;
|
|
48
|
+
}
|
|
49
|
+
export type ControlFailure = {
|
|
50
|
+
readonly ok: false;
|
|
51
|
+
readonly error: string;
|
|
52
|
+
};
|
|
53
|
+
interface ControlReplies {
|
|
54
|
+
readonly hello: {
|
|
55
|
+
readonly ok: true;
|
|
56
|
+
readonly release: HostRelease;
|
|
57
|
+
};
|
|
58
|
+
readonly handover: {
|
|
59
|
+
readonly ok: true;
|
|
60
|
+
} | {
|
|
61
|
+
readonly ok: false;
|
|
62
|
+
readonly error: "unsigned" | "downgrade";
|
|
63
|
+
};
|
|
64
|
+
readonly status: {
|
|
65
|
+
readonly ok: true;
|
|
66
|
+
readonly status: LocalHostStatus;
|
|
67
|
+
readonly grants: readonly GrantSummary[];
|
|
68
|
+
};
|
|
69
|
+
readonly connect: {
|
|
70
|
+
readonly ok: true;
|
|
71
|
+
};
|
|
72
|
+
readonly begin_local_pairing: {
|
|
73
|
+
readonly ok: true;
|
|
74
|
+
readonly pairing: HostPairing;
|
|
75
|
+
};
|
|
76
|
+
readonly finish_local_pairing: {
|
|
77
|
+
readonly ok: true;
|
|
78
|
+
readonly account: string;
|
|
79
|
+
readonly appName: string;
|
|
80
|
+
readonly matchingCode: string;
|
|
81
|
+
};
|
|
82
|
+
readonly confirm_local_pairing: {
|
|
83
|
+
readonly ok: true;
|
|
84
|
+
} | {
|
|
85
|
+
readonly ok: false;
|
|
86
|
+
readonly error: "declined_locally";
|
|
87
|
+
};
|
|
88
|
+
readonly disconnect: {
|
|
89
|
+
readonly ok: true;
|
|
90
|
+
};
|
|
91
|
+
readonly dev_attach: {
|
|
92
|
+
readonly ok: true;
|
|
93
|
+
};
|
|
94
|
+
readonly dev_detach: {
|
|
95
|
+
readonly ok: true;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export type ControlResponse<O extends ControlOp> = ControlReplies[O] | ControlFailure;
|
|
99
|
+
export interface ControlClient {
|
|
100
|
+
send<R extends ControlRequest>(request: R): Promise<ControlResponse<R["op"]>>;
|
|
101
|
+
close(): void;
|
|
102
|
+
}
|
|
103
|
+
/** `undefined` when no daemon answers on the socket. */
|
|
104
|
+
export declare function connectControl(socketPath: string): Promise<ControlClient | undefined>;
|
|
105
|
+
export {};
|
|
106
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"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"}
|
package/dist/control.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { connect } from "node:net";
|
|
2
|
+
import { onLines } from "./lines.js";
|
|
3
|
+
export const CONTROL_PROTOCOL = 1;
|
|
4
|
+
/** `undefined` when no daemon answers on the socket. */
|
|
5
|
+
export async function connectControl(socketPath) {
|
|
6
|
+
const socket = connect(socketPath);
|
|
7
|
+
const connected = await new Promise((resolve) => {
|
|
8
|
+
socket.once("connect", () => resolve(true));
|
|
9
|
+
socket.once("error", () => resolve(false));
|
|
10
|
+
});
|
|
11
|
+
if (!connected) {
|
|
12
|
+
socket.destroy();
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const waiting = [];
|
|
16
|
+
onLines(socket, (line) => waiting.shift()?.(line));
|
|
17
|
+
socket.on("close", () => {
|
|
18
|
+
for (const reply of waiting.splice(0))
|
|
19
|
+
reply(undefined);
|
|
20
|
+
});
|
|
21
|
+
socket.on("error", () => socket.destroy());
|
|
22
|
+
return {
|
|
23
|
+
send: (request) => new Promise((resolve) => {
|
|
24
|
+
waiting.push((line) => resolve(line === undefined
|
|
25
|
+
? { ok: false, error: "Parlor Host closed the connection." }
|
|
26
|
+
: JSON.parse(line)));
|
|
27
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
28
|
+
}),
|
|
29
|
+
close: () => socket.end(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAInC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAsElC,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACvD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAA2C,EAAE,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACtB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAChB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,OAAO,CACL,IAAI,KAAK,SAAS;gBAChB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE;gBAC5D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CACrB,CACF,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;QACJ,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;KAC1B,CAAC;AACJ,CAAC"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentLauncher } from "./acp.js";
|
|
2
|
+
import { type GrantStore, type HostKeys } from "./grants.js";
|
|
3
|
+
import type { McpProxy } from "./mcp-proxy.js";
|
|
4
|
+
import type { HostPaths } from "./paths.js";
|
|
5
|
+
import { type RemotePolicy } from "./policy.js";
|
|
6
|
+
import type { SessionPool } from "./pool.js";
|
|
7
|
+
import { type LocalPrompter } from "./prompter.js";
|
|
8
|
+
import { type HostRelease } from "./service.js";
|
|
9
|
+
import type { TrustStore } from "./trust.js";
|
|
10
|
+
export interface DaemonDeps {
|
|
11
|
+
readonly release: HostRelease;
|
|
12
|
+
readonly paths: HostPaths;
|
|
13
|
+
readonly grants: GrantStore;
|
|
14
|
+
readonly keys: HostKeys;
|
|
15
|
+
readonly trust: TrustStore;
|
|
16
|
+
readonly pool: SessionPool;
|
|
17
|
+
readonly proxy: McpProxy;
|
|
18
|
+
readonly launcher: AgentLauncher;
|
|
19
|
+
readonly prompter: LocalPrompter;
|
|
20
|
+
readonly policy: RemotePolicy;
|
|
21
|
+
/** The `service.lock` token of the `ensureService` that spawned this daemon, which holds the lock for it. */
|
|
22
|
+
readonly lockToken?: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* One per user per computer, for every app: an `AppLink` per grant, the session pool,
|
|
26
|
+
* the proxy socket and the control socket. Started only through `ensureService`.
|
|
27
|
+
*/
|
|
28
|
+
export interface HostDaemon {
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
connect(appOrigin: string): Promise<void>;
|
|
31
|
+
disconnect(appOrigin: string): Promise<void>;
|
|
32
|
+
/** Hands links over to a newer release; running turns finish here first. */
|
|
33
|
+
handover(): Promise<void>;
|
|
34
|
+
stop(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Agents start `parlor-host mcp-proxy` by name. An entry named otherwise, such as the
|
|
38
|
+
* published `dist/main.js` that `parlor dev` runs with node, gets a shim instead of a link.
|
|
39
|
+
*/
|
|
40
|
+
export declare function putHostCommandFirstOnPath(root: string, entry?: string | undefined): Promise<void>;
|
|
41
|
+
/** The daemon a service runs: once it handed over, `drained` settles after its last turn. */
|
|
42
|
+
export interface ServiceDaemon extends HostDaemon {
|
|
43
|
+
readonly drained: Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export declare class HostAlreadyRunning extends Error {
|
|
46
|
+
readonly name = "HostAlreadyRunning";
|
|
47
|
+
constructor();
|
|
48
|
+
}
|
|
49
|
+
export declare function createHostDaemon(deps: DaemonDeps): ServiceDaemon;
|
|
50
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI9C,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,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;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,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,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,4EAA4E;IAC5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAeD;;;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;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CA4fhE"}
|