@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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -2
  3. package/dist/acp.d.ts +165 -0
  4. package/dist/acp.d.ts.map +1 -0
  5. package/dist/acp.js +626 -0
  6. package/dist/acp.js.map +1 -0
  7. package/dist/adapter-launch.d.ts +7 -0
  8. package/dist/adapter-launch.d.ts.map +1 -0
  9. package/dist/adapter-launch.js +35 -0
  10. package/dist/adapter-launch.js.map +1 -0
  11. package/dist/agents.d.ts +32 -0
  12. package/dist/agents.d.ts.map +1 -0
  13. package/dist/agents.js +132 -0
  14. package/dist/agents.js.map +1 -0
  15. package/dist/assertion.d.ts +9 -0
  16. package/dist/assertion.d.ts.map +1 -0
  17. package/dist/assertion.js +22 -0
  18. package/dist/assertion.js.map +1 -0
  19. package/dist/control.d.ts +106 -0
  20. package/dist/control.d.ts.map +1 -0
  21. package/dist/control.js +32 -0
  22. package/dist/control.js.map +1 -0
  23. package/dist/daemon.d.ts +50 -0
  24. package/dist/daemon.d.ts.map +1 -0
  25. package/dist/daemon.js +543 -0
  26. package/dist/daemon.js.map +1 -0
  27. package/dist/dev-host.d.ts +5 -0
  28. package/dist/dev-host.d.ts.map +1 -0
  29. package/dist/dev-host.js +29 -0
  30. package/dist/dev-host.js.map +1 -0
  31. package/dist/device-list.d.ts +6 -0
  32. package/dist/device-list.d.ts.map +1 -0
  33. package/dist/device-list.js +30 -0
  34. package/dist/device-list.js.map +1 -0
  35. package/dist/embedded.d.ts +6 -0
  36. package/dist/embedded.d.ts.map +1 -0
  37. package/dist/embedded.js +3 -0
  38. package/dist/embedded.js.map +1 -0
  39. package/dist/fold.d.ts +38 -0
  40. package/dist/fold.d.ts.map +1 -0
  41. package/dist/fold.js +165 -0
  42. package/dist/fold.js.map +1 -0
  43. package/dist/grants.d.ts +54 -0
  44. package/dist/grants.d.ts.map +1 -0
  45. package/dist/grants.js +157 -0
  46. package/dist/grants.js.map +1 -0
  47. package/dist/index.d.ts +17 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +17 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/json-file.d.ts +6 -0
  52. package/dist/json-file.d.ts.map +1 -0
  53. package/dist/json-file.js +35 -0
  54. package/dist/json-file.js.map +1 -0
  55. package/dist/lines.d.ts +5 -0
  56. package/dist/lines.d.ts.map +1 -0
  57. package/dist/lines.js +9 -0
  58. package/dist/lines.js.map +1 -0
  59. package/dist/link-device.d.ts +28 -0
  60. package/dist/link-device.d.ts.map +1 -0
  61. package/dist/link-device.js +40 -0
  62. package/dist/link-device.js.map +1 -0
  63. package/dist/link.d.ts +52 -0
  64. package/dist/link.d.ts.map +1 -0
  65. package/dist/link.js +277 -0
  66. package/dist/link.js.map +1 -0
  67. package/dist/lock.d.ts +7 -0
  68. package/dist/lock.d.ts.map +1 -0
  69. package/dist/lock.js +105 -0
  70. package/dist/lock.js.map +1 -0
  71. package/dist/log.d.ts +3 -0
  72. package/dist/log.d.ts.map +1 -0
  73. package/dist/log.js +18 -0
  74. package/dist/log.js.map +1 -0
  75. package/dist/main.d.ts +3 -0
  76. package/dist/main.d.ts.map +1 -0
  77. package/dist/main.js +520 -0
  78. package/dist/main.js.map +1 -0
  79. package/dist/mcp-proxy.d.ts +33 -0
  80. package/dist/mcp-proxy.d.ts.map +1 -0
  81. package/dist/mcp-proxy.js +317 -0
  82. package/dist/mcp-proxy.js.map +1 -0
  83. package/dist/naming.d.ts +7 -0
  84. package/dist/naming.d.ts.map +1 -0
  85. package/dist/naming.js +42 -0
  86. package/dist/naming.js.map +1 -0
  87. package/dist/pairing.d.ts +68 -0
  88. package/dist/pairing.d.ts.map +1 -0
  89. package/dist/pairing.js +312 -0
  90. package/dist/pairing.js.map +1 -0
  91. package/dist/paths.d.ts +19 -0
  92. package/dist/paths.d.ts.map +1 -0
  93. package/dist/paths.js +23 -0
  94. package/dist/paths.js.map +1 -0
  95. package/dist/policy.d.ts +37 -0
  96. package/dist/policy.d.ts.map +1 -0
  97. package/dist/policy.js +60 -0
  98. package/dist/policy.js.map +1 -0
  99. package/dist/pool.d.ts +34 -0
  100. package/dist/pool.d.ts.map +1 -0
  101. package/dist/pool.js +112 -0
  102. package/dist/pool.js.map +1 -0
  103. package/dist/prompter.d.ts +33 -0
  104. package/dist/prompter.d.ts.map +1 -0
  105. package/dist/prompter.js +98 -0
  106. package/dist/prompter.js.map +1 -0
  107. package/dist/release-main.d.ts +2 -0
  108. package/dist/release-main.d.ts.map +1 -0
  109. package/dist/release-main.js +50 -0
  110. package/dist/release-main.js.map +1 -0
  111. package/dist/release.d.ts +22 -0
  112. package/dist/release.d.ts.map +1 -0
  113. package/dist/release.js +81 -0
  114. package/dist/release.js.map +1 -0
  115. package/dist/revoke.d.ts +10 -0
  116. package/dist/revoke.d.ts.map +1 -0
  117. package/dist/revoke.js +23 -0
  118. package/dist/revoke.js.map +1 -0
  119. package/dist/self.d.ts +7 -0
  120. package/dist/self.d.ts.map +1 -0
  121. package/dist/self.js +10 -0
  122. package/dist/self.js.map +1 -0
  123. package/dist/service.d.ts +97 -0
  124. package/dist/service.d.ts.map +1 -0
  125. package/dist/service.js +205 -0
  126. package/dist/service.js.map +1 -0
  127. package/dist/shell-path.d.ts +10 -0
  128. package/dist/shell-path.d.ts.map +1 -0
  129. package/dist/shell-path.js +64 -0
  130. package/dist/shell-path.js.map +1 -0
  131. package/dist/skeleton-kit.d.ts +8 -0
  132. package/dist/skeleton-kit.d.ts.map +1 -0
  133. package/dist/skeleton-kit.js +143 -0
  134. package/dist/skeleton-kit.js.map +1 -0
  135. package/dist/spec-kit.d.ts +102 -0
  136. package/dist/spec-kit.d.ts.map +1 -0
  137. package/dist/spec-kit.js +372 -0
  138. package/dist/spec-kit.js.map +1 -0
  139. package/dist/testing/fake-agent.d.ts +65 -0
  140. package/dist/testing/fake-agent.d.ts.map +1 -0
  141. package/dist/testing/fake-agent.js +238 -0
  142. package/dist/testing/fake-agent.js.map +1 -0
  143. package/dist/trust.d.ts +20 -0
  144. package/dist/trust.d.ts.map +1 -0
  145. package/dist/trust.js +27 -0
  146. package/dist/trust.js.map +1 -0
  147. package/dist/turn.d.ts +32 -0
  148. package/dist/turn.d.ts.map +1 -0
  149. package/dist/turn.js +650 -0
  150. package/dist/turn.js.map +1 -0
  151. package/dist/version.d.ts +2 -0
  152. package/dist/version.d.ts.map +1 -0
  153. package/dist/version.js +6 -0
  154. package/dist/version.js.map +1 -0
  155. package/package.json +57 -3
@@ -0,0 +1,205 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, chmod, copyFile, mkdir, open, rename, rm, symlink, writeFile, } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { connectControl } from "./control.js";
5
+ import { LOCK_TOKEN_ENV, withFileLock } from "./lock.js";
6
+ import { compareVersions, RELEASE_KEY, sha256File, signedRelease, } from "./release.js";
7
+ import { selfInvocation } from "./self.js";
8
+ export function actionFor(situation, client) {
9
+ switch (situation.service) {
10
+ case "legacy":
11
+ return { do: "refuse_legacy" };
12
+ case "absent":
13
+ if (situation.installed)
14
+ return { do: "start_installed" };
15
+ return client.kind === "cli"
16
+ ? { do: "spawn_self" }
17
+ : { do: "install_bundled", client };
18
+ case "running": {
19
+ const { running } = situation;
20
+ if (client.kind === "cli")
21
+ return { do: "use", running };
22
+ const order = compareVersions(client.release.version, running.version);
23
+ if (order > 0)
24
+ return { do: "hand_over", client, running };
25
+ return order === 0 ? { do: "use", running } : { do: "refuse_downgrade", running };
26
+ }
27
+ }
28
+ }
29
+ const DEFAULTS = { releaseKey: RELEASE_KEY, readyMs: 15_000, pollMs: 100 };
30
+ const startWith = (deps) => deps.start ?? spawnService;
31
+ const SERVICE_BINARY = "parlor-host";
32
+ const SIGNATURE_FILE = "parlor-host.sig";
33
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
34
+ const exists = (path) => access(path).then(() => true, () => false);
35
+ async function observe(paths, client) {
36
+ const control = await connectControl(paths.control);
37
+ if (!control) {
38
+ return {
39
+ service: "absent",
40
+ installed: await exists(join(paths.current, SERVICE_BINARY)),
41
+ };
42
+ }
43
+ const reply = await control.send({ op: "hello", client });
44
+ control.close();
45
+ return reply.ok
46
+ ? { service: "running", running: reply.release }
47
+ : { service: "legacy" };
48
+ }
49
+ async function spawnService(paths, command, args, lockToken) {
50
+ await mkdir(paths.logs, { recursive: true, mode: 0o700 });
51
+ const output = await open(join(paths.logs, "daemon.out"), "a", 0o600);
52
+ const child = spawn(command, args, {
53
+ cwd: paths.root,
54
+ detached: true,
55
+ stdio: ["ignore", output.fd, output.fd],
56
+ env: { ...process.env, [LOCK_TOKEN_ENV]: lockToken },
57
+ });
58
+ child.unref();
59
+ await output.close();
60
+ }
61
+ async function untilRunning(paths, client, deps, ready = () => true) {
62
+ for (const deadline = Date.now() + deps.readyMs; Date.now() < deadline;) {
63
+ const situation = await observe(paths, client);
64
+ if (situation.service === "running" && ready(situation.running)) {
65
+ return situation.running;
66
+ }
67
+ await sleep(deps.pollMs);
68
+ }
69
+ throw new Error(`Parlor Host did not start; see ${join(paths.logs, "daemon.out")}.`);
70
+ }
71
+ /**
72
+ * Copies a verified binary into `versions/<version>/` and repoints `current`, each step
73
+ * atomic and repeatable; false when the copy is not the binary the signature describes.
74
+ */
75
+ export async function installRelease(paths, source, release) {
76
+ const target = join(paths.versions, release.version);
77
+ const installed = join(target, SERVICE_BINARY);
78
+ const present = (await sha256File(installed).catch(() => undefined)) === release.sha256;
79
+ if (!present) {
80
+ const staged = join(paths.versions, `.${release.version}.tmp-${process.pid}`);
81
+ await rm(staged, { recursive: true, force: true });
82
+ await mkdir(staged, { recursive: true, mode: 0o700 });
83
+ await copyFile(source.binary, join(staged, SERVICE_BINARY));
84
+ await chmod(join(staged, SERVICE_BINARY), 0o755);
85
+ await copyFile(source.signature, join(staged, SIGNATURE_FILE));
86
+ if ((await sha256File(join(staged, SERVICE_BINARY))) !== release.sha256) {
87
+ await rm(staged, { recursive: true, force: true });
88
+ return false;
89
+ }
90
+ await rm(target, { recursive: true, force: true });
91
+ await rename(staged, target);
92
+ }
93
+ const link = `${paths.current}.tmp-${process.pid}`;
94
+ await rm(link, { force: true });
95
+ await symlink(join("versions", release.version), link);
96
+ await rename(link, paths.current);
97
+ return true;
98
+ }
99
+ const escapeXml = (text) => text.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
100
+ /** LaunchAgent, systemd user unit or Task Scheduler, pointing at `paths.current`. */
101
+ export async function installLoginItem(paths) {
102
+ const plist = `<?xml version="1.0" encoding="UTF-8"?>
103
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
104
+ <plist version="1.0">
105
+ <dict>
106
+ <key>Label</key>
107
+ <string>dev.parlor.host</string>
108
+ <key>ProgramArguments</key>
109
+ <array>
110
+ <string>${escapeXml(join(paths.current, SERVICE_BINARY))}</string>
111
+ <string>daemon</string>
112
+ </array>
113
+ <key>RunAtLoad</key>
114
+ <true/>
115
+ <key>KeepAlive</key>
116
+ <dict>
117
+ <key>SuccessfulExit</key>
118
+ <false/>
119
+ </dict>
120
+ <key>StandardOutPath</key>
121
+ <string>${escapeXml(join(paths.logs, "daemon.out"))}</string>
122
+ <key>StandardErrorPath</key>
123
+ <string>${escapeXml(join(paths.logs, "daemon.out"))}</string>
124
+ </dict>
125
+ </plist>
126
+ `;
127
+ await mkdir(dirname(paths.launchAgent), { recursive: true });
128
+ const staged = `${paths.launchAgent}.${process.pid}.tmp`;
129
+ await writeFile(staged, plist, { mode: 0o644 });
130
+ await rename(staged, paths.launchAgent);
131
+ }
132
+ async function installBundled(paths, client, deps, lockToken) {
133
+ const source = {
134
+ binary: client.binary,
135
+ signature: client.signature ?? `${client.binary}.sig`,
136
+ };
137
+ const release = await signedRelease(source.binary, source.signature, deps.releaseKey);
138
+ if (!release ||
139
+ release.version !== client.release.version ||
140
+ !(await installRelease(paths, source, release))) {
141
+ return { kind: "refused", reason: "unsigned" };
142
+ }
143
+ await installLoginItem(paths);
144
+ await startWith(deps)(paths, join(paths.current, SERVICE_BINARY), ["daemon"], lockToken);
145
+ return { kind: "installed", release: await untilRunning(paths, client, deps) };
146
+ }
147
+ async function handOver(paths, client, running, deps, lockToken) {
148
+ const control = await connectControl(paths.control);
149
+ if (!control)
150
+ throw new Error("Parlor Host stopped answering during the upgrade.");
151
+ const reply = await control.send({
152
+ op: "handover",
153
+ binary: client.binary,
154
+ signature: client.signature ?? `${client.binary}.sig`,
155
+ });
156
+ control.close();
157
+ if (!reply.ok) {
158
+ return reply.error === "unsigned" || reply.error === "downgrade"
159
+ ? { kind: "refused", reason: reply.error, running }
160
+ : (() => {
161
+ throw new Error(reply.error);
162
+ })();
163
+ }
164
+ await startWith(deps)(paths, join(paths.current, SERVICE_BINARY), ["daemon"], lockToken);
165
+ const to = await untilRunning(paths, client, deps, (release) => compareVersions(release.version, running.version) > 0);
166
+ return { kind: "upgraded", from: running, to };
167
+ }
168
+ /**
169
+ * Leaves exactly one per-user service running, the newest: adopt, install or upgrade.
170
+ * Only binaries signed by the Parlor release key, never a downgrade; installs hold a lock
171
+ * under `paths.root`, so two apps can run it at once.
172
+ */
173
+ export async function ensureServiceWith(deps, paths, client) {
174
+ await mkdir(paths.root, { recursive: true, mode: 0o700 });
175
+ return withFileLock(paths.lock, async (lockToken) => {
176
+ for (;;) {
177
+ const action = actionFor(await observe(paths, client), client);
178
+ switch (action.do) {
179
+ case "refuse_legacy":
180
+ return { kind: "refused", reason: "legacy_service" };
181
+ case "use":
182
+ return { kind: "using", running: action.running };
183
+ case "refuse_downgrade":
184
+ return { kind: "refused", reason: "downgrade", running: action.running };
185
+ case "hand_over":
186
+ return handOver(paths, action.client, action.running, deps, lockToken);
187
+ case "install_bundled":
188
+ return installBundled(paths, action.client, deps, lockToken);
189
+ case "start_installed":
190
+ await startWith(deps)(paths, join(paths.current, SERVICE_BINARY), ["daemon"], lockToken);
191
+ await untilRunning(paths, client, deps);
192
+ continue;
193
+ case "spawn_self": {
194
+ const self = selfInvocation(["daemon"]);
195
+ await startWith(deps)(paths, self.command, self.args, lockToken);
196
+ return { kind: "installed", release: await untilRunning(paths, client, deps) };
197
+ }
198
+ }
199
+ }
200
+ });
201
+ }
202
+ export function ensureService(paths, client) {
203
+ return ensureServiceWith(DEFAULTS, paths, client);
204
+ }
205
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The PATH agents are found on: this process's own first, then what the login shell adds,
3
+ * then the directories agent CLIs install into, since a LaunchAgent or a GUI app gets only
4
+ * launchd's system PATH.
5
+ */
6
+ export declare function agentPath(): Promise<string>;
7
+ /** The first executable `name` on `path`, as an absolute path. */
8
+ export declare function resolveBinary(name: string, path: string): Promise<string | undefined>;
9
+ export declare function agentEnvironment(): Promise<Record<string, string>>;
10
+ //# sourceMappingURL=shell-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-path.d.ts","sourceRoot":"","sources":["../src/shell-path.ts"],"names":[],"mappings":"AA+BA;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAY3C;AAED,kEAAkE;AAClE,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOxE"}
@@ -0,0 +1,64 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, constants } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { delimiter, join } from "node:path";
5
+ const MARK = "__PARLOR_PATH__";
6
+ const TIMEOUT_MS = 3_000;
7
+ let resolved;
8
+ const wellKnownDirectories = () => [
9
+ join(homedir(), ".local", "bin"),
10
+ "/opt/homebrew/bin",
11
+ "/usr/local/bin",
12
+ ];
13
+ function fromLoginShell() {
14
+ return new Promise((resolve) => {
15
+ const shell = process.env.SHELL || "/bin/zsh";
16
+ const child = spawn(shell, ["-ilc", `printf '${MARK}%s${MARK}' "$PATH"`], {
17
+ stdio: ["ignore", "pipe", "ignore"],
18
+ timeout: TIMEOUT_MS,
19
+ });
20
+ let out = "";
21
+ child.stdout.setEncoding("utf8");
22
+ child.stdout.on("data", (chunk) => (out += chunk));
23
+ child.once("error", () => resolve(undefined));
24
+ child.once("close", () => resolve(out.split(MARK)[1]));
25
+ });
26
+ }
27
+ /**
28
+ * The PATH agents are found on: this process's own first, then what the login shell adds,
29
+ * then the directories agent CLIs install into, since a LaunchAgent or a GUI app gets only
30
+ * launchd's system PATH.
31
+ */
32
+ export function agentPath() {
33
+ resolved ??= fromLoginShell().then((login) => {
34
+ const own = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
35
+ const known = (entry) => own.includes(entry);
36
+ const fromShell = (login ?? "")
37
+ .split(delimiter)
38
+ .filter((entry) => entry && !known(entry));
39
+ const rest = [...own, ...fromShell];
40
+ const installed = wellKnownDirectories().filter((entry) => !rest.includes(entry));
41
+ return [...rest, ...installed].join(delimiter);
42
+ });
43
+ return resolved;
44
+ }
45
+ /** The first executable `name` on `path`, as an absolute path. */
46
+ export async function resolveBinary(name, path) {
47
+ for (const directory of path.split(delimiter).filter(Boolean)) {
48
+ const candidate = join(directory, name);
49
+ const found = await access(candidate, constants.X_OK).then(() => candidate, () => undefined);
50
+ if (found !== undefined)
51
+ return found;
52
+ }
53
+ return undefined;
54
+ }
55
+ export async function agentEnvironment() {
56
+ const env = {};
57
+ for (const [name, value] of Object.entries(process.env)) {
58
+ if (value !== undefined && !name.startsWith("PARLOR_"))
59
+ env[name] = value;
60
+ }
61
+ env.PATH = await agentPath();
62
+ return env;
63
+ }
64
+ //# sourceMappingURL=shell-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-path.js","sourceRoot":"","sources":["../src/shell-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,IAAI,QAAqC,CAAC;AAE1C,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC;IAChC,mBAAmB;IACnB,gBAAgB;CACjB,CAAC;AAEF,SAAS,cAAc;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,IAAI,KAAK,IAAI,WAAW,CAAC,EAAE;YACxE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,QAAQ,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;aAC5B,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAY;IAEZ,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CACxD,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC5E,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const compact: (text: string) => string;
2
+ export interface Difference {
3
+ readonly file: string;
4
+ readonly symbol: string;
5
+ readonly kind: "changed" | "missing" | "added";
6
+ }
7
+ export declare function differences(file: string, skeleton: string, actual: string, only?: readonly string[]): Difference[];
8
+ //# sourceMappingURL=skeleton-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-kit.d.ts","sourceRoot":"","sources":["../src/skeleton-kit.ts"],"names":[],"mappings":"AA6DA,eAAO,MAAM,OAAO,SAAU,MAAM,WAIA,CAAC;AA8DrC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CAChD;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GACvB,UAAU,EAAE,CAcd"}
@@ -0,0 +1,143 @@
1
+ const OPENING = "([{";
2
+ const CLOSING = ")]}";
3
+ function statementsOf(text) {
4
+ const statements = [];
5
+ let current = "";
6
+ let depth = 0;
7
+ const open = [];
8
+ for (let at = 0; at < text.length; at += 1) {
9
+ const char = text[at];
10
+ const next = text[at + 1];
11
+ if (char === "/" && next === "/") {
12
+ while (at < text.length && text[at] !== "\n")
13
+ at += 1;
14
+ continue;
15
+ }
16
+ if (char === "/" && next === "*") {
17
+ at = text.indexOf("*/", at + 2) + 1;
18
+ continue;
19
+ }
20
+ if (char === '"' || char === "'" || char === "`") {
21
+ let end = at + 1;
22
+ while (end < text.length && text[end] !== char)
23
+ end += text[end] === "\\" ? 2 : 1;
24
+ current += text.slice(at, end + 1);
25
+ at = end;
26
+ continue;
27
+ }
28
+ if (CLOSING.includes(char) && depth === 0) {
29
+ current = "";
30
+ continue;
31
+ }
32
+ current += char;
33
+ if (OPENING.includes(char)) {
34
+ depth += 1;
35
+ open.push(CLOSING[OPENING.indexOf(char)]);
36
+ }
37
+ else if (CLOSING.includes(char)) {
38
+ depth -= 1;
39
+ open.pop();
40
+ const blockEnded = char === "}" && depth === 0;
41
+ const rest = text.slice(at + 1).match(/^\s*(\S)/)?.[1];
42
+ if (blockEnded && rest !== ";" && rest !== "," && rest !== "." && rest !== ")") {
43
+ const head = current.trim();
44
+ const isBlock = /^(export\s+)?(async\s+)?(function|interface|class|enum)\b/.test(head);
45
+ const hasBody = !/^(export\s+)?(async\s+)?function\b/.test(head) ||
46
+ endOfSignature(head) < head.length;
47
+ if (isBlock && hasBody) {
48
+ statements.push(current.trim());
49
+ current = "";
50
+ }
51
+ }
52
+ }
53
+ else if (char === ";" && depth === 0) {
54
+ statements.push(current.trim());
55
+ current = "";
56
+ }
57
+ }
58
+ if (current.trim())
59
+ statements.push(`${current.trim()}${open.reverse().join("")}`);
60
+ return statements;
61
+ }
62
+ export const compact = (text) => text
63
+ .replace(/\s+/g, " ")
64
+ .replace(/\s*([(){}[\],;:<>|&=?])\s*/g, "$1")
65
+ .replace(/[,;](?=[)\]}>])/g, "");
66
+ function endOfSignature(statement) {
67
+ let parens = 0;
68
+ let angles = 0;
69
+ let seenParams = false;
70
+ for (let at = 0; at < statement.length; at += 1) {
71
+ const char = statement[at];
72
+ if (char === "(")
73
+ parens += 1;
74
+ else if (char === ")") {
75
+ parens -= 1;
76
+ if (parens === 0)
77
+ seenParams = true;
78
+ }
79
+ else if (parens === 0 && seenParams) {
80
+ if (char === "<")
81
+ angles += 1;
82
+ else if (char === ">" && statement[at - 1] !== "=")
83
+ angles -= 1;
84
+ else if (char === "{" &&
85
+ angles === 0 &&
86
+ !/[:|&]\s*$/.test(statement.slice(0, at))) {
87
+ return at;
88
+ }
89
+ }
90
+ }
91
+ return statement.length;
92
+ }
93
+ function signaturesOf(text) {
94
+ const signatures = new Map();
95
+ const add = (name, signature) => signatures.set(name, [signatures.get(name), compact(signature)].filter(Boolean).join("\n"));
96
+ for (const statement of statementsOf(text)) {
97
+ if (!statement.startsWith("export"))
98
+ continue;
99
+ const declaration = statement.replace(/^export\s+(default\s+)?/, "");
100
+ const named = /^(?:async\s+)?(function|interface|type|class|enum)\s+(\w+)/.exec(declaration);
101
+ if (named) {
102
+ const [, kind, name] = named;
103
+ const keep = kind === "function"
104
+ ? declaration.slice(0, endOfSignature(declaration)).replace(/^async\s+/, "")
105
+ : declaration;
106
+ add(name, keep);
107
+ }
108
+ else if (/^(const|let)\s/.test(declaration)) {
109
+ const name = /^(?:const|let)\s+(\w+)/.exec(declaration)[1];
110
+ const [head] = declaration.split(/(?<![=!<>])=(?![=>])/);
111
+ const annotated = /^(?:const|let)\s+\w+\s*:/.test(declaration);
112
+ const callee = /=\s*([\w.]+(?:<[^(]*>)?)\(/.exec(declaration)?.[1];
113
+ add(name, annotated ? head : `${name} = ${callee ?? ""}`);
114
+ }
115
+ else if (/^(type\s+)?\{/.test(declaration) || declaration.startsWith("*")) {
116
+ for (const [, name] of declaration.matchAll(/(?:\btype\s+)?(\w+)(?=\s*[,}])/g)) {
117
+ if (name !== "type")
118
+ add(name, "re-export");
119
+ }
120
+ }
121
+ }
122
+ return signatures;
123
+ }
124
+ export function differences(file, skeleton, actual, only) {
125
+ const wanted = signaturesOf(skeleton);
126
+ const found = signaturesOf(actual);
127
+ const names = new Set([...wanted.keys(), ...found.keys()]);
128
+ const out = [];
129
+ for (const symbol of [...names].sort()) {
130
+ if (only && !only.includes(symbol))
131
+ continue;
132
+ const before = wanted.get(symbol);
133
+ const after = found.get(symbol);
134
+ if (before === undefined)
135
+ out.push({ file, symbol, kind: "added" });
136
+ else if (after === undefined)
137
+ out.push({ file, symbol, kind: "missing" });
138
+ else if (before !== after)
139
+ out.push({ file, symbol, kind: "changed" });
140
+ }
141
+ return out;
142
+ }
143
+ //# sourceMappingURL=skeleton-kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton-kit.js","sourceRoot":"","sources":["../src/skeleton-kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ import { type AnswerToSign, type ItemSignature, type PromptToSign } from "@parlor/chat";
3
+ import { type DeviceKeys, type DeviceVouch, type FrameworkServer } from "@parlor/server";
4
+ import type { AppGrant, HostKeys } from "./grants.js";
5
+ import type { TrustedDevice, TrustStore } from "./trust.js";
6
+ export declare const PASSWORD = "correct horse battery staple";
7
+ export declare class Browser {
8
+ #private;
9
+ readonly origin: string;
10
+ constructor(origin: string);
11
+ fetch(url: string, init?: RequestInit): Promise<Response>;
12
+ consent(url: string, decision: "connect" | "cancel"): Promise<{
13
+ readonly page: string;
14
+ readonly answer: Response;
15
+ }>;
16
+ }
17
+ export interface SpecApp {
18
+ readonly origin: string;
19
+ readonly server: FrameworkServer;
20
+ signUp(name: string): Promise<Browser>;
21
+ close(): Promise<void>;
22
+ }
23
+ export declare function startSpecApp(): Promise<SpecApp>;
24
+ export declare function memoryHostKeys(): HostKeys & {
25
+ readonly origins: () => readonly string[];
26
+ };
27
+ export declare function memoryTrust(): TrustStore & {
28
+ readonly pins: () => TrustedDevice[];
29
+ };
30
+ export declare class TestDevice {
31
+ readonly keys: DeviceKeys;
32
+ private readonly signing;
33
+ private readonly presence;
34
+ private constructor();
35
+ static create(id?: string, name?: string, platform?: string): Promise<TestDevice>;
36
+ get id(): import("@parlor/core").DeviceId;
37
+ private sign;
38
+ signPrompt(app: string, prompt: PromptToSign, at: number, presence?: boolean): Promise<ItemSignature>;
39
+ signAnswer(app: string, answer: AnswerToSign, at: number, presence: boolean): Promise<ItemSignature>;
40
+ /** This device's vouch for `device`, signed with its presence key unless `presence` is false. */
41
+ vouchFor(app: string, device: DeviceKeys, at: number, options?: {
42
+ readonly presence?: boolean;
43
+ readonly commitment?: string;
44
+ }): Promise<DeviceVouch>;
45
+ }
46
+ export interface StubApp {
47
+ readonly origin: string;
48
+ readonly seen: {
49
+ readonly method: string;
50
+ readonly path: string;
51
+ readonly body: string;
52
+ }[];
53
+ close(): Promise<void>;
54
+ }
55
+ export type Route = (request: IncomingMessage, body: string, response: ServerResponse) => boolean;
56
+ export declare function stubApp(route: Route): Promise<StubApp>;
57
+ export declare const json: (response: ServerResponse, value: unknown, status?: number) => ServerResponse<IncomingMessage>;
58
+ export declare const welcome: {
59
+ id: string;
60
+ accepted: boolean;
61
+ protocol: number;
62
+ leaseMs: number;
63
+ heartbeatMs: number;
64
+ };
65
+ export declare function hostRoutes(options: {
66
+ readonly wake: boolean;
67
+ readonly turn?: () => unknown;
68
+ }): Route;
69
+ export declare const claimedTurn: (turnId: string, agentId: string, context: string, text: string) => {
70
+ id: string;
71
+ turnId: string;
72
+ agent: {
73
+ hostId: string;
74
+ agentId: string;
75
+ };
76
+ clientId: string;
77
+ prompt: {
78
+ id: string;
79
+ threadId: string;
80
+ turnId: string;
81
+ seq: number;
82
+ at: number;
83
+ author: string;
84
+ kind: string;
85
+ body: {
86
+ text: string;
87
+ agent: {
88
+ hostId: string;
89
+ agentId: string;
90
+ };
91
+ };
92
+ };
93
+ device: undefined;
94
+ context: string;
95
+ token: {
96
+ token: string;
97
+ expiresAt: number;
98
+ };
99
+ leaseUntil: number;
100
+ };
101
+ export declare const grantFor: (origin: string, name: string, workspace: string) => AppGrant;
102
+ //# sourceMappingURL=spec-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-kit.d.ts","sourceRoot":"","sources":["../src/spec-kit.ts"],"names":[],"mappings":"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"}