@ontologic/pillowfort-agent 1.1.2 → 1.1.4

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.
@@ -128,13 +128,13 @@ Anonymous requests to `/mcp` return 401 with OAuth discovery; this is not a manu
128
128
 
129
129
  ## Local MCP: keep the runtime under your control
130
130
 
131
- The local package is `@ontologic/pillowfort-agent` version `1.1.2`; source and MCP Registry ownership remain under GitHub `slee1996`. It connects directly to production without building or hosting the app. Use patched supported Node. [Release identity](https://about.pillowfort.xyz/agents/release.json) records the source tag and catalog digest; the deployed app exposes the same identity at `/agents-release.json`.
131
+ The local package is `@ontologic/pillowfort-agent` version `1.1.4`; source and MCP Registry ownership remain under GitHub `slee1996`. It connects directly to production without building or hosting the app. Use patched supported Node. [Release identity](https://about.pillowfort.xyz/agents/release.json) records the source tag and catalog digest; the deployed app exposes the same identity at `/agents-release.json`.
132
132
 
133
133
  ```sh
134
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent install-browser
135
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent doctor --url https://pillowfort.xyz
136
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent discover --url https://pillowfort.xyz
137
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent mcp --url https://pillowfort.xyz
134
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent install-browser
135
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent doctor --url https://pillowfort.xyz
136
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent discover --url https://pillowfort.xyz
137
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent mcp --url https://pillowfort.xyz
138
138
  ```
139
139
 
140
140
  Review downloaded code before running it. Browser installation is explicit; `doctor` creates no rooms. Keep the MCP process running while sessions are in use. Use `jsonl` instead of `mcp` for line-oriented requests, or `--headed` for visible browser windows. The local CLI's `--url` selects the app origin, not the hosted MCP URL. If your npm configuration redirects the `@ontologic` scope elsewhere, explicitly select npmjs.org for that scope rather than sending credentials to the wrong registry.
@@ -150,7 +150,7 @@ Local Codex configuration:
150
150
  ```toml
151
151
  [mcp_servers.pillowfort]
152
152
  command = "npm"
153
- args = ["exec", "--yes", "--package=@ontologic/pillowfort-agent@1.1.2", "--", "pillowfort-agent", "mcp", "--url", "https://pillowfort.xyz"]
153
+ args = ["exec", "--yes", "--package=@ontologic/pillowfort-agent@1.1.4", "--", "pillowfort-agent", "mcp", "--url", "https://pillowfort.xyz"]
154
154
  startup_timeout_sec = 120
155
155
  tool_timeout_sec = 60
156
156
  ```
@@ -160,7 +160,7 @@ Local VS Code uses `type: "stdio"`, `command: "npm"`, and the same argument arra
160
160
  A bounded, real two-agent demonstration is available:
161
161
 
162
162
  ```sh
163
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent autonomous --url https://pillowfort.xyz
163
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent autonomous --url https://pillowfort.xyz
164
164
  ```
165
165
 
166
166
  Running it authorizes one room, a private invitation between its isolated host/guest, exact fingerprint approval, two encrypted messages, and room teardown. It prints safe step outcomes, not invitations or transcripts. It does not send invitations to external recipients.
@@ -58,6 +58,24 @@ These versions reject the compromised October 2026 eMudhra/emSign TLS chains,
58
58
  including cross-signed chains. Update the runtime binaries as well as OS/browser
59
59
  trust stores; never disable certificate verification to work around a failure.
60
60
 
61
+ Release 1.1.4 pins Playwright 1.65.0 with Chromium 158.0.8127.18. Upgrade the
62
+ package and explicitly rerun `install-browser`; an older cached browser is not
63
+ patched by updating npm metadata alone. This replaces the browser affected by
64
+ the known-exploited V8 CVEs CVE-2026-11645, CVE-2026-85046, and CVE-2026-87491.
65
+ The Node/Bun minimums above also include the Brotli fix for CVE-2026-111497.
66
+ The CLI and direct SDK constructor enforce the same Node release policy before
67
+ browser startup or an app connection. Runtime package managers and unrelated
68
+ scripts are outside that guard: upgrade the actual Node and Bun executables.
69
+
70
+ The MLS adapter supports only ciphersuite 1
71
+ (X25519/AES-128-GCM/SHA-256/Ed25519). Its pinned providers exclude unused
72
+ Weierstrass-curve backends and their affected `crypto-bigint` dependency
73
+ ([RUSTSEC-2026-0387](https://rustsec.org/advisories/RUSTSEC-2026-0387.html)).
74
+ Other ciphersuites, signature schemes, and HPKE configurations fail closed;
75
+ there is no fallback to a different algorithm. The rebuilt WASM retains the
76
+ existing room wire and snapshot formats. Maintained timer dependencies replace
77
+ `instant` and `pin-utils`; neither maintenance notice was a confirmed exploit.
78
+
61
79
  Each room session is an isolated ephemeral browser context with its own device identity and MLS state. Session storage is not a durable account. `session_close`, process EOF, or process termination destroys local contexts and their keys. The transport does not export raw MLS keys or persist browser session state for room continuity. The caller, MCP host, and model provider may separately retain tool calls/results; protect those systems and minimize secret exposure.
62
80
 
63
81
  The optional CMS context is separate and uses normal authenticated permissions. Room hosting does not require CMS login, CMS storage state, a Pillowfort account, or automated checkout. Do not grant CMS tools or share CMS storage-state files for a room-only task.
@@ -9,7 +9,7 @@ An agent may host its own room and invite people or other agents under the calle
9
9
  Use local or hosted MCP tools with the same session/input envelope. Authenticate the hosted endpoint as described in the [setup guide](https://about.pillowfort.xyz/agents/index.md). For the local JSON-lines interface, keep this process running:
10
10
 
11
11
  ```sh
12
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent jsonl --url https://pillowfort.xyz
12
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent jsonl --url https://pillowfort.xyz
13
13
  ```
14
14
 
15
15
  The examples below are JSON-lines requests. In MCP, invoke the value of `tool` with the object in `arguments`; omit the JSON-lines envelope and `id`. Replace capitalized placeholders with values obtained at the stated step. They are not real room IDs or credentials. **Do not pipe all examples blindly:** creation, membership, and delivery are asynchronous, and later steps require fresh observations.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ontologic/pillowfort-agent",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "Local browser-backed Pillowfort agent SDK, JSON-lines CLI, and stdio MCP server for ephemeral encrypted rooms.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,6 +30,7 @@
30
30
  "files": [
31
31
  "scripts/agent.mjs",
32
32
  "scripts/agent-sdk.mjs",
33
+ "scripts/agent-runtime.mjs",
33
34
  "scripts/agent-browser.mjs",
34
35
  "scripts/agent-common.mjs",
35
36
  "scripts/agent-tools.mjs",
@@ -43,7 +44,7 @@
43
44
  ],
44
45
  "dependencies": {
45
46
  "@modelcontextprotocol/sdk": "1.32.2",
46
- "playwright": "1.59.1"
47
+ "playwright": "1.65.0"
47
48
  },
48
49
  "publishConfig": {
49
50
  "access": "public",
@@ -9,9 +9,9 @@ import { AGENT_INSTRUCTIONS, AGENT_RESOURCES, listAgentPrompts, readAgentResourc
9
9
  /** Dynamic JSON Schema catalogs require the SDK's lower-level Server API. */
10
10
  export function createAgentMcpServer({
11
11
  agent, tools = [], instructions = AGENT_INSTRUCTIONS, resources = AGENT_RESOURCES,
12
- resourceLoader = readAgentResource, roomTools, includeCMS = true, maxActiveCalls = 64, jsonSchemaValidator, onToolError,
12
+ resourceLoader = readAgentResource, roomTools, includeCMS = true, maxActiveCalls = 64, jsonSchemaValidator, onToolError, observeToolCall,
13
13
  }) {
14
- const server = new Server({ name: 'pillowfort', version: '1.1.2' }, {
14
+ const server = new Server({ name: 'pillowfort', version: '1.1.4' }, {
15
15
  capabilities: { tools: {}, resources: {}, prompts: {} },
16
16
  instructions,
17
17
  jsonSchemaValidator,
@@ -35,17 +35,20 @@ export function createAgentMcpServer({
35
35
  }
36
36
  });
37
37
  server.setRequestHandler(CallToolRequestSchema, async request => {
38
- if (activeCalls >= maxActiveCalls) return toolResult(errorResult(new AgentError('BUSY', 'Too many pending tool calls. Wait for existing calls to finish.', true)));
39
- activeCalls++;
40
- try {
41
- let tool;
42
- try { tool = (await registry()).get(request.params.name); }
43
- catch (error) { return toolResult(errorResult(error)); }
44
- if (!tool) throw new McpError(ErrorCode.InvalidParams, 'Unknown tool. Call tools/list to discover available tools.');
45
- const result = await tool.invoke(request.params.arguments ?? {});
46
- if (result.ok === false) onToolError?.(result.error);
47
- return toolResult(result);
48
- } finally { activeCalls--; }
38
+ const invoke = async () => {
39
+ if (activeCalls >= maxActiveCalls) return errorResult(new AgentError('BUSY', 'Too many pending tool calls. Wait for existing calls to finish.', true));
40
+ activeCalls++;
41
+ try {
42
+ let tool;
43
+ try { tool = (await registry()).get(request.params.name); }
44
+ catch (error) { return errorResult(error); }
45
+ if (!tool) throw new McpError(ErrorCode.InvalidParams, 'Unknown tool. Call tools/list to discover available tools.');
46
+ const result = await tool.invoke(request.params.arguments ?? {});
47
+ if (result.ok === false) onToolError?.(result.error);
48
+ return result;
49
+ } finally { activeCalls--; }
50
+ };
51
+ return toolResult(await (observeToolCall ? observeToolCall(request.params.name, invoke) : invoke()));
49
52
  });
50
53
  return server;
51
54
  }
@@ -0,0 +1,14 @@
1
+ import { AgentError } from './agent-common.mjs';
2
+
3
+ /** Enforce the patched Node release policy before local browser use. */
4
+ export function checkRuntime() {
5
+ const [major, minor, patch] = process.versions.node.split('.').map(Number);
6
+ const supported = (major === 22 && (minor > 23 || (minor === 23 && patch >= 4)))
7
+ || (major === 24 && (minor > 22 || (minor === 22 && patch >= 1)))
8
+ || (major === 26 && (minor > 12 || (minor === 12 && patch >= 1)))
9
+ || major > 26;
10
+ if (!supported) {
11
+ throw new AgentError('UNSUPPORTED_RUNTIME', 'Pillowfort agent requires patched Node 22.23.4+, 24.22.1+, or 26.12.1+ on a supported release line. Upgrade Node before installing Chromium or connecting to an app.');
12
+ }
13
+ return { node: process.version, minimum: '^22.23.4 || ^24.22.1 || >=26.12.1', platform: process.platform, arch: process.arch };
14
+ }
@@ -1,6 +1,7 @@
1
1
  import { chromium } from 'playwright';
2
2
  import { PillowfortBrowserAgent } from './agent-browser.mjs';
3
3
  import { AgentError } from './agent-common.mjs';
4
+ import { checkRuntime } from './agent-runtime.mjs';
4
5
 
5
6
  export { AgentError, errorResult, boundedJSON, validateBaseURL, MAX_INPUT_BYTES, MAX_OUTPUT_BYTES, MAX_WAIT_MS } from './agent-common.mjs';
6
7
 
@@ -8,6 +9,7 @@ export { AgentError, errorResult, boundedJSON, validateBaseURL, MAX_INPUT_BYTES,
8
9
  export class PillowfortAgent extends PillowfortBrowserAgent {
9
10
  /** @param {Omit<import('./agent-browser.mjs').BrowserAgentOptions, 'launchBrowser'> & {headed?: boolean}} options */
10
11
  constructor({ headed = false, ...options } = {}) {
12
+ checkRuntime();
11
13
  super({
12
14
  ...options,
13
15
  launchBrowser: async ({ timeout }) => {
package/scripts/agent.mjs CHANGED
@@ -5,6 +5,7 @@ import { realpathSync } from 'node:fs';
5
5
  import { createRequire } from 'node:module';
6
6
  import path from 'node:path';
7
7
  import { PillowfortAgent, AgentError, errorResult, boundedJSON, MAX_INPUT_BYTES, MAX_OUTPUT_BYTES } from './agent-sdk.mjs';
8
+ import { checkRuntime } from './agent-runtime.mjs';
8
9
  import { createAgentToolRegistry } from './agent-tools.mjs';
9
10
  import { runAgentMcp } from './agent-mcp.mjs';
10
11
 
@@ -12,7 +13,7 @@ const HELP = `Pillowfort agent CLI — real ephemeral encrypted browser sessions
12
13
 
13
14
  This local CLI requires Node 22.23.4+, 24.22.1+, or 26.12.1+ on a supported release line, and Chromium. Hosted MCP and native WebMCP are separate connection choices: https://about.pillowfort.xyz/agents
14
15
  Version-pinned npm package:
15
- npm exec --yes --package=@ontologic/pillowfort-agent@1.1.2 -- pillowfort-agent --help
16
+ npm exec --yes --package=@ontologic/pillowfort-agent@1.1.4 -- pillowfort-agent --help
16
17
 
17
18
  Commands with the installed executable:
18
19
  pillowfort-agent install-browser
@@ -166,18 +167,6 @@ function diagnostic(error) {
166
167
  process.stderr.write(`${failure.code}: ${failure.message}\n`);
167
168
  }
168
169
 
169
- function checkRuntime() {
170
- const [major, minor, patch] = process.versions.node.split('.').map(Number);
171
- const supported = (major === 22 && (minor > 23 || (minor === 23 && patch >= 4)))
172
- || (major === 24 && (minor > 22 || (minor === 22 && patch >= 1)))
173
- || (major === 26 && (minor > 12 || (minor === 12 && patch >= 1)))
174
- || major > 26;
175
- if (!supported) {
176
- throw new AgentError('UNSUPPORTED_RUNTIME', 'Pillowfort agent requires patched Node 22.23.4+, 24.22.1+, or 26.12.1+ on a supported release line. Upgrade Node before installing Chromium or connecting to an app.');
177
- }
178
- return { node: process.version, minimum: '^22.23.4 || ^24.22.1 || >=26.12.1', platform: process.platform, arch: process.arch };
179
- }
180
-
181
170
  function playwrightInstallation() {
182
171
  const require = createRequire(import.meta.url);
183
172
  return {