@a2a-exposed/control-core 0.8.17 → 0.8.19

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/README.md CHANGED
@@ -10,7 +10,9 @@ Agents that can call out over HTTP and cannot run a public server: hosted assist
10
10
 
11
11
  ## Quick start
12
12
 
13
- Requires Node 22.18+. The skills are installed into the project the agent works in. They do not install the CLI. Every command runs through npx.
13
+ Claude Code cloud sessions use the [hosted connector](docs/mcp.md#hosted-connector), with no skill install or CLI. Skip project installs in shared cloud checkouts; optional skills use `npx -y skills add telegraphic-dev/a2a-exposed -g`.
14
+
15
+ Self-hosting requires Node 22.18+. The skills are installed into the project the agent works in. They do not install the CLI. Every command runs through npx.
14
16
 
15
17
  1. **Add the skills to the project**
16
18
 
@@ -35,11 +37,11 @@ Requires Node 22.18+. The skills are installed into the project the agent works
35
37
 
36
38
  `status` is read-only and prints the next step. Open the one-time link (15 minutes by default, `--ttl` from 1 to 60) and choose the approval password yourself. Another agent then runs `npx -y a2a-exposed@latest connect https://agent.example.com` (the code lasts 60 minutes). You approve that request on the `/device` page, or with `npx -y a2a-exposed@latest pair approve <code>`. Removing the A2A endpoint later is `npx -y a2a-exposed@latest uninstall` ([Self-hosting](docs/self-hosting.md#remove-an-inbox)).
37
39
 
38
- After the skill is in the project, you can ask the agent to set this up. It follows the setup skill. Do not run setup from a Claude Code cloud session: that environment cannot install, tunnel, or reach your Worker. Claude Code: `/plugin marketplace add telegraphic-dev/a2a-exposed`, then `/plugin install a2a-exposed@a2a-exposed`. [Getting started](docs/getting-started.md) has Node, the client table, and what to do if setup stops halfway.
40
+ After the skill is in the project, you can ask the agent to set this up. It follows the setup skill. Claude Code cloud sessions follow the [hosted checklist](docs/mcp.md#hosted-connector); self-hosted deployment runs on a machine you control. Claude Code: `/plugin marketplace add telegraphic-dev/a2a-exposed`, then `/plugin install a2a-exposed@a2a-exposed`. [Getting started](docs/getting-started.md) has Node, the client table, and what to do if setup stops halfway.
39
41
 
40
42
  ## Hosted
41
43
 
42
- [a2a.exposed](https://a2a.exposed) hosts the A2A endpoint and is open to everyone. Pricing is at [a2a.exposed/pricing](https://a2a.exposed/pricing). When the CLI cannot run, connect https://a2a.exposed/mcp. Sign-in is the owner identity. The owner token stays on the A2A endpoint. Claude and Codex are untested on this address. When to use the hosted endpoint, and the connect commands, are in [Getting started](docs/getting-started.md#hosted-inbox).
44
+ [a2a.exposed](https://a2a.exposed) hosts the A2A endpoint and is open to everyone. Pricing is at [a2a.exposed/pricing](https://a2a.exposed/pricing). When the CLI cannot run, connect https://a2a.exposed/mcp. Sign-in is the owner identity. The owner token stays on the A2A endpoint. Claude Code cloud sessions with the hosted connector and a routine wake are tested end to end. Other Claude clients and Codex are untested on this address. When to use the hosted endpoint, and the connect commands, are in [Getting started](docs/getting-started.md#hosted-inbox).
43
45
 
44
46
  ## Docs
45
47
 
package/dist/index.js CHANGED
@@ -498,14 +498,16 @@ async function listTenants(db, accountId, domain) {
498
498
  }
499
499
 
500
500
  // src/tenants/wake.ts
501
- var WAKE_PRESETS = ["grok-bot", "claude-code", "openclaw-wake", "openclaw-agent", "hermes", "generic"];
501
+ var WAKE_PRESETS = ["grok-bot", "claude-code", "openclaw-wake", "openclaw-agent", "hermes", "openbot", "generic"];
502
502
  var PLAIN_HEADERS = /* @__PURE__ */ new Set([
503
503
  "content-type",
504
504
  "user-agent",
505
505
  "x-request-id",
506
506
  "idempotency-key",
507
507
  "anthropic-version",
508
- "x-webhook-timestamp"
508
+ "x-webhook-timestamp",
509
+ "x-openbot-timestamp",
510
+ "x-openbot-delivery-id"
509
511
  ]);
510
512
  var HEADER_NAME = /^[A-Za-z0-9-]{1,64}$/;
511
513
  function configFields(text) {
@@ -3016,6 +3018,9 @@ var conversation_peer_default = "-- A wake is one peer's conversation. Two peers
3016
3018
  // sql-raw:/home/runner/work/a2a-exposed/a2a-exposed/worker/migrations/0011_conversation_owner.sql
3017
3019
  var conversation_owner_default = "-- One owner per context id. The first peer to insert the row keeps it (ON CONFLICT DO NOTHING).\nCREATE TABLE conversation_owners (\n context_id TEXT NOT NULL PRIMARY KEY,\n peer TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\nINSERT INTO conversation_owners (context_id, peer, created_at)\nSELECT t.context_id, t.peer, t.created_at\nFROM tasks t\nWHERE t.peer IS NOT NULL AND t.peer != ''\n AND NOT EXISTS (\n SELECT 1 FROM tasks t2\n WHERE t2.context_id = t.context_id AND t2.peer IS NOT NULL AND t2.peer != ''\n AND (t2.created_at < t.created_at OR (t2.created_at = t.created_at AND t2.id < t.id))\n );\nINSERT INTO conversation_owners (context_id, peer, created_at)\nSELECT h.context_id, h.peer, h.ts\nFROM history h\nWHERE h.peer IS NOT NULL AND h.peer != ''\n AND NOT EXISTS (SELECT 1 FROM conversation_owners o WHERE o.context_id = h.context_id)\n AND NOT EXISTS (\n SELECT 1 FROM history h2\n WHERE h2.context_id = h.context_id AND h2.peer IS NOT NULL AND h2.peer != '' AND h2.seq < h.seq\n );\nINSERT INTO conversation_owners (context_id, peer, created_at)\nSELECT o.context_id, o.peer, o.sent_at\nFROM outbound o\nWHERE o.peer IS NOT NULL AND o.peer != ''\n AND NOT EXISTS (SELECT 1 FROM conversation_owners c WHERE c.context_id = o.context_id)\n AND NOT EXISTS (\n SELECT 1 FROM outbound o2\n WHERE o2.context_id = o.context_id AND o2.peer IS NOT NULL AND o2.peer != ''\n AND (o2.sent_at < o.sent_at OR (o2.sent_at = o.sent_at AND o2.task_id < o.task_id))\n );\n";
3018
3020
 
3021
+ // sql-raw:/home/runner/work/a2a-exposed/a2a-exposed/worker/migrations/0012_conversation_peer_owner.sql
3022
+ var conversation_peer_owner_default = "-- One row per peer. The same context id can be a separate conversation for each peer.\n-- 0011's single-column primary key made a second peer's insert fail, which is how a caller\n-- could tell a fresh id from one another peer already held.\nCREATE TABLE conversation_owners_peer (\n context_id TEXT NOT NULL,\n peer TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (context_id, peer)\n);\nINSERT INTO conversation_owners_peer (context_id, peer, created_at)\nSELECT context_id, peer, created_at FROM conversation_owners;\nDROP TABLE conversation_owners;\nALTER TABLE conversation_owners_peer RENAME TO conversation_owners;\n";
3023
+
3019
3024
  // src/provision/inbox-migrations.ts
3020
3025
  var INBOX_MIGRATIONS = [
3021
3026
  { name: "0001_init.sql", sql: init_default },
@@ -3028,7 +3033,8 @@ var INBOX_MIGRATIONS = [
3028
3033
  { name: "0008_oidc_txns.sql", sql: oidc_txns_default },
3029
3034
  { name: "0009_outbound_seen.sql", sql: outbound_seen_default },
3030
3035
  { name: "0010_conversation_peer.sql", sql: conversation_peer_default },
3031
- { name: "0011_conversation_owner.sql", sql: conversation_owner_default }
3036
+ { name: "0011_conversation_owner.sql", sql: conversation_owner_default },
3037
+ { name: "0012_conversation_peer_owner.sql", sql: conversation_peer_owner_default }
3032
3038
  ];
3033
3039
 
3034
3040
  // sql-raw:/home/runner/work/a2a-exposed/a2a-exposed/control/migrations/0001_auth.sql
@@ -1,7 +1,7 @@
1
1
  import type { Sql } from "../core/sql.js";
2
2
  import { type DataPlane } from "./push.js";
3
3
  /** The same list the Worker renders. Claude Code is one of them. */
4
- export declare const WAKE_PRESETS: readonly ["grok-bot", "claude-code", "openclaw-wake", "openclaw-agent", "hermes", "generic"];
4
+ export declare const WAKE_PRESETS: readonly ["grok-bot", "claude-code", "openclaw-wake", "openclaw-agent", "hermes", "openbot", "generic"];
5
5
  export interface WakeSettings {
6
6
  url: string;
7
7
  preset: string;
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@a2a-exposed/control-core",
3
- "version": "0.8.17",
3
+ "version": "0.8.19",
4
4
  "description": "A2A endpoint provisioning, routing, and D1 migrations for a2a-exposed.",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "lint": "node scripts/check-repo.mjs lint",
8
8
  "format:check": "node scripts/check-repo.mjs format",
9
- "test:checks": "node --test scripts/check-repo.test.mjs",
9
+ "test:checks": "node --test scripts/*.test.mjs",
10
+ "version:set": "node scripts/set-version.mjs",
10
11
  "prepare": "node control/scripts/build-core.mjs",
11
12
  "prepack": "node control/scripts/build-core.mjs"
12
13
  },