@indianic/dialout 1.1.1 → 1.2.0

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 +429 -16
  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,28 +1,441 @@
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.
4
30
 
5
31
  ```bash
6
- npm install -g dialout
32
+ npm install -g @indianic/dialout
33
+ dialout init
34
+ dialout install-service
7
35
  ```
8
36
 
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.
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:
209
+
210
+ ```bash
211
+ dialout status
212
+ ```
213
+
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>
305
+
306
+ <br>
307
+
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
312
+
313
+ tail -f ~/.dialout/logs/stdout.log
314
+ tail -f ~/.dialout/logs/stderr.log
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
320
+ ```
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
337
+ ```
338
+
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:
373
+
374
+ ```bash
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
383
+ ```
384
+
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
+ > **On an IndiaNIC machine, check your `~/.npmrc` first.** A line reading
390
+ > `@indianic:registry=https://npm.indianic.in/` points the whole scope at a
391
+ > retired private registry, and this package will 404 until it is removed.
392
+
393
+ ## The mobile app
394
+
395
+ Native **iOS and Android** apps are coming soon to the App Store and Google
396
+ Play. Until then the web dashboard installs as a PWA — *Add to Home Screen* —
397
+ with push notifications on both platforms today.
398
+
399
+ ## Changelog
400
+
401
+ Release history is in
402
+ [CHANGELOG.md](https://github.com/indianic/dialout/blob/main/packages/devdash-agent/CHANGELOG.md).
403
+ Note that entries below 1.0.0 are numbered 2.x: the agent shipped privately as
404
+ `@indianic/devdash-agent` and reached 2.7.4 before the open-source release reset
405
+ it to 1.0.0.
406
+
407
+ ## Contributing and issues
408
+
409
+ The whole project is open source at
410
+ **[github.com/indianic/dialout](https://github.com/indianic/dialout)**. Bugs and
411
+ feature requests go in
412
+ [Issues](https://github.com/indianic/dialout/issues); see
413
+ [CONTRIBUTING.md](https://github.com/indianic/dialout/blob/main/CONTRIBUTING.md).
414
+ Security reports go to the process in
415
+ [SECURITY.md](https://github.com/indianic/dialout/blob/main/SECURITY.md).
416
+
417
+ ---
418
+
419
+ <div align="center">
420
+
421
+ Built by **[Sandeep Mundra](mailto:sandeep@indianic.com)**, CTO of IndiaNIC, to
422
+ solve a problem he had himself — working on his office and home machines from
423
+ wherever he happened to be.
424
+
425
+ <sub>Sponsored and maintained by</sub>
426
+
427
+ ### [IndiaNIC Infotech Ltd](https://www.indianic.com)
13
428
 
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`.
429
+ [![Website](https://img.shields.io/badge/www.indianic.com-0c0e13?style=flat-square)](https://www.indianic.com)
430
+ [![Email](https://img.shields.io/badge/hello@indianic.com-1a56db?style=flat-square)](mailto:hello@indianic.com)
19
431
 
20
- Everything — what it does, how to set it up, the CLI reference, troubleshooting
21
- — is documented on the real package:
432
+ </div>
22
433
 
23
- **[npmjs.com/package/dialout](https://www.npmjs.com/package/dialout)** ·
24
- [github.com/indianic/dialout](https://github.com/indianic/dialout) ·
25
- [dialout.dev](https://www.dialout.dev)
434
+ Dialout is free and MIT licensed, and always will be. If you want it customised
435
+ for your team, integrated with your stack, or deployed and run for you, that is
436
+ what IndiaNIC does — reach us at
437
+ **[hello@indianic.com](mailto:hello@indianic.com)** or
438
+ **[www.indianic.com](https://www.indianic.com)**.
26
439
 
27
440
  ## Licence
28
441
 
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":";;;AAAA,mCAAsD;AAEtD,4EAA4E;AAC5E,wEAAwE;AACxE,2DAA2D;AAE3D,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,IAAY,EAAE,KAAU;IACzC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1E,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxC,qEAAqE;YACrE,8DAA8D;YAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEY,QAAA,aAAa,GAAc;IACtC,QAAQ,CAAC,MAAe;QACtB,MAAM,GAAG,GAAG,MAAa,CAAC;QAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,EAAE,CAAC;QAC/D,0EAA0E;QAC1E,IAAI,GAAG,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAE/B,MAAM,EAAE,GAAW,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,EAAE,GAAW,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,EAAE,CAAC;QAE/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,UAAU;oBACb,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC;wBACrD,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;wBAC7D,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;qBACnD,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,aAAa;oBAChB,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;wBAC3D,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAA,eAAO,EAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE;qBACjE,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC9E,MAAM;gBACR,OAAO,CAAC,CAAC,CAAC;oBACR,kEAAkE;oBAClE,qEAAqE;oBACrE,2CAA2C;oBAC3C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,IAAI,IAAI;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAe;QACnB,MAAM,GAAG,GAAG,MAAa,CAAC;QAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,WAAW,CAAC;QAC/F,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -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"}