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.
- checksums.yaml +4 -4
- data/.claude/agents/README.md +16 -0
- data/.claude/agents/changelog-writer.md +181 -0
- data/.claude/hooks/README.md +43 -0
- data/.claude/hooks/node_modules/.bin/esbuild +1 -0
- data/.claude/hooks/node_modules/.bin/tsc +1 -0
- data/.claude/hooks/node_modules/.bin/tsserver +1 -0
- data/.claude/hooks/node_modules/.bin/tsx +1 -0
- data/.claude/hooks/node_modules/.package-lock.json +136 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/README.md +3 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
- data/.claude/hooks/node_modules/@esbuild/linux-x64/package.json +20 -0
- data/.claude/hooks/node_modules/@types/node/LICENSE +21 -0
- data/.claude/hooks/node_modules/@types/node/README.md +15 -0
- data/.claude/hooks/node_modules/@types/node/assert/strict.d.ts +105 -0
- data/.claude/hooks/node_modules/@types/node/assert.d.ts +955 -0
- data/.claude/hooks/node_modules/@types/node/async_hooks.d.ts +623 -0
- data/.claude/hooks/node_modules/@types/node/buffer.buffer.d.ts +466 -0
- data/.claude/hooks/node_modules/@types/node/buffer.d.ts +1810 -0
- data/.claude/hooks/node_modules/@types/node/child_process.d.ts +1428 -0
- data/.claude/hooks/node_modules/@types/node/cluster.d.ts +486 -0
- data/.claude/hooks/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
- data/.claude/hooks/node_modules/@types/node/console.d.ts +151 -0
- data/.claude/hooks/node_modules/@types/node/constants.d.ts +20 -0
- data/.claude/hooks/node_modules/@types/node/crypto.d.ts +4065 -0
- data/.claude/hooks/node_modules/@types/node/dgram.d.ts +564 -0
- data/.claude/hooks/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
- data/.claude/hooks/node_modules/@types/node/dns/promises.d.ts +503 -0
- data/.claude/hooks/node_modules/@types/node/dns.d.ts +922 -0
- data/.claude/hooks/node_modules/@types/node/domain.d.ts +166 -0
- data/.claude/hooks/node_modules/@types/node/events.d.ts +1054 -0
- data/.claude/hooks/node_modules/@types/node/fs/promises.d.ts +1316 -0
- data/.claude/hooks/node_modules/@types/node/fs.d.ts +4676 -0
- data/.claude/hooks/node_modules/@types/node/globals.d.ts +150 -0
- data/.claude/hooks/node_modules/@types/node/globals.typedarray.d.ts +101 -0
- data/.claude/hooks/node_modules/@types/node/http.d.ts +2143 -0
- data/.claude/hooks/node_modules/@types/node/http2.d.ts +2480 -0
- data/.claude/hooks/node_modules/@types/node/https.d.ts +399 -0
- data/.claude/hooks/node_modules/@types/node/index.d.ts +115 -0
- data/.claude/hooks/node_modules/@types/node/inspector/promises.d.ts +41 -0
- data/.claude/hooks/node_modules/@types/node/inspector.d.ts +224 -0
- data/.claude/hooks/node_modules/@types/node/inspector.generated.d.ts +4226 -0
- data/.claude/hooks/node_modules/@types/node/module.d.ts +819 -0
- data/.claude/hooks/node_modules/@types/node/net.d.ts +933 -0
- data/.claude/hooks/node_modules/@types/node/os.d.ts +507 -0
- data/.claude/hooks/node_modules/@types/node/package.json +155 -0
- data/.claude/hooks/node_modules/@types/node/path/posix.d.ts +8 -0
- data/.claude/hooks/node_modules/@types/node/path/win32.d.ts +8 -0
- data/.claude/hooks/node_modules/@types/node/path.d.ts +187 -0
- data/.claude/hooks/node_modules/@types/node/perf_hooks.d.ts +621 -0
- data/.claude/hooks/node_modules/@types/node/process.d.ts +2097 -0
- data/.claude/hooks/node_modules/@types/node/punycode.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/querystring.d.ts +152 -0
- data/.claude/hooks/node_modules/@types/node/quic.d.ts +910 -0
- data/.claude/hooks/node_modules/@types/node/readline/promises.d.ts +161 -0
- data/.claude/hooks/node_modules/@types/node/readline.d.ts +541 -0
- data/.claude/hooks/node_modules/@types/node/repl.d.ts +415 -0
- data/.claude/hooks/node_modules/@types/node/sea.d.ts +162 -0
- data/.claude/hooks/node_modules/@types/node/sqlite.d.ts +937 -0
- data/.claude/hooks/node_modules/@types/node/stream/consumers.d.ts +38 -0
- data/.claude/hooks/node_modules/@types/node/stream/promises.d.ts +211 -0
- data/.claude/hooks/node_modules/@types/node/stream/web.d.ts +296 -0
- data/.claude/hooks/node_modules/@types/node/stream.d.ts +1760 -0
- data/.claude/hooks/node_modules/@types/node/string_decoder.d.ts +67 -0
- data/.claude/hooks/node_modules/@types/node/test/reporters.d.ts +96 -0
- data/.claude/hooks/node_modules/@types/node/test.d.ts +2239 -0
- data/.claude/hooks/node_modules/@types/node/timers/promises.d.ts +108 -0
- data/.claude/hooks/node_modules/@types/node/timers.d.ts +159 -0
- data/.claude/hooks/node_modules/@types/node/tls.d.ts +1194 -0
- data/.claude/hooks/node_modules/@types/node/trace_events.d.ts +197 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
- data/.claude/hooks/node_modules/@types/node/ts5.6/index.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
- data/.claude/hooks/node_modules/@types/node/ts5.7/index.d.ts +117 -0
- data/.claude/hooks/node_modules/@types/node/tty.d.ts +250 -0
- data/.claude/hooks/node_modules/@types/node/url.d.ts +519 -0
- data/.claude/hooks/node_modules/@types/node/util/types.d.ts +558 -0
- data/.claude/hooks/node_modules/@types/node/util.d.ts +1653 -0
- data/.claude/hooks/node_modules/@types/node/v8.d.ts +979 -0
- data/.claude/hooks/node_modules/@types/node/vm.d.ts +1180 -0
- data/.claude/hooks/node_modules/@types/node/wasi.d.ts +202 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/blob.d.ts +23 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/console.d.ts +9 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/events.d.ts +106 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/fetch.d.ts +54 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/performance.d.ts +45 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/streams.d.ts +115 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/timers.d.ts +44 -0
- data/.claude/hooks/node_modules/@types/node/web-globals/url.d.ts +24 -0
- data/.claude/hooks/node_modules/@types/node/worker_threads.d.ts +714 -0
- data/.claude/hooks/node_modules/@types/node/zlib.d.ts +618 -0
- data/.claude/hooks/node_modules/esbuild/LICENSE.md +21 -0
- data/.claude/hooks/node_modules/esbuild/README.md +3 -0
- data/.claude/hooks/node_modules/esbuild/bin/esbuild +0 -0
- data/.claude/hooks/node_modules/esbuild/install.js +289 -0
- data/.claude/hooks/node_modules/esbuild/lib/main.d.ts +716 -0
- data/.claude/hooks/node_modules/esbuild/lib/main.js +2242 -0
- data/.claude/hooks/node_modules/esbuild/package.json +49 -0
- data/.claude/hooks/node_modules/get-tsconfig/LICENSE +21 -0
- data/.claude/hooks/node_modules/get-tsconfig/README.md +235 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.cjs +7 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.cts +2088 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.d.mts +2088 -0
- data/.claude/hooks/node_modules/get-tsconfig/dist/index.mjs +7 -0
- data/.claude/hooks/node_modules/get-tsconfig/package.json +46 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/LICENSE +21 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/README.md +216 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.cjs +1 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.cts +11 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.d.mts +11 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/dist/index.mjs +1 -0
- data/.claude/hooks/node_modules/resolve-pkg-maps/package.json +42 -0
- data/.claude/hooks/node_modules/tsx/LICENSE +21 -0
- data/.claude/hooks/node_modules/tsx/README.md +32 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.cts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.d.mts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/api/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cjs/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/cli.cjs +54 -0
- data/.claude/hooks/node_modules/tsx/dist/cli.mjs +55 -0
- data/.claude/hooks/node_modules/tsx/dist/client-BQVF1NaW.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/client-D6NvIMSC.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.cts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.d.mts +35 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/api/index.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/index.cjs +2 -0
- data/.claude/hooks/node_modules/tsx/dist/esm/index.mjs +2 -0
- data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BHW2eJdv.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/get-pipe-path-BoR10qr8.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-7AaEi15b.mjs +14 -0
- data/.claude/hooks/node_modules/tsx/dist/index-BWFBUo6r.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-gbaejti9.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/index-gckBtVBf.cjs +14 -0
- data/.claude/hooks/node_modules/tsx/dist/lexer-DQCqS3nf.mjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/lexer-DgIbo0BU.cjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/loader.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/loader.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/node-features-_8ZFwP_x.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/node-features-roYmp9jK.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/package-CeBgXWuR.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/package-Dxt5kIHw.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/patch-repl.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/patch-repl.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/preflight.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/preflight.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-2sWVXuRQ.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-B7jrtLTO.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/register-CFH5oNdT.mjs +4 -0
- data/.claude/hooks/node_modules/tsx/dist/register-D46fvsV_.cjs +4 -0
- data/.claude/hooks/node_modules/tsx/dist/repl.cjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/repl.mjs +3 -0
- data/.claude/hooks/node_modules/tsx/dist/require-D4F1Lv60.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/require-DQxpCAr4.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/suppress-warnings.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/temporary-directory-B83uKxJF.cjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/temporary-directory-CwHp0_NW.mjs +1 -0
- data/.claude/hooks/node_modules/tsx/dist/types-Cxp8y2TL.d.ts +5 -0
- data/.claude/hooks/node_modules/tsx/package.json +68 -0
- data/.claude/hooks/node_modules/typescript/LICENSE.txt +55 -0
- data/.claude/hooks/node_modules/typescript/README.md +50 -0
- data/.claude/hooks/node_modules/typescript/SECURITY.md +41 -0
- data/.claude/hooks/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- data/.claude/hooks/node_modules/typescript/bin/tsc +2 -0
- data/.claude/hooks/node_modules/typescript/bin/tsserver +2 -0
- data/.claude/hooks/node_modules/typescript/lib/_tsc.js +133818 -0
- data/.claude/hooks/node_modules/typescript/lib/_tsserver.js +659 -0
- data/.claude/hooks/node_modules/typescript/lib/_typingsInstaller.js +222 -0
- data/.claude/hooks/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.es6.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
- data/.claude/hooks/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
- data/.claude/hooks/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/tsc.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserver.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
- data/.claude/hooks/node_modules/typescript/lib/tsserverlibrary.js +21 -0
- data/.claude/hooks/node_modules/typescript/lib/typesMap.json +497 -0
- data/.claude/hooks/node_modules/typescript/lib/typescript.d.ts +11437 -0
- data/.claude/hooks/node_modules/typescript/lib/typescript.js +200276 -0
- data/.claude/hooks/node_modules/typescript/lib/typingsInstaller.js +8 -0
- data/.claude/hooks/node_modules/typescript/lib/watchGuard.js +53 -0
- data/.claude/hooks/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
- data/.claude/hooks/node_modules/typescript/package.json +120 -0
- data/.claude/hooks/node_modules/undici-types/LICENSE +21 -0
- data/.claude/hooks/node_modules/undici-types/README.md +6 -0
- data/.claude/hooks/node_modules/undici-types/agent.d.ts +32 -0
- data/.claude/hooks/node_modules/undici-types/api.d.ts +43 -0
- data/.claude/hooks/node_modules/undici-types/balanced-pool.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/cache-interceptor.d.ts +172 -0
- data/.claude/hooks/node_modules/undici-types/cache.d.ts +36 -0
- data/.claude/hooks/node_modules/undici-types/client-stats.d.ts +15 -0
- data/.claude/hooks/node_modules/undici-types/client.d.ts +108 -0
- data/.claude/hooks/node_modules/undici-types/connector.d.ts +34 -0
- data/.claude/hooks/node_modules/undici-types/content-type.d.ts +21 -0
- data/.claude/hooks/node_modules/undici-types/cookies.d.ts +30 -0
- data/.claude/hooks/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
- data/.claude/hooks/node_modules/undici-types/dispatcher.d.ts +276 -0
- data/.claude/hooks/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
- data/.claude/hooks/node_modules/undici-types/errors.d.ts +161 -0
- data/.claude/hooks/node_modules/undici-types/eventsource.d.ts +66 -0
- data/.claude/hooks/node_modules/undici-types/fetch.d.ts +211 -0
- data/.claude/hooks/node_modules/undici-types/formdata.d.ts +108 -0
- data/.claude/hooks/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- data/.claude/hooks/node_modules/undici-types/global-origin.d.ts +7 -0
- data/.claude/hooks/node_modules/undici-types/h2c-client.d.ts +73 -0
- data/.claude/hooks/node_modules/undici-types/handlers.d.ts +15 -0
- data/.claude/hooks/node_modules/undici-types/header.d.ts +160 -0
- data/.claude/hooks/node_modules/undici-types/index.d.ts +80 -0
- data/.claude/hooks/node_modules/undici-types/interceptors.d.ts +39 -0
- data/.claude/hooks/node_modules/undici-types/mock-agent.d.ts +68 -0
- data/.claude/hooks/node_modules/undici-types/mock-call-history.d.ts +111 -0
- data/.claude/hooks/node_modules/undici-types/mock-client.d.ts +27 -0
- data/.claude/hooks/node_modules/undici-types/mock-errors.d.ts +12 -0
- data/.claude/hooks/node_modules/undici-types/mock-interceptor.d.ts +94 -0
- data/.claude/hooks/node_modules/undici-types/mock-pool.d.ts +27 -0
- data/.claude/hooks/node_modules/undici-types/package.json +55 -0
- data/.claude/hooks/node_modules/undici-types/patch.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/pool-stats.d.ts +19 -0
- data/.claude/hooks/node_modules/undici-types/pool.d.ts +41 -0
- data/.claude/hooks/node_modules/undici-types/proxy-agent.d.ts +29 -0
- data/.claude/hooks/node_modules/undici-types/readable.d.ts +68 -0
- data/.claude/hooks/node_modules/undici-types/retry-agent.d.ts +8 -0
- data/.claude/hooks/node_modules/undici-types/retry-handler.d.ts +125 -0
- data/.claude/hooks/node_modules/undici-types/snapshot-agent.d.ts +109 -0
- data/.claude/hooks/node_modules/undici-types/util.d.ts +18 -0
- data/.claude/hooks/node_modules/undici-types/utility.d.ts +7 -0
- data/.claude/hooks/node_modules/undici-types/webidl.d.ts +341 -0
- data/.claude/hooks/node_modules/undici-types/websocket.d.ts +186 -0
- data/.claude/hooks/package-lock.json +562 -0
- data/.claude/hooks/package.json +19 -0
- data/.claude/hooks/skill-activation-prompt.sh +11 -0
- data/.claude/hooks/skill-activation-prompt.ts +185 -0
- data/.claude/hooks/tsconfig.json +12 -0
- data/.claude/settings.json +33 -0
- data/.claude/skills/README.md +29 -0
- data/.claude/skills/ruby-gem-development/SKILL.md +293 -0
- data/.claude/skills/skill-rules.json +117 -0
- data/.claude/skills/thor-cli-development/SKILL.md +431 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +3 -1
- data/completions/{_aictl → _langop} +37 -37
- data/completions/{aictl.bash → langop.bash} +16 -16
- data/completions/langop.fish +114 -0
- data/components/agent/Gemfile +1 -1
- data/components/tool/Gemfile +1 -1
- data/docs/README.md +10 -10
- data/docs/agent-internals.md +1 -1
- data/docs/cheat-sheet.md +76 -76
- data/docs/cli-reference.md +71 -71
- data/docs/how-agents-work.md +1 -1
- data/docs/installation.md +30 -30
- data/docs/quickstart.md +30 -30
- data/docs/using-tools.md +11 -11
- data/docs/webhooks.md +6 -6
- data/examples/ux_helpers_demo.rb +4 -4
- data/lib/language_operator/agent/task_executor.rb +0 -37
- data/lib/language_operator/agent/web_server.rb +311 -323
- data/lib/language_operator/cli/commands/agent/base.rb +16 -15
- data/lib/language_operator/cli/commands/agent/code_operations.rb +6 -6
- data/lib/language_operator/cli/commands/agent/helpers/synthesis_watcher.rb +1 -1
- data/lib/language_operator/cli/commands/agent/lifecycle.rb +2 -2
- data/lib/language_operator/cli/commands/agent/logs.rb +2 -2
- data/lib/language_operator/cli/commands/agent/workspace.rb +8 -8
- data/lib/language_operator/cli/commands/cluster.rb +172 -158
- data/lib/language_operator/cli/commands/install.rb +878 -81
- data/lib/language_operator/cli/commands/model/base.rb +7 -6
- data/lib/language_operator/cli/commands/organization.rb +61 -0
- data/lib/language_operator/cli/commands/persona.rb +10 -8
- data/lib/language_operator/cli/commands/status.rb +83 -13
- data/lib/language_operator/cli/commands/system/exec.rb +10 -10
- data/lib/language_operator/cli/commands/system/schema.rb +6 -6
- data/lib/language_operator/cli/commands/system/synthesis_template.rb +6 -6
- data/lib/language_operator/cli/commands/system/synthesize.rb +14 -14
- data/lib/language_operator/cli/commands/system/validate_template.rb +4 -4
- data/lib/language_operator/cli/commands/tool/base.rb +1 -1
- data/lib/language_operator/cli/commands/tool/install.rb +2 -2
- data/lib/language_operator/cli/commands/tool/search.rb +3 -3
- data/lib/language_operator/cli/commands/ui.rb +173 -0
- data/lib/language_operator/cli/commands/use.rb +80 -9
- data/lib/language_operator/cli/errors/suggestions.rb +21 -21
- data/lib/language_operator/cli/formatters/progress_formatter.rb +2 -1
- data/lib/language_operator/cli/formatters/table_formatter.rb +21 -1
- data/lib/language_operator/cli/helpers/cluster_validator.rb +2 -2
- data/lib/language_operator/cli/helpers/health_checker.rb +263 -0
- data/lib/language_operator/cli/helpers/kubeconfig_validator.rb +3 -3
- data/lib/language_operator/cli/helpers/ux_helper.rb +4 -3
- data/lib/language_operator/cli/main.rb +30 -21
- data/lib/language_operator/cli/wizards/model_wizard.rb +7 -5
- data/lib/language_operator/config/cluster_config.rb +3 -3
- data/lib/language_operator/constants/kubernetes_labels.rb +1 -1
- data/lib/language_operator/kubernetes/client.rb +53 -109
- data/lib/language_operator/kubernetes/resource_builder.rb +46 -14
- data/lib/language_operator/templates/schema/agent_dsl_openapi.yaml +1 -1
- data/lib/language_operator/templates/schema/agent_dsl_schema.json +1 -1
- data/lib/language_operator/utils/org_context.rb +100 -0
- data/lib/language_operator/version.rb +1 -1
- data/synth/001/Makefile +1 -1
- data/synth/002/Makefile +1 -1
- data/synth/003/Makefile +1 -1
- data/synth/004/Makefile +1 -1
- metadata +384 -11
- data/completions/aictl.fish +0 -114
- data/lib/language_operator/agent/event_config.rb +0 -172
- data/lib/language_operator/cli/commands/quickstart.rb +0 -22
- data/lib/language_operator/cli/wizards/quickstart_wizard.rb +0 -561
- /data/bin/{aictl → langop} +0 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../formatters/progress_formatter'
|
|
4
|
+
|
|
5
|
+
module LanguageOperator
|
|
6
|
+
module CLI
|
|
7
|
+
module Helpers
|
|
8
|
+
# Health checker for Language Operator components
|
|
9
|
+
class HealthChecker
|
|
10
|
+
attr_reader :k8s, :namespace, :cluster_name, :cluster_namespace
|
|
11
|
+
|
|
12
|
+
def initialize(k8s_client, namespace, cluster_name = nil, cluster_namespace = nil)
|
|
13
|
+
@k8s = k8s_client
|
|
14
|
+
@namespace = namespace
|
|
15
|
+
@cluster_name = cluster_name
|
|
16
|
+
@cluster_namespace = cluster_namespace
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Check dashboard deployment health
|
|
20
|
+
def check_dashboard_health
|
|
21
|
+
deployment = @k8s.client.api('apps/v1')
|
|
22
|
+
.resource('deployments', namespace: @namespace)
|
|
23
|
+
.get('language-operator-dashboard')
|
|
24
|
+
|
|
25
|
+
ready_replicas = deployment.dig('status', 'readyReplicas') || 0
|
|
26
|
+
desired_replicas = deployment.dig('spec', 'replicas') || 0
|
|
27
|
+
|
|
28
|
+
{
|
|
29
|
+
healthy: ready_replicas == desired_replicas && desired_replicas > 0,
|
|
30
|
+
ready_replicas: ready_replicas,
|
|
31
|
+
desired_replicas: desired_replicas
|
|
32
|
+
}
|
|
33
|
+
rescue K8s::Error::NotFound
|
|
34
|
+
{ healthy: false, error: 'Dashboard deployment not found' }
|
|
35
|
+
rescue StandardError => e
|
|
36
|
+
{ healthy: false, error: e.message }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Check operator deployment health
|
|
40
|
+
def check_operator_health
|
|
41
|
+
deployment = @k8s.client.api('apps/v1')
|
|
42
|
+
.resource('deployments', namespace: @namespace)
|
|
43
|
+
.get('language-operator')
|
|
44
|
+
|
|
45
|
+
ready_replicas = deployment.dig('status', 'readyReplicas') || 0
|
|
46
|
+
desired_replicas = deployment.dig('spec', 'replicas') || 0
|
|
47
|
+
|
|
48
|
+
{
|
|
49
|
+
healthy: ready_replicas == desired_replicas && desired_replicas > 0,
|
|
50
|
+
ready_replicas: ready_replicas,
|
|
51
|
+
desired_replicas: desired_replicas
|
|
52
|
+
}
|
|
53
|
+
rescue K8s::Error::NotFound
|
|
54
|
+
{ healthy: false, error: 'Operator deployment not found' }
|
|
55
|
+
rescue StandardError => e
|
|
56
|
+
{ healthy: false, error: e.message }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Check ClickHouse health and authentication
|
|
60
|
+
def check_clickhouse_health
|
|
61
|
+
# First check if service exists
|
|
62
|
+
begin
|
|
63
|
+
@k8s.client.api('v1')
|
|
64
|
+
.resource('services', namespace: @namespace)
|
|
65
|
+
.get('language-operator-clickhouse')
|
|
66
|
+
rescue K8s::Error::NotFound
|
|
67
|
+
return { healthy: false, error: 'ClickHouse service not found' }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Try to connect and authenticate using port-forward
|
|
71
|
+
require 'net/http'
|
|
72
|
+
require 'uri'
|
|
73
|
+
require 'open3'
|
|
74
|
+
|
|
75
|
+
port = find_available_port
|
|
76
|
+
pf_pid = nil
|
|
77
|
+
|
|
78
|
+
begin
|
|
79
|
+
# Start port-forward in background
|
|
80
|
+
pf_command = "kubectl port-forward -n #{@namespace} service/language-operator-clickhouse #{port}:8123"
|
|
81
|
+
pf_stdin, pf_stdout, pf_stderr, pf_thread = Open3.popen3(pf_command)
|
|
82
|
+
|
|
83
|
+
# Give port-forward time to establish
|
|
84
|
+
sleep(2)
|
|
85
|
+
|
|
86
|
+
# Test connection with credentials
|
|
87
|
+
uri = URI("http://localhost:#{port}/ping")
|
|
88
|
+
|
|
89
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
90
|
+
http.read_timeout = 5
|
|
91
|
+
http.open_timeout = 5
|
|
92
|
+
|
|
93
|
+
# Try with auth (default ClickHouse credentials for Language Operator)
|
|
94
|
+
request = Net::HTTP::Get.new(uri)
|
|
95
|
+
request.basic_auth('langop', 'langop')
|
|
96
|
+
|
|
97
|
+
response = http.request(request)
|
|
98
|
+
|
|
99
|
+
{
|
|
100
|
+
healthy: response.code == '200',
|
|
101
|
+
auth_works: response.code == '200',
|
|
102
|
+
response_code: response.code
|
|
103
|
+
}
|
|
104
|
+
rescue StandardError => e
|
|
105
|
+
{ healthy: false, error: e.message }
|
|
106
|
+
ensure
|
|
107
|
+
# Clean up port-forward
|
|
108
|
+
if pf_thread&.alive?
|
|
109
|
+
Process.kill('TERM', pf_thread.pid) rescue nil
|
|
110
|
+
pf_thread.join(1)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Check PostgreSQL health and authentication
|
|
116
|
+
def check_postgres_health
|
|
117
|
+
# First check if service exists
|
|
118
|
+
begin
|
|
119
|
+
@k8s.client.api('v1')
|
|
120
|
+
.resource('services', namespace: @namespace)
|
|
121
|
+
.get('language-operator-dashboard-postgresql')
|
|
122
|
+
rescue K8s::Error::NotFound
|
|
123
|
+
return { healthy: false, error: 'PostgreSQL service not found' }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Try to connect and authenticate using port-forward and pg_isready
|
|
127
|
+
require 'open3'
|
|
128
|
+
|
|
129
|
+
port = find_available_port
|
|
130
|
+
pf_pid = nil
|
|
131
|
+
|
|
132
|
+
begin
|
|
133
|
+
# Start port-forward in background
|
|
134
|
+
pf_command = "kubectl port-forward -n #{@namespace} service/language-operator-dashboard-postgresql #{port}:5432"
|
|
135
|
+
pf_stdin, pf_stdout, pf_stderr, pf_thread = Open3.popen3(pf_command)
|
|
136
|
+
|
|
137
|
+
# Give port-forward time to establish
|
|
138
|
+
sleep(2)
|
|
139
|
+
|
|
140
|
+
# Test connection with pg_isready (if available) or simple TCP connection
|
|
141
|
+
if system('which pg_isready > /dev/null 2>&1')
|
|
142
|
+
# Use pg_isready for proper PostgreSQL health check
|
|
143
|
+
test_output, test_status = Open3.capture2e("pg_isready -h localhost -p #{port} -U postgres -d langop_dashboard")
|
|
144
|
+
{
|
|
145
|
+
healthy: test_status.success?,
|
|
146
|
+
auth_works: test_status.success?,
|
|
147
|
+
output: test_output.strip
|
|
148
|
+
}
|
|
149
|
+
else
|
|
150
|
+
# Fallback to basic TCP connection test
|
|
151
|
+
require 'socket'
|
|
152
|
+
begin
|
|
153
|
+
socket = TCPSocket.new('localhost', port)
|
|
154
|
+
socket.close
|
|
155
|
+
{ healthy: true, auth_works: false, note: 'pg_isready not available - basic TCP test only' }
|
|
156
|
+
rescue StandardError => e
|
|
157
|
+
{ healthy: false, error: e.message }
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
rescue StandardError => e
|
|
161
|
+
{ healthy: false, error: e.message }
|
|
162
|
+
ensure
|
|
163
|
+
# Clean up port-forward
|
|
164
|
+
if pf_thread&.alive?
|
|
165
|
+
Process.kill('TERM', pf_thread.pid) rescue nil
|
|
166
|
+
pf_thread.join(1)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Check if the selected cluster exists in Kubernetes
|
|
172
|
+
def check_cluster_exists
|
|
173
|
+
return { healthy: true, note: 'No cluster specified' } unless @cluster_name && @cluster_namespace
|
|
174
|
+
|
|
175
|
+
cluster_resource = @k8s.get_resource('LanguageCluster', @cluster_name, @cluster_namespace)
|
|
176
|
+
|
|
177
|
+
status = cluster_resource.dig('status', 'phase') || 'Unknown'
|
|
178
|
+
{
|
|
179
|
+
healthy: true,
|
|
180
|
+
status: status,
|
|
181
|
+
exists: true
|
|
182
|
+
}
|
|
183
|
+
rescue K8s::Error::NotFound
|
|
184
|
+
{ healthy: false, error: "Cluster '#{@cluster_name}' not found in namespace '#{@cluster_namespace}'" }
|
|
185
|
+
rescue StandardError => e
|
|
186
|
+
{ healthy: false, error: e.message }
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Run all health checks with progress indicators
|
|
190
|
+
def run_all_checks
|
|
191
|
+
results = {}
|
|
192
|
+
|
|
193
|
+
# Cluster existence check (first)
|
|
194
|
+
if @cluster_name && @cluster_namespace
|
|
195
|
+
begin
|
|
196
|
+
results[:cluster] = Formatters::ProgressFormatter.with_spinner(
|
|
197
|
+
"Verifying cluster '#{@cluster_name}' exists"
|
|
198
|
+
) { check_cluster_exists }
|
|
199
|
+
rescue StandardError => e
|
|
200
|
+
results[:cluster] = { healthy: false, error: e.message }
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Dashboard health check
|
|
205
|
+
begin
|
|
206
|
+
results[:dashboard] = Formatters::ProgressFormatter.with_spinner(
|
|
207
|
+
'Verifying language-operator-dashboard deployment'
|
|
208
|
+
) { check_dashboard_health }
|
|
209
|
+
rescue StandardError => e
|
|
210
|
+
results[:dashboard] = { healthy: false, error: e.message }
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Operator health check
|
|
214
|
+
begin
|
|
215
|
+
results[:operator] = Formatters::ProgressFormatter.with_spinner(
|
|
216
|
+
'Verifying language-operator deployment'
|
|
217
|
+
) { check_operator_health }
|
|
218
|
+
rescue StandardError => e
|
|
219
|
+
results[:operator] = { healthy: false, error: e.message }
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# ClickHouse health check
|
|
223
|
+
begin
|
|
224
|
+
results[:clickhouse] = Formatters::ProgressFormatter.with_spinner(
|
|
225
|
+
'Verifying ClickHouse health and authentication'
|
|
226
|
+
) { check_clickhouse_health }
|
|
227
|
+
rescue StandardError => e
|
|
228
|
+
results[:clickhouse] = { healthy: false, error: e.message }
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# PostgreSQL health check
|
|
232
|
+
begin
|
|
233
|
+
results[:postgres] = Formatters::ProgressFormatter.with_spinner(
|
|
234
|
+
'Verifying PostgreSQL health and authentication'
|
|
235
|
+
) { check_postgres_health }
|
|
236
|
+
rescue StandardError => e
|
|
237
|
+
results[:postgres] = { healthy: false, error: e.message }
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
results
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
private
|
|
244
|
+
|
|
245
|
+
# Find an available port for port-forwarding
|
|
246
|
+
def find_available_port
|
|
247
|
+
require 'socket'
|
|
248
|
+
port = 8080
|
|
249
|
+
begin
|
|
250
|
+
server = TCPServer.new('localhost', port)
|
|
251
|
+
port = server.addr[1]
|
|
252
|
+
server.close
|
|
253
|
+
port
|
|
254
|
+
rescue Errno::EADDRINUSE
|
|
255
|
+
port += 1
|
|
256
|
+
retry if port < 9000
|
|
257
|
+
raise 'No available ports found'
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
@@ -131,8 +131,8 @@ module LanguageOperator
|
|
|
131
131
|
|
|
132
132
|
To install the operator:
|
|
133
133
|
|
|
134
|
-
1. Using
|
|
135
|
-
|
|
134
|
+
1. Using langop (recommended):
|
|
135
|
+
langop install
|
|
136
136
|
|
|
137
137
|
2. Or manually with Helm:
|
|
138
138
|
helm repo add language-operator https://language-operator.github.io/charts
|
|
@@ -158,7 +158,7 @@ module LanguageOperator
|
|
|
158
158
|
3. You have appropriate permissions
|
|
159
159
|
|
|
160
160
|
For debugging, run with DEBUG=1:
|
|
161
|
-
DEBUG=1
|
|
161
|
+
DEBUG=1 langop <command>
|
|
162
162
|
MSG
|
|
163
163
|
end
|
|
164
164
|
end
|
|
@@ -433,15 +433,16 @@ module LanguageOperator
|
|
|
433
433
|
# @param created [String, nil] Creation timestamp (optional)
|
|
434
434
|
# @param domain [String, nil] Cluster domain (optional)
|
|
435
435
|
# @return [void] Displays formatted cluster information
|
|
436
|
-
def format_cluster_details(name:, namespace:, context:, status: nil, created: nil, domain: nil)
|
|
436
|
+
def format_cluster_details(name:, namespace:, context:, status: nil, created: nil, domain: nil, org_id: nil)
|
|
437
437
|
format_resource_details(
|
|
438
438
|
type: 'Cluster',
|
|
439
439
|
name: name,
|
|
440
440
|
common_fields: {
|
|
441
|
-
'Namespace' => namespace
|
|
442
|
-
'Context' => context
|
|
441
|
+
'Namespace' => namespace
|
|
443
442
|
},
|
|
444
443
|
optional_fields: {
|
|
444
|
+
'Org ID' => org_id,
|
|
445
|
+
'Context' => context,
|
|
445
446
|
'Domain' => domain,
|
|
446
447
|
'Status' => status,
|
|
447
448
|
'Created' => created
|
|
@@ -10,9 +10,10 @@ require_relative 'commands/status'
|
|
|
10
10
|
require_relative 'commands/persona'
|
|
11
11
|
require_relative 'commands/tool/base'
|
|
12
12
|
require_relative 'commands/model/base'
|
|
13
|
-
require_relative 'commands/quickstart'
|
|
14
13
|
require_relative 'commands/install'
|
|
15
14
|
require_relative 'commands/system/base'
|
|
15
|
+
require_relative 'commands/ui'
|
|
16
|
+
require_relative 'commands/organization'
|
|
16
17
|
require_relative 'formatters/progress_formatter'
|
|
17
18
|
require_relative 'helpers/ux_helper'
|
|
18
19
|
require_relative '../config/cluster_config'
|
|
@@ -21,7 +22,7 @@ require_relative 'errors/thor_errors'
|
|
|
21
22
|
|
|
22
23
|
module LanguageOperator
|
|
23
24
|
module CLI
|
|
24
|
-
# Main CLI class for
|
|
25
|
+
# Main CLI class for langop command
|
|
25
26
|
#
|
|
26
27
|
# Provides commands for creating, running, and managing language-operator resources.
|
|
27
28
|
class Main < Thor
|
|
@@ -36,7 +37,7 @@ module LanguageOperator
|
|
|
36
37
|
Commands::Status.new.invoke(:overview)
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
desc 'version', 'Show
|
|
40
|
+
desc 'version', 'Show langop and operator version'
|
|
40
41
|
def version
|
|
41
42
|
# Check operator installation status first
|
|
42
43
|
current_cluster = Config::ClusterConfig.current_cluster
|
|
@@ -71,6 +72,9 @@ module LanguageOperator
|
|
|
71
72
|
desc 'cluster SUBCOMMAND ...ARGS', 'Manage clusters'
|
|
72
73
|
subcommand 'cluster', Commands::Cluster
|
|
73
74
|
|
|
75
|
+
desc 'organization SUBCOMMAND ...ARGS', 'Manage organizations'
|
|
76
|
+
subcommand 'organization', Commands::Organization
|
|
77
|
+
|
|
74
78
|
desc 'use CLUSTER', 'Switch to a different cluster'
|
|
75
79
|
def use(cluster_name)
|
|
76
80
|
Commands::Use.new.switch(cluster_name)
|
|
@@ -91,9 +95,14 @@ module LanguageOperator
|
|
|
91
95
|
desc 'system SUBCOMMAND ...ARGS', 'System utilities'
|
|
92
96
|
subcommand 'system', Commands::System::Base
|
|
93
97
|
|
|
94
|
-
desc '
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
desc 'ui', 'Open the Language Operator dashboard in your browser'
|
|
99
|
+
option :port, type: :numeric, default: Commands::Ui::DEFAULT_PORT, desc: "Local port to forward to (default: #{Commands::Ui::DEFAULT_PORT})"
|
|
100
|
+
option :service, type: :string, default: Commands::Ui::DEFAULT_SERVICE_NAME, desc: "Service name to connect to (default: #{Commands::Ui::DEFAULT_SERVICE_NAME})"
|
|
101
|
+
option :service_port, type: :numeric, default: Commands::Ui::DEFAULT_SERVICE_PORT, desc: "Service port to forward from (default: #{Commands::Ui::DEFAULT_SERVICE_PORT})"
|
|
102
|
+
option :namespace, type: :string, default: 'language-operator', desc: 'Namespace to connect to (default: language-operator)'
|
|
103
|
+
option :no_open, type: :boolean, default: false, desc: 'Do not automatically open browser'
|
|
104
|
+
def ui
|
|
105
|
+
Commands::Ui.new([], options).ui
|
|
97
106
|
end
|
|
98
107
|
|
|
99
108
|
desc 'install', 'Install the language-operator using Helm'
|
|
@@ -127,24 +136,24 @@ module LanguageOperator
|
|
|
127
136
|
Commands::Install.new([], options).uninstall
|
|
128
137
|
end
|
|
129
138
|
|
|
130
|
-
desc 'completion SHELL', 'Install shell completion for
|
|
139
|
+
desc 'completion SHELL', 'Install shell completion for langop (bash, zsh, fish)'
|
|
131
140
|
long_desc <<-DESC
|
|
132
|
-
Install shell completion for
|
|
141
|
+
Install shell completion for langop. Supports bash, zsh, and fish.
|
|
133
142
|
|
|
134
143
|
Examples:
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
144
|
+
langop completion bash
|
|
145
|
+
langop completion zsh
|
|
146
|
+
langop completion fish
|
|
138
147
|
|
|
139
148
|
Manual installation:
|
|
140
149
|
bash: Add to ~/.bashrc:
|
|
141
|
-
source <(
|
|
150
|
+
source <(langop completion bash --stdout)
|
|
142
151
|
|
|
143
152
|
zsh: Add to ~/.zshrc:
|
|
144
|
-
source <(
|
|
153
|
+
source <(langop completion zsh --stdout)
|
|
145
154
|
|
|
146
155
|
fish: Run once:
|
|
147
|
-
|
|
156
|
+
langop completion fish | source
|
|
148
157
|
DESC
|
|
149
158
|
option :stdout, type: :boolean, desc: 'Print completion script to stdout instead of installing'
|
|
150
159
|
def completion(shell)
|
|
@@ -177,28 +186,28 @@ module LanguageOperator
|
|
|
177
186
|
private
|
|
178
187
|
|
|
179
188
|
def install_bash_completion
|
|
180
|
-
completion_file = File.expand_path('../../completions/
|
|
189
|
+
completion_file = File.expand_path('../../completions/langop.bash', __dir__)
|
|
181
190
|
|
|
182
191
|
if options[:stdout]
|
|
183
192
|
puts File.read(completion_file)
|
|
184
193
|
return
|
|
185
194
|
end
|
|
186
195
|
|
|
187
|
-
target = LanguageOperator::Utils::SecurePath.expand_home_path('.bash_completion.d/
|
|
196
|
+
target = LanguageOperator::Utils::SecurePath.expand_home_path('.bash_completion.d/langop')
|
|
188
197
|
FileUtils.mkdir_p(File.dirname(target))
|
|
189
198
|
FileUtils.cp(completion_file, target)
|
|
190
199
|
|
|
191
200
|
Formatters::ProgressFormatter.success('Bash completion installed')
|
|
192
201
|
puts
|
|
193
202
|
puts 'Add to your ~/.bashrc:'
|
|
194
|
-
puts ' [ -f ~/.bash_completion.d/
|
|
203
|
+
puts ' [ -f ~/.bash_completion.d/langop ] && source ~/.bash_completion.d/langop'
|
|
195
204
|
puts
|
|
196
205
|
puts 'Then reload your shell:'
|
|
197
206
|
puts ' source ~/.bashrc'
|
|
198
207
|
end
|
|
199
208
|
|
|
200
209
|
def install_zsh_completion
|
|
201
|
-
completion_file = File.expand_path('../../completions/
|
|
210
|
+
completion_file = File.expand_path('../../completions/_langop', __dir__)
|
|
202
211
|
|
|
203
212
|
if options[:stdout]
|
|
204
213
|
puts File.read(completion_file)
|
|
@@ -209,7 +218,7 @@ module LanguageOperator
|
|
|
209
218
|
fpath_dir = LanguageOperator::Utils::SecurePath.expand_home_path('.zsh/completions')
|
|
210
219
|
FileUtils.mkdir_p(fpath_dir)
|
|
211
220
|
|
|
212
|
-
target = File.join(fpath_dir, '
|
|
221
|
+
target = File.join(fpath_dir, '_langop')
|
|
213
222
|
FileUtils.cp(completion_file, target)
|
|
214
223
|
|
|
215
224
|
Formatters::ProgressFormatter.success('Zsh completion installed')
|
|
@@ -223,14 +232,14 @@ module LanguageOperator
|
|
|
223
232
|
end
|
|
224
233
|
|
|
225
234
|
def install_fish_completion
|
|
226
|
-
completion_file = File.expand_path('../../completions/
|
|
235
|
+
completion_file = File.expand_path('../../completions/langop.fish', __dir__)
|
|
227
236
|
|
|
228
237
|
if options[:stdout]
|
|
229
238
|
puts File.read(completion_file)
|
|
230
239
|
return
|
|
231
240
|
end
|
|
232
241
|
|
|
233
|
-
target = LanguageOperator::Utils::SecurePath.expand_home_path('.config/fish/completions/
|
|
242
|
+
target = LanguageOperator::Utils::SecurePath.expand_home_path('.config/fish/completions/langop.fish')
|
|
234
243
|
FileUtils.mkdir_p(File.dirname(target))
|
|
235
244
|
FileUtils.cp(completion_file, target)
|
|
236
245
|
|
|
@@ -191,8 +191,8 @@ module LanguageOperator
|
|
|
191
191
|
ctx.client.get_resource('LanguageModel', model_name, ctx.namespace)
|
|
192
192
|
Formatters::ProgressFormatter.error("Model '#{model_name}' already exists in cluster '#{ctx.name}'")
|
|
193
193
|
puts
|
|
194
|
-
puts "Use '
|
|
195
|
-
puts "Use '
|
|
194
|
+
puts "Use 'langop model inspect #{model_name}' to view details"
|
|
195
|
+
puts "Use 'langop model edit #{model_name}' to modify it"
|
|
196
196
|
return false
|
|
197
197
|
rescue K8s::Error::NotFound
|
|
198
198
|
# Expected - model doesn't exist yet
|
|
@@ -224,7 +224,9 @@ module LanguageOperator
|
|
|
224
224
|
provider: provider_info[:provider_key],
|
|
225
225
|
model: model_id,
|
|
226
226
|
endpoint: provider_info[:endpoint],
|
|
227
|
-
cluster: ctx.namespace
|
|
227
|
+
cluster: ctx.namespace,
|
|
228
|
+
cluster_ref: ctx.name,
|
|
229
|
+
k8s_client: ctx.client
|
|
228
230
|
)
|
|
229
231
|
|
|
230
232
|
# Add API key reference if secret was created
|
|
@@ -260,9 +262,9 @@ module LanguageOperator
|
|
|
260
262
|
puts 'Next steps:'
|
|
261
263
|
puts
|
|
262
264
|
puts '1. Use this model in an agent:'
|
|
263
|
-
puts " #{pastel.dim("
|
|
265
|
+
puts " #{pastel.dim("langop agent create --model #{model_name}")}"
|
|
264
266
|
puts '2. View model details:'
|
|
265
|
-
puts " #{pastel.dim("
|
|
267
|
+
puts " #{pastel.dim("langop model inspect #{model_name}")}"
|
|
266
268
|
puts
|
|
267
269
|
end
|
|
268
270
|
end
|
|
@@ -6,9 +6,9 @@ require_relative '../utils/secure_path'
|
|
|
6
6
|
|
|
7
7
|
module LanguageOperator
|
|
8
8
|
module Config
|
|
9
|
-
# Manages cluster configuration in ~/.
|
|
9
|
+
# Manages cluster configuration in ~/.langop/config.yaml
|
|
10
10
|
class ClusterConfig
|
|
11
|
-
CONFIG_DIR = LanguageOperator::Utils::SecurePath.expand_home_path('.
|
|
11
|
+
CONFIG_DIR = LanguageOperator::Utils::SecurePath.expand_home_path('.langop')
|
|
12
12
|
CONFIG_PATH = File.join(CONFIG_DIR, 'config.yaml')
|
|
13
13
|
|
|
14
14
|
class << self
|
|
@@ -90,7 +90,7 @@ module LanguageOperator
|
|
|
90
90
|
|
|
91
91
|
def default_config
|
|
92
92
|
{
|
|
93
|
-
'apiVersion' => '
|
|
93
|
+
'apiVersion' => 'langop.langop.io/v1',
|
|
94
94
|
'kind' => 'Config',
|
|
95
95
|
'current-cluster' => nil,
|
|
96
96
|
'clusters' => []
|