@parlor/agent-host 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp.d.ts +21 -0
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +138 -12
- package/dist/acp.js.map +1 -1
- package/dist/adapter-launch.js.map +1 -1
- package/dist/agent-options.d.ts +17 -0
- package/dist/agent-options.d.ts.map +1 -0
- package/dist/agent-options.js +73 -0
- package/dist/agent-options.js.map +1 -0
- package/dist/agent-tools.d.ts +30 -0
- package/dist/agent-tools.d.ts.map +1 -0
- package/dist/agent-tools.js +71 -0
- package/dist/agent-tools.js.map +1 -0
- package/dist/agents.js.map +1 -1
- package/dist/assertion.js.map +1 -1
- package/dist/control.d.ts +15 -0
- package/dist/control.d.ts.map +1 -1
- package/dist/control.js.map +1 -1
- package/dist/daemon.d.ts +10 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +149 -14
- package/dist/daemon.js.map +1 -1
- package/dist/dev-host.js.map +1 -1
- package/dist/device-list.js.map +1 -1
- package/dist/embedded.js.map +1 -1
- package/dist/fold.d.ts.map +1 -1
- package/dist/fold.js +2 -0
- package/dist/fold.js.map +1 -1
- package/dist/grants.d.ts +9 -0
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json-file.js.map +1 -1
- package/dist/learned.d.ts +23 -0
- package/dist/learned.d.ts.map +1 -0
- package/dist/learned.js +36 -0
- package/dist/learned.js.map +1 -0
- package/dist/lines.js.map +1 -1
- package/dist/link-device.js.map +1 -1
- package/dist/link.js.map +1 -1
- package/dist/lock.js.map +1 -1
- package/dist/log.js.map +1 -1
- package/dist/main.js +105 -9
- package/dist/main.js.map +1 -1
- package/dist/mcp-proxy.d.ts +26 -3
- package/dist/mcp-proxy.d.ts.map +1 -1
- package/dist/mcp-proxy.js +180 -9
- package/dist/mcp-proxy.js.map +1 -1
- package/dist/naming.js.map +1 -1
- package/dist/pairing.d.ts +2 -0
- package/dist/pairing.d.ts.map +1 -1
- package/dist/pairing.js +25 -3
- package/dist/pairing.js.map +1 -1
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/policy.d.ts +12 -2
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +13 -3
- package/dist/policy.js.map +1 -1
- package/dist/pool.js.map +1 -1
- package/dist/prompter.d.ts +5 -0
- package/dist/prompter.d.ts.map +1 -1
- package/dist/prompter.js +15 -0
- package/dist/prompter.js.map +1 -1
- package/dist/release-main.js.map +1 -1
- package/dist/release.js.map +1 -1
- package/dist/revoke.js.map +1 -1
- package/dist/self.js.map +1 -1
- package/dist/service.js.map +1 -1
- package/dist/shell-path.js.map +1 -1
- package/dist/skeleton-kit.js.map +1 -1
- package/dist/spec-kit.d.ts +2 -1
- package/dist/spec-kit.d.ts.map +1 -1
- package/dist/spec-kit.js +6 -1
- package/dist/spec-kit.js.map +1 -1
- package/dist/testing/fake-agent.d.ts +12 -0
- package/dist/testing/fake-agent.d.ts.map +1 -1
- package/dist/testing/fake-agent.js +11 -1
- package/dist/testing/fake-agent.js.map +1 -1
- package/dist/trust.js.map +1 -1
- package/dist/turn.d.ts +7 -1
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +16 -3
- package/dist/turn.js.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** The values `chosen` names that `options` offers and does not already run with. */
|
|
2
|
+
export function optionChanges(options, chosen) {
|
|
3
|
+
return Object.entries(chosen ?? {}).flatMap(([id, value]) => {
|
|
4
|
+
const option = options.find((candidate) => candidate.id === id);
|
|
5
|
+
if (!option || option.current === value)
|
|
6
|
+
return [];
|
|
7
|
+
return option.values.some((candidate) => candidate.id === value)
|
|
8
|
+
? [{ id, value }]
|
|
9
|
+
: [];
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const RATE_LIMIT_META = "_claude/rateLimit";
|
|
13
|
+
const WINDOW_MINUTES = {
|
|
14
|
+
five_hour: 5 * 60,
|
|
15
|
+
seven_day: 7 * 24 * 60,
|
|
16
|
+
seven_day_opus: 7 * 24 * 60,
|
|
17
|
+
seven_day_sonnet: 7 * 24 * 60,
|
|
18
|
+
};
|
|
19
|
+
function windowOf(id, slot) {
|
|
20
|
+
const minutes = WINDOW_MINUTES[id];
|
|
21
|
+
const used = slot.utilization;
|
|
22
|
+
if (minutes === undefined || typeof used !== "number" || !Number.isFinite(used)) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const resetsAt = typeof slot.resetsAt === "number" && Number.isFinite(slot.resetsAt)
|
|
26
|
+
? slot.resetsAt * 1000
|
|
27
|
+
: undefined;
|
|
28
|
+
return {
|
|
29
|
+
id,
|
|
30
|
+
minutes,
|
|
31
|
+
used: Math.min(1, Math.max(0, used)),
|
|
32
|
+
...(resetsAt === undefined ? {} : { resetsAt }),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Claude Code's rate limit, which rides on a `usage_update`'s `_meta`: every window a newer
|
|
37
|
+
* CLI names under `unifiedWindows`, or the one window an event is about.
|
|
38
|
+
*/
|
|
39
|
+
export function agentUsageOf(meta, at) {
|
|
40
|
+
const info = meta?.[RATE_LIMIT_META];
|
|
41
|
+
if (!info || typeof info !== "object")
|
|
42
|
+
return undefined;
|
|
43
|
+
const slots = info.unifiedWindows && typeof info.unifiedWindows === "object"
|
|
44
|
+
? Object.entries(info.unifiedWindows)
|
|
45
|
+
: typeof info.rateLimitType === "string"
|
|
46
|
+
? [[info.rateLimitType, info]]
|
|
47
|
+
: [];
|
|
48
|
+
const windows = slots.flatMap(([id, slot]) => {
|
|
49
|
+
const window = windowOf(id, slot);
|
|
50
|
+
return window ? [window] : [];
|
|
51
|
+
});
|
|
52
|
+
return windows.length === 0 ? undefined : { windows: ordered(windows), at };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `next` laid over `held` window by window: an event names one window, and the others it
|
|
56
|
+
* leaves out still stand until they roll over.
|
|
57
|
+
*/
|
|
58
|
+
export function mergeUsage(held, next) {
|
|
59
|
+
const named = new Set(next.windows.map((window) => window.id));
|
|
60
|
+
const kept = (held?.windows ?? []).filter((window) => !named.has(window.id) &&
|
|
61
|
+
(window.resetsAt === undefined || window.resetsAt > next.at));
|
|
62
|
+
return { windows: ordered([...next.windows, ...kept]), at: next.at };
|
|
63
|
+
}
|
|
64
|
+
/** The account's own windows before a model's, each set shortest first. */
|
|
65
|
+
function ordered(windows) {
|
|
66
|
+
const perModel = (window) => (window.id in ACCOUNT_WINDOWS ? 0 : 1);
|
|
67
|
+
return [...windows].sort((a, b) => perModel(a) - perModel(b) || a.minutes - b.minutes || a.id.localeCompare(b.id));
|
|
68
|
+
}
|
|
69
|
+
const ACCOUNT_WINDOWS = {
|
|
70
|
+
five_hour: true,
|
|
71
|
+
seven_day: true,
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=agent-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-options.js","sourceRoot":"","sources":["../src/agent-options.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentOption, AgentUsage, AgentUsageWindow } from \"@parlor/chat\";\n\n/** The values `chosen` names that `options` offers and does not already run with. */\nexport function optionChanges(\n options: readonly AgentOption[],\n chosen: Readonly<Record<string, string>> | undefined,\n): { readonly id: string; readonly value: string }[] {\n return Object.entries(chosen ?? {}).flatMap(([id, value]) => {\n const option = options.find((candidate) => candidate.id === id);\n if (!option || option.current === value) return [];\n return option.values.some((candidate) => candidate.id === value)\n ? [{ id, value }]\n : [];\n });\n}\n\nconst RATE_LIMIT_META = \"_claude/rateLimit\";\nconst WINDOW_MINUTES: Readonly<Record<string, number>> = {\n five_hour: 5 * 60,\n seven_day: 7 * 24 * 60,\n seven_day_opus: 7 * 24 * 60,\n seven_day_sonnet: 7 * 24 * 60,\n};\n\ninterface RateLimitSlot {\n readonly utilization?: unknown;\n readonly resetsAt?: unknown;\n}\n\nfunction windowOf(id: string, slot: RateLimitSlot): AgentUsageWindow | undefined {\n const minutes = WINDOW_MINUTES[id];\n const used = slot.utilization;\n if (minutes === undefined || typeof used !== \"number\" || !Number.isFinite(used)) {\n return undefined;\n }\n const resetsAt =\n typeof slot.resetsAt === \"number\" && Number.isFinite(slot.resetsAt)\n ? slot.resetsAt * 1000\n : undefined;\n return {\n id,\n minutes,\n used: Math.min(1, Math.max(0, used)),\n ...(resetsAt === undefined ? {} : { resetsAt }),\n };\n}\n\n/**\n * Claude Code's rate limit, which rides on a `usage_update`'s `_meta`: every window a newer\n * CLI names under `unifiedWindows`, or the one window an event is about.\n */\nexport function agentUsageOf(\n meta: Readonly<Record<string, unknown>> | null | undefined,\n at: number,\n): AgentUsage | undefined {\n const info = meta?.[RATE_LIMIT_META] as\n | (RateLimitSlot & {\n readonly rateLimitType?: unknown;\n readonly unifiedWindows?: Readonly<Record<string, RateLimitSlot>>;\n })\n | undefined;\n if (!info || typeof info !== \"object\") return undefined;\n const slots: [string, RateLimitSlot][] =\n info.unifiedWindows && typeof info.unifiedWindows === \"object\"\n ? Object.entries(info.unifiedWindows)\n : typeof info.rateLimitType === \"string\"\n ? [[info.rateLimitType, info]]\n : [];\n const windows = slots.flatMap(([id, slot]) => {\n const window = windowOf(id, slot);\n return window ? [window] : [];\n });\n return windows.length === 0 ? undefined : { windows: ordered(windows), at };\n}\n\n/**\n * `next` laid over `held` window by window: an event names one window, and the others it\n * leaves out still stand until they roll over.\n */\nexport function mergeUsage(held: AgentUsage | undefined, next: AgentUsage): AgentUsage {\n const named = new Set(next.windows.map((window) => window.id));\n const kept = (held?.windows ?? []).filter(\n (window) =>\n !named.has(window.id) &&\n (window.resetsAt === undefined || window.resetsAt > next.at),\n );\n return { windows: ordered([...next.windows, ...kept]), at: next.at };\n}\n\n/** The account's own windows before a model's, each set shortest first. */\nfunction ordered(windows: readonly AgentUsageWindow[]): AgentUsageWindow[] {\n const perModel = (window: AgentUsageWindow) => (window.id in ACCOUNT_WINDOWS ? 0 : 1);\n return [...windows].sort(\n (a, b) =>\n perModel(a) - perModel(b) || a.minutes - b.minutes || a.id.localeCompare(b.id),\n );\n}\n\nconst ACCOUNT_WINDOWS: Readonly<Record<string, true>> = {\n five_hour: true,\n seven_day: true,\n};\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AgentProfile } from "./agents.js";
|
|
2
|
+
/** What a grant hands the coding agents on this computer, outside the app's sidebar. */
|
|
3
|
+
export interface AgentTools {
|
|
4
|
+
/** The MCP server name the agents know the app by, and the name the user asks them with. */
|
|
5
|
+
readonly name: string;
|
|
6
|
+
/** The agents it is registered with, by profile id. */
|
|
7
|
+
readonly agents: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The app's name, with its host and port when it is not a deployed site on the default
|
|
11
|
+
* port: `coursekit`, or `coursekit-localhost-7001` beside it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function agentToolsName(appName: string, appOrigin: string): string;
|
|
14
|
+
export interface AgentToolsDeps {
|
|
15
|
+
/** The installed agents; only those with a known CLI are registered with. */
|
|
16
|
+
readonly profiles: readonly AgentProfile[];
|
|
17
|
+
/** The absolute path of `parlor-host`, which the agents launch as the MCP server. */
|
|
18
|
+
readonly hostCommand: string;
|
|
19
|
+
readonly env: () => Promise<Record<string, string>>;
|
|
20
|
+
}
|
|
21
|
+
/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */
|
|
22
|
+
export declare function registerAgentTools(deps: AgentToolsDeps, app: {
|
|
23
|
+
readonly appName: string;
|
|
24
|
+
readonly appOrigin: string;
|
|
25
|
+
}): Promise<AgentTools>;
|
|
26
|
+
/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */
|
|
27
|
+
export declare function unregisterAgentTools(deps: AgentToolsDeps, tools: AgentTools): Promise<void>;
|
|
28
|
+
/** The agents an `AgentTools` names, as people know them: "Claude Code and Codex". */
|
|
29
|
+
export declare function agentNames(profiles: readonly AgentProfile[], tools: AgentTools): string;
|
|
30
|
+
//# sourceMappingURL=agent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../src/agent-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASzE;AAmBD,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAYD,0GAA0G;AAC1G,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,UAAU,CAAC,CAcrB;AAED,kGAAkG;AAClG,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAOvF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { logEvent } from "./log.js";
|
|
3
|
+
import { appServerOf } from "./naming.js";
|
|
4
|
+
const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
|
|
5
|
+
/**
|
|
6
|
+
* The app's name, with its host and port when it is not a deployed site on the default
|
|
7
|
+
* port: `coursekit`, or `coursekit-localhost-7001` beside it.
|
|
8
|
+
*/
|
|
9
|
+
export function agentToolsName(appName, appOrigin) {
|
|
10
|
+
const url = new URL(appOrigin);
|
|
11
|
+
const base = appServerOf(appName);
|
|
12
|
+
if (!LOCAL_HOSTS.has(url.hostname) && url.port === "")
|
|
13
|
+
return base;
|
|
14
|
+
const where = url.host
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
17
|
+
.replace(/^-+|-+$/g, "");
|
|
18
|
+
return `${base}-${where}`;
|
|
19
|
+
}
|
|
20
|
+
const REGISTRARS = {
|
|
21
|
+
claude: {
|
|
22
|
+
add: (name, command) => ["mcp", "add", "--scope", "user", name, "--", ...command],
|
|
23
|
+
remove: (name) => ["mcp", "remove", "--scope", "user", name],
|
|
24
|
+
},
|
|
25
|
+
codex: {
|
|
26
|
+
add: (name, command) => ["mcp", "add", name, "--", ...command],
|
|
27
|
+
remove: (name) => ["mcp", "remove", name],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
function run(binary, args, env) {
|
|
31
|
+
return new Promise((resolve) => {
|
|
32
|
+
execFile(binary, [...args], { env, timeout: 30_000 }, (error) => resolve(!error));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */
|
|
36
|
+
export async function registerAgentTools(deps, app) {
|
|
37
|
+
const name = agentToolsName(app.appName, app.appOrigin);
|
|
38
|
+
const command = [deps.hostCommand, "mcp-proxy", "--app", app.appOrigin];
|
|
39
|
+
const env = await deps.env();
|
|
40
|
+
const agents = [];
|
|
41
|
+
for (const profile of deps.profiles) {
|
|
42
|
+
const registrar = REGISTRARS[profile.id];
|
|
43
|
+
if (!registrar)
|
|
44
|
+
continue;
|
|
45
|
+
await run(profile.binary, registrar.remove(name), env);
|
|
46
|
+
if (await run(profile.binary, registrar.add(name, command), env))
|
|
47
|
+
agents.push(profile.id);
|
|
48
|
+
}
|
|
49
|
+
logEvent("agent_tools_registered", { appOrigin: app.appOrigin, name, agents });
|
|
50
|
+
return { name, agents };
|
|
51
|
+
}
|
|
52
|
+
/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */
|
|
53
|
+
export async function unregisterAgentTools(deps, tools) {
|
|
54
|
+
const env = await deps.env();
|
|
55
|
+
for (const id of tools.agents) {
|
|
56
|
+
const registrar = REGISTRARS[id];
|
|
57
|
+
const profile = deps.profiles.find((candidate) => candidate.id === id);
|
|
58
|
+
if (!registrar || !profile)
|
|
59
|
+
continue;
|
|
60
|
+
await run(profile.binary, registrar.remove(tools.name), env);
|
|
61
|
+
}
|
|
62
|
+
logEvent("agent_tools_removed", { name: tools.name, agents: tools.agents });
|
|
63
|
+
}
|
|
64
|
+
/** The agents an `AgentTools` names, as people know them: "Claude Code and Codex". */
|
|
65
|
+
export function agentNames(profiles, tools) {
|
|
66
|
+
const names = tools.agents.map((id) => profiles.find((profile) => profile.id === id)?.name ?? id);
|
|
67
|
+
return names.length <= 1
|
|
68
|
+
? (names[0] ?? "")
|
|
69
|
+
: `${names.slice(0, -1).join(", ")} and ${names.at(-1)}`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=agent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../src/agent-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU1C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB;IAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;AAC5B,CAAC;AAQD,MAAM,UAAU,GAAwC;IACtD,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACjF,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC;KAC7D;IACD,KAAK,EAAE;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC9D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC;KAC1C;CACF,CAAC;AAUF,SAAS,GAAG,CACV,MAAc,EACd,IAAuB,EACvB,GAA2B;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAoB,EACpB,GAA6D;IAE7D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,QAAQ,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAoB,EACpB,KAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE,SAAS;QACrC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,QAAQ,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,QAAiC,EAAE,KAAiB;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAC5B,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAClE,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC;QACtB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC","sourcesContent":["import { execFile } from \"node:child_process\";\n\nimport type { AgentProfile } from \"./agents.js\";\nimport { logEvent } from \"./log.js\";\nimport { appServerOf } from \"./naming.js\";\n\n/** What a grant hands the coding agents on this computer, outside the app's sidebar. */\nexport interface AgentTools {\n /** The MCP server name the agents know the app by, and the name the user asks them with. */\n readonly name: string;\n /** The agents it is registered with, by profile id. */\n readonly agents: readonly string[];\n}\n\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\n/**\n * The app's name, with its host and port when it is not a deployed site on the default\n * port: `coursekit`, or `coursekit-localhost-7001` beside it.\n */\nexport function agentToolsName(appName: string, appOrigin: string): string {\n const url = new URL(appOrigin);\n const base = appServerOf(appName);\n if (!LOCAL_HOSTS.has(url.hostname) && url.port === \"\") return base;\n const where = url.host\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return `${base}-${where}`;\n}\n\n/** How one coding agent's own CLI adds and removes a user-wide stdio MCP server. */\ninterface Registrar {\n add(name: string, command: readonly string[]): readonly string[];\n remove(name: string): readonly string[];\n}\n\nconst REGISTRARS: Readonly<Record<string, Registrar>> = {\n claude: {\n add: (name, command) => [\"mcp\", \"add\", \"--scope\", \"user\", name, \"--\", ...command],\n remove: (name) => [\"mcp\", \"remove\", \"--scope\", \"user\", name],\n },\n codex: {\n add: (name, command) => [\"mcp\", \"add\", name, \"--\", ...command],\n remove: (name) => [\"mcp\", \"remove\", name],\n },\n};\n\nexport interface AgentToolsDeps {\n /** The installed agents; only those with a known CLI are registered with. */\n readonly profiles: readonly AgentProfile[];\n /** The absolute path of `parlor-host`, which the agents launch as the MCP server. */\n readonly hostCommand: string;\n readonly env: () => Promise<Record<string, string>>;\n}\n\nfunction run(\n binary: string,\n args: readonly string[],\n env: Record<string, string>,\n): Promise<boolean> {\n return new Promise((resolve) => {\n execFile(binary, [...args], { env, timeout: 30_000 }, (error) => resolve(!error));\n });\n}\n\n/** Registers `appOrigin` with every installed agent that has a CLI for it; returns those that took it. */\nexport async function registerAgentTools(\n deps: AgentToolsDeps,\n app: { readonly appName: string; readonly appOrigin: string },\n): Promise<AgentTools> {\n const name = agentToolsName(app.appName, app.appOrigin);\n const command = [deps.hostCommand, \"mcp-proxy\", \"--app\", app.appOrigin];\n const env = await deps.env();\n const agents: string[] = [];\n for (const profile of deps.profiles) {\n const registrar = REGISTRARS[profile.id];\n if (!registrar) continue;\n await run(profile.binary, registrar.remove(name), env);\n if (await run(profile.binary, registrar.add(name, command), env))\n agents.push(profile.id);\n }\n logEvent(\"agent_tools_registered\", { appOrigin: app.appOrigin, name, agents });\n return { name, agents };\n}\n\n/** Removes the app from the agents it was registered with; an agent already rid of it is fine. */\nexport async function unregisterAgentTools(\n deps: AgentToolsDeps,\n tools: AgentTools,\n): Promise<void> {\n const env = await deps.env();\n for (const id of tools.agents) {\n const registrar = REGISTRARS[id];\n const profile = deps.profiles.find((candidate) => candidate.id === id);\n if (!registrar || !profile) continue;\n await run(profile.binary, registrar.remove(tools.name), env);\n }\n logEvent(\"agent_tools_removed\", { name: tools.name, agents: tools.agents });\n}\n\n/** The agents an `AgentTools` names, as people know them: \"Claude Code and Codex\". */\nexport function agentNames(profiles: readonly AgentProfile[], tools: AgentTools): string {\n const names = tools.agents.map(\n (id) => profiles.find((profile) => profile.id === id)?.name ?? id,\n );\n return names.length <= 1\n ? (names[0] ?? \"\")\n : `${names.slice(0, -1).join(\", \")} and ${names.at(-1)}`;\n}\n"]}
|
package/dist/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\n\nimport type { AgentInfo } from \"@parlor/chat\";\n\nimport { agentPath } from \"./shell-path.js\";\n\n/** The app picks an agent by `id` only, never by command, so no remote party chooses what runs. */\nexport interface AgentProfile {\n readonly id: string;\n readonly name: string;\n readonly launch: AgentLaunch;\n /** The CLI behind it, for the installed-and-logged-in check. */\n readonly binary: string;\n}\n\n/**\n * `adapter`: an npm ACP adapter at an exact version, run from the copy this build embeds\n * and else through `npx`. `native`: an agent CLI that speaks ACP itself, found on the login-shell PATH.\n */\nexport type AgentLaunch =\n | {\n readonly kind: \"adapter\";\n readonly package: string;\n readonly version: string;\n readonly args?: readonly string[] | undefined;\n }\n | {\n readonly kind: \"native\";\n readonly command: string;\n readonly args: readonly string[];\n };\n\nexport const AGENT_PROFILES: readonly AgentProfile[] = [\n {\n id: \"claude\",\n name: \"Claude Code\",\n launch: {\n kind: \"adapter\",\n package: \"@agentclientprotocol/claude-agent-acp\",\n version: \"0.93.0\",\n },\n binary: \"claude\",\n },\n {\n id: \"codex\",\n name: \"Codex\",\n launch: {\n kind: \"adapter\",\n package: \"@agentclientprotocol/codex-acp\",\n version: \"2.2.2\",\n },\n binary: \"codex\",\n },\n {\n id: \"gemini\",\n name: \"Gemini CLI\",\n launch: { kind: \"native\", command: \"gemini\", args: [\"--acp\"] },\n binary: \"gemini\",\n },\n];\n\n/** Where each adapter looks for the agent CLI it drives; its own search does not survive a single executable. */\nexport const ADAPTER_BINARY_ENV: Readonly<Record<string, string>> = {\n \"@agentclientprotocol/claude-agent-acp\": \"CLAUDE_CODE_EXECUTABLE\",\n \"@agentclientprotocol/codex-acp\": \"CODEX_PATH\",\n};\n\nexport const DETECT_TIMEOUT_MS = 3_000;\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nconst isFields = (value: unknown): value is Fields =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isStrings = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n\nfunction launchOf(value: unknown): AgentLaunch | undefined {\n if (!isFields(value)) return undefined;\n if (\n value.kind === \"native\" &&\n typeof value.command === \"string\" &&\n isStrings(value.args)\n ) {\n return { kind: \"native\", command: value.command, args: value.args };\n }\n if (\n value.kind === \"adapter\" &&\n typeof value.package === \"string\" &&\n typeof value.version === \"string\" &&\n (value.args === undefined || isStrings(value.args))\n ) {\n return {\n kind: \"adapter\",\n package: value.package,\n version: value.version,\n args: value.args,\n };\n }\n return undefined;\n}\n\nfunction profileOf(value: unknown): AgentProfile | undefined {\n if (!isFields(value)) return undefined;\n const launch = launchOf(value.launch);\n const { id, name, binary } = value;\n if (!launch || typeof id !== \"string\" || typeof name !== \"string\") return undefined;\n if (typeof binary !== \"string\" || id === \"\") return undefined;\n return { id, name, launch, binary };\n}\n\n/** Built-ins plus the user's own `agents.json`, which only this computer's user edits. */\nexport async function loadProfiles(file: string): Promise<readonly AgentProfile[]> {\n let text: string;\n try {\n text = await readFile(file, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return AGENT_PROFILES;\n throw error;\n }\n const listed: unknown = JSON.parse(text);\n if (!Array.isArray(listed))\n throw new Error(`${file} must hold a JSON array of agent profiles.`);\n const own = listed.map((entry, at) => {\n const profile = profileOf(entry);\n if (!profile) throw new Error(`${file}: entry ${at + 1} is not an agent profile.`);\n return profile;\n });\n const ids = new Set(own.map((profile) => profile.id));\n return [...AGENT_PROFILES.filter((profile) => !ids.has(profile.id)), ...own];\n}\n\nfunction versionOf(binary: string, path: string): Promise<string | \"missing\" | \"broken\"> {\n return new Promise((resolve) => {\n execFile(\n binary,\n [\"--version\"],\n { timeout: DETECT_TIMEOUT_MS, env: { ...process.env, PATH: path } },\n (error, stdout) => {\n if ((error as NodeJS.ErrnoException | null)?.code === \"ENOENT\")\n resolve(\"missing\");\n else if (error) resolve(\"broken\");\n else resolve(stdout.trim());\n },\n );\n });\n}\n\n/** What `hostReport` sends: the installed agents; one that is not installed is left out. */\nexport async function detectAgents(\n profiles: readonly AgentProfile[],\n): Promise<AgentInfo[]> {\n const path = await agentPath();\n const found = await Promise.all(\n profiles.map(async (profile): Promise<AgentInfo | undefined> => {\n const output = await versionOf(profile.binary, path);\n if (output === \"missing\") return undefined;\n if (output === \"broken\") {\n return {\n id: profile.id,\n name: profile.name,\n ready: false,\n problem: `\\`${profile.binary} --version\\` failed: check that ${profile.name} runs in a terminal.`,\n };\n }\n const version = /\\d+\\.\\d+\\.\\d+[\\w.-]*/.exec(output)?.[0];\n return {\n id: profile.id,\n name: profile.name,\n ready: true,\n ...(version ? { version } : {}),\n };\n }),\n );\n return found.filter((agent): agent is AgentInfo => agent !== undefined);\n}\n"]}
|
package/dist/assertion.js.map
CHANGED
|
@@ -1 +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"}
|
|
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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { HOST_ASSERTION_TTL_MS, HOST_ASSERTION_TYP, HOST_AUDIENCE } from \"@parlor/auth\";\n\nconst encode = (value: unknown) =>\n Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n\nexport interface AssertionRequest {\n readonly method: \"GET\" | \"POST\";\n readonly url: string;\n}\n\nexport async function hostAssertion(\n sign: (payload: Uint8Array) => Promise<string>,\n key: { readonly kid: string; readonly grantId: string },\n request: AssertionRequest,\n now: number = Date.now(),\n): Promise<string> {\n const target = new URL(request.url);\n target.search = \"\";\n target.hash = \"\";\n const iat = Math.floor(now / 1000);\n const header = encode({ alg: \"ES256\", typ: HOST_ASSERTION_TYP, kid: key.kid });\n const claims = encode({\n aud: HOST_AUDIENCE,\n gid: key.grantId,\n htm: request.method,\n htu: target.href,\n iat,\n exp: iat + HOST_ASSERTION_TTL_MS / 1000,\n jti: randomUUID(),\n });\n const input = `${header}.${claims}`;\n return `${input}.${await sign(new TextEncoder().encode(input))}`;\n}\n"]}
|
package/dist/control.d.ts
CHANGED
|
@@ -32,6 +32,10 @@ export type ControlRequest = {
|
|
|
32
32
|
} | {
|
|
33
33
|
readonly op: "disconnect";
|
|
34
34
|
readonly appOrigin: string;
|
|
35
|
+
} | {
|
|
36
|
+
readonly op: "agent_tools";
|
|
37
|
+
readonly appOrigin: string;
|
|
38
|
+
readonly on: boolean;
|
|
35
39
|
} | {
|
|
36
40
|
readonly op: "dev_attach";
|
|
37
41
|
readonly appOrigin: string;
|
|
@@ -46,6 +50,11 @@ export interface GrantSummary {
|
|
|
46
50
|
readonly appName: string;
|
|
47
51
|
readonly grantId: string;
|
|
48
52
|
}
|
|
53
|
+
/** The app's MCP server name in the coding agents on this computer, and which have it. */
|
|
54
|
+
export interface AgentToolsSummary {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly agents: string;
|
|
57
|
+
}
|
|
49
58
|
export type ControlFailure = {
|
|
50
59
|
readonly ok: false;
|
|
51
60
|
readonly error: string;
|
|
@@ -68,6 +77,7 @@ interface ControlReplies {
|
|
|
68
77
|
};
|
|
69
78
|
readonly connect: {
|
|
70
79
|
readonly ok: true;
|
|
80
|
+
readonly agentTools?: AgentToolsSummary;
|
|
71
81
|
};
|
|
72
82
|
readonly begin_local_pairing: {
|
|
73
83
|
readonly ok: true;
|
|
@@ -87,6 +97,11 @@ interface ControlReplies {
|
|
|
87
97
|
};
|
|
88
98
|
readonly disconnect: {
|
|
89
99
|
readonly ok: true;
|
|
100
|
+
readonly agentTools?: AgentToolsSummary;
|
|
101
|
+
};
|
|
102
|
+
readonly agent_tools: {
|
|
103
|
+
readonly ok: true;
|
|
104
|
+
readonly agentTools?: AgentToolsSummary;
|
|
90
105
|
};
|
|
91
106
|
readonly dev_attach: {
|
|
92
107
|
readonly ok: true;
|
package/dist/control.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/D,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,EAAE,EAAE,sBAAsB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,uBAAuB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrF;IAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,UAAU,cAAc;IACtB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,QAAQ,EACb;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GACrB;QAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAAA;KAAE,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;QAClB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;QACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"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"}
|
package/dist/control.js.map
CHANGED
|
@@ -1 +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;
|
|
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;AA8ElC,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","sourcesContent":["import { connect } from \"node:net\";\n\nimport type { HostPairing, LocalHostStatus, PairingDevice } from \"@parlor/capabilities\";\n\nimport { onLines } from \"./lines.js\";\nimport type { HostRelease, ServiceClient } from \"./service.js\";\n\nexport const CONTROL_PROTOCOL = 1;\n\n/**\n * Newline-delimited JSON on a 0600 Unix socket (a named pipe on Windows), spoken by the\n * `parlor-host` CLI and the desktop shell's Rust side. No TCP listener exists.\n */\nexport type ControlRequest =\n | { readonly op: \"hello\"; readonly client: ServiceClient }\n | { readonly op: \"handover\"; readonly binary: string; readonly signature: string }\n | { readonly op: \"status\" }\n | { readonly op: \"connect\"; readonly appOrigin: string }\n | { readonly op: \"begin_local_pairing\"; readonly appOrigin: string }\n | {\n readonly op: \"finish_local_pairing\";\n readonly appOrigin: string;\n readonly code: string;\n }\n | {\n readonly op: \"confirm_local_pairing\";\n readonly appOrigin: string;\n readonly connect: boolean;\n readonly device?: PairingDevice;\n }\n | { readonly op: \"disconnect\"; readonly appOrigin: string }\n | { readonly op: \"agent_tools\"; readonly appOrigin: string; readonly on: boolean }\n | { readonly op: \"dev_attach\"; readonly appOrigin: string; readonly hostToken: string }\n | { readonly op: \"dev_detach\"; readonly appOrigin: string };\n\nexport type ControlOp = ControlRequest[\"op\"];\n\nexport interface GrantSummary {\n readonly appOrigin: string;\n readonly appName: string;\n readonly grantId: string;\n}\n\n/** The app's MCP server name in the coding agents on this computer, and which have it. */\nexport interface AgentToolsSummary {\n readonly name: string;\n readonly agents: string;\n}\n\nexport type ControlFailure = { readonly ok: false; readonly error: string };\n\ninterface ControlReplies {\n readonly hello: { readonly ok: true; readonly release: HostRelease };\n readonly handover:\n | { readonly ok: true }\n | { readonly ok: false; readonly error: \"unsigned\" | \"downgrade\" };\n readonly status: {\n readonly ok: true;\n readonly status: LocalHostStatus;\n readonly grants: readonly GrantSummary[];\n };\n readonly connect: { readonly ok: true; readonly agentTools?: AgentToolsSummary };\n readonly begin_local_pairing: { readonly ok: true; readonly pairing: HostPairing };\n readonly finish_local_pairing: {\n readonly ok: true;\n readonly account: string;\n readonly appName: string;\n readonly matchingCode: string;\n };\n readonly confirm_local_pairing:\n | { readonly ok: true }\n | { readonly ok: false; readonly error: \"declined_locally\" };\n readonly disconnect: { readonly ok: true; readonly agentTools?: AgentToolsSummary };\n readonly agent_tools: { readonly ok: true; readonly agentTools?: AgentToolsSummary };\n readonly dev_attach: { readonly ok: true };\n readonly dev_detach: { readonly ok: true };\n}\n\nexport type ControlResponse<O extends ControlOp> = ControlReplies[O] | ControlFailure;\n\nexport interface ControlClient {\n send<R extends ControlRequest>(request: R): Promise<ControlResponse<R[\"op\"]>>;\n close(): void;\n}\n\n/** `undefined` when no daemon answers on the socket. */\nexport async function connectControl(\n socketPath: string,\n): Promise<ControlClient | undefined> {\n const socket = connect(socketPath);\n const connected = await new Promise<boolean>((resolve) => {\n socket.once(\"connect\", () => resolve(true));\n socket.once(\"error\", () => resolve(false));\n });\n if (!connected) {\n socket.destroy();\n return undefined;\n }\n const waiting: ((line: string | undefined) => void)[] = [];\n onLines(socket, (line) => waiting.shift()?.(line));\n socket.on(\"close\", () => {\n for (const reply of waiting.splice(0)) reply(undefined);\n });\n socket.on(\"error\", () => socket.destroy());\n return {\n send: (request) =>\n new Promise((resolve) => {\n waiting.push((line) =>\n resolve(\n line === undefined\n ? { ok: false, error: \"Parlor Host closed the connection.\" }\n : JSON.parse(line),\n ),\n );\n socket.write(`${JSON.stringify(request)}\\n`);\n }),\n close: () => socket.end(),\n };\n}\n"]}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -27,12 +27,20 @@ export interface DaemonDeps {
|
|
|
27
27
|
*/
|
|
28
28
|
export interface HostDaemon {
|
|
29
29
|
start(): Promise<void>;
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
/** What the coding agents here know the app by, when the user let them use it. */
|
|
31
|
+
connect(appOrigin: string): Promise<ConnectedTools | undefined>;
|
|
32
|
+
disconnect(appOrigin: string): Promise<ConnectedTools | undefined>;
|
|
33
|
+
/** Lets the coding agents here use the app outside its sidebar, or stops them. */
|
|
34
|
+
agentTools(appOrigin: string, on: boolean): Promise<ConnectedTools | undefined>;
|
|
32
35
|
/** Hands links over to a newer release; running turns finish here first. */
|
|
33
36
|
handover(): Promise<void>;
|
|
34
37
|
stop(): Promise<void>;
|
|
35
38
|
}
|
|
39
|
+
/** The app's MCP server name in the coding agents here, and which of them have it. */
|
|
40
|
+
export interface ConnectedTools {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly agents: string;
|
|
43
|
+
}
|
|
36
44
|
/**
|
|
37
45
|
* Agents start `parlor-host mcp-proxy` by name. An entry named otherwise, such as the
|
|
38
46
|
* published `dist/main.js` that `parlor dev` runs with node, gets a shim instead of a link.
|
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;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAU9C,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMzF,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;AAElF,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,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;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAsoBhE"}
|