@indianic/dialout 1.1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +425 -24
  2. package/bin/AGENTS.md +44 -0
  3. package/bin/devdash-agent.js +2 -0
  4. package/dist/ai-adapters/claude.d.ts +3 -0
  5. package/dist/ai-adapters/claude.d.ts.map +1 -0
  6. package/dist/ai-adapters/claude.js +98 -0
  7. package/dist/ai-adapters/claude.js.map +1 -0
  8. package/dist/ai-adapters/codex.d.ts +3 -0
  9. package/dist/ai-adapters/codex.d.ts.map +1 -0
  10. package/dist/ai-adapters/codex.js +147 -0
  11. package/dist/ai-adapters/codex.js.map +1 -0
  12. package/dist/ai-adapters/grok.d.ts +3 -0
  13. package/dist/ai-adapters/grok.d.ts.map +1 -0
  14. package/dist/ai-adapters/grok.js +164 -0
  15. package/dist/ai-adapters/grok.js.map +1 -0
  16. package/dist/ai-adapters/index.d.ts +5 -0
  17. package/dist/ai-adapters/index.d.ts.map +1 -0
  18. package/dist/ai-adapters/index.js +30 -0
  19. package/dist/ai-adapters/index.js.map +1 -0
  20. package/dist/ai-adapters/types.d.ts +3 -0
  21. package/dist/ai-adapters/types.d.ts.map +1 -0
  22. package/dist/ai-adapters/types.js +7 -0
  23. package/dist/ai-adapters/types.js.map +1 -0
  24. package/dist/ai-capabilities/claude.d.ts +4 -0
  25. package/dist/ai-capabilities/claude.d.ts.map +1 -0
  26. package/dist/ai-capabilities/claude.js +174 -0
  27. package/dist/ai-capabilities/claude.js.map +1 -0
  28. package/dist/ai-capabilities/describe.d.ts +2 -0
  29. package/dist/ai-capabilities/describe.d.ts.map +1 -0
  30. package/dist/ai-capabilities/describe.js +31 -0
  31. package/dist/ai-capabilities/describe.js.map +1 -0
  32. package/dist/ai-capabilities/fsdeps.d.ts +3 -0
  33. package/dist/ai-capabilities/fsdeps.d.ts.map +1 -0
  34. package/dist/ai-capabilities/fsdeps.js +71 -0
  35. package/dist/ai-capabilities/fsdeps.js.map +1 -0
  36. package/dist/ai-capabilities/grok.d.ts +5 -0
  37. package/dist/ai-capabilities/grok.d.ts.map +1 -0
  38. package/dist/ai-capabilities/grok.js +145 -0
  39. package/dist/ai-capabilities/grok.js.map +1 -0
  40. package/dist/ai-capabilities/index.d.ts +4 -0
  41. package/dist/ai-capabilities/index.d.ts.map +1 -0
  42. package/dist/ai-capabilities/index.js +94 -0
  43. package/dist/ai-capabilities/index.js.map +1 -0
  44. package/dist/ai-capabilities/redact.d.ts +2 -0
  45. package/dist/ai-capabilities/redact.d.ts.map +1 -0
  46. package/dist/ai-capabilities/redact.js +27 -0
  47. package/dist/ai-capabilities/redact.js.map +1 -0
  48. package/dist/ai-capabilities/types.d.ts +11 -0
  49. package/dist/ai-capabilities/types.d.ts.map +1 -0
  50. package/dist/ai-capabilities/types.js +3 -0
  51. package/dist/ai-capabilities/types.js.map +1 -0
  52. package/dist/ai-launch.d.ts +35 -0
  53. package/dist/ai-launch.d.ts.map +1 -0
  54. package/dist/ai-launch.js +211 -0
  55. package/dist/ai-launch.js.map +1 -0
  56. package/dist/ai-session-detector.d.ts +19 -0
  57. package/dist/ai-session-detector.d.ts.map +1 -0
  58. package/dist/ai-session-detector.js +79 -0
  59. package/dist/ai-session-detector.js.map +1 -0
  60. package/dist/ai-sessions.d.ts +36 -0
  61. package/dist/ai-sessions.d.ts.map +1 -0
  62. package/dist/ai-sessions.js +309 -0
  63. package/dist/ai-sessions.js.map +1 -0
  64. package/dist/ai-status.d.ts +6 -0
  65. package/dist/ai-status.d.ts.map +1 -0
  66. package/dist/ai-status.js +40 -0
  67. package/dist/ai-status.js.map +1 -0
  68. package/dist/ai-transcript-locator.d.ts +35 -0
  69. package/dist/ai-transcript-locator.d.ts.map +1 -0
  70. package/dist/ai-transcript-locator.js +268 -0
  71. package/dist/ai-transcript-locator.js.map +1 -0
  72. package/dist/ai-transcript-tail.d.ts +17 -0
  73. package/dist/ai-transcript-tail.d.ts.map +1 -0
  74. package/dist/ai-transcript-tail.js +120 -0
  75. package/dist/ai-transcript-tail.js.map +1 -0
  76. package/dist/checklist.d.ts +20 -0
  77. package/dist/checklist.d.ts.map +1 -0
  78. package/dist/checklist.js +51 -0
  79. package/dist/checklist.js.map +1 -0
  80. package/dist/cli.d.ts +2 -0
  81. package/dist/cli.d.ts.map +1 -0
  82. package/dist/cli.js +1427 -0
  83. package/dist/cli.js.map +1 -0
  84. package/dist/command-runner.d.ts +15 -0
  85. package/dist/command-runner.d.ts.map +1 -0
  86. package/dist/command-runner.js +84 -0
  87. package/dist/command-runner.js.map +1 -0
  88. package/dist/config.d.ts +41 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +152 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/cowork.d.ts +26 -0
  93. package/dist/cowork.d.ts.map +1 -0
  94. package/dist/cowork.js +370 -0
  95. package/dist/cowork.js.map +1 -0
  96. package/dist/fs-browser.d.ts +6 -0
  97. package/dist/fs-browser.d.ts.map +1 -0
  98. package/dist/fs-browser.js +61 -0
  99. package/dist/fs-browser.js.map +1 -0
  100. package/dist/has-command.d.ts +12 -0
  101. package/dist/has-command.d.ts.map +1 -0
  102. package/dist/has-command.js +24 -0
  103. package/dist/has-command.js.map +1 -0
  104. package/dist/heartbeat.d.ts +7 -0
  105. package/dist/heartbeat.d.ts.map +1 -0
  106. package/dist/heartbeat.js +50 -0
  107. package/dist/heartbeat.js.map +1 -0
  108. package/dist/index.d.ts +2 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +56 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/port-scanner.d.ts +4 -0
  113. package/dist/port-scanner.d.ts.map +1 -0
  114. package/dist/port-scanner.js +75 -0
  115. package/dist/port-scanner.js.map +1 -0
  116. package/dist/project-scanner.d.ts +15 -0
  117. package/dist/project-scanner.d.ts.map +1 -0
  118. package/dist/project-scanner.js +333 -0
  119. package/dist/project-scanner.js.map +1 -0
  120. package/dist/pty-manager.d.ts +28 -0
  121. package/dist/pty-manager.d.ts.map +1 -0
  122. package/dist/pty-manager.js +506 -0
  123. package/dist/pty-manager.js.map +1 -0
  124. package/dist/service-installer.d.ts +95 -0
  125. package/dist/service-installer.d.ts.map +1 -0
  126. package/dist/service-installer.js +911 -0
  127. package/dist/service-installer.js.map +1 -0
  128. package/dist/single-instance.d.ts +20 -0
  129. package/dist/single-instance.d.ts.map +1 -0
  130. package/dist/single-instance.js +151 -0
  131. package/dist/single-instance.js.map +1 -0
  132. package/dist/ssh-local-network.d.ts +26 -0
  133. package/dist/ssh-local-network.d.ts.map +1 -0
  134. package/dist/ssh-local-network.js +169 -0
  135. package/dist/ssh-local-network.js.map +1 -0
  136. package/dist/terminal-detect.d.ts +52 -0
  137. package/dist/terminal-detect.d.ts.map +1 -0
  138. package/dist/terminal-detect.js +147 -0
  139. package/dist/terminal-detect.js.map +1 -0
  140. package/dist/terminal-markers.d.ts +52 -0
  141. package/dist/terminal-markers.d.ts.map +1 -0
  142. package/dist/terminal-markers.js +174 -0
  143. package/dist/terminal-markers.js.map +1 -0
  144. package/dist/tmux-manager.d.ts +35 -0
  145. package/dist/tmux-manager.d.ts.map +1 -0
  146. package/dist/tmux-manager.js +274 -0
  147. package/dist/tmux-manager.js.map +1 -0
  148. package/dist/update-check.d.ts +3 -0
  149. package/dist/update-check.d.ts.map +1 -0
  150. package/dist/update-check.js +202 -0
  151. package/dist/update-check.js.map +1 -0
  152. package/dist/websocket.d.ts +8 -0
  153. package/dist/websocket.d.ts.map +1 -0
  154. package/dist/websocket.js +472 -0
  155. package/dist/websocket.js.map +1 -0
  156. package/node_modules/@dialout/shared/README.md +16 -0
  157. package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts +8 -0
  158. package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts.map +1 -0
  159. package/node_modules/@dialout/shared/dist/ai-chat-prefs.js +41 -0
  160. package/node_modules/@dialout/shared/dist/capabilities.d.ts +25 -0
  161. package/node_modules/@dialout/shared/dist/capabilities.d.ts.map +1 -0
  162. package/node_modules/@dialout/shared/dist/capabilities.js +2 -0
  163. package/node_modules/@dialout/shared/dist/chat-blocks.d.ts +33 -0
  164. package/node_modules/@dialout/shared/dist/chat-blocks.d.ts.map +1 -0
  165. package/node_modules/@dialout/shared/dist/chat-blocks.js +61 -0
  166. package/node_modules/@dialout/shared/dist/command-filter.d.ts +4 -0
  167. package/node_modules/@dialout/shared/dist/command-filter.d.ts.map +1 -0
  168. package/node_modules/@dialout/shared/dist/command-filter.js +49 -0
  169. package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts +6 -0
  170. package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts.map +1 -0
  171. package/node_modules/@dialout/shared/dist/composer-behaviour.js +24 -0
  172. package/node_modules/@dialout/shared/dist/events.d.ts +37 -0
  173. package/node_modules/@dialout/shared/dist/events.d.ts.map +1 -0
  174. package/node_modules/@dialout/shared/dist/events.js +13 -0
  175. package/node_modules/@dialout/shared/dist/index.d.ts +21 -0
  176. package/node_modules/@dialout/shared/dist/index.d.ts.map +1 -0
  177. package/node_modules/@dialout/shared/dist/index.js +37 -0
  178. package/node_modules/@dialout/shared/dist/kinds.d.ts +2 -0
  179. package/node_modules/@dialout/shared/dist/kinds.d.ts.map +1 -0
  180. package/node_modules/@dialout/shared/dist/kinds.js +2 -0
  181. package/node_modules/@dialout/shared/dist/notify.d.ts +3 -0
  182. package/node_modules/@dialout/shared/dist/notify.d.ts.map +1 -0
  183. package/node_modules/@dialout/shared/dist/notify.js +31 -0
  184. package/node_modules/@dialout/shared/dist/permission.d.ts +4 -0
  185. package/node_modules/@dialout/shared/dist/permission.d.ts.map +1 -0
  186. package/node_modules/@dialout/shared/dist/permission.js +8 -0
  187. package/node_modules/@dialout/shared/dist/scroll-pin.d.ts +3 -0
  188. package/node_modules/@dialout/shared/dist/scroll-pin.d.ts.map +1 -0
  189. package/node_modules/@dialout/shared/dist/scroll-pin.js +11 -0
  190. package/node_modules/@dialout/shared/dist/session.d.ts +19 -0
  191. package/node_modules/@dialout/shared/dist/session.d.ts.map +1 -0
  192. package/node_modules/@dialout/shared/dist/session.js +6 -0
  193. package/node_modules/@dialout/shared/dist/terminal-name.d.ts +25 -0
  194. package/node_modules/@dialout/shared/dist/terminal-name.d.ts.map +1 -0
  195. package/node_modules/@dialout/shared/dist/terminal-name.js +63 -0
  196. package/node_modules/@dialout/shared/dist/tool-appearance.d.ts +9 -0
  197. package/node_modules/@dialout/shared/dist/tool-appearance.d.ts.map +1 -0
  198. package/node_modules/@dialout/shared/dist/tool-appearance.js +30 -0
  199. package/node_modules/@dialout/shared/package.json +37 -0
  200. package/node_modules/@dialout/shared/src/ai-chat-prefs.test.ts +40 -0
  201. package/node_modules/@dialout/shared/src/ai-chat-prefs.ts +39 -0
  202. package/node_modules/@dialout/shared/src/capabilities.ts +30 -0
  203. package/node_modules/@dialout/shared/src/chat-blocks.test.ts +65 -0
  204. package/node_modules/@dialout/shared/src/chat-blocks.ts +79 -0
  205. package/node_modules/@dialout/shared/src/command-filter.test.ts +76 -0
  206. package/node_modules/@dialout/shared/src/command-filter.ts +45 -0
  207. package/node_modules/@dialout/shared/src/composer-behaviour.test.ts +31 -0
  208. package/node_modules/@dialout/shared/src/composer-behaviour.ts +22 -0
  209. package/node_modules/@dialout/shared/src/events.ts +27 -0
  210. package/node_modules/@dialout/shared/src/index.ts +32 -0
  211. package/node_modules/@dialout/shared/src/kinds.ts +5 -0
  212. package/node_modules/@dialout/shared/src/notify.test.ts +49 -0
  213. package/node_modules/@dialout/shared/src/notify.ts +30 -0
  214. package/node_modules/@dialout/shared/src/permission.ts +10 -0
  215. package/node_modules/@dialout/shared/src/scroll-pin.test.ts +23 -0
  216. package/node_modules/@dialout/shared/src/scroll-pin.ts +13 -0
  217. package/node_modules/@dialout/shared/src/session.ts +25 -0
  218. package/node_modules/@dialout/shared/src/terminal-name.ts +82 -0
  219. package/node_modules/@dialout/shared/src/tool-appearance.test.ts +41 -0
  220. package/node_modules/@dialout/shared/src/tool-appearance.ts +39 -0
  221. package/package.json +54 -14
  222. package/scripts/postinstall.js +79 -0
  223. package/scripts/prepack.js +45 -0
  224. package/bin/dialout.js +0 -13
package/README.md CHANGED
@@ -1,45 +1,446 @@
1
+ <div align="center">
2
+
3
+ <img src="https://raw.githubusercontent.com/indianic/dialout/main/docs/assets/logo.svg" width="88" height="88" alt="Dialout">
4
+
1
5
  # @indianic/dialout
2
6
 
3
- **This is an alias. The package you want is [`dialout`](https://www.npmjs.com/package/dialout).**
7
+ **Your machines, one room. The agent dials out, so nothing has to dial in.**
8
+
9
+ <sub>The package is scoped; the command it installs is plain `dialout`.</sub>
10
+
11
+ [![npm](https://img.shields.io/npm/v/%40indianic%2Fdialout?style=flat-square&color=1a56db)](https://www.npmjs.com/package/@indianic/dialout)
12
+ [![License](https://img.shields.io/badge/license-MIT-1a56db?style=flat-square)](https://github.com/indianic/dialout/blob/main/LICENSE)
13
+ [![Node](https://img.shields.io/badge/node-%E2%89%A518-1a56db?style=flat-square)](https://nodejs.org)
14
+ [![Platforms](https://img.shields.io/badge/macOS%20%C2%B7%20Linux-0c0e13?style=flat-square)](#requirements)
15
+
16
+ **[dialout.dev](https://www.dialout.dev)** · [GitHub](https://github.com/indianic/dialout) · [Get started](#getting-started) · [CLI reference](#cli-reference) · [Troubleshooting](#troubleshooting)
17
+
18
+ </div>
19
+
20
+ ---
21
+
22
+ **This is the agent for [Dialout](https://www.dialout.dev), a free, open-source,
23
+ self-hosted remote development dashboard.** Install it on any computer you code
24
+ on — your office desktop, your home machine, a build box — and that machine
25
+ appears in your Dialout dashboard, reachable from any browser or your phone.
26
+
27
+ The agent connects **outbound** to your server and holds the socket open. There
28
+ is no inbound port to open, no VPN to join, and no port forwarding to configure.
29
+ If the machine can reach the internet, you can reach the machine.
30
+
31
+ ```bash
32
+ npm install -g @indianic/dialout
33
+ dialout init
34
+ dialout install-service
35
+ ```
36
+
37
+ ---
38
+
39
+ ## The problem it solves
40
+
41
+ You are away from your desk and you need to know what your machine is doing.
42
+ Today that means being at the machine, or reassembling the answer by hand:
43
+
44
+ ```console
45
+ $ lsof -i :3000 # which project is this, again?
46
+ node 41287 you 26u IPv6 TCP *:3000 (LISTEN)
47
+
48
+ $ ssh build-box # the other four ports are on a different box
49
+ you@build-box:~$ pm2 list
50
+ you@build-box:~$ cat apps/checkout/.env | grep STRIPE_
51
+
52
+ $ tmux ls # and the migration I started on Friday?
53
+ 0: 1 windows 1: 1 windows # no idea which one
54
+ ```
55
+
56
+ Four terminals, three machines, and the only index is your memory. Run six
57
+ projects for a year and *"which port was the admin panel on?"* becomes a
58
+ genuinely hard question that nothing in your toolchain is keeping the answer to.
59
+ Meanwhile an AI coding agent is running a 40-minute task on that machine and
60
+ will sit and wait for an answer the moment you walk away.
61
+
62
+ With the agent installed, all of that is one URL — from a phone if that is what
63
+ you have on you:
64
+
65
+ - **Search a port, keep the answer.** Scan a range, find what is listening, save
66
+ it as a project. `:3000` becomes *Checkout, on the office Mac, running.*
67
+ - **Open a real terminal, from anywhere** — straight into the project folder.
68
+ - **Answer your AI agent from your phone.** Claude Code, Codex and Grok sessions
69
+ rendered as chat, with a push when one is waiting on you.
70
+ - **Share a project with a teammate**, with notes and todos attached to the
71
+ project instead of a chat thread.
72
+ - **Put `localhost` on a public URL** for a demo, a webhook, or a test device.
73
+
74
+ <img src="https://raw.githubusercontent.com/indianic/dialout/main/docs/assets/screenshots/hero.png" alt="The Dialout dashboard: projects across every machine, with live port status">
75
+
76
+ ## What the agent does
77
+
78
+ - **Port scanning** — scans local ports on demand and reports what is listening
79
+ - **Terminal sessions** — tmux-backed PTYs streamed to the browser over WebSocket
80
+ - **AI session tailing** — follows the JSONL transcript each AI CLI already
81
+ writes, so sessions render as chat without ever scraping the terminal UI
82
+ - **Filesystem browsing** — lists directories for the path picker
83
+ - **Process control** — runs the quick-launch commands you saved per project
84
+ - **HTTP tunnel origin** — serves your local dev server through the public URL
85
+ - **Heartbeat** — a persistent connection with a 30 s keep-alive
86
+
87
+ ## Requirements
88
+
89
+ - Node.js 18 or newer
90
+ - macOS or Linux
91
+ - A running [Dialout server](https://github.com/indianic/dialout) — it is
92
+ self-hosted, so this is your server, on your infrastructure
93
+
94
+ ## Getting started
95
+
96
+ Six steps, about ten minutes. You need a Dialout **server** — one, shared by all
97
+ your machines — and this agent on each machine you want to reach.
98
+
99
+ ### 1 · Get a server
100
+
101
+ Pick one:
102
+
103
+ - **Self-host it.** Clone [github.com/indianic/dialout](https://github.com/indianic/dialout)
104
+ and follow the README. One PostgreSQL database and two Node processes; your
105
+ data stays on your infrastructure. This is the intended path.
106
+ - **Use [dialout.dev](https://www.dialout.dev).** A public instance running the
107
+ same code, if you want to look around before committing to hosting it. You can
108
+ repoint the agent at your own server later with one command.
109
+
110
+ ### 2 · Create your account
111
+
112
+ Open your server and sign up with your email, then complete **two-factor
113
+ enrolment** — scan the QR code with any TOTP app. It is not skippable, and the
114
+ API enforces it independently of the interface, because this is a tool that
115
+ opens terminals on your machines.
116
+
117
+ ### 3 · Add the machine and generate its key
118
+
119
+ In the dashboard, **Settings → Machines → Add machine**. Give it a name you will
120
+ recognise (`office-mac`, `home-desktop`, `build-box`), then click **Generate
121
+ key**.
122
+
123
+ You get an `mch_…` key. **Copy it now — it is shown once and stored only as a
124
+ hash.** Generate a new one at any time if you lose it.
125
+
126
+ ### 4 · Install the agent
127
+
128
+ On the computer you just registered:
129
+
130
+ ```bash
131
+ npm install -g @indianic/dialout
132
+ ```
133
+
134
+ ### 5 · Point it at your server
135
+
136
+ ```bash
137
+ dialout init
138
+ ```
139
+
140
+ It asks for two things:
141
+
142
+ | Prompt | What to paste |
143
+ | --- | --- |
144
+ | **Server URL** | The WebSocket base — `wss://www.dialout.dev/ws`, or `ws://localhost:50052` for a local server. The agent appends `/daemon` itself. |
145
+ | **API key** | The `mch_…` key from step 3 |
146
+
147
+ Configuration is written to `~/.dialout/config.json`. `init` then offers to
148
+ install the OS service for you — choose **at boot** if you want the machine
149
+ reachable before anyone logs into the desktop session, which on a machine you
150
+ are trying to reach remotely is almost always what you want.
151
+
152
+ To run it in the foreground once, before committing to a service:
153
+
154
+ ```bash
155
+ dialout start # Ctrl-C to stop
156
+ dialout start --daemon # or in the background
157
+ ```
158
+
159
+ ### 6 · Install as a service and verify
160
+
161
+ If you skipped the offer in `init`, two modes — chosen by whether you need the
162
+ agent running **before** login:
163
+
164
+ ```bash
165
+ dialout install-service # per-user — starts at LOGIN (no sudo)
166
+ dialout install-service --system # system — starts at BOOT (needs sudo)
167
+ ```
168
+
169
+ | Mode | macOS | Linux | Starts |
170
+ |------|-------|-------|--------|
171
+ | default | LaunchAgent `~/Library/LaunchAgents/com.dialout.agent.plist` | systemd user unit `~/.config/systemd/user/dialout.service` | at login |
172
+ | `--system` | LaunchDaemon `/Library/LaunchDaemons/com.dialout.agent.plist` | systemd system unit `/etc/systemd/system/dialout.service` | at boot |
173
+
174
+ Both modes restart the agent automatically if it crashes or is killed.
175
+
176
+ <details>
177
+ <summary><b>Finishing a <code>--system</code> install by hand</b></summary>
178
+
179
+ <br>
180
+
181
+ A boot service must be owned by root, so a non-root CLI cannot install it
182
+ directly. Run as a normal user, `install-service --system` **stages** the unit
183
+ file and prints the exact commands to finish. Run `sudo dialout install-service
184
+ --system` instead and it does all of this for you.
185
+
186
+ **macOS**
187
+
188
+ ```bash
189
+ sudo bash -c 'cp ~/.dialout/com.dialout.agent.plist /Library/LaunchDaemons/com.dialout.agent.plist \
190
+ && chown root:wheel /Library/LaunchDaemons/com.dialout.agent.plist \
191
+ && chmod 644 /Library/LaunchDaemons/com.dialout.agent.plist \
192
+ && launchctl bootstrap system /Library/LaunchDaemons/com.dialout.agent.plist'
193
+ ```
194
+
195
+ Replace `~` with the absolute path the command printed (e.g.
196
+ `/Users/you/.dialout/…`) — under `sudo`, `~` resolves to root's home, not yours.
197
+
198
+ **Linux**
199
+
200
+ ```bash
201
+ sudo cp ~/.dialout/dialout.service /etc/systemd/system/dialout.service
202
+ sudo systemctl daemon-reload
203
+ sudo systemctl enable --now dialout
204
+ ```
205
+
206
+ </details>
207
+
208
+ Then check it:
4
209
 
5
210
  ```bash
6
- npm install -g dialout
211
+ dialout status
7
212
  ```
8
213
 
9
- Both names install the same agent and both give you the same `dialout` command.
10
- This one exists so that the package resolves under the IndiaNIC organisation's
11
- namespace; it contains no code of its own, only a dependency on `dialout` and a
12
- one-line shim that runs it.
214
+ ```
215
+ Dialout Agent Status
216
+ ────────────────────────────────────────────
217
+ Server: wss://www.dialout.dev/ws
218
+ API Key: ****K27F
219
+ Config: /Users/you/.dialout/config.json
220
+ Service: installed (launchd, at boot)
221
+ Cron: not installed
222
+ Process: running (PID: 12345, managed by launchd)
223
+ ────────────────────────────────────────────
224
+ ```
225
+
226
+ The machine now shows green in the dashboard and its ports go live. `status`
227
+ reports the **service-managed** process, not just a `--daemon` PID file, so a
228
+ service-installed agent that is up always shows `running` with the live PID.
229
+
230
+ Repeat steps 3 to 6 for every other machine you want in the room.
231
+
232
+ ## CLI reference
233
+
234
+ | Command | Description |
235
+ |---------|-------------|
236
+ | `dialout init` | Configure server URL and API key, and optionally install the service |
237
+ | `dialout start` | Start in the foreground (Ctrl-C to stop) |
238
+ | `dialout start --daemon` | Start in the background |
239
+ | `dialout stop` | Stop a background agent |
240
+ | `dialout restart` | Stop and start again |
241
+ | `dialout status` | Connection state, service state, and the live PID |
242
+ | `dialout install-service` | Install as an OS service — starts at **login** |
243
+ | `dialout install-service --system` | Install as an OS service — starts at **boot** (needs sudo) |
244
+ | `dialout uninstall-service` | Remove the OS service, either mode |
245
+ | `dialout setup-cron` | Install a cron watchdog that restarts the agent if it dies |
246
+ | `dialout remove-cron` | Remove the cron watchdog |
247
+ | `dialout setup-cowork` | Wire your shell rc so native terminals join the same tmux session |
248
+ | `dialout repair` | Diagnose and fix a stale or competing supervisor |
249
+ | `dialout profiles` / `dialout use <profile>` | Switch between saved server configurations |
250
+ | `dialout update` | Update to the latest published version |
251
+ | `dialout config show` \| `path` \| `set <key> <value>` \| `reset` | Inspect and edit configuration |
252
+ | `dialout --version` \| `--help` | Version and help |
253
+
254
+ ## Configuration
255
+
256
+ Config file: `~/.dialout/config.json`
257
+
258
+ ```json
259
+ {
260
+ "serverUrl": "wss://dialout.example.com/ws",
261
+ "apiKey": "mch_xxxxxxxxxxxx",
262
+ "scanPorts": [3000, 3001, 4200, 5173, 8000, 8080, 9000],
263
+ "scanRange": { "from": 3000, "to": 9000 },
264
+ "heartbeatInterval": 30000
265
+ }
266
+ ```
267
+
268
+ | Key | Default | Description |
269
+ |-----|---------|-------------|
270
+ | `serverUrl` | — | WebSocket base URL of your Dialout server; the agent appends `/daemon` |
271
+ | `apiKey` | — | The machine's `mch_…` key, generated in the web UI |
272
+ | `scanPorts` | common dev ports | Specific ports to check on a quick scan |
273
+ | `scanRange` | 3000–9000 | Port range for a full scan |
274
+ | `heartbeatInterval` | 30000 | Keep-alive interval, in milliseconds |
275
+
276
+ ## How it works
277
+
278
+ ```
279
+ ┌──────────────────┐ outbound ┌──────────────────┐ HTTPS ┌──────────┐
280
+ │ dialout agent │ ===========▶ │ Dialout server │ ◀──────────▶ │ Browser │
281
+ │ (your machine) │ WSS │ (yours, self- │ │ or phone │
282
+ │ │ │ hosted) │ │ │
283
+ │ · port scanner │ │ · relay │ │ · xterm │
284
+ │ · PTY / tmux │ │ · auth │ │ · UI │
285
+ │ · AI transcripts│ │ · recording │ │ │
286
+ │ · FS browser │ │ · tunnel │ │ │
287
+ └──────────────────┘ └──────────────────┘ └──────────┘
288
+ nothing dials in ▲ the arrow only ever points this way
289
+ ```
290
+
291
+ 1. The agent connects outbound to `<serverUrl>/daemon` over WebSocket. No
292
+ inbound port is needed on the machine.
293
+ 2. The server authenticates it with the `X-API-Key` header, SHA-256 compared
294
+ against the stored hash.
295
+ 3. Browser requests — port scan, terminal, browse, run command — are relayed
296
+ through the server to the agent.
297
+ 4. Terminal I/O streams browser ↔ server ↔ agent ↔ local PTY.
298
+
299
+ ## Service management
300
+
301
+ Logs for both modes are written to `~/.dialout/logs/`.
302
+
303
+ <details>
304
+ <summary><b>macOS (launchd)</b></summary>
13
305
 
14
- > **Install one or the other, not both.** They provide the same `dialout`
15
- > binary, and npm will not overwrite an existing command — installing the second
16
- > one globally fails with `EEXIST`. If you have one and want the other, remove
17
- > the first: `npm uninstall -g dialout` or
18
- > `npm uninstall -g @indianic/dialout`.
306
+ <br>
19
307
 
20
- ## If this 404s on an IndiaNIC machine
308
+ ```bash
309
+ dialout status
310
+ launchctl print gui/$(id -u)/com.dialout.agent # login agent
311
+ sudo launchctl print system/com.dialout.agent # boot daemon
21
312
 
22
- `@indianic/*` was mapped to a private registry for years, and that mapping
23
- outlives the registry. A machine with this line in `~/.npmrc` will look for this
24
- package in the wrong place and get a 404:
313
+ tail -f ~/.dialout/logs/stdout.log
314
+ tail -f ~/.dialout/logs/stderr.log
25
315
 
316
+ dialout uninstall-service
317
+ # a boot daemon also needs:
318
+ sudo launchctl bootout system /Library/LaunchDaemons/com.dialout.agent.plist \
319
+ && sudo rm /Library/LaunchDaemons/com.dialout.agent.plist
26
320
  ```
27
- @indianic:registry=https://npm.indianic.in/
321
+
322
+ </details>
323
+
324
+ <details>
325
+ <summary><b>Linux (systemd)</b></summary>
326
+
327
+ <br>
328
+
329
+ ```bash
330
+ systemctl --user status dialout # login
331
+ systemctl status dialout # boot
332
+
333
+ journalctl --user -u dialout -f # login
334
+ journalctl -u dialout -f # boot
335
+
336
+ dialout uninstall-service
28
337
  ```
29
338
 
30
- Either drop the line, or install the unscoped package instead — which is the
31
- better answer anyway:
339
+ </details>
340
+
341
+ ## Troubleshooting
342
+
343
+ **The agent will not connect.**
344
+ Run `dialout status` first — it shows the config and the service state together.
345
+ A **401** means the API key is not registered for any machine; it is *not* a
346
+ wrong-URL problem. Regenerate the key in the web UI and
347
+ `dialout config set apiKey mch_…`. Check that `serverUrl` is the WebSocket base
348
+ (`wss://host/ws`) and does **not** include `/daemon`. The agent connects
349
+ outbound over TLS on 443, so an outbound firewall is the other thing to check.
350
+
351
+ **"not running" right after a reboot.**
352
+ A *login* service only starts once you log into the desktop session. For a
353
+ headless machine, or one you want to reach before login, use
354
+ `install-service --system`. At boot DNS may not be up yet, so a brief
355
+ `getaddrinfo ENOTFOUND` in `stderr.log` is expected — the agent retries every
356
+ 5 s and connects when the network arrives.
357
+
358
+ **Terminals do not work.**
359
+ Confirm the logs say *Connected and ready*, then check `node-pty`:
360
+ `node -e "require('node-pty')"`. If it fails, `npm rebuild node-pty`.
361
+
362
+ **The service will not start.**
363
+ macOS: read `~/.dialout/logs/stderr.log`. Linux:
364
+ `journalctl --user -u dialout` (drop `--user` for a `--system` install). Make
365
+ sure `dialout init` ran before the service was installed. If a previous
366
+ supervisor is stuck, `dialout repair` diagnoses and clears it.
367
+
368
+ ## Upgrading from an earlier package name
369
+
370
+ This agent has been published under three names. If you have an older one
371
+ installed, remove it first — they all provide the same `dialout` command, and
372
+ npm will not overwrite an existing binary:
32
373
 
33
374
  ```bash
34
- npm install -g dialout
375
+ dialout uninstall-service # stop the old service
376
+
377
+ npm uninstall -g dialout # the unscoped name (deprecated)
378
+ npm uninstall -g @indianic/devdash-agent # the original private package
379
+
380
+ npm install -g @indianic/dialout
381
+ dialout install-service --system # or without --system for a login service
382
+ dialout status
35
383
  ```
36
384
 
37
- Everything — what it does, how to set it up, the CLI reference, troubleshooting
38
- — is documented on the real package:
385
+ Your configuration is untouched by any of this. `~/.dialout/config.json` stays
386
+ where it is, and a much older `~/.devdash-agent` is **copied** rather than moved
387
+ on first run, so no re-`init` is needed.
388
+
389
+ > **If this 404s, check `~/.npmrc` for a scope override.** A line beginning
390
+ > `@indianic:registry=` points the whole scope at some other registry, and this
391
+ > package will not be found until it is removed:
392
+ >
393
+ > ```bash
394
+ > npm config get @indianic:registry # should be https://registry.npmjs.org/
395
+ > npm config delete @indianic:registry
396
+ > ```
397
+
398
+ ## The mobile app
399
+
400
+ Native **iOS and Android** apps are coming soon to the App Store and Google
401
+ Play. Until then the web dashboard installs as a PWA — *Add to Home Screen* —
402
+ with push notifications on both platforms today.
403
+
404
+ ## Changelog
405
+
406
+ Release history is in
407
+ [CHANGELOG.md](https://github.com/indianic/dialout/blob/main/packages/devdash-agent/CHANGELOG.md).
408
+ Note that entries below 1.0.0 are numbered 2.x: the agent shipped privately as
409
+ `@indianic/devdash-agent` and reached 2.7.4 before the open-source release reset
410
+ it to 1.0.0.
411
+
412
+ ## Contributing and issues
413
+
414
+ The whole project is open source at
415
+ **[github.com/indianic/dialout](https://github.com/indianic/dialout)**. Bugs and
416
+ feature requests go in
417
+ [Issues](https://github.com/indianic/dialout/issues); see
418
+ [CONTRIBUTING.md](https://github.com/indianic/dialout/blob/main/CONTRIBUTING.md).
419
+ Security reports go to the process in
420
+ [SECURITY.md](https://github.com/indianic/dialout/blob/main/SECURITY.md).
421
+
422
+ ---
423
+
424
+ <div align="center">
425
+
426
+ Built by **[Sandeep Mundra](mailto:sandeep@indianic.com)**, CTO of IndiaNIC, to
427
+ solve a problem he had himself — working on his office and home machines from
428
+ wherever he happened to be.
429
+
430
+ <sub>Sponsored and maintained by</sub>
431
+
432
+ ### [IndiaNIC Infotech Ltd](https://www.indianic.com)
433
+
434
+ [![Website](https://img.shields.io/badge/www.indianic.com-0c0e13?style=flat-square)](https://www.indianic.com)
435
+ [![Email](https://img.shields.io/badge/hello@indianic.com-1a56db?style=flat-square)](mailto:hello@indianic.com)
436
+
437
+ </div>
39
438
 
40
- **[npmjs.com/package/dialout](https://www.npmjs.com/package/dialout)** ·
41
- [github.com/indianic/dialout](https://github.com/indianic/dialout) ·
42
- [dialout.dev](https://www.dialout.dev)
439
+ Dialout is free and MIT licensed, and always will be. If you want it customised
440
+ for your team, integrated with your stack, or deployed and run for you, that is
441
+ what IndiaNIC does — reach us at
442
+ **[hello@indianic.com](mailto:hello@indianic.com)** or
443
+ **[www.indianic.com](https://www.indianic.com)**.
43
444
 
44
445
  ## Licence
45
446
 
package/bin/AGENTS.md ADDED
@@ -0,0 +1,44 @@
1
+ <!-- Parent: ../AGENTS.md -->
2
+ <!-- Generated: 2026-08-21 | Updated: 2026-08-21 -->
3
+
4
+ # bin
5
+
6
+ ## Purpose
7
+
8
+ npm bin shim. `package.json` `"bin": { "devdash-agent": "./bin/devdash-agent.js" }`.
9
+
10
+ ## Key Files
11
+
12
+ | File | Description |
13
+ |------|-------------|
14
+ | `devdash-agent.js` | Shebang wrapper that loads `dist/` CLI. |
15
+
16
+ ## Subdirectories
17
+
18
+ None.
19
+
20
+ ## For AI Agents
21
+
22
+ ### Working In This Directory
23
+
24
+ Don't put logic here — keep it a thin require/import of `dist`. After changing `src/cli.ts`, `npm run build` must run before the bin does anything new.
25
+
26
+ ### Testing Requirements
27
+
28
+ Covered indirectly by CLI tests / manual `devdash-agent --help`.
29
+
30
+ ### Common Patterns
31
+
32
+ Unix shebang + `require('../dist/...')`.
33
+
34
+ ## Dependencies
35
+
36
+ ### Internal
37
+
38
+ `../dist/` (built from `../src/`)
39
+
40
+ ### External
41
+
42
+ None.
43
+
44
+ <!-- MANUAL: -->
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/cli.js');
@@ -0,0 +1,3 @@
1
+ import { AiAdapter } from './types';
2
+ export declare const claudeAdapter: AiAdapter;
3
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/ai-adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AA6BtD,eAAO,MAAM,aAAa,EAAE,SA0D3B,CAAC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.claudeAdapter = void 0;
4
+ const types_1 = require("./types");
5
+ // Claude Code writes ~/.claude/projects/<escaped-cwd>/<session-uuid>.jsonl,
6
+ // one JSON record per line. `user` and `assistant` records carry a full
7
+ // Anthropic message object; the rest are session metadata.
8
+ function textOf(value) {
9
+ if (typeof value === 'string')
10
+ return value;
11
+ if (Array.isArray(value)) {
12
+ return value.map((b) => (typeof b?.text === 'string' ? b.text : '')).join('');
13
+ }
14
+ return '';
15
+ }
16
+ // A short human string, so the UI never has to understand a tool's schema.
17
+ function summarize(name, input) {
18
+ if (input && typeof input === 'object') {
19
+ if (typeof input.command === 'string')
20
+ return `${name}: ${input.command}`;
21
+ if (typeof input.file_path === 'string') {
22
+ // Absolute paths are long and the leading directories are noise on a
23
+ // phone; the last two segments identify the file well enough.
24
+ const parts = input.file_path.split('/').filter(Boolean);
25
+ return `${name} ${parts.slice(-2).join('/')}`;
26
+ }
27
+ if (typeof input.pattern === 'string')
28
+ return `${name}: ${input.pattern}`;
29
+ }
30
+ return name;
31
+ }
32
+ exports.claudeAdapter = {
33
+ toEvents(record) {
34
+ const rec = record;
35
+ if (!rec || typeof rec !== 'object')
36
+ return [];
37
+ if (rec.type !== 'user' && rec.type !== 'assistant')
38
+ return [];
39
+ // Subagent output would interleave incomprehensibly with the main thread.
40
+ if (rec.isSidechain)
41
+ return [];
42
+ const at = typeof rec.timestamp === 'string' ? rec.timestamp : '';
43
+ const id = typeof rec.uuid === 'string' ? rec.uuid : '';
44
+ const content = rec.message?.content;
45
+ if (content == null)
46
+ return [];
47
+ if (typeof content === 'string') {
48
+ if (!content)
49
+ return [];
50
+ return [{ kind: 'message', role: rec.type, text: content, id, at }];
51
+ }
52
+ if (!Array.isArray(content))
53
+ return [];
54
+ const events = [];
55
+ for (const block of content) {
56
+ if (!block || typeof block !== 'object')
57
+ continue;
58
+ switch (block.type) {
59
+ case 'tool_use':
60
+ events.push({
61
+ kind: 'tool_call', name: String(block.name || 'tool'),
62
+ summary: summarize(String(block.name || 'tool'), block.input),
63
+ input: block.input, id: String(block.id || id), at,
64
+ });
65
+ break;
66
+ case 'tool_result':
67
+ events.push({
68
+ kind: 'tool_result', forId: String(block.tool_use_id || ''),
69
+ ok: !block.is_error, preview: (0, types_1.preview)(textOf(block.content)), at,
70
+ });
71
+ break;
72
+ case 'thinking':
73
+ events.push({ kind: 'thinking', text: String(block.thinking || ''), id, at });
74
+ break;
75
+ default: {
76
+ // Includes 'text' and any block type a future release introduces.
77
+ // Rendering it as text keeps a new vendor format readable instead of
78
+ // silently dropping half the conversation.
79
+ const text = typeof block.text === 'string' ? block.text : '';
80
+ if (text)
81
+ events.push({ kind: 'message', role: rec.type, text, id, at });
82
+ }
83
+ }
84
+ }
85
+ return events;
86
+ },
87
+ title(record) {
88
+ const rec = record;
89
+ if (!rec || typeof rec !== 'object')
90
+ return null;
91
+ if (rec.type === 'custom-title' && typeof rec.customTitle === 'string')
92
+ return rec.customTitle;
93
+ if (rec.type === 'last-prompt' && typeof rec.lastPrompt === 'string')
94
+ return rec.lastPrompt;
95
+ return null;
96
+ },
97
+ };
98
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/ai-adapters/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { AiAdapter } from './types';
2
+ export declare const codexAdapter: AiAdapter;
3
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/ai-adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AAyCtD,eAAO,MAAM,YAAY,EAAE,SAsG1B,CAAC"}