wokitoki 0.3.1 → 0.3.2

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,8 +10,10 @@ Your Claude Code talks to your friend's Claude Code (or Codex), directly, peer t
10
10
  No server. No account. No tunnel. Free and open source.
11
11
 
12
12
  [![CI](https://github.com/pandeyvishwas51-oss/wokitoki/actions/workflows/ci.yml/badge.svg)](https://github.com/pandeyvishwas51-oss/wokitoki/actions/workflows/ci.yml)
13
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/pandeyvishwas51-oss/wokitoki/badge)](https://scorecard.dev/viewer/?uri=github.com/pandeyvishwas51-oss/wokitoki)
13
14
  [![npm](https://img.shields.io/npm/v/wokitoki?color=FF5A1F)](https://www.npmjs.com/package/wokitoki)
14
15
  [![WokiToki MCP server on Glama](https://glama.ai/mcp/servers/pandeyvishwas51-oss/wokitoki/badges/score.svg)](https://glama.ai/mcp/servers/pandeyvishwas51-oss/wokitoki)
16
+ [![M8ven Score](https://m8ven.ai/badge/mcp/pandeyvishwas51-oss-wokitoki-atcfpk?v=f7bb2fa9b9dcfb420e5aafaf4712ed9e)](https://m8ven.ai/mcp/pandeyvishwas51-oss-wokitoki-atcfpk?s=readme)
15
17
  [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-FF5A1F)](https://github.com/pandeyvishwas51-oss/wokitoki/blob/main/LICENSE)
16
18
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.pandeyvishwas51--oss%2Fwokitoki-2B1306)](https://registry.modelcontextprotocol.io/v0/servers?search=wokitoki)
17
19
  [![Node 22.18+](https://img.shields.io/badge/node-22.18%2B-2B1306)](https://nodejs.org)
@@ -188,9 +190,11 @@ Every command accepts `--json` and `--home <dir>` (default `~/.wokitoki`). The o
188
190
 
189
191
  ```bash
190
192
  pnpm install
191
- pnpm check # strict TypeScript + 64 tests: unit, adversarial, P2P on a local DHT testnet, multi-process CLI e2e, real MCP calls
193
+ pnpm check # strict TypeScript + 65 tests: unit, adversarial, P2P on a local DHT testnet, multi-process CLI e2e, real MCP calls
192
194
  ```
193
195
 
196
+ Releases come only from CI: bump the version, tag `vX.Y.Z` on `main` and push the tag. [release.yml](https://github.com/pandeyvishwas51-oss/wokitoki/blob/main/.github/workflows/release.yml) stages it on npm with signed provenance (trusted publishing, no tokens) for a maintainer to approve with 2FA, attaches a build attestation and an SBOM to the GitHub release, and updates the MCP Registry.
197
+
194
198
  [Roadmap](https://github.com/pandeyvishwas51-oss/wokitoki/blob/main/ROADMAP.md): tasks, encrypted file transfer, multi-agent rooms and a web console are next. License: [Apache-2.0](https://github.com/pandeyvishwas51-oss/wokitoki/blob/main/LICENSE).
195
199
 
196
200
  <p align="center"><img src="https://raw.githubusercontent.com/pandeyvishwas51-oss/wokitoki/main/assets/logo.svg" width="72" alt="WokiToki mascot"></p>
package/dist/wokitoki.mjs CHANGED
@@ -281,7 +281,11 @@ var init_src2 = __esm({
281
281
  utf8 = new TextEncoder();
282
282
  strictUtf8 = new TextDecoder("utf-8", { fatal: true });
283
283
  toB64 = (u) => Buffer.from(u).toString("base64url");
284
- fromB64 = (s) => new Uint8Array(Buffer.from(s, "base64url"));
284
+ fromB64 = (s) => {
285
+ const bytes = new Uint8Array(Buffer.from(s, "base64url"));
286
+ if (Buffer.from(bytes).toString("base64url") !== s) throw new Error("invalid base64url: not in canonical form");
287
+ return bytes;
288
+ };
285
289
  toHex = (u) => Buffer.from(u).toString("hex");
286
290
  joinTranscript = (pairId, joiner) => utf8.encode(canonicalJson({ t: "agentmesh-pair-join-v1", pairId, joiner }));
287
291
  }
@@ -1912,7 +1916,8 @@ function createMcpServer(socketPath, version) {
1912
1916
  {
1913
1917
  title: "WokiToki status",
1914
1918
  description: "Show this WokiToki identity, network connection state (peer-to-peer or relay), pending outbox size and peer counts.",
1915
- annotations: { readOnlyHint: true, openWorldHint: false }
1919
+ inputSchema: {},
1920
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
1916
1921
  },
1917
1922
  () => guard(async () => ok(await daemon2("GET", "/status")))
1918
1923
  );
@@ -1922,7 +1927,7 @@ function createMcpServer(socketPath, version) {
1922
1927
  title: "List WokiToki peers",
1923
1928
  description: 'List agents this machine is paired with. Only peers in state "active" can receive messages. Pairing and approval are done by the human with the wokitoki CLI, not by this tool.',
1924
1929
  inputSchema: { state: z7.enum(["pending", "active", "rejected", "revoked"]).optional().describe("filter by pairing state") },
1925
- annotations: { readOnlyHint: true, openWorldHint: false }
1930
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
1926
1931
  },
1927
1932
  ({ state }) => guard(async () => ok((await daemon2("GET", `/peers${state ? `?state=${state}` : ""}`)).map(peerSummary)))
1928
1933
  );
@@ -1950,7 +1955,8 @@ function createMcpServer(socketPath, version) {
1950
1955
  limit: z7.number().int().min(1).max(200).optional().describe("max messages (default 50)"),
1951
1956
  markRead: z7.boolean().optional().describe("mark returned messages as read (default true)")
1952
1957
  },
1953
- annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false }
1958
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }
1959
+ // marks messages read
1954
1960
  },
1955
1961
  ({ peer, limit, markRead }) => guard(async () => {
1956
1962
  const q = new URLSearchParams({ unread: "1", limit: String(limit ?? 50), ...peer ? { peer } : {} });
@@ -1969,7 +1975,7 @@ function createMcpServer(socketPath, version) {
1969
1975
  peer: z7.string().max(128).optional().describe("only this peer (name or device id)"),
1970
1976
  limit: z7.number().int().min(1).max(200).optional().describe("max messages (default 20)")
1971
1977
  },
1972
- annotations: { readOnlyHint: true, openWorldHint: false }
1978
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }
1973
1979
  },
1974
1980
  ({ peer, limit }) => guard(async () => {
1975
1981
  const q = new URLSearchParams({ limit: String(limit ?? 20), ...peer ? { peer } : {} });
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "wokitoki",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "wokitoki",
9
- "version": "0.3.1",
9
+ "version": "0.3.2",
10
10
  "license": "Apache-2.0",
11
11
  "os": [
12
12
  "darwin",
@@ -790,9 +790,9 @@
790
790
  "license": "MIT"
791
791
  },
792
792
  "node_modules/fast-uri": {
793
- "version": "3.1.8",
794
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
795
- "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
793
+ "version": "3.1.9",
794
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz",
795
+ "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==",
796
796
  "funding": [
797
797
  {
798
798
  "type": "github",
@@ -1102,9 +1102,9 @@
1102
1102
  "license": "ISC"
1103
1103
  },
1104
1104
  "node_modules/jose": {
1105
- "version": "6.2.12",
1106
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.12.tgz",
1107
- "integrity": "sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==",
1105
+ "version": "6.2.13",
1106
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.13.tgz",
1107
+ "integrity": "sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==",
1108
1108
  "license": "MIT",
1109
1109
  "funding": {
1110
1110
  "url": "https://github.com/sponsors/panva"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wokitoki",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Walkie-talkies for AI coding agents: Claude Code and Codex message each other peer to peer, end-to-end encrypted, via MCP. No server, no account.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Vishwas Pandey",