@anynotate/protocol 0.4.0 → 0.6.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/PROTOCOL.md CHANGED
@@ -4,7 +4,7 @@ The bridge is an HTTP server on `127.0.0.1`, port `47291` by default (`ANYNOTATE
4
4
 
5
5
  ## Handshake
6
6
 
7
- `POST /health` (or `GET`) → `{ "ok": true, "bridgeVersion": "0.5.1", "protocol": { "version": 2, "min": 1 } }`.
7
+ `POST /health` (or `GET`) → `{ "ok": true, "bridgeVersion": "0.6.1", "protocol": { "version": 2, "min": 1 } }`.
8
8
 
9
9
  A client supports a range of protocol versions (the extension: `min 2, max 2`) and calls `compatibility(clientRange, response.protocol)`:
10
10
 
@@ -40,7 +40,7 @@ The allow-list is the valid `chrome-extension://` entries from `$ANYNOTATE_HOME/
40
40
  | Method and path | Body | Response |
41
41
  |---|---|---|
42
42
  | `GET` / `POST /health` | — | `HealthResponse` |
43
- | `GET` / `POST /sessions` | — | `Session[]`: live push sessions, herdr panes (`method: "herdr"`), then sessions seen by the prompt hook outside herdr (`method: "next-prompt"`) |
43
+ | `GET` / `POST /sessions` | — | `Session[]`: live push sessions, herdr panes (`method: "herdr"`), then sessions seen by the prompt hook outside herdr (`method: "next-prompt"`, with the agent's own conversation title when the bridge can read it) |
44
44
  | `POST /bundles` | `multipart/form-data`: field `bundle` = JSON `BundleInput`; files `page.md`, `screenshot.png`, optional `snapshot.html`, `crops/A<n>.png` | `201 SendResponse` (`{ id, status }`); `400 ErrorResponse` for an invalid bundle or file name |
45
45
  | `POST /bundles/<id>/status`, `GET /bundles/<id>` | — | `BundleStatusResponse` (`{ bundle, status }`; `status` is `null` if the status file is missing or unreadable); `404` if unknown |
46
46
  | `POST /bundles/<id>/ack` | `AckRequest` (`{ "summary"?: string }`) | `OkResponse`; `404` if unknown or busy |
@@ -111,8 +111,10 @@ Each entry is a CSS selector for an `<iframe>`, outermost first, resolved in the
111
111
  - **v1** — handshake, token-only access, native-host token delivery.
112
112
  - **v2** — intents `explain`, `change`, `approve` (legacy `question`, `bug`, `note` still accepted). `PROTOCOL_MIN` stays `1`: a v2 bridge accepts v1 clients.
113
113
  - Optional `region` on element annotations (additive, `@anynotate/protocol` 0.4.0, bridge 0.5.1).
114
- - Optional `offscreen: true` on any annotation whose target was not on screen at send time (`box` and crop are from when it was last seen); `README.md` adds `(off-screen when sent)` to its heading (additive, same releases).
114
+ - Optional `offscreen: true` on any annotation whose target was not on the page at send time (`box` and crop are from when the note was made); `README.md` puts "Not on the page when sent — crop is from when the note was made." under its heading (without the crop clause when no crop was sent; additive, same releases; wording since bridge 0.6.1).
115
115
  - Optional `anchor.frames` on notes made inside same-origin iframes; `README.md` names the frames after the selector (additive, same releases).
116
+ - Optional `workspace` on `Session`: the display name of the herdr workspace holding a herdr pane (additive, `@anynotate/protocol` 0.5.0, bridge 0.6.1).
117
+ - Optional `published` on `Session`: claude.ai artifacts the session published, with the time of its first publish (additive, `@anynotate/protocol` 0.6.0, bridge 0.6.7).
116
118
 
117
119
  ## Threat model
118
120
 
@@ -25,6 +25,11 @@ export declare const responseSchemas: {
25
25
  }>;
26
26
  pane: z.ZodOptional<z.ZodString>;
27
27
  sessionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ workspace: z.ZodOptional<z.ZodString>;
29
+ published: z.ZodOptional<z.ZodArray<z.ZodObject<{
30
+ id: z.ZodString;
31
+ at: z.ZodString;
32
+ }, z.core.$strip>>>;
28
33
  }, z.core.$strip>>;
29
34
  SendResponse: z.ZodObject<{
30
35
  id: z.ZodString;
package/dist/fixtures.js CHANGED
@@ -33,13 +33,13 @@ export const examplePage = "# Tomato soup\n\nstir in ⟦A1⟧200 ml cream before
33
33
  export const responseSchemas = {
34
34
  HealthResponse, SessionsResponse, SendResponse, BundleStatusResponse, OkResponse, ErrorResponse,
35
35
  };
36
- const health = { ok: true, bridgeVersion: "0.5.1", protocol: { version: 2, min: 1 } };
36
+ const health = { ok: true, bridgeVersion: "0.6.1", protocol: { version: 2, min: 1 } };
37
37
  const queued = { state: "queued", at: "2026-09-24T15:32:01.000Z" };
38
38
  const exampleBundle = { ...exampleBundleInput, id: EXAMPLE_BUNDLE_ID, files: { page: "page.md", screenshot: "screenshot.png" } };
39
39
  export const conformance = [
40
40
  { name: "health-extension", request: { method: "POST", path: "/health", auth: "extension" }, status: 200, response: { schema: "HealthResponse", example: health } },
41
41
  { name: "health-probe", request: { method: "GET", path: "/health", auth: "none" }, status: 200, response: { schema: "HealthResponse", example: health } },
42
- { name: "sessions-extension", request: { method: "POST", path: "/sessions", auth: "extension" }, status: 200, response: { schema: "SessionsResponse", example: [{ id: "w1:p2", agent: "claude", cwd: "/home/me/project", title: "shell", method: "herdr", pane: "w1:p2" }] } },
42
+ { name: "sessions-extension", request: { method: "POST", path: "/sessions", auth: "extension" }, status: 200, response: { schema: "SessionsResponse", example: [{ id: "w1:p2", agent: "claude", cwd: "/home/me/project", title: "shell", method: "herdr", pane: "w1:p2", workspace: "project" }] } },
43
43
  { name: "sessions-token", request: { method: "GET", path: "/sessions", auth: "token" }, status: 200, response: { schema: "SessionsResponse", example: [] } },
44
44
  { name: "sessions-extension-no-token", request: { method: "POST", path: "/sessions", auth: "extension-no-token" }, status: 401, response: { schema: "ErrorResponse", example: { error: "bad token" } } },
45
45
  { name: "sessions-unauthenticated", request: { method: "POST", path: "/sessions", auth: "none" }, status: 401, response: { schema: "ErrorResponse", example: { error: "bad token" } } },
package/dist/index.d.ts CHANGED
@@ -275,6 +275,11 @@ export declare const Session: z.ZodObject<{
275
275
  }>;
276
276
  pane: z.ZodOptional<z.ZodString>;
277
277
  sessionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
278
+ workspace: z.ZodOptional<z.ZodString>;
279
+ published: z.ZodOptional<z.ZodArray<z.ZodObject<{
280
+ id: z.ZodString;
281
+ at: z.ZodString;
282
+ }, z.core.$strip>>>;
278
283
  }, z.core.$strip>;
279
284
  export type Session = z.infer<typeof Session>;
280
285
  export declare const PROTOCOL_VERSION = 2;
@@ -300,6 +305,11 @@ export declare const SessionsResponse: z.ZodArray<z.ZodObject<{
300
305
  }>;
301
306
  pane: z.ZodOptional<z.ZodString>;
302
307
  sessionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
308
+ workspace: z.ZodOptional<z.ZodString>;
309
+ published: z.ZodOptional<z.ZodArray<z.ZodObject<{
310
+ id: z.ZodString;
311
+ at: z.ZodString;
312
+ }, z.core.$strip>>>;
303
313
  }, z.core.$strip>>;
304
314
  export type SessionsResponse = z.infer<typeof SessionsResponse>;
305
315
  export declare const SendResponse: z.ZodObject<{
package/dist/index.js CHANGED
@@ -77,6 +77,10 @@ export const Session = z.object({
77
77
  method: z.enum(["push", "herdr", "next-prompt"]),
78
78
  pane: z.string().optional(),
79
79
  sessionIds: z.array(z.string()).optional(),
80
+ /** Display name of the herdr workspace a herdr pane is in. */
81
+ workspace: z.string().optional(),
82
+ /** claude.ai artifacts this session published, each with the time of its first publish; newest first, at most 50. */
83
+ published: z.array(z.object({ id: z.string(), at: z.string() })).optional(),
80
84
  });
81
85
  // Protocol v2. Additive changes (optional fields, new endpoints) keep the version; removals, renames and
82
86
  // semantic changes bump PROTOCOL_VERSION, and the bridge keeps accepting the previous version for a release.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anynotate/protocol",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Wire types and zod schemas shared by Anynotate clients and the Anynotate bridge.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Kun Xu",
package/src/fixtures.ts CHANGED
@@ -57,14 +57,14 @@ export type Exchange = {
57
57
  response: { schema: SchemaName; example: unknown };
58
58
  };
59
59
 
60
- const health = { ok: true, bridgeVersion: "0.5.1", protocol: { version: 2, min: 1 } };
60
+ const health = { ok: true, bridgeVersion: "0.6.1", protocol: { version: 2, min: 1 } };
61
61
  const queued = { state: "queued", at: "2026-09-24T15:32:01.000Z" };
62
62
  const exampleBundle = { ...exampleBundleInput, id: EXAMPLE_BUNDLE_ID, files: { page: "page.md", screenshot: "screenshot.png" } };
63
63
 
64
64
  export const conformance: Exchange[] = [
65
65
  { name: "health-extension", request: { method: "POST", path: "/health", auth: "extension" }, status: 200, response: { schema: "HealthResponse", example: health } },
66
66
  { name: "health-probe", request: { method: "GET", path: "/health", auth: "none" }, status: 200, response: { schema: "HealthResponse", example: health } },
67
- { name: "sessions-extension", request: { method: "POST", path: "/sessions", auth: "extension" }, status: 200, response: { schema: "SessionsResponse", example: [{ id: "w1:p2", agent: "claude", cwd: "/home/me/project", title: "shell", method: "herdr", pane: "w1:p2" }] } },
67
+ { name: "sessions-extension", request: { method: "POST", path: "/sessions", auth: "extension" }, status: 200, response: { schema: "SessionsResponse", example: [{ id: "w1:p2", agent: "claude", cwd: "/home/me/project", title: "shell", method: "herdr", pane: "w1:p2", workspace: "project" }] } },
68
68
  { name: "sessions-token", request: { method: "GET", path: "/sessions", auth: "token" }, status: 200, response: { schema: "SessionsResponse", example: [] } },
69
69
  { name: "sessions-extension-no-token", request: { method: "POST", path: "/sessions", auth: "extension-no-token" }, status: 401, response: { schema: "ErrorResponse", example: { error: "bad token" } } },
70
70
  { name: "sessions-unauthenticated", request: { method: "POST", path: "/sessions", auth: "none" }, status: 401, response: { schema: "ErrorResponse", example: { error: "bad token" } } },
package/src/index.ts CHANGED
@@ -99,6 +99,10 @@ export const Session = z.object({
99
99
  method: z.enum(["push", "herdr", "next-prompt"]),
100
100
  pane: z.string().optional(),
101
101
  sessionIds: z.array(z.string()).optional(),
102
+ /** Display name of the herdr workspace a herdr pane is in. */
103
+ workspace: z.string().optional(),
104
+ /** claude.ai artifacts this session published, each with the time of its first publish; newest first, at most 50. */
105
+ published: z.array(z.object({ id: z.string(), at: z.string() })).optional(),
102
106
  });
103
107
  export type Session = z.infer<typeof Session>;
104
108