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,173 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../base_command'
|
|
4
|
+
require_relative '../formatters/progress_formatter'
|
|
5
|
+
require_relative '../../kubernetes/client'
|
|
6
|
+
require_relative '../helpers/cluster_validator'
|
|
7
|
+
|
|
8
|
+
module LanguageOperator
|
|
9
|
+
module CLI
|
|
10
|
+
module Commands
|
|
11
|
+
# UI command to open the Language Operator dashboard in browser
|
|
12
|
+
class Ui < BaseCommand
|
|
13
|
+
DEFAULT_PORT = 8080
|
|
14
|
+
DEFAULT_SERVICE_NAME = 'language-operator-dashboard'
|
|
15
|
+
DEFAULT_SERVICE_PORT = 3000
|
|
16
|
+
|
|
17
|
+
desc 'ui', 'Open the Language Operator dashboard in your browser'
|
|
18
|
+
long_desc <<-DESC
|
|
19
|
+
Opens the Language Operator dashboard in your default browser.
|
|
20
|
+
|
|
21
|
+
This command will:
|
|
22
|
+
1. Set up a port forward to the dashboard service
|
|
23
|
+
2. Open your default browser to the dashboard URL
|
|
24
|
+
3. Keep the port forward running until you stop it (Ctrl+C)
|
|
25
|
+
|
|
26
|
+
The dashboard provides a web interface for managing agents, tools, models, and monitoring
|
|
27
|
+
the Language Operator cluster.
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
# Open dashboard with default settings
|
|
31
|
+
langop ui
|
|
32
|
+
|
|
33
|
+
# Use a specific local port
|
|
34
|
+
langop ui --port 9090
|
|
35
|
+
|
|
36
|
+
# Connect to a specific service
|
|
37
|
+
langop ui --service my-dashboard --service-port 8080
|
|
38
|
+
DESC
|
|
39
|
+
option :port, type: :numeric, default: DEFAULT_PORT, desc: "Local port to forward to (default: #{DEFAULT_PORT})"
|
|
40
|
+
option :service, type: :string, default: DEFAULT_SERVICE_NAME, desc: "Service name to connect to (default: #{DEFAULT_SERVICE_NAME})"
|
|
41
|
+
option :service_port, type: :numeric, default: DEFAULT_SERVICE_PORT, desc: "Service port to forward from (default: #{DEFAULT_SERVICE_PORT})"
|
|
42
|
+
option :namespace, type: :string, default: 'language-operator', desc: 'Namespace to connect to (default: language-operator)'
|
|
43
|
+
option :no_open, type: :boolean, default: false, desc: 'Do not automatically open browser'
|
|
44
|
+
def ui
|
|
45
|
+
handle_command_error('open dashboard') do
|
|
46
|
+
|
|
47
|
+
logo(title: 'open dashboard')
|
|
48
|
+
|
|
49
|
+
# Check if operator is installed and get service info
|
|
50
|
+
validate_operator_installation
|
|
51
|
+
|
|
52
|
+
port = options[:port]
|
|
53
|
+
service_name = options[:service]
|
|
54
|
+
service_port = options[:service_port]
|
|
55
|
+
|
|
56
|
+
# Start port forward in background
|
|
57
|
+
port_forward_pid = start_port_forward(service_name, service_port, port)
|
|
58
|
+
|
|
59
|
+
# Wait a moment for port forward to establish
|
|
60
|
+
sleep 2
|
|
61
|
+
|
|
62
|
+
# Open browser unless --no-open
|
|
63
|
+
open_browser("http://localhost:#{port}") unless options[:no_open]
|
|
64
|
+
|
|
65
|
+
puts
|
|
66
|
+
puts 'If your browser was not opened automatically, your dashboard is at:'
|
|
67
|
+
puts pastel.white.bold("http://localhost:#{port}")
|
|
68
|
+
puts
|
|
69
|
+
puts 'Press Ctrl+C to stop the port forward and exit'
|
|
70
|
+
|
|
71
|
+
# Handle graceful shutdown
|
|
72
|
+
trap('INT') do
|
|
73
|
+
puts "\nStopping port forward..."
|
|
74
|
+
stop_port_forward(port_forward_pid)
|
|
75
|
+
puts 'Dashboard closed.'
|
|
76
|
+
exit 0
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Keep the process running
|
|
80
|
+
loop do
|
|
81
|
+
sleep 1
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def validate_operator_installation
|
|
89
|
+
namespace = options[:namespace]
|
|
90
|
+
|
|
91
|
+
# Use current kubectl context directly
|
|
92
|
+
k8s = Kubernetes::Client.new
|
|
93
|
+
|
|
94
|
+
# Check if the operator namespace exists
|
|
95
|
+
unless k8s.namespace_exists?(namespace)
|
|
96
|
+
Formatters::ProgressFormatter.error("Namespace '#{namespace}' not found")
|
|
97
|
+
puts
|
|
98
|
+
puts 'The Language Operator does not appear to be installed.'
|
|
99
|
+
puts 'Install it with: langop install'
|
|
100
|
+
exit 1
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Check if the dashboard service exists
|
|
104
|
+
begin
|
|
105
|
+
k8s.get_resource('Service', options[:service], namespace)
|
|
106
|
+
rescue StandardError
|
|
107
|
+
Formatters::ProgressFormatter.error("Dashboard service '#{options[:service]}' not found")
|
|
108
|
+
puts
|
|
109
|
+
puts 'The dashboard service is not available. This may mean:'
|
|
110
|
+
puts ' - The Language Operator is not fully deployed'
|
|
111
|
+
puts ' - The dashboard is disabled in your installation'
|
|
112
|
+
puts ' - You specified an incorrect service name'
|
|
113
|
+
puts
|
|
114
|
+
puts 'Check your installation with: langop status'
|
|
115
|
+
exit 1
|
|
116
|
+
end
|
|
117
|
+
rescue StandardError => e
|
|
118
|
+
Formatters::ProgressFormatter.error("Failed to validate installation: #{e.message}")
|
|
119
|
+
exit 1
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def start_port_forward(service_name, service_port, local_port)
|
|
123
|
+
namespace = options[:namespace]
|
|
124
|
+
cmd = "kubectl port-forward -n #{namespace} service/#{service_name} #{local_port}:#{service_port}"
|
|
125
|
+
|
|
126
|
+
Formatters::ProgressFormatter.with_spinner('Setting up port forward') do
|
|
127
|
+
# Start kubectl port-forward in background
|
|
128
|
+
pid = Process.spawn(cmd, out: '/dev/null', err: '/dev/null')
|
|
129
|
+
Process.detach(pid)
|
|
130
|
+
pid
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def stop_port_forward(pid)
|
|
135
|
+
Process.kill('TERM', pid)
|
|
136
|
+
# Give it a moment to clean up
|
|
137
|
+
sleep 1
|
|
138
|
+
# Force kill if still running
|
|
139
|
+
Process.kill('KILL', pid) if process_running?(pid)
|
|
140
|
+
rescue Errno::ESRCH
|
|
141
|
+
# Process already dead, that's fine
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def process_running?(pid)
|
|
145
|
+
Process.getpgid(pid)
|
|
146
|
+
true
|
|
147
|
+
rescue Errno::ESRCH
|
|
148
|
+
false
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def open_browser(url)
|
|
152
|
+
# Detect platform and open browser accordingly
|
|
153
|
+
case RbConfig::CONFIG['host_os']
|
|
154
|
+
when /mswin|mingw|cygwin/
|
|
155
|
+
system("start #{url}")
|
|
156
|
+
when /darwin/
|
|
157
|
+
system("open #{url}")
|
|
158
|
+
when /linux|bsd/
|
|
159
|
+
# Try common Linux browsers
|
|
160
|
+
browsers = %w[xdg-open google-chrome firefox chromium-browser]
|
|
161
|
+
browser_found = browsers.any? do |browser|
|
|
162
|
+
system("which #{browser} > /dev/null 2>&1") && system("#{browser} #{url} > /dev/null 2>&1 &")
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
puts "Could not detect a browser to open. Please manually visit: #{url}" unless browser_found
|
|
166
|
+
else
|
|
167
|
+
puts "Unknown platform. Please manually visit: #{url}"
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
@@ -4,6 +4,7 @@ require_relative '../base_command'
|
|
|
4
4
|
require_relative '../formatters/progress_formatter'
|
|
5
5
|
require_relative '../../config/cluster_config'
|
|
6
6
|
require_relative '../helpers/cluster_validator'
|
|
7
|
+
require_relative '../../utils/secure_path'
|
|
7
8
|
|
|
8
9
|
module LanguageOperator
|
|
9
10
|
module CLI
|
|
@@ -19,18 +20,25 @@ module LanguageOperator
|
|
|
19
20
|
|
|
20
21
|
def switch(cluster_name)
|
|
21
22
|
handle_command_error('switch cluster') do
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Config::ClusterConfig.
|
|
26
|
-
|
|
23
|
+
# First check if cluster exists in local config
|
|
24
|
+
if Config::ClusterConfig.cluster_exists?(cluster_name)
|
|
25
|
+
Config::ClusterConfig.set_current_cluster(cluster_name)
|
|
26
|
+
cluster = Config::ClusterConfig.get_cluster(cluster_name)
|
|
27
|
+
else
|
|
28
|
+
# If not in local config, check if it exists in Kubernetes
|
|
29
|
+
k8s_cluster = find_cluster_in_kubernetes(cluster_name)
|
|
30
|
+
|
|
31
|
+
if k8s_cluster
|
|
32
|
+
# Auto-import the cluster to local config with current kubectl context
|
|
33
|
+
import_cluster_to_config(k8s_cluster)
|
|
34
|
+
Config::ClusterConfig.set_current_cluster(cluster_name)
|
|
35
|
+
cluster = Config::ClusterConfig.get_cluster(cluster_name)
|
|
36
|
+
else
|
|
37
|
+
show_cluster_not_found_error(cluster_name)
|
|
38
|
+
exit 1
|
|
27
39
|
end
|
|
28
|
-
exit 1
|
|
29
40
|
end
|
|
30
41
|
|
|
31
|
-
Config::ClusterConfig.set_current_cluster(cluster_name)
|
|
32
|
-
cluster = Config::ClusterConfig.get_cluster(cluster_name)
|
|
33
|
-
|
|
34
42
|
Formatters::ProgressFormatter.success("Switched to cluster '#{cluster_name}'")
|
|
35
43
|
|
|
36
44
|
# Get cluster details from Kubernetes for complete information
|
|
@@ -61,6 +69,69 @@ module LanguageOperator
|
|
|
61
69
|
end
|
|
62
70
|
end
|
|
63
71
|
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def find_cluster_in_kubernetes(cluster_name)
|
|
76
|
+
require_relative '../../kubernetes/client'
|
|
77
|
+
|
|
78
|
+
k8s = Kubernetes::Client.new
|
|
79
|
+
language_clusters = k8s.list_resources('LanguageCluster', namespace: nil)
|
|
80
|
+
|
|
81
|
+
language_clusters.find { |cluster| cluster.dig('metadata', 'name') == cluster_name }
|
|
82
|
+
rescue StandardError => e
|
|
83
|
+
# If we can't query Kubernetes, return nil
|
|
84
|
+
warn "Warning: Could not query Kubernetes: #{e.message}" if ENV['DEBUG']
|
|
85
|
+
nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def import_cluster_to_config(k8s_cluster)
|
|
89
|
+
name = k8s_cluster.dig('metadata', 'name')
|
|
90
|
+
namespace = k8s_cluster.dig('metadata', 'namespace')
|
|
91
|
+
|
|
92
|
+
# Use current kubectl context and config
|
|
93
|
+
kubeconfig = ENV.fetch('KUBECONFIG', LanguageOperator::Utils::SecurePath.expand_home_path('.kube/config'))
|
|
94
|
+
|
|
95
|
+
require_relative '../../kubernetes/client'
|
|
96
|
+
k8s_client = Kubernetes::Client.new
|
|
97
|
+
current_context = k8s_client.current_context
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
Config::ClusterConfig.add_cluster(
|
|
101
|
+
name,
|
|
102
|
+
namespace,
|
|
103
|
+
kubeconfig,
|
|
104
|
+
current_context
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def show_cluster_not_found_error(cluster_name)
|
|
109
|
+
Formatters::ProgressFormatter.error("Cluster '#{cluster_name}' not found")
|
|
110
|
+
|
|
111
|
+
# Show clusters from both local config and Kubernetes
|
|
112
|
+
local_clusters = Config::ClusterConfig.list_clusters
|
|
113
|
+
|
|
114
|
+
require_relative '../../kubernetes/client'
|
|
115
|
+
begin
|
|
116
|
+
k8s = Kubernetes::Client.new
|
|
117
|
+
k8s_clusters = k8s.list_resources('LanguageCluster', namespace: nil)
|
|
118
|
+
k8s_cluster_names = k8s_clusters.map { |c| c.dig('metadata', 'name') }
|
|
119
|
+
rescue StandardError
|
|
120
|
+
k8s_cluster_names = []
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
all_cluster_names = (local_clusters.map { |c| c[:name] } + k8s_cluster_names).uniq
|
|
124
|
+
|
|
125
|
+
if all_cluster_names.any?
|
|
126
|
+
puts "\nAvailable clusters:"
|
|
127
|
+
all_cluster_names.each do |name|
|
|
128
|
+
puts " - #{name}"
|
|
129
|
+
end
|
|
130
|
+
else
|
|
131
|
+
puts "\nNo clusters found. Create one with:"
|
|
132
|
+
puts " langop cluster create <name>"
|
|
133
|
+
end
|
|
134
|
+
end
|
|
64
135
|
end
|
|
65
136
|
end
|
|
66
137
|
end
|
|
@@ -50,9 +50,9 @@ module LanguageOperator
|
|
|
50
50
|
|
|
51
51
|
def agent_not_found_suggestions(context)
|
|
52
52
|
suggestions = []
|
|
53
|
-
suggestions << "List all agents: #{pastel.dim('
|
|
54
|
-
suggestions << "Create a new agent: #{pastel.dim('
|
|
55
|
-
suggestions << "Use the wizard: #{pastel.dim('
|
|
53
|
+
suggestions << "List all agents: #{pastel.dim('langop agent list')}"
|
|
54
|
+
suggestions << "Create a new agent: #{pastel.dim('langop agent create "description"')}"
|
|
55
|
+
suggestions << "Use the wizard: #{pastel.dim('langop agent create --wizard')}" if context[:suggest_wizard]
|
|
56
56
|
suggestions
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -61,45 +61,45 @@ module LanguageOperator
|
|
|
61
61
|
tool_name = context[:tool_name]
|
|
62
62
|
|
|
63
63
|
if tool_name
|
|
64
|
-
suggestions << "Install from registry: #{pastel.dim("
|
|
65
|
-
suggestions << "Search for tools: #{pastel.dim('
|
|
64
|
+
suggestions << "Install from registry: #{pastel.dim("langop tool install #{tool_name}")}"
|
|
65
|
+
suggestions << "Search for tools: #{pastel.dim('langop tool search')}"
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
suggestions << "List installed tools: #{pastel.dim('
|
|
68
|
+
suggestions << "List installed tools: #{pastel.dim('langop tool list')}"
|
|
69
69
|
suggestions
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def model_not_found_suggestions(_context)
|
|
73
73
|
suggestions = []
|
|
74
|
-
suggestions << "List all models: #{pastel.dim('
|
|
75
|
-
suggestions << "Create a new model: #{pastel.dim('
|
|
74
|
+
suggestions << "List all models: #{pastel.dim('langop model list')}"
|
|
75
|
+
suggestions << "Create a new model: #{pastel.dim('langop model create <name> --provider <provider>')}"
|
|
76
76
|
suggestions
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def persona_not_found_suggestions(_context)
|
|
80
80
|
suggestions = []
|
|
81
|
-
suggestions << "List all personas: #{pastel.dim('
|
|
82
|
-
suggestions << "Create a new persona: #{pastel.dim('
|
|
81
|
+
suggestions << "List all personas: #{pastel.dim('langop persona list')}"
|
|
82
|
+
suggestions << "Create a new persona: #{pastel.dim('langop persona create <name>')}"
|
|
83
83
|
suggestions
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def cluster_not_found_suggestions(_context)
|
|
87
87
|
suggestions = []
|
|
88
|
-
suggestions << "List available clusters: #{pastel.dim('
|
|
89
|
-
suggestions << "Create a new cluster: #{pastel.dim('
|
|
88
|
+
suggestions << "List available clusters: #{pastel.dim('langop cluster list')}"
|
|
89
|
+
suggestions << "Create a new cluster: #{pastel.dim('langop cluster create <name>')}"
|
|
90
90
|
suggestions
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def no_cluster_selected_suggestions
|
|
94
94
|
[
|
|
95
95
|
'Create a new cluster:',
|
|
96
|
-
" #{pastel.dim('
|
|
96
|
+
" #{pastel.dim('langop cluster create my-cluster')}",
|
|
97
97
|
'',
|
|
98
98
|
'Or select an existing cluster:',
|
|
99
|
-
" #{pastel.dim('
|
|
99
|
+
" #{pastel.dim('langop use my-cluster')}",
|
|
100
100
|
'',
|
|
101
101
|
'List available clusters:',
|
|
102
|
-
" #{pastel.dim('
|
|
102
|
+
" #{pastel.dim('langop cluster list')}"
|
|
103
103
|
]
|
|
104
104
|
end
|
|
105
105
|
|
|
@@ -109,20 +109,20 @@ module LanguageOperator
|
|
|
109
109
|
|
|
110
110
|
if cluster
|
|
111
111
|
suggestions << "Create a model in cluster '#{cluster}':"
|
|
112
|
-
suggestions << " #{pastel.dim('
|
|
112
|
+
suggestions << " #{pastel.dim('langop model create <name> --provider anthropic --model claude-3-5-sonnet')}"
|
|
113
113
|
else
|
|
114
|
-
suggestions << "Create a model: #{pastel.dim('
|
|
114
|
+
suggestions << "Create a model: #{pastel.dim('langop model create <name> --provider <provider>')}"
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
suggestions << ''
|
|
118
|
-
suggestions << "List available models: #{pastel.dim('
|
|
118
|
+
suggestions << "List available models: #{pastel.dim('langop model list')}"
|
|
119
119
|
suggestions
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
def synthesis_failed_suggestions
|
|
123
123
|
[
|
|
124
124
|
'The description may be too vague. Try the interactive wizard:',
|
|
125
|
-
" #{pastel.dim('
|
|
125
|
+
" #{pastel.dim('langop agent create --wizard')}",
|
|
126
126
|
'',
|
|
127
127
|
'Or provide a more detailed description with:',
|
|
128
128
|
' • What the agent should do specifically',
|
|
@@ -143,8 +143,8 @@ module LanguageOperator
|
|
|
143
143
|
suggestions = []
|
|
144
144
|
|
|
145
145
|
if resource_name
|
|
146
|
-
suggestions << "View existing #{resource_type}: #{pastel.dim("
|
|
147
|
-
suggestions << "Delete and recreate: #{pastel.dim("
|
|
146
|
+
suggestions << "View existing #{resource_type}: #{pastel.dim("langop #{command_for_resource(resource_type)} inspect #{resource_name}")}"
|
|
147
|
+
suggestions << "Delete and recreate: #{pastel.dim("langop #{command_for_resource(resource_type)} delete #{resource_name}")}"
|
|
148
148
|
end
|
|
149
149
|
|
|
150
150
|
suggestions << 'Choose a different name'
|
|
@@ -14,7 +14,7 @@ module LanguageOperator
|
|
|
14
14
|
def clusters(clusters)
|
|
15
15
|
return ProgressFormatter.info('No clusters found') if clusters.empty?
|
|
16
16
|
|
|
17
|
-
headers = ['', 'NAME', 'NAMESPACE', 'STATUS', 'DOMAIN']
|
|
17
|
+
headers = ['', 'NAME', 'NAMESPACE', 'ORGANIZATION', 'STATUS', 'DOMAIN']
|
|
18
18
|
rows = clusters.map do |cluster|
|
|
19
19
|
# Extract asterisk for selected cluster
|
|
20
20
|
name = cluster[:name].to_s.gsub(' *', '')
|
|
@@ -33,10 +33,14 @@ module LanguageOperator
|
|
|
33
33
|
cluster[:domain]
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
+
# Format organization display
|
|
37
|
+
org_display = cluster[:organization] || 'legacy'
|
|
38
|
+
|
|
36
39
|
[
|
|
37
40
|
StatusFormatter.dot(cluster[:status] || 'Unknown'),
|
|
38
41
|
formatted_name,
|
|
39
42
|
cluster[:namespace],
|
|
43
|
+
org_display,
|
|
40
44
|
cluster[:status] || 'Unknown',
|
|
41
45
|
domain_display
|
|
42
46
|
]
|
|
@@ -160,6 +164,22 @@ module LanguageOperator
|
|
|
160
164
|
puts '* = current cluster'
|
|
161
165
|
end
|
|
162
166
|
|
|
167
|
+
def organizations(organizations)
|
|
168
|
+
return ProgressFormatter.info('No organizations found') if organizations.empty?
|
|
169
|
+
|
|
170
|
+
headers = ['NAMESPACE', 'ORGANIZATION ID', 'PLAN', 'CREATED']
|
|
171
|
+
rows = organizations.map do |org|
|
|
172
|
+
[
|
|
173
|
+
org[:namespace],
|
|
174
|
+
org[:organization_id],
|
|
175
|
+
org[:plan],
|
|
176
|
+
org[:created]
|
|
177
|
+
]
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
puts table(headers, rows)
|
|
181
|
+
end
|
|
182
|
+
|
|
163
183
|
private
|
|
164
184
|
|
|
165
185
|
def truncate(text, length)
|
|
@@ -77,9 +77,9 @@ module LanguageOperator
|
|
|
77
77
|
puts 'The kubeconfig file for this cluster does not exist.'
|
|
78
78
|
puts
|
|
79
79
|
puts 'To fix this issue:'
|
|
80
|
-
puts ' 1. Verify the kubeconfig path in ~/.
|
|
80
|
+
puts ' 1. Verify the kubeconfig path in ~/.langop/config.yaml'
|
|
81
81
|
puts ' 2. Re-create the cluster configuration:'
|
|
82
|
-
puts "
|
|
82
|
+
puts " langop cluster create #{cluster_config[:name]}"
|
|
83
83
|
exit 1
|
|
84
84
|
end
|
|
85
85
|
|