opencode-router 0.11.77

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/.env.example ADDED
@@ -0,0 +1,23 @@
1
+ OPENCODE_URL=http://127.0.0.1:4096
2
+ OPENCODE_DIRECTORY=
3
+ OPENCODE_SERVER_USERNAME=
4
+ OPENCODE_SERVER_PASSWORD=
5
+
6
+ TELEGRAM_BOT_TOKEN=
7
+ TELEGRAM_ENABLED=true
8
+
9
+ SLACK_BOT_TOKEN=
10
+ SLACK_APP_TOKEN=
11
+ SLACK_ENABLED=true
12
+
13
+ OPENCODE_ROUTER_DATA_DIR=~/.openwork/opencode-router
14
+ OPENCODE_ROUTER_DB_PATH=~/.openwork/opencode-router/opencode-router.db
15
+ OPENCODE_ROUTER_CONFIG_PATH=~/.openwork/opencode-router/opencode-router.json
16
+ # Alias for OPENCODE_ROUTER_HEALTH_PORT (preferred name)
17
+ OPENCODE_ROUTER_HEALTH_PORT=
18
+ OPENCODE_ROUTER_HEALTH_PORT=3005
19
+ TOOL_UPDATES_ENABLED=false
20
+ GROUPS_ENABLED=false
21
+ TOOL_OUTPUT_LIMIT=1200
22
+ PERMISSION_MODE=allow
23
+ LOG_LEVEL=info
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Different AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,139 @@
1
+ # opencode-router
2
+
3
+ Simple Slack + Telegram bridge + directory router for a running `opencode` server.
4
+
5
+ ## Install + Run
6
+
7
+ One-command install (recommended):
8
+
9
+ ```bash
10
+ curl -fsSL https://raw.githubusercontent.com/different-ai/openwork/dev/packages/opencode-router/install.sh | bash
11
+ ```
12
+
13
+ Or install from npm:
14
+
15
+ ```bash
16
+ npm install -g opencode-router
17
+ ```
18
+
19
+ Quick run without install:
20
+
21
+ ```bash
22
+ npx opencode-router
23
+ ```
24
+
25
+ Then follow the guided setup (choose what to configure, start).
26
+
27
+ 1) One-command setup (installs deps, builds, creates `.env` if missing):
28
+
29
+ ```bash
30
+ pnpm -C packages/opencode-router setup
31
+ ```
32
+
33
+ 2) (Optional) Fill in `packages/opencode-router/.env` (see `.env.example`).
34
+
35
+ Required:
36
+ - `OPENCODE_URL`
37
+ - `OPENCODE_DIRECTORY`
38
+
39
+ Recommended:
40
+ - `OPENCODE_SERVER_USERNAME`
41
+ - `OPENCODE_SERVER_PASSWORD`
42
+
43
+ 3) Run the router:
44
+
45
+ ```bash
46
+ opencode-router
47
+ ```
48
+
49
+ ## Telegram
50
+
51
+ Telegram support is configured via identities. You can either:
52
+ - Use env vars for a single bot: `TELEGRAM_BOT_TOKEN=...`
53
+ - Or add multiple bots to the config file (`opencode-router.json`) using the CLI:
54
+
55
+ ```bash
56
+ opencode-router telegram add <token> --id default
57
+ opencode-router telegram list
58
+ ```
59
+
60
+ ## Slack (Socket Mode)
61
+
62
+ Slack support uses Socket Mode and replies in threads when @mentioned in channels.
63
+
64
+ 1) Create a Slack app.
65
+ 2) Enable Socket Mode and generate an app token (`xapp-...`).
66
+ 3) Add bot token scopes:
67
+ - `chat:write`
68
+ - `app_mentions:read`
69
+ - `im:history`
70
+ 4) Subscribe to events (bot events):
71
+ - `app_mention`
72
+ - `message.im`
73
+ 5) Set env vars (or save via `opencode-router slack add ...`):
74
+ - `SLACK_BOT_TOKEN=xoxb-...`
75
+ - `SLACK_APP_TOKEN=xapp-...`
76
+ - `SLACK_ENABLED=true`
77
+
78
+ To add multiple Slack apps:
79
+
80
+ ```bash
81
+ opencode-router slack add <xoxb> <xapp> --id default
82
+ opencode-router slack list
83
+ ```
84
+
85
+ ## Identity-Scoped Routing
86
+
87
+ The router routes messages based on `(channel, identityId, peerId) -> directory` bindings.
88
+
89
+ ```bash
90
+ opencode-router bindings set --channel telegram --identity default --peer <chatId> --dir /path/to/workdir
91
+ opencode-router bindings list
92
+ ```
93
+
94
+ ## Health Server (Local HTTP)
95
+
96
+ The router can expose a small local HTTP server for health/config and simple message dispatch.
97
+
98
+ - `OPENCODE_ROUTER_HEALTH_PORT` controls the port (OpenWork defaults to a random free port when using `openwork`).
99
+ - `PORT` is also accepted as a convenience if the above are unset.
100
+ - `OPENCODE_ROUTER_HEALTH_HOST` controls bind host (default: `127.0.0.1`).
101
+
102
+ Send a message to all peers bound to a directory:
103
+
104
+ ```bash
105
+ curl -sS "http://127.0.0.1:${OPENCODE_ROUTER_HEALTH_PORT:-3005}/send" \
106
+ -H 'Content-Type: application/json' \
107
+ -d '{"channel":"telegram","directory":"/path/to/workdir","text":"hello"}'
108
+ ```
109
+
110
+ ## Commands
111
+
112
+ ```bash
113
+ opencode-router start
114
+ opencode-router status
115
+
116
+ opencode-router telegram list
117
+ opencode-router telegram add <token> --id default
118
+
119
+ opencode-router slack list
120
+ opencode-router slack add <xoxb> <xapp> --id default
121
+
122
+ opencode-router bindings list
123
+ opencode-router bindings set --channel telegram --identity default --peer <chatId> --dir /path/to/workdir
124
+ ```
125
+
126
+ ## Defaults
127
+
128
+ - SQLite at `~/.openwork/opencode-router/opencode-router.db` unless overridden.
129
+ - Config stored at `~/.openwork/opencode-router/opencode-router.json` (created by `opencode-router` or `pnpm -C packages/opencode-router setup`).
130
+ - Group chats are disabled unless `GROUPS_ENABLED=true`.
131
+
132
+ ## Tests
133
+
134
+ ```bash
135
+ pnpm -C packages/opencode-router test:unit
136
+ pnpm -C packages/opencode-router test:smoke
137
+ pnpm -C packages/opencode-router test:cli
138
+ pnpm -C packages/opencode-router test:npx
139
+ ```
package/install.sh ADDED
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ OPENCODE_ROUTER_REF="${OPENCODE_ROUTER_REF:-dev}"
5
+ OPENCODE_ROUTER_REPO="${OPENCODE_ROUTER_REPO:-https://github.com/different-ai/openwork.git}"
6
+ OPENCODE_ROUTER_INSTALL_DIR="${OPENCODE_ROUTER_INSTALL_DIR:-$HOME/.openwork/opencode-router/openwork}"
7
+ OPENCODE_ROUTER_BIN_DIR="${OPENCODE_ROUTER_BIN_DIR:-$HOME/.local/bin}"
8
+ OPENCODE_ROUTER_INSTALL_METHOD="${OPENCODE_ROUTER_INSTALL_METHOD:-npm}"
9
+
10
+ usage() {
11
+ cat <<'EOF'
12
+ opencode-router installer
13
+
14
+ Environment variables:
15
+ OPENCODE_ROUTER_INSTALL_DIR Install directory (default: ~/.openwork/opencode-router/openwork)
16
+ OPENCODE_ROUTER_REPO Git repo (default: https://github.com/different-ai/openwork.git)
17
+ OPENCODE_ROUTER_REF Git ref/branch (default: dev)
18
+ OPENCODE_ROUTER_BIN_DIR Bin directory for shims (default: ~/.local/bin)
19
+ OPENCODE_ROUTER_INSTALL_METHOD Install method: npm|git (default: npm)
20
+
21
+ Example:
22
+ OPENCODE_ROUTER_INSTALL_DIR=~/opencode-router curl -fsSL https://raw.githubusercontent.com/different-ai/openwork/dev/packages/opencode-router/install.sh | bash
23
+ EOF
24
+ }
25
+
26
+ if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
27
+ usage
28
+ exit 0
29
+ fi
30
+
31
+ require_bin() {
32
+ if ! command -v "$1" >/dev/null 2>&1; then
33
+ echo "Missing $1. Please install it and retry." >&2
34
+ exit 1
35
+ fi
36
+ }
37
+
38
+ require_bin node
39
+
40
+ if [[ "$OPENCODE_ROUTER_INSTALL_METHOD" == "npm" ]]; then
41
+ echo "Installing opencode-router via npm..."
42
+ npm install -g opencode-router
43
+ else
44
+ require_bin git
45
+ if ! command -v pnpm >/dev/null 2>&1; then
46
+ if command -v corepack >/dev/null 2>&1; then
47
+ corepack enable >/dev/null 2>&1 || true
48
+ corepack prepare pnpm@10.27.0 --activate
49
+ else
50
+ echo "pnpm is required. Install pnpm or enable corepack, then retry." >&2
51
+ exit 1
52
+ fi
53
+ fi
54
+
55
+ if [[ -d "$OPENCODE_ROUTER_INSTALL_DIR/.git" ]]; then
56
+ echo "Updating opencode-router source in $OPENCODE_ROUTER_INSTALL_DIR"
57
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" fetch origin --prune
58
+ if git -C "$OPENCODE_ROUTER_INSTALL_DIR" show-ref --verify --quiet "refs/remotes/origin/$OPENCODE_ROUTER_REF"; then
59
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" checkout -B "$OPENCODE_ROUTER_REF" "origin/$OPENCODE_ROUTER_REF"
60
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" pull --ff-only origin "$OPENCODE_ROUTER_REF"
61
+ else
62
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" checkout -f
63
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" pull --ff-only
64
+ fi
65
+ else
66
+ echo "Cloning opencode-router source to $OPENCODE_ROUTER_INSTALL_DIR"
67
+ mkdir -p "$OPENCODE_ROUTER_INSTALL_DIR"
68
+ git clone --depth 1 "$OPENCODE_ROUTER_REPO" "$OPENCODE_ROUTER_INSTALL_DIR"
69
+ if git -C "$OPENCODE_ROUTER_INSTALL_DIR" show-ref --verify --quiet "refs/remotes/origin/$OPENCODE_ROUTER_REF"; then
70
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" checkout -B "$OPENCODE_ROUTER_REF" "origin/$OPENCODE_ROUTER_REF"
71
+ fi
72
+ fi
73
+
74
+ if [[ ! -d "$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router" ]]; then
75
+ echo "opencode-router package not found on ref '$OPENCODE_ROUTER_REF'. Trying dev/main..." >&2
76
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" fetch origin --prune
77
+ if git -C "$OPENCODE_ROUTER_INSTALL_DIR" show-ref --verify --quiet refs/remotes/origin/dev; then
78
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" checkout -B dev origin/dev
79
+ elif git -C "$OPENCODE_ROUTER_INSTALL_DIR" show-ref --verify --quiet refs/remotes/origin/main; then
80
+ git -C "$OPENCODE_ROUTER_INSTALL_DIR" checkout -B main origin/main
81
+ fi
82
+ fi
83
+
84
+ if [[ ! -d "$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router" ]]; then
85
+ echo "opencode-router package not found after checkout. Aborting." >&2
86
+ exit 1
87
+ fi
88
+
89
+ echo "Installing dependencies..."
90
+ pnpm -C "$OPENCODE_ROUTER_INSTALL_DIR" install
91
+
92
+ echo "Building opencode-router..."
93
+ pnpm -C "$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router" build
94
+
95
+ ENV_PATH="$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router/.env"
96
+ ENV_EXAMPLE="$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router/.env.example"
97
+ if [[ ! -f "$ENV_PATH" ]]; then
98
+ if [[ -f "$ENV_EXAMPLE" ]]; then
99
+ cp "$ENV_EXAMPLE" "$ENV_PATH"
100
+ echo "Created $ENV_PATH"
101
+ else
102
+ cat <<EOF > "$ENV_PATH"
103
+ OPENCODE_URL=http://127.0.0.1:4096
104
+ OPENCODE_DIRECTORY=
105
+ TELEGRAM_BOT_TOKEN=
106
+ SLACK_BOT_TOKEN=
107
+ SLACK_APP_TOKEN=
108
+ EOF
109
+ echo "Created $ENV_PATH (minimal)"
110
+ fi
111
+ fi
112
+
113
+ mkdir -p "$OPENCODE_ROUTER_BIN_DIR"
114
+ cat <<EOF > "$OPENCODE_ROUTER_BIN_DIR/opencode-router"
115
+ #!/usr/bin/env bash
116
+ set -euo pipefail
117
+ node "$OPENCODE_ROUTER_INSTALL_DIR/packages/opencode-router/dist/cli.js" "$@"
118
+ EOF
119
+ chmod 755 "$OPENCODE_ROUTER_BIN_DIR/opencode-router"
120
+ fi
121
+
122
+ if ! echo ":$PATH:" | grep -q ":$OPENCODE_ROUTER_BIN_DIR:"; then
123
+ shell_name="$(basename "${SHELL:-}" 2>/dev/null || true)"
124
+ case "$shell_name" in
125
+ fish)
126
+ echo "Add to PATH (fish): set -Ux PATH $OPENCODE_ROUTER_BIN_DIR \$PATH"
127
+ ;;
128
+ zsh)
129
+ echo "Add to PATH (zsh): echo 'export PATH=\"$OPENCODE_ROUTER_BIN_DIR:\$PATH\"' >> ~/.zshrc"
130
+ ;;
131
+ bash)
132
+ echo "Add to PATH (bash): echo 'export PATH=\"$OPENCODE_ROUTER_BIN_DIR:\$PATH\"' >> ~/.bashrc"
133
+ ;;
134
+ *)
135
+ echo "Add to PATH: export PATH=\"$OPENCODE_ROUTER_BIN_DIR:\$PATH\""
136
+ ;;
137
+ esac
138
+ fi
139
+
140
+ cat <<EOF
141
+
142
+ opencode-router installed.
143
+
144
+ Next steps:
145
+ 1) Edit: $ENV_PATH
146
+ 2) Run: opencode-router start
147
+ EOF
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "opencode-router",
3
+ "version": "0.11.77",
4
+ "description": "opencode-router: Slack + Telegram bridge + directory routing for a running opencode server",
5
+ "private": false,
6
+ "type": "module",
7
+ "bin": {
8
+ "opencode-router": "dist/cli.js"
9
+ },
10
+ "license": "MIT",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/different-ai/openwork.git",
14
+ "directory": "packages/opencode-router"
15
+ },
16
+ "keywords": [
17
+ "opencode",
18
+ "router",
19
+ "slack",
20
+ "telegram",
21
+ "bridge",
22
+ "bot"
23
+ ],
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ ".env.example",
28
+ "install.sh"
29
+ ],
30
+ "dependencies": {
31
+ "@opencode-ai/sdk": "^1.1.31",
32
+ "@slack/socket-mode": "^2.0.5",
33
+ "@slack/web-api": "^7.13.0",
34
+ "commander": "^12.1.0",
35
+ "dotenv": "^16.4.7",
36
+ "grammy": "^1.39.3",
37
+ "pino": "^9.6.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^22.10.2",
41
+ "bun-types": "^1.3.6",
42
+ "typescript": "^5.6.3"
43
+ },
44
+ "scripts": {
45
+ "dev": "bun src/cli.ts",
46
+ "build": "tsc -p tsconfig.json",
47
+ "build:bin": "bun ./script/build.ts --outdir dist/bin --filename opencode-router",
48
+ "build:bin:all": "bun ./script/build.ts --outdir dist/bin --filename opencode-router --target bun-darwin-arm64 --target bun-darwin-x64 --target bun-linux-x64 --target bun-linux-arm64 --target bun-windows-x64",
49
+ "build:binary": "bun ./script/build.ts --outdir dist/bin --filename opencode-router",
50
+ "start": "bun dist/cli.js start",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit",
52
+ "setup": "bun scripts/setup.mjs",
53
+ "test:unit": "pnpm build && bun test test/*.test.js",
54
+ "test:smoke": "bun scripts/smoke.mjs",
55
+ "test:cli": "pnpm build && bun scripts/test-cli.mjs",
56
+ "test:npx": "bun scripts/test-npx.mjs"
57
+ }
58
+ }