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
@@ -3,13 +3,13 @@
3
3
  require 'k8s-ruby'
4
4
  require 'yaml'
5
5
  require_relative '../utils/secure_path'
6
- require_relative '../agent/event_config'
6
+ require_relative '../utils/org_context'
7
7
 
8
8
  module LanguageOperator
9
9
  module Kubernetes
10
10
  # Kubernetes client wrapper for interacting with language-operator resources
11
11
  class Client
12
- attr_reader :client
12
+ attr_reader :client, :context
13
13
 
14
14
  # Get singleton K8s client instance with automatic config detection
15
15
  # @return [LanguageOperator::Kubernetes::Client] Client instance
@@ -164,72 +164,6 @@ module LanguageOperator
164
164
  create_resource(resource)
165
165
  end
166
166
 
167
- # Create a Kubernetes Event
168
- # @param event [Hash] Event resource hash
169
- # @return [K8s::Resource] Created event resource
170
- def create_event(event)
171
- # Ensure proper apiVersion and kind for events
172
- event = event.merge({
173
- 'apiVersion' => 'v1',
174
- 'kind' => 'Event'
175
- })
176
- create_resource(event)
177
- end
178
-
179
- # Emit an execution event for agent task completion
180
- # @param task_name [String] Name of the executed task
181
- # @param success [Boolean] Whether task succeeded
182
- # @param duration_ms [Float] Execution duration in milliseconds
183
- # @param metadata [Hash] Additional metadata to include
184
- # @return [K8s::Resource, nil] Created event resource or nil if disabled
185
- def emit_execution_event(task_name, success:, duration_ms:, metadata: {})
186
- # Check if events are enabled based on configuration
187
- event_config = Agent::EventConfig.load
188
- event_type = success ? :success : :failure
189
- return nil unless Agent::EventConfig.should_emit?(event_type, event_config)
190
-
191
- agent_name = ENV.fetch('AGENT_NAME', nil)
192
- agent_namespace = ENV.fetch('AGENT_NAMESPACE', current_namespace)
193
-
194
- return nil unless agent_name && agent_namespace
195
-
196
- timestamp = Time.now.to_i
197
- event_name = "#{agent_name}-task-#{task_name}-#{timestamp}"
198
-
199
- event = {
200
- 'metadata' => {
201
- 'name' => event_name,
202
- 'namespace' => agent_namespace,
203
- 'labels' => {
204
- 'app.kubernetes.io/name' => 'language-operator',
205
- 'app.kubernetes.io/component' => 'agent',
206
- 'langop.io/agent-name' => agent_name,
207
- 'langop.io/task-name' => task_name.to_s
208
- }
209
- },
210
- 'involvedObject' => {
211
- 'kind' => 'LanguageAgent',
212
- 'name' => agent_name,
213
- 'namespace' => agent_namespace,
214
- 'apiVersion' => 'langop.io/v1alpha1'
215
- },
216
- 'reason' => success ? 'TaskCompleted' : 'TaskFailed',
217
- 'message' => build_event_message(task_name, success, duration_ms, metadata, event_config),
218
- 'type' => success ? 'Normal' : 'Warning',
219
- 'firstTimestamp' => Time.now.utc.iso8601,
220
- 'lastTimestamp' => Time.now.utc.iso8601,
221
- 'source' => {
222
- 'component' => 'language-operator-agent'
223
- }
224
- }
225
-
226
- create_event(event)
227
- rescue StandardError => e
228
- # Log error but don't fail task execution
229
- warn "Failed to emit execution event: #{e.message}"
230
- nil
231
- end
232
-
233
167
  # Check if operator is installed
234
168
  def operator_installed?
235
169
  # Check if LanguageCluster CRD exists
@@ -242,57 +176,67 @@ module LanguageOperator
242
176
  # Get operator version
243
177
  def operator_version
244
178
  deployment = @client.api('apps/v1')
245
- .resource('deployments', namespace: 'kube-system')
179
+ .resource('deployments', namespace: 'language-operator')
246
180
  .get(Constants::KubernetesLabels::PROJECT_NAME)
247
- deployment.dig('metadata', 'labels', Constants::KubernetesLabels::VERSION) || 'unknown'
181
+
182
+ # Try to get version from Helm chart label first, then fallback to app version
183
+ version = deployment.dig('metadata', 'labels', 'helm.sh/chart')&.split('-')&.last ||
184
+ deployment.dig('metadata', 'labels', Constants::KubernetesLabels::VERSION)
185
+
186
+ return version if version && version != 'latest'
187
+
188
+ 'unknown'
248
189
  rescue K8s::Error::NotFound
249
190
  nil
250
191
  end
251
192
 
252
- private
253
-
254
- # Build event message for task execution
255
- # @param task_name [String] Task name
256
- # @param success [Boolean] Whether task succeeded
257
- # @param duration_ms [Float] Execution duration in milliseconds
258
- # @param metadata [Hash] Additional metadata
259
- # @param event_config [Hash] Event configuration
260
- # @return [String] Formatted event message
261
- def build_event_message(task_name, success, duration_ms, metadata = {}, event_config = nil)
262
- event_config ||= Agent::EventConfig.load
263
- content_config = Agent::EventConfig.content_config(event_config)
264
-
265
- status = success ? 'completed successfully' : 'failed'
266
- message = "Task '#{task_name}' #{status} in #{duration_ms.round(2)}ms"
267
-
268
- # Include metadata if configured
269
- if content_config[:include_task_metadata] && metadata.any?
270
- # Filter metadata based on configuration
271
- filtered_metadata = metadata.dup
272
-
273
- # Remove error details if not configured to include them
274
- unless content_config[:include_error_details]
275
- filtered_metadata.delete('error_type')
276
- filtered_metadata.delete('error_category')
277
- end
193
+ # Get the current organization ID from cluster resources
194
+ #
195
+ # @return [String, nil] Organization ID or nil if not found/legacy mode
196
+ def current_org_id
197
+ Utils::OrgContext.current_org_id(self)
198
+ end
278
199
 
279
- if filtered_metadata.any?
280
- details = filtered_metadata.map { |k, v| "#{k}: #{v}" }.join(', ')
281
- message += " (#{details})"
282
- end
283
- end
200
+ # Check if the current cluster has organization context
201
+ #
202
+ # @return [Boolean] True if organization context is available
203
+ def org_context?
204
+ !current_org_id.nil?
205
+ end
284
206
 
285
- # Truncate if configured and message is too long
286
- if content_config[:truncate_long_messages] &&
287
- message.length > content_config[:max_message_length]
288
- max_length = content_config[:max_message_length]
289
- truncated_length = message.length - max_length
290
- message = message[0...max_length] + "... (truncated #{truncated_length} chars)"
291
- end
207
+ # Get organization information for cluster listing
208
+ #
209
+ # @return [Hash] Organization info with id, namespace, and display name
210
+ def org_info
211
+ org_id = current_org_id
212
+ return { id: nil, display: 'legacy' } unless org_id
213
+
214
+ {
215
+ id: org_id,
216
+ display: org_id[0..7] # Show first 8 chars for readability
217
+ }
218
+ end
292
219
 
293
- message
220
+ # List namespaces with optional label selector
221
+ #
222
+ # @param label_selector [String, nil] Label selector for filtering
223
+ # @return [Array<Hash>] Array of namespace resources
224
+ def list_namespaces(label_selector: nil)
225
+ namespaces_api = @client.api('v1').resource('namespaces')
226
+ result = if label_selector
227
+ namespaces_api.list(labelSelector: label_selector)
228
+ else
229
+ namespaces_api.list
230
+ end
231
+ # k8s-ruby returns an Array directly, not an object with .items
232
+ Array(result)
233
+ rescue StandardError => e
234
+ warn "Warning: Could not list namespaces: #{e.message}" if ENV['DEBUG']
235
+ []
294
236
  end
295
237
 
238
+ private
239
+
296
240
  # Build singleton instance with automatic config detection
297
241
  def self.build_singleton
298
242
  if in_cluster?
@@ -8,7 +8,7 @@ module LanguageOperator
8
8
  class ResourceBuilder
9
9
  class << self
10
10
  # Build a LanguageCluster resource
11
- def language_cluster(name, namespace: nil, domain: nil, labels: {})
11
+ def language_cluster(name, namespace: nil, domain: nil, labels: {}, k8s_client: nil)
12
12
  spec = {
13
13
  'namespace' => namespace || name,
14
14
  'resourceQuota' => default_resource_quota,
@@ -16,12 +16,12 @@ module LanguageOperator
16
16
  }
17
17
  spec['domain'] = domain if domain && !domain.empty?
18
18
 
19
- build_resource('LanguageCluster', name, spec, namespace: namespace, labels: labels)
19
+ build_resource('LanguageCluster', name, spec, namespace: namespace, labels: labels, k8s_client: k8s_client)
20
20
  end
21
21
 
22
22
  # Build a LanguageAgent resource
23
23
  def language_agent(name, instructions:, cluster: nil, cluster_ref: nil, schedule: nil, persona: nil, tools: [], models: [],
24
- mode: nil, workspace: true, labels: {})
24
+ mode: nil, workspace: true, labels: {}, k8s_client: nil)
25
25
  # Determine mode: reactive, scheduled, or autonomous
26
26
  spec_mode = mode || (schedule ? 'scheduled' : 'autonomous')
27
27
 
@@ -40,41 +40,41 @@ module LanguageOperator
40
40
  # Enable workspace by default for state persistence
41
41
  spec['workspace'] = { 'enabled' => workspace } if workspace
42
42
 
43
- build_resource('LanguageAgent', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels)
43
+ build_resource('LanguageAgent', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
44
44
  end
45
45
 
46
46
  # Build a LanguageTool resource
47
- def language_tool(name, type:, config: {}, cluster: nil, cluster_ref: nil, labels: {})
47
+ def language_tool(name, type:, config: {}, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
48
48
  build_resource('LanguageTool', name, {
49
49
  'type' => type,
50
50
  'config' => config
51
- }, namespace: cluster, cluster_ref: cluster_ref, labels: labels)
51
+ }, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
52
52
  end
53
53
 
54
54
  # Build a LanguageModel resource
55
- def language_model(name, provider:, model:, endpoint: nil, cluster: nil, cluster_ref: nil, labels: {})
55
+ def language_model(name, provider:, model:, endpoint: nil, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
56
56
  spec = {
57
57
  'provider' => provider,
58
58
  'modelName' => model
59
59
  }
60
60
  spec['endpoint'] = endpoint if endpoint
61
61
 
62
- build_resource('LanguageModel', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels)
62
+ build_resource('LanguageModel', name, spec, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
63
63
  end
64
64
 
65
65
  # Build a LanguagePersona resource
66
- def language_persona(name, description:, tone:, system_prompt:, cluster: nil, labels: {})
66
+ def language_persona(name, description:, tone:, system_prompt:, cluster: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
67
67
  build_resource('LanguagePersona', name, {
68
68
  'displayName' => name.split('-').map(&:capitalize).join(' '),
69
69
  'description' => description,
70
70
  'tone' => tone,
71
71
  'systemPrompt' => system_prompt
72
- }, namespace: cluster, labels: labels)
72
+ }, namespace: cluster, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
73
73
  end
74
74
 
75
75
  # Build a LanguagePersona resource with full spec control
76
- def build_persona(name:, spec:, namespace: nil, labels: {})
77
- build_resource('LanguagePersona', name, spec, namespace: namespace, labels: labels)
76
+ def build_persona(name:, spec:, namespace: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
77
+ build_resource('LanguagePersona', name, spec, namespace: namespace, cluster_ref: cluster_ref, labels: labels, k8s_client: k8s_client)
78
78
  end
79
79
 
80
80
  # Build a Kubernetes Service resource for a reactive agent
@@ -123,11 +123,14 @@ module LanguageOperator
123
123
  # @param namespace [String, nil] The namespace (defaults to 'default')
124
124
  # @param cluster_ref [String, nil] The cluster reference for lifecycle management
125
125
  # @param labels [Hash] Additional labels to merge with defaults
126
+ # @param k8s_client [Client, nil] Kubernetes client for org context detection
126
127
  # @return [Hash] Complete Kubernetes resource manifest
127
- def build_resource(kind, name, spec, namespace: nil, cluster_ref: nil, labels: {})
128
+ def build_resource(kind, name, spec, namespace: nil, cluster_ref: nil, labels: {}, k8s_client: nil)
128
129
  # Add clusterRef to spec if provided for proper lifecycle management
129
130
  spec = spec.merge('clusterRef' => cluster_ref) if cluster_ref
130
- {
131
+
132
+ # Build base resource
133
+ resource = {
131
134
  'apiVersion' => 'langop.io/v1alpha1',
132
135
  'kind' => kind,
133
136
  'metadata' => {
@@ -137,6 +140,35 @@ module LanguageOperator
137
140
  },
138
141
  'spec' => spec
139
142
  }
143
+
144
+ # Add organization context if available
145
+ add_org_context(resource, k8s_client)
146
+
147
+ resource
148
+ end
149
+
150
+ # Add organization context to a resource
151
+ #
152
+ # @param resource [Hash] Kubernetes resource manifest
153
+ # @param k8s_client [Client, nil] Kubernetes client for org context detection
154
+ # @return [Hash] Resource with organization labels/annotations added
155
+ def add_org_context(resource, k8s_client = nil)
156
+ return resource unless k8s_client
157
+
158
+ org_id = k8s_client.current_org_id
159
+ return resource unless org_id
160
+
161
+ # Add organization labels
162
+ resource['metadata']['labels'] ||= {}
163
+ resource['metadata']['labels']['langop.io/organization-id'] = org_id
164
+
165
+ # Add creation annotations
166
+ resource['metadata']['annotations'] ||= {}
167
+ # NOTE: We could add user email here if we had dashboard integration
168
+ # For now, just mark as CLI-created
169
+ resource['metadata']['annotations']['langop.io/created-by'] = 'langop'
170
+
171
+ resource
140
172
  end
141
173
 
142
174
  def default_labels
@@ -2,7 +2,7 @@
2
2
  :openapi: 3.0.3
3
3
  :info:
4
4
  :title: Language Operator Agent API
5
- :version: 0.1.73
5
+ :version: 0.1.82
6
6
  :description: HTTP API endpoints exposed by Language Operator reactive agents
7
7
  :contact:
8
8
  :name: Language Operator
@@ -3,7 +3,7 @@
3
3
  "$id": "https://github.com/language-operator/language-operator-gem/schema/agent-dsl.json",
4
4
  "title": "Language Operator Agent DSL",
5
5
  "description": "Schema for defining autonomous AI agents using the Language Operator DSL",
6
- "version": "0.1.73",
6
+ "version": "0.1.82",
7
7
  "type": "object",
8
8
  "properties": {
9
9
  "name": {
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LanguageOperator
4
+ module Utils
5
+ # Utility for detecting organization context from cluster resources
6
+ class OrgContext
7
+ ORG_ID_LABEL = 'langop.io/organization-id'
8
+
9
+ # Cache organization ID to avoid repeated API calls
10
+ @cache = {}
11
+ @cache_mutex = Mutex.new
12
+
13
+ class << self
14
+ # Get the current organization ID from cluster resources
15
+ #
16
+ # @param k8s_client [LanguageOperator::Kubernetes::Client] Kubernetes client
17
+ # @return [String, nil] Organization ID or nil if not found
18
+ def current_org_id(k8s_client)
19
+ return nil unless k8s_client
20
+
21
+ cache_key = "#{k8s_client.context}:#{k8s_client.current_namespace}"
22
+
23
+ @cache_mutex.synchronize do
24
+ # Return cached result if available and not expired
25
+ cached = @cache[cache_key]
26
+ return cached[:org_id] if cached && Time.now - cached[:timestamp] < cache_ttl
27
+
28
+ # Detect org ID from cluster resources
29
+ org_id = detect_org_id(k8s_client)
30
+
31
+ # Cache the result
32
+ @cache[cache_key] = {
33
+ org_id: org_id,
34
+ timestamp: Time.now
35
+ }
36
+
37
+ org_id
38
+ end
39
+ rescue StandardError => e
40
+ # Log error but don't fail - return nil for legacy mode
41
+ warn "Warning: Could not detect organization context: #{e.message}" if ENV['DEBUG']
42
+ nil
43
+ end
44
+
45
+ # Clear the organization context cache
46
+ def clear_cache!
47
+ @cache_mutex.synchronize { @cache.clear }
48
+ end
49
+
50
+ # Get organization ID from a specific resource
51
+ #
52
+ # @param resource [Hash] Kubernetes resource manifest
53
+ # @return [String, nil] Organization ID from labels
54
+ def org_id_from_resource(resource)
55
+ resource.dig('metadata', 'labels', ORG_ID_LABEL)
56
+ end
57
+
58
+ # Check if a resource has organization context
59
+ #
60
+ # @param resource [Hash] Kubernetes resource manifest
61
+ # @return [Boolean] True if resource has org ID label
62
+ def org_context?(resource)
63
+ !org_id_from_resource(resource).nil?
64
+ end
65
+
66
+ private
67
+
68
+ # Detect organization ID by examining cluster resources
69
+ #
70
+ # @param k8s_client [LanguageOperator::Kubernetes::Client] Kubernetes client
71
+ # @return [String, nil] Organization ID or nil if not found
72
+ def detect_org_id(k8s_client)
73
+ # Try to find organization ID from any language operator resource
74
+ # Check in order of likelihood: LanguageCluster, LanguageAgent, LanguageModel
75
+
76
+ %w[LanguageCluster LanguageAgent LanguageModel LanguagePersona].each do |kind|
77
+ resources = k8s_client.list_resources(kind)
78
+ next if resources.empty?
79
+
80
+ # Look for org ID in any resource of this type
81
+ resources.each do |resource|
82
+ org_id = org_id_from_resource(resource)
83
+ return org_id if org_id
84
+ end
85
+ end
86
+
87
+ nil
88
+ rescue StandardError
89
+ # If we can't query resources, assume legacy mode
90
+ nil
91
+ end
92
+
93
+ # Cache TTL in seconds (5 minutes)
94
+ def cache_ttl
95
+ 300
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LanguageOperator
4
- VERSION = '0.1.81'
4
+ VERSION = '0.1.82'
5
5
  end
data/synth/001/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  .PHONY: create code logs clean
2
2
 
3
3
  AGENT := s001
4
- AICTL := bundle exec ../../bin/aictl agent
4
+ AICTL := bundle exec ../../bin/langop agent
5
5
  TOOLS := workspace
6
6
 
7
7
  create:
data/synth/002/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  .PHONY: create code logs clean
2
2
 
3
3
  AGENT := s002
4
- AICTL := bundle exec ../../bin/aictl agent
4
+ AICTL := bundle exec ../../bin/langop agent
5
5
  TOOLS := workspace
6
6
 
7
7
  create:
data/synth/003/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  .PHONY: create code logs clean
2
2
 
3
3
  AGENT := s003
4
- AICTL := bundle exec ../../bin/aictl agent
4
+ AICTL := bundle exec ../../bin/langop agent
5
5
  TOOLS := workspace
6
6
 
7
7
  create:
data/synth/004/Makefile CHANGED
@@ -1,7 +1,7 @@
1
1
  .PHONY: create code logs clean events validate run
2
2
 
3
3
  AGENT := s004
4
- AICTL := bundle exec ../../bin/aictl agent
4
+ AICTL := bundle exec ../../bin/langop agent
5
5
  TOOLS := workspace
6
6
 
7
7
  create: