@oddessentials/agent-guild 0.1.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 (342) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/bin/agent-guild-report.mjs +134 -0
  4. package/bin/agent-guild.mjs +240 -0
  5. package/config/providers.default.json +124 -0
  6. package/examples/claude-code-settings.json +48 -0
  7. package/examples/codex-hooks.json +45 -0
  8. package/examples/gemini-settings.json +61 -0
  9. package/examples/grok-hooks.json +55 -0
  10. package/examples/providers.json +27 -0
  11. package/node_modules/@xterm/addon-fit/LICENSE +19 -0
  12. package/node_modules/@xterm/addon-fit/README.md +24 -0
  13. package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  14. package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
  15. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
  16. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
  17. package/node_modules/@xterm/addon-fit/package.json +26 -0
  18. package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
  19. package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
  20. package/node_modules/@xterm/addon-serialize/README.md +42 -0
  21. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  22. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +1 -0
  23. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  24. package/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +7 -0
  25. package/node_modules/@xterm/addon-serialize/package.json +29 -0
  26. package/node_modules/@xterm/addon-serialize/src/SerializeAddon.ts +695 -0
  27. package/node_modules/@xterm/addon-serialize/typings/addon-serialize.d.ts +116 -0
  28. package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
  29. package/node_modules/@xterm/addon-web-links/README.md +21 -0
  30. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
  31. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
  32. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
  33. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
  34. package/node_modules/@xterm/addon-web-links/package.json +26 -0
  35. package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
  36. package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
  37. package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
  38. package/node_modules/@xterm/headless/README.md +31 -0
  39. package/node_modules/@xterm/headless/lib-headless/xterm-headless.js +2 -0
  40. package/node_modules/@xterm/headless/lib-headless/xterm-headless.js.map +1 -0
  41. package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
  42. package/node_modules/@xterm/headless/lib-headless/xterm-headless.mjs.map +7 -0
  43. package/node_modules/@xterm/headless/package.json +29 -0
  44. package/node_modules/@xterm/headless/typings/xterm-headless.d.ts +1385 -0
  45. package/node_modules/@xterm/xterm/LICENSE +21 -0
  46. package/node_modules/@xterm/xterm/README.md +243 -0
  47. package/node_modules/@xterm/xterm/css/xterm.css +285 -0
  48. package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  49. package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
  50. package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
  51. package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
  52. package/node_modules/@xterm/xterm/package.json +111 -0
  53. package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
  54. package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
  55. package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
  56. package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
  57. package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
  58. package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
  59. package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
  60. package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
  61. package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  62. package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
  63. package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
  64. package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
  65. package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  66. package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
  67. package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
  68. package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
  69. package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
  70. package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
  71. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
  72. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
  73. package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
  74. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
  75. package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
  76. package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
  77. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
  78. package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
  79. package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
  80. package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
  81. package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  82. package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
  83. package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
  84. package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
  85. package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
  86. package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
  87. package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
  88. package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
  89. package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
  90. package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
  91. package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
  92. package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
  93. package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
  94. package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
  95. package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
  96. package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
  97. package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
  98. package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
  99. package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
  100. package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
  101. package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
  102. package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
  103. package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
  104. package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
  105. package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
  106. package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
  107. package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
  108. package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
  109. package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
  110. package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
  111. package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
  112. package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
  113. package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
  114. package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
  115. package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
  116. package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
  117. package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
  118. package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
  119. package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
  120. package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
  121. package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
  122. package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
  123. package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
  124. package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
  125. package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
  126. package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
  127. package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
  128. package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
  129. package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
  130. package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
  131. package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
  132. package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
  133. package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
  134. package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
  135. package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
  136. package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
  137. package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
  138. package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
  139. package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
  140. package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
  141. package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
  142. package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
  143. package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
  144. package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
  145. package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
  146. package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
  147. package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  148. package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
  149. package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
  150. package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
  151. package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
  152. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  153. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  154. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  155. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  156. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  157. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  158. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  159. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  160. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
  161. package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
  162. package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
  163. package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
  164. package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
  165. package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
  166. package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
  167. package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
  168. package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
  169. package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
  170. package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
  171. package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
  172. package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
  173. package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
  174. package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
  175. package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
  176. package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
  177. package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
  178. package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
  179. package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
  180. package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
  181. package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
  182. package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
  183. package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
  184. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
  185. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
  186. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
  187. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
  188. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
  189. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  190. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
  191. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
  192. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
  193. package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
  194. package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
  195. package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
  196. package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
  197. package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
  198. package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
  199. package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
  200. package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
  201. package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
  202. package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
  203. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  204. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
  205. package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
  206. package/node_modules/node-addon-api/LICENSE.md +9 -0
  207. package/node_modules/node-addon-api/README.md +319 -0
  208. package/node_modules/node-addon-api/common.gypi +20 -0
  209. package/node_modules/node-addon-api/except.gypi +25 -0
  210. package/node_modules/node-addon-api/index.js +12 -0
  211. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  212. package/node_modules/node-addon-api/napi-inl.h +6607 -0
  213. package/node_modules/node-addon-api/napi.h +3201 -0
  214. package/node_modules/node-addon-api/node_addon_api.gyp +32 -0
  215. package/node_modules/node-addon-api/node_api.gyp +9 -0
  216. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  217. package/node_modules/node-addon-api/nothing.c +0 -0
  218. package/node_modules/node-addon-api/package-support.json +21 -0
  219. package/node_modules/node-addon-api/package.json +480 -0
  220. package/node_modules/node-addon-api/tools/README.md +73 -0
  221. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  222. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  223. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  224. package/node_modules/node-addon-api/tools/eslint-format.js +79 -0
  225. package/node_modules/node-pty/LICENSE +69 -0
  226. package/node_modules/node-pty/README.md +164 -0
  227. package/node_modules/node-pty/binding.gyp +150 -0
  228. package/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  229. package/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  230. package/node_modules/node-pty/lib/index.js +52 -0
  231. package/node_modules/node-pty/lib/interfaces.js +7 -0
  232. package/node_modules/node-pty/lib/shared/conout.js +10 -0
  233. package/node_modules/node-pty/lib/terminal.js +190 -0
  234. package/node_modules/node-pty/lib/types.js +7 -0
  235. package/node_modules/node-pty/lib/unixTerminal.js +351 -0
  236. package/node_modules/node-pty/lib/utils.js +38 -0
  237. package/node_modules/node-pty/lib/windowsConoutConnection.js +131 -0
  238. package/node_modules/node-pty/lib/windowsPtyAgent.js +344 -0
  239. package/node_modules/node-pty/lib/windowsTerminal.js +209 -0
  240. package/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  241. package/node_modules/node-pty/package.json +66 -0
  242. package/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  243. package/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  244. package/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  245. package/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  246. package/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  247. package/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  248. package/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  249. package/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  250. package/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  251. package/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  252. package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  253. package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  254. package/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  255. package/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  256. package/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  257. package/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  258. package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  259. package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  260. package/node_modules/node-pty/scripts/post-install.js +76 -0
  261. package/node_modules/node-pty/scripts/prebuild.js +34 -0
  262. package/node_modules/node-pty/src/unix/pty.cc +876 -0
  263. package/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  264. package/node_modules/node-pty/src/win/conpty.cc +616 -0
  265. package/node_modules/node-pty/src/win/conpty.h +41 -0
  266. package/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  267. package/node_modules/node-pty/src/win/path_util.cc +95 -0
  268. package/node_modules/node-pty/src/win/path_util.h +26 -0
  269. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-arm64/OpenConsole.exe +0 -0
  270. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-arm64/conpty.dll +0 -0
  271. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-x64/OpenConsole.exe +0 -0
  272. package/node_modules/node-pty/third_party/conpty/1.25.260303002/win10-x64/conpty.dll +0 -0
  273. package/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  274. package/node_modules/ws/LICENSE +20 -0
  275. package/node_modules/ws/README.md +548 -0
  276. package/node_modules/ws/browser.js +8 -0
  277. package/node_modules/ws/index.js +22 -0
  278. package/node_modules/ws/lib/buffer-util.js +131 -0
  279. package/node_modules/ws/lib/constants.js +19 -0
  280. package/node_modules/ws/lib/event-target.js +292 -0
  281. package/node_modules/ws/lib/extension.js +203 -0
  282. package/node_modules/ws/lib/limiter.js +55 -0
  283. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  284. package/node_modules/ws/lib/receiver.js +743 -0
  285. package/node_modules/ws/lib/sender.js +607 -0
  286. package/node_modules/ws/lib/stream.js +161 -0
  287. package/node_modules/ws/lib/subprotocol.js +62 -0
  288. package/node_modules/ws/lib/validation.js +152 -0
  289. package/node_modules/ws/lib/websocket-server.js +562 -0
  290. package/node_modules/ws/lib/websocket.js +1421 -0
  291. package/node_modules/ws/package.json +74 -0
  292. package/node_modules/ws/wrapper.mjs +21 -0
  293. package/package.json +52 -0
  294. package/src/manager/command-resolver.mjs +140 -0
  295. package/src/manager/config.mjs +94 -0
  296. package/src/manager/install-channels.mjs +268 -0
  297. package/src/manager/main.mjs +136 -0
  298. package/src/manager/providers.mjs +601 -0
  299. package/src/manager/report-shims.mjs +104 -0
  300. package/src/manager/server.mjs +421 -0
  301. package/src/manager/session-manager.mjs +306 -0
  302. package/src/manager/session.mjs +531 -0
  303. package/src/manager/shell-env.mjs +150 -0
  304. package/src/manager/usage.mjs +535 -0
  305. package/src/manager/versions.mjs +62 -0
  306. package/src/report/hooks.mjs +150 -0
  307. package/web/app.js +916 -0
  308. package/web/art/art.css +186 -0
  309. package/web/art/characters/anthropic/idle.png +0 -0
  310. package/web/art/characters/anthropic/locked.png +0 -0
  311. package/web/art/characters/anthropic/working.png +0 -0
  312. package/web/art/characters/google/idle.png +0 -0
  313. package/web/art/characters/google/locked.png +0 -0
  314. package/web/art/characters/google/working.png +0 -0
  315. package/web/art/characters/openai/idle.png +0 -0
  316. package/web/art/characters/openai/locked.png +0 -0
  317. package/web/art/characters/openai/working.png +0 -0
  318. package/web/art/characters/shell/idle.png +0 -0
  319. package/web/art/characters/shell/locked.png +0 -0
  320. package/web/art/characters/shell/working.png +0 -0
  321. package/web/art/characters/xai/idle.png +0 -0
  322. package/web/art/characters/xai/locked.png +0 -0
  323. package/web/art/characters/xai/working.png +0 -0
  324. package/web/art/familiars/aether.png +0 -0
  325. package/web/art/familiars/flame.png +0 -0
  326. package/web/art/familiars/leaf.png +0 -0
  327. package/web/art/familiars/night.png +0 -0
  328. package/web/art/icons/anthropic.png +0 -0
  329. package/web/art/icons/google.png +0 -0
  330. package/web/art/icons/openai.png +0 -0
  331. package/web/art/icons/shell.png +0 -0
  332. package/web/art/icons/xai.png +0 -0
  333. package/web/art/page.png +0 -0
  334. package/web/art/ui/frame.png +0 -0
  335. package/web/art/ui/gem-mana.png +0 -0
  336. package/web/art/ui/gem-vitality.png +0 -0
  337. package/web/art/ui/guild-crest.png +0 -0
  338. package/web/art/ui/level-medallion.png +0 -0
  339. package/web/art/ui/padlock.png +0 -0
  340. package/web/icons/README.md +8 -0
  341. package/web/index.html +154 -0
  342. package/web/styles.css +226 -0
@@ -0,0 +1,876 @@
1
+ /**
2
+ * Copyright (c) 2012-2015, Christopher Jeffrey (MIT License)
3
+ * Copyright (c) 2017, Daniel Imms (MIT License)
4
+ *
5
+ * pty.cc:
6
+ * This file is responsible for starting processes
7
+ * with pseudo-terminal file descriptors.
8
+ *
9
+ * See:
10
+ * man pty
11
+ * man tty_ioctl
12
+ * man termios
13
+ * man forkpty
14
+ */
15
+
16
+ /**
17
+ * Includes
18
+ */
19
+
20
+ #define NODE_ADDON_API_DISABLE_DEPRECATED
21
+ #include <napi.h>
22
+ #include <assert.h>
23
+ #include <errno.h>
24
+ #include <string.h>
25
+ #include <stdlib.h>
26
+ #include <unistd.h>
27
+ #include <thread>
28
+
29
+ #include <sys/types.h>
30
+ #include <sys/stat.h>
31
+ #include <sys/ioctl.h>
32
+ #include <sys/wait.h>
33
+ #include <fcntl.h>
34
+ #include <signal.h>
35
+
36
+ /* forkpty */
37
+ /* http://www.gnu.org/software/gnulib/manual/html_node/forkpty.html */
38
+ #if defined(__linux__)
39
+ #include <pty.h>
40
+ #include <dirent.h>
41
+ #include <sys/syscall.h>
42
+ #elif defined(__APPLE__)
43
+ #include <util.h>
44
+ #elif defined(__FreeBSD__)
45
+ #include <libutil.h>
46
+ #include <termios.h>
47
+ #elif defined(__OpenBSD__)
48
+ #include <util.h>
49
+ #include <termios.h>
50
+ #endif
51
+
52
+ /* Some platforms name VWERASE and VDISCARD differently */
53
+ #if !defined(VWERASE) && defined(VWERSE)
54
+ #define VWERASE VWERSE
55
+ #endif
56
+ #if !defined(VDISCARD) && defined(VDISCRD)
57
+ #define VDISCARD VDISCRD
58
+ #endif
59
+
60
+ /* for pty_getproc */
61
+ #if defined(__linux__)
62
+ #include <stdio.h>
63
+ #include <stdint.h>
64
+ #elif defined(__APPLE__)
65
+ #include <libproc.h>
66
+ #include <os/availability.h>
67
+ #include <paths.h>
68
+ #include <spawn.h>
69
+ #include <sys/event.h>
70
+ #include <sys/sysctl.h>
71
+ #include <termios.h>
72
+ #endif
73
+
74
+ /* NSIG - macro for highest signal + 1, should be defined */
75
+ #ifndef NSIG
76
+ #define NSIG 32
77
+ #endif
78
+
79
+ /* macOS 10.14 back does not define this constant */
80
+ #ifndef POSIX_SPAWN_SETSID
81
+ #define POSIX_SPAWN_SETSID 1024
82
+ #endif
83
+
84
+ /* environ for execvpe */
85
+ /* node/src/node_child_process.cc */
86
+ #if !defined(__APPLE__)
87
+ extern char **environ;
88
+ #endif
89
+
90
+ #if defined(__APPLE__)
91
+ extern "C" {
92
+ // Changes the current thread's directory to a path or directory file
93
+ // descriptor. libpthread only exposes a syscall wrapper starting in
94
+ // macOS 10.12, but the system call dates back to macOS 10.5. On older OSes,
95
+ // the syscall is issued directly.
96
+ int pthread_chdir_np(const char* dir) API_AVAILABLE(macosx(10.12));
97
+ int pthread_fchdir_np(int fd) API_AVAILABLE(macosx(10.12));
98
+ }
99
+
100
+ #define HANDLE_EINTR(x) ({ \
101
+ int eintr_wrapper_counter = 0; \
102
+ decltype(x) eintr_wrapper_result; \
103
+ do { \
104
+ eintr_wrapper_result = (x); \
105
+ } while (eintr_wrapper_result == -1 && errno == EINTR && \
106
+ eintr_wrapper_counter++ < 100); \
107
+ eintr_wrapper_result; \
108
+ })
109
+ #endif
110
+
111
+ struct ExitEvent {
112
+ int exit_code = 0, signal_code = 0;
113
+ };
114
+
115
+ #if defined(__linux__)
116
+
117
+ static int
118
+ SetCloseOnExec(int fd) {
119
+ int flags = fcntl(fd, F_GETFD, 0);
120
+ if (flags == -1)
121
+ return flags;
122
+ if (flags & FD_CLOEXEC)
123
+ return 0;
124
+ return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
125
+ }
126
+
127
+ /**
128
+ * Close all file descriptors >= 3 to prevent FD leakage to child processes.
129
+ * Uses close_range() syscall on Linux 5.9+, falls back to /proc/self/fd iteration.
130
+ */
131
+ static void
132
+ pty_close_inherited_fds() {
133
+ // Try close_range() first (Linux 5.9+, glibc 2.34+)
134
+ #if defined(SYS_close_range) && defined(CLOSE_RANGE_CLOEXEC)
135
+ if (syscall(SYS_close_range, 3, ~0U, CLOSE_RANGE_CLOEXEC) == 0) {
136
+ return;
137
+ }
138
+ #endif
139
+
140
+ int fd;
141
+ // Set the CLOEXEC flag on all open descriptors. Unconditionally try the first
142
+ // 16 file descriptors. After that, bail out after the first error.
143
+ for (fd = 3; ; fd++)
144
+ if (SetCloseOnExec(fd) && fd > 15)
145
+ break;
146
+ }
147
+ #endif
148
+
149
+ void SetupExitCallback(Napi::Env env, Napi::Function cb, pid_t pid) {
150
+ std::thread *th = new std::thread;
151
+ // Don't use Napi::AsyncWorker which is limited by UV_THREADPOOL_SIZE.
152
+ auto tsfn = Napi::ThreadSafeFunction::New(
153
+ env,
154
+ cb, // JavaScript function called asynchronously
155
+ "SetupExitCallback_resource", // Name
156
+ 0, // Unlimited queue
157
+ 1, // Only one thread will use this initially
158
+ [th](Napi::Env) { // Finalizer used to clean threads up
159
+ th->join();
160
+ delete th;
161
+ });
162
+ *th = std::thread([tsfn = std::move(tsfn), pid] {
163
+ auto callback = [](Napi::Env env, Napi::Function cb, ExitEvent *exit_event) {
164
+ cb.Call({Napi::Number::New(env, exit_event->exit_code),
165
+ Napi::Number::New(env, exit_event->signal_code)});
166
+ delete exit_event;
167
+ };
168
+
169
+ int ret;
170
+ int stat_loc;
171
+ #if defined(__APPLE__)
172
+ // Based on
173
+ // https://source.chromium.org/chromium/chromium/src/+/main:base/process/kill_mac.cc;l=35-69?
174
+ int kq = HANDLE_EINTR(kqueue());
175
+ struct kevent change = {0};
176
+ EV_SET(&change, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
177
+ ret = HANDLE_EINTR(kevent(kq, &change, 1, NULL, 0, NULL));
178
+ if (ret == -1) {
179
+ if (errno == ESRCH) {
180
+ // At this point, one of the following has occurred:
181
+ // 1. The process has died but has not yet been reaped.
182
+ // 2. The process has died and has already been reaped.
183
+ // 3. The process is in the process of dying. It's no longer
184
+ // kqueueable, but it may not be waitable yet either. Mark calls
185
+ // this case the "zombie death race".
186
+ ret = HANDLE_EINTR(waitpid(pid, &stat_loc, WNOHANG));
187
+ if (ret == 0) {
188
+ ret = kill(pid, SIGKILL);
189
+ if (ret != -1) {
190
+ HANDLE_EINTR(waitpid(pid, &stat_loc, 0));
191
+ }
192
+ }
193
+ }
194
+ } else {
195
+ struct kevent event = {0};
196
+ ret = HANDLE_EINTR(kevent(kq, NULL, 0, &event, 1, NULL));
197
+ if (ret == 1) {
198
+ if ((event.fflags & NOTE_EXIT) &&
199
+ (event.ident == static_cast<uintptr_t>(pid))) {
200
+ // The process is dead or dying. This won't block for long, if at
201
+ // all.
202
+ HANDLE_EINTR(waitpid(pid, &stat_loc, 0));
203
+ }
204
+ }
205
+ }
206
+ close(kq);
207
+ #else
208
+ while (true) {
209
+ errno = 0;
210
+ if ((ret = waitpid(pid, &stat_loc, 0)) != pid) {
211
+ if (ret == -1 && errno == EINTR) {
212
+ continue;
213
+ }
214
+ if (ret == -1 && errno == ECHILD) {
215
+ // XXX node v0.8.x seems to have this problem.
216
+ // waitpid is already handled elsewhere.
217
+ ;
218
+ } else {
219
+ assert(false);
220
+ }
221
+ }
222
+ break;
223
+ }
224
+ #endif
225
+ ExitEvent *exit_event = new ExitEvent;
226
+ if (WIFEXITED(stat_loc)) {
227
+ exit_event->exit_code = WEXITSTATUS(stat_loc); // errno?
228
+ }
229
+ if (WIFSIGNALED(stat_loc)) {
230
+ exit_event->signal_code = WTERMSIG(stat_loc);
231
+ }
232
+ auto status = tsfn.BlockingCall(exit_event, callback); // In main thread
233
+ switch (status) {
234
+ case napi_closing:
235
+ break;
236
+
237
+ case napi_queue_full:
238
+ Napi::Error::Fatal("SetupExitCallback", "Queue was full");
239
+
240
+ case napi_ok:
241
+ if (tsfn.Release() != napi_ok) {
242
+ Napi::Error::Fatal("SetupExitCallback", "ThreadSafeFunction.Release() failed");
243
+ }
244
+ break;
245
+
246
+ default:
247
+ Napi::Error::Fatal("SetupExitCallback", "ThreadSafeFunction.BlockingCall() failed");
248
+ }
249
+ });
250
+ }
251
+
252
+ /**
253
+ * Methods
254
+ */
255
+
256
+ Napi::Value PtyFork(const Napi::CallbackInfo& info);
257
+ Napi::Value PtyOpen(const Napi::CallbackInfo& info);
258
+ Napi::Value PtyResize(const Napi::CallbackInfo& info);
259
+ Napi::Value PtyGetProc(const Napi::CallbackInfo& info);
260
+
261
+ /**
262
+ * Functions
263
+ */
264
+
265
+ static int
266
+ pty_nonblock(int);
267
+
268
+ #if defined(__APPLE__)
269
+ static char *
270
+ pty_getproc(int);
271
+ #else
272
+ static char *
273
+ pty_getproc(int, char *);
274
+ #endif
275
+
276
+ #if defined(__APPLE__) || defined(__OpenBSD__)
277
+ static void
278
+ pty_posix_spawn(char** argv, char** env,
279
+ const struct termios *termp,
280
+ const struct winsize *winp,
281
+ int* master,
282
+ pid_t* pid,
283
+ std::string* err);
284
+ #endif
285
+
286
+ struct DelBuf {
287
+ int len;
288
+ DelBuf(int len) : len(len) {}
289
+ void operator()(char **p) {
290
+ if (p == nullptr)
291
+ return;
292
+ for (int i = 0; i < len; i++)
293
+ free(p[i]);
294
+ delete[] p;
295
+ }
296
+ };
297
+
298
+ Napi::Value PtyFork(const Napi::CallbackInfo& info) {
299
+ Napi::Env napiEnv(info.Env());
300
+ Napi::HandleScope scope(napiEnv);
301
+
302
+ if (info.Length() != 11 ||
303
+ !info[0].IsString() ||
304
+ !info[1].IsArray() ||
305
+ !info[2].IsArray() ||
306
+ !info[3].IsString() ||
307
+ !info[4].IsNumber() ||
308
+ !info[5].IsNumber() ||
309
+ !info[6].IsNumber() ||
310
+ !info[7].IsNumber() ||
311
+ !info[8].IsBoolean() ||
312
+ !info[9].IsString() ||
313
+ !info[10].IsFunction()) {
314
+ throw Napi::Error::New(napiEnv, "Usage: pty.fork(file, args, env, cwd, cols, rows, uid, gid, utf8, helperPath, onexit)");
315
+ }
316
+
317
+ // file
318
+ std::string file = info[0].As<Napi::String>();
319
+
320
+ // args
321
+ Napi::Array argv_ = info[1].As<Napi::Array>();
322
+
323
+ // env
324
+ Napi::Array env_ = info[2].As<Napi::Array>();
325
+ int envc = env_.Length();
326
+ std::unique_ptr<char *, DelBuf> env_unique_ptr(new char *[envc + 1], DelBuf(envc + 1));
327
+ char **env = env_unique_ptr.get();
328
+ env[envc] = NULL;
329
+ for (int i = 0; i < envc; i++) {
330
+ std::string pair = env_.Get(i).As<Napi::String>();
331
+ env[i] = strdup(pair.c_str());
332
+ }
333
+
334
+ // cwd
335
+ std::string cwd_ = info[3].As<Napi::String>();
336
+
337
+ // size
338
+ struct winsize winp;
339
+ winp.ws_col = info[4].As<Napi::Number>().Int32Value();
340
+ winp.ws_row = info[5].As<Napi::Number>().Int32Value();
341
+ winp.ws_xpixel = 0;
342
+ winp.ws_ypixel = 0;
343
+
344
+ #if !defined(__APPLE__)
345
+ // uid / gid
346
+ int uid = info[6].As<Napi::Number>().Int32Value();
347
+ int gid = info[7].As<Napi::Number>().Int32Value();
348
+ #endif
349
+
350
+ // termios
351
+ struct termios t = termios();
352
+ struct termios *term = &t;
353
+ term->c_iflag = ICRNL | IXON | IXANY | IMAXBEL | BRKINT;
354
+ if (info[8].As<Napi::Boolean>().Value()) {
355
+ #if defined(IUTF8)
356
+ term->c_iflag |= IUTF8;
357
+ #endif
358
+ }
359
+ term->c_oflag = OPOST | ONLCR;
360
+ term->c_cflag = CREAD | CS8 | HUPCL;
361
+ term->c_lflag = ICANON | ISIG | IEXTEN | ECHO | ECHOE | ECHOK | ECHOKE | ECHOCTL;
362
+
363
+ term->c_cc[VEOF] = 4;
364
+ term->c_cc[VEOL] = -1;
365
+ term->c_cc[VEOL2] = -1;
366
+ term->c_cc[VERASE] = 0x7f;
367
+ term->c_cc[VWERASE] = 23;
368
+ term->c_cc[VKILL] = 21;
369
+ term->c_cc[VREPRINT] = 18;
370
+ term->c_cc[VINTR] = 3;
371
+ term->c_cc[VQUIT] = 0x1c;
372
+ term->c_cc[VSUSP] = 26;
373
+ term->c_cc[VSTART] = 17;
374
+ term->c_cc[VSTOP] = 19;
375
+ term->c_cc[VLNEXT] = 22;
376
+ term->c_cc[VDISCARD] = 15;
377
+ term->c_cc[VMIN] = 1;
378
+ term->c_cc[VTIME] = 0;
379
+
380
+ #if (__APPLE__)
381
+ term->c_cc[VDSUSP] = 25;
382
+ term->c_cc[VSTATUS] = 20;
383
+ #endif
384
+
385
+ cfsetispeed(term, B38400);
386
+ cfsetospeed(term, B38400);
387
+
388
+ // helperPath
389
+ std::string helper_path = info[9].As<Napi::String>();
390
+
391
+ pid_t pid;
392
+ int master = -1;
393
+ #if defined(__APPLE__)
394
+ int argc = argv_.Length();
395
+ int argl = argc + 4;
396
+ std::unique_ptr<char *, DelBuf> argv_unique_ptr(new char *[argl], DelBuf(argl));
397
+ char **argv = argv_unique_ptr.get();
398
+ argv[0] = strdup(helper_path.c_str());
399
+ argv[1] = strdup(cwd_.c_str());
400
+ argv[2] = strdup(file.c_str());
401
+ argv[argl - 1] = NULL;
402
+ for (int i = 0; i < argc; i++) {
403
+ std::string arg = argv_.Get(i).As<Napi::String>();
404
+ argv[i + 3] = strdup(arg.c_str());
405
+ }
406
+
407
+ std::string err;
408
+ pty_posix_spawn(argv, env, term, &winp, &master, &pid, &err);
409
+ if (!err.empty()) {
410
+ if (master != -1) {
411
+ close(master);
412
+ }
413
+ throw Napi::Error::New(napiEnv, err);
414
+ }
415
+ if (pty_nonblock(master) == -1) {
416
+ throw Napi::Error::New(napiEnv, "Could not set master fd to nonblocking.");
417
+ }
418
+ #else
419
+ int argc = argv_.Length();
420
+ int argl = argc + 2;
421
+ std::unique_ptr<char *, DelBuf> argv_unique_ptr(new char *[argl], DelBuf(argl));
422
+ char** argv = argv_unique_ptr.get();
423
+ argv[0] = strdup(file.c_str());
424
+ argv[argl - 1] = NULL;
425
+ for (int i = 0; i < argc; i++) {
426
+ std::string arg = argv_.Get(i).As<Napi::String>();
427
+ argv[i + 1] = strdup(arg.c_str());
428
+ }
429
+
430
+ sigset_t newmask, oldmask;
431
+ struct sigaction sig_action;
432
+ // temporarily block all signals
433
+ // this is needed due to a race condition in openpty
434
+ // and to avoid running signal handlers in the child
435
+ // before exec* happened
436
+ sigfillset(&newmask);
437
+ pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
438
+
439
+ pid = forkpty(&master, nullptr, static_cast<termios*>(term), static_cast<winsize*>(&winp));
440
+
441
+ if (!pid) {
442
+ // remove all signal handler from child
443
+ sig_action.sa_handler = SIG_DFL;
444
+ sig_action.sa_flags = 0;
445
+ sigemptyset(&sig_action.sa_mask);
446
+ for (int i = 0 ; i < NSIG ; i++) { // NSIG is a macro for all signals + 1
447
+ sigaction(i, &sig_action, NULL);
448
+ }
449
+ }
450
+
451
+ // reenable signals
452
+ pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
453
+
454
+ switch (pid) {
455
+ case -1:
456
+ throw Napi::Error::New(napiEnv, "forkpty(3) failed.");
457
+ case 0:
458
+ if (strlen(cwd_.c_str())) {
459
+ if (chdir(cwd_.c_str()) == -1) {
460
+ perror("chdir(2) failed.");
461
+ _exit(1);
462
+ }
463
+ }
464
+
465
+ if (uid != -1 && gid != -1) {
466
+ if (setgid(gid) == -1) {
467
+ perror("setgid(2) failed.");
468
+ _exit(1);
469
+ }
470
+ if (setuid(uid) == -1) {
471
+ perror("setuid(2) failed.");
472
+ _exit(1);
473
+ }
474
+ }
475
+
476
+ // Close inherited FDs to prevent leaking pty master FDs to child
477
+ pty_close_inherited_fds();
478
+
479
+ {
480
+ char **old = environ;
481
+ environ = env;
482
+ execvp(argv[0], argv);
483
+ environ = old;
484
+ perror("execvp(3) failed.");
485
+ _exit(1);
486
+ }
487
+ default:
488
+ if (pty_nonblock(master) == -1) {
489
+ throw Napi::Error::New(napiEnv, "Could not set master fd to nonblocking.");
490
+ }
491
+ }
492
+ #endif
493
+
494
+ Napi::Object obj = Napi::Object::New(napiEnv);
495
+ obj.Set("fd", Napi::Number::New(napiEnv, master));
496
+ obj.Set("pid", Napi::Number::New(napiEnv, pid));
497
+ obj.Set("pty", Napi::String::New(napiEnv, ptsname(master)));
498
+
499
+ // Set up process exit callback.
500
+ Napi::Function cb = info[10].As<Napi::Function>();
501
+ SetupExitCallback(napiEnv, cb, pid);
502
+ return obj;
503
+ }
504
+
505
+ Napi::Value PtyOpen(const Napi::CallbackInfo& info) {
506
+ Napi::Env env(info.Env());
507
+ Napi::HandleScope scope(env);
508
+
509
+ if (info.Length() != 2 ||
510
+ !info[0].IsNumber() ||
511
+ !info[1].IsNumber()) {
512
+ throw Napi::Error::New(env, "Usage: pty.open(cols, rows)");
513
+ }
514
+
515
+ // size
516
+ struct winsize winp;
517
+ winp.ws_col = info[0].As<Napi::Number>().Int32Value();
518
+ winp.ws_row = info[1].As<Napi::Number>().Int32Value();
519
+ winp.ws_xpixel = 0;
520
+ winp.ws_ypixel = 0;
521
+
522
+ // pty
523
+ int master, slave;
524
+ int ret = openpty(&master, &slave, nullptr, NULL, static_cast<winsize*>(&winp));
525
+
526
+ if (ret == -1) {
527
+ throw Napi::Error::New(env, "openpty(3) failed.");
528
+ }
529
+
530
+ if (pty_nonblock(master) == -1) {
531
+ throw Napi::Error::New(env, "Could not set master fd to nonblocking.");
532
+ }
533
+
534
+ if (pty_nonblock(slave) == -1) {
535
+ throw Napi::Error::New(env, "Could not set slave fd to nonblocking.");
536
+ }
537
+
538
+ Napi::Object obj = Napi::Object::New(env);
539
+ obj.Set("master", Napi::Number::New(env, master));
540
+ obj.Set("slave", Napi::Number::New(env, slave));
541
+ obj.Set("pty", Napi::String::New(env, ptsname(master)));
542
+
543
+ return obj;
544
+ }
545
+
546
+ Napi::Value PtyResize(const Napi::CallbackInfo& info) {
547
+ Napi::Env env(info.Env());
548
+ Napi::HandleScope scope(env);
549
+
550
+ if (info.Length() != 5 ||
551
+ !info[0].IsNumber() ||
552
+ !info[1].IsNumber() ||
553
+ !info[2].IsNumber() ||
554
+ !info[3].IsNumber() ||
555
+ !info[4].IsNumber()) {
556
+ throw Napi::Error::New(env, "Usage: pty.resize(fd, cols, rows, xPixel, yPixel)");
557
+ }
558
+
559
+ int fd = info[0].As<Napi::Number>().Int32Value();
560
+
561
+ struct winsize winp;
562
+ winp.ws_col = info[1].As<Napi::Number>().Int32Value();
563
+ winp.ws_row = info[2].As<Napi::Number>().Int32Value();
564
+ winp.ws_xpixel = info[3].As<Napi::Number>().Int32Value();
565
+ winp.ws_ypixel = info[4].As<Napi::Number>().Int32Value();
566
+
567
+ if (ioctl(fd, TIOCSWINSZ, &winp) == -1) {
568
+ switch (errno) {
569
+ case EBADF:
570
+ throw Napi::Error::New(env, "ioctl(2) failed, EBADF");
571
+ case EFAULT:
572
+ throw Napi::Error::New(env, "ioctl(2) failed, EFAULT");
573
+ case EINVAL:
574
+ throw Napi::Error::New(env, "ioctl(2) failed, EINVAL");
575
+ case ENOTTY:
576
+ throw Napi::Error::New(env, "ioctl(2) failed, ENOTTY");
577
+ }
578
+ throw Napi::Error::New(env, "ioctl(2) failed");
579
+ }
580
+
581
+ return env.Undefined();
582
+ }
583
+
584
+ /**
585
+ * Foreground Process Name
586
+ */
587
+ Napi::Value PtyGetProc(const Napi::CallbackInfo& info) {
588
+ Napi::Env env(info.Env());
589
+ Napi::HandleScope scope(env);
590
+
591
+ #if defined(__APPLE__)
592
+ if (info.Length() != 1 ||
593
+ !info[0].IsNumber()) {
594
+ throw Napi::Error::New(env, "Usage: pty.process(pid)");
595
+ }
596
+
597
+ int fd = info[0].As<Napi::Number>().Int32Value();
598
+ char *name = pty_getproc(fd);
599
+ #else
600
+ if (info.Length() != 2 ||
601
+ !info[0].IsNumber() ||
602
+ !info[1].IsString()) {
603
+ throw Napi::Error::New(env, "Usage: pty.process(fd, tty)");
604
+ }
605
+
606
+ int fd = info[0].As<Napi::Number>().Int32Value();
607
+
608
+ std::string tty_ = info[1].As<Napi::String>();
609
+ char *tty = strdup(tty_.c_str());
610
+ char *name = pty_getproc(fd, tty);
611
+ free(tty);
612
+ #endif
613
+
614
+ if (name == NULL) {
615
+ return env.Undefined();
616
+ }
617
+
618
+ Napi::String name_ = Napi::String::New(env, name);
619
+ free(name);
620
+ return name_;
621
+ }
622
+
623
+ /**
624
+ * Nonblocking FD
625
+ */
626
+
627
+ static int
628
+ pty_nonblock(int fd) {
629
+ int flags = fcntl(fd, F_GETFL, 0);
630
+ if (flags == -1) return -1;
631
+ return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
632
+ }
633
+
634
+ /**
635
+ * pty_getproc
636
+ * Taken from tmux.
637
+ */
638
+
639
+ // Taken from: tmux (http://tmux.sourceforge.net/)
640
+ // Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
641
+ // Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
642
+ // Copyright (c) 2009 Todd Carson <toc@daybefore.net>
643
+ //
644
+ // Permission to use, copy, modify, and distribute this software for any
645
+ // purpose with or without fee is hereby granted, provided that the above
646
+ // copyright notice and this permission notice appear in all copies.
647
+ //
648
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
649
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
650
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
651
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
652
+ // WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
653
+ // IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
654
+ // OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
655
+
656
+ #if defined(__linux__)
657
+
658
+ static char *
659
+ pty_getproc(int fd, char *tty) {
660
+ FILE *f;
661
+ char *path, *buf;
662
+ size_t len;
663
+ int ch;
664
+ pid_t pgrp;
665
+ int r;
666
+
667
+ if ((pgrp = tcgetpgrp(fd)) == -1) {
668
+ return NULL;
669
+ }
670
+
671
+ r = asprintf(&path, "/proc/%lld/cmdline", (long long)pgrp);
672
+ if (r == -1 || path == NULL) return NULL;
673
+
674
+ if ((f = fopen(path, "r")) == NULL) {
675
+ free(path);
676
+ return NULL;
677
+ }
678
+
679
+ free(path);
680
+
681
+ len = 0;
682
+ buf = NULL;
683
+ while ((ch = fgetc(f)) != EOF) {
684
+ if (ch == '\0') break;
685
+ buf = (char *)realloc(buf, len + 2);
686
+ if (buf == NULL) return NULL;
687
+ buf[len++] = ch;
688
+ }
689
+
690
+ if (buf != NULL) {
691
+ buf[len] = '\0';
692
+ }
693
+
694
+ fclose(f);
695
+ return buf;
696
+ }
697
+
698
+ #elif defined(__APPLE__)
699
+
700
+ static char *
701
+ pty_getproc(int fd) {
702
+ int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 };
703
+ size_t size;
704
+ struct kinfo_proc kp;
705
+
706
+ if ((mib[3] = tcgetpgrp(fd)) == -1) {
707
+ return NULL;
708
+ }
709
+
710
+ size = sizeof kp;
711
+ if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1) {
712
+ return NULL;
713
+ }
714
+
715
+ if (size != (sizeof kp) || *kp.kp_proc.p_comm == '\0') {
716
+ return NULL;
717
+ }
718
+
719
+ return strdup(kp.kp_proc.p_comm);
720
+ }
721
+
722
+ #else
723
+
724
+ static char *
725
+ pty_getproc(int fd, char *tty) {
726
+ return NULL;
727
+ }
728
+
729
+ #endif
730
+
731
+ #if defined(__APPLE__)
732
+ static std::string format_error(const char* func, int err_code) {
733
+ char buf[256];
734
+ snprintf(buf, sizeof(buf), "%s: %s", func, strerror(err_code));
735
+ return buf;
736
+ }
737
+
738
+ static void
739
+ pty_posix_spawn(char** argv, char** env,
740
+ const struct termios *termp,
741
+ const struct winsize *winp,
742
+ int* master,
743
+ pid_t* pid,
744
+ std::string* err) {
745
+ int low_fds[3];
746
+ size_t count = 0;
747
+ int res = 0;
748
+ int slave = -1;
749
+ char slave_pty_name[128];
750
+ int spawn_err;
751
+ sigset_t signal_set;
752
+
753
+ for (; count < 3; count++) {
754
+ low_fds[count] = posix_openpt(O_RDWR);
755
+ if (low_fds[count] >= STDERR_FILENO)
756
+ break;
757
+ }
758
+
759
+ int flags = POSIX_SPAWN_CLOEXEC_DEFAULT |
760
+ POSIX_SPAWN_SETSIGDEF |
761
+ POSIX_SPAWN_SETSIGMASK |
762
+ POSIX_SPAWN_SETSID;
763
+
764
+ posix_spawn_file_actions_t acts;
765
+ posix_spawn_file_actions_init(&acts);
766
+
767
+ posix_spawnattr_t attrs;
768
+ posix_spawnattr_init(&attrs);
769
+
770
+ *master = posix_openpt(O_RDWR);
771
+ if (*master == -1) {
772
+ *err = format_error("posix_openpt failed", errno);
773
+ goto done;
774
+ }
775
+
776
+ res = grantpt(*master);
777
+ if (res == -1) {
778
+ *err = format_error("grantpt failed", errno);
779
+ goto done;
780
+ }
781
+
782
+ res = unlockpt(*master);
783
+ if (res == -1) {
784
+ *err = format_error("unlockpt failed", errno);
785
+ goto done;
786
+ }
787
+
788
+ // Use TIOCPTYGNAME instead of ptsname() to avoid threading problems.
789
+ res = ioctl(*master, TIOCPTYGNAME, slave_pty_name);
790
+ if (res == -1) {
791
+ *err = format_error("ioctl(TIOCPTYGNAME) failed", errno);
792
+ goto done;
793
+ }
794
+
795
+ slave = open(slave_pty_name, O_RDWR | O_NOCTTY);
796
+ if (slave == -1) {
797
+ *err = format_error("open slave pty failed", errno);
798
+ goto done;
799
+ }
800
+
801
+ if (termp) {
802
+ res = tcsetattr(slave, TCSANOW, termp);
803
+ if (res == -1) {
804
+ *err = format_error("tcsetattr failed", errno);
805
+ goto done;
806
+ };
807
+ }
808
+
809
+ if (winp) {
810
+ res = ioctl(slave, TIOCSWINSZ, winp);
811
+ if (res == -1) {
812
+ *err = format_error("ioctl(TIOCSWINSZ) failed", errno);
813
+ goto done;
814
+ }
815
+ }
816
+
817
+ posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
818
+ posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
819
+ posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
820
+ posix_spawn_file_actions_addclose(&acts, slave);
821
+ posix_spawn_file_actions_addclose(&acts, *master);
822
+
823
+ spawn_err = posix_spawnattr_setflags(&attrs, flags);
824
+ if (spawn_err != 0) {
825
+ *err = format_error("posix_spawnattr_setflags failed", spawn_err);
826
+ goto done;
827
+ }
828
+
829
+ /* Reset all signal the child to their default behavior */
830
+ sigfillset(&signal_set);
831
+ spawn_err = posix_spawnattr_setsigdefault(&attrs, &signal_set);
832
+ if (spawn_err != 0) {
833
+ *err = format_error("posix_spawnattr_setsigdefault failed", spawn_err);
834
+ goto done;
835
+ }
836
+
837
+ /* Reset the signal mask for all signals */
838
+ sigemptyset(&signal_set);
839
+ spawn_err = posix_spawnattr_setsigmask(&attrs, &signal_set);
840
+ if (spawn_err != 0) {
841
+ *err = format_error("posix_spawnattr_setsigmask failed", spawn_err);
842
+ goto done;
843
+ }
844
+
845
+ do
846
+ spawn_err = posix_spawn(pid, argv[0], &acts, &attrs, argv, env);
847
+ while (spawn_err == EINTR);
848
+ if (spawn_err != 0) {
849
+ *err = format_error("posix_spawn failed", spawn_err);
850
+ }
851
+ done:
852
+ posix_spawn_file_actions_destroy(&acts);
853
+ posix_spawnattr_destroy(&attrs);
854
+ if (slave != -1) {
855
+ close(slave);
856
+ }
857
+
858
+ for (size_t i = 0; i <= count; i++) {
859
+ close(low_fds[i]);
860
+ }
861
+ }
862
+ #endif
863
+
864
+ /**
865
+ * Init
866
+ */
867
+
868
+ Napi::Object init(Napi::Env env, Napi::Object exports) {
869
+ exports.Set("fork", Napi::Function::New(env, PtyFork));
870
+ exports.Set("open", Napi::Function::New(env, PtyOpen));
871
+ exports.Set("resize", Napi::Function::New(env, PtyResize));
872
+ exports.Set("process", Napi::Function::New(env, PtyGetProc));
873
+ return exports;
874
+ }
875
+
876
+ NODE_API_MODULE(NODE_GYP_MODULE_NAME, init)