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