@log0u7/opencode-mesh 0.3.0 → 0.4.1
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/CHANGELOG.md +42 -0
- package/README.md +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +2 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +6 -1
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +8 -1
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/discovery.d.ts +2 -0
- package/dist/lib/discovery.d.ts.map +1 -1
- package/dist/lib/discovery.js +6 -3
- package/dist/lib/discovery.js.map +1 -1
- package/dist/lib/identity.d.ts +10 -0
- package/dist/lib/identity.d.ts.map +1 -1
- package/dist/lib/identity.js +93 -12
- package/dist/lib/identity.js.map +1 -1
- package/dist/lib/peers.d.ts +4 -1
- package/dist/lib/peers.d.ts.map +1 -1
- package/dist/lib/peers.js +68 -10
- package/dist/lib/peers.js.map +1 -1
- package/dist/lib/serve.js +11 -5
- package/dist/lib/serve.js.map +1 -1
- package/dist/lib/worktree.d.ts +0 -1
- package/dist/lib/worktree.d.ts.map +1 -1
- package/dist/lib/worktree.js +0 -6
- package/dist/lib/worktree.js.map +1 -1
- package/dist/options.d.ts +13 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +64 -0
- package/dist/options.js.map +1 -0
- package/dist/plugin-v2.d.ts.map +1 -1
- package/dist/plugin-v2.js +2 -1
- package/dist/plugin-v2.js.map +1 -1
- package/dist/plugin.d.ts +4 -12
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +15 -62
- package/dist/plugin.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +9 -2
- package/dist/tools.js.map +1 -1
- package/dist/types/peer.d.ts +2 -0
- package/dist/types/peer.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.1] - 2026-10-24
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- The package loads under OpenCode 2 again. The v1 implementation imports
|
|
15
|
+
`@opencode-ai/plugin`, which only v1 hosts resolve, and it sat in the static
|
|
16
|
+
import graph, so v2 hosts rejected the whole plugin at load time
|
|
17
|
+
(`Cannot find package '@opencode-ai/plugin'`). The v1 entry is now loaded
|
|
18
|
+
lazily from `server()`: a v2 host never calls `server()` and therefore never
|
|
19
|
+
resolves the v1-only packages. The named `MeshPlugin` export is type-only.
|
|
20
|
+
- The v1 worktree REST factory moved from `lib/worktree.ts` into `plugin.ts`
|
|
21
|
+
for the same reason: it imports `@opencode-ai/sdk/v2`, which must stay out
|
|
22
|
+
of the static import graph too. Shared option plumbing moved to
|
|
23
|
+
`options.ts`, imported by both adapters.
|
|
24
|
+
- `smoke:dist` now audits the static import graph of `dist/`: no
|
|
25
|
+
`@opencode-ai/*` import may be reachable statically, `plugin.js` must only
|
|
26
|
+
be reached through a dynamic `import()`, and every other bare import must
|
|
27
|
+
be `@opencode/plugin`, a Node builtin, or a declared runtime dependency.
|
|
28
|
+
|
|
29
|
+
## [0.4.0] - 2026-10-14
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Signed pairing offers close the pending-token rebind window (Closes #30).
|
|
34
|
+
Each node keeps an Ed25519 keypair in `node.json` (generated on first run or
|
|
35
|
+
on migration; the `node_id` is preserved). Pairing offers carry the emitter's
|
|
36
|
+
public key (`pk`), completing a pairing pins it, mDNS TXT advertises it, and
|
|
37
|
+
every outgoing mail carries a pairing proof (`<pk>.<signature>` over
|
|
38
|
+
`opencode-mesh-pair:<node_id>:<token>`). A pending token now binds (or
|
|
39
|
+
rotates) a peer row only with a valid proof from the pinned key: a leaked
|
|
40
|
+
offer alone can no longer take over a paired peer's credential. Peers paired
|
|
41
|
+
without a pinned key (0.3.0-era rows, or completions without `pk`) refuse
|
|
42
|
+
remote rebinding: re-run `mesh_pair` to rotate them. `peers` gains a
|
|
43
|
+
`public_key` column (schema version 2, migrated in place).
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
|
|
47
|
+
- Peer addresses in the IPv4-mapped IPv6 form (`[::ffff:192.168.1.10]:4399`)
|
|
48
|
+
are accepted, so a dual-stack resolver's reported address no longer leaves
|
|
49
|
+
its peer unreachable ("no known address with a port"). Portless and
|
|
50
|
+
empty-zone forms stay rejected.
|
|
51
|
+
|
|
10
52
|
## [0.3.0] - 2026-10-14
|
|
11
53
|
|
|
12
54
|
### Added
|
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -5,16 +5,22 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @packageDocumentation
|
|
7
7
|
*/
|
|
8
|
+
type V1Plugin = typeof import("./plugin.js").MeshPlugin;
|
|
8
9
|
/**
|
|
9
10
|
* Dual entrypoint: v1 hosts call `server()`, v2 hosts call `setup()`
|
|
10
11
|
* (see https://opencode.ai/v2/docs/build/plugins/migrate-v1).
|
|
12
|
+
*
|
|
13
|
+
* The v1 implementation imports `@opencode-ai/plugin` and `@opencode-ai/sdk`,
|
|
14
|
+
* which only v1 hosts resolve. It must stay out of the static import graph or
|
|
15
|
+
* v2 hosts reject the whole package at load time, so `server()` loads it
|
|
16
|
+
* lazily; a v2 host never calls `server()` and therefore never resolves it.
|
|
11
17
|
*/
|
|
12
18
|
export declare const pluginModule: {
|
|
13
19
|
id: string;
|
|
14
20
|
setup: (context: import("@opencode/plugin/promise/plugin").Context) => Promise<import("@opencode/plugin/promise/plugin").Cleanup | void> | import("@opencode/plugin/promise/plugin").Cleanup | void;
|
|
15
|
-
server: import("@opencode-ai/plugin").
|
|
21
|
+
server(input: import("@opencode-ai/plugin").PluginInput, options?: import("@opencode-ai/plugin").PluginOptions | undefined): Promise<Awaited<ReturnType<V1Plugin>>>;
|
|
16
22
|
};
|
|
17
23
|
export default pluginModule;
|
|
18
24
|
export type { Lock, MailMessage, Peer } from "./types/peer.js";
|
|
19
|
-
export { MeshPlugin } from "./plugin.js";
|
|
25
|
+
export type { MeshPlugin } from "./plugin.js";
|
|
20
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,KAAK,QAAQ,GAAG,cAAc,aAAa,EAAE,UAAU,CAAC;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY;;;iIAEsB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;CAIR,CAAC;eAE/D,YAAY;AAE3B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE/D,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,15 +6,21 @@
|
|
|
6
6
|
* @packageDocumentation
|
|
7
7
|
*/
|
|
8
8
|
import { MeshV2 } from "./plugin-v2.js";
|
|
9
|
-
import { MeshPlugin } from "./plugin.js";
|
|
10
9
|
/**
|
|
11
10
|
* Dual entrypoint: v1 hosts call `server()`, v2 hosts call `setup()`
|
|
12
11
|
* (see https://opencode.ai/v2/docs/build/plugins/migrate-v1).
|
|
12
|
+
*
|
|
13
|
+
* The v1 implementation imports `@opencode-ai/plugin` and `@opencode-ai/sdk`,
|
|
14
|
+
* which only v1 hosts resolve. It must stay out of the static import graph or
|
|
15
|
+
* v2 hosts reject the whole package at load time, so `server()` loads it
|
|
16
|
+
* lazily; a v2 host never calls `server()` and therefore never resolves it.
|
|
13
17
|
*/
|
|
14
18
|
export const pluginModule = {
|
|
15
19
|
...MeshV2,
|
|
16
|
-
server
|
|
20
|
+
async server(...args) {
|
|
21
|
+
const { MeshPlugin } = await import("./plugin.js");
|
|
22
|
+
return MeshPlugin(...args);
|
|
23
|
+
},
|
|
17
24
|
};
|
|
18
25
|
export default pluginModule;
|
|
19
|
-
export { MeshPlugin } from "./plugin.js";
|
|
20
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,MAAM;IACT,KAAK,CAAC,MAAM,CAAC,GAAG,IAA0B;QACxC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7B,CAAC;CAC0E,CAAC;AAE9E,eAAe,YAAY,CAAC"}
|
package/dist/lib/client.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type SendTarget = {
|
|
|
4
4
|
from: string;
|
|
5
5
|
subject: string;
|
|
6
6
|
body: string;
|
|
7
|
+
/** `<base64 spki>.<base64 ed25519 signature>` over node_id:token. */
|
|
8
|
+
proof?: string;
|
|
7
9
|
};
|
|
8
10
|
export type SendResult = "ok" | "unreachable" | "unauthorized" | "error";
|
|
9
11
|
export declare function sendMail(target: SendTarget): Promise<SendResult>;
|
package/dist/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;AAIzE,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BtE"}
|
package/dist/lib/client.js
CHANGED
|
@@ -8,7 +8,12 @@ export async function sendMail(target) {
|
|
|
8
8
|
"content-type": "application/json",
|
|
9
9
|
authorization: `Bearer ${target.token}`,
|
|
10
10
|
},
|
|
11
|
-
body: JSON.stringify({
|
|
11
|
+
body: JSON.stringify({
|
|
12
|
+
from: target.from,
|
|
13
|
+
subject: target.subject,
|
|
14
|
+
body: target.body,
|
|
15
|
+
...(target.proof !== undefined ? { proof: target.proof } : {}),
|
|
16
|
+
}),
|
|
12
17
|
signal: AbortSignal.timeout(5000),
|
|
13
18
|
});
|
|
14
19
|
if (response.ok) {
|
package/dist/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAYA,8EAA8E;AAC9E,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAkB;IAC/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,OAAO,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/lib/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAuEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW/C"}
|
package/dist/lib/db.js
CHANGED
|
@@ -3,7 +3,7 @@ import { dirname } from "node:path";
|
|
|
3
3
|
import { openSqlite } from "./sqlite.js";
|
|
4
4
|
// Bump when a schema change needs a migration step; the version anchors future
|
|
5
5
|
// migrations that cannot be expressed as idempotent `CREATE ... IF NOT EXISTS`.
|
|
6
|
-
const SCHEMA_VERSION =
|
|
6
|
+
const SCHEMA_VERSION = 2;
|
|
7
7
|
const SCHEMA = `
|
|
8
8
|
CREATE TABLE IF NOT EXISTS peers (
|
|
9
9
|
node_id TEXT PRIMARY KEY,
|
|
@@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS peers (
|
|
|
12
12
|
addresses TEXT NOT NULL DEFAULT '[]',
|
|
13
13
|
paired INTEGER NOT NULL DEFAULT 0,
|
|
14
14
|
token TEXT,
|
|
15
|
+
public_key TEXT,
|
|
15
16
|
last_seen INTEGER NOT NULL
|
|
16
17
|
);
|
|
17
18
|
CREATE TABLE IF NOT EXISTS messages (
|
|
@@ -58,6 +59,12 @@ function migrate(conn) {
|
|
|
58
59
|
// Every statement in SCHEMA is idempotent, so a version-0 database (fresh or
|
|
59
60
|
// pre-versioning) is brought up to date by re-running it.
|
|
60
61
|
conn.exec(SCHEMA);
|
|
62
|
+
// v2: pairing proofs are verified against a pinned public key, so peers gain
|
|
63
|
+
// the column. ALTER TABLE is not idempotent: guard it on the live schema.
|
|
64
|
+
const peerColumns = conn.all("PRAGMA table_info(peers)").map((row) => row.name);
|
|
65
|
+
if (!peerColumns.includes("public_key")) {
|
|
66
|
+
conn.exec("ALTER TABLE peers ADD COLUMN public_key TEXT");
|
|
67
|
+
}
|
|
61
68
|
conn.run(`PRAGMA user_version = ${SCHEMA_VERSION}`);
|
|
62
69
|
}
|
|
63
70
|
export function openMeshDb(path) {
|
package/dist/lib/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAC;AAO1D,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAC;AAO1D,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Cd,CAAC;AAEF,SAAS,OAAO,CAAC,IAAgB;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAA2B,qBAAqB,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC;IAC7F,IAAI,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAmB,0BAA0B,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/lib/discovery.d.ts
CHANGED
|
@@ -8,12 +8,14 @@ export declare function advertiseMesh(options: {
|
|
|
8
8
|
port: number;
|
|
9
9
|
node_id: string;
|
|
10
10
|
fingerprint: string;
|
|
11
|
+
public_key: string;
|
|
11
12
|
}): AdvertiseHandle;
|
|
12
13
|
export type DiscoveredPeer = {
|
|
13
14
|
node_id: string;
|
|
14
15
|
hostname: string;
|
|
15
16
|
fingerprint: string;
|
|
16
17
|
addresses: string[];
|
|
18
|
+
public_key?: string;
|
|
17
19
|
};
|
|
18
20
|
export declare function browseMesh(options: {
|
|
19
21
|
bonjour: Bonjour;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/lib/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAIF,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/lib/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAIF,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,eAAe,CAalB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC9C,GAAG;IAAE,KAAK,IAAI,IAAI,CAAA;CAAE,CAuBpB;AAsBD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAgC1D"}
|
package/dist/lib/discovery.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export const MESH_SERVICE_TYPE = "opencode-mesh";
|
|
2
|
-
// Advertise this node on the LAN. TXT carries
|
|
3
|
-
//
|
|
2
|
+
// Advertise this node on the LAN. TXT carries the node id, key fingerprint and
|
|
3
|
+
// the pairing public key (pk): never secrets.
|
|
4
4
|
export function advertiseMesh(options) {
|
|
5
5
|
const service = options.bonjour.publish({
|
|
6
6
|
name: options.node_id,
|
|
7
7
|
type: MESH_SERVICE_TYPE,
|
|
8
8
|
port: options.port,
|
|
9
|
-
txt: { id: options.node_id, fp: options.fingerprint },
|
|
9
|
+
txt: { id: options.node_id, fp: options.fingerprint, pk: options.public_key },
|
|
10
10
|
});
|
|
11
11
|
return {
|
|
12
12
|
close() {
|
|
@@ -26,6 +26,9 @@ export function browseMesh(options) {
|
|
|
26
26
|
hostname: service.host ?? service.name,
|
|
27
27
|
fingerprint: fp,
|
|
28
28
|
addresses: socketAddresses(service.addresses, service.port),
|
|
29
|
+
...(typeof service.txt?.pk === "string" && service.txt.pk.length > 0
|
|
30
|
+
? { public_key: service.txt.pk }
|
|
31
|
+
: {}),
|
|
29
32
|
});
|
|
30
33
|
});
|
|
31
34
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/lib/discovery.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAMjD
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/lib/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/identity.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
export type NodeIdentity = {
|
|
2
2
|
node_id: string;
|
|
3
3
|
hostname: string;
|
|
4
|
+
public_key: string;
|
|
5
|
+
private_key: string;
|
|
4
6
|
fingerprint: string;
|
|
5
7
|
};
|
|
6
8
|
export declare function loadOrCreateIdentity(dataDir: string): NodeIdentity;
|
|
9
|
+
export declare function pairingProofPayload(nodeId: string, token: string): string;
|
|
10
|
+
export declare function signPairingProof(privateKey: string, payload: string): string;
|
|
11
|
+
export declare function pairingProof(identity: {
|
|
12
|
+
node_id: string;
|
|
13
|
+
public_key: string;
|
|
14
|
+
private_key: string;
|
|
15
|
+
}, token: string): string;
|
|
16
|
+
export declare function verifyPairingProof(publicKey: string, payload: string, proof: string): boolean;
|
|
7
17
|
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAoBlE;AA+FD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO5E;AAGD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACtE,KAAK,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAW7F"}
|
package/dist/lib/identity.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
1
|
+
import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, randomUUID, sign, verify, } from "node:crypto";
|
|
2
2
|
import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { hostname as osHostname } from "node:os";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
@@ -6,15 +6,19 @@ export function loadOrCreateIdentity(dataDir) {
|
|
|
6
6
|
const file = join(dataDir, "node.json");
|
|
7
7
|
const existing = readIdentity(file);
|
|
8
8
|
if (existing) {
|
|
9
|
-
// A file written by <= 0.2.0 carries
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
9
|
+
// A file written by <= 0.2.0 carries either no keys or a dead Ed25519
|
|
10
|
+
// JWK keypair nothing ever used. The node keeps its node_id (peers stay
|
|
11
|
+
// recognised), and the file is rewritten to the canonical shape with a
|
|
12
|
+
// fresh signing keypair so pairing proofs can be produced.
|
|
13
13
|
if (existing.migrated)
|
|
14
14
|
writeIdentity(file, existing.identity);
|
|
15
15
|
return withFingerprint(existing.identity);
|
|
16
16
|
}
|
|
17
|
-
const identity = {
|
|
17
|
+
const identity = {
|
|
18
|
+
...freshKeys(),
|
|
19
|
+
node_id: randomUUID(),
|
|
20
|
+
hostname: hostName(),
|
|
21
|
+
};
|
|
18
22
|
writeIdentity(file, identity);
|
|
19
23
|
return withFingerprint(identity);
|
|
20
24
|
}
|
|
@@ -39,11 +43,22 @@ function readIdentity(file) {
|
|
|
39
43
|
if (typeof record.node_id !== "string" || record.node_id.length === 0) {
|
|
40
44
|
throw corrupt(file, "has no node_id");
|
|
41
45
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
const identity = {
|
|
47
|
+
node_id: record.node_id,
|
|
48
|
+
hostname: hostName(record.hostname),
|
|
49
|
+
public_key: typeof record.public_key === "string" ? record.public_key : "",
|
|
50
|
+
private_key: typeof record.private_key === "string" ? record.private_key : "",
|
|
45
51
|
};
|
|
52
|
+
const keysUsable = isSpki(identity.public_key) && isPkcs8(identity.private_key);
|
|
53
|
+
const migrated = !keysUsable || Object.keys(record).some((key) => !KNOWN_KEYS.has(key));
|
|
54
|
+
if (!keysUsable) {
|
|
55
|
+
// Replace dead or missing keys; the node_id above is never regenerated, so
|
|
56
|
+
// peers keep recognising this node through the migration.
|
|
57
|
+
Object.assign(identity, freshKeys());
|
|
58
|
+
}
|
|
59
|
+
return { identity, migrated };
|
|
46
60
|
}
|
|
61
|
+
const KNOWN_KEYS = new Set(["node_id", "hostname", "public_key", "private_key"]);
|
|
47
62
|
// A corrupt identity file would make the node silently mint a new id, breaking
|
|
48
63
|
// every peer that recognises it and orphaning queued mail. Refuse to start and
|
|
49
64
|
// hand the operator a recovery path instead of reminting behind their back.
|
|
@@ -51,6 +66,72 @@ function corrupt(file, why) {
|
|
|
51
66
|
return new Error(`identity file ${file} ${why}; refusing to mint a new node id. ` +
|
|
52
67
|
`Move it aside to start with a fresh identity: mv '${file}' '${file}.bak'`);
|
|
53
68
|
}
|
|
69
|
+
function freshKeys() {
|
|
70
|
+
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
71
|
+
return {
|
|
72
|
+
public_key: Buffer.from(publicKey.export({ type: "spki", format: "der" })).toString("base64"),
|
|
73
|
+
private_key: Buffer.from(privateKey.export({ type: "pkcs8", format: "der" })).toString("base64"),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function isSpki(value) {
|
|
77
|
+
try {
|
|
78
|
+
const key = createPublicKey({
|
|
79
|
+
key: Buffer.from(value, "base64"),
|
|
80
|
+
format: "der",
|
|
81
|
+
type: "spki",
|
|
82
|
+
});
|
|
83
|
+
// Only the algorithm we sign with: a hand-edited RSA key must not pass
|
|
84
|
+
// validation and then break `sign(null, ...)` at send time.
|
|
85
|
+
return key.asymmetricKeyType === "ed25519";
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function isPkcs8(value) {
|
|
92
|
+
try {
|
|
93
|
+
const key = createPrivateKey({
|
|
94
|
+
key: Buffer.from(value, "base64"),
|
|
95
|
+
format: "der",
|
|
96
|
+
type: "pkcs8",
|
|
97
|
+
});
|
|
98
|
+
return key.asymmetricKeyType === "ed25519";
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Pairing proofs: an Ed25519 signature binding the sender's node id to the
|
|
105
|
+
// token it presents. The canonical payload lives next to the signers so the
|
|
106
|
+
// sender and the verifier cannot drift.
|
|
107
|
+
export function pairingProofPayload(nodeId, token) {
|
|
108
|
+
return `opencode-mesh-pair:${nodeId}:${token}`;
|
|
109
|
+
}
|
|
110
|
+
export function signPairingProof(privateKey, payload) {
|
|
111
|
+
const key = createPrivateKey({
|
|
112
|
+
key: Buffer.from(privateKey, "base64"),
|
|
113
|
+
format: "der",
|
|
114
|
+
type: "pkcs8",
|
|
115
|
+
});
|
|
116
|
+
return Buffer.from(sign(null, Buffer.from(payload, "utf8"), key)).toString("base64");
|
|
117
|
+
}
|
|
118
|
+
// The wire form of a pairing proof: `<base64 spki>.<base64 signature>`.
|
|
119
|
+
export function pairingProof(identity, token) {
|
|
120
|
+
return `${identity.public_key}.${signPairingProof(identity.private_key, pairingProofPayload(identity.node_id, token))}`;
|
|
121
|
+
}
|
|
122
|
+
export function verifyPairingProof(publicKey, payload, proof) {
|
|
123
|
+
try {
|
|
124
|
+
const key = createPublicKey({
|
|
125
|
+
key: Buffer.from(publicKey, "base64"),
|
|
126
|
+
format: "der",
|
|
127
|
+
type: "spki",
|
|
128
|
+
});
|
|
129
|
+
return verify(null, Buffer.from(payload, "utf8"), key, Buffer.from(proof, "base64"));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
54
135
|
function writeIdentity(file, identity) {
|
|
55
136
|
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
56
137
|
// Atomic write: temp file + rename, so a crash never leaves a truncated record.
|
|
@@ -59,9 +140,9 @@ function writeIdentity(file, identity) {
|
|
|
59
140
|
renameSync(tmp, file);
|
|
60
141
|
chmodSync(file, 0o600);
|
|
61
142
|
}
|
|
62
|
-
// The
|
|
63
|
-
//
|
|
64
|
-
//
|
|
143
|
+
// The fingerprint stays derived from the node_id (not from the signing key):
|
|
144
|
+
// keys can be replaced on migration without shuffling the operator-facing
|
|
145
|
+
// label for `mesh_status`.
|
|
65
146
|
function withFingerprint(identity) {
|
|
66
147
|
return {
|
|
67
148
|
...identity,
|
package/dist/lib/identity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/peers.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type PeerInput = {
|
|
|
6
6
|
hostname: string;
|
|
7
7
|
fingerprint: string;
|
|
8
8
|
addresses?: string[];
|
|
9
|
+
public_key?: string;
|
|
9
10
|
};
|
|
10
11
|
export declare function pairWithToken(db: MeshDb, peer: {
|
|
11
12
|
node_id: string;
|
|
@@ -13,9 +14,10 @@ export declare function pairWithToken(db: MeshDb, peer: {
|
|
|
13
14
|
fingerprint: string;
|
|
14
15
|
token: string;
|
|
15
16
|
addresses?: string[];
|
|
17
|
+
public_key?: string;
|
|
16
18
|
}): void;
|
|
17
19
|
export declare function createPairingToken(db: MeshDb): string;
|
|
18
|
-
export declare function authenticateToken(db: MeshDb, token: string, from: string | null): Peer | null;
|
|
20
|
+
export declare function authenticateToken(db: MeshDb, token: string, from: string | null, proof?: string): Peer | null;
|
|
19
21
|
export declare function prunePendingTokens(db: MeshDb): void;
|
|
20
22
|
export declare function listPeers(db: MeshDb): Peer[];
|
|
21
23
|
export declare function findPeerById(db: MeshDb, nodeId: string): Peer | null;
|
|
@@ -31,5 +33,6 @@ export declare function upsertDiscoveredPeer(db: MeshDb, peer: {
|
|
|
31
33
|
hostname: string;
|
|
32
34
|
fingerprint: string;
|
|
33
35
|
addresses: string[];
|
|
36
|
+
public_key?: string;
|
|
34
37
|
}): void;
|
|
35
38
|
//# sourceMappingURL=peers.d.ts.map
|
package/dist/lib/peers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../src/lib/peers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"peers.d.ts","sourceRoot":"","sources":["../../src/lib/peers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAI7C,eAAO,MAAM,oBAAoB,QAAa,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAMF,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,IAAI,CAoBN;AAID,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOrD;AAMD,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,GAAG,IAAI,CA0Cb;AAyCD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,CAE5C;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGpE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGtE;AAGD,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAGvE;AAKD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQvE;AAQD,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,IAAI,CAkBN"}
|