agent-comms 9.0.3 → 9.0.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.
Files changed (116) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +4 -0
  4. package/dist/bridges/user/web/test/web-access.unit.test.d.ts +1 -1
  5. package/dist/bridges/user/web/test/web-access.unit.test.js +19 -375
  6. package/dist/bridges/user/web/test/web-access.unit.test.js.map +1 -1
  7. package/dist/core/bridge.d.ts +11 -0
  8. package/dist/core/bridge.d.ts.map +1 -1
  9. package/dist/core/bridge.js +17 -2
  10. package/dist/core/bridge.js.map +1 -1
  11. package/dist/core/index.d.ts +1 -1
  12. package/dist/core/index.d.ts.map +1 -1
  13. package/dist/core/index.js +1 -1
  14. package/dist/core/index.js.map +1 -1
  15. package/dist/core/test/build-action.unit.test.d.ts +2 -0
  16. package/dist/core/test/build-action.unit.test.d.ts.map +1 -0
  17. package/dist/core/test/build-action.unit.test.js +28 -0
  18. package/dist/core/test/build-action.unit.test.js.map +1 -0
  19. package/dist/test/ci-required-checks.unit.test.d.ts +2 -0
  20. package/dist/test/ci-required-checks.unit.test.d.ts.map +1 -0
  21. package/dist/test/ci-required-checks.unit.test.js +137 -0
  22. package/dist/test/ci-required-checks.unit.test.js.map +1 -0
  23. package/dist/test/claude-command.unit.test.js +2 -21
  24. package/dist/test/claude-command.unit.test.js.map +1 -1
  25. package/dist/test/conformance/corpus-files.d.ts +11 -0
  26. package/dist/test/conformance/corpus-files.d.ts.map +1 -0
  27. package/dist/test/conformance/corpus-files.js +71 -0
  28. package/dist/test/conformance/corpus-files.js.map +1 -0
  29. package/dist/test/conformance/corpus-types.d.ts +62 -0
  30. package/dist/test/conformance/corpus-types.d.ts.map +1 -0
  31. package/dist/test/conformance/corpus-types.js +8 -0
  32. package/dist/test/conformance/corpus-types.js.map +1 -0
  33. package/dist/test/conformance/corpus.d.ts +34 -0
  34. package/dist/test/conformance/corpus.d.ts.map +1 -0
  35. package/dist/test/conformance/corpus.js +134 -0
  36. package/dist/test/conformance/corpus.js.map +1 -0
  37. package/dist/test/conformance/read-json.d.ts +2 -0
  38. package/dist/test/conformance/read-json.d.ts.map +1 -0
  39. package/dist/test/conformance/read-json.js +7 -0
  40. package/dist/test/conformance/read-json.js.map +1 -0
  41. package/dist/test/conformance/text.d.ts +10 -0
  42. package/dist/test/conformance/text.d.ts.map +1 -0
  43. package/dist/test/conformance/text.js +64 -0
  44. package/dist/test/conformance/text.js.map +1 -0
  45. package/dist/test/conformance/validate.d.ts +14 -0
  46. package/dist/test/conformance/validate.d.ts.map +1 -0
  47. package/dist/test/conformance/validate.js +85 -0
  48. package/dist/test/conformance/validate.js.map +1 -0
  49. package/dist/test/conformance-functions.helper.d.ts +19 -0
  50. package/dist/test/conformance-functions.helper.d.ts.map +1 -0
  51. package/dist/test/conformance-functions.helper.js +583 -0
  52. package/dist/test/conformance-functions.helper.js.map +1 -0
  53. package/dist/test/conformance.unit.test.d.ts +2 -0
  54. package/dist/test/conformance.unit.test.d.ts.map +1 -0
  55. package/dist/test/conformance.unit.test.js +358 -0
  56. package/dist/test/conformance.unit.test.js.map +1 -0
  57. package/dist/test/error-reporting.unit.test.js +2 -90
  58. package/dist/test/error-reporting.unit.test.js.map +1 -1
  59. package/dist/test/version-report-actions.unit.test.d.ts +1 -1
  60. package/dist/test/version-report-actions.unit.test.js +2 -55
  61. package/dist/test/version-report-actions.unit.test.js.map +1 -1
  62. package/package.json +4 -2
  63. package/src/core/bridge.ts +30 -1
  64. package/src/core/index.ts +1 -0
  65. package/dist/core/test/bridge.unit.test.d.ts +0 -5
  66. package/dist/core/test/bridge.unit.test.d.ts.map +0 -1
  67. package/dist/core/test/bridge.unit.test.js +0 -119
  68. package/dist/core/test/bridge.unit.test.js.map +0 -1
  69. package/dist/test/agent-table.unit.test.d.ts +0 -5
  70. package/dist/test/agent-table.unit.test.d.ts.map +0 -1
  71. package/dist/test/agent-table.unit.test.js +0 -53
  72. package/dist/test/agent-table.unit.test.js.map +0 -1
  73. package/dist/test/bind-retry.unit.test.d.ts +0 -2
  74. package/dist/test/bind-retry.unit.test.d.ts.map +0 -1
  75. package/dist/test/bind-retry.unit.test.js +0 -42
  76. package/dist/test/bind-retry.unit.test.js.map +0 -1
  77. package/dist/test/default-command.unit.test.d.ts +0 -2
  78. package/dist/test/default-command.unit.test.d.ts.map +0 -1
  79. package/dist/test/default-command.unit.test.js +0 -26
  80. package/dist/test/default-command.unit.test.js.map +0 -1
  81. package/dist/test/delegation-policy.unit.test.d.ts +0 -5
  82. package/dist/test/delegation-policy.unit.test.d.ts.map +0 -1
  83. package/dist/test/delegation-policy.unit.test.js +0 -52
  84. package/dist/test/delegation-policy.unit.test.js.map +0 -1
  85. package/dist/test/display-name.unit.test.d.ts +0 -5
  86. package/dist/test/display-name.unit.test.d.ts.map +0 -1
  87. package/dist/test/display-name.unit.test.js +0 -65
  88. package/dist/test/display-name.unit.test.js.map +0 -1
  89. package/dist/test/machine-list-groups.unit.test.d.ts +0 -5
  90. package/dist/test/machine-list-groups.unit.test.d.ts.map +0 -1
  91. package/dist/test/machine-list-groups.unit.test.js +0 -61
  92. package/dist/test/machine-list-groups.unit.test.js.map +0 -1
  93. package/dist/test/relay-selection.unit.test.d.ts +0 -5
  94. package/dist/test/relay-selection.unit.test.d.ts.map +0 -1
  95. package/dist/test/relay-selection.unit.test.js +0 -103
  96. package/dist/test/relay-selection.unit.test.js.map +0 -1
  97. package/dist/test/request-timeouts.unit.test.d.ts +0 -2
  98. package/dist/test/request-timeouts.unit.test.d.ts.map +0 -1
  99. package/dist/test/request-timeouts.unit.test.js +0 -28
  100. package/dist/test/request-timeouts.unit.test.js.map +0 -1
  101. package/dist/test/room-discovery.unit.test.d.ts +0 -2
  102. package/dist/test/room-discovery.unit.test.d.ts.map +0 -1
  103. package/dist/test/room-discovery.unit.test.js +0 -29
  104. package/dist/test/room-discovery.unit.test.js.map +0 -1
  105. package/dist/test/room-lookup.unit.test.d.ts +0 -2
  106. package/dist/test/room-lookup.unit.test.d.ts.map +0 -1
  107. package/dist/test/room-lookup.unit.test.js +0 -59
  108. package/dist/test/room-lookup.unit.test.js.map +0 -1
  109. package/dist/test/room-path.unit.test.d.ts +0 -2
  110. package/dist/test/room-path.unit.test.d.ts.map +0 -1
  111. package/dist/test/room-path.unit.test.js +0 -54
  112. package/dist/test/room-path.unit.test.js.map +0 -1
  113. package/dist/test/send-outcome.unit.test.d.ts +0 -2
  114. package/dist/test/send-outcome.unit.test.d.ts.map +0 -1
  115. package/dist/test/send-outcome.unit.test.js +0 -52
  116. package/dist/test/send-outcome.unit.test.js.map +0 -1
@@ -15,7 +15,7 @@
15
15
  "source": "url",
16
16
  "url": "https://github.com/ExaDev/agent-comms.git"
17
17
  },
18
- "version": "9.0.3"
18
+ "version": "9.0.4"
19
19
  }
20
20
  ]
21
21
  }
@@ -17,5 +17,5 @@
17
17
  },
18
18
  "name": "agent-comms",
19
19
  "repository": "https://github.com/ExaDev/agent-comms",
20
- "version": "9.0.3"
20
+ "version": "9.0.4"
21
21
  }
package/README.md CHANGED
@@ -216,6 +216,10 @@ The fronted session can reply, not just receive. A message with a single origina
216
216
 
217
217
  Aliases are created only on inbound contact from that correspondent, never pre-populated from the wider mesh roster, and are ephemeral: they live only in the front's own memory, so a restart drops them and the next inbound message from that correspondent re-materialises the same alias. A reply landing on an alias the front no longer recognises (e.g. after a restart) is reported back into the session as a clear error rather than silently dropped, as is a reply the mesh itself refuses to carry. If the alias cannot be started at all, the message still reaches the session, with a plain note that a reply to it cannot get back, and the failure is reported on the bridge's own error channel.
218
218
 
219
+ ## Working on the Rust workspace and the conformance corpus
220
+
221
+ `conformance/` holds language-neutral test cases that every implementation of the package runs, and `rust/` holds the Rust implementation of the package. A push that touches either, or the scripts and workflows that check them, runs `scripts/rust-checks.sh` from the pre-push hook, which needs [rustup](https://rustup.rs) (the toolchain `rust/rust-toolchain.toml` pins is installed on first use) and Python 3.9 or later. Every cargo command goes through `scripts/rust.sh`, never cargo directly. The corpus format, how a case is added and what each field means are in [`conformance/README.md`](conformance/README.md); a dependency is added to the Rust workspace by listing it, with the reason, in `rust/deny.toml`.
222
+
219
223
  ## Adding a new harness
220
224
 
221
225
  A bridge is two things:
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Unit tests for the web server's network exposure gate (agent-comms#346): bind resolution, the constant-time token comparison, and the per-request decision for loopback and non-loopback clients.
2
+ * The two cases of the web server's network exposure gate (agent-comms#346) that depend on the running process: a generated token is random, and this machine's own hostname is read from the operating system. Every other case is in the conformance corpus (conformance/function/web-access.json).
3
3
  */
4
4
  export {};
5
5
  //# sourceMappingURL=web-access.unit.test.d.ts.map
@@ -1,396 +1,40 @@
1
1
  /**
2
- * Unit tests for the web server's network exposure gate (agent-comms#346): bind resolution, the constant-time token comparison, and the per-request decision for loopback and non-loopback clients.
2
+ * The two cases of the web server's network exposure gate (agent-comms#346) that depend on the running process: a generated token is random, and this machine's own hostname is read from the operating system. Every other case is in the conformance corpus (conformance/function/web-access.json).
3
3
  */
4
4
  import { describe, expect, it } from "vitest";
5
5
  import * as os from "node:os";
6
- import { accessCookieName, accessUrls, authorise, canonicalAddress, generateAccessToken, HOSTED_DASHBOARD_ORIGIN, isLoopbackAddress, isWildcardHost, localWebUrl, LOOPBACK_HOST, requiresAccessToken, resolveWebBindHost, tokensMatch, WEB_HOST_ENV, } from "../web-access.js";
7
- const HTTP_FOUND = 302;
8
- const HTTP_UNAUTHORIZED = 401;
9
- const HTTP_FORBIDDEN = 403;
6
+ import { accessCookieName, authorise, generateAccessToken, tokensMatch, } from "../web-access.js";
10
7
  const PORT = 41234;
11
- const LAN_CLIENT = "192.168.1.50";
12
8
  const BIND = "192.168.1.10";
13
- const HOST_HEADER = `${BIND}:${String(PORT)}`;
14
- const COOKIE_NAME = accessCookieName(PORT);
15
- /** A policy for a LAN bind whose machine has no interface addresses, so every non-loopback client is a remote device. */
16
- function policy(overrides = {}) {
17
- return {
18
- token: generateAccessToken(),
19
- bindHost: BIND,
20
- port: PORT,
21
- localClientAddresses: () => new Set(),
22
- ...overrides,
23
- };
24
- }
25
- function request(overrides) {
26
- return {
27
- method: "GET",
28
- url: "/",
29
- remoteAddress: LAN_CLIENT,
30
- headers: { host: HOST_HEADER },
31
- ...overrides,
32
- };
33
- }
34
- describe("resolveWebBindHost", () => {
35
- it("defaults to loopback with no option and no environment variable", () => {
36
- expect(resolveWebBindHost(undefined, {})).toBe(LOOPBACK_HOST);
37
- });
38
- it("takes the environment variable as the opt-in", () => {
39
- expect(resolveWebBindHost(undefined, { [WEB_HOST_ENV]: "0.0.0.0" })).toBe("0.0.0.0");
40
- });
41
- it("prefers an explicit option over the environment", () => {
42
- expect(resolveWebBindHost("::", { [WEB_HOST_ENV]: "0.0.0.0" })).toBe("::");
43
- });
44
- it.each(["::0", "0:0:0:0:0:0:0:0", "::ffff:0.0.0.0", "::ffff:0:0"])("canonicalises the wildcard spelling %s so it is classified as a wildcard", (spelling) => {
45
- const host = resolveWebBindHost(spelling, {});
46
- expect(isWildcardHost(host)).toBe(true);
47
- expect(requiresAccessToken(host)).toBe(true);
48
- });
49
- it("rejects a value that is not an IP address instead of falling back", () => {
50
- expect(() => resolveWebBindHost(undefined, { [WEB_HOST_ENV]: "lan" })).toThrow(WEB_HOST_ENV);
51
- });
52
- });
53
- describe("canonicalAddress", () => {
54
- it.each([
55
- ["::0", "::"],
56
- ["0:0:0:0:0:0:0:1", "::1"],
57
- ["::ffff:127.0.0.1", "127.0.0.1"],
58
- ["::ffff:7f00:1", "127.0.0.1"],
59
- ["192.168.1.10", "192.168.1.10"],
60
- ["fe80::1%en0", "fe80::1%en0"],
61
- ])("spells %s as %s", (input, expected) => {
62
- expect(canonicalAddress(input)).toBe(expected);
63
- });
64
- });
65
- describe("isWildcardHost", () => {
66
- it.each(["0.0.0.0", "::", "::0", "0:0:0:0:0:0:0:0", "::ffff:0.0.0.0"])("%s binds every interface", (host) => {
67
- expect(isWildcardHost(host)).toBe(true);
68
- });
69
- it.each(["192.168.1.10", "127.0.0.1", "::1", "fe80::1%en0"])("%s binds one interface", (host) => {
70
- expect(isWildcardHost(host)).toBe(false);
71
- });
72
- });
73
- describe("localWebUrl", () => {
74
- it("maps a wildcard bind to loopback and keeps a specific bind", () => {
75
- expect(localWebUrl("0.0.0.0", PORT)).toBe(`http://127.0.0.1:${PORT}`);
76
- expect(localWebUrl("::", PORT)).toBe(`http://127.0.0.1:${PORT}`);
77
- expect(localWebUrl(BIND, PORT)).toBe(`http://${BIND}:${PORT}`);
78
- });
79
- it("brackets an IPv6 bind", () => {
80
- expect(localWebUrl("::1", PORT)).toBe(`http://[::1]:${PORT}`);
81
- });
82
- });
83
- describe("requiresAccessToken", () => {
84
- it.each(["127.0.0.1", "127.0.0.5", "::1"])("%s needs no token", (host) => {
85
- expect(requiresAccessToken(host)).toBe(false);
86
- });
87
- it.each(["0.0.0.0", "::", "192.168.1.10"])("%s needs a token", (host) => {
88
- expect(requiresAccessToken(host)).toBe(true);
89
- });
90
- });
91
- describe("isLoopbackAddress", () => {
92
- it.each(["127.0.0.1", "::1", "::ffff:127.0.0.1"])("%s is loopback", (a) => {
93
- expect(isLoopbackAddress(a)).toBe(true);
94
- });
95
- it.each(["192.168.1.50", "::ffff:192.168.1.50", "fe80::1"])("%s is not loopback", (a) => {
96
- expect(isLoopbackAddress(a)).toBe(false);
9
+ describe("generateAccessToken", () => {
10
+ it("generates distinct tokens", () => {
11
+ expect(generateAccessToken()).not.toBe(generateAccessToken());
97
12
  });
98
- });
99
- describe("tokensMatch", () => {
100
- it("accepts an identical token", () => {
13
+ it("generates a token that matches itself", () => {
101
14
  const token = generateAccessToken();
102
15
  expect(tokensMatch(token, token)).toBe(true);
103
16
  });
104
- it("rejects a prefix, an extension, a different token and the empty string without throwing on length", () => {
105
- const token = generateAccessToken();
106
- expect(tokensMatch(token.slice(0, -1), token)).toBe(false);
107
- expect(tokensMatch(`${token}0`, token)).toBe(false);
108
- expect(tokensMatch(generateAccessToken(), token)).toBe(false);
109
- expect(tokensMatch("", token)).toBe(false);
110
- });
111
- it("generates distinct tokens", () => {
112
- expect(generateAccessToken()).not.toBe(generateAccessToken());
113
- });
114
17
  });
115
18
  describe("authorise", () => {
116
- it("allows a loopback client with a loopback Host and no token, under a loopback bind", () => {
117
- const loopbackBind = policy({ token: undefined, bindHost: LOOPBACK_HOST });
118
- for (const host of ["localhost", LOOPBACK_HOST, "[::1]"]) {
119
- expect(authorise(loopbackBind, request({
120
- remoteAddress: "127.0.0.1",
121
- headers: { host: `${host}:${String(PORT)}` },
122
- }))).toEqual({ kind: "allow" });
123
- }
124
- });
125
- it("rejects a rebound Host from a loopback client, under a loopback bind and under a LAN bind", () => {
126
- for (const p of [
127
- policy({ token: undefined, bindHost: LOOPBACK_HOST }),
128
- policy(),
129
- ]) {
130
- expect(authorise(p, request({
131
- remoteAddress: "127.0.0.1",
132
- headers: { host: `rebind.example:${String(PORT)}` },
133
- }))).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
134
- }
135
- });
136
- it("rejects the wildcard address as a Host even from loopback, under a wildcard bind", () => {
137
- expect(authorise(policy({ bindHost: "0.0.0.0" }), request({
138
- remoteAddress: "127.0.0.1",
139
- headers: { host: `0.0.0.0:${String(PORT)}` },
140
- }))).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
141
- });
142
- it("allows a loopback client without a token under a LAN bind", () => {
143
- const decision = authorise(policy(), request({
144
- remoteAddress: "127.0.0.1",
145
- headers: { host: `localhost:${String(PORT)}` },
146
- }));
147
- expect(decision).toEqual({ kind: "allow" });
148
- });
149
- it("allows a client connecting from one of this machine's own interface addresses without a token", () => {
150
- const decision = authorise(policy({ localClientAddresses: () => new Set([BIND]) }), request({ remoteAddress: BIND }));
151
- expect(decision).toEqual({ kind: "allow" });
152
- });
153
- it("answers 401 to a remote client under a loopback bind, which has no token to present", () => {
154
- expect(authorise(policy({ token: undefined, bindHost: LOOPBACK_HOST }), request({ headers: { host: `localhost:${String(PORT)}` } }))).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
155
- });
156
- it("scopes the cookie to the server's port so two servers on one host keep separate cookies", () => {
157
- const portA = 41001;
158
- const portB = 41002;
159
- const a = policy({ port: portA });
160
- const b = policy({ port: portB });
161
- const both = `${accessCookieName(portA)}=${a.token}; ${accessCookieName(portB)}=${b.token}`;
162
- const via = (p, port, cookie) => authorise(p, request({ headers: { host: `${BIND}:${String(port)}`, cookie } }));
163
- expect(via(a, portA, both)).toEqual({ kind: "allow" });
164
- expect(via(b, portB, both)).toEqual({ kind: "allow" });
165
- expect(accessCookieName(portA)).not.toBe(accessCookieName(portB));
166
- expect(via(a, portA, `${accessCookieName(portB)}=${b.token}`)).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
167
- expect(via(b, portB, `${accessCookieName(portA)}=${a.token}`)).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
168
- });
169
- it("answers 401 to a non-loopback client with no token", () => {
170
- expect(authorise(policy(), request({}))).toMatchObject({
171
- kind: "deny",
172
- status: HTTP_UNAUTHORIZED,
173
- });
174
- });
175
- it("answers 401 to a wrong bearer token", () => {
176
- const decision = authorise(policy(), request({
177
- headers: { host: HOST_HEADER, authorization: "Bearer wrong" },
178
- }));
179
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
180
- });
181
- it("allows a correct bearer token", () => {
182
- const p = policy();
183
- const decision = authorise(p, request({
184
- headers: { host: HOST_HEADER, authorization: `Bearer ${p.token}` },
185
- }));
186
- expect(decision).toEqual({ kind: "allow" });
187
- });
188
- it("allows a correct cookie and rejects a wrong one", () => {
189
- const p = policy();
190
- expect(authorise(p, request({
191
- headers: {
192
- host: HOST_HEADER,
193
- cookie: `a=b; ${COOKIE_NAME}=${p.token}`,
194
- },
195
- }))).toEqual({ kind: "allow" });
196
- expect(authorise(p, request({
197
- headers: {
198
- host: HOST_HEADER,
199
- cookie: `${COOKIE_NAME}=wrong`,
200
- },
201
- }))).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
202
- });
203
- it("exchanges a correct ?token= on a GET for a cookie and a redirect without the token", () => {
204
- const p = policy();
205
- const decision = authorise(p, request({ url: `/room?x=1&token=${p.token}` }));
206
- expect(decision).toEqual({
207
- kind: "exchange",
208
- status: HTTP_FOUND,
209
- cookie: `${COOKIE_NAME}=${p.token}; HttpOnly; SameSite=Lax; Path=/`,
210
- location: "/room?x=1",
211
- });
212
- });
213
- it("does not exchange a wrong ?token=, nor any ?token= on a POST", () => {
214
- const p = policy();
215
- expect(authorise(p, request({ url: "/?token=wrong" }))).toMatchObject({
216
- kind: "deny",
217
- status: HTTP_UNAUTHORIZED,
218
- });
219
- expect(authorise(p, request({ method: "POST", url: `/api/action?token=${p.token}` }))).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
220
- });
221
- it("rejects a Host naming another domain with 403 even when the token is right (DNS rebinding)", () => {
222
- const p = policy();
223
- const decision = authorise(p, request({
224
- headers: {
225
- host: `rebind.example:${String(PORT)}`,
226
- authorization: `Bearer ${p.token}`,
227
- },
228
- }));
229
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
230
- });
231
- it("rejects a Host on the right address but the wrong port, and a missing Host", () => {
232
- const p = policy();
233
- const authorization = `Bearer ${p.token}`;
234
- expect(authorise(p, request({ headers: { host: `${BIND}:1`, authorization } }))).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
235
- expect(authorise(p, request({ headers: { authorization } }))).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
236
- });
237
19
  it("accepts this machine's own hostname as the Host", () => {
238
- const p = policy();
20
+ const token = generateAccessToken();
239
21
  const machine = os.hostname().replace(/\.local$/i, "");
240
- const decision = authorise(p, request({
22
+ const decision = authorise({
23
+ token,
24
+ bindHost: BIND,
25
+ port: PORT,
26
+ localClientAddresses: () => new Set(),
27
+ }, {
28
+ method: "GET",
29
+ url: "/",
30
+ remoteAddress: "192.168.1.50",
241
31
  headers: {
242
32
  host: `${machine}.local:${String(PORT)}`,
243
- authorization: `Bearer ${p.token}`,
244
- },
245
- }));
246
- expect(decision).toEqual({ kind: "allow" });
247
- });
248
- it("rejects a cross-origin request carrying a valid cookie", () => {
249
- const p = policy();
250
- const decision = authorise(p, request({
251
- headers: {
252
- host: HOST_HEADER,
253
- cookie: `${COOKIE_NAME}=${p.token}`,
254
- origin: `http://${BIND}:9999`,
255
- },
256
- }));
257
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
258
- });
259
- it("allows a same-origin request carrying a valid cookie", () => {
260
- const p = policy();
261
- const decision = authorise(p, request({
262
- headers: {
263
- host: HOST_HEADER,
264
- cookie: `${COOKIE_NAME}=${p.token}`,
265
- origin: `http://${HOST_HEADER}`,
266
- },
267
- }));
268
- expect(decision).toEqual({ kind: "allow" });
269
- });
270
- it("rejects a foreign Origin from a loopback client, under a loopback bind and a wildcard bind", () => {
271
- for (const bindHost of [LOOPBACK_HOST, "0.0.0.0"]) {
272
- const decision = authorise(policy({ token: undefined, bindHost }), request({
273
- remoteAddress: "127.0.0.1",
274
- headers: {
275
- host: `127.0.0.1:${String(PORT)}`,
276
- origin: "https://evil.example",
277
- },
278
- }));
279
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
280
- }
281
- });
282
- it("rejects a foreign Origin from a client on this machine's own interface address", () => {
283
- const decision = authorise(policy({ localClientAddresses: () => new Set([LAN_CLIENT]) }), request({
284
- headers: { host: HOST_HEADER, origin: "https://evil.example" },
285
- }));
286
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
287
- });
288
- it("rejects an https Origin whose host and port match this server", () => {
289
- const decision = authorise(policy({ token: undefined, bindHost: LOOPBACK_HOST }), request({
290
- remoteAddress: "127.0.0.1",
291
- headers: {
292
- host: `127.0.0.1:${String(PORT)}`,
293
- origin: `https://127.0.0.1:${String(PORT)}`,
33
+ authorization: `Bearer ${token}`,
34
+ cookie: `${accessCookieName(PORT)}=${token}`,
294
35
  },
295
- }));
296
- expect(decision).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
297
- });
298
- it("allows an http Origin naming a loopback name on the bound port from a loopback client", () => {
299
- const decision = authorise(policy({ token: undefined, bindHost: LOOPBACK_HOST }), request({
300
- remoteAddress: "127.0.0.1",
301
- headers: {
302
- host: `127.0.0.1:${String(PORT)}`,
303
- origin: `http://localhost:${String(PORT)}`,
304
- },
305
- }));
36
+ });
306
37
  expect(decision).toEqual({ kind: "allow" });
307
38
  });
308
- it("allows the hosted dashboard's Origin from a loopback client only", () => {
309
- const loopback = authorise(policy({ token: undefined, bindHost: LOOPBACK_HOST }), request({
310
- remoteAddress: "127.0.0.1",
311
- headers: {
312
- host: `127.0.0.1:${String(PORT)}`,
313
- origin: HOSTED_DASHBOARD_ORIGIN,
314
- },
315
- }));
316
- expect(loopback).toEqual({ kind: "allow" });
317
- const p = policy();
318
- const remote = authorise(p, request({
319
- headers: {
320
- host: HOST_HEADER,
321
- cookie: `${COOKIE_NAME}=${p.token}`,
322
- origin: HOSTED_DASHBOARD_ORIGIN,
323
- },
324
- }));
325
- expect(remote).toMatchObject({ kind: "deny", status: HTTP_FORBIDDEN });
326
- });
327
- it("accepts the Bearer scheme in any letter case and rejects other schemes", () => {
328
- const p = policy();
329
- for (const scheme of ["Bearer", "bearer", "BEARER"]) {
330
- expect(authorise(p, request({
331
- headers: {
332
- host: HOST_HEADER,
333
- authorization: `${scheme} ${String(p.token)}`,
334
- },
335
- }))).toEqual({ kind: "allow" });
336
- }
337
- expect(authorise(p, request({
338
- headers: {
339
- host: HOST_HEADER,
340
- authorization: `Basic ${String(p.token)}`,
341
- },
342
- }))).toMatchObject({ kind: "deny", status: HTTP_UNAUTHORIZED });
343
- });
344
- });
345
- describe("accessUrls", () => {
346
- const MAC = "00:00:00:00:00:00";
347
- function v4(address, internal) {
348
- return {
349
- address,
350
- family: "IPv4",
351
- internal,
352
- netmask: "255.255.255.0",
353
- mac: MAC,
354
- cidr: null,
355
- };
356
- }
357
- function v6(address) {
358
- return {
359
- address,
360
- family: "IPv6",
361
- internal: false,
362
- netmask: "ffff:ffff:ffff:ffff::",
363
- mac: MAC,
364
- cidr: null,
365
- scopeid: 0,
366
- };
367
- }
368
- const loopback = { lo0: [v4("127.0.0.1", true)] };
369
- const lan = {
370
- en0: [v4("192.168.1.10", false), v6("fe80::1"), v6("2001:db8::10")],
371
- ...loopback,
372
- };
373
- function listFor(bindHost, interfaces) {
374
- return accessUrls({ ...policy({ bindHost }), token: "t" }, () => interfaces);
375
- }
376
- it("lists external IPv4 and non-link-local IPv6 addresses, bracketed, under the IPv6 wildcard", () => {
377
- expect(listFor("::", lan)).toEqual([
378
- `http://192.168.1.10:${String(PORT)}/?token=t`,
379
- `http://[2001:db8::10]:${String(PORT)}/?token=t`,
380
- ]);
381
- });
382
- it("lists only IPv4 addresses under the IPv4 wildcard, which accepts no IPv6 connection", () => {
383
- expect(listFor("0.0.0.0", lan)).toEqual([
384
- `http://192.168.1.10:${String(PORT)}/?token=t`,
385
- ]);
386
- });
387
- it("lists nothing when a wildcard bind finds no external address", () => {
388
- expect(listFor("0.0.0.0", loopback)).toEqual([]);
389
- });
390
- it("lists the bound address under a specific bind", () => {
391
- expect(listFor(BIND, loopback)).toEqual([
392
- `http://${BIND}:${String(PORT)}/?token=t`,
393
- ]);
394
- });
395
39
  });
396
40
  //# sourceMappingURL=web-access.unit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-access.unit.test.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/test/web-access.unit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-access.unit.test.js","sourceRoot":"","sources":["../../../../../src/bridges/user/web/test/web-access.unit.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,mBAAmB,EACnB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,MAAM,IAAI,GAAG,KAAK,CAAC;AACnB,MAAM,IAAI,GAAG,cAAc,CAAC;AAE5B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,SAAS,CACxB;YACE,KAAK;YACL,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE;SACtC,EACD;YACE,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG;YACR,aAAa,EAAE,cAAc;YAC7B,OAAO,EAAE;gBACP,IAAI,EAAE,GAAG,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,EAAE;gBACxC,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE;aAC7C;SACF,CACF,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -129,6 +129,17 @@ export declare const MCP_TOOL_PARAMS: z.ZodObject<{
129
129
  timeoutMs: z.ZodOptional<z.ZodNumber>;
130
130
  }, z.core.$strip>;
131
131
  export type ToolParams = z.infer<typeof MCP_TOOL_PARAMS>;
132
+ /** Thrown by buildAction for parameters MCP_TOOL_PARAMS rejects, so a malformed tool call reaches its caller as an error naming what is wrong and is never run as some other action. `issues` is every problem found, each with the path of the parameter at fault. */
133
+ export declare class InvalidToolParamsError extends Error {
134
+ readonly issues: readonly {
135
+ readonly path: readonly (string | number)[];
136
+ readonly message: string;
137
+ }[];
138
+ constructor(issues: readonly {
139
+ readonly path: readonly (string | number)[];
140
+ readonly message: string;
141
+ }[]);
142
+ }
132
143
  export declare function buildAction(params: Record<string, unknown>): CommsAction;
133
144
  export declare function extractStreamingBehavior(event: DeliveryEvent): StreamingBehavior | undefined;
134
145
  export declare function formatDeliveryEvent(event: DeliveryEvent): string;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0G1B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAsBzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CA4WxE;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,GACnB,iBAAiB,GAAG,SAAS,CAK/B;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA2ChE;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAoB/D;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuB9B;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAMD,wBAAsB,cAAc,CAClC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/core/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0G1B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAsBzD,uQAAuQ;AACvQ,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,MAAM,EAAE,SAAS;QACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE;gBAHM,MAAM,EAAE,SAAS;QACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,EAAE;CAYN;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAqXxE;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,GACnB,iBAAiB,GAAG,SAAS,CAK/B;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CA2ChE;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAoB/D;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuB9B;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAMD,wBAAsB,cAAc,CAClC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB"}
@@ -143,10 +143,25 @@ class BuildActionError extends Error {
143
143
  this.name = "BuildActionError";
144
144
  }
145
145
  }
146
+ /** Thrown by buildAction for parameters MCP_TOOL_PARAMS rejects, so a malformed tool call reaches its caller as an error naming what is wrong and is never run as some other action. `issues` is every problem found, each with the path of the parameter at fault. */
147
+ export class InvalidToolParamsError extends Error {
148
+ issues;
149
+ constructor(issues) {
150
+ super(`Invalid parameters: ${issues
151
+ .map((issue) => `${issue.path.length === 0 ? "(root)" : issue.path.join(".")}: ${issue.message}`)
152
+ .join("; ")}`);
153
+ this.issues = issues;
154
+ this.name = "InvalidToolParamsError";
155
+ }
156
+ }
146
157
  export function buildAction(params) {
147
158
  const parsed = MCP_TOOL_PARAMS.safeParse(params);
148
- if (!parsed.success)
149
- return { action: "whoami" };
159
+ if (!parsed.success) {
160
+ throw new InvalidToolParamsError(parsed.error.issues.map((issue) => ({
161
+ path: issue.path.map((step) => typeof step === "number" ? step : String(step)),
162
+ message: issue.message,
163
+ })));
164
+ }
150
165
  const p = parsed.data;
151
166
  switch (p.action) {
152
167
  case "register":