@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
package/dist/grants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../src/grants.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../src/grants.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile, spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { promisify } from \"node:util\";\n\nimport type { AccountSummary } from \"@parlor/auth\";\nimport type { GrantId, HostId } from \"@parlor/core\";\n\nimport { hostAssertion } from \"./assertion.js\";\nimport { jsonFile } from \"./json-file.js\";\n\n/** One app this computer is connected to. Its key lives in `HostKeys`, never here. */\nexport interface AppGrant {\n readonly appOrigin: string;\n readonly appName: string;\n readonly grantId: GrantId;\n readonly hostId: HostId;\n readonly account: AccountSummary;\n /** The agents' working directory for this app; only the user changes it, here. */\n readonly workspace: string;\n readonly createdAt: number;\n /** A `parlor dev` grant: in memory only. */\n readonly dev?: true | undefined;\n /** Refused here but not yet revoked by the app: kept only to retry the revoke, never served. */\n readonly declined?: true | undefined;\n /**\n * Handed only to the browser that approved `connect`, through the loopback redirect; that\n * browser proves it on its first prompt and is trusted without asking, then this is dropped.\n */\n readonly pairingSecret?: string | undefined;\n /**\n * Whether the coding agents on this computer may use the app outside its sidebar, as the\n * user chose when connecting, and the name and agents it is registered under once it is.\n */\n readonly agentTools?:\n | {\n readonly on: boolean;\n readonly name?: string | undefined;\n readonly agents?: readonly string[] | undefined;\n }\n | undefined;\n}\n\n/** One key per app grant in the OS keychain; the server holds only its public half. */\nexport interface HostKeys {\n /** A pairing's new key pair, kept only once the pairing completes. */\n create(appOrigin: string): Promise<HostKeyPair>;\n /** A fresh `ParlorHost` assertion for one request. */\n assert(\n appOrigin: string,\n request: { readonly method: \"GET\" | \"POST\"; readonly url: string },\n ): Promise<string>;\n remove(appOrigin: string): Promise<void>;\n}\n\nexport interface HostKeyPair {\n readonly publicKey: JsonWebKey;\n /** RFC 7638, the assertion's `kid`. */\n readonly thumbprint: string;\n sign(payload: Uint8Array): Promise<string>;\n /** Binds the key to the grant the pairing produced and stores it. */\n keep(grantId: GrantId): Promise<void>;\n}\n\nexport interface GrantStore {\n list(): Promise<readonly AppGrant[]>;\n get(appOrigin: string): Promise<AppGrant | undefined>;\n save(grant: AppGrant): Promise<void>;\n remove(appOrigin: string): Promise<void>;\n}\n\n/** `~/.parlor/host/grants.json`, 0600, written atomically. */\nexport function fileGrantStore(file: string): GrantStore {\n const grants = jsonFile<Record<string, AppGrant>>(file);\n return {\n list: async () => Object.values(await grants.read()),\n get: async (appOrigin) => (await grants.read())[appOrigin],\n save: (grant) =>\n grants.change((all) => {\n all[grant.appOrigin] = grant;\n }),\n remove: (appOrigin) =>\n grants.change((all) => {\n delete all[appOrigin];\n }),\n };\n}\n\nconst EC_P256 = { name: \"ECDSA\", namedCurve: \"P-256\" } as const;\nconst ES256 = { name: \"ECDSA\", hash: \"SHA-256\" } as const;\nconst ORIGIN = /^https?:\\/\\/[A-Za-z0-9.\\-[\\]:]+$/;\n\ninterface StoredKey {\n readonly jwk: JsonWebKey;\n readonly kid: string;\n readonly grantId: string;\n}\n\ninterface LoadedKey {\n readonly key: CryptoKey;\n readonly kid: string;\n readonly grantId: string;\n}\n\ninterface SecretStore {\n read(account: string): Promise<string | undefined>;\n write(account: string, secret: string): Promise<void>;\n remove(account: string): Promise<void>;\n}\n\nfunction thumbprintOf({ crv, kty, x, y }: JsonWebKey): string {\n return createHash(\"sha256\")\n .update(JSON.stringify({ crv, kty, x, y }))\n .digest(\"base64url\");\n}\n\nconst signer = (key: CryptoKey) => async (payload: Uint8Array) =>\n Buffer.from(await crypto.subtle.sign(ES256, key, new Uint8Array(payload))).toString(\n \"base64url\",\n );\n\nfunction keysIn(secrets: SecretStore): HostKeys {\n const loaded = new Map<string, Promise<LoadedKey | undefined>>();\n const load = (appOrigin: string) => {\n let entry = loaded.get(appOrigin);\n if (!entry) {\n entry = (async () => {\n const secret = await secrets.read(appOrigin);\n if (secret === undefined) return undefined;\n const stored = JSON.parse(\n Buffer.from(secret, \"base64url\").toString(\"utf8\"),\n ) as StoredKey;\n const key = await crypto.subtle.importKey(\"jwk\", stored.jwk, EC_P256, false, [\n \"sign\",\n ]);\n return { key, kid: stored.kid, grantId: stored.grantId };\n })();\n entry.catch(() => loaded.delete(appOrigin));\n loaded.set(appOrigin, entry);\n }\n return entry;\n };\n return {\n async create(appOrigin) {\n const pair = await crypto.subtle.generateKey(EC_P256, true, [\"sign\", \"verify\"]);\n const exported = await crypto.subtle.exportKey(\"jwk\", pair.publicKey);\n const publicKey: JsonWebKey = {\n kty: exported.kty!,\n crv: exported.crv!,\n x: exported.x!,\n y: exported.y!,\n };\n const thumbprint = thumbprintOf(publicKey);\n return {\n publicKey,\n thumbprint,\n sign: signer(pair.privateKey),\n keep: async (grantId) => {\n const jwk = await crypto.subtle.exportKey(\"jwk\", pair.privateKey);\n const stored: StoredKey = { jwk, kid: thumbprint, grantId };\n await secrets.write(\n appOrigin,\n Buffer.from(JSON.stringify(stored)).toString(\"base64url\"),\n );\n loaded.delete(appOrigin);\n },\n };\n },\n async assert(appOrigin, request) {\n const key = await load(appOrigin);\n if (!key) throw new Error(`This computer holds no key for ${appOrigin}.`);\n return hostAssertion(signer(key.key), key, request);\n },\n async remove(appOrigin) {\n loaded.delete(appOrigin);\n await secrets.remove(appOrigin);\n },\n };\n}\n\nconst run = promisify(execFile);\nconst NOT_FOUND = 44;\n\nfunction macKeychain(service: string): SecretStore {\n const checked = (account: string) => {\n if (!ORIGIN.test(account)) throw new Error(`${account} is not an app origin.`);\n return account;\n };\n return {\n async read(account) {\n try {\n const { stdout } = await run(\"security\", [\n \"find-generic-password\",\n \"-s\",\n service,\n \"-a\",\n checked(account),\n \"-w\",\n ]);\n return stdout.trim();\n } catch (error) {\n if ((error as { code?: unknown }).code === NOT_FOUND) return undefined;\n throw error;\n }\n },\n async write(account, secret) {\n // Through `security -i` on stdin, so the private key never shows in a process list.\n const command = `add-generic-password -U -s ${service} -a ${checked(account)} -w ${secret}\\n`;\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"security\", [\"-i\"], { stdio: [\"pipe\", \"ignore\", \"pipe\"] });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk: Buffer) => (stderr += chunk.toString()));\n child.once(\"error\", reject);\n child.once(\"exit\", (code) =>\n code === 0 && stderr.trim() === \"\"\n ? resolve()\n : reject(new Error(`The Keychain refused the key: ${stderr.trim() || code}`)),\n );\n child.stdin.end(command);\n });\n if ((await this.read(account)) !== secret) {\n throw new Error(\"The Keychain did not keep the key.\");\n }\n },\n async remove(account) {\n try {\n await run(\"security\", [\n \"delete-generic-password\",\n \"-s\",\n service,\n \"-a\",\n checked(account),\n ]);\n } catch (error) {\n if ((error as { code?: unknown }).code !== NOT_FOUND) throw error;\n }\n },\n };\n}\n\n/** The macOS Keychain; other platforms are refused before pairing (`unsupportedHostPlatform`). */\nexport function keychainHostKeys(service: string): HostKeys {\n return keysIn(macKeychain(service));\n}\n\n/** For `parlor-host dev`: one dev host token for every request, nothing on disk. */\nexport function devHostKeys(hostToken: string): HostKeys {\n return {\n create: () => Promise.reject(new Error(\"A parlor dev server needs no pairing.\")),\n assert: async () => hostToken,\n remove: async () => undefined,\n };\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAeX,aAAa,EACb,cAAc,GAKf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,cAAc,EAGd,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EAId,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAoC,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,UAAU,EAEV,UAAU,EACV,SAAS,GAEV,MAAM,WAAW,CAAC;AACnB,OAAO,EAEL,WAAW,EACX,cAAc,EAId,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EAGd,aAAa,EAEb,YAAY,EACZ,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EAEd,eAAe,EAEf,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,IAAI,EACJ,kBAAkB,GAInB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,GAIlB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAsB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAEL,aAAa,EAEb,gBAAgB,GAEjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAuC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAiB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAeX,aAAa,EACb,cAAc,GAKf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,cAAc,EAGd,iBAAiB,EACjB,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EAId,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAoC,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,UAAU,EAEV,UAAU,EACV,SAAS,GAEV,MAAM,WAAW,CAAC;AACnB,OAAO,EAEL,WAAW,EACX,cAAc,EAId,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EAGd,aAAa,EAEb,YAAY,EACZ,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EAEd,eAAe,EAEf,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,IAAI,EACJ,kBAAkB,GAInB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,GAIlB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAsB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAEL,aAAa,EAEb,gBAAgB,GAEjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAuC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAiB,MAAM,WAAW,CAAC","sourcesContent":["export {\n type AcpAgentHandlers,\n type AcpStdio,\n acpLauncher,\n type AgentAsk,\n type AgentAskAnswer,\n type AgentCapabilities,\n type AgentConnection,\n type AgentExit,\n type AgentLauncher,\n type AgentModes,\n type AgentSession,\n type AgentUpdate,\n type AskEffect,\n type LaunchOptions,\n type McpToolRef,\n type OpenSessionInput,\n type PromptBlock,\n serveAcpAgent,\n SessionRefused,\n type StdioMcpServer,\n type StopReason,\n type ToolKind,\n type TurnHandlers,\n} from \"./acp.js\";\nexport {\n AGENT_PROFILES,\n type AgentLaunch,\n type AgentProfile,\n DETECT_TIMEOUT_MS,\n detectAgents,\n loadProfiles,\n} from \"./agents.js\";\nexport {\n connectControl,\n type ControlClient,\n type ControlFailure,\n type ControlOp,\n CONTROL_PROTOCOL,\n type ControlRequest,\n type ControlResponse,\n} from \"./control.js\";\nexport { createHostDaemon, type DaemonDeps, type HostDaemon } from \"./daemon.js\";\nexport {\n finishFold,\n type FoldStep,\n foldUpdate,\n startFold,\n type TurnFold,\n} from \"./fold.js\";\nexport {\n type AppGrant,\n devHostKeys,\n fileGrantStore,\n type GrantStore,\n type HostKeyPair,\n type HostKeys,\n keychainHostKeys,\n} from \"./grants.js\";\nexport {\n ACTIVE_POLL_MS,\n type AppLink,\n type AppLinkDeps,\n createAppLink,\n type HostApi,\n IDLE_POLL_MS,\n RECONNECT_MAX_MS,\n} from \"./link.js\";\nexport {\n createMcpProxy,\n type McpProxy,\n NO_TURN_MESSAGE,\n type ProxySession,\n runMcpProxyProcess,\n} from \"./mcp-proxy.js\";\nexport {\n pair,\n PAIRING_TIMEOUT_MS,\n type PairingChannel,\n type PairInput,\n type PairOutcome,\n} from \"./pairing.js\";\nexport { type HostPaths, hostPaths } from \"./paths.js\";\nexport {\n approvalFor,\n changePolicy,\n DEFAULT_POLICY,\n DEV_POLICY,\n isAppTool,\n loadPolicy,\n type RemotePolicy,\n} from \"./policy.js\";\nexport {\n createSessionPool,\n type LiveSession,\n type PooledGrant,\n type SessionPool,\n} from \"./pool.js\";\nexport { type LocalPrompter, macDialogPrompter, terminalPrompter } from \"./prompter.js\";\nexport {\n type AdoptOutcome,\n ensureService,\n type HostRelease,\n installLoginItem,\n type ServiceClient,\n} from \"./service.js\";\nexport { fileTrustStore, type TrustedDevice, type TrustStore } from \"./trust.js\";\nexport { PROMPT_MAX_AGE_MS, runTurn, type TurnDeps } from \"./turn.js\";\n"]}
|
package/dist/json-file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-file.js","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAOzC,MAAM,UAAU,QAAQ,CAAmB,IAAY;IACrD,IAAI,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,IAAgB,EAAE;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAO,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,IAAI;QACJ,MAAM,CAAC,IAAI;YACT,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACnC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,MAAM,YAAY,CAAC,GAAG,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE;oBAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,KAAK,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;oBAC5C,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChF,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC3B,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"json-file.js","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAOzC,MAAM,UAAU,QAAQ,CAAmB,IAAY;IACrD,IAAI,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,IAAgB,EAAE;QAClC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAO,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,IAAI;QACJ,MAAM,CAAC,IAAI;YACT,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACnC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7D,MAAM,YAAY,CAAC,GAAG,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE;oBAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,KAAK,CAAC,CAAC;oBACZ,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;oBAC5C,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChF,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC3B,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { withFileLock } from \"./lock.js\";\n\nexport interface JsonFile<T extends object> {\n read(): Promise<T>;\n change(edit: (value: T) => void): Promise<void>;\n}\n\nexport function jsonFile<T extends object>(file: string): JsonFile<T> {\n let writing: Promise<unknown> = Promise.resolve();\n const read = async (): Promise<T> => {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {} as T;\n throw error;\n }\n };\n return {\n read,\n change(edit) {\n const next = writing.then(async () => {\n await mkdir(dirname(file), { recursive: true, mode: 0o700 });\n await withFileLock(`${file}.lock`, async () => {\n const value = await read();\n edit(value);\n const staged = `${file}.${process.pid}.tmp`;\n await writeFile(staged, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n await chmod(staged, 0o600);\n await rename(staged, file);\n });\n });\n writing = next.catch(() => undefined);\n return next;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentInfo, AgentOption, AgentUsage } from "@parlor/chat";
|
|
2
|
+
export interface Learned {
|
|
3
|
+
readonly options?: readonly AgentOption[] | undefined;
|
|
4
|
+
readonly usage?: AgentUsage | undefined;
|
|
5
|
+
}
|
|
6
|
+
export type LearnedNews = {
|
|
7
|
+
readonly options: readonly AgentOption[];
|
|
8
|
+
} | {
|
|
9
|
+
readonly usage: AgentUsage;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* What each agent last said about itself, kept across restarts: the allowance only arrives
|
|
13
|
+
* on a turn, and a computer that forgot it would show nothing until the next one.
|
|
14
|
+
*/
|
|
15
|
+
export interface LearnedStore {
|
|
16
|
+
load(): Promise<void>;
|
|
17
|
+
/** Whether it changed what `describe` returns. */
|
|
18
|
+
learn(agentId: string, news: LearnedNews): Promise<boolean>;
|
|
19
|
+
/** `agents` with what each said about itself, minus usage windows that rolled over. */
|
|
20
|
+
describe(agents: readonly AgentInfo[], now: number): AgentInfo[];
|
|
21
|
+
}
|
|
22
|
+
export declare function learnedStore(file: string): LearnedStore;
|
|
23
|
+
//# sourceMappingURL=learned.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned.d.ts","sourceRoot":"","sources":["../src/learned.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAKvE,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,kDAAkD;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,uFAAuF;IACvF,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAClE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmCvD"}
|
package/dist/learned.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { mergeUsage } from "./agent-options.js";
|
|
2
|
+
import { jsonFile } from "./json-file.js";
|
|
3
|
+
export function learnedStore(file) {
|
|
4
|
+
const stored = jsonFile(file);
|
|
5
|
+
let known = {};
|
|
6
|
+
return {
|
|
7
|
+
load: async () => {
|
|
8
|
+
known = await stored.read().catch(() => ({}));
|
|
9
|
+
},
|
|
10
|
+
learn: async (agentId, news) => {
|
|
11
|
+
const held = known[agentId] ?? {};
|
|
12
|
+
const next = "options" in news
|
|
13
|
+
? { ...held, options: news.options }
|
|
14
|
+
: { ...held, usage: mergeUsage(held.usage, news.usage) };
|
|
15
|
+
if (JSON.stringify(next) === JSON.stringify(held))
|
|
16
|
+
return false;
|
|
17
|
+
known = { ...known, [agentId]: next };
|
|
18
|
+
await stored.change((all) => {
|
|
19
|
+
all[agentId] = next;
|
|
20
|
+
});
|
|
21
|
+
return true;
|
|
22
|
+
},
|
|
23
|
+
describe: (agents, now) => agents.map((agent) => {
|
|
24
|
+
const { options, usage } = known[agent.id] ?? {};
|
|
25
|
+
const windows = usage?.windows.filter((window) => window.resetsAt === undefined || window.resetsAt > now);
|
|
26
|
+
return {
|
|
27
|
+
...agent,
|
|
28
|
+
...(options && options.length > 0 ? { options } : {}),
|
|
29
|
+
...(usage && windows && windows.length > 0
|
|
30
|
+
? { usage: { ...usage, windows } }
|
|
31
|
+
: {}),
|
|
32
|
+
};
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=learned.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learned.js","sourceRoot":"","sources":["../src/learned.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAuB1C,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IACvD,IAAI,KAAK,GAA4B,EAAE,CAAC;IACxC,OAAO;QACL,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GACR,SAAS,IAAI,IAAI;gBACf,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;gBACpC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChE,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;YACtC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,CACnE,CAAC;YACF,OAAO;gBACL,GAAG,KAAK;gBACR,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,KAAK,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBACxC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE;oBAClC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentInfo, AgentOption, AgentUsage } from \"@parlor/chat\";\n\nimport { mergeUsage } from \"./agent-options.js\";\nimport { jsonFile } from \"./json-file.js\";\n\nexport interface Learned {\n readonly options?: readonly AgentOption[] | undefined;\n readonly usage?: AgentUsage | undefined;\n}\n\nexport type LearnedNews =\n | { readonly options: readonly AgentOption[] }\n | { readonly usage: AgentUsage };\n\n/**\n * What each agent last said about itself, kept across restarts: the allowance only arrives\n * on a turn, and a computer that forgot it would show nothing until the next one.\n */\nexport interface LearnedStore {\n load(): Promise<void>;\n /** Whether it changed what `describe` returns. */\n learn(agentId: string, news: LearnedNews): Promise<boolean>;\n /** `agents` with what each said about itself, minus usage windows that rolled over. */\n describe(agents: readonly AgentInfo[], now: number): AgentInfo[];\n}\n\nexport function learnedStore(file: string): LearnedStore {\n const stored = jsonFile<Record<string, Learned>>(file);\n let known: Record<string, Learned> = {};\n return {\n load: async () => {\n known = await stored.read().catch(() => ({}));\n },\n learn: async (agentId, news) => {\n const held = known[agentId] ?? {};\n const next: Learned =\n \"options\" in news\n ? { ...held, options: news.options }\n : { ...held, usage: mergeUsage(held.usage, news.usage) };\n if (JSON.stringify(next) === JSON.stringify(held)) return false;\n known = { ...known, [agentId]: next };\n await stored.change((all) => {\n all[agentId] = next;\n });\n return true;\n },\n describe: (agents, now) =>\n agents.map((agent) => {\n const { options, usage } = known[agent.id] ?? {};\n const windows = usage?.windows.filter(\n (window) => window.resetsAt === undefined || window.resetsAt > now,\n );\n return {\n ...agent,\n ...(options && options.length > 0 ? { options } : {}),\n ...(usage && windows && windows.length > 0\n ? { usage: { ...usage, windows } }\n : {}),\n };\n }),\n };\n}\n"]}
|
package/dist/lines.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../src/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAGhE,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,MAA8B;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../src/lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAGhE,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,MAA8B;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { createInterface, type Interface } from \"node:readline\";\nimport type { Readable } from \"node:stream\";\n\n/** Newline-delimited input; a broken stream ends it instead of throwing from readline. */\nexport function onLines(input: Readable, handle: (line: string) => void): Interface {\n const lines = createInterface({ input, crlfDelay: Infinity });\n lines.on(\"line\", handle);\n lines.on(\"error\", () => input.destroy());\n return lines;\n}\n"]}
|
package/dist/link-device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-device.js","sourceRoot":"","sources":["../src/link-device.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,GAElB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,CAAC,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAoB5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;IACpC,MAAM,aAAa,GAAG,cAAc,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC9D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAC;IACd,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,yBAAyB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,MAAM,EACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAAE,SAAS,CAC5B,CAAC;IACF,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,kIAAkI,CACnI,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAkB;QAC5B,QAAQ,EAAE,IAAI,CAAC,EAAE;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;QACrC,GAAG,EAAE,OAAO;KACb,CAAC;IACF,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"link-device.js","sourceRoot":"","sources":["../src/link-device.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,GAElB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,CAAC,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAoB5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;IACpC,MAAM,aAAa,GAAG,cAAc,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC9D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAE7C,CAAC;IACd,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,yBAAyB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,MAAM,EACN,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAAE,SAAS,CAC5B,CAAC;IACF,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,kIAAkI,CACnI,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAkB;QAC5B,QAAQ,EAAE,IAAI,CAAC,EAAE;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;QACrC,GAAG,EAAE,OAAO;KACb,CAAC;IACF,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC","sourcesContent":["import {\n deviceCommitment,\n linkCode,\n normalizeLinkCode,\n type PendingDevice,\n} from \"@parlor/auth\";\n\nimport type { AssertionRequest } from \"./assertion.js\";\nimport { printable } from \"./prompter.js\";\nimport type { TrustedDevice, TrustStore } from \"./trust.js\";\n\nexport const LINK_PATH = \"/_parlor/auth/hosts/devices/link\";\n\nexport interface LinkDeviceInput {\n readonly appOrigin: string;\n readonly code: string;\n readonly assert: (request: AssertionRequest) => Promise<string>;\n readonly trust: TrustStore;\n /** Asked on this computer once the code checked out; only true links. */\n readonly confirm: (device: {\n readonly name: string;\n readonly platform: string;\n }) => Promise<boolean>;\n readonly now?: (() => number) | undefined;\n readonly fetch?: typeof fetch | undefined;\n}\n\nexport type LinkOutcome =\n | { readonly linked: true; readonly device: TrustedDevice }\n | { readonly linked: false };\n\n/**\n * Links the device showing `code` from this computer: the app finds it, this computer checks\n * its keys hash to that code, so the app cannot slip in other keys, and the user confirms here.\n */\nexport async function linkDevice(input: LinkDeviceInput): Promise<LinkOutcome> {\n const origin = new URL(input.appOrigin).origin;\n const url = `${origin}${LINK_PATH}`;\n const authorization = `ParlorHost ${await input.assert({ method: \"POST\", url })}`;\n const response = await (input.fetch ?? fetch)(url, {\n method: \"POST\",\n headers: { authorization, \"content-type\": \"application/json\" },\n body: JSON.stringify({ code: input.code }),\n });\n const body = (await response.json().catch(() => undefined)) as\n | (PendingDevice & { readonly error?: { readonly message?: string } })\n | undefined;\n if (!response.ok || !body?.signingKey) {\n throw new Error(body?.error?.message ?? `The app answered HTTP ${response.status}.`);\n }\n const commitment = await deviceCommitment(\n origin,\n body.id,\n body.signingKey,\n body.presenceKey?.publicKey,\n );\n if (linkCode(commitment) !== normalizeLinkCode(input.code)) {\n throw new Error(\n \"The app returned a device whose keys do not match this code, so nothing was linked. Show a new code on the device and try again.\",\n );\n }\n const shown = { name: printable(body.name), platform: printable(body.platform) };\n if (!(await input.confirm(shown))) return { linked: false };\n const device: TrustedDevice = {\n deviceId: body.id,\n signingKey: body.signingKey,\n presenceKey: body.presenceKey,\n name: body.name,\n platform: body.platform,\n approvedAt: (input.now ?? Date.now)(),\n via: \"local\",\n };\n await input.trust.pin(origin, device);\n return { linked: true, device };\n}\n"]}
|
package/dist/link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CHAT_ACTIVITY_TAG,\n CHAT_TAG,\n HOST_PROTOCOL,\n type HostFrame,\n type HostStreamBatch,\n type HostWelcome,\n} from \"@parlor/chat\";\nimport { type ChatHostActionMap, MAX_STREAM_BODY_BYTES } from \"@parlor/chat/server\";\nimport {\n createActionClient,\n createPluginClient,\n type PluginClient,\n} from \"@parlor/client\";\nimport type { TurnId } from \"@parlor/core\";\nimport { createSyncClient, type SyncClient } from \"@parlor/sync/client\";\n\nimport type { AppGrant, HostKeys } from \"./grants.js\";\nimport { logEvent } from \"./log.js\";\nimport { revokeGrant } from \"./revoke.js\";\n\nexport const RECONNECT_MAX_MS = 4_000;\nexport const ACTIVE_POLL_MS = 2_000;\nexport const IDLE_POLL_MS = 15_000;\n\nconst USER_ACTIVE_WINDOW_MS = 2 * 60_000;\nconst REQUEST_TIMEOUT_MS = 10_000;\n\nexport interface HostApi {\n readonly calls: PluginClient<ChatHostActionMap>;\n /** At most one post in flight per turn; frames produced meanwhile coalesce into the next. */\n stream(batch: HostStreamBatch): void;\n heartbeat(): Promise<void>;\n}\n\nexport interface AppLinkDeps {\n readonly keys: HostKeys;\n readonly hostVersion: string;\n readonly hostName: string;\n readonly platform: string;\n readonly fetch: typeof fetch;\n /** A turn may be waiting: claim until not_found, then ask for running turns' signals. */\n readonly onWake: (link: AppLink) => void;\n /** Whether a turn runs on this link, which keeps a poll deployment's `/sync` at the active interval. */\n readonly busy?: (() => boolean) | undefined;\n /** Any 401, or the stream closed for revocation. */\n readonly onRevoked: (grant: AppGrant) => void;\n /** No shared protocol: shown locally (\"update Parlor Host\"); the link stays down. */\n readonly onIncompatible: (\n grant: AppGrant,\n welcome: Extract<HostWelcome, { readonly accepted: false }>,\n ) => void;\n}\n\n/**\n * `idle` until started; `serving` wakes the host for turns; `draining` stays up for the\n * turns it runs but wakes nobody (a newer service took over the claiming); `closed` is final.\n */\nexport type LinkMode = \"idle\" | \"serving\" | \"draining\" | \"closed\";\n\n/** The host's whole conversation with one app, each request carrying a fresh assertion. */\nexport interface AppLink {\n readonly grant: AppGrant;\n readonly api: HostApi;\n /** Set once `hostHello` was welcomed; every other call waits for it. */\n readonly protocol: number | undefined;\n readonly mode: LinkMode;\n start(): void;\n /** Stops waking the host and keeps everything else, so running turns finish on this link. */\n drain(): void;\n /** With `revoke`, a refused revoke throws and leaves the link running. */\n stop(options?: { readonly revoke?: boolean | undefined }): Promise<void>;\n}\n\ntype Accepted = Extract<HostWelcome, { readonly accepted: true }>;\n\nconst RETRY_BASE_MS = 250;\nconst MAX_BATCH_BYTES = (MAX_STREAM_BODY_BYTES * 3) / 4;\n\nclass LinkDown extends Error {\n override readonly name = \"LinkDown\";\n}\n\ninterface TurnStream {\n pending: HostFrame[];\n posting: Promise<void> | undefined;\n}\n\nfunction coalesce(frames: readonly HostFrame[]): HostFrame[] {\n const merged: HostFrame[] = [];\n for (const frame of frames) {\n const last = merged.at(-1);\n if (\n last?.type === \"delta\" &&\n frame.type === \"delta\" &&\n last.itemId === frame.itemId &&\n last.offset + last.text.length === frame.offset\n ) {\n merged[merged.length - 1] = { ...last, text: last.text + frame.text };\n } else {\n merged.push(frame);\n }\n }\n return merged;\n}\n\nfunction batches(frames: readonly HostFrame[]): HostFrame[][] {\n const out: HostFrame[][] = [];\n let current: HostFrame[] = [];\n let bytes = 0;\n for (const frame of frames) {\n const size = JSON.stringify(frame).length;\n if (current.length > 0 && bytes + size > MAX_BATCH_BYTES) {\n out.push(current);\n current = [];\n bytes = 0;\n }\n current.push(frame);\n bytes += size;\n }\n if (current.length > 0) out.push(current);\n return out;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nclass RequestTimeout extends Error {\n override readonly name = \"RequestTimeout\";\n constructor(ms: number) {\n super(`The app did not answer within ${ms} ms.`);\n }\n}\n\nfunction untilHeaders(inner: typeof fetch, ms: number): typeof fetch {\n return async (input, init) => {\n const own = new AbortController();\n const timer = setTimeout(() => own.abort(new RequestTimeout(ms)), ms);\n const signal = init?.signal ? AbortSignal.any([init.signal, own.signal]) : own.signal;\n try {\n return await inner(input, { ...init, signal });\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\nfunction adaptivePoll(advertised: boolean, busy: () => boolean) {\n let activeUntil = 0;\n const idle = () => advertised && !busy() && Date.now() >= activeUntil;\n return {\n pollEveryMs: () => (idle() ? IDLE_POLL_MS : ACTIVE_POLL_MS),\n touch: () => {\n const wasIdle = idle();\n activeUntil = Date.now() + USER_ACTIVE_WINDOW_MS;\n return wasIdle;\n },\n };\n}\n\nexport function createAppLink(grant: AppGrant, deps: AppLinkDeps): AppLink {\n const origin = grant.appOrigin.replace(/\\/+$/, \"\");\n let welcome: Accepted | undefined;\n let mode: LinkMode = \"idle\";\n const modeNow = (): LinkMode => mode;\n let revoked = false;\n let sync: SyncClient | undefined;\n let heartbeat: NodeJS.Timeout | undefined;\n const streams = new Map<TurnId, TurnStream>();\n\n let admit: () => void = () => undefined;\n let refuse: (error: Error) => void = () => undefined;\n const welcomed = new Promise<void>((resolve, reject) => {\n admit = resolve;\n refuse = reject;\n });\n welcomed.catch(() => undefined);\n\n const signedFetch: typeof fetch = async (input, init) => {\n if (mode === \"closed\") throw new LinkDown(\"This app's link is closed.\");\n const request = new Request(input, init);\n const method = request.method === \"GET\" ? \"GET\" : \"POST\";\n const assertion = await deps.keys.assert(origin, { method, url: request.url });\n const headers = new Headers(request.headers);\n headers.set(\"authorization\", `ParlorHost ${assertion}`);\n const response = await deps.fetch(new Request(request, { headers }));\n logEvent(\"http_request\", {\n method,\n path: new URL(request.url).pathname,\n status: response.status,\n });\n if (response.status === 401 && !revoked && modeNow() !== \"closed\") {\n revoked = true;\n queueMicrotask(() => deps.onRevoked(grant));\n }\n return response;\n };\n\n const timedFetch = untilHeaders(signedFetch, REQUEST_TIMEOUT_MS);\n\n const plugin = createPluginClient<ChatHostActionMap>(\n createActionClient({ baseUrl: origin, fetch: timedFetch }),\n \"chat\",\n );\n\n const drained = async (turnId: TurnId | undefined) => {\n if (turnId === undefined) return;\n while (true) {\n const posting = streams.get(turnId)?.posting;\n if (!posting) return;\n await posting;\n }\n };\n\n const invoke: PluginClient<ChatHostActionMap>[\"invoke\"] = async (\n name,\n input,\n options,\n ) => {\n if (name !== \"hostHello\") await welcomed;\n if (name === \"hostAppend\" || name === \"hostFinish\") {\n await drained((input as { readonly turnId?: TurnId }).turnId);\n }\n return plugin.invoke(name, input, options);\n };\n const calls: PluginClient<ChatHostActionMap> = {\n invoke,\n call: async (name, input, options) => (await invoke(name, input, options)).data,\n };\n\n const post = (path: string, body: unknown) =>\n timedFetch(`${origin}/_parlor/chat/${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n const flush = async (turnId: TurnId, stream: TurnStream) => {\n while (stream.pending.length > 0) {\n if (mode === \"closed\") break;\n const frames = coalesce(stream.pending);\n stream.pending = [];\n for (const chunk of batches(frames)) {\n await post(\"stream\", { turnId, frames: chunk }).catch(() => undefined);\n }\n }\n stream.posting = undefined;\n if (stream.pending.length === 0) streams.delete(turnId);\n };\n\n const api: HostApi = {\n calls,\n stream(batch) {\n if (mode === \"closed\" || batch.frames.length === 0) return;\n let stream = streams.get(batch.turnId);\n if (!stream) {\n stream = { pending: [], posting: undefined };\n streams.set(batch.turnId, stream);\n }\n stream.pending.push(...batch.frames);\n if (!stream.posting) stream.posting = flush(batch.turnId, stream);\n },\n async heartbeat() {\n await welcomed;\n await post(\"heartbeat\", {});\n },\n };\n\n const close = () => {\n mode = \"closed\";\n sync?.stop();\n sync = undefined;\n if (heartbeat) clearInterval(heartbeat);\n heartbeat = undefined;\n refuse(new LinkDown(\"This app's link is closed.\"));\n };\n\n const hello = async (): Promise<HostWelcome | undefined> => {\n for (let attempt = 0; ; attempt += 1) {\n if (mode !== \"serving\" && mode !== \"draining\") return undefined;\n try {\n return await plugin.call(\"hostHello\", {\n protocols: { min: 1, max: HOST_PROTOCOL },\n hostVersion: deps.hostVersion,\n name: deps.hostName,\n platform: deps.platform,\n agents: [],\n });\n } catch {\n if (revoked || modeNow() === \"closed\") return undefined;\n await sleep(Math.min(RETRY_BASE_MS * 2 ** attempt, RECONNECT_MAX_MS));\n }\n }\n };\n\n const link: AppLink = {\n grant,\n api,\n get protocol() {\n return welcome?.protocol;\n },\n get mode() {\n return mode;\n },\n start() {\n if (mode !== \"idle\") return;\n mode = \"serving\";\n void hello().then((answer) => {\n if (!answer || modeNow() === \"closed\") return;\n if (!answer.accepted) {\n close();\n logEvent(\"link_closed\", { appOrigin: origin, reason: \"incompatible\" });\n deps.onIncompatible(grant, answer);\n return;\n }\n welcome = answer;\n admit();\n const polling = adaptivePoll(\n answer.userActivity === true,\n () => deps.busy?.() ?? false,\n );\n sync = createSyncClient({\n request: (path, init) => signedFetch(`${origin}${path}`, init),\n coalesceMs: 0,\n reconnectMaxMs: RECONNECT_MAX_MS,\n pollEveryMs: polling.pollEveryMs,\n onEvents: (events) => {\n const heads = events.flatMap((event) => event.tags.map((tag) => tag[0]));\n if (heads.some((head) => head === CHAT_TAG || head === CHAT_ACTIVITY_TAG)) {\n if (polling.touch()) sync?.reconnectNow();\n }\n if (modeNow() === \"serving\" && heads.includes(CHAT_TAG)) deps.onWake(link);\n },\n onUnauthorized: () => undefined,\n onError: () => undefined,\n });\n sync.start();\n heartbeat = setInterval(\n () => void api.heartbeat().catch(() => undefined),\n answer.heartbeatMs,\n );\n heartbeat.unref();\n if (modeNow() === \"serving\") deps.onWake(link);\n });\n },\n drain() {\n if (mode === \"serving\") mode = \"draining\";\n },\n async stop(options = {}) {\n if (options.revoke && !grant.dev) {\n await revokeGrant({\n appOrigin: origin,\n appName: grant.appName,\n assert: (request) => deps.keys.assert(origin, request),\n fetch: deps.fetch,\n });\n }\n close();\n },\n };\n return link;\n}\n"]}
|
package/dist/lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { open, readFile, rename, rm, stat } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\n\nconst run = promisify(execFile);\n\nexport const LOCK_TOKEN_ENV = \"PARLOR_HOST_LOCK_TOKEN\";\nconst RETRY_MS = 20;\nconst UNWRITTEN_MS = 1_000;\nconst ACQUIRE_TIMEOUT_MS = 120_000;\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction alive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nasync function startedAt(pid: number): Promise<number | undefined> {\n try {\n const { stdout } = await run(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], {\n env: { ...process.env, LC_ALL: \"C\" },\n });\n const started = Date.parse(stdout.trim());\n return Number.isNaN(started) ? undefined : started;\n } catch {\n return undefined;\n }\n}\n\n/** `ps` reports whole seconds, rounded down, so a real owner never reads as started after its own lock. */\nasync function reusedPid(pid: number, lockedAt: number): Promise<boolean> {\n const started = await startedAt(pid);\n return started !== undefined && started > lockedAt;\n}\n\nasync function stale(path: string, verdicts: Map<string, boolean>): Promise<boolean> {\n try {\n const [text, { mtimeMs }] = await Promise.all([readFile(path, \"utf8\"), stat(path)]);\n const age = Date.now() - mtimeMs;\n const pid = Number.parseInt(text, 10);\n if (!Number.isInteger(pid)) return age > UNWRITTEN_MS;\n if (!alive(pid)) return true;\n const key = `${pid}:${mtimeMs}`;\n let reused = verdicts.get(key);\n if (reused === undefined) {\n reused = await reusedPid(pid, mtimeMs);\n verdicts.set(key, reused);\n }\n return reused;\n } catch {\n return false;\n }\n}\n\nasync function acquire(path: string, token: string): Promise<void> {\n const deadline = Date.now() + ACQUIRE_TIMEOUT_MS;\n const verdicts = new Map<string, boolean>();\n for (;;) {\n try {\n const file = await open(path, \"wx\", 0o600);\n await file.writeFile(`${process.pid}\\n${token}\\n`);\n await file.close();\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n if (await stale(path, verdicts)) {\n await rename(path, `${path}.stale.${process.pid}`).catch(() => undefined);\n await rm(`${path}.stale.${process.pid}`, { force: true });\n continue;\n }\n if (Date.now() > deadline) throw new Error(`Could not take the lock ${path}.`);\n await sleep(RETRY_MS);\n }\n}\n\nconst tokenOf = (text: string): string | undefined => text.split(\"\\n\")[1];\n\nexport async function holdsLock(path: string, token: string): Promise<boolean> {\n const text = await readFile(path, \"utf8\").catch(() => undefined);\n return text !== undefined && tokenOf(text) === token;\n}\n\n/** A lock is held until its owner dies or its pid is taken by a process that started after the lock was written. */\nexport async function withFileLock<T>(\n path: string,\n work: (token: string) => Promise<T>,\n): Promise<T> {\n const token = randomUUID();\n await acquire(path, token);\n try {\n return await work(token);\n } finally {\n if (await holdsLock(path, token)) await rm(path, { force: true });\n }\n}\n\n/** Runs `work` under the lock `inherited` names when this process's parent holds it, else under a lock of its own. */\nexport async function withInheritedLock<T>(\n path: string,\n inherited: string | undefined,\n work: () => Promise<T>,\n): Promise<T> {\n if (inherited && (await holdsLock(path, inherited))) return work();\n return withFileLock(path, work);\n}\n"]}
|
package/dist/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,IAAwB,CAAC;AAE7B,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAyC;IAC/E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC;QACH,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE;YAChF,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,IAAwB,CAAC;AAE7B,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAyC;IAC/E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC;QACH,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE;YAChF,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC","sourcesContent":["import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nlet file: string | undefined;\n\nexport function openHostLog(path: string): void {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n file = path;\n}\n\nexport function logEvent(event: string, fields: Readonly<Record<string, unknown>>): void {\n if (file === undefined) return;\n try {\n appendFileSync(file, `${JSON.stringify({ at: Date.now(), event, ...fields })}\\n`, {\n mode: 0o600,\n });\n } catch {}\n}\n"]}
|
package/dist/main.js
CHANGED
|
@@ -30,7 +30,7 @@ function fail(message) {
|
|
|
30
30
|
process.exitCode = 1;
|
|
31
31
|
}
|
|
32
32
|
async function host() {
|
|
33
|
-
const [{ acpLauncher }, { HOST_PROTOCOL }, { CONTROL_PROTOCOL, connectControl }, { createHostDaemon, HostAlreadyRunning }, { fileGrantStore, keychainHostKeys }, { LOCK_TOKEN_ENV }, { createMcpProxy }, { hostPaths }, { changePolicy, DEFAULT_POLICY, loadPolicy }, { createSessionPool }, { macDialogPrompter, terminalPrompter }, { revokeGrant }, { fileTrustStore }, { ensureService },] = await Promise.all([
|
|
33
|
+
const [{ acpLauncher }, { HOST_PROTOCOL }, { CONTROL_PROTOCOL, connectControl }, { createHostDaemon, HostAlreadyRunning }, { fileGrantStore, keychainHostKeys }, { LOCK_TOKEN_ENV }, { createMcpProxy }, { hostPaths }, { changePolicy, DEFAULT_POLICY, loadPolicy }, { createSessionPool }, { macDialogPrompter, terminalPrompter }, { revokeGrant }, { fileTrustStore }, { ensureService }, { unregisterAgentTools, agentNames }, { detectAgents, loadProfiles }, { agentEnvironment },] = await Promise.all([
|
|
34
34
|
import("./acp.js"),
|
|
35
35
|
import("@parlor/chat"),
|
|
36
36
|
import("./control.js"),
|
|
@@ -45,6 +45,9 @@ async function host() {
|
|
|
45
45
|
import("./revoke.js"),
|
|
46
46
|
import("./trust.js"),
|
|
47
47
|
import("./service.js"),
|
|
48
|
+
import("./agent-tools.js"),
|
|
49
|
+
import("./agents.js"),
|
|
50
|
+
import("./shell-path.js"),
|
|
48
51
|
]);
|
|
49
52
|
const release = {
|
|
50
53
|
version,
|
|
@@ -72,12 +75,25 @@ async function host() {
|
|
|
72
75
|
client.close();
|
|
73
76
|
if (!reply.ok)
|
|
74
77
|
throw new Error(reply.error);
|
|
75
|
-
return;
|
|
78
|
+
return reply.agentTools;
|
|
76
79
|
}
|
|
77
80
|
const grants = fileGrantStore(paths.grants);
|
|
78
81
|
const grant = await grants.get(origin);
|
|
79
82
|
if (!grant)
|
|
80
83
|
throw new Error(`This computer is not connected to ${origin}.`);
|
|
84
|
+
const tools = grant.agentTools;
|
|
85
|
+
let removed;
|
|
86
|
+
if (tools?.name && tools.agents?.length) {
|
|
87
|
+
const profiles = await loadProfiles(paths.agents);
|
|
88
|
+
const installed = await detectAgents(profiles);
|
|
89
|
+
const listed = { name: tools.name, agents: tools.agents };
|
|
90
|
+
await unregisterAgentTools({
|
|
91
|
+
profiles: profiles.filter((profile) => installed.some((a) => a.id === profile.id)),
|
|
92
|
+
hostCommand: join(paths.root, "bin", "parlor-host"),
|
|
93
|
+
env: agentEnvironment,
|
|
94
|
+
}, listed);
|
|
95
|
+
removed = { name: tools.name, agents: agentNames(profiles, listed) };
|
|
96
|
+
}
|
|
81
97
|
const keys = keychainHostKeys(KEYCHAIN_SERVICE);
|
|
82
98
|
await revokeGrant({
|
|
83
99
|
appOrigin: origin,
|
|
@@ -87,6 +103,7 @@ async function host() {
|
|
|
87
103
|
await grants.remove(origin);
|
|
88
104
|
await keys.remove(origin);
|
|
89
105
|
await fileTrustStore(paths.trust).forget(origin);
|
|
106
|
+
return removed;
|
|
90
107
|
};
|
|
91
108
|
return {
|
|
92
109
|
changePolicy,
|
|
@@ -242,6 +259,7 @@ const connect = defineCommand({
|
|
|
242
259
|
platform: platformName(),
|
|
243
260
|
keys: kit.keychainHostKeys(KEYCHAIN_SERVICE),
|
|
244
261
|
workspaceRoot: paths.workspaces,
|
|
262
|
+
offerAgentTools: true,
|
|
245
263
|
channel: {
|
|
246
264
|
kind: "browser",
|
|
247
265
|
open: async (url) => {
|
|
@@ -291,20 +309,74 @@ const connect = defineCommand({
|
|
|
291
309
|
fail(reply.error);
|
|
292
310
|
return;
|
|
293
311
|
}
|
|
294
|
-
|
|
312
|
+
const app = printable(grant.appName);
|
|
313
|
+
process.stdout.write(`Connected to ${app} as ${printable(grant.account.email ?? grant.account.name)}.\n${usage(app, reply.agentTools)}Not you? Run \`npx @parlor/agent-host disconnect ${origin}\`.\n`);
|
|
295
314
|
if (alreadyConnected) {
|
|
296
315
|
process.stdout.write("This computer was already connected. To use your agents from another browser or device, open the Agent sidebar there and link it.\n");
|
|
316
|
+
if (grant.agentTools === undefined) {
|
|
317
|
+
process.stdout.write(`To use ${app} from Claude Code and Codex here too, run \`npx @parlor/agent-host tools ${origin}\`.\n`);
|
|
318
|
+
}
|
|
297
319
|
}
|
|
298
320
|
},
|
|
299
321
|
});
|
|
322
|
+
/** The two ways to use the app from this computer, for the lines after "Connected". */
|
|
323
|
+
function usage(app, tools) {
|
|
324
|
+
const sidebar = ` - In ${app}'s agent sidebar.\n`;
|
|
325
|
+
if (!tools)
|
|
326
|
+
return `Use your agents in ${app}'s agent sidebar.\n`;
|
|
327
|
+
return `Use it two ways:\n${sidebar} - In ${tools.agents} on this computer: ask them to "use ${tools.name} to ...". They ask you before their first change in each conversation.\n`;
|
|
328
|
+
}
|
|
329
|
+
const tools = defineCommand({
|
|
330
|
+
meta: {
|
|
331
|
+
name: "tools",
|
|
332
|
+
description: "Let the coding agents on this computer use an app outside its sidebar, or stop them",
|
|
333
|
+
},
|
|
334
|
+
args: {
|
|
335
|
+
url: { type: "positional", required: true, description: "The app's URL" },
|
|
336
|
+
off: { type: "boolean", description: "Stop them; the sidebar keeps working" },
|
|
337
|
+
},
|
|
338
|
+
async run({ args }) {
|
|
339
|
+
const kit = await host();
|
|
340
|
+
const origin = new URL(args.url).origin;
|
|
341
|
+
const client = await kit.connectControl(kit.hostPaths().control);
|
|
342
|
+
if (!client) {
|
|
343
|
+
fail(`Parlor Host is not running. Run \`npx @parlor/agent-host connect ${origin}\` first.`);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const reply = await client.send({
|
|
347
|
+
op: "agent_tools",
|
|
348
|
+
appOrigin: origin,
|
|
349
|
+
on: !args.off,
|
|
350
|
+
});
|
|
351
|
+
client.close();
|
|
352
|
+
if (!reply.ok) {
|
|
353
|
+
fail(reply.error);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
process.stdout.write(args.off
|
|
357
|
+
? `The coding agents on this computer no longer use ${origin}. Its sidebar still works.\n`
|
|
358
|
+
: reply.agentTools
|
|
359
|
+
? `${reply.agentTools.agents} can use ${origin}: ask them to "use ${reply.agentTools.name} to ...".\n`
|
|
360
|
+
: "No coding agent here can take it: install Claude Code or Codex, then run this again.\n");
|
|
361
|
+
},
|
|
362
|
+
});
|
|
300
363
|
const disconnect = defineCommand({
|
|
301
364
|
meta: { name: "disconnect", description: "Disconnect this computer from a Parlor app" },
|
|
302
365
|
args: { url: { type: "positional", required: true, description: "The app's URL" } },
|
|
303
366
|
async run({ args }) {
|
|
304
367
|
const kit = await host();
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
368
|
+
const origin = new URL(args.url).origin;
|
|
369
|
+
let removed;
|
|
370
|
+
try {
|
|
371
|
+
removed = await kit.disconnectFrom(origin);
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
fail(errorText(error));
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
process.stdout.write(`Disconnected this computer from ${origin}: its sidebar can no longer reach your agents here.\n${removed
|
|
378
|
+
? `Removed ${removed.name} from ${removed.agents}, so they cannot change it either.\n`
|
|
379
|
+
: ""}`);
|
|
308
380
|
},
|
|
309
381
|
});
|
|
310
382
|
const status = defineCommand({
|
|
@@ -400,6 +472,10 @@ const config = defineCommand({
|
|
|
400
472
|
type: "string",
|
|
401
473
|
description: "Hours a linked device sends before it confirms with Face ID or Touch ID again, or off",
|
|
402
474
|
},
|
|
475
|
+
"agent-mode": {
|
|
476
|
+
type: "string",
|
|
477
|
+
description: "auto: the agent's own safety review decides and asks only for what it flags; ask: it asks before every action",
|
|
478
|
+
},
|
|
403
479
|
},
|
|
404
480
|
async run({ args }) {
|
|
405
481
|
const kit = await host();
|
|
@@ -422,6 +498,14 @@ const config = defineCommand({
|
|
|
422
498
|
}
|
|
423
499
|
change = { ...change, promptPresence: hours === "off" ? "off" : { maxAgeHours } };
|
|
424
500
|
}
|
|
501
|
+
const agentMode = args["agent-mode"];
|
|
502
|
+
if (agentMode !== undefined) {
|
|
503
|
+
if (agentMode !== "auto" && agentMode !== "ask") {
|
|
504
|
+
fail("--agent-mode takes auto or ask.");
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
change = { ...change, agentMode };
|
|
508
|
+
}
|
|
425
509
|
const current = Object.keys(change).length === 0
|
|
426
510
|
? await kit.loadPolicy(policy, kit.DEFAULT_POLICY)
|
|
427
511
|
: await kit.changePolicy(policy, kit.DEFAULT_POLICY, change);
|
|
@@ -494,9 +578,20 @@ function memoryGrants() {
|
|
|
494
578
|
}
|
|
495
579
|
const mcpProxy = defineCommand({
|
|
496
580
|
meta: { name: "mcp-proxy", description: "Internal: an agent's stdio MCP server" },
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
581
|
+
args: {
|
|
582
|
+
app: {
|
|
583
|
+
type: "string",
|
|
584
|
+
description: "Serve this app to a coding agent outside the sidebar",
|
|
585
|
+
},
|
|
586
|
+
},
|
|
587
|
+
async run({ args }) {
|
|
588
|
+
const [{ runMcpProxyProcess }, { hostPaths }] = await Promise.all([
|
|
589
|
+
import("./mcp-proxy.js"),
|
|
590
|
+
import("./paths.js"),
|
|
591
|
+
]);
|
|
592
|
+
await runMcpProxyProcess(process.env, args.app
|
|
593
|
+
? { appOrigin: new URL(args.app).origin, socketPath: hostPaths().proxy }
|
|
594
|
+
: undefined);
|
|
500
595
|
},
|
|
501
596
|
});
|
|
502
597
|
void runMain(defineCommand({
|
|
@@ -515,6 +610,7 @@ void runMain(defineCommand({
|
|
|
515
610
|
config,
|
|
516
611
|
dev,
|
|
517
612
|
"mcp-proxy": mcpProxy,
|
|
613
|
+
tools,
|
|
518
614
|
},
|
|
519
615
|
}));
|
|
520
616
|
//# sourceMappingURL=main.js.map
|