opencode-agent-meetup 0.1.0-beta.1 → 0.1.0-beta.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
@@ -15,23 +15,37 @@ Requires OpenCode V2 2.0.31 or later.
15
15
 
16
16
  ## Use
17
17
 
18
- 1. In the session you want to share, run `/meetup-host`. The plugin shows an invite like `https://<route>.<id>.opentunnel.xyz/#<token>` and copies it to the clipboard when the terminal allows it.
19
- 2. Send the invite to your coworker. In their session, they run `/meetup-join` and paste it into the dialog (or pass it inline: `/meetup-join <invite>`).
18
+ 1. In the session you want to share, run `/meetup-host`. A dialog shows the invite, with a **Copy** button.
19
+ 2. Send the invite to your coworker. In their session, they run `/meetup-join` and paste it into the dialog.
20
20
  3. Either agent can now call `meetup_send` to message the other. You approve every outgoing message. Incoming messages show up in the session as `<peer>: <message>` and start a turn, so the other agent answers on its own.
21
- 4. Run `/meetup-leave` to end it. Unloading the plugin also ends every meetup.
21
+ 4. The host runs `/meetup-end` to close the meetup. The guest runs `/meetup-leave` to drop out; the invite keeps working until the host ends it. Unloading the plugin also ends every meetup.
22
22
 
23
- Joins, leaves, and failures show as toasts. Each meetup belongs to one session and allows one guest.
23
+ The commands follow the session's state: `/meetup-host` and `/meetup-join` outside a meetup, `/meetup-end` while hosting, `/meetup-leave` while joined. Joins, leaves, and failures show as toasts. Each meetup belongs to one session and allows one guest.
24
24
 
25
25
  The commands come from the plugin's TUI part, which OpenCode loads automatically with the package.
26
26
 
27
27
  ## How it works
28
28
 
29
- The host runs a small HTTP server on `127.0.0.1` and exposes it through [OpenTunnel](https://github.com/anomalyco/opentunnel). It claims a random route on the device's tunnel, the same tunnel `opencode pair --remote` uses. TLS ends on the host's machine, so the relay can't read the messages. The guest only makes outgoing requests and long-polls for replies, so only the host is reachable from the internet.
29
+ The host runs a small HTTP message server. The guest only makes outgoing requests: it posts messages and long-polls for replies, so only the host has to be reachable. Every request carries the invite token, and the first guest to join claims the meetup.
30
30
 
31
- The tunnel only reaches this plugin's message server. Your OpenCode server, files, and shell are not exposed. Anyone with the invite can message the session until you leave, so share it the way you'd share a password.
31
+ Only this message server is exposed. Your OpenCode server, files, and shell are not. Anyone with the invite can message the session until the host ends the meetup, so share it the way you'd share a password.
32
+
33
+ The `tunnel` option picks how the guest reaches the host's server.
34
+
35
+ ### OpenTunnel (default)
36
+
37
+ For coworkers anywhere. The server listens on `127.0.0.1`, and the plugin claims a random route on the device's [OpenTunnel](https://github.com/anomalyco/opentunnel) tunnel, the same tunnel `opencode pair --remote` uses. The invite looks like `https://<route>.<id>.opentunnel.xyz/#<token>`.
38
+
39
+ TLS ends on the host's machine, so the OpenTunnel relay can't read the messages. The random route keeps the URL hard to guess, but the token is what grants access.
32
40
 
33
41
  The first `/meetup-host` on a machine creates the tunnel and its certificate, which can take about a minute.
34
42
 
43
+ ### Tailscale
44
+
45
+ For devices on the same tailnet. The server listens only on this device's Tailscale address (from `tailscale ip -4`), so nothing outside your tailnet can reach it. The invite looks like `http://100.x.y.z:<port>/#<token>`.
46
+
47
+ It's plain http because Tailscale already encrypts traffic between devices. The guest accepts http invites only for loopback and Tailscale addresses (`100.64.0.0/10` and `*.ts.net`); everything else must be https. Both devices need Tailscale connected, and the host needs the `tailscale` CLI (the macOS app's bundled CLI works too).
48
+
35
49
  ## Trust
36
50
 
37
51
  The plugin starts locked down:
@@ -56,7 +70,7 @@ To approve every outgoing message automatically:
56
70
  "plugins": [
57
71
  {
58
72
  "package": "opencode-agent-meetup",
59
- "options": { "name": "victor", "wake": true, "tunnel": true }
73
+ "options": { "name": "victor", "wake": true, "tunnel": "opentunnel" }
60
74
  }
61
75
  ]
62
76
  }
@@ -64,11 +78,11 @@ To approve every outgoing message automatically:
64
78
 
65
79
  - `name`: the name your peer sees. Defaults to your OS username.
66
80
  - `wake`: let incoming messages start a turn so the agents can talk back and forth on their own. Defaults to `true`. Set it to `false` to have messages wait for your next prompt.
67
- - `tunnel`: set to `false` to skip OpenTunnel and give out a `http://127.0.0.1` invite. Useful for testing with two sessions on one machine.
81
+ - `tunnel`: how guests reach you. `"opentunnel"` (default) or `"tailscale"`; see [How it works](#how-it-works). `"local"` gives out a `http://127.0.0.1` invite for testing with two sessions on one machine.
68
82
 
69
83
  ## Local Development
70
84
 
71
- This package includes `.opencode/plugins/agent-meetup.ts`, so OpenCode loads the local source when you run it from the package directory.
85
+ This package includes `.opencode/plugins/agent-meetup/`, so OpenCode loads the local source when you run it from the package directory.
72
86
 
73
87
  ```sh
74
88
  bun install
package/dist/host.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export interface HostInput {
2
+ readonly hostname: string;
2
3
  readonly name: string;
3
4
  readonly token: string;
4
5
  readonly onJoin: (peer: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../plugin/src/host.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACxD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAA;AAaxD,wBAAsB,SAAS,CAAC,KAAK,EAAE,SAAS;;;eA6FjC,MAAM;;GAoBpB"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../plugin/src/host.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACxD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAA;AAaxD,wBAAsB,SAAS,CAAC,KAAK,EAAE,SAAS;;;eA6FjC,MAAM;;GAoBpB"}
package/dist/host.js CHANGED
@@ -99,7 +99,7 @@ export async function startHost(input) {
99
99
  });
100
100
  await new Promise((resolve, reject) => {
101
101
  server.once("error", reject);
102
- server.listen(0, "127.0.0.1", () => resolve());
102
+ server.listen(0, input.hostname, () => resolve());
103
103
  });
104
104
  return {
105
105
  port: server.address().port,
package/dist/host.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../plugin/src/host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../plugin/src/host.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export interface Invite {
12
12
  readonly url: string;
13
13
  readonly token: string;
14
14
  }
15
+ export declare function isTailscale(hostname: string): boolean;
15
16
  export declare function formatInvite(invite: Invite): string;
16
17
  export declare function parseInvite(value: string): Invite;
17
18
  export declare function cleanName(value: unknown): string;
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../plugin/src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAS,CAAA;AACxC,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,UAE1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,UAIvC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKhD"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../plugin/src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAS,CAAA;AACxC,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAMD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,WAI3C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,UAE1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,UAIvC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKhD"}
package/dist/protocol.js CHANGED
@@ -1,6 +1,14 @@
1
1
  export const MAX_MESSAGE_LENGTH = 16_000;
2
2
  export const POLL_TIMEOUT_MS = 25_000;
3
3
  const LOOPBACK = new Set(["127.0.0.1", "localhost", "[::1]"]);
4
+ // Tailscale addresses come from 100.64.0.0/10, and MagicDNS names end in .ts.net. WireGuard already
5
+ // encrypts that traffic, so plain http is fine there.
6
+ export function isTailscale(hostname) {
7
+ if (hostname.endsWith(".ts.net"))
8
+ return true;
9
+ const parts = hostname.split(".").map(Number);
10
+ return parts.length === 4 && parts.every((part) => Number.isInteger(part)) && parts[0] === 100 && parts[1] >= 64 && parts[1] <= 127;
11
+ }
4
12
  export function formatInvite(invite) {
5
13
  return `${invite.url}/#${invite.token}`;
6
14
  }
@@ -15,8 +23,8 @@ export function parseInvite(value) {
15
23
  const token = url.hash.slice(1);
16
24
  if (!token)
17
25
  throw new Error("Invalid meetup invite: missing token after #");
18
- if (url.protocol !== "https:" && !(url.protocol === "http:" && LOOPBACK.has(url.hostname)))
19
- throw new Error("Invalid meetup invite: only https URLs are allowed, except on loopback");
26
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && (LOOPBACK.has(url.hostname) || isTailscale(url.hostname))))
27
+ throw new Error("Invalid meetup invite: only https URLs are allowed, except on loopback and Tailscale");
20
28
  return { url: url.origin, token };
21
29
  }
22
30
  export function cleanName(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../plugin/src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAA;AAiBrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAE7D,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAC3E,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxF,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;IAC3F,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1E,OAAO,IAAI,IAAI,MAAM,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IACxG,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB;QACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,kBAAkB,aAAa,CAAC,CAAA;IACpF,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../plugin/src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAA;AAiBrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAE7D,oGAAoG;AACpG,sDAAsD;AACtD,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAE,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAE,IAAI,GAAG,CAAA;AACvI,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAC3E,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvH,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;IACzG,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAA;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1E,OAAO,IAAI,IAAI,MAAM,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IACxG,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB;QACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,kBAAkB,aAAa,CAAC,CAAA;IACpF,OAAO,KAAK,CAAA;AACd,CAAC"}
package/dist/rpc.d.ts CHANGED
@@ -1,6 +1,27 @@
1
1
  export declare const Meetup: {
2
2
  readonly id: "agent-meetup";
3
3
  readonly methods: {
4
+ readonly status: {
5
+ readonly input: {
6
+ readonly type: "object";
7
+ readonly properties: {
8
+ readonly sessionID: {
9
+ readonly type: "string";
10
+ };
11
+ };
12
+ readonly required: readonly ["sessionID"];
13
+ readonly additionalProperties: false;
14
+ };
15
+ readonly output: {
16
+ readonly type: "object";
17
+ readonly properties: {
18
+ readonly error: {
19
+ readonly type: "string";
20
+ };
21
+ };
22
+ readonly additionalProperties: false;
23
+ };
24
+ };
4
25
  readonly host: {
5
26
  readonly input: {
6
27
  readonly type: "object";
@@ -76,9 +97,13 @@ export declare const Meetup: {
76
97
  readonly sessionID: {
77
98
  readonly type: "string";
78
99
  };
100
+ readonly role: {
101
+ readonly type: "string";
102
+ readonly enum: readonly ["host", "guest", "none"];
103
+ };
79
104
  readonly kind: {
80
105
  readonly type: "string";
81
- readonly enum: readonly ["joined", "left", "ended", "paused"];
106
+ readonly enum: readonly ["opened", "joined", "left", "ended", "closed", "paused"];
82
107
  };
83
108
  readonly peer: {
84
109
  readonly type: "string";
@@ -87,21 +112,23 @@ export declare const Meetup: {
87
112
  readonly type: "string";
88
113
  };
89
114
  };
90
- readonly required: readonly ["sessionID", "kind"];
115
+ readonly required: readonly ["sessionID", "role", "kind"];
91
116
  readonly additionalProperties: false;
92
117
  };
93
118
  };
94
119
  };
95
120
  };
121
+ export type MeetupRole = "host" | "guest" | "none";
96
122
  export type MeetupResult = {
97
123
  error?: string;
98
124
  invite?: string;
99
125
  peer?: string;
100
- left?: boolean;
126
+ role?: MeetupRole;
101
127
  };
102
128
  export type MeetupChanged = {
103
129
  sessionID: string;
104
- kind: "joined" | "left" | "ended" | "paused";
130
+ role: MeetupRole;
131
+ kind: "opened" | "joined" | "left" | "ended" | "closed" | "paused";
105
132
  peer?: string;
106
133
  reason?: string;
107
134
  };
package/dist/rpc.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../plugin/src/rpc.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BjB,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAE7F,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../plugin/src/rpc.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCjB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,CAAA;AAEhG,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAClE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA"}
package/dist/rpc.js CHANGED
@@ -5,6 +5,7 @@ const session = {
5
5
  required: ["sessionID"],
6
6
  additionalProperties: false,
7
7
  };
8
+ const role = { type: "string", enum: ["host", "guest", "none"] };
8
9
  // Expected failures come back as `error` instead of RPC errors so the TUI can show them as-is.
9
10
  const result = (properties) => ({
10
11
  type: "object",
@@ -14,6 +15,7 @@ const result = (properties) => ({
14
15
  export const Meetup = Rpc.define({
15
16
  id: "agent-meetup",
16
17
  methods: {
18
+ status: { input: session, output: result({ role, peer: { type: "string" } }) },
17
19
  host: { input: session, output: result({ invite: { type: "string" } }) },
18
20
  join: {
19
21
  input: {
@@ -24,7 +26,7 @@ export const Meetup = Rpc.define({
24
26
  },
25
27
  output: result({ peer: { type: "string" } }),
26
28
  },
27
- leave: { input: session, output: result({ left: { type: "boolean" } }) },
29
+ leave: { input: session, output: result({ role }) },
28
30
  },
29
31
  events: {
30
32
  changed: {
@@ -32,11 +34,12 @@ export const Meetup = Rpc.define({
32
34
  type: "object",
33
35
  properties: {
34
36
  sessionID: { type: "string" },
35
- kind: { type: "string", enum: ["joined", "left", "ended", "paused"] },
37
+ role,
38
+ kind: { type: "string", enum: ["opened", "joined", "left", "ended", "closed", "paused"] },
36
39
  peer: { type: "string" },
37
40
  reason: { type: "string" },
38
41
  },
39
- required: ["sessionID", "kind"],
42
+ required: ["sessionID", "role", "kind"],
40
43
  additionalProperties: false,
41
44
  },
42
45
  },
package/dist/rpc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../plugin/src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAC7C,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,oBAAoB,EAAE,KAAK;CACnB,CAAA;AAEV,+FAA+F;AAC/F,MAAM,MAAM,GAAG,CAAC,UAAmC,EAAE,EAAE,CACrD,CAAC;IACC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,UAAU,EAAE;IACxD,oBAAoB,EAAE,KAAK;CAC5B,CAAU,CAAA;AAEb,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE;QACxE,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACzE,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACjC,oBAAoB,EAAE,KAAK;aAC5B;YACD,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC7C;QACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE;KACzE;IACD,MAAM,EAAE;QACN,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;oBACrE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;gBAC/B,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../plugin/src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAC7C,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,oBAAoB,EAAE,KAAK;CACnB,CAAA;AAEV,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAW,CAAA;AAEzE,+FAA+F;AAC/F,MAAM,MAAM,GAAG,CAAC,UAAmC,EAAE,EAAE,CACrD,CAAC;IACC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,UAAU,EAAE;IACxD,oBAAoB,EAAE,KAAK;CAC5B,CAAU,CAAA;AAEb,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE;QAC9E,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE;QACxE,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACzE,QAAQ,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACjC,oBAAoB,EAAE,KAAK;aAC5B;YACD,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC7C;QACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KACpD;IACD,MAAM,EAAE;QACN,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC7B,IAAI;oBACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACzF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC;gBACvC,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;CACF,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../plugin/src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAuCzC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAQxD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAGjD;;AAED,wBAmKE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../plugin/src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AA+CzC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAQxD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAGjD;;AAED,wBAgLE"}
package/dist/server.js CHANGED
@@ -5,7 +5,7 @@ import { joinHost } from "./guest.js";
5
5
  import { startHost } from "./host.js";
6
6
  import { cleanName, formatInvite, MAX_MESSAGE_LENGTH, parseInvite } from "./protocol.js";
7
7
  import { Meetup } from "./rpc.js";
8
- import { loopback, openTunnel } from "./tunnel.js";
8
+ import { expose, listenAddress } from "./tunnel.js";
9
9
  const TOOL_ID = "meetup_send";
10
10
  const SOURCE = "agent-meetup";
11
11
  // Agents that may answer each other on their own get this many turns before a user prompt resets the count.
@@ -26,6 +26,14 @@ function parseBoolean(name, value, fallback) {
26
26
  throw new Error(`opencode-agent-meetup ${name} option must be a boolean`);
27
27
  return value;
28
28
  }
29
+ const MODES = ["opentunnel", "tailscale", "local"];
30
+ function parseMode(value) {
31
+ if (value === undefined)
32
+ return "opentunnel";
33
+ if (MODES.includes(value))
34
+ return value;
35
+ throw new Error(`opencode-agent-meetup tunnel option must be one of ${MODES.map((mode) => `"${mode}"`).join(", ")}`);
36
+ }
29
37
  function message(error) {
30
38
  return error instanceof Error ? error.message : String(error);
31
39
  }
@@ -47,11 +55,16 @@ export default Plugin.define({
47
55
  id: "agent-meetup",
48
56
  async setup(ctx) {
49
57
  const name = cleanName(ctx.options.name ?? defaultName());
50
- const tunnel = parseBoolean("tunnel", ctx.options.tunnel, true);
58
+ const mode = parseMode(ctx.options.tunnel);
51
59
  const wake = parseBoolean("wake", ctx.options.wake, true);
52
60
  const meetups = new Map();
53
61
  const wakes = new Map();
62
+ const role = (sessionID) => meetups.get(sessionID)?.role ?? "none";
54
63
  const registration = await ctx.rpc.register(Meetup, {
64
+ status: async (input) => {
65
+ const meetup = meetups.get(input.sessionID);
66
+ return { role: meetup?.role ?? "none", peer: meetup?.peer() };
67
+ },
55
68
  host: async (input) => attempt(() => host(input.sessionID)),
56
69
  join: async (input) => {
57
70
  const { sessionID, invite } = input;
@@ -59,7 +72,7 @@ export default Plugin.define({
59
72
  },
60
73
  leave: async (input) => attempt(() => leave(input.sessionID)),
61
74
  });
62
- const emit = (event) => void registration.events.emit("changed", event).catch(() => undefined);
75
+ const emit = (event) => void registration.events.emit("changed", { ...event, role: role(event.sessionID) }).catch(() => undefined);
63
76
  const notice = (sessionID, description, text) => void ctx.session
64
77
  .synthetic({ sessionID, description, text, metadata: { source: SOURCE }, resume: false })
65
78
  .catch(() => undefined);
@@ -101,7 +114,9 @@ export default Plugin.define({
101
114
  const host = async (sessionID) => {
102
115
  busy(sessionID);
103
116
  const token = randomBytes(24).toString("base64url");
117
+ const hostname = await listenAddress(mode);
104
118
  const server = await startHost({
119
+ hostname,
105
120
  name,
106
121
  token,
107
122
  onJoin: (peer) => joined(sessionID, peer),
@@ -111,7 +126,7 @@ export default Plugin.define({
111
126
  emit({ sessionID, kind: "left", peer });
112
127
  },
113
128
  });
114
- const route = await (tunnel ? openTunnel(server.port) : Promise.resolve(loopback(server.port))).catch(async (error) => {
129
+ const route = await expose(mode, hostname, server.port).catch(async (error) => {
115
130
  await server.close();
116
131
  throw error;
117
132
  });
@@ -125,6 +140,7 @@ export default Plugin.define({
125
140
  await route.close();
126
141
  },
127
142
  });
143
+ emit({ sessionID, kind: "opened" });
128
144
  return { invite: formatInvite({ url: route.url, token }) };
129
145
  };
130
146
  const join = async (sessionID, invite) => {
@@ -146,11 +162,16 @@ export default Plugin.define({
146
162
  };
147
163
  const leave = async (sessionID) => {
148
164
  const meetup = meetups.get(sessionID);
165
+ if (!meetup)
166
+ return { role: "none" };
149
167
  meetups.delete(sessionID);
150
- await meetup?.close();
151
- if (meetup)
168
+ await meetup.close();
169
+ if (meetup.role === "host")
170
+ notice(sessionID, "You ended the meetup", "The user ended the meetup.");
171
+ else
152
172
  notice(sessionID, "You left the meetup", "The user left the meetup.");
153
- return { left: meetup !== undefined };
173
+ emit({ sessionID, kind: "closed" });
174
+ return { role: meetup.role };
154
175
  };
155
176
  await ctx.session.hook("prompt", (event) => {
156
177
  wakes.delete(event.sessionID);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../plugin/src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../plugin/src/server.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../plugin/src/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;;AAI7C,wBA+HE"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../plugin/src/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;;AAO7C,wBAoIE"}
package/dist/tui.js CHANGED
@@ -1,20 +1,23 @@
1
1
  import { Plugin } from "@opencode/plugin/tui";
2
+ import { createEffect } from "solid-js";
2
3
  import { Meetup } from "./rpc.js";
4
+ const SLOW_HOST_MS = 1_000;
3
5
  export default Plugin.define({
4
6
  id: "agent-meetup",
5
7
  setup(ctx) {
6
8
  const meetup = ctx.client.rpc(Meetup);
9
+ const [roles, updateRoles] = ctx.storage.memory("roles", { initial: {} });
10
+ const setRole = (sessionID, role) => updateRoles((draft) => void (draft[sessionID] = role));
7
11
  const toast = (options) => ctx.ui.toast.show({ title: "Meetup", ...options });
8
- async function current() {
12
+ const sessionID = () => {
9
13
  const route = ctx.ui.router.current();
10
- if (route.type !== "session") {
11
- toast({ variant: "warning", message: "Open a session first." });
12
- return;
13
- }
14
- if (!ctx.data.session.get(route.sessionID))
15
- await ctx.data.session.sync(route.sessionID);
16
- const location = ctx.data.session.get(route.sessionID)?.location;
17
- return { sessionID: route.sessionID, options: location ? { location } : undefined };
14
+ return route.type === "session" ? route.sessionID : undefined;
15
+ };
16
+ async function target(id) {
17
+ if (!ctx.data.session.get(id))
18
+ await ctx.data.session.sync(id);
19
+ const location = ctx.data.session.get(id)?.location;
20
+ return location ? { location } : undefined;
18
21
  }
19
22
  function failed(result) {
20
23
  if (!result.error)
@@ -22,104 +25,106 @@ export default Plugin.define({
22
25
  toast({ variant: "error", message: result.error });
23
26
  return true;
24
27
  }
25
- async function host() {
26
- const target = await current();
27
- if (!target)
28
- return;
29
- toast({ message: "Opening a tunnel. The first time can take a minute.", duration: 60_000 });
30
- const result = (await meetup.host({ sessionID: target.sessionID }, target.options));
28
+ async function refresh(id) {
29
+ const result = (await meetup.status({ sessionID: id }, await target(id)));
30
+ if (result.role)
31
+ setRole(id, result.role);
32
+ }
33
+ async function host(id) {
34
+ const options = await target(id);
35
+ // Tailscale and an existing tunnel answer at once; only a new OpenTunnel tunnel is worth a heads-up.
36
+ const slow = setTimeout(() => toast({ message: "Opening a tunnel. The first time can take a minute.", duration: 60_000 }), SLOW_HOST_MS);
37
+ const result = (await meetup.host({ sessionID: id }, options).finally(() => clearTimeout(slow)));
31
38
  if (failed(result) || !result.invite)
32
39
  return;
33
- const copied = ctx.renderer.copyToClipboardOSC52?.(result.invite) === true;
34
- toast({ variant: "success", message: copied ? "Meetup open. Invite copied to the clipboard." : "Meetup open." });
35
- await ctx.ui.dialog.alert({
40
+ setRole(id, "host");
41
+ const copy = await ctx.ui.dialog.confirm({
36
42
  title: "Meetup open",
37
43
  message: [
38
- "Share this invite with one coworker. They run /meetup-join and paste it.",
44
+ "Share with one coworker; they join with /meetup-join.",
39
45
  "",
40
46
  result.invite,
41
47
  "",
42
- "Anyone with the invite can message this session until you run /meetup-leave.",
48
+ "Anyone with it can message this session until you end it.",
43
49
  ].join("\n"),
50
+ label: { confirm: "Copy", cancel: "Close" },
44
51
  });
45
- }
46
- async function join(argument) {
47
- const target = await current();
48
- if (!target)
52
+ if (!copy)
49
53
  return;
50
- const invite = argument?.trim() ||
51
- (await ctx.ui.dialog.prompt({
52
- title: "Join a meetup",
53
- description: "Paste the invite your coworker shared.",
54
- placeholder: "https://….opentunnel.xyz/#…",
55
- }))?.trim();
54
+ if (ctx.renderer.copyToClipboardOSC52?.(result.invite))
55
+ toast({ variant: "success", message: "Invite copied." });
56
+ else
57
+ toast({ variant: "warning", message: "This terminal doesn't support copying. Select the invite instead." });
58
+ }
59
+ async function join(id) {
60
+ const invite = (await ctx.ui.dialog.prompt({
61
+ title: "Join a meetup",
62
+ description: "Paste the invite your coworker shared.",
63
+ placeholder: "https://….opentunnel.xyz/#…",
64
+ }))?.trim();
56
65
  if (!invite)
57
66
  return;
58
- const result = (await meetup.join({ sessionID: target.sessionID, invite }, target.options));
67
+ const result = (await meetup.join({ sessionID: id, invite }, await target(id)));
59
68
  if (failed(result))
60
69
  return;
70
+ setRole(id, "guest");
61
71
  toast({ variant: "success", message: `Joined ${result.peer}'s meetup.` });
62
72
  }
63
- async function leave() {
64
- const target = await current();
65
- if (!target)
66
- return;
67
- const result = (await meetup.leave({ sessionID: target.sessionID }, target.options));
73
+ async function leave(id) {
74
+ const result = (await meetup.leave({ sessionID: id }, await target(id)));
68
75
  if (failed(result))
69
76
  return;
70
- toast({ message: result.left ? "You left the meetup." : "This session has no meetup." });
77
+ setRole(id, "none");
78
+ if (result.role === "host")
79
+ toast({ message: "Meetup ended." });
80
+ if (result.role === "guest")
81
+ toast({ message: "You left the meetup." });
71
82
  }
72
- const run = (action) => () => action().catch((error) => {
73
- toast({ variant: "error", message: error instanceof Error ? error.message : String(error) });
74
- });
83
+ const run = (action) => () => {
84
+ const id = sessionID();
85
+ if (!id)
86
+ return toast({ variant: "warning", message: "Open a session first." });
87
+ action(id).catch((error) => {
88
+ toast({ variant: "error", message: error instanceof Error ? error.message : String(error) });
89
+ });
90
+ };
75
91
  const stopChanged = meetup.events.on("changed", (event) => {
76
92
  const data = event.data;
93
+ setRole(data.sessionID, data.role);
77
94
  const title = ctx.data.session.get(data.sessionID)?.title;
78
95
  const suffix = title ? ` in ${title}` : "";
79
- if (data.kind === "joined")
96
+ if (data.kind === "joined" && data.role === "host")
80
97
  toast({ variant: "success", message: `${data.peer} joined the meetup${suffix}.` });
81
98
  if (data.kind === "left")
82
99
  toast({ variant: "warning", message: `${data.peer} left the meetup${suffix}.` });
83
100
  if (data.kind === "ended")
84
101
  toast({ variant: "warning", message: `${data.reason ?? "Meetup ended"}${suffix}.` });
85
102
  if (data.kind === "paused")
86
- toast({
87
- variant: "warning",
88
- message: `Paused auto-replies to ${data.peer}${suffix}. Send a prompt to let the agents continue.`,
89
- });
103
+ toast({ variant: "warning", message: `Paused auto-replies to ${data.peer}${suffix}. Send a prompt to resume.` });
90
104
  });
105
+ const commands = (role) => {
106
+ if (role === "host")
107
+ return [{ id: "agent-meetup.end", title: "End the meetup", group: "Meetup", palette: true, slash: { name: "meetup-end" }, run: run(leave) }];
108
+ if (role === "guest")
109
+ return [{ id: "agent-meetup.leave", title: "Leave the meetup", group: "Meetup", palette: true, slash: { name: "meetup-leave" }, run: run(leave) }];
110
+ return [
111
+ { id: "agent-meetup.host", title: "Host a meetup", group: "Meetup", palette: true, slash: { name: "meetup-host" }, run: run(host) },
112
+ { id: "agent-meetup.join", title: "Join a meetup", group: "Meetup", palette: true, slash: { name: "meetup-join" }, run: run(join) },
113
+ ];
114
+ };
91
115
  const stopSlot = ctx.ui.slot({
92
116
  append: "app",
93
117
  render() {
94
- ctx.keymap.layer(() => ({
95
- mode: "global",
96
- commands: [
97
- {
98
- id: "agent-meetup.host",
99
- title: "Host a meetup",
100
- group: "Meetup",
101
- palette: true,
102
- slash: { name: "meetup-host" },
103
- run: run(host),
104
- },
105
- {
106
- id: "agent-meetup.join",
107
- title: "Join a meetup",
108
- group: "Meetup",
109
- palette: true,
110
- slash: { name: "meetup-join", arguments: true },
111
- run: (input) => run(() => join(input))(),
112
- },
113
- {
114
- id: "agent-meetup.leave",
115
- title: "Leave the meetup",
116
- group: "Meetup",
117
- palette: true,
118
- slash: { name: "meetup-leave" },
119
- run: run(leave),
120
- },
121
- ],
122
- }));
118
+ // A TUI that starts while the server already has a meetup learns the role on first visit.
119
+ createEffect(() => {
120
+ const id = sessionID();
121
+ if (id && roles[id] === undefined)
122
+ void refresh(id).catch(() => undefined);
123
+ });
124
+ ctx.keymap.layer(() => {
125
+ const id = sessionID();
126
+ return { mode: "global", commands: commands(id ? roles[id] : undefined) };
127
+ });
123
128
  return null;
124
129
  },
125
130
  });
package/dist/tui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../plugin/src/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../plugin/src/tui.ts"],"names":[],"mappings":"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"}
package/dist/tunnel.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export interface Tunnel {
1
+ export type Mode = "opentunnel" | "tailscale" | "local";
2
+ export interface Exposure {
2
3
  readonly url: string;
3
4
  readonly close: () => Promise<void>;
4
5
  }
5
- export declare function openTunnel(port: number): Promise<Tunnel>;
6
- export declare function loopback(port: number): Tunnel;
6
+ export declare function listenAddress(mode: Mode): Promise<string>;
7
+ export declare function expose(mode: Mode, hostname: string, port: number): Promise<Exposure>;
7
8
  //# sourceMappingURL=tunnel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C"}
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,IAAI,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAA;AAEvD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,mBAG7C;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAG1F"}
package/dist/tunnel.js CHANGED
@@ -1,7 +1,20 @@
1
+ import { execFile } from "node:child_process";
1
2
  import { randomBytes } from "node:crypto";
3
+ // Where the message server listens. Only Tailscale listens on a non-loopback address, and only on the
4
+ // device's Tailscale address, so the server is never reachable from other networks.
5
+ export async function listenAddress(mode) {
6
+ if (mode !== "tailscale")
7
+ return "127.0.0.1";
8
+ return tailscaleAddress();
9
+ }
10
+ export async function expose(mode, hostname, port) {
11
+ if (mode === "opentunnel")
12
+ return openTunnel(port);
13
+ return { url: `http://${hostname}:${port}`, close: async () => { } };
14
+ }
2
15
  // Shares the device's OpenTunnel tunnel (the same one `opencode pair --remote` uses) and claims a
3
16
  // random route on it. The route keeps the URL unguessable; the invite token is the actual auth.
4
- export async function openTunnel(port) {
17
+ async function openTunnel(port) {
5
18
  const { create } = await import("@opentunnel/client");
6
19
  const client = create();
7
20
  const route = randomBytes(8).toString("hex");
@@ -20,7 +33,17 @@ export async function openTunnel(port) {
20
33
  throw error;
21
34
  }
22
35
  }
23
- export function loopback(port) {
24
- return { url: `http://127.0.0.1:${port}`, close: async () => { } };
36
+ // The macOS app ships its CLI inside the bundle and doesn't always put `tailscale` on PATH.
37
+ const TAILSCALE = ["tailscale", "/Applications/Tailscale.app/Contents/MacOS/Tailscale"];
38
+ async function tailscaleAddress() {
39
+ for (const command of TAILSCALE) {
40
+ const output = await new Promise((resolve) => {
41
+ execFile(command, ["ip", "-4"], { timeout: 5_000 }, (error, stdout) => resolve(error ? undefined : stdout));
42
+ });
43
+ const address = output?.split("\n").map((line) => line.trim()).find(Boolean);
44
+ if (address)
45
+ return address;
46
+ }
47
+ throw new Error("Couldn't get this device's Tailscale address. Is Tailscale installed and connected?");
25
48
  }
26
49
  //# sourceMappingURL=tunnel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAOzC,kGAAkG;AAClG,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5F,OAAO;YACL,GAAG,EAAE,WAAW,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;YACrD,KAAK,CAAC,KAAK;gBACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBAC/C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC/C,CAAC;SACF,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,EAAE,GAAG,EAAE,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAA;AACnE,CAAC"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AASzC,sGAAsG;AACtG,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,WAAW,CAAA;IAC5C,OAAO,gBAAgB,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAU,EAAE,QAAgB,EAAE,IAAY;IACrE,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;IAClD,OAAO,EAAE,GAAG,EAAE,UAAU,QAAQ,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAA;AACrE,CAAC;AAED,kGAAkG;AAClG,gGAAgG;AAChG,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5F,OAAO;YACL,GAAG,EAAE,WAAW,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;YACrD,KAAK,CAAC,KAAK;gBACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBAC/C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC/C,CAAC;SACF,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAA;AAEvF,KAAK,UAAU,gBAAgB;IAC7B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;YAC/D,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7G,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5E,IAAI,OAAO;YAAE,OAAO,OAAO,CAAA;IAC7B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAA;AACxG,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-agent-meetup",
4
- "version": "0.1.0-beta.1",
4
+ "version": "0.1.0-beta.2",
5
5
  "description": "OpenCode plugin that lets your agent message a coworker's agent over an OpenTunnel link.",
6
6
  "type": "module",
7
7
  "main": "./dist/server.js",