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
|
@@ -47,10 +47,10 @@ module LanguageOperator
|
|
|
47
47
|
The operator will synthesize the agent from your description and deploy it to your cluster.
|
|
48
48
|
|
|
49
49
|
Examples:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
langop agent create "review my spreadsheet at 4pm daily and email me any errors"
|
|
51
|
+
langop agent create "summarize Hacker News top stories every morning at 8am"
|
|
52
|
+
langop agent create "monitor my website uptime and alert me if it goes down"
|
|
53
|
+
langop agent create --wizard # Interactive wizard mode
|
|
54
54
|
DESC
|
|
55
55
|
option :cluster, type: :string, desc: 'Override current cluster context'
|
|
56
56
|
option :create_cluster, type: :string, desc: 'Create cluster if it doesn\'t exist'
|
|
@@ -116,7 +116,8 @@ module LanguageOperator
|
|
|
116
116
|
persona: options[:persona],
|
|
117
117
|
tools: options[:tools] || [],
|
|
118
118
|
models: models,
|
|
119
|
-
workspace: options[:workspace]
|
|
119
|
+
workspace: options[:workspace],
|
|
120
|
+
k8s_client: ctx.client
|
|
120
121
|
)
|
|
121
122
|
|
|
122
123
|
# Dry-run mode: preview without applying
|
|
@@ -392,9 +393,9 @@ module LanguageOperator
|
|
|
392
393
|
|
|
393
394
|
puts
|
|
394
395
|
puts 'Next steps:'
|
|
395
|
-
puts pastel.dim("
|
|
396
|
-
puts pastel.dim("
|
|
397
|
-
puts pastel.dim("
|
|
396
|
+
puts pastel.dim("langop agent logs #{agent_name} -f")
|
|
397
|
+
puts pastel.dim("langop agent code #{agent_name}")
|
|
398
|
+
puts pastel.dim("langop agent inspect #{agent_name}")
|
|
398
399
|
puts
|
|
399
400
|
end
|
|
400
401
|
|
|
@@ -497,7 +498,7 @@ module LanguageOperator
|
|
|
497
498
|
Formatters::ProgressFormatter.info('No changes made (dry-run mode)')
|
|
498
499
|
puts
|
|
499
500
|
puts 'To create this agent for real, run:'
|
|
500
|
-
cmd_parts = ["
|
|
501
|
+
cmd_parts = ["langop agent create \"#{description}\""]
|
|
501
502
|
cmd_parts << "--name #{name}" if options[:name]
|
|
502
503
|
cmd_parts << "--persona #{persona}" if persona
|
|
503
504
|
cmd_parts << "--tools #{tools.join(' ')}" if tools.any?
|
|
@@ -535,7 +536,7 @@ module LanguageOperator
|
|
|
535
536
|
Formatters::ProgressFormatter.info('No agents found')
|
|
536
537
|
puts
|
|
537
538
|
puts 'Create an agent with:'
|
|
538
|
-
puts '
|
|
539
|
+
puts ' langop agent create "<description>"'
|
|
539
540
|
return
|
|
540
541
|
end
|
|
541
542
|
|
|
@@ -564,7 +565,7 @@ module LanguageOperator
|
|
|
564
565
|
Formatters::ProgressFormatter.info('No clusters found')
|
|
565
566
|
puts
|
|
566
567
|
puts 'Create a cluster first:'
|
|
567
|
-
puts '
|
|
568
|
+
puts ' langop cluster create <name>'
|
|
568
569
|
return
|
|
569
570
|
end
|
|
570
571
|
|
|
@@ -623,7 +624,7 @@ module LanguageOperator
|
|
|
623
624
|
Formatters::ProgressFormatter.warn('Synthesis taking longer than expected, continuing in background...')
|
|
624
625
|
puts
|
|
625
626
|
puts 'Check synthesis status with:'
|
|
626
|
-
puts "
|
|
627
|
+
puts " langop agent inspect #{agent_name}"
|
|
627
628
|
synthesis_result = { success: true, timeout: true }
|
|
628
629
|
break
|
|
629
630
|
end
|
|
@@ -751,8 +752,8 @@ module LanguageOperator
|
|
|
751
752
|
end
|
|
752
753
|
|
|
753
754
|
puts pastel.white.bold('Available Commands:')
|
|
754
|
-
puts pastel.dim("
|
|
755
|
-
puts pastel.dim("
|
|
755
|
+
puts pastel.dim(" langop agent learning status #{agent_name}")
|
|
756
|
+
puts pastel.dim(" langop agent inspect #{agent_name}")
|
|
756
757
|
end
|
|
757
758
|
|
|
758
759
|
def get_execution_data(agent_name, ctx)
|
|
@@ -916,7 +917,7 @@ module LanguageOperator
|
|
|
916
917
|
Formatters::ProgressFormatter.warn("Could not verify deletion of agent '#{name}' within 30 seconds")
|
|
917
918
|
puts
|
|
918
919
|
puts "Check deletion status with:"
|
|
919
|
-
puts "
|
|
920
|
+
puts " langop agent list"
|
|
920
921
|
puts " kubectl get languageagent #{name}"
|
|
921
922
|
puts
|
|
922
923
|
puts "If the agent shows 'Unknown' status, it may be pending deletion."
|
|
@@ -29,7 +29,7 @@ module LanguageOperator
|
|
|
29
29
|
puts ' - Agent synthesis failed'
|
|
30
30
|
puts
|
|
31
31
|
puts 'Check agent status with:'
|
|
32
|
-
puts "
|
|
32
|
+
puts " langop agent inspect #{name}"
|
|
33
33
|
exit 1
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -90,7 +90,7 @@ module LanguageOperator
|
|
|
90
90
|
puts pastel.yellow('No versions have been created yet.')
|
|
91
91
|
puts
|
|
92
92
|
puts 'Versions are created automatically during agent synthesis.'
|
|
93
|
-
puts "Check agent status: #{pastel.dim("
|
|
93
|
+
puts "Check agent status: #{pastel.dim("langop agent inspect #{name}")}"
|
|
94
94
|
return
|
|
95
95
|
end
|
|
96
96
|
|
|
@@ -133,8 +133,8 @@ module LanguageOperator
|
|
|
133
133
|
puts table(headers, rows)
|
|
134
134
|
puts
|
|
135
135
|
puts 'Usage:'
|
|
136
|
-
puts " #{pastel.dim("
|
|
137
|
-
puts " #{pastel.dim("
|
|
136
|
+
puts " #{pastel.dim("langop agent code #{name}")}"
|
|
137
|
+
puts " #{pastel.dim("langop agent code #{name} --version=X")}"
|
|
138
138
|
end
|
|
139
139
|
end
|
|
140
140
|
|
|
@@ -175,7 +175,7 @@ module LanguageOperator
|
|
|
175
175
|
puts " v#{version_num}"
|
|
176
176
|
end
|
|
177
177
|
puts
|
|
178
|
-
puts "Use '
|
|
178
|
+
puts "Use 'langop agent versions #{agent_name}' to see all available versions"
|
|
179
179
|
exit 1
|
|
180
180
|
end
|
|
181
181
|
|
|
@@ -231,7 +231,7 @@ module LanguageOperator
|
|
|
231
231
|
puts 'The operator will automatically re-synthesize the agent code.'
|
|
232
232
|
puts
|
|
233
233
|
puts 'Watch synthesis progress with:'
|
|
234
|
-
puts "
|
|
234
|
+
puts " langop agent inspect #{name}"
|
|
235
235
|
end
|
|
236
236
|
end
|
|
237
237
|
end
|
|
@@ -34,7 +34,7 @@ module LanguageOperator
|
|
|
34
34
|
Formatters::ProgressFormatter.warn('Synthesis taking longer than expected, continuing in background...')
|
|
35
35
|
puts
|
|
36
36
|
puts 'Check synthesis status with:'
|
|
37
|
-
puts "
|
|
37
|
+
puts " langop agent inspect #{agent_name}"
|
|
38
38
|
synthesis_result = { success: true, timeout: true }
|
|
39
39
|
break
|
|
40
40
|
end
|
|
@@ -49,7 +49,7 @@ module LanguageOperator
|
|
|
49
49
|
puts 'The agent will not execute on its schedule until resumed.'
|
|
50
50
|
puts
|
|
51
51
|
puts 'Resume with:'
|
|
52
|
-
puts "
|
|
52
|
+
puts " langop agent resume #{name}"
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -90,7 +90,7 @@ module LanguageOperator
|
|
|
90
90
|
puts 'The agent will now execute according to its schedule.'
|
|
91
91
|
puts
|
|
92
92
|
puts 'View next execution time with:'
|
|
93
|
-
puts "
|
|
93
|
+
puts " langop agent inspect #{name}"
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
96
|
end
|
|
@@ -18,8 +18,8 @@ module LanguageOperator
|
|
|
18
18
|
Use -f to follow logs continuously (like tail -f).
|
|
19
19
|
|
|
20
20
|
Examples:
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
langop agent logs my-agent
|
|
22
|
+
langop agent logs my-agent -f
|
|
23
23
|
DESC
|
|
24
24
|
option :cluster, type: :string, desc: 'Override current cluster context'
|
|
25
25
|
option :follow, type: :boolean, aliases: '-f', default: false, desc: 'Follow logs'
|
|
@@ -21,9 +21,9 @@ module LanguageOperator
|
|
|
21
21
|
cache data, and remember information across executions.
|
|
22
22
|
|
|
23
23
|
Examples:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
langop agent workspace my-agent # List all files
|
|
25
|
+
langop agent workspace my-agent --path /workspace/state.json # View specific file
|
|
26
|
+
langop agent workspace my-agent --clean # Clear workspace
|
|
27
27
|
DESC
|
|
28
28
|
option :cluster, type: :string, desc: 'Override current cluster context'
|
|
29
29
|
option :path, type: :string, desc: 'View specific file contents'
|
|
@@ -94,7 +94,7 @@ module LanguageOperator
|
|
|
94
94
|
puts " Namespace: #{debug_info[:namespace]}"
|
|
95
95
|
puts
|
|
96
96
|
puts 'Check agent status with:'
|
|
97
|
-
puts "
|
|
97
|
+
puts " langop agent inspect #{agent_name}"
|
|
98
98
|
puts
|
|
99
99
|
puts 'List all pods in namespace:'
|
|
100
100
|
puts " kubectl get pods -n #{ctx.namespace} -l #{Constants::KubernetesLabels::COMPONENT}=#{Constants::KubernetesLabels::COMPONENT_AGENT}"
|
|
@@ -112,7 +112,7 @@ module LanguageOperator
|
|
|
112
112
|
puts "Current pod status: #{pods.first.dig('status', 'phase')}"
|
|
113
113
|
puts
|
|
114
114
|
puts 'Check pod logs with:'
|
|
115
|
-
puts "
|
|
115
|
+
puts " langop agent logs #{agent_name}"
|
|
116
116
|
exit 1
|
|
117
117
|
end
|
|
118
118
|
|
|
@@ -220,8 +220,8 @@ module LanguageOperator
|
|
|
220
220
|
|
|
221
221
|
puts
|
|
222
222
|
puts pastel.dim('Commands:')
|
|
223
|
-
puts pastel.dim("
|
|
224
|
-
puts pastel.dim("
|
|
223
|
+
puts pastel.dim(" langop agent workspace #{agent_name} --path /workspace/<file> # View file")
|
|
224
|
+
puts pastel.dim(" langop agent workspace #{agent_name} --clean # Clear workspace")
|
|
225
225
|
puts
|
|
226
226
|
end
|
|
227
227
|
|
|
@@ -235,7 +235,7 @@ module LanguageOperator
|
|
|
235
235
|
Formatters::ProgressFormatter.error("File not found: #{file_path}")
|
|
236
236
|
puts
|
|
237
237
|
puts 'List available files with:'
|
|
238
|
-
puts "
|
|
238
|
+
puts " langop agent workspace #{agent_name}"
|
|
239
239
|
exit 1
|
|
240
240
|
end
|
|
241
241
|
|
|
@@ -13,7 +13,7 @@ module LanguageOperator
|
|
|
13
13
|
include Helpers::UxHelper
|
|
14
14
|
|
|
15
15
|
desc 'create NAME', 'Create a new language cluster'
|
|
16
|
-
option :
|
|
16
|
+
option :organization_id, type: :string, desc: 'Organization ID for the cluster (auto-detected if only one exists)'
|
|
17
17
|
option :kubeconfig, type: :string, desc: 'Path to kubeconfig file'
|
|
18
18
|
option :context, type: :string, desc: 'Kubernetes context to use'
|
|
19
19
|
option :switch, type: :boolean, default: true, desc: 'Switch to new cluster context'
|
|
@@ -23,34 +23,63 @@ module LanguageOperator
|
|
|
23
23
|
handle_command_error('create cluster') do
|
|
24
24
|
kubeconfig = options[:kubeconfig]
|
|
25
25
|
context = options[:context]
|
|
26
|
+
org_id = options[:organization_id]
|
|
26
27
|
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
# Create Kubernetes client to find organization namespace
|
|
29
|
+
k8s = Formatters::ProgressFormatter.with_spinner('Connecting to Kubernetes cluster') do
|
|
30
|
+
Kubernetes::Client.new(kubeconfig: kubeconfig, context: context)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Auto-detect organization if not provided
|
|
34
|
+
unless org_id
|
|
35
|
+
org_id = detect_organization_id(k8s)
|
|
36
|
+
exit 1 unless org_id
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Find the organization namespace
|
|
40
|
+
namespace = Formatters::ProgressFormatter.with_spinner("Finding namespace for organization #{org_id[0..7]}") do
|
|
41
|
+
find_org_namespace(k8s, org_id)
|
|
33
42
|
end
|
|
34
43
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
unless namespace
|
|
45
|
+
Formatters::ProgressFormatter.error("Organization namespace not found for ID: #{org_id}")
|
|
46
|
+
puts "\nMake sure the organization exists and you have access to it."
|
|
47
|
+
puts "Available organization namespaces:"
|
|
48
|
+
list_org_namespaces(k8s)
|
|
38
49
|
exit 1
|
|
39
50
|
end
|
|
40
51
|
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
# Handle dry-run: output manifest and exit early
|
|
53
|
+
if options[:dry_run]
|
|
54
|
+
# Create a mock client to pass org context for dry run
|
|
55
|
+
mock_client = Object.new
|
|
56
|
+
def mock_client.current_org_id; @org_id; end
|
|
57
|
+
mock_client.instance_variable_set(:@org_id, org_id)
|
|
58
|
+
|
|
59
|
+
resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain], k8s_client: mock_client)
|
|
60
|
+
puts resource.to_yaml
|
|
61
|
+
return
|
|
44
62
|
end
|
|
45
63
|
|
|
46
|
-
#
|
|
47
|
-
|
|
64
|
+
# Check if cluster already exists in Kubernetes
|
|
65
|
+
begin
|
|
66
|
+
existing_cluster = k8s.get_resource('LanguageCluster', name, namespace)
|
|
67
|
+
if existing_cluster
|
|
68
|
+
Formatters::ProgressFormatter.error("Cluster '#{name}' already exists in namespace '#{namespace}'")
|
|
69
|
+
exit 1
|
|
70
|
+
end
|
|
71
|
+
rescue StandardError => e
|
|
72
|
+
# If we get a 404 or API error, the cluster doesn't exist - that's fine
|
|
73
|
+
unless e.message.include?('404') || e.message.include?('Not Found')
|
|
74
|
+
warn "Warning: Could not check for existing cluster: #{e.message}" if ENV['DEBUG']
|
|
75
|
+
end
|
|
76
|
+
end
|
|
48
77
|
|
|
49
78
|
# Check if operator is installed
|
|
50
79
|
unless k8s.operator_installed?
|
|
51
80
|
Formatters::ProgressFormatter.error('Language Operator not found in cluster')
|
|
52
81
|
puts "\nInstall the operator first:"
|
|
53
|
-
puts '
|
|
82
|
+
puts ' langop install'
|
|
54
83
|
exit 1
|
|
55
84
|
end
|
|
56
85
|
|
|
@@ -65,7 +94,8 @@ module LanguageOperator
|
|
|
65
94
|
|
|
66
95
|
# Create LanguageCluster resource
|
|
67
96
|
Formatters::ProgressFormatter.with_spinner('Creating LanguageCluster resource') do
|
|
68
|
-
|
|
97
|
+
labels = { 'langop.io/organization-id' => org_id }
|
|
98
|
+
resource = Kubernetes::ResourceBuilder.language_cluster(name, namespace: namespace, domain: options[:domain], labels: labels, k8s_client: k8s)
|
|
69
99
|
k8s.apply_resource(resource)
|
|
70
100
|
resource
|
|
71
101
|
end
|
|
@@ -92,6 +122,7 @@ module LanguageOperator
|
|
|
92
122
|
namespace: namespace,
|
|
93
123
|
context: actual_context,
|
|
94
124
|
domain: options[:domain],
|
|
125
|
+
org_id: org_id,
|
|
95
126
|
status: 'Ready',
|
|
96
127
|
created: Time.now.strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
97
128
|
)
|
|
@@ -100,7 +131,7 @@ module LanguageOperator
|
|
|
100
131
|
unless options[:switch]
|
|
101
132
|
puts
|
|
102
133
|
puts 'Switch to this cluster with:'
|
|
103
|
-
puts pastel.dim("
|
|
134
|
+
puts pastel.dim(" langop use #{name}")
|
|
104
135
|
end
|
|
105
136
|
end
|
|
106
137
|
end
|
|
@@ -109,167 +140,76 @@ module LanguageOperator
|
|
|
109
140
|
option :all, type: :boolean, default: false, desc: 'Show all clusters including inactive'
|
|
110
141
|
def list
|
|
111
142
|
handle_command_error('list clusters') do
|
|
112
|
-
|
|
113
|
-
|
|
143
|
+
# Query Kubernetes directly for all LanguageCluster resources (like kubectl get languageclusters -A)
|
|
144
|
+
k8s = Kubernetes::Client.new
|
|
145
|
+
|
|
146
|
+
# List all LanguageCluster resources across all namespaces
|
|
147
|
+
language_clusters = k8s.list_resources('LanguageCluster', namespace: nil)
|
|
114
148
|
|
|
115
|
-
if
|
|
149
|
+
if language_clusters.empty?
|
|
116
150
|
Formatters::ProgressFormatter.info('No clusters found')
|
|
117
151
|
puts "\nCreate a cluster with:"
|
|
118
|
-
puts '
|
|
152
|
+
puts ' langop cluster create <name>'
|
|
119
153
|
return
|
|
120
154
|
end
|
|
121
155
|
|
|
122
|
-
|
|
123
|
-
clients_cache = {}
|
|
156
|
+
current = Config::ClusterConfig.current_cluster
|
|
124
157
|
|
|
125
|
-
# Build table data
|
|
126
|
-
table_data =
|
|
158
|
+
# Build table data from LanguageCluster resources
|
|
159
|
+
table_data = language_clusters.map do |cluster_resource|
|
|
127
160
|
begin
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
next {
|
|
161
|
+
name = cluster_resource.dig('metadata', 'name')
|
|
162
|
+
namespace = cluster_resource.dig('metadata', 'namespace')
|
|
163
|
+
status = cluster_resource.dig('status', 'phase') || 'Unknown'
|
|
164
|
+
domain = cluster_resource.dig('spec', 'domain')
|
|
165
|
+
|
|
166
|
+
# Get organization information from the cluster resource itself
|
|
167
|
+
org_id = cluster_resource.dig('metadata', 'labels', 'langop.io/organization-id')
|
|
168
|
+
organization = org_id ? org_id[0..7] : 'legacy'
|
|
169
|
+
|
|
170
|
+
# Check if this cluster matches the current selection
|
|
171
|
+
name_display = name
|
|
172
|
+
name_display = "#{pastel.bold(name)} (selected)" if name == current
|
|
173
|
+
|
|
174
|
+
# Get related resources in the same namespace
|
|
175
|
+
agents = k8s.list_resources(RESOURCE_AGENT, namespace: namespace)
|
|
176
|
+
tools = k8s.list_resources(RESOURCE_TOOL, namespace: namespace)
|
|
177
|
+
models = k8s.list_resources(RESOURCE_MODEL, namespace: namespace)
|
|
178
|
+
|
|
179
|
+
{
|
|
148
180
|
name: name_display,
|
|
149
|
-
namespace:
|
|
181
|
+
namespace: namespace,
|
|
182
|
+
organization: organization,
|
|
183
|
+
agents: agents.count,
|
|
184
|
+
tools: tools.count,
|
|
185
|
+
models: models.count,
|
|
186
|
+
status: status,
|
|
187
|
+
domain: domain || ''
|
|
188
|
+
}
|
|
189
|
+
rescue StandardError => e
|
|
190
|
+
# Handle any errors gracefully
|
|
191
|
+
name = cluster_resource.dig('metadata', 'name') || 'unknown'
|
|
192
|
+
namespace = cluster_resource.dig('metadata', 'namespace') || 'unknown'
|
|
193
|
+
|
|
194
|
+
{
|
|
195
|
+
name: name,
|
|
196
|
+
namespace: namespace,
|
|
197
|
+
organization: '?',
|
|
150
198
|
agents: '?',
|
|
151
199
|
tools: '?',
|
|
152
200
|
models: '?',
|
|
153
|
-
status: '
|
|
201
|
+
status: 'Error',
|
|
154
202
|
domain: '?'
|
|
155
203
|
}
|
|
156
204
|
end
|
|
157
|
-
|
|
158
|
-
# Get cluster stats
|
|
159
|
-
agents = k8s.list_resources(RESOURCE_AGENT, namespace: cluster[:namespace])
|
|
160
|
-
tools = k8s.list_resources(RESOURCE_TOOL, namespace: cluster[:namespace])
|
|
161
|
-
models = k8s.list_resources(RESOURCE_MODEL, namespace: cluster[:namespace])
|
|
162
|
-
|
|
163
|
-
# Get cluster status and domain
|
|
164
|
-
cluster_resource = k8s.get_resource('LanguageCluster', cluster[:name], cluster[:namespace])
|
|
165
|
-
status = cluster_resource.dig('status', 'phase') || 'Unknown'
|
|
166
|
-
domain = cluster_resource.dig('spec', 'domain')
|
|
167
|
-
|
|
168
|
-
name_display = cluster[:name]
|
|
169
|
-
name_display = "#{pastel.bold(cluster[:name])} (selected)" if cluster[:name] == current
|
|
170
|
-
|
|
171
|
-
{
|
|
172
|
-
name: name_display,
|
|
173
|
-
namespace: cluster[:namespace],
|
|
174
|
-
agents: agents.count,
|
|
175
|
-
tools: tools.count,
|
|
176
|
-
models: models.count,
|
|
177
|
-
status: status,
|
|
178
|
-
domain: domain
|
|
179
|
-
}
|
|
180
|
-
rescue K8s::Error::NotFound
|
|
181
|
-
# Cluster exists in local config but not in Kubernetes
|
|
182
|
-
name_display = cluster[:name]
|
|
183
|
-
name_display += ' *' if cluster[:name] == current
|
|
184
|
-
|
|
185
|
-
{
|
|
186
|
-
name: name_display,
|
|
187
|
-
namespace: cluster[:namespace],
|
|
188
|
-
agents: '-',
|
|
189
|
-
tools: '-',
|
|
190
|
-
models: '-',
|
|
191
|
-
status: 'Not Found',
|
|
192
|
-
domain: '-'
|
|
193
|
-
}
|
|
194
|
-
rescue StandardError
|
|
195
|
-
# Other errors (connection issues, auth problems, etc.)
|
|
196
|
-
name_display = cluster[:name]
|
|
197
|
-
name_display += ' *' if cluster[:name] == current
|
|
198
|
-
|
|
199
|
-
{
|
|
200
|
-
name: name_display,
|
|
201
|
-
namespace: cluster[:namespace],
|
|
202
|
-
agents: '?',
|
|
203
|
-
tools: '?',
|
|
204
|
-
models: '?',
|
|
205
|
-
status: 'Error',
|
|
206
|
-
domain: '?'
|
|
207
|
-
}
|
|
208
205
|
end
|
|
209
206
|
|
|
210
207
|
Formatters::TableFormatter.clusters(table_data)
|
|
211
208
|
|
|
212
|
-
puts "\nNo cluster selected. Use '
|
|
213
|
-
|
|
214
|
-
# Show helpful message if any clusters are not found
|
|
215
|
-
not_found_clusters = table_data.select { |c| c[:status] == 'Not Found' }
|
|
216
|
-
if not_found_clusters.any?
|
|
217
|
-
puts
|
|
218
|
-
Formatters::ProgressFormatter.warn('Some clusters exist in local config but not in Kubernetes')
|
|
219
|
-
puts
|
|
220
|
-
puts 'Clusters with "Not Found" status are defined in ~/.aictl/config.yaml'
|
|
221
|
-
puts 'but the corresponding LanguageCluster resource does not exist in Kubernetes.'
|
|
222
|
-
puts
|
|
223
|
-
puts 'To fix this:'
|
|
224
|
-
not_found_clusters.each do |cluster|
|
|
225
|
-
cluster_name = cluster[:name].gsub(' *', '')
|
|
226
|
-
puts " • Remove from config: aictl cluster delete #{cluster_name}"
|
|
227
|
-
puts " • Or recreate: aictl cluster create #{cluster_name}"
|
|
228
|
-
end
|
|
229
|
-
end
|
|
209
|
+
puts "\nNo cluster selected. Use 'langop use <cluster>' to select one." unless current
|
|
230
210
|
end
|
|
231
211
|
end
|
|
232
212
|
|
|
233
|
-
desc 'current', 'Show current cluster context'
|
|
234
|
-
def current
|
|
235
|
-
handle_command_error('show current cluster') do
|
|
236
|
-
cluster_name = Config::ClusterConfig.current_cluster
|
|
237
|
-
|
|
238
|
-
unless cluster_name
|
|
239
|
-
Formatters::ProgressFormatter.info('No cluster selected')
|
|
240
|
-
puts "\nSelect a cluster with:"
|
|
241
|
-
puts ' aictl use <cluster>'
|
|
242
|
-
return
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
cluster = Config::ClusterConfig.get_cluster(cluster_name)
|
|
246
|
-
|
|
247
|
-
unless cluster
|
|
248
|
-
Formatters::ProgressFormatter.error("Cluster '#{cluster_name}' not found in config")
|
|
249
|
-
exit 1
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
puts 'Current Cluster:'
|
|
253
|
-
puts " Name: #{cluster[:name]}"
|
|
254
|
-
puts " Namespace: #{cluster[:namespace]}"
|
|
255
|
-
puts " Context: #{cluster[:context] || 'default'}"
|
|
256
|
-
puts " Created: #{cluster[:created]}"
|
|
257
|
-
|
|
258
|
-
# Check cluster health
|
|
259
|
-
begin
|
|
260
|
-
k8s = Helpers::ClusterValidator.kubernetes_client(cluster_name)
|
|
261
|
-
|
|
262
|
-
if k8s.operator_installed?
|
|
263
|
-
version = k8s.operator_version
|
|
264
|
-
Formatters::ProgressFormatter.success("Operator: #{version || 'installed'}")
|
|
265
|
-
else
|
|
266
|
-
Formatters::ProgressFormatter.warn('Operator: not found')
|
|
267
|
-
end
|
|
268
|
-
rescue StandardError => e
|
|
269
|
-
Formatters::ProgressFormatter.error("Connection: #{e.message}")
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
213
|
|
|
274
214
|
desc 'delete NAME', 'Delete a cluster'
|
|
275
215
|
option :force, type: :boolean, default: false, desc: 'Skip confirmation'
|
|
@@ -306,7 +246,7 @@ module LanguageOperator
|
|
|
306
246
|
puts ' • The cluster resource no longer exists'
|
|
307
247
|
puts
|
|
308
248
|
puts 'To force removal from local configuration only, use:'
|
|
309
|
-
puts pastel.dim("
|
|
249
|
+
puts pastel.dim(" langop cluster delete #{name} --force-local")
|
|
310
250
|
exit 1
|
|
311
251
|
end
|
|
312
252
|
end
|
|
@@ -394,6 +334,80 @@ module LanguageOperator
|
|
|
394
334
|
end
|
|
395
335
|
end
|
|
396
336
|
end
|
|
337
|
+
|
|
338
|
+
private
|
|
339
|
+
|
|
340
|
+
# Auto-detect organization ID when not provided
|
|
341
|
+
# @param k8s_client [Kubernetes::Client] Kubernetes client
|
|
342
|
+
# @return [String, nil] Organization ID or nil if detection failed
|
|
343
|
+
def detect_organization_id(k8s_client)
|
|
344
|
+
# List all organization namespaces
|
|
345
|
+
org_namespaces = k8s_client.list_namespaces(
|
|
346
|
+
label_selector: 'langop.io/type=organization'
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
case org_namespaces.length
|
|
350
|
+
when 0
|
|
351
|
+
Formatters::ProgressFormatter.error('No organizations found in cluster')
|
|
352
|
+
puts "\nRun 'langop organization list' to see available organizations."
|
|
353
|
+
nil
|
|
354
|
+
when 1
|
|
355
|
+
org_id = org_namespaces.first.dig('metadata', 'labels', 'langop.io/organization-id')
|
|
356
|
+
org_id
|
|
357
|
+
else
|
|
358
|
+
Formatters::ProgressFormatter.error('Multiple organizations found')
|
|
359
|
+
puts "\nPlease specify which organization to use:"
|
|
360
|
+
puts " langop cluster create #{ARGV.last} --organization-id <ORG_ID>"
|
|
361
|
+
puts
|
|
362
|
+
puts "Available organizations:"
|
|
363
|
+
list_org_namespaces(k8s_client)
|
|
364
|
+
nil
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
# Find the namespace for a given organization ID
|
|
369
|
+
#
|
|
370
|
+
# @param k8s_client [Kubernetes::Client] Kubernetes client
|
|
371
|
+
# @param org_id [String] Organization ID
|
|
372
|
+
# @return [String, nil] Namespace name or nil if not found
|
|
373
|
+
def find_org_namespace(k8s_client, org_id)
|
|
374
|
+
# List all namespaces with organization labels
|
|
375
|
+
namespaces = k8s_client.list_namespaces(
|
|
376
|
+
label_selector: "langop.io/organization-id=#{org_id}"
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
# Find the first namespace for this org ID
|
|
380
|
+
org_namespace = namespaces.find do |ns|
|
|
381
|
+
ns.dig('metadata', 'labels', 'langop.io/organization-id') == org_id
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
org_namespace&.dig('metadata', 'name')
|
|
385
|
+
rescue StandardError => e
|
|
386
|
+
warn "Warning: Could not find organization namespace: #{e.message}" if ENV['DEBUG']
|
|
387
|
+
nil
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# List available organization namespaces for error messages
|
|
391
|
+
#
|
|
392
|
+
# @param k8s_client [Kubernetes::Client] Kubernetes client
|
|
393
|
+
def list_org_namespaces(k8s_client)
|
|
394
|
+
namespaces = k8s_client.list_namespaces(
|
|
395
|
+
label_selector: 'langop.io/type=organization'
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
if namespaces.any?
|
|
399
|
+
namespaces.each do |ns|
|
|
400
|
+
name = ns.dig('metadata', 'name')
|
|
401
|
+
org_id = ns.dig('metadata', 'labels', 'langop.io/organization-id')
|
|
402
|
+
plan = ns.dig('metadata', 'labels', 'langop.io/plan')
|
|
403
|
+
puts " • #{name} (#{org_id}) [#{plan}]"
|
|
404
|
+
end
|
|
405
|
+
else
|
|
406
|
+
puts " None found"
|
|
407
|
+
end
|
|
408
|
+
rescue StandardError => e
|
|
409
|
+
puts " Error listing namespaces: #{e.message}"
|
|
410
|
+
end
|
|
397
411
|
end
|
|
398
412
|
end
|
|
399
413
|
end
|