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 +23 -9
- package/dist/host.d.ts +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +1 -1
- package/dist/host.js.map +1 -1
- package/dist/protocol.d.ts +1 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +10 -2
- package/dist/protocol.js.map +1 -1
- package/dist/rpc.d.ts +31 -4
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +6 -3
- package/dist/rpc.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +28 -7
- package/dist/server.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +79 -74
- package/dist/tui.js.map +1 -1
- package/dist/tunnel.d.ts +4 -3
- package/dist/tunnel.d.ts.map +1 -1
- package/dist/tunnel.js +26 -3
- package/dist/tunnel.js.map +1 -1
- package/package.json +1 -1
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`.
|
|
19
|
-
2. Send the invite to your coworker. In their session, they run `/meetup-join` and paste it into the dialog
|
|
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.
|
|
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
|
|
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
|
-
|
|
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":
|
|
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`:
|
|
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
|
|
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
package/dist/host.d.ts.map
CHANGED
|
@@ -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,
|
|
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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAA;AAEnF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,eAAe,EAA2B,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../plugin/src/host.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -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;
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -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;
|
|
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) {
|
package/dist/protocol.js.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
126
|
+
role?: MeetupRole;
|
|
101
127
|
};
|
|
102
128
|
export type MeetupChanged = {
|
|
103
129
|
sessionID: string;
|
|
104
|
-
|
|
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":"
|
|
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({
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../plugin/src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACxF,OAAO,EAAE,MAAM,
|
|
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;;
|
|
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
|
-
|
|
12
|
+
const sessionID = () => {
|
|
9
13
|
const route = ctx.ui.router.current();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
26
|
-
const
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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
|
|
44
|
+
"Share with one coworker; they join with /meetup-join.",
|
|
39
45
|
"",
|
|
40
46
|
result.invite,
|
|
41
47
|
"",
|
|
42
|
-
"Anyone with
|
|
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
|
-
|
|
51
|
-
(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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) => () =>
|
|
73
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../plugin/src/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,MAAM,EAA0D,MAAM,UAAU,CAAA;AAEzF,MAAM,YAAY,GAAG,KAAK,CAAA;AAE1B,eAAe,MAAM,CAAC,MAAM,CAAC;IAC3B,EAAE,EAAE,cAAc;IAClB,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAgC,EAAE,CAAC,CAAA;QACvG,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,IAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAC/G,MAAM,KAAK,GAAG,CAAC,OAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAE3F,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrC,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/D,CAAC,CAAA;QAED,KAAK,UAAU,MAAM,CAAC,EAAU;YAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAA;YACnD,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5C,CAAC;QAED,SAAS,MAAM,CAAC,MAAoB;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAA;YAC/B,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YAClD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,UAAU,OAAO,CAAC,EAAU;YAC/B,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAiB,CAAA;YACzF,IAAI,MAAM,CAAC,IAAI;gBAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3C,CAAC;QAED,KAAK,UAAU,IAAI,CAAC,EAAU;YAC5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAA;YAChC,qGAAqG;YACrG,MAAM,IAAI,GAAG,UAAU,CACrB,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qDAAqD,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EACjG,YAAY,CACb,CAAA;YACD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAiB,CAAA;YAChH,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAM;YAC5C,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YACnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;gBACvC,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE;oBACP,uDAAuD;oBACvD,EAAE;oBACF,MAAM,CAAC,MAAM;oBACb,EAAE;oBACF,2DAA2D;iBAC5D,CAAC,IAAI,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;aAC5C,CAAC,CAAA;YACF,IAAI,CAAC,IAAI;gBAAE,OAAM;YACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAA;;gBAC3G,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAA;QAClH,CAAC;QAED,KAAK,UAAU,IAAI,CAAC,EAAU;YAC5B,MAAM,MAAM,GAAG,CACb,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBACzB,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,wCAAwC;gBACrD,WAAW,EAAE,6BAA6B;aAC3C,CAAC,CACH,EAAE,IAAI,EAAE,CAAA;YACT,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAiB,CAAA;YAC/F,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAM;YAC1B,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACpB,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,KAAK,UAAU,KAAK,CAAC,EAAU;YAC7B,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAiB,CAAA;YACxF,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAM;YAC1B,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;YACnB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAA;YAC/D,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;gBAAE,KAAK,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,MAAqC,EAAE,EAAE,CAAC,GAAG,EAAE;YAC1D,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;YACtB,IAAI,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAA;YAC/E,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAClC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC9F,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAqB,CAAA;YACxC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;YACzD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAChD,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,qBAAqB,MAAM,GAAG,EAAE,CAAC,CAAA;YACpF,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,mBAAmB,MAAM,GAAG,EAAE,CAAC,CAAA;YAC1G,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC,CAAA;YAC/G,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;gBACxB,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,IAAI,CAAC,IAAI,GAAG,MAAM,4BAA4B,EAAE,CAAC,CAAA;QACpH,CAAC,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,CAAC,IAA4B,EAAmB,EAAE;YACjE,IAAI,IAAI,KAAK,MAAM;gBACjB,OAAO,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC9I,IAAI,IAAI,KAAK,OAAO;gBAClB,OAAO,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACpJ,OAAO;gBACL,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnI,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;aACpI,CAAA;QACH,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,KAAK;YACb,MAAM;gBACJ,0FAA0F;gBAC1F,YAAY,CAAC,GAAG,EAAE;oBAChB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;oBACtB,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,SAAS;wBAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBAC5E,CAAC,CAAC,CAAA;gBACF,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACpB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;oBACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAA;gBAC3E,CAAC,CAAC,CAAA;gBACF,OAAO,IAAI,CAAA;YACb,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAA;YACb,QAAQ,EAAE,CAAA;QACZ,CAAC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
package/dist/tunnel.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export
|
|
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
|
|
6
|
-
export declare function
|
|
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
|
package/dist/tunnel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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
|
package/dist/tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../plugin/src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
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.
|
|
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",
|