language-operator 0.1.81 → 0.1.82

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 (427) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/agents/README.md +16 -0
  3. data/.claude/agents/changelog-writer.md +181 -0
  4. data/.claude/hooks/README.md +43 -0
  5. data/.claude/hooks/node_modules/.bin/esbuild +1 -0
  6. data/.claude/hooks/node_modules/.bin/tsc +1 -0
  7. data/.claude/hooks/node_modules/.bin/tsserver +1 -0
  8. data/.claude/hooks/node_modules/.bin/tsx +1 -0
  9. data/.claude/hooks/node_modules/.package-lock.json +136 -0
  10. data/.claude/hooks/node_modules/@esbuild/linux-x64/README.md +3 -0
  11. data/.claude/hooks/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
  12. data/.claude/hooks/node_modules/@esbuild/linux-x64/package.json +20 -0
  13. data/.claude/hooks/node_modules/@types/node/LICENSE +21 -0
  14. data/.claude/hooks/node_modules/@types/node/README.md +15 -0
  15. data/.claude/hooks/node_modules/@types/node/assert/strict.d.ts +105 -0
  16. data/.claude/hooks/node_modules/@types/node/assert.d.ts +955 -0
  17. data/.claude/hooks/node_modules/@types/node/async_hooks.d.ts +623 -0
  18. data/.claude/hooks/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  19. data/.claude/hooks/node_modules/@types/node/buffer.d.ts +1810 -0
  20. data/.claude/hooks/node_modules/@types/node/child_process.d.ts +1428 -0
  21. data/.claude/hooks/node_modules/@types/node/cluster.d.ts +486 -0
  22. data/.claude/hooks/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  23. data/.claude/hooks/node_modules/@types/node/console.d.ts +151 -0
  24. data/.claude/hooks/node_modules/@types/node/constants.d.ts +20 -0
  25. data/.claude/hooks/node_modules/@types/node/crypto.d.ts +4065 -0
  26. data/.claude/hooks/node_modules/@types/node/dgram.d.ts +564 -0
  27. data/.claude/hooks/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  28. data/.claude/hooks/node_modules/@types/node/dns/promises.d.ts +503 -0
  29. data/.claude/hooks/node_modules/@types/node/dns.d.ts +922 -0
  30. data/.claude/hooks/node_modules/@types/node/domain.d.ts +166 -0
  31. data/.claude/hooks/node_modules/@types/node/events.d.ts +1054 -0
  32. data/.claude/hooks/node_modules/@types/node/fs/promises.d.ts +1316 -0
  33. data/.claude/hooks/node_modules/@types/node/fs.d.ts +4676 -0
  34. data/.claude/hooks/node_modules/@types/node/globals.d.ts +150 -0
  35. data/.claude/hooks/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  36. data/.claude/hooks/node_modules/@types/node/http.d.ts +2143 -0
  37. data/.claude/hooks/node_modules/@types/node/http2.d.ts +2480 -0
  38. data/.claude/hooks/node_modules/@types/node/https.d.ts +399 -0
  39. data/.claude/hooks/node_modules/@types/node/index.d.ts +115 -0
  40. data/.claude/hooks/node_modules/@types/node/inspector/promises.d.ts +41 -0
  41. data/.claude/hooks/node_modules/@types/node/inspector.d.ts +224 -0
  42. data/.claude/hooks/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  43. data/.claude/hooks/node_modules/@types/node/module.d.ts +819 -0
  44. data/.claude/hooks/node_modules/@types/node/net.d.ts +933 -0
  45. data/.claude/hooks/node_modules/@types/node/os.d.ts +507 -0
  46. data/.claude/hooks/node_modules/@types/node/package.json +155 -0
  47. data/.claude/hooks/node_modules/@types/node/path/posix.d.ts +8 -0
  48. data/.claude/hooks/node_modules/@types/node/path/win32.d.ts +8 -0
  49. data/.claude/hooks/node_modules/@types/node/path.d.ts +187 -0
  50. data/.claude/hooks/node_modules/@types/node/perf_hooks.d.ts +621 -0
  51. data/.claude/hooks/node_modules/@types/node/process.d.ts +2097 -0
  52. data/.claude/hooks/node_modules/@types/node/punycode.d.ts +117 -0
  53. data/.claude/hooks/node_modules/@types/node/querystring.d.ts +152 -0
  54. data/.claude/hooks/node_modules/@types/node/quic.d.ts +910 -0
  55. data/.claude/hooks/node_modules/@types/node/readline/promises.d.ts +161 -0
  56. data/.claude/hooks/node_modules/@types/node/readline.d.ts +541 -0
  57. data/.claude/hooks/node_modules/@types/node/repl.d.ts +415 -0
  58. data/.claude/hooks/node_modules/@types/node/sea.d.ts +162 -0
  59. data/.claude/hooks/node_modules/@types/node/sqlite.d.ts +937 -0
  60. data/.claude/hooks/node_modules/@types/node/stream/consumers.d.ts +38 -0
  61. data/.claude/hooks/node_modules/@types/node/stream/promises.d.ts +211 -0
  62. data/.claude/hooks/node_modules/@types/node/stream/web.d.ts +296 -0
  63. data/.claude/hooks/node_modules/@types/node/stream.d.ts +1760 -0
  64. data/.claude/hooks/node_modules/@types/node/string_decoder.d.ts +67 -0
  65. data/.claude/hooks/node_modules/@types/node/test/reporters.d.ts +96 -0
  66. data/.claude/hooks/node_modules/@types/node/test.d.ts +2239 -0
  67. data/.claude/hooks/node_modules/@types/node/timers/promises.d.ts +108 -0
  68. data/.claude/hooks/node_modules/@types/node/timers.d.ts +159 -0
  69. data/.claude/hooks/node_modules/@types/node/tls.d.ts +1194 -0
  70. data/.claude/hooks/node_modules/@types/node/trace_events.d.ts +197 -0
  71. data/.claude/hooks/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  72. data/.claude/hooks/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  73. data/.claude/hooks/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  74. data/.claude/hooks/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  75. data/.claude/hooks/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  76. data/.claude/hooks/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  77. data/.claude/hooks/node_modules/@types/node/tty.d.ts +250 -0
  78. data/.claude/hooks/node_modules/@types/node/url.d.ts +519 -0
  79. data/.claude/hooks/node_modules/@types/node/util/types.d.ts +558 -0
  80. data/.claude/hooks/node_modules/@types/node/util.d.ts +1653 -0
  81. data/.claude/hooks/node_modules/@types/node/v8.d.ts +979 -0
  82. data/.claude/hooks/node_modules/@types/node/vm.d.ts +1180 -0
  83. data/.claude/hooks/node_modules/@types/node/wasi.d.ts +202 -0
  84. data/.claude/hooks/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  85. data/.claude/hooks/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  86. data/.claude/hooks/node_modules/@types/node/web-globals/console.d.ts +9 -0
  87. data/.claude/hooks/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  88. data/.claude/hooks/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  89. data/.claude/hooks/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  90. data/.claude/hooks/node_modules/@types/node/web-globals/events.d.ts +106 -0
  91. data/.claude/hooks/node_modules/@types/node/web-globals/fetch.d.ts +54 -0
  92. data/.claude/hooks/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  93. data/.claude/hooks/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  94. data/.claude/hooks/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  95. data/.claude/hooks/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  96. data/.claude/hooks/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  97. data/.claude/hooks/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  98. data/.claude/hooks/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  99. data/.claude/hooks/node_modules/@types/node/web-globals/url.d.ts +24 -0
  100. data/.claude/hooks/node_modules/@types/node/worker_threads.d.ts +714 -0
  101. data/.claude/hooks/node_modules/@types/node/zlib.d.ts +618 -0
  102. data/.claude/hooks/node_modules/esbuild/LICENSE.md +21 -0
  103. data/.claude/hooks/node_modules/esbuild/README.md +3 -0
  104. data/.claude/hooks/node_modules/esbuild/bin/esbuild +0 -0
  105. data/.claude/hooks/node_modules/esbuild/install.js +289 -0
  106. data/.claude/hooks/node_modules/esbuild/lib/main.d.ts +716 -0
  107. data/.claude/hooks/node_modules/esbuild/lib/main.js +2242 -0
  108. data/.claude/hooks/node_modules/esbuild/package.json +49 -0
  109. data/.claude/hooks/node_modules/get-tsconfig/LICENSE +21 -0
  110. data/.claude/hooks/node_modules/get-tsconfig/README.md +235 -0
  111. data/.claude/hooks/node_modules/get-tsconfig/dist/index.cjs +7 -0
  112. data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.cts +2088 -0
  113. data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.mts +2088 -0
  114. data/.claude/hooks/node_modules/get-tsconfig/dist/index.mjs +7 -0
  115. data/.claude/hooks/node_modules/get-tsconfig/package.json +46 -0
  116. data/.claude/hooks/node_modules/resolve-pkg-maps/LICENSE +21 -0
  117. data/.claude/hooks/node_modules/resolve-pkg-maps/README.md +216 -0
  118. data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.cjs +1 -0
  119. data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.cts +11 -0
  120. data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.mts +11 -0
  121. data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.mjs +1 -0
  122. data/.claude/hooks/node_modules/resolve-pkg-maps/package.json +42 -0
  123. data/.claude/hooks/node_modules/tsx/LICENSE +21 -0
  124. data/.claude/hooks/node_modules/tsx/README.md +32 -0
  125. data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.cjs +1 -0
  126. data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.cts +35 -0
  127. data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.mts +35 -0
  128. data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.mjs +1 -0
  129. data/.claude/hooks/node_modules/tsx/dist/cjs/index.cjs +1 -0
  130. data/.claude/hooks/node_modules/tsx/dist/cjs/index.mjs +1 -0
  131. data/.claude/hooks/node_modules/tsx/dist/cli.cjs +54 -0
  132. data/.claude/hooks/node_modules/tsx/dist/cli.mjs +55 -0
  133. data/.claude/hooks/node_modules/tsx/dist/client-BQVF1NaW.mjs +1 -0
  134. data/.claude/hooks/node_modules/tsx/dist/client-D6NvIMSC.cjs +1 -0
  135. data/.claude/hooks/node_modules/tsx/dist/esm/api/index.cjs +1 -0
  136. data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.cts +35 -0
  137. data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.mts +35 -0
  138. data/.claude/hooks/node_modules/tsx/dist/esm/api/index.mjs +1 -0
  139. data/.claude/hooks/node_modules/tsx/dist/esm/index.cjs +2 -0
  140. data/.claude/hooks/node_modules/tsx/dist/esm/index.mjs +2 -0
  141. data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BHW2eJdv.mjs +1 -0
  142. data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BoR10qr8.cjs +1 -0
  143. data/.claude/hooks/node_modules/tsx/dist/index-7AaEi15b.mjs +14 -0
  144. data/.claude/hooks/node_modules/tsx/dist/index-BWFBUo6r.cjs +1 -0
  145. data/.claude/hooks/node_modules/tsx/dist/index-gbaejti9.mjs +1 -0
  146. data/.claude/hooks/node_modules/tsx/dist/index-gckBtVBf.cjs +14 -0
  147. data/.claude/hooks/node_modules/tsx/dist/lexer-DQCqS3nf.mjs +3 -0
  148. data/.claude/hooks/node_modules/tsx/dist/lexer-DgIbo0BU.cjs +3 -0
  149. data/.claude/hooks/node_modules/tsx/dist/loader.cjs +1 -0
  150. data/.claude/hooks/node_modules/tsx/dist/loader.mjs +1 -0
  151. data/.claude/hooks/node_modules/tsx/dist/node-features-_8ZFwP_x.mjs +1 -0
  152. data/.claude/hooks/node_modules/tsx/dist/node-features-roYmp9jK.cjs +1 -0
  153. data/.claude/hooks/node_modules/tsx/dist/package-CeBgXWuR.mjs +1 -0
  154. data/.claude/hooks/node_modules/tsx/dist/package-Dxt5kIHw.cjs +1 -0
  155. data/.claude/hooks/node_modules/tsx/dist/patch-repl.cjs +1 -0
  156. data/.claude/hooks/node_modules/tsx/dist/patch-repl.mjs +1 -0
  157. data/.claude/hooks/node_modules/tsx/dist/preflight.cjs +1 -0
  158. data/.claude/hooks/node_modules/tsx/dist/preflight.mjs +1 -0
  159. data/.claude/hooks/node_modules/tsx/dist/register-2sWVXuRQ.cjs +1 -0
  160. data/.claude/hooks/node_modules/tsx/dist/register-B7jrtLTO.mjs +1 -0
  161. data/.claude/hooks/node_modules/tsx/dist/register-CFH5oNdT.mjs +4 -0
  162. data/.claude/hooks/node_modules/tsx/dist/register-D46fvsV_.cjs +4 -0
  163. data/.claude/hooks/node_modules/tsx/dist/repl.cjs +3 -0
  164. data/.claude/hooks/node_modules/tsx/dist/repl.mjs +3 -0
  165. data/.claude/hooks/node_modules/tsx/dist/require-D4F1Lv60.cjs +1 -0
  166. data/.claude/hooks/node_modules/tsx/dist/require-DQxpCAr4.mjs +1 -0
  167. data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.cjs +1 -0
  168. data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.mjs +1 -0
  169. data/.claude/hooks/node_modules/tsx/dist/temporary-directory-B83uKxJF.cjs +1 -0
  170. data/.claude/hooks/node_modules/tsx/dist/temporary-directory-CwHp0_NW.mjs +1 -0
  171. data/.claude/hooks/node_modules/tsx/dist/types-Cxp8y2TL.d.ts +5 -0
  172. data/.claude/hooks/node_modules/tsx/package.json +68 -0
  173. data/.claude/hooks/node_modules/typescript/LICENSE.txt +55 -0
  174. data/.claude/hooks/node_modules/typescript/README.md +50 -0
  175. data/.claude/hooks/node_modules/typescript/SECURITY.md +41 -0
  176. data/.claude/hooks/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
  177. data/.claude/hooks/node_modules/typescript/bin/tsc +2 -0
  178. data/.claude/hooks/node_modules/typescript/bin/tsserver +2 -0
  179. data/.claude/hooks/node_modules/typescript/lib/_tsc.js +133818 -0
  180. data/.claude/hooks/node_modules/typescript/lib/_tsserver.js +659 -0
  181. data/.claude/hooks/node_modules/typescript/lib/_typingsInstaller.js +222 -0
  182. data/.claude/hooks/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
  183. data/.claude/hooks/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
  184. data/.claude/hooks/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
  185. data/.claude/hooks/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
  186. data/.claude/hooks/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
  187. data/.claude/hooks/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
  188. data/.claude/hooks/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
  189. data/.claude/hooks/node_modules/typescript/lib/lib.d.ts +22 -0
  190. data/.claude/hooks/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
  191. data/.claude/hooks/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
  192. data/.claude/hooks/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
  193. data/.claude/hooks/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
  194. data/.claude/hooks/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
  195. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
  196. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
  197. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
  198. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
  199. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
  200. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
  201. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
  202. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
  203. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
  204. data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
  205. data/.claude/hooks/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
  206. data/.claude/hooks/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
  207. data/.claude/hooks/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
  208. data/.claude/hooks/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
  209. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
  210. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
  211. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
  212. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
  213. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
  214. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
  215. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
  216. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
  217. data/.claude/hooks/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
  218. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
  219. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
  220. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
  221. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
  222. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
  223. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
  224. data/.claude/hooks/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
  225. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
  226. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
  227. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
  228. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
  229. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
  230. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
  231. data/.claude/hooks/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
  232. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
  233. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
  234. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
  235. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
  236. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
  237. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
  238. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
  239. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
  240. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
  241. data/.claude/hooks/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
  242. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
  243. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
  244. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
  245. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
  246. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
  247. data/.claude/hooks/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
  248. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
  249. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
  250. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
  251. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
  252. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
  253. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
  254. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
  255. data/.claude/hooks/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
  256. data/.claude/hooks/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
  257. data/.claude/hooks/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
  258. data/.claude/hooks/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
  259. data/.claude/hooks/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
  260. data/.claude/hooks/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
  261. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
  262. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
  263. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
  264. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
  265. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
  266. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
  267. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
  268. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
  269. data/.claude/hooks/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
  270. data/.claude/hooks/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
  271. data/.claude/hooks/node_modules/typescript/lib/lib.es6.d.ts +23 -0
  272. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
  273. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
  274. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
  275. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
  276. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
  277. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
  278. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
  279. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
  280. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
  281. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
  282. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
  283. data/.claude/hooks/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
  284. data/.claude/hooks/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
  285. data/.claude/hooks/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
  286. data/.claude/hooks/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
  287. data/.claude/hooks/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
  288. data/.claude/hooks/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
  289. data/.claude/hooks/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
  290. data/.claude/hooks/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
  291. data/.claude/hooks/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
  292. data/.claude/hooks/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
  293. data/.claude/hooks/node_modules/typescript/lib/tsc.js +8 -0
  294. data/.claude/hooks/node_modules/typescript/lib/tsserver.js +8 -0
  295. data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
  296. data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.js +21 -0
  297. data/.claude/hooks/node_modules/typescript/lib/typesMap.json +497 -0
  298. data/.claude/hooks/node_modules/typescript/lib/typescript.d.ts +11437 -0
  299. data/.claude/hooks/node_modules/typescript/lib/typescript.js +200276 -0
  300. data/.claude/hooks/node_modules/typescript/lib/typingsInstaller.js +8 -0
  301. data/.claude/hooks/node_modules/typescript/lib/watchGuard.js +53 -0
  302. data/.claude/hooks/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
  303. data/.claude/hooks/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
  304. data/.claude/hooks/node_modules/typescript/package.json +120 -0
  305. data/.claude/hooks/node_modules/undici-types/LICENSE +21 -0
  306. data/.claude/hooks/node_modules/undici-types/README.md +6 -0
  307. data/.claude/hooks/node_modules/undici-types/agent.d.ts +32 -0
  308. data/.claude/hooks/node_modules/undici-types/api.d.ts +43 -0
  309. data/.claude/hooks/node_modules/undici-types/balanced-pool.d.ts +29 -0
  310. data/.claude/hooks/node_modules/undici-types/cache-interceptor.d.ts +172 -0
  311. data/.claude/hooks/node_modules/undici-types/cache.d.ts +36 -0
  312. data/.claude/hooks/node_modules/undici-types/client-stats.d.ts +15 -0
  313. data/.claude/hooks/node_modules/undici-types/client.d.ts +108 -0
  314. data/.claude/hooks/node_modules/undici-types/connector.d.ts +34 -0
  315. data/.claude/hooks/node_modules/undici-types/content-type.d.ts +21 -0
  316. data/.claude/hooks/node_modules/undici-types/cookies.d.ts +30 -0
  317. data/.claude/hooks/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  318. data/.claude/hooks/node_modules/undici-types/dispatcher.d.ts +276 -0
  319. data/.claude/hooks/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  320. data/.claude/hooks/node_modules/undici-types/errors.d.ts +161 -0
  321. data/.claude/hooks/node_modules/undici-types/eventsource.d.ts +66 -0
  322. data/.claude/hooks/node_modules/undici-types/fetch.d.ts +211 -0
  323. data/.claude/hooks/node_modules/undici-types/formdata.d.ts +108 -0
  324. data/.claude/hooks/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  325. data/.claude/hooks/node_modules/undici-types/global-origin.d.ts +7 -0
  326. data/.claude/hooks/node_modules/undici-types/h2c-client.d.ts +73 -0
  327. data/.claude/hooks/node_modules/undici-types/handlers.d.ts +15 -0
  328. data/.claude/hooks/node_modules/undici-types/header.d.ts +160 -0
  329. data/.claude/hooks/node_modules/undici-types/index.d.ts +80 -0
  330. data/.claude/hooks/node_modules/undici-types/interceptors.d.ts +39 -0
  331. data/.claude/hooks/node_modules/undici-types/mock-agent.d.ts +68 -0
  332. data/.claude/hooks/node_modules/undici-types/mock-call-history.d.ts +111 -0
  333. data/.claude/hooks/node_modules/undici-types/mock-client.d.ts +27 -0
  334. data/.claude/hooks/node_modules/undici-types/mock-errors.d.ts +12 -0
  335. data/.claude/hooks/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  336. data/.claude/hooks/node_modules/undici-types/mock-pool.d.ts +27 -0
  337. data/.claude/hooks/node_modules/undici-types/package.json +55 -0
  338. data/.claude/hooks/node_modules/undici-types/patch.d.ts +29 -0
  339. data/.claude/hooks/node_modules/undici-types/pool-stats.d.ts +19 -0
  340. data/.claude/hooks/node_modules/undici-types/pool.d.ts +41 -0
  341. data/.claude/hooks/node_modules/undici-types/proxy-agent.d.ts +29 -0
  342. data/.claude/hooks/node_modules/undici-types/readable.d.ts +68 -0
  343. data/.claude/hooks/node_modules/undici-types/retry-agent.d.ts +8 -0
  344. data/.claude/hooks/node_modules/undici-types/retry-handler.d.ts +125 -0
  345. data/.claude/hooks/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  346. data/.claude/hooks/node_modules/undici-types/util.d.ts +18 -0
  347. data/.claude/hooks/node_modules/undici-types/utility.d.ts +7 -0
  348. data/.claude/hooks/node_modules/undici-types/webidl.d.ts +341 -0
  349. data/.claude/hooks/node_modules/undici-types/websocket.d.ts +186 -0
  350. data/.claude/hooks/package-lock.json +562 -0
  351. data/.claude/hooks/package.json +19 -0
  352. data/.claude/hooks/skill-activation-prompt.sh +11 -0
  353. data/.claude/hooks/skill-activation-prompt.ts +185 -0
  354. data/.claude/hooks/tsconfig.json +12 -0
  355. data/.claude/settings.json +33 -0
  356. data/.claude/skills/README.md +29 -0
  357. data/.claude/skills/ruby-gem-development/SKILL.md +293 -0
  358. data/.claude/skills/skill-rules.json +117 -0
  359. data/.claude/skills/thor-cli-development/SKILL.md +431 -0
  360. data/CHANGELOG.md +7 -0
  361. data/Gemfile.lock +3 -1
  362. data/completions/{_aictl → _langop} +37 -37
  363. data/completions/{aictl.bash → langop.bash} +16 -16
  364. data/completions/langop.fish +114 -0
  365. data/components/agent/Gemfile +1 -1
  366. data/components/tool/Gemfile +1 -1
  367. data/docs/README.md +10 -10
  368. data/docs/agent-internals.md +1 -1
  369. data/docs/cheat-sheet.md +76 -76
  370. data/docs/cli-reference.md +71 -71
  371. data/docs/how-agents-work.md +1 -1
  372. data/docs/installation.md +30 -30
  373. data/docs/quickstart.md +30 -30
  374. data/docs/using-tools.md +11 -11
  375. data/docs/webhooks.md +6 -6
  376. data/examples/ux_helpers_demo.rb +4 -4
  377. data/lib/language_operator/agent/task_executor.rb +0 -37
  378. data/lib/language_operator/agent/web_server.rb +311 -323
  379. data/lib/language_operator/cli/commands/agent/base.rb +16 -15
  380. data/lib/language_operator/cli/commands/agent/code_operations.rb +6 -6
  381. data/lib/language_operator/cli/commands/agent/helpers/synthesis_watcher.rb +1 -1
  382. data/lib/language_operator/cli/commands/agent/lifecycle.rb +2 -2
  383. data/lib/language_operator/cli/commands/agent/logs.rb +2 -2
  384. data/lib/language_operator/cli/commands/agent/workspace.rb +8 -8
  385. data/lib/language_operator/cli/commands/cluster.rb +172 -158
  386. data/lib/language_operator/cli/commands/install.rb +878 -81
  387. data/lib/language_operator/cli/commands/model/base.rb +7 -6
  388. data/lib/language_operator/cli/commands/organization.rb +61 -0
  389. data/lib/language_operator/cli/commands/persona.rb +10 -8
  390. data/lib/language_operator/cli/commands/status.rb +83 -13
  391. data/lib/language_operator/cli/commands/system/exec.rb +10 -10
  392. data/lib/language_operator/cli/commands/system/schema.rb +6 -6
  393. data/lib/language_operator/cli/commands/system/synthesis_template.rb +6 -6
  394. data/lib/language_operator/cli/commands/system/synthesize.rb +14 -14
  395. data/lib/language_operator/cli/commands/system/validate_template.rb +4 -4
  396. data/lib/language_operator/cli/commands/tool/base.rb +1 -1
  397. data/lib/language_operator/cli/commands/tool/install.rb +2 -2
  398. data/lib/language_operator/cli/commands/tool/search.rb +3 -3
  399. data/lib/language_operator/cli/commands/ui.rb +173 -0
  400. data/lib/language_operator/cli/commands/use.rb +80 -9
  401. data/lib/language_operator/cli/errors/suggestions.rb +21 -21
  402. data/lib/language_operator/cli/formatters/progress_formatter.rb +2 -1
  403. data/lib/language_operator/cli/formatters/table_formatter.rb +21 -1
  404. data/lib/language_operator/cli/helpers/cluster_validator.rb +2 -2
  405. data/lib/language_operator/cli/helpers/health_checker.rb +263 -0
  406. data/lib/language_operator/cli/helpers/kubeconfig_validator.rb +3 -3
  407. data/lib/language_operator/cli/helpers/ux_helper.rb +4 -3
  408. data/lib/language_operator/cli/main.rb +30 -21
  409. data/lib/language_operator/cli/wizards/model_wizard.rb +7 -5
  410. data/lib/language_operator/config/cluster_config.rb +3 -3
  411. data/lib/language_operator/constants/kubernetes_labels.rb +1 -1
  412. data/lib/language_operator/kubernetes/client.rb +53 -109
  413. data/lib/language_operator/kubernetes/resource_builder.rb +46 -14
  414. data/lib/language_operator/templates/schema/agent_dsl_openapi.yaml +1 -1
  415. data/lib/language_operator/templates/schema/agent_dsl_schema.json +1 -1
  416. data/lib/language_operator/utils/org_context.rb +100 -0
  417. data/lib/language_operator/version.rb +1 -1
  418. data/synth/001/Makefile +1 -1
  419. data/synth/002/Makefile +1 -1
  420. data/synth/003/Makefile +1 -1
  421. data/synth/004/Makefile +1 -1
  422. metadata +384 -11
  423. data/completions/aictl.fish +0 -114
  424. data/lib/language_operator/agent/event_config.rb +0 -172
  425. data/lib/language_operator/cli/commands/quickstart.rb +0 -22
  426. data/lib/language_operator/cli/wizards/quickstart_wizard.rb +0 -561
  427. /data/bin/{aictl → langop} +0 -0
@@ -47,10 +47,10 @@ module LanguageOperator
47
47
  The operator will synthesize the agent from your description and deploy it to your cluster.
48
48
 
49
49
  Examples:
50
- aictl agent create "review my spreadsheet at 4pm daily and email me any errors"
51
- aictl agent create "summarize Hacker News top stories every morning at 8am"
52
- aictl agent create "monitor my website uptime and alert me if it goes down"
53
- aictl agent create --wizard # Interactive wizard mode
50
+ langop agent create "review my spreadsheet at 4pm daily and email me any errors"
51
+ langop agent create "summarize Hacker News top stories every morning at 8am"
52
+ langop agent create "monitor my website uptime and alert me if it goes down"
53
+ langop agent create --wizard # Interactive wizard mode
54
54
  DESC
55
55
  option :cluster, type: :string, desc: 'Override current cluster context'
56
56
  option :create_cluster, type: :string, desc: 'Create cluster if it doesn\'t exist'
@@ -116,7 +116,8 @@ module LanguageOperator
116
116
  persona: options[:persona],
117
117
  tools: options[:tools] || [],
118
118
  models: models,
119
- workspace: options[:workspace]
119
+ workspace: options[:workspace],
120
+ k8s_client: ctx.client
120
121
  )
121
122
 
122
123
  # Dry-run mode: preview without applying
@@ -392,9 +393,9 @@ module LanguageOperator
392
393
 
393
394
  puts
394
395
  puts 'Next steps:'
395
- puts pastel.dim("aictl agent logs #{agent_name} -f")
396
- puts pastel.dim("aictl agent code #{agent_name}")
397
- puts pastel.dim("aictl agent inspect #{agent_name}")
396
+ puts pastel.dim("langop agent logs #{agent_name} -f")
397
+ puts pastel.dim("langop agent code #{agent_name}")
398
+ puts pastel.dim("langop agent inspect #{agent_name}")
398
399
  puts
399
400
  end
400
401
 
@@ -497,7 +498,7 @@ module LanguageOperator
497
498
  Formatters::ProgressFormatter.info('No changes made (dry-run mode)')
498
499
  puts
499
500
  puts 'To create this agent for real, run:'
500
- cmd_parts = ["aictl agent create \"#{description}\""]
501
+ cmd_parts = ["langop agent create \"#{description}\""]
501
502
  cmd_parts << "--name #{name}" if options[:name]
502
503
  cmd_parts << "--persona #{persona}" if persona
503
504
  cmd_parts << "--tools #{tools.join(' ')}" if tools.any?
@@ -535,7 +536,7 @@ module LanguageOperator
535
536
  Formatters::ProgressFormatter.info('No agents found')
536
537
  puts
537
538
  puts 'Create an agent with:'
538
- puts ' aictl agent create "<description>"'
539
+ puts ' langop agent create "<description>"'
539
540
  return
540
541
  end
541
542
 
@@ -564,7 +565,7 @@ module LanguageOperator
564
565
  Formatters::ProgressFormatter.info('No clusters found')
565
566
  puts
566
567
  puts 'Create a cluster first:'
567
- puts ' aictl cluster create <name>'
568
+ puts ' langop cluster create <name>'
568
569
  return
569
570
  end
570
571
 
@@ -623,7 +624,7 @@ module LanguageOperator
623
624
  Formatters::ProgressFormatter.warn('Synthesis taking longer than expected, continuing in background...')
624
625
  puts
625
626
  puts 'Check synthesis status with:'
626
- puts " aictl agent inspect #{agent_name}"
627
+ puts " langop agent inspect #{agent_name}"
627
628
  synthesis_result = { success: true, timeout: true }
628
629
  break
629
630
  end
@@ -751,8 +752,8 @@ module LanguageOperator
751
752
  end
752
753
 
753
754
  puts pastel.white.bold('Available Commands:')
754
- puts pastel.dim(" aictl agent learning status #{agent_name}")
755
- puts pastel.dim(" aictl agent inspect #{agent_name}")
755
+ puts pastel.dim(" langop agent learning status #{agent_name}")
756
+ puts pastel.dim(" langop agent inspect #{agent_name}")
756
757
  end
757
758
 
758
759
  def get_execution_data(agent_name, ctx)
@@ -916,7 +917,7 @@ module LanguageOperator
916
917
  Formatters::ProgressFormatter.warn("Could not verify deletion of agent '#{name}' within 30 seconds")
917
918
  puts
918
919
  puts "Check deletion status with:"
919
- puts " aictl agent list"
920
+ puts " langop agent list"
920
921
  puts " kubectl get languageagent #{name}"
921
922
  puts
922
923
  puts "If the agent shows 'Unknown' status, it may be pending deletion."
@@ -29,7 +29,7 @@ module LanguageOperator
29
29
  puts ' - Agent synthesis failed'
30
30
  puts
31
31
  puts 'Check agent status with:'
32
- puts " aictl agent inspect #{name}"
32
+ puts " langop agent inspect #{name}"
33
33
  exit 1
34
34
  end
35
35
 
@@ -90,7 +90,7 @@ module LanguageOperator
90
90
  puts pastel.yellow('No versions have been created yet.')
91
91
  puts
92
92
  puts 'Versions are created automatically during agent synthesis.'
93
- puts "Check agent status: #{pastel.dim("aictl agent inspect #{name}")}"
93
+ puts "Check agent status: #{pastel.dim("langop agent inspect #{name}")}"
94
94
  return
95
95
  end
96
96
 
@@ -133,8 +133,8 @@ module LanguageOperator
133
133
  puts table(headers, rows)
134
134
  puts
135
135
  puts 'Usage:'
136
- puts " #{pastel.dim("aictl agent code #{name}")}"
137
- puts " #{pastel.dim("aictl agent code #{name} --version=X")}"
136
+ puts " #{pastel.dim("langop agent code #{name}")}"
137
+ puts " #{pastel.dim("langop agent code #{name} --version=X")}"
138
138
  end
139
139
  end
140
140
 
@@ -175,7 +175,7 @@ module LanguageOperator
175
175
  puts " v#{version_num}"
176
176
  end
177
177
  puts
178
- puts "Use 'aictl agent versions #{agent_name}' to see all available versions"
178
+ puts "Use 'langop agent versions #{agent_name}' to see all available versions"
179
179
  exit 1
180
180
  end
181
181
 
@@ -231,7 +231,7 @@ module LanguageOperator
231
231
  puts 'The operator will automatically re-synthesize the agent code.'
232
232
  puts
233
233
  puts 'Watch synthesis progress with:'
234
- puts " aictl agent inspect #{name}"
234
+ puts " langop agent inspect #{name}"
235
235
  end
236
236
  end
237
237
  end
@@ -34,7 +34,7 @@ module LanguageOperator
34
34
  Formatters::ProgressFormatter.warn('Synthesis taking longer than expected, continuing in background...')
35
35
  puts
36
36
  puts 'Check synthesis status with:'
37
- puts " aictl agent inspect #{agent_name}"
37
+ puts " langop agent inspect #{agent_name}"
38
38
  synthesis_result = { success: true, timeout: true }
39
39
  break
40
40
  end
@@ -49,7 +49,7 @@ module LanguageOperator
49
49
  puts 'The agent will not execute on its schedule until resumed.'
50
50
  puts
51
51
  puts 'Resume with:'
52
- puts " aictl agent resume #{name}"
52
+ puts " langop agent resume #{name}"
53
53
  end
54
54
  end
55
55
 
@@ -90,7 +90,7 @@ module LanguageOperator
90
90
  puts 'The agent will now execute according to its schedule.'
91
91
  puts
92
92
  puts 'View next execution time with:'
93
- puts " aictl agent inspect #{name}"
93
+ puts " langop agent inspect #{name}"
94
94
  end
95
95
  end
96
96
  end
@@ -18,8 +18,8 @@ module LanguageOperator
18
18
  Use -f to follow logs continuously (like tail -f).
19
19
 
20
20
  Examples:
21
- aictl agent logs my-agent
22
- aictl agent logs my-agent -f
21
+ langop agent logs my-agent
22
+ langop agent logs my-agent -f
23
23
  DESC
24
24
  option :cluster, type: :string, desc: 'Override current cluster context'
25
25
  option :follow, type: :boolean, aliases: '-f', default: false, desc: 'Follow logs'
@@ -21,9 +21,9 @@ module LanguageOperator
21
21
  cache data, and remember information across executions.
22
22
 
23
23
  Examples:
24
- aictl agent workspace my-agent # List all files
25
- aictl agent workspace my-agent --path /workspace/state.json # View specific file
26
- aictl agent workspace my-agent --clean # Clear workspace
24
+ langop agent workspace my-agent # List all files
25
+ langop agent workspace my-agent --path /workspace/state.json # View specific file
26
+ langop agent workspace my-agent --clean # Clear workspace
27
27
  DESC
28
28
  option :cluster, type: :string, desc: 'Override current cluster context'
29
29
  option :path, type: :string, desc: 'View specific file contents'
@@ -94,7 +94,7 @@ module LanguageOperator
94
94
  puts " Namespace: #{debug_info[:namespace]}"
95
95
  puts
96
96
  puts 'Check agent status with:'
97
- puts " aictl agent inspect #{agent_name}"
97
+ puts " langop agent inspect #{agent_name}"
98
98
  puts
99
99
  puts 'List all pods in namespace:'
100
100
  puts " kubectl get pods -n #{ctx.namespace} -l #{Constants::KubernetesLabels::COMPONENT}=#{Constants::KubernetesLabels::COMPONENT_AGENT}"
@@ -112,7 +112,7 @@ module LanguageOperator
112
112
  puts "Current pod status: #{pods.first.dig('status', 'phase')}"
113
113
  puts
114
114
  puts 'Check pod logs with:'
115
- puts " aictl agent logs #{agent_name}"
115
+ puts " langop agent logs #{agent_name}"
116
116
  exit 1
117
117
  end
118
118
 
@@ -220,8 +220,8 @@ module LanguageOperator
220
220
 
221
221
  puts
222
222
  puts pastel.dim('Commands:')
223
- puts pastel.dim(" aictl agent workspace #{agent_name} --path /workspace/<file> # View file")
224
- puts pastel.dim(" aictl agent workspace #{agent_name} --clean # Clear workspace")
223
+ puts pastel.dim(" langop agent workspace #{agent_name} --path /workspace/<file> # View file")
224
+ puts pastel.dim(" langop agent workspace #{agent_name} --clean # Clear workspace")
225
225
  puts
226
226
  end
227
227
 
@@ -235,7 +235,7 @@ module LanguageOperator
235
235
  Formatters::ProgressFormatter.error("File not found: #{file_path}")
236
236
  puts
237
237
  puts 'List available files with:'
238
- puts " aictl agent workspace #{agent_name}"
238
+ puts " langop agent workspace #{agent_name}"
239
239
  exit 1
240
240
  end
241
241
 
@@ -13,7 +13,7 @@ module LanguageOperator
13
13
  include Helpers::UxHelper
14
14
 
15
15
  desc 'create NAME', 'Create a new language cluster'
16
- option :namespace, type: :string, desc: 'Kubernetes namespace (defaults to current context namespace)'
16
+ option :organization_id, type: :string, desc: 'Organization ID for the cluster (auto-detected if only one exists)'
17
17
  option :kubeconfig, type: :string, desc: 'Path to kubeconfig file'
18
18
  option :context, type: :string, desc: 'Kubernetes context to use'
19
19
  option :switch, type: :boolean, default: true, desc: 'Switch to new cluster context'
@@ -23,34 +23,63 @@ module LanguageOperator
23
23
  handle_command_error('create cluster') do
24
24
  kubeconfig = options[:kubeconfig]
25
25
  context = options[:context]
26
+ org_id = options[:organization_id]
26
27
 
27
- # Handle dry-run: output manifest and exit early
28
- if options[:dry_run]
29
- namespace = options[:namespace] || 'default'
30
- resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain])
31
- puts resource.to_yaml
32
- return
28
+ # Create Kubernetes client to find organization namespace
29
+ k8s = Formatters::ProgressFormatter.with_spinner('Connecting to Kubernetes cluster') do
30
+ Kubernetes::Client.new(kubeconfig: kubeconfig, context: context)
31
+ end
32
+
33
+ # Auto-detect organization if not provided
34
+ unless org_id
35
+ org_id = detect_organization_id(k8s)
36
+ exit 1 unless org_id
37
+ end
38
+
39
+ # Find the organization namespace
40
+ namespace = Formatters::ProgressFormatter.with_spinner("Finding namespace for organization #{org_id[0..7]}") do
41
+ find_org_namespace(k8s, org_id)
33
42
  end
34
43
 
35
- # Check if cluster already exists
36
- if Config::ClusterConfig.cluster_exists?(name)
37
- Formatters::ProgressFormatter.error("Cluster '#{name}' already exists")
44
+ unless namespace
45
+ Formatters::ProgressFormatter.error("Organization namespace not found for ID: #{org_id}")
46
+ puts "\nMake sure the organization exists and you have access to it."
47
+ puts "Available organization namespaces:"
48
+ list_org_namespaces(k8s)
38
49
  exit 1
39
50
  end
40
51
 
41
- # Create Kubernetes client
42
- k8s = Formatters::ProgressFormatter.with_spinner('Connecting to Kubernetes cluster') do
43
- Kubernetes::Client.new(kubeconfig: kubeconfig, context: context)
52
+ # Handle dry-run: output manifest and exit early
53
+ if options[:dry_run]
54
+ # Create a mock client to pass org context for dry run
55
+ mock_client = Object.new
56
+ def mock_client.current_org_id; @org_id; end
57
+ mock_client.instance_variable_set(:@org_id, org_id)
58
+
59
+ resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain], k8s_client: mock_client)
60
+ puts resource.to_yaml
61
+ return
44
62
  end
45
63
 
46
- # Determine namespace: use --namespace flag, or current context namespace, or 'default'
47
- namespace = options[:namespace] || k8s.current_namespace || 'default'
64
+ # Check if cluster already exists in Kubernetes
65
+ begin
66
+ existing_cluster = k8s.get_resource('LanguageCluster', name, namespace)
67
+ if existing_cluster
68
+ Formatters::ProgressFormatter.error("Cluster '#{name}' already exists in namespace '#{namespace}'")
69
+ exit 1
70
+ end
71
+ rescue StandardError => e
72
+ # If we get a 404 or API error, the cluster doesn't exist - that's fine
73
+ unless e.message.include?('404') || e.message.include?('Not Found')
74
+ warn "Warning: Could not check for existing cluster: #{e.message}" if ENV['DEBUG']
75
+ end
76
+ end
48
77
 
49
78
  # Check if operator is installed
50
79
  unless k8s.operator_installed?
51
80
  Formatters::ProgressFormatter.error('Language Operator not found in cluster')
52
81
  puts "\nInstall the operator first:"
53
- puts ' aictl install'
82
+ puts ' langop install'
54
83
  exit 1
55
84
  end
56
85
 
@@ -65,7 +94,8 @@ module LanguageOperator
65
94
 
66
95
  # Create LanguageCluster resource
67
96
  Formatters::ProgressFormatter.with_spinner('Creating LanguageCluster resource') do
68
- resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain])
97
+ labels = { 'langop.io/organization-id' => org_id }
98
+ resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain], labels: labels, k8s_client: k8s)
69
99
  k8s.apply_resource(resource)
70
100
  resource
71
101
  end
@@ -92,6 +122,7 @@ module LanguageOperator
92
122
  namespace: namespace,
93
123
  context: actual_context,
94
124
  domain: options[:domain],
125
+ org_id: org_id,
95
126
  status: 'Ready',
96
127
  created: Time.now.strftime('%Y-%m-%dT%H:%M:%SZ')
97
128
  )
@@ -100,7 +131,7 @@ module LanguageOperator
100
131
  unless options[:switch]
101
132
  puts
102
133
  puts 'Switch to this cluster with:'
103
- puts pastel.dim(" aictl use #{name}")
134
+ puts pastel.dim(" langop use #{name}")
104
135
  end
105
136
  end
106
137
  end
@@ -109,167 +140,76 @@ module LanguageOperator
109
140
  option :all, type: :boolean, default: false, desc: 'Show all clusters including inactive'
110
141
  def list
111
142
  handle_command_error('list clusters') do
112
- clusters = Config::ClusterConfig.list_clusters
113
- current = Config::ClusterConfig.current_cluster
143
+ # Query Kubernetes directly for all LanguageCluster resources (like kubectl get languageclusters -A)
144
+ k8s = Kubernetes::Client.new
145
+
146
+ # List all LanguageCluster resources across all namespaces
147
+ language_clusters = k8s.list_resources('LanguageCluster', namespace: nil)
114
148
 
115
- if clusters.empty?
149
+ if language_clusters.empty?
116
150
  Formatters::ProgressFormatter.info('No clusters found')
117
151
  puts "\nCreate a cluster with:"
118
- puts ' aictl cluster create <name>'
152
+ puts ' langop cluster create <name>'
119
153
  return
120
154
  end
121
155
 
122
- # Cache clients by kubeconfig:context to prevent resource leaks
123
- clients_cache = {}
156
+ current = Config::ClusterConfig.current_cluster
124
157
 
125
- # Build table data
126
- table_data = clusters.map do |cluster|
158
+ # Build table data from LanguageCluster resources
159
+ table_data = language_clusters.map do |cluster_resource|
127
160
  begin
128
- # Get cluster config for cache key and reuse clients
129
- cluster_config = Config::ClusterConfig.get_cluster(cluster[:name])
130
- cache_key = "#{cluster_config[:kubeconfig]}:#{cluster_config[:context]}"
131
-
132
- # Reuse existing client or create new one
133
- k8s = clients_cache[cache_key] ||= begin
134
- # Validate kubeconfig exists before creating client
135
- Helpers::ClusterValidator.validate_kubeconfig!(cluster_config)
136
- require_relative '../../kubernetes/client'
137
- Kubernetes::Client.new(
138
- kubeconfig: cluster_config[:kubeconfig],
139
- context: cluster_config[:context]
140
- )
141
- end
142
- rescue StandardError
143
- # Handle cluster config or client creation errors
144
- name_display = cluster[:name]
145
- name_display += ' *' if cluster[:name] == current
146
-
147
- next {
161
+ name = cluster_resource.dig('metadata', 'name')
162
+ namespace = cluster_resource.dig('metadata', 'namespace')
163
+ status = cluster_resource.dig('status', 'phase') || 'Unknown'
164
+ domain = cluster_resource.dig('spec', 'domain')
165
+
166
+ # Get organization information from the cluster resource itself
167
+ org_id = cluster_resource.dig('metadata', 'labels', 'langop.io/organization-id')
168
+ organization = org_id ? org_id[0..7] : 'legacy'
169
+
170
+ # Check if this cluster matches the current selection
171
+ name_display = name
172
+ name_display = "#{pastel.bold(name)} (selected)" if name == current
173
+
174
+ # Get related resources in the same namespace
175
+ agents = k8s.list_resources(RESOURCE_AGENT, namespace: namespace)
176
+ tools = k8s.list_resources(RESOURCE_TOOL, namespace: namespace)
177
+ models = k8s.list_resources(RESOURCE_MODEL, namespace: namespace)
178
+
179
+ {
148
180
  name: name_display,
149
- namespace: cluster[:namespace],
181
+ namespace: namespace,
182
+ organization: organization,
183
+ agents: agents.count,
184
+ tools: tools.count,
185
+ models: models.count,
186
+ status: status,
187
+ domain: domain || ''
188
+ }
189
+ rescue StandardError => e
190
+ # Handle any errors gracefully
191
+ name = cluster_resource.dig('metadata', 'name') || 'unknown'
192
+ namespace = cluster_resource.dig('metadata', 'namespace') || 'unknown'
193
+
194
+ {
195
+ name: name,
196
+ namespace: namespace,
197
+ organization: '?',
150
198
  agents: '?',
151
199
  tools: '?',
152
200
  models: '?',
153
- status: 'Config Error',
201
+ status: 'Error',
154
202
  domain: '?'
155
203
  }
156
204
  end
157
-
158
- # Get cluster stats
159
- agents = k8s.list_resources(RESOURCE_AGENT, namespace: cluster[:namespace])
160
- tools = k8s.list_resources(RESOURCE_TOOL, namespace: cluster[:namespace])
161
- models = k8s.list_resources(RESOURCE_MODEL, namespace: cluster[:namespace])
162
-
163
- # Get cluster status and domain
164
- cluster_resource = k8s.get_resource('LanguageCluster', cluster[:name], cluster[:namespace])
165
- status = cluster_resource.dig('status', 'phase') || 'Unknown'
166
- domain = cluster_resource.dig('spec', 'domain')
167
-
168
- name_display = cluster[:name]
169
- name_display = "#{pastel.bold(cluster[:name])} (selected)" if cluster[:name] == current
170
-
171
- {
172
- name: name_display,
173
- namespace: cluster[:namespace],
174
- agents: agents.count,
175
- tools: tools.count,
176
- models: models.count,
177
- status: status,
178
- domain: domain
179
- }
180
- rescue K8s::Error::NotFound
181
- # Cluster exists in local config but not in Kubernetes
182
- name_display = cluster[:name]
183
- name_display += ' *' if cluster[:name] == current
184
-
185
- {
186
- name: name_display,
187
- namespace: cluster[:namespace],
188
- agents: '-',
189
- tools: '-',
190
- models: '-',
191
- status: 'Not Found',
192
- domain: '-'
193
- }
194
- rescue StandardError
195
- # Other errors (connection issues, auth problems, etc.)
196
- name_display = cluster[:name]
197
- name_display += ' *' if cluster[:name] == current
198
-
199
- {
200
- name: name_display,
201
- namespace: cluster[:namespace],
202
- agents: '?',
203
- tools: '?',
204
- models: '?',
205
- status: 'Error',
206
- domain: '?'
207
- }
208
205
  end
209
206
 
210
207
  Formatters::TableFormatter.clusters(table_data)
211
208
 
212
- puts "\nNo cluster selected. Use 'aictl use <cluster>' to select one." unless current
213
-
214
- # Show helpful message if any clusters are not found
215
- not_found_clusters = table_data.select { |c| c[:status] == 'Not Found' }
216
- if not_found_clusters.any?
217
- puts
218
- Formatters::ProgressFormatter.warn('Some clusters exist in local config but not in Kubernetes')
219
- puts
220
- puts 'Clusters with "Not Found" status are defined in ~/.aictl/config.yaml'
221
- puts 'but the corresponding LanguageCluster resource does not exist in Kubernetes.'
222
- puts
223
- puts 'To fix this:'
224
- not_found_clusters.each do |cluster|
225
- cluster_name = cluster[:name].gsub(' *', '')
226
- puts " • Remove from config: aictl cluster delete #{cluster_name}"
227
- puts " • Or recreate: aictl cluster create #{cluster_name}"
228
- end
229
- end
209
+ puts "\nNo cluster selected. Use 'langop use <cluster>' to select one." unless current
230
210
  end
231
211
  end
232
212
 
233
- desc 'current', 'Show current cluster context'
234
- def current
235
- handle_command_error('show current cluster') do
236
- cluster_name = Config::ClusterConfig.current_cluster
237
-
238
- unless cluster_name
239
- Formatters::ProgressFormatter.info('No cluster selected')
240
- puts "\nSelect a cluster with:"
241
- puts ' aictl use <cluster>'
242
- return
243
- end
244
-
245
- cluster = Config::ClusterConfig.get_cluster(cluster_name)
246
-
247
- unless cluster
248
- Formatters::ProgressFormatter.error("Cluster '#{cluster_name}' not found in config")
249
- exit 1
250
- end
251
-
252
- puts 'Current Cluster:'
253
- puts " Name: #{cluster[:name]}"
254
- puts " Namespace: #{cluster[:namespace]}"
255
- puts " Context: #{cluster[:context] || 'default'}"
256
- puts " Created: #{cluster[:created]}"
257
-
258
- # Check cluster health
259
- begin
260
- k8s = Helpers::ClusterValidator.kubernetes_client(cluster_name)
261
-
262
- if k8s.operator_installed?
263
- version = k8s.operator_version
264
- Formatters::ProgressFormatter.success("Operator: #{version || 'installed'}")
265
- else
266
- Formatters::ProgressFormatter.warn('Operator: not found')
267
- end
268
- rescue StandardError => e
269
- Formatters::ProgressFormatter.error("Connection: #{e.message}")
270
- end
271
- end
272
- end
273
213
 
274
214
  desc 'delete NAME', 'Delete a cluster'
275
215
  option :force, type: :boolean, default: false, desc: 'Skip confirmation'
@@ -306,7 +246,7 @@ module LanguageOperator
306
246
  puts ' • The cluster resource no longer exists'
307
247
  puts
308
248
  puts 'To force removal from local configuration only, use:'
309
- puts pastel.dim(" aictl cluster delete #{name} --force-local")
249
+ puts pastel.dim(" langop cluster delete #{name} --force-local")
310
250
  exit 1
311
251
  end
312
252
  end
@@ -394,6 +334,80 @@ module LanguageOperator
394
334
  end
395
335
  end
396
336
  end
337
+
338
+ private
339
+
340
+ # Auto-detect organization ID when not provided
341
+ # @param k8s_client [Kubernetes::Client] Kubernetes client
342
+ # @return [String, nil] Organization ID or nil if detection failed
343
+ def detect_organization_id(k8s_client)
344
+ # List all organization namespaces
345
+ org_namespaces = k8s_client.list_namespaces(
346
+ label_selector: 'langop.io/type=organization'
347
+ )
348
+
349
+ case org_namespaces.length
350
+ when 0
351
+ Formatters::ProgressFormatter.error('No organizations found in cluster')
352
+ puts "\nRun 'langop organization list' to see available organizations."
353
+ nil
354
+ when 1
355
+ org_id = org_namespaces.first.dig('metadata', 'labels', 'langop.io/organization-id')
356
+ org_id
357
+ else
358
+ Formatters::ProgressFormatter.error('Multiple organizations found')
359
+ puts "\nPlease specify which organization to use:"
360
+ puts " langop cluster create #{ARGV.last} --organization-id <ORG_ID>"
361
+ puts
362
+ puts "Available organizations:"
363
+ list_org_namespaces(k8s_client)
364
+ nil
365
+ end
366
+ end
367
+
368
+ # Find the namespace for a given organization ID
369
+ #
370
+ # @param k8s_client [Kubernetes::Client] Kubernetes client
371
+ # @param org_id [String] Organization ID
372
+ # @return [String, nil] Namespace name or nil if not found
373
+ def find_org_namespace(k8s_client, org_id)
374
+ # List all namespaces with organization labels
375
+ namespaces = k8s_client.list_namespaces(
376
+ label_selector: "langop.io/organization-id=#{org_id}"
377
+ )
378
+
379
+ # Find the first namespace for this org ID
380
+ org_namespace = namespaces.find do |ns|
381
+ ns.dig('metadata', 'labels', 'langop.io/organization-id') == org_id
382
+ end
383
+
384
+ org_namespace&.dig('metadata', 'name')
385
+ rescue StandardError => e
386
+ warn "Warning: Could not find organization namespace: #{e.message}" if ENV['DEBUG']
387
+ nil
388
+ end
389
+
390
+ # List available organization namespaces for error messages
391
+ #
392
+ # @param k8s_client [Kubernetes::Client] Kubernetes client
393
+ def list_org_namespaces(k8s_client)
394
+ namespaces = k8s_client.list_namespaces(
395
+ label_selector: 'langop.io/type=organization'
396
+ )
397
+
398
+ if namespaces.any?
399
+ namespaces.each do |ns|
400
+ name = ns.dig('metadata', 'name')
401
+ org_id = ns.dig('metadata', 'labels', 'langop.io/organization-id')
402
+ plan = ns.dig('metadata', 'labels', 'langop.io/plan')
403
+ puts " • #{name} (#{org_id}) [#{plan}]"
404
+ end
405
+ else
406
+ puts " None found"
407
+ end
408
+ rescue StandardError => e
409
+ puts " Error listing namespaces: #{e.message}"
410
+ end
397
411
  end
398
412
  end
399
413
  end