ima2-gen 1.1.13 → 1.1.16
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.
- package/README.md +31 -7
- package/bin/commands/capabilities.js +5 -0
- package/bin/commands/capabilities.ts +5 -0
- package/bin/commands/doctor.js +195 -0
- package/bin/commands/doctor.ts +202 -0
- package/bin/commands/edit.js +6 -6
- package/bin/commands/edit.ts +6 -6
- package/bin/commands/gen.js +6 -6
- package/bin/commands/gen.ts +6 -6
- package/bin/commands/grok.js +61 -0
- package/bin/commands/grok.ts +67 -0
- package/bin/commands/multimode.js +3 -3
- package/bin/commands/multimode.ts +3 -3
- package/bin/commands/node.js +4 -4
- package/bin/commands/node.ts +4 -4
- package/bin/ima2.js +5 -105
- package/bin/ima2.ts +5 -109
- package/config.js +17 -0
- package/config.ts +21 -0
- package/docs/API.md +77 -8
- package/docs/CLI.md +65 -3
- package/docs/FAQ.ko.md +82 -2
- package/docs/FAQ.md +85 -2
- package/docs/PROMPT_STUDIO.ko.md +111 -0
- package/docs/PROMPT_STUDIO.md +115 -0
- package/docs/README.ko.md +27 -7
- package/docs/grok-video-i2v-plan.md +419 -0
- package/docs/grok-video-i2v-research.md +204 -0
- package/docs/migration/runtime-test-inventory.md +12 -1
- package/lib/agentRuntime.js +88 -19
- package/lib/agentRuntime.ts +97 -29
- package/lib/agentSettings.js +1 -1
- package/lib/agentSettings.ts +1 -1
- package/lib/agentTypes.ts +1 -1
- package/lib/capabilities.js +10 -2
- package/lib/capabilities.ts +10 -2
- package/lib/configKeys.js +6 -0
- package/lib/configKeys.ts +6 -1
- package/lib/errorClassify.js +1 -1
- package/lib/errorClassify.ts +1 -1
- package/lib/generationErrors.js +121 -23
- package/lib/generationErrors.ts +100 -13
- package/lib/grokImageAdapter.js +364 -0
- package/lib/grokImageAdapter.ts +483 -0
- package/lib/grokMultimodeAdapter.js +54 -0
- package/lib/grokMultimodeAdapter.ts +84 -0
- package/lib/grokProxyLauncher.js +105 -0
- package/lib/grokProxyLauncher.ts +129 -0
- package/lib/grokRuntime.js +18 -0
- package/lib/grokRuntime.ts +23 -0
- package/lib/grokSizeMapper.js +63 -0
- package/lib/grokSizeMapper.ts +71 -0
- package/lib/grokVideoAdapter.js +374 -0
- package/lib/grokVideoAdapter.ts +438 -0
- package/lib/historyList.js +5 -1
- package/lib/historyList.ts +5 -1
- package/lib/imageMetadata.js +2 -0
- package/lib/imageMetadata.ts +2 -0
- package/lib/imageModels.js +101 -0
- package/lib/imageModels.ts +111 -0
- package/lib/providerOptions.js +15 -1
- package/lib/providerOptions.ts +15 -1
- package/lib/responsesDoctor.js +386 -0
- package/lib/responsesDoctor.ts +456 -0
- package/lib/responsesErrors.js +57 -0
- package/lib/responsesErrors.ts +83 -0
- package/lib/responsesFallback.js +72 -0
- package/lib/responsesFallback.ts +114 -0
- package/lib/responsesImageAdapter.js +121 -174
- package/lib/responsesImageAdapter.ts +136 -211
- package/lib/responsesParse.js +324 -0
- package/lib/responsesParse.ts +452 -0
- package/lib/responsesTools.js +15 -0
- package/lib/responsesTools.ts +28 -0
- package/lib/runtimeContext.js +12 -0
- package/lib/runtimeContext.ts +15 -0
- package/node_modules/array-flatten/LICENSE +21 -0
- package/node_modules/array-flatten/README.md +43 -0
- package/node_modules/array-flatten/array-flatten.js +64 -0
- package/node_modules/array-flatten/package.json +39 -0
- package/node_modules/bundle-name/index.js +5 -0
- package/node_modules/bundle-name/license +9 -0
- package/node_modules/bundle-name/package.json +45 -0
- package/node_modules/bundle-name/readme.md +23 -0
- package/node_modules/bytes/History.md +97 -0
- package/node_modules/bytes/LICENSE +23 -0
- package/node_modules/bytes/Readme.md +152 -0
- package/node_modules/bytes/index.js +170 -0
- package/node_modules/bytes/package.json +42 -0
- package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
- package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
- package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- package/node_modules/call-bind-apply-helpers/README.md +62 -0
- package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- package/node_modules/call-bind-apply-helpers/index.js +15 -0
- package/node_modules/call-bind-apply-helpers/package.json +85 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
- package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- package/node_modules/call-bound/.eslintrc +13 -0
- package/node_modules/call-bound/.github/FUNDING.yml +12 -0
- package/node_modules/call-bound/.nycrc +9 -0
- package/node_modules/call-bound/CHANGELOG.md +42 -0
- package/node_modules/call-bound/LICENSE +21 -0
- package/node_modules/call-bound/README.md +53 -0
- package/node_modules/call-bound/index.d.ts +94 -0
- package/node_modules/call-bound/index.js +19 -0
- package/node_modules/call-bound/package.json +99 -0
- package/node_modules/call-bound/test/index.js +61 -0
- package/node_modules/call-bound/tsconfig.json +10 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1149 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2662 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +709 -0
- package/node_modules/commander/lib/option.js +367 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +82 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +1045 -0
- package/node_modules/content-type/HISTORY.md +29 -0
- package/node_modules/content-type/LICENSE +22 -0
- package/node_modules/content-type/README.md +94 -0
- package/node_modules/content-type/index.js +225 -0
- package/node_modules/content-type/package.json +42 -0
- package/node_modules/cookie/LICENSE +24 -0
- package/node_modules/cookie/README.md +317 -0
- package/node_modules/cookie/SECURITY.md +25 -0
- package/node_modules/cookie/index.js +335 -0
- package/node_modules/cookie/package.json +44 -0
- package/node_modules/default-browser/index.d.ts +29 -0
- package/node_modules/default-browser/index.js +34 -0
- package/node_modules/default-browser/license +9 -0
- package/node_modules/default-browser/package.json +54 -0
- package/node_modules/default-browser/readme.md +24 -0
- package/node_modules/default-browser/windows.js +57 -0
- package/node_modules/default-browser-id/index.js +25 -0
- package/node_modules/default-browser-id/license +9 -0
- package/node_modules/default-browser-id/package.json +41 -0
- package/node_modules/default-browser-id/readme.md +19 -0
- package/node_modules/define-lazy-prop/index.d.ts +31 -0
- package/node_modules/define-lazy-prop/index.js +18 -0
- package/node_modules/define-lazy-prop/license +9 -0
- package/node_modules/define-lazy-prop/package.json +51 -0
- package/node_modules/define-lazy-prop/readme.md +55 -0
- package/node_modules/depd/History.md +103 -0
- package/node_modules/depd/LICENSE +22 -0
- package/node_modules/depd/Readme.md +280 -0
- package/node_modules/depd/index.js +538 -0
- package/node_modules/depd/lib/browser/index.js +77 -0
- package/node_modules/depd/package.json +45 -0
- package/node_modules/destroy/LICENSE +23 -0
- package/node_modules/destroy/README.md +63 -0
- package/node_modules/destroy/index.js +209 -0
- package/node_modules/destroy/package.json +48 -0
- package/node_modules/dunder-proto/.eslintrc +5 -0
- package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- package/node_modules/dunder-proto/.nycrc +13 -0
- package/node_modules/dunder-proto/CHANGELOG.md +24 -0
- package/node_modules/dunder-proto/LICENSE +21 -0
- package/node_modules/dunder-proto/README.md +54 -0
- package/node_modules/dunder-proto/get.d.ts +5 -0
- package/node_modules/dunder-proto/get.js +30 -0
- package/node_modules/dunder-proto/package.json +76 -0
- package/node_modules/dunder-proto/set.d.ts +5 -0
- package/node_modules/dunder-proto/set.js +35 -0
- package/node_modules/dunder-proto/test/get.js +34 -0
- package/node_modules/dunder-proto/test/index.js +4 -0
- package/node_modules/dunder-proto/test/set.js +50 -0
- package/node_modules/dunder-proto/tsconfig.json +9 -0
- package/node_modules/ee-first/LICENSE +22 -0
- package/node_modules/ee-first/README.md +80 -0
- package/node_modules/ee-first/index.js +95 -0
- package/node_modules/ee-first/package.json +29 -0
- package/node_modules/encodeurl/LICENSE +22 -0
- package/node_modules/encodeurl/README.md +109 -0
- package/node_modules/encodeurl/index.js +60 -0
- package/node_modules/encodeurl/package.json +40 -0
- package/node_modules/es-define-property/.eslintrc +13 -0
- package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- package/node_modules/es-define-property/.nycrc +9 -0
- package/node_modules/es-define-property/CHANGELOG.md +29 -0
- package/node_modules/es-define-property/LICENSE +21 -0
- package/node_modules/es-define-property/README.md +49 -0
- package/node_modules/es-define-property/index.d.ts +3 -0
- package/node_modules/es-define-property/index.js +14 -0
- package/node_modules/es-define-property/package.json +81 -0
- package/node_modules/es-define-property/test/index.js +56 -0
- package/node_modules/es-define-property/tsconfig.json +10 -0
- package/node_modules/es-errors/.eslintrc +5 -0
- package/node_modules/es-errors/.github/FUNDING.yml +12 -0
- package/node_modules/es-errors/CHANGELOG.md +40 -0
- package/node_modules/es-errors/LICENSE +21 -0
- package/node_modules/es-errors/README.md +55 -0
- package/node_modules/es-errors/eval.d.ts +3 -0
- package/node_modules/es-errors/eval.js +4 -0
- package/node_modules/es-errors/index.d.ts +3 -0
- package/node_modules/es-errors/index.js +4 -0
- package/node_modules/es-errors/package.json +80 -0
- package/node_modules/es-errors/range.d.ts +3 -0
- package/node_modules/es-errors/range.js +4 -0
- package/node_modules/es-errors/ref.d.ts +3 -0
- package/node_modules/es-errors/ref.js +4 -0
- package/node_modules/es-errors/syntax.d.ts +3 -0
- package/node_modules/es-errors/syntax.js +4 -0
- package/node_modules/es-errors/test/index.js +19 -0
- package/node_modules/es-errors/tsconfig.json +49 -0
- package/node_modules/es-errors/type.d.ts +3 -0
- package/node_modules/es-errors/type.js +4 -0
- package/node_modules/es-errors/uri.d.ts +3 -0
- package/node_modules/es-errors/uri.js +4 -0
- package/node_modules/es-object-atoms/.eslintrc +16 -0
- package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- package/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- package/node_modules/es-object-atoms/LICENSE +21 -0
- package/node_modules/es-object-atoms/README.md +63 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- package/node_modules/es-object-atoms/ToObject.js +10 -0
- package/node_modules/es-object-atoms/index.d.ts +3 -0
- package/node_modules/es-object-atoms/index.js +4 -0
- package/node_modules/es-object-atoms/isObject.d.ts +3 -0
- package/node_modules/es-object-atoms/isObject.js +6 -0
- package/node_modules/es-object-atoms/package.json +80 -0
- package/node_modules/es-object-atoms/test/index.js +38 -0
- package/node_modules/es-object-atoms/tsconfig.json +6 -0
- package/node_modules/escape-html/LICENSE +24 -0
- package/node_modules/escape-html/Readme.md +43 -0
- package/node_modules/escape-html/index.js +78 -0
- package/node_modules/escape-html/package.json +24 -0
- package/node_modules/etag/HISTORY.md +83 -0
- package/node_modules/etag/LICENSE +22 -0
- package/node_modules/etag/README.md +159 -0
- package/node_modules/etag/index.js +131 -0
- package/node_modules/etag/package.json +47 -0
- package/node_modules/forwarded/HISTORY.md +21 -0
- package/node_modules/forwarded/LICENSE +22 -0
- package/node_modules/forwarded/README.md +57 -0
- package/node_modules/forwarded/index.js +90 -0
- package/node_modules/forwarded/package.json +45 -0
- package/node_modules/function-bind/.eslintrc +21 -0
- package/node_modules/function-bind/.github/FUNDING.yml +12 -0
- package/node_modules/function-bind/.github/SECURITY.md +3 -0
- package/node_modules/function-bind/.nycrc +13 -0
- package/node_modules/function-bind/CHANGELOG.md +136 -0
- package/node_modules/function-bind/LICENSE +20 -0
- package/node_modules/function-bind/README.md +46 -0
- package/node_modules/function-bind/implementation.js +84 -0
- package/node_modules/function-bind/index.js +5 -0
- package/node_modules/function-bind/package.json +87 -0
- package/node_modules/function-bind/test/.eslintrc +9 -0
- package/node_modules/function-bind/test/index.js +252 -0
- package/node_modules/get-intrinsic/.eslintrc +42 -0
- package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/node_modules/get-intrinsic/.nycrc +9 -0
- package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- package/node_modules/get-intrinsic/LICENSE +21 -0
- package/node_modules/get-intrinsic/README.md +71 -0
- package/node_modules/get-intrinsic/index.js +378 -0
- package/node_modules/get-intrinsic/package.json +97 -0
- package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
- package/node_modules/get-proto/.eslintrc +10 -0
- package/node_modules/get-proto/.github/FUNDING.yml +12 -0
- package/node_modules/get-proto/.nycrc +9 -0
- package/node_modules/get-proto/CHANGELOG.md +21 -0
- package/node_modules/get-proto/LICENSE +21 -0
- package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- package/node_modules/get-proto/README.md +50 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- package/node_modules/get-proto/index.d.ts +5 -0
- package/node_modules/get-proto/index.js +27 -0
- package/node_modules/get-proto/package.json +81 -0
- package/node_modules/get-proto/test/index.js +68 -0
- package/node_modules/get-proto/tsconfig.json +9 -0
- package/node_modules/gopd/.eslintrc +16 -0
- package/node_modules/gopd/.github/FUNDING.yml +12 -0
- package/node_modules/gopd/CHANGELOG.md +45 -0
- package/node_modules/gopd/LICENSE +21 -0
- package/node_modules/gopd/README.md +40 -0
- package/node_modules/gopd/gOPD.d.ts +1 -0
- package/node_modules/gopd/gOPD.js +4 -0
- package/node_modules/gopd/index.d.ts +5 -0
- package/node_modules/gopd/index.js +15 -0
- package/node_modules/gopd/package.json +77 -0
- package/node_modules/gopd/test/index.js +36 -0
- package/node_modules/gopd/tsconfig.json +9 -0
- package/node_modules/has-symbols/.eslintrc +11 -0
- package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/node_modules/has-symbols/.nycrc +9 -0
- package/node_modules/has-symbols/CHANGELOG.md +91 -0
- package/node_modules/has-symbols/LICENSE +21 -0
- package/node_modules/has-symbols/README.md +46 -0
- package/node_modules/has-symbols/index.d.ts +3 -0
- package/node_modules/has-symbols/index.js +14 -0
- package/node_modules/has-symbols/package.json +111 -0
- package/node_modules/has-symbols/shams.d.ts +3 -0
- package/node_modules/has-symbols/shams.js +45 -0
- package/node_modules/has-symbols/test/index.js +22 -0
- package/node_modules/has-symbols/test/shams/core-js.js +29 -0
- package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
- package/node_modules/has-symbols/test/tests.js +58 -0
- package/node_modules/has-symbols/tsconfig.json +10 -0
- package/node_modules/hasown/.github/FUNDING.yml +12 -0
- package/node_modules/hasown/.nycrc +13 -0
- package/node_modules/hasown/CHANGELOG.md +51 -0
- package/node_modules/hasown/LICENSE +21 -0
- package/node_modules/hasown/README.md +40 -0
- package/node_modules/hasown/eslint.config.mjs +6 -0
- package/node_modules/hasown/index.d.ts +4 -0
- package/node_modules/hasown/index.js +8 -0
- package/node_modules/hasown/package.json +92 -0
- package/node_modules/hasown/tsconfig.json +6 -0
- package/node_modules/http-errors/HISTORY.md +186 -0
- package/node_modules/http-errors/LICENSE +23 -0
- package/node_modules/http-errors/README.md +169 -0
- package/node_modules/http-errors/index.js +290 -0
- package/node_modules/http-errors/package.json +54 -0
- package/node_modules/inherits/LICENSE +16 -0
- package/node_modules/inherits/README.md +42 -0
- package/node_modules/inherits/inherits.js +9 -0
- package/node_modules/inherits/inherits_browser.js +27 -0
- package/node_modules/inherits/package.json +29 -0
- package/node_modules/ipaddr.js/LICENSE +19 -0
- package/node_modules/ipaddr.js/README.md +233 -0
- package/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- package/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- package/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- package/node_modules/ipaddr.js/package.json +35 -0
- package/node_modules/is-docker/cli.js +5 -0
- package/node_modules/is-docker/index.d.ts +13 -0
- package/node_modules/is-docker/index.js +29 -0
- package/node_modules/is-docker/license +9 -0
- package/node_modules/is-docker/package.json +44 -0
- package/node_modules/is-docker/readme.md +27 -0
- package/node_modules/is-inside-container/cli.js +5 -0
- package/node_modules/is-inside-container/index.d.ts +13 -0
- package/node_modules/is-inside-container/index.js +23 -0
- package/node_modules/is-inside-container/license +9 -0
- package/node_modules/is-inside-container/package.json +51 -0
- package/node_modules/is-inside-container/readme.md +36 -0
- package/node_modules/is-wsl/index.d.ts +15 -0
- package/node_modules/is-wsl/index.js +36 -0
- package/node_modules/is-wsl/license +9 -0
- package/node_modules/is-wsl/package.json +58 -0
- package/node_modules/is-wsl/readme.md +21 -0
- package/node_modules/math-intrinsics/.eslintrc +16 -0
- package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- package/node_modules/math-intrinsics/LICENSE +21 -0
- package/node_modules/math-intrinsics/README.md +50 -0
- package/node_modules/math-intrinsics/abs.d.ts +1 -0
- package/node_modules/math-intrinsics/abs.js +4 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- package/node_modules/math-intrinsics/floor.d.ts +1 -0
- package/node_modules/math-intrinsics/floor.js +4 -0
- package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- package/node_modules/math-intrinsics/isFinite.js +12 -0
- package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- package/node_modules/math-intrinsics/isInteger.js +16 -0
- package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- package/node_modules/math-intrinsics/isNaN.js +6 -0
- package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- package/node_modules/math-intrinsics/max.d.ts +1 -0
- package/node_modules/math-intrinsics/max.js +4 -0
- package/node_modules/math-intrinsics/min.d.ts +1 -0
- package/node_modules/math-intrinsics/min.js +4 -0
- package/node_modules/math-intrinsics/mod.d.ts +3 -0
- package/node_modules/math-intrinsics/mod.js +9 -0
- package/node_modules/math-intrinsics/package.json +86 -0
- package/node_modules/math-intrinsics/pow.d.ts +1 -0
- package/node_modules/math-intrinsics/pow.js +4 -0
- package/node_modules/math-intrinsics/round.d.ts +1 -0
- package/node_modules/math-intrinsics/round.js +4 -0
- package/node_modules/math-intrinsics/sign.d.ts +3 -0
- package/node_modules/math-intrinsics/sign.js +11 -0
- package/node_modules/math-intrinsics/test/index.js +192 -0
- package/node_modules/math-intrinsics/tsconfig.json +3 -0
- package/node_modules/methods/HISTORY.md +29 -0
- package/node_modules/methods/LICENSE +24 -0
- package/node_modules/methods/README.md +51 -0
- package/node_modules/methods/index.js +69 -0
- package/node_modules/methods/package.json +36 -0
- package/node_modules/mime/.npmignore +0 -0
- package/node_modules/mime/CHANGELOG.md +164 -0
- package/node_modules/mime/LICENSE +21 -0
- package/node_modules/mime/README.md +90 -0
- package/node_modules/mime/cli.js +8 -0
- package/node_modules/mime/mime.js +108 -0
- package/node_modules/mime/package.json +44 -0
- package/node_modules/mime/src/build.js +53 -0
- package/node_modules/mime/src/test.js +60 -0
- package/node_modules/mime/types.json +1 -0
- package/node_modules/ms/index.js +162 -0
- package/node_modules/ms/license.md +21 -0
- package/node_modules/ms/package.json +38 -0
- package/node_modules/ms/readme.md +59 -0
- package/node_modules/object-inspect/.eslintrc +53 -0
- package/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- package/node_modules/object-inspect/.nycrc +13 -0
- package/node_modules/object-inspect/CHANGELOG.md +424 -0
- package/node_modules/object-inspect/LICENSE +21 -0
- package/node_modules/object-inspect/example/all.js +23 -0
- package/node_modules/object-inspect/example/circular.js +6 -0
- package/node_modules/object-inspect/example/fn.js +5 -0
- package/node_modules/object-inspect/example/inspect.js +10 -0
- package/node_modules/object-inspect/index.js +544 -0
- package/node_modules/object-inspect/package-support.json +20 -0
- package/node_modules/object-inspect/package.json +105 -0
- package/node_modules/object-inspect/readme.markdown +84 -0
- package/node_modules/object-inspect/test/bigint.js +58 -0
- package/node_modules/object-inspect/test/browser/dom.js +15 -0
- package/node_modules/object-inspect/test/circular.js +16 -0
- package/node_modules/object-inspect/test/deep.js +12 -0
- package/node_modules/object-inspect/test/element.js +53 -0
- package/node_modules/object-inspect/test/err.js +48 -0
- package/node_modules/object-inspect/test/fakes.js +29 -0
- package/node_modules/object-inspect/test/fn.js +76 -0
- package/node_modules/object-inspect/test/global.js +17 -0
- package/node_modules/object-inspect/test/has.js +15 -0
- package/node_modules/object-inspect/test/holes.js +15 -0
- package/node_modules/object-inspect/test/indent-option.js +271 -0
- package/node_modules/object-inspect/test/inspect.js +139 -0
- package/node_modules/object-inspect/test/lowbyte.js +12 -0
- package/node_modules/object-inspect/test/number.js +58 -0
- package/node_modules/object-inspect/test/quoteStyle.js +26 -0
- package/node_modules/object-inspect/test/toStringTag.js +40 -0
- package/node_modules/object-inspect/test/undef.js +12 -0
- package/node_modules/object-inspect/test/values.js +261 -0
- package/node_modules/object-inspect/test-core-js.js +26 -0
- package/node_modules/object-inspect/util.inspect.js +1 -0
- package/node_modules/on-finished/HISTORY.md +98 -0
- package/node_modules/on-finished/LICENSE +23 -0
- package/node_modules/on-finished/README.md +162 -0
- package/node_modules/on-finished/index.js +234 -0
- package/node_modules/on-finished/package.json +39 -0
- package/node_modules/open/index.d.ts +158 -0
- package/node_modules/open/index.js +366 -0
- package/node_modules/open/license +9 -0
- package/node_modules/open/node_modules/wsl-utils/index.d.ts +21 -0
- package/node_modules/open/node_modules/wsl-utils/index.js +57 -0
- package/node_modules/open/node_modules/wsl-utils/license +9 -0
- package/node_modules/open/node_modules/wsl-utils/package.json +46 -0
- package/node_modules/open/node_modules/wsl-utils/readme.md +50 -0
- package/node_modules/open/package.json +68 -0
- package/node_modules/open/readme.md +183 -0
- package/node_modules/open/xdg-open +1267 -0
- package/node_modules/parseurl/HISTORY.md +58 -0
- package/node_modules/parseurl/LICENSE +24 -0
- package/node_modules/parseurl/README.md +133 -0
- package/node_modules/parseurl/index.js +158 -0
- package/node_modules/parseurl/package.json +40 -0
- package/node_modules/progrok/LICENSE +21 -0
- package/node_modules/progrok/README.md +53 -0
- package/node_modules/progrok/THIRD_PARTY_NOTICES.md +13 -0
- package/node_modules/progrok/dist/index.js +1142 -0
- package/node_modules/progrok/dist/index.js.map +1 -0
- package/node_modules/progrok/dist/public/app.js +529 -0
- package/node_modules/progrok/dist/public/index.html +47 -0
- package/node_modules/progrok/dist/public/style.css +392 -0
- package/node_modules/progrok/node_modules/accepts/HISTORY.md +243 -0
- package/node_modules/progrok/node_modules/accepts/LICENSE +23 -0
- package/node_modules/progrok/node_modules/accepts/README.md +140 -0
- package/node_modules/progrok/node_modules/accepts/index.js +238 -0
- package/node_modules/progrok/node_modules/accepts/package.json +47 -0
- package/node_modules/progrok/node_modules/body-parser/HISTORY.md +686 -0
- package/node_modules/progrok/node_modules/body-parser/LICENSE +23 -0
- package/node_modules/progrok/node_modules/body-parser/README.md +476 -0
- package/node_modules/progrok/node_modules/body-parser/index.js +156 -0
- package/node_modules/progrok/node_modules/body-parser/lib/read.js +205 -0
- package/node_modules/progrok/node_modules/body-parser/lib/types/json.js +243 -0
- package/node_modules/progrok/node_modules/body-parser/lib/types/raw.js +101 -0
- package/node_modules/progrok/node_modules/body-parser/lib/types/text.js +121 -0
- package/node_modules/progrok/node_modules/body-parser/lib/types/urlencoded.js +299 -0
- package/node_modules/progrok/node_modules/body-parser/package.json +55 -0
- package/node_modules/progrok/node_modules/content-disposition/HISTORY.md +60 -0
- package/node_modules/progrok/node_modules/content-disposition/LICENSE +22 -0
- package/node_modules/progrok/node_modules/content-disposition/README.md +142 -0
- package/node_modules/progrok/node_modules/content-disposition/index.js +458 -0
- package/node_modules/progrok/node_modules/content-disposition/package.json +44 -0
- package/node_modules/progrok/node_modules/cookie-signature/History.md +42 -0
- package/node_modules/progrok/node_modules/cookie-signature/Readme.md +42 -0
- package/node_modules/progrok/node_modules/cookie-signature/index.js +51 -0
- package/node_modules/progrok/node_modules/cookie-signature/package.json +18 -0
- package/node_modules/progrok/node_modules/debug/.coveralls.yml +1 -0
- package/node_modules/progrok/node_modules/debug/.eslintrc +11 -0
- package/node_modules/progrok/node_modules/debug/.npmignore +9 -0
- package/node_modules/progrok/node_modules/debug/.travis.yml +14 -0
- package/node_modules/progrok/node_modules/debug/CHANGELOG.md +362 -0
- package/node_modules/progrok/node_modules/debug/LICENSE +19 -0
- package/node_modules/progrok/node_modules/debug/Makefile +50 -0
- package/node_modules/progrok/node_modules/debug/README.md +312 -0
- package/node_modules/progrok/node_modules/debug/component.json +19 -0
- package/node_modules/progrok/node_modules/debug/karma.conf.js +70 -0
- package/node_modules/progrok/node_modules/debug/node.js +1 -0
- package/node_modules/progrok/node_modules/debug/node_modules/ms/index.js +152 -0
- package/node_modules/progrok/node_modules/debug/node_modules/ms/license.md +21 -0
- package/node_modules/progrok/node_modules/debug/node_modules/ms/package.json +37 -0
- package/node_modules/progrok/node_modules/debug/node_modules/ms/readme.md +51 -0
- package/node_modules/progrok/node_modules/debug/package.json +49 -0
- package/node_modules/progrok/node_modules/debug/src/browser.js +185 -0
- package/node_modules/progrok/node_modules/debug/src/debug.js +202 -0
- package/node_modules/progrok/node_modules/debug/src/index.js +10 -0
- package/node_modules/progrok/node_modules/debug/src/inspector-log.js +15 -0
- package/node_modules/progrok/node_modules/debug/src/node.js +248 -0
- package/node_modules/progrok/node_modules/express/History.md +3676 -0
- package/node_modules/progrok/node_modules/express/LICENSE +24 -0
- package/node_modules/progrok/node_modules/express/Readme.md +260 -0
- package/node_modules/progrok/node_modules/express/index.js +11 -0
- package/node_modules/progrok/node_modules/express/lib/application.js +661 -0
- package/node_modules/progrok/node_modules/express/lib/express.js +116 -0
- package/node_modules/progrok/node_modules/express/lib/middleware/init.js +43 -0
- package/node_modules/progrok/node_modules/express/lib/middleware/query.js +47 -0
- package/node_modules/progrok/node_modules/express/lib/request.js +525 -0
- package/node_modules/progrok/node_modules/express/lib/response.js +1179 -0
- package/node_modules/progrok/node_modules/express/lib/router/index.js +673 -0
- package/node_modules/progrok/node_modules/express/lib/router/layer.js +181 -0
- package/node_modules/progrok/node_modules/express/lib/router/route.js +230 -0
- package/node_modules/progrok/node_modules/express/lib/utils.js +304 -0
- package/node_modules/progrok/node_modules/express/lib/view.js +182 -0
- package/node_modules/progrok/node_modules/express/package.json +102 -0
- package/node_modules/progrok/node_modules/finalhandler/HISTORY.md +216 -0
- package/node_modules/progrok/node_modules/finalhandler/LICENSE +22 -0
- package/node_modules/progrok/node_modules/finalhandler/README.md +147 -0
- package/node_modules/progrok/node_modules/finalhandler/SECURITY.md +25 -0
- package/node_modules/progrok/node_modules/finalhandler/index.js +341 -0
- package/node_modules/progrok/node_modules/finalhandler/package.json +47 -0
- package/node_modules/progrok/node_modules/fresh/HISTORY.md +70 -0
- package/node_modules/progrok/node_modules/fresh/LICENSE +23 -0
- package/node_modules/progrok/node_modules/fresh/README.md +119 -0
- package/node_modules/progrok/node_modules/fresh/index.js +137 -0
- package/node_modules/progrok/node_modules/fresh/package.json +46 -0
- package/node_modules/progrok/node_modules/iconv-lite/Changelog.md +162 -0
- package/node_modules/progrok/node_modules/iconv-lite/LICENSE +21 -0
- package/node_modules/progrok/node_modules/iconv-lite/README.md +156 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/index.js +22 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/internal.js +188 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/utf16.js +177 -0
- package/node_modules/progrok/node_modules/iconv-lite/encodings/utf7.js +290 -0
- package/node_modules/progrok/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- package/node_modules/progrok/node_modules/iconv-lite/lib/extend-node.js +217 -0
- package/node_modules/progrok/node_modules/iconv-lite/lib/index.d.ts +24 -0
- package/node_modules/progrok/node_modules/iconv-lite/lib/index.js +153 -0
- package/node_modules/progrok/node_modules/iconv-lite/lib/streams.js +121 -0
- package/node_modules/progrok/node_modules/iconv-lite/package.json +46 -0
- package/node_modules/progrok/node_modules/media-typer/HISTORY.md +22 -0
- package/node_modules/progrok/node_modules/media-typer/LICENSE +22 -0
- package/node_modules/progrok/node_modules/media-typer/README.md +81 -0
- package/node_modules/progrok/node_modules/media-typer/index.js +270 -0
- package/node_modules/progrok/node_modules/media-typer/package.json +26 -0
- package/node_modules/progrok/node_modules/merge-descriptors/HISTORY.md +21 -0
- package/node_modules/progrok/node_modules/merge-descriptors/LICENSE +23 -0
- package/node_modules/progrok/node_modules/merge-descriptors/README.md +49 -0
- package/node_modules/progrok/node_modules/merge-descriptors/index.js +60 -0
- package/node_modules/progrok/node_modules/merge-descriptors/package.json +39 -0
- package/node_modules/progrok/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/progrok/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/progrok/node_modules/mime-db/README.md +100 -0
- package/node_modules/progrok/node_modules/mime-db/db.json +8519 -0
- package/node_modules/progrok/node_modules/mime-db/index.js +12 -0
- package/node_modules/progrok/node_modules/mime-db/package.json +60 -0
- package/node_modules/progrok/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/progrok/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/progrok/node_modules/mime-types/README.md +113 -0
- package/node_modules/progrok/node_modules/mime-types/index.js +188 -0
- package/node_modules/progrok/node_modules/mime-types/package.json +44 -0
- package/node_modules/progrok/node_modules/negotiator/HISTORY.md +108 -0
- package/node_modules/progrok/node_modules/negotiator/LICENSE +24 -0
- package/node_modules/progrok/node_modules/negotiator/README.md +203 -0
- package/node_modules/progrok/node_modules/negotiator/index.js +82 -0
- package/node_modules/progrok/node_modules/negotiator/lib/charset.js +169 -0
- package/node_modules/progrok/node_modules/negotiator/lib/encoding.js +184 -0
- package/node_modules/progrok/node_modules/negotiator/lib/language.js +179 -0
- package/node_modules/progrok/node_modules/negotiator/lib/mediaType.js +294 -0
- package/node_modules/progrok/node_modules/negotiator/package.json +42 -0
- package/node_modules/progrok/node_modules/path-to-regexp/LICENSE +21 -0
- package/node_modules/progrok/node_modules/path-to-regexp/Readme.md +35 -0
- package/node_modules/progrok/node_modules/path-to-regexp/index.js +158 -0
- package/node_modules/progrok/node_modules/path-to-regexp/package.json +30 -0
- package/node_modules/progrok/node_modules/raw-body/LICENSE +22 -0
- package/node_modules/progrok/node_modules/raw-body/README.md +223 -0
- package/node_modules/progrok/node_modules/raw-body/index.d.ts +87 -0
- package/node_modules/progrok/node_modules/raw-body/index.js +336 -0
- package/node_modules/progrok/node_modules/raw-body/package.json +47 -0
- package/node_modules/progrok/node_modules/send/HISTORY.md +538 -0
- package/node_modules/progrok/node_modules/send/LICENSE +23 -0
- package/node_modules/progrok/node_modules/send/README.md +327 -0
- package/node_modules/progrok/node_modules/send/SECURITY.md +24 -0
- package/node_modules/progrok/node_modules/send/index.js +1142 -0
- package/node_modules/progrok/node_modules/send/package.json +62 -0
- package/node_modules/progrok/node_modules/serve-static/HISTORY.md +493 -0
- package/node_modules/progrok/node_modules/serve-static/LICENSE +25 -0
- package/node_modules/progrok/node_modules/serve-static/README.md +257 -0
- package/node_modules/progrok/node_modules/serve-static/index.js +209 -0
- package/node_modules/progrok/node_modules/serve-static/package.json +42 -0
- package/node_modules/progrok/node_modules/type-is/HISTORY.md +259 -0
- package/node_modules/progrok/node_modules/type-is/LICENSE +23 -0
- package/node_modules/progrok/node_modules/type-is/README.md +170 -0
- package/node_modules/progrok/node_modules/type-is/index.js +266 -0
- package/node_modules/progrok/node_modules/type-is/package.json +45 -0
- package/node_modules/progrok/package.json +52 -0
- package/node_modules/progrok/skills/progrok/SKILL.md +228 -0
- package/node_modules/proxy-addr/HISTORY.md +161 -0
- package/node_modules/proxy-addr/LICENSE +22 -0
- package/node_modules/proxy-addr/README.md +139 -0
- package/node_modules/proxy-addr/index.js +327 -0
- package/node_modules/proxy-addr/package.json +47 -0
- package/node_modules/qs/.editorconfig +46 -0
- package/node_modules/qs/.github/FUNDING.yml +12 -0
- package/node_modules/qs/.github/SECURITY.md +11 -0
- package/node_modules/qs/.github/THREAT_MODEL.md +78 -0
- package/node_modules/qs/.nycrc +13 -0
- package/node_modules/qs/CHANGELOG.md +812 -0
- package/node_modules/qs/LICENSE.md +29 -0
- package/node_modules/qs/README.md +758 -0
- package/node_modules/qs/dist/qs.js +141 -0
- package/node_modules/qs/eslint.config.mjs +56 -0
- package/node_modules/qs/lib/formats.js +23 -0
- package/node_modules/qs/lib/index.js +11 -0
- package/node_modules/qs/lib/parse.js +373 -0
- package/node_modules/qs/lib/stringify.js +356 -0
- package/node_modules/qs/lib/utils.js +342 -0
- package/node_modules/qs/package.json +94 -0
- package/node_modules/qs/test/empty-keys-cases.js +267 -0
- package/node_modules/qs/test/parse.js +1654 -0
- package/node_modules/qs/test/stringify.js +1319 -0
- package/node_modules/qs/test/utils.js +432 -0
- package/node_modules/range-parser/HISTORY.md +56 -0
- package/node_modules/range-parser/LICENSE +23 -0
- package/node_modules/range-parser/README.md +84 -0
- package/node_modules/range-parser/index.js +162 -0
- package/node_modules/range-parser/package.json +44 -0
- package/node_modules/run-applescript/index.d.ts +66 -0
- package/node_modules/run-applescript/index.js +37 -0
- package/node_modules/run-applescript/license +9 -0
- package/node_modules/run-applescript/package.json +42 -0
- package/node_modules/run-applescript/readme.md +78 -0
- package/node_modules/safe-buffer/LICENSE +21 -0
- package/node_modules/safe-buffer/README.md +584 -0
- package/node_modules/safe-buffer/index.d.ts +187 -0
- package/node_modules/safe-buffer/index.js +65 -0
- package/node_modules/safe-buffer/package.json +51 -0
- package/node_modules/safer-buffer/LICENSE +21 -0
- package/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- package/node_modules/safer-buffer/Readme.md +156 -0
- package/node_modules/safer-buffer/dangerous.js +58 -0
- package/node_modules/safer-buffer/package.json +34 -0
- package/node_modules/safer-buffer/safer.js +77 -0
- package/node_modules/safer-buffer/tests.js +406 -0
- package/node_modules/setprototypeof/LICENSE +13 -0
- package/node_modules/setprototypeof/README.md +31 -0
- package/node_modules/setprototypeof/index.d.ts +2 -0
- package/node_modules/setprototypeof/index.js +17 -0
- package/node_modules/setprototypeof/package.json +38 -0
- package/node_modules/setprototypeof/test/index.js +24 -0
- package/node_modules/side-channel/.editorconfig +9 -0
- package/node_modules/side-channel/.eslintrc +12 -0
- package/node_modules/side-channel/.github/FUNDING.yml +12 -0
- package/node_modules/side-channel/.nycrc +13 -0
- package/node_modules/side-channel/CHANGELOG.md +110 -0
- package/node_modules/side-channel/LICENSE +21 -0
- package/node_modules/side-channel/README.md +61 -0
- package/node_modules/side-channel/index.d.ts +14 -0
- package/node_modules/side-channel/index.js +43 -0
- package/node_modules/side-channel/package.json +85 -0
- package/node_modules/side-channel/test/index.js +104 -0
- package/node_modules/side-channel/tsconfig.json +9 -0
- package/node_modules/side-channel-list/.editorconfig +9 -0
- package/node_modules/side-channel-list/.eslintrc +11 -0
- package/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- package/node_modules/side-channel-list/.nycrc +13 -0
- package/node_modules/side-channel-list/CHANGELOG.md +36 -0
- package/node_modules/side-channel-list/LICENSE +21 -0
- package/node_modules/side-channel-list/README.md +62 -0
- package/node_modules/side-channel-list/index.d.ts +13 -0
- package/node_modules/side-channel-list/index.js +111 -0
- package/node_modules/side-channel-list/list.d.ts +14 -0
- package/node_modules/side-channel-list/package.json +77 -0
- package/node_modules/side-channel-list/test/index.js +154 -0
- package/node_modules/side-channel-list/tsconfig.json +9 -0
- package/node_modules/side-channel-map/.editorconfig +9 -0
- package/node_modules/side-channel-map/.eslintrc +11 -0
- package/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- package/node_modules/side-channel-map/.nycrc +13 -0
- package/node_modules/side-channel-map/CHANGELOG.md +22 -0
- package/node_modules/side-channel-map/LICENSE +21 -0
- package/node_modules/side-channel-map/README.md +62 -0
- package/node_modules/side-channel-map/index.d.ts +15 -0
- package/node_modules/side-channel-map/index.js +68 -0
- package/node_modules/side-channel-map/package.json +80 -0
- package/node_modules/side-channel-map/test/index.js +114 -0
- package/node_modules/side-channel-map/tsconfig.json +9 -0
- package/node_modules/side-channel-weakmap/.editorconfig +9 -0
- package/node_modules/side-channel-weakmap/.eslintrc +12 -0
- package/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- package/node_modules/side-channel-weakmap/.nycrc +13 -0
- package/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- package/node_modules/side-channel-weakmap/LICENSE +21 -0
- package/node_modules/side-channel-weakmap/README.md +62 -0
- package/node_modules/side-channel-weakmap/index.d.ts +15 -0
- package/node_modules/side-channel-weakmap/index.js +84 -0
- package/node_modules/side-channel-weakmap/package.json +87 -0
- package/node_modules/side-channel-weakmap/test/index.js +114 -0
- package/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- package/node_modules/statuses/HISTORY.md +87 -0
- package/node_modules/statuses/LICENSE +23 -0
- package/node_modules/statuses/README.md +139 -0
- package/node_modules/statuses/codes.json +65 -0
- package/node_modules/statuses/index.js +146 -0
- package/node_modules/statuses/package.json +49 -0
- package/node_modules/toidentifier/HISTORY.md +9 -0
- package/node_modules/toidentifier/LICENSE +21 -0
- package/node_modules/toidentifier/README.md +61 -0
- package/node_modules/toidentifier/index.js +32 -0
- package/node_modules/toidentifier/package.json +38 -0
- package/node_modules/unpipe/HISTORY.md +4 -0
- package/node_modules/unpipe/LICENSE +22 -0
- package/node_modules/unpipe/README.md +43 -0
- package/node_modules/unpipe/index.js +69 -0
- package/node_modules/unpipe/package.json +27 -0
- package/node_modules/utils-merge/.npmignore +9 -0
- package/node_modules/utils-merge/LICENSE +20 -0
- package/node_modules/utils-merge/README.md +34 -0
- package/node_modules/utils-merge/index.js +23 -0
- package/node_modules/utils-merge/package.json +40 -0
- package/node_modules/vary/HISTORY.md +39 -0
- package/node_modules/vary/LICENSE +22 -0
- package/node_modules/vary/README.md +101 -0
- package/node_modules/vary/index.js +149 -0
- package/node_modules/vary/package.json +43 -0
- package/package.json +7 -2
- package/routes/edit.js +85 -13
- package/routes/edit.ts +94 -23
- package/routes/generate.js +118 -11
- package/routes/generate.ts +127 -10
- package/routes/grok.js +22 -0
- package/routes/grok.ts +24 -0
- package/routes/health.js +5 -0
- package/routes/health.ts +5 -0
- package/routes/index.js +4 -0
- package/routes/index.ts +4 -0
- package/routes/multimode.js +71 -26
- package/routes/multimode.ts +80 -39
- package/routes/nodes.js +88 -33
- package/routes/nodes.ts +97 -42
- package/routes/video.js +197 -0
- package/routes/video.ts +216 -0
- package/server.js +42 -1
- package/server.ts +34 -1
- package/skills/ima2/SKILL.md +27 -0
- package/ui/dist/.vite/manifest.json +12 -12
- package/ui/dist/assets/AgentWorkspace-c1_kEfFN.js +3 -0
- package/ui/dist/assets/{CardNewsWorkspace-BBLdwzYU.js → CardNewsWorkspace-CTBT3MbP.js} +2 -2
- package/ui/dist/assets/NodeCanvas-D3ecSAEi.js +7 -0
- package/ui/dist/assets/{PromptBuilderPanel-Y2VygFc0.js → PromptBuilderPanel-CqepukCN.js} +2 -2
- package/ui/dist/assets/{PromptImportDialog-C6lFV-LL.js → PromptImportDialog-Bvr8Q8P2.js} +2 -2
- package/ui/dist/assets/{PromptImportDiscoverySection-D8YJFhND.js → PromptImportDiscoverySection-CyZEXyWP.js} +1 -1
- package/ui/dist/assets/{PromptImportFolderSection-ywfcQolW.js → PromptImportFolderSection-CIl-_pyV.js} +1 -1
- package/ui/dist/assets/{PromptLibraryPanel-fk4KmrGy.js → PromptLibraryPanel-Bj23Q6l9.js} +2 -2
- package/ui/dist/assets/SettingsWorkspace-D_GqtEsP.js +1 -0
- package/ui/dist/assets/index-DMjgFXdO.css +1 -0
- package/ui/dist/assets/index-DQ6jg4Ui.js +32 -0
- package/ui/dist/assets/index-DtSBvfgp.js +1 -0
- package/ui/dist/index.html +2 -2
- package/vendor/progrok-0.1.0.tgz +0 -0
- package/ui/dist/assets/AgentWorkspace-BJe9yxPA.js +0 -3
- package/ui/dist/assets/NodeCanvas-BSZ527J4.js +0 -7
- package/ui/dist/assets/SettingsWorkspace-DL5vhAHQ.js +0 -1
- package/ui/dist/assets/index-BLx55BOg.js +0 -1
- package/ui/dist/assets/index-ByViUJfx.css +0 -1
- package/ui/dist/assets/index-Ci36vcFD.js +0 -28
|
@@ -0,0 +1,1142 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
import { Command as Command9 } from "commander";
|
|
5
|
+
|
|
6
|
+
// src/commands/login.ts
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
|
|
9
|
+
// src/auth/pkce.ts
|
|
10
|
+
import { randomBytes, createHash } from "crypto";
|
|
11
|
+
|
|
12
|
+
// src/auth/constants.ts
|
|
13
|
+
import { homedir } from "os";
|
|
14
|
+
import { join } from "path";
|
|
15
|
+
var XAI_OAUTH_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
|
|
16
|
+
var XAI_OAUTH_SCOPE = "openid profile email offline_access grok-cli:access api:access";
|
|
17
|
+
var XAI_OAUTH_ISSUER = "https://auth.x.ai";
|
|
18
|
+
var XAI_OAUTH_DISCOVERY_URL = `${XAI_OAUTH_ISSUER}/.well-known/openid-configuration`;
|
|
19
|
+
var XAI_OAUTH_CALLBACK_HOST = "127.0.0.1";
|
|
20
|
+
var XAI_OAUTH_CALLBACK_PORT = 56121;
|
|
21
|
+
var XAI_OAUTH_CALLBACK_PATH = "/callback";
|
|
22
|
+
var XAI_OAUTH_REDIRECT_URI = `http://${XAI_OAUTH_CALLBACK_HOST}:${XAI_OAUTH_CALLBACK_PORT}${XAI_OAUTH_CALLBACK_PATH}`;
|
|
23
|
+
var XAI_OAUTH_CORS_ORIGINS = ["auth.x.ai", "accounts.x.ai"];
|
|
24
|
+
var XAI_OAUTH_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
25
|
+
var XAI_OAUTH_FETCH_TIMEOUT_MS = 30 * 1e3;
|
|
26
|
+
var XAI_DEVICE_CODE_POLL_INTERVAL_MS = 5 * 1e3;
|
|
27
|
+
var TOKEN_REFRESH_SKEW_MS = 2 * 60 * 1e3;
|
|
28
|
+
var XAI_API_BASE_URL = "https://api.x.ai/v1";
|
|
29
|
+
var DEFAULT_MODEL = "grok-4.3";
|
|
30
|
+
var PROXY_DEFAULT_PORT = 18645;
|
|
31
|
+
var PROXY_DEFAULT_HOST = "127.0.0.1";
|
|
32
|
+
var CHAT_DEFAULT_PORT = 18646;
|
|
33
|
+
var CONFIG_DIR = join(homedir(), ".progrok");
|
|
34
|
+
var AUTH_FILE = join(CONFIG_DIR, "auth.json");
|
|
35
|
+
var CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
36
|
+
var GITHUB_REPO = "lidge-jun/progrok";
|
|
37
|
+
var GITHUB_URL = `https://github.com/${GITHUB_REPO}`;
|
|
38
|
+
|
|
39
|
+
// src/auth/discovery.ts
|
|
40
|
+
function requireTrustedEndpoint(url, label) {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = new URL(url);
|
|
43
|
+
if (parsed.protocol !== "https:") {
|
|
44
|
+
throw new Error("not HTTPS");
|
|
45
|
+
}
|
|
46
|
+
if (parsed.hostname !== "x.ai" && !parsed.hostname.endsWith(".x.ai")) {
|
|
47
|
+
throw new Error("not *.x.ai");
|
|
48
|
+
}
|
|
49
|
+
return url;
|
|
50
|
+
} catch {
|
|
51
|
+
throw new Error(`OIDC discovery returned untrusted ${label}: ${url}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function fetchOIDCDiscovery() {
|
|
55
|
+
const res = await fetch(XAI_OAUTH_DISCOVERY_URL, {
|
|
56
|
+
signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS)
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
throw new Error(`OIDC discovery failed: HTTP ${res.status}`);
|
|
60
|
+
}
|
|
61
|
+
const data = await res.json();
|
|
62
|
+
const authorizationEndpoint = requireTrustedEndpoint(
|
|
63
|
+
data.authorization_endpoint,
|
|
64
|
+
"authorization_endpoint"
|
|
65
|
+
);
|
|
66
|
+
const tokenEndpoint = requireTrustedEndpoint(
|
|
67
|
+
data.token_endpoint,
|
|
68
|
+
"token_endpoint"
|
|
69
|
+
);
|
|
70
|
+
const deviceAuthorizationEndpoint = data.device_authorization_endpoint ? requireTrustedEndpoint(
|
|
71
|
+
data.device_authorization_endpoint,
|
|
72
|
+
"device_authorization_endpoint"
|
|
73
|
+
) : void 0;
|
|
74
|
+
return { authorizationEndpoint, tokenEndpoint, deviceAuthorizationEndpoint };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/auth/callback-server.ts
|
|
78
|
+
import { createServer } from "http";
|
|
79
|
+
function startCallbackServer(expectedState) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
let server;
|
|
82
|
+
const timeout = setTimeout(() => {
|
|
83
|
+
server?.close();
|
|
84
|
+
reject(new Error("OAuth callback timed out (5 minutes)"));
|
|
85
|
+
}, XAI_OAUTH_TIMEOUT_MS);
|
|
86
|
+
server = createServer((req, res) => {
|
|
87
|
+
const url = new URL(
|
|
88
|
+
req.url || "/",
|
|
89
|
+
`http://${XAI_OAUTH_CALLBACK_HOST}`
|
|
90
|
+
);
|
|
91
|
+
if (req.method === "OPTIONS") {
|
|
92
|
+
const origin = req.headers.origin || "";
|
|
93
|
+
try {
|
|
94
|
+
const originHost = new URL(origin).hostname;
|
|
95
|
+
if (XAI_OAUTH_CORS_ORIGINS.includes(originHost)) {
|
|
96
|
+
res.writeHead(204, {
|
|
97
|
+
"Access-Control-Allow-Origin": origin,
|
|
98
|
+
"Access-Control-Allow-Methods": "GET",
|
|
99
|
+
"Access-Control-Allow-Headers": "Content-Type"
|
|
100
|
+
});
|
|
101
|
+
} else {
|
|
102
|
+
res.writeHead(204);
|
|
103
|
+
}
|
|
104
|
+
} catch {
|
|
105
|
+
res.writeHead(204);
|
|
106
|
+
}
|
|
107
|
+
res.end();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (url.pathname !== XAI_OAUTH_CALLBACK_PATH) {
|
|
111
|
+
res.writeHead(404);
|
|
112
|
+
res.end("Not found");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const code = url.searchParams.get("code");
|
|
116
|
+
const state = url.searchParams.get("state");
|
|
117
|
+
const error = url.searchParams.get("error");
|
|
118
|
+
if (error) {
|
|
119
|
+
const desc = url.searchParams.get("error_description") || error;
|
|
120
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
121
|
+
res.end(
|
|
122
|
+
`<html><body><h2>Login failed</h2><p>${desc}</p><p>You can close this tab.</p></body></html>`
|
|
123
|
+
);
|
|
124
|
+
clearTimeout(timeout);
|
|
125
|
+
server?.close();
|
|
126
|
+
reject(new Error(`OAuth error: ${desc}`));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!code || state !== expectedState) {
|
|
130
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
131
|
+
res.end("<html><body><h2>Invalid callback</h2></body></html>");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
135
|
+
res.end(
|
|
136
|
+
`<html><body style="font-family:system-ui;text-align:center;padding:60px"><h2>Logged in to progrok</h2><p>You can close this tab and return to the terminal.</p></body></html>`
|
|
137
|
+
);
|
|
138
|
+
clearTimeout(timeout);
|
|
139
|
+
server?.close();
|
|
140
|
+
resolve({ code, state });
|
|
141
|
+
});
|
|
142
|
+
server.listen(XAI_OAUTH_CALLBACK_PORT, XAI_OAUTH_CALLBACK_HOST, () => {
|
|
143
|
+
});
|
|
144
|
+
server.on("error", (err) => {
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
reject(new Error(`Callback server failed: ${err.message}`));
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/auth/token-store.ts
|
|
152
|
+
import {
|
|
153
|
+
readFileSync,
|
|
154
|
+
writeFileSync,
|
|
155
|
+
mkdirSync,
|
|
156
|
+
existsSync,
|
|
157
|
+
unlinkSync
|
|
158
|
+
} from "fs";
|
|
159
|
+
|
|
160
|
+
// src/utils/logger.ts
|
|
161
|
+
var RESET = "\x1B[0m";
|
|
162
|
+
var GREEN = "\x1B[32m";
|
|
163
|
+
var RED = "\x1B[31m";
|
|
164
|
+
var DIM = "\x1B[2m";
|
|
165
|
+
var BOLD = "\x1B[1m";
|
|
166
|
+
var log = {
|
|
167
|
+
info: (msg) => {
|
|
168
|
+
console.log(msg);
|
|
169
|
+
},
|
|
170
|
+
success: (msg) => {
|
|
171
|
+
console.log(`${GREEN}${msg}${RESET}`);
|
|
172
|
+
},
|
|
173
|
+
error: (msg) => {
|
|
174
|
+
console.error(`${RED}${msg}${RESET}`);
|
|
175
|
+
},
|
|
176
|
+
dim: (msg) => {
|
|
177
|
+
console.log(`${DIM}${msg}${RESET}`);
|
|
178
|
+
},
|
|
179
|
+
bold: (msg) => {
|
|
180
|
+
console.log(`${BOLD}${msg}${RESET}`);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
// src/auth/token-store.ts
|
|
185
|
+
function ensureConfigDir() {
|
|
186
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
187
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function saveTokens(input) {
|
|
191
|
+
ensureConfigDir();
|
|
192
|
+
const data = {
|
|
193
|
+
accessToken: input.accessToken,
|
|
194
|
+
refreshToken: input.refreshToken,
|
|
195
|
+
expiresAt: input.expiresIn ? Date.now() + input.expiresIn * 1e3 : void 0,
|
|
196
|
+
tokenEndpoint: input.tokenEndpoint,
|
|
197
|
+
idToken: input.idToken
|
|
198
|
+
};
|
|
199
|
+
if (input.idToken) {
|
|
200
|
+
try {
|
|
201
|
+
const parts = input.idToken.split(".");
|
|
202
|
+
if (parts[1]) {
|
|
203
|
+
const payload = JSON.parse(
|
|
204
|
+
Buffer.from(parts[1], "base64url").toString()
|
|
205
|
+
);
|
|
206
|
+
if (typeof payload.email === "string") {
|
|
207
|
+
data.email = payload.email;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} catch {
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 384 });
|
|
214
|
+
}
|
|
215
|
+
function loadTokens() {
|
|
216
|
+
try {
|
|
217
|
+
const raw = readFileSync(AUTH_FILE, "utf8");
|
|
218
|
+
return JSON.parse(raw);
|
|
219
|
+
} catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function deleteTokens() {
|
|
224
|
+
try {
|
|
225
|
+
unlinkSync(AUTH_FILE);
|
|
226
|
+
} catch {
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async function getValidBearer() {
|
|
230
|
+
const tokens = loadTokens();
|
|
231
|
+
if (!tokens?.accessToken) {
|
|
232
|
+
throw new Error("Not logged in. Run `progrok login` first.");
|
|
233
|
+
}
|
|
234
|
+
if (tokens.expiresAt && Date.now() + TOKEN_REFRESH_SKEW_MS >= tokens.expiresAt) {
|
|
235
|
+
if (!tokens.refreshToken || !tokens.tokenEndpoint) {
|
|
236
|
+
throw new Error(
|
|
237
|
+
"Token expired and no refresh token available. Run `progrok login` again."
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
log.dim("Refreshing access token...");
|
|
241
|
+
const res = await fetch(tokens.tokenEndpoint, {
|
|
242
|
+
method: "POST",
|
|
243
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
244
|
+
body: new URLSearchParams({
|
|
245
|
+
grant_type: "refresh_token",
|
|
246
|
+
client_id: XAI_OAUTH_CLIENT_ID,
|
|
247
|
+
refresh_token: tokens.refreshToken
|
|
248
|
+
}),
|
|
249
|
+
signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS)
|
|
250
|
+
});
|
|
251
|
+
if (!res.ok) {
|
|
252
|
+
throw new Error("Token refresh failed. Run `progrok login` again.");
|
|
253
|
+
}
|
|
254
|
+
const refreshed = await res.json();
|
|
255
|
+
if (typeof refreshed.access_token !== "string" || !refreshed.access_token) {
|
|
256
|
+
throw new Error(
|
|
257
|
+
"Token refresh returned invalid access_token. Run `progrok login` again."
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
await saveTokens({
|
|
261
|
+
accessToken: refreshed.access_token,
|
|
262
|
+
refreshToken: (typeof refreshed.refresh_token === "string" ? refreshed.refresh_token : void 0) || tokens.refreshToken,
|
|
263
|
+
expiresIn: typeof refreshed.expires_in === "number" ? refreshed.expires_in : void 0,
|
|
264
|
+
tokenEndpoint: tokens.tokenEndpoint
|
|
265
|
+
});
|
|
266
|
+
return refreshed.access_token;
|
|
267
|
+
}
|
|
268
|
+
return tokens.accessToken;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// src/utils/open-url.ts
|
|
272
|
+
import open from "open";
|
|
273
|
+
async function openUrl(url) {
|
|
274
|
+
try {
|
|
275
|
+
await open(url);
|
|
276
|
+
} catch {
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// src/auth/pkce.ts
|
|
281
|
+
function generatePKCE() {
|
|
282
|
+
const verifier = randomBytes(32).toString("hex");
|
|
283
|
+
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
284
|
+
return { verifier, challenge };
|
|
285
|
+
}
|
|
286
|
+
async function loginWithPKCE() {
|
|
287
|
+
const discovery = await fetchOIDCDiscovery();
|
|
288
|
+
const pkce = generatePKCE();
|
|
289
|
+
const state = randomBytes(16).toString("hex");
|
|
290
|
+
const authorizeUrl = new URL(discovery.authorizationEndpoint);
|
|
291
|
+
authorizeUrl.searchParams.set("client_id", XAI_OAUTH_CLIENT_ID);
|
|
292
|
+
authorizeUrl.searchParams.set("redirect_uri", XAI_OAUTH_REDIRECT_URI);
|
|
293
|
+
authorizeUrl.searchParams.set("response_type", "code");
|
|
294
|
+
authorizeUrl.searchParams.set("scope", XAI_OAUTH_SCOPE);
|
|
295
|
+
authorizeUrl.searchParams.set("state", state);
|
|
296
|
+
authorizeUrl.searchParams.set("code_challenge", pkce.challenge);
|
|
297
|
+
authorizeUrl.searchParams.set("code_challenge_method", "S256");
|
|
298
|
+
log.info("Opening browser for xAI login...");
|
|
299
|
+
log.dim(
|
|
300
|
+
`If the browser doesn't open, visit:
|
|
301
|
+
${authorizeUrl.toString()}`
|
|
302
|
+
);
|
|
303
|
+
const callbackPromise = startCallbackServer(state);
|
|
304
|
+
await openUrl(authorizeUrl.toString());
|
|
305
|
+
const { code } = await callbackPromise;
|
|
306
|
+
log.info("Exchanging authorization code...");
|
|
307
|
+
const tokenRes = await fetch(discovery.tokenEndpoint, {
|
|
308
|
+
method: "POST",
|
|
309
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
310
|
+
body: new URLSearchParams({
|
|
311
|
+
grant_type: "authorization_code",
|
|
312
|
+
client_id: XAI_OAUTH_CLIENT_ID,
|
|
313
|
+
code,
|
|
314
|
+
redirect_uri: XAI_OAUTH_REDIRECT_URI,
|
|
315
|
+
code_verifier: pkce.verifier
|
|
316
|
+
}),
|
|
317
|
+
signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS)
|
|
318
|
+
});
|
|
319
|
+
if (!tokenRes.ok) {
|
|
320
|
+
const err = await tokenRes.text();
|
|
321
|
+
throw new Error(`Token exchange failed: ${err}`);
|
|
322
|
+
}
|
|
323
|
+
const tokens = await tokenRes.json();
|
|
324
|
+
await saveTokens({
|
|
325
|
+
accessToken: tokens.access_token,
|
|
326
|
+
refreshToken: tokens.refresh_token,
|
|
327
|
+
expiresIn: tokens.expires_in,
|
|
328
|
+
idToken: tokens.id_token,
|
|
329
|
+
tokenEndpoint: discovery.tokenEndpoint
|
|
330
|
+
});
|
|
331
|
+
log.success("Logged in to xAI successfully!");
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// src/auth/device-code.ts
|
|
335
|
+
async function loginWithDeviceCode() {
|
|
336
|
+
const discovery = await fetchOIDCDiscovery();
|
|
337
|
+
if (!discovery.deviceAuthorizationEndpoint) {
|
|
338
|
+
throw new Error(
|
|
339
|
+
"xAI does not support device code flow via OIDC discovery"
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
log.info("Requesting device code...");
|
|
343
|
+
const dcRes = await fetch(discovery.deviceAuthorizationEndpoint, {
|
|
344
|
+
method: "POST",
|
|
345
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
346
|
+
body: new URLSearchParams({
|
|
347
|
+
client_id: XAI_OAUTH_CLIENT_ID,
|
|
348
|
+
scope: XAI_OAUTH_SCOPE
|
|
349
|
+
}),
|
|
350
|
+
signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS)
|
|
351
|
+
});
|
|
352
|
+
if (!dcRes.ok) {
|
|
353
|
+
throw new Error(`Device code request failed: ${await dcRes.text()}`);
|
|
354
|
+
}
|
|
355
|
+
const dc = await dcRes.json();
|
|
356
|
+
const url = dc.verification_uri_complete || dc.verification_uri;
|
|
357
|
+
log.info(`
|
|
358
|
+
Open this URL in your browser:
|
|
359
|
+
${url}
|
|
360
|
+
`);
|
|
361
|
+
log.info(`Enter code: ${dc.user_code}
|
|
362
|
+
`);
|
|
363
|
+
const intervalMs = Math.max(
|
|
364
|
+
(dc.interval || 5) * 1e3,
|
|
365
|
+
XAI_DEVICE_CODE_POLL_INTERVAL_MS
|
|
366
|
+
);
|
|
367
|
+
const deadline = Date.now() + dc.expires_in * 1e3;
|
|
368
|
+
while (Date.now() < deadline) {
|
|
369
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
370
|
+
const pollRes = await fetch(discovery.tokenEndpoint, {
|
|
371
|
+
method: "POST",
|
|
372
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
373
|
+
body: new URLSearchParams({
|
|
374
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
375
|
+
client_id: XAI_OAUTH_CLIENT_ID,
|
|
376
|
+
device_code: dc.device_code
|
|
377
|
+
}),
|
|
378
|
+
signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS)
|
|
379
|
+
});
|
|
380
|
+
if (pollRes.ok) {
|
|
381
|
+
const tokens = await pollRes.json();
|
|
382
|
+
await saveTokens({
|
|
383
|
+
accessToken: tokens.access_token,
|
|
384
|
+
refreshToken: tokens.refresh_token,
|
|
385
|
+
expiresIn: tokens.expires_in,
|
|
386
|
+
idToken: tokens.id_token,
|
|
387
|
+
tokenEndpoint: discovery.tokenEndpoint
|
|
388
|
+
});
|
|
389
|
+
log.success("Logged in to xAI successfully!");
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
const err = await pollRes.json();
|
|
393
|
+
if (err.error === "authorization_pending") continue;
|
|
394
|
+
if (err.error === "slow_down") {
|
|
395
|
+
await new Promise((r) => setTimeout(r, 5e3));
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
throw new Error(
|
|
399
|
+
`Device code poll failed: ${err.error_description || err.error}`
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
throw new Error("Device code expired. Please try again.");
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// src/commands/login.ts
|
|
406
|
+
function loginCommand() {
|
|
407
|
+
const cmd = new Command("login").description(
|
|
408
|
+
`Log in to xAI via OAuth (SuperGrok subscription required).
|
|
409
|
+
Default: PKCE flow \u2014 opens browser, callback on 127.0.0.1:56121.
|
|
410
|
+
Remote: --device-code \u2014 displays URL + code for manual entry.
|
|
411
|
+
Tokens saved to ~/.progrok/auth.json, auto-refreshed before expiry.`
|
|
412
|
+
).option(
|
|
413
|
+
"--device-code",
|
|
414
|
+
"Use device code flow (for SSH/remote environments)"
|
|
415
|
+
).action(async (opts) => {
|
|
416
|
+
try {
|
|
417
|
+
if (opts.deviceCode) {
|
|
418
|
+
await loginWithDeviceCode();
|
|
419
|
+
} else {
|
|
420
|
+
await loginWithPKCE();
|
|
421
|
+
}
|
|
422
|
+
} catch (err) {
|
|
423
|
+
log.error(err.message);
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
return cmd;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// src/commands/logout.ts
|
|
431
|
+
import { Command as Command2 } from "commander";
|
|
432
|
+
function logoutCommand() {
|
|
433
|
+
return new Command2("logout").description("Remove stored xAI credentials").action(() => {
|
|
434
|
+
deleteTokens();
|
|
435
|
+
log.success("Logged out. Credentials removed.");
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// src/commands/proxy.ts
|
|
440
|
+
import { Command as Command3 } from "commander";
|
|
441
|
+
|
|
442
|
+
// src/proxy/server.ts
|
|
443
|
+
import express from "express";
|
|
444
|
+
var HOP_BY_HOP = /* @__PURE__ */ new Set([
|
|
445
|
+
"host",
|
|
446
|
+
"content-length",
|
|
447
|
+
"connection",
|
|
448
|
+
"keep-alive",
|
|
449
|
+
"proxy-authenticate",
|
|
450
|
+
"proxy-authorization",
|
|
451
|
+
"te",
|
|
452
|
+
"trailers",
|
|
453
|
+
"transfer-encoding",
|
|
454
|
+
"upgrade",
|
|
455
|
+
"authorization"
|
|
456
|
+
]);
|
|
457
|
+
function filterHeaders(headers) {
|
|
458
|
+
const out = {};
|
|
459
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
460
|
+
if (!HOP_BY_HOP.has(key.toLowerCase()) && value) {
|
|
461
|
+
out[key] = Array.isArray(value) ? value[0] : value;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return out;
|
|
465
|
+
}
|
|
466
|
+
function createProxyApp() {
|
|
467
|
+
const app = express();
|
|
468
|
+
app.get("/health", (_req, res) => {
|
|
469
|
+
res.json({ status: "ok", upstream: "xAI Grok", proxy: "progrok" });
|
|
470
|
+
});
|
|
471
|
+
app.all("/v1/*", (req, res) => {
|
|
472
|
+
void handleProxy(req, res);
|
|
473
|
+
});
|
|
474
|
+
return app;
|
|
475
|
+
}
|
|
476
|
+
async function handleProxy(req, res) {
|
|
477
|
+
const relPath = req.path.replace(/^\/v1/, "");
|
|
478
|
+
let bearer;
|
|
479
|
+
try {
|
|
480
|
+
bearer = await getValidBearer();
|
|
481
|
+
} catch (err) {
|
|
482
|
+
res.status(401).json({
|
|
483
|
+
error: { message: err.message, type: "auth_error" }
|
|
484
|
+
});
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
const chunks = [];
|
|
488
|
+
for await (const chunk of req) {
|
|
489
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
490
|
+
}
|
|
491
|
+
const body = Buffer.concat(chunks);
|
|
492
|
+
const qs = req.url.includes("?") ? "?" + req.url.split("?")[1] : "";
|
|
493
|
+
const upstreamUrl = `${XAI_API_BASE_URL}${relPath}${qs}`;
|
|
494
|
+
const fwdHeaders = filterHeaders(
|
|
495
|
+
req.headers
|
|
496
|
+
);
|
|
497
|
+
fwdHeaders["Authorization"] = `Bearer ${bearer}`;
|
|
498
|
+
try {
|
|
499
|
+
const upstream = await fetch(upstreamUrl, {
|
|
500
|
+
method: req.method,
|
|
501
|
+
headers: fwdHeaders,
|
|
502
|
+
body: body.length > 0 ? body : void 0
|
|
503
|
+
});
|
|
504
|
+
res.status(upstream.status);
|
|
505
|
+
for (const [key, value] of upstream.headers) {
|
|
506
|
+
const lower = key.toLowerCase();
|
|
507
|
+
if (!HOP_BY_HOP.has(lower) && lower !== "content-encoding" && lower !== "content-length") {
|
|
508
|
+
res.setHeader(key, value);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
if (upstream.body) {
|
|
512
|
+
const reader = upstream.body.getReader();
|
|
513
|
+
try {
|
|
514
|
+
for (; ; ) {
|
|
515
|
+
const { done, value } = await reader.read();
|
|
516
|
+
if (done) break;
|
|
517
|
+
res.write(value);
|
|
518
|
+
}
|
|
519
|
+
} catch {
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
res.end();
|
|
523
|
+
} catch (err) {
|
|
524
|
+
if (!res.headersSent) {
|
|
525
|
+
res.status(502).json({
|
|
526
|
+
error: {
|
|
527
|
+
message: `Upstream error: ${err.message}`,
|
|
528
|
+
type: "upstream_error"
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
async function startProxy(port = PROXY_DEFAULT_PORT, host = PROXY_DEFAULT_HOST) {
|
|
535
|
+
const app = createProxyApp();
|
|
536
|
+
return new Promise((resolve, reject) => {
|
|
537
|
+
const server = app.listen(port, host, () => {
|
|
538
|
+
log.success("progrok proxy running");
|
|
539
|
+
log.info(` Listening: http://${host}:${port}/v1`);
|
|
540
|
+
log.info(` Forwarding: ${XAI_API_BASE_URL}`);
|
|
541
|
+
log.dim(
|
|
542
|
+
" Client auth: any bearer token (proxy injects your OAuth credential)"
|
|
543
|
+
);
|
|
544
|
+
log.info("\nPress Ctrl+C to stop.\n");
|
|
545
|
+
resolve();
|
|
546
|
+
});
|
|
547
|
+
server.on("error", (err) => {
|
|
548
|
+
reject(new Error(`Proxy failed to start: ${err.message}`));
|
|
549
|
+
});
|
|
550
|
+
process.on("SIGINT", () => {
|
|
551
|
+
log.info("\nprogrok proxy stopped.");
|
|
552
|
+
server.close();
|
|
553
|
+
process.exit(0);
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// src/commands/proxy.ts
|
|
559
|
+
function proxyCommand() {
|
|
560
|
+
return new Command3("proxy").description(
|
|
561
|
+
`Start OpenAI-compatible proxy server for Grok.
|
|
562
|
+
Forwards ALL /v1/* requests to api.x.ai with your OAuth token injected.
|
|
563
|
+
Any client (curl, OpenAI SDK, LangChain, etc.) can connect \u2014 no API key needed.
|
|
564
|
+
Supports streaming (SSE), multipart (stt), and binary responses (tts).`
|
|
565
|
+
).option("-p, --port <port>", "Port number", String(PROXY_DEFAULT_PORT)).option("--host <host>", "Host to bind", PROXY_DEFAULT_HOST).action(async (opts) => {
|
|
566
|
+
const tokens = loadTokens();
|
|
567
|
+
if (!tokens?.accessToken) {
|
|
568
|
+
log.error("Not logged in. Run `progrok login` first.");
|
|
569
|
+
process.exit(1);
|
|
570
|
+
}
|
|
571
|
+
try {
|
|
572
|
+
await startProxy(parseInt(opts.port, 10), opts.host);
|
|
573
|
+
await new Promise(() => {
|
|
574
|
+
});
|
|
575
|
+
} catch (err) {
|
|
576
|
+
log.error(err.message);
|
|
577
|
+
process.exit(1);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// src/commands/chat.ts
|
|
583
|
+
import { Command as Command4 } from "commander";
|
|
584
|
+
|
|
585
|
+
// src/chat/server.ts
|
|
586
|
+
import express2 from "express";
|
|
587
|
+
import { join as join2, dirname } from "path";
|
|
588
|
+
import { fileURLToPath } from "url";
|
|
589
|
+
var __dirname = dirname(fileURLToPath(import.meta.url));
|
|
590
|
+
async function startChat(port = CHAT_DEFAULT_PORT, host = PROXY_DEFAULT_HOST) {
|
|
591
|
+
const app = createProxyApp();
|
|
592
|
+
const publicDir = join2(__dirname, "public");
|
|
593
|
+
app.use(express2.static(publicDir));
|
|
594
|
+
app.get("/", (_req, res) => {
|
|
595
|
+
res.sendFile(join2(publicDir, "index.html"));
|
|
596
|
+
});
|
|
597
|
+
return new Promise((resolve, reject) => {
|
|
598
|
+
const server = app.listen(port, host, () => {
|
|
599
|
+
const url = `http://${host}:${port}`;
|
|
600
|
+
log.success(`progrok chat running at ${url}`);
|
|
601
|
+
log.dim(`Proxy also available at ${url}/v1`);
|
|
602
|
+
log.info("Press Ctrl+C to stop.\n");
|
|
603
|
+
void openUrl(url);
|
|
604
|
+
resolve();
|
|
605
|
+
});
|
|
606
|
+
server.on("error", (err) => {
|
|
607
|
+
reject(new Error(`Chat server failed: ${err.message}`));
|
|
608
|
+
});
|
|
609
|
+
process.on("SIGINT", () => {
|
|
610
|
+
log.info("\nprogrok chat stopped.");
|
|
611
|
+
server.close();
|
|
612
|
+
process.exit(0);
|
|
613
|
+
});
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// src/commands/chat.ts
|
|
618
|
+
function chatCommand() {
|
|
619
|
+
return new Command4("chat").description(
|
|
620
|
+
`Open Grok chat in your browser.
|
|
621
|
+
Starts a web UI + proxy server on the same port.
|
|
622
|
+
Features: sessions, markdown, code highlighting, tool results, model switching.
|
|
623
|
+
Proxy is also available at the same port under /v1/*.`
|
|
624
|
+
).option("-p, --port <port>", "Port number", String(CHAT_DEFAULT_PORT)).option("--host <host>", "Host to bind", PROXY_DEFAULT_HOST).action(async (opts) => {
|
|
625
|
+
const tokens = loadTokens();
|
|
626
|
+
if (!tokens?.accessToken) {
|
|
627
|
+
log.error("Not logged in. Run `progrok login` first.");
|
|
628
|
+
process.exit(1);
|
|
629
|
+
}
|
|
630
|
+
try {
|
|
631
|
+
await startChat(parseInt(opts.port, 10), opts.host);
|
|
632
|
+
await new Promise(() => {
|
|
633
|
+
});
|
|
634
|
+
} catch (err) {
|
|
635
|
+
log.error(err.message);
|
|
636
|
+
process.exit(1);
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// src/commands/models.ts
|
|
642
|
+
import { Command as Command5 } from "commander";
|
|
643
|
+
function formatPrice(ticks) {
|
|
644
|
+
if (!ticks) return "-";
|
|
645
|
+
return `$${(ticks / 1e4).toFixed(2)}`;
|
|
646
|
+
}
|
|
647
|
+
function modelsCommand() {
|
|
648
|
+
return new Command5("models").description("List available Grok models").option("--detail", "Show pricing and aliases from /v1/language-models").action(async (opts) => {
|
|
649
|
+
try {
|
|
650
|
+
const bearer = await getValidBearer();
|
|
651
|
+
if (opts.detail) {
|
|
652
|
+
const res2 = await fetch(`${XAI_API_BASE_URL}/language-models`, {
|
|
653
|
+
headers: { Authorization: `Bearer ${bearer}` }
|
|
654
|
+
});
|
|
655
|
+
if (!res2.ok) throw new Error(`HTTP ${res2.status}`);
|
|
656
|
+
const data2 = await res2.json();
|
|
657
|
+
log.info("Grok Models (detailed)\n");
|
|
658
|
+
for (const m of data2.models) {
|
|
659
|
+
const input = (m.input_modalities || []).join(", ");
|
|
660
|
+
const inPrice = formatPrice(m.prompt_text_token_price);
|
|
661
|
+
const outPrice = formatPrice(m.completion_text_token_price);
|
|
662
|
+
console.log(` ${m.id}`);
|
|
663
|
+
console.log(` Input: ${input} | Price: ${inPrice}/1M in, ${outPrice}/1M out`);
|
|
664
|
+
if (m.aliases && m.aliases.length > 0) {
|
|
665
|
+
console.log(` Aliases: ${m.aliases.slice(0, 5).join(", ")}${m.aliases.length > 5 ? ` (+${m.aliases.length - 5} more)` : ""}`);
|
|
666
|
+
}
|
|
667
|
+
console.log();
|
|
668
|
+
}
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
const res = await fetch(`${XAI_API_BASE_URL}/models`, {
|
|
672
|
+
headers: { Authorization: `Bearer ${bearer}` }
|
|
673
|
+
});
|
|
674
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
675
|
+
const data = await res.json();
|
|
676
|
+
log.info("Available Grok models:\n");
|
|
677
|
+
for (const m of data.data) {
|
|
678
|
+
const tag = m.id.includes("reasoning") ? " [reasoning]" : m.id.includes("non-reasoning") ? " [fast]" : m.id.includes("build") || m.id.includes("code") ? " [code]" : m.id.includes("imagine-video") ? " [video]" : m.id.includes("imagine") ? " [image]" : "";
|
|
679
|
+
console.log(` ${m.id}${tag}`);
|
|
680
|
+
}
|
|
681
|
+
log.dim("\n Use --detail for pricing and aliases");
|
|
682
|
+
} catch (err) {
|
|
683
|
+
log.error(err.message);
|
|
684
|
+
process.exit(1);
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// src/commands/status.ts
|
|
690
|
+
import { Command as Command6 } from "commander";
|
|
691
|
+
function statusCommand() {
|
|
692
|
+
return new Command6("status").description("Show authentication status").action(() => {
|
|
693
|
+
const tokens = loadTokens();
|
|
694
|
+
if (!tokens?.accessToken) {
|
|
695
|
+
log.info("Status: Not logged in");
|
|
696
|
+
log.dim("Run `progrok login` to authenticate.");
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
const expired = tokens.expiresAt !== void 0 && Date.now() >= tokens.expiresAt;
|
|
700
|
+
const hasRefresh = !!tokens.refreshToken;
|
|
701
|
+
log.info("Status: Logged in");
|
|
702
|
+
if (tokens.email) log.info(` Account: ${tokens.email}`);
|
|
703
|
+
if (tokens.expiresAt) {
|
|
704
|
+
const remaining = Math.max(
|
|
705
|
+
0,
|
|
706
|
+
Math.floor((tokens.expiresAt - Date.now()) / 6e4)
|
|
707
|
+
);
|
|
708
|
+
log.info(
|
|
709
|
+
` Token: ${expired ? "expired" : `valid (${remaining} min remaining)`}`
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
log.info(` Refresh: ${hasRefresh ? "available" : "none"}`);
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// src/commands/skill.ts
|
|
717
|
+
import { Command as Command7 } from "commander";
|
|
718
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
719
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
720
|
+
import { dirname as dirname2, join as join3, relative } from "path";
|
|
721
|
+
var ROOT = join3(dirname2(fileURLToPath2(import.meta.url)), "..");
|
|
722
|
+
var SKILL_PATH = join3(ROOT, "skills", "progrok", "SKILL.md");
|
|
723
|
+
var PACKAGE_PATH = join3(ROOT, "package.json");
|
|
724
|
+
function readPackageVersion() {
|
|
725
|
+
try {
|
|
726
|
+
const pkg = JSON.parse(readFileSync2(PACKAGE_PATH, "utf-8"));
|
|
727
|
+
return pkg.version || "?";
|
|
728
|
+
} catch {
|
|
729
|
+
return "?";
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
function readSkill() {
|
|
733
|
+
if (!existsSync2(SKILL_PATH)) {
|
|
734
|
+
console.error(`packaged skill not found: ${SKILL_PATH}`);
|
|
735
|
+
process.exit(5);
|
|
736
|
+
}
|
|
737
|
+
return readFileSync2(SKILL_PATH, "utf-8");
|
|
738
|
+
}
|
|
739
|
+
function skillCommand() {
|
|
740
|
+
return new Command7("skill").description(
|
|
741
|
+
`Print the packaged progrok Markdown skill for agents.
|
|
742
|
+
Designed to be piped into agent context or read programmatically.`
|
|
743
|
+
).argument("[subcommand]", '"path" to print the resolved skill file path').option("--json", "Output as JSON wrapper around the Markdown skill").action((subcommand2, opts) => {
|
|
744
|
+
if (subcommand2 === "path") {
|
|
745
|
+
console.log(SKILL_PATH);
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
const content = readSkill();
|
|
749
|
+
if (opts.json) {
|
|
750
|
+
console.log(
|
|
751
|
+
JSON.stringify(
|
|
752
|
+
{
|
|
753
|
+
name: "progrok",
|
|
754
|
+
format: "markdown-skill",
|
|
755
|
+
formatVersion: "1",
|
|
756
|
+
packageVersion: readPackageVersion(),
|
|
757
|
+
path: relative(ROOT, SKILL_PATH),
|
|
758
|
+
source: "package",
|
|
759
|
+
content
|
|
760
|
+
},
|
|
761
|
+
null,
|
|
762
|
+
2
|
|
763
|
+
)
|
|
764
|
+
);
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
console.log(content.replace(/\n$/, ""));
|
|
768
|
+
});
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// src/commands/capabilities.ts
|
|
772
|
+
import { Command as Command8 } from "commander";
|
|
773
|
+
import { readFileSync as readFileSync3 } from "fs";
|
|
774
|
+
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
775
|
+
import { dirname as dirname3, join as join4 } from "path";
|
|
776
|
+
var ROOT2 = join4(dirname3(fileURLToPath3(import.meta.url)), "..");
|
|
777
|
+
function readPackageVersion2() {
|
|
778
|
+
try {
|
|
779
|
+
const pkg = JSON.parse(
|
|
780
|
+
readFileSync3(join4(ROOT2, "package.json"), "utf-8")
|
|
781
|
+
);
|
|
782
|
+
return pkg.version || "?";
|
|
783
|
+
} catch {
|
|
784
|
+
return "?";
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
function buildCapabilities() {
|
|
788
|
+
return {
|
|
789
|
+
ok: true,
|
|
790
|
+
name: "progrok",
|
|
791
|
+
version: readPackageVersion2(),
|
|
792
|
+
source: "local",
|
|
793
|
+
upstream: XAI_API_BASE_URL,
|
|
794
|
+
commands: [
|
|
795
|
+
"login",
|
|
796
|
+
"logout",
|
|
797
|
+
"proxy",
|
|
798
|
+
"chat",
|
|
799
|
+
"models",
|
|
800
|
+
"status",
|
|
801
|
+
"skill",
|
|
802
|
+
"capabilities"
|
|
803
|
+
],
|
|
804
|
+
proxy: {
|
|
805
|
+
host: PROXY_DEFAULT_HOST,
|
|
806
|
+
port: PROXY_DEFAULT_PORT,
|
|
807
|
+
baseUrl: `http://${PROXY_DEFAULT_HOST}:${PROXY_DEFAULT_PORT}/v1`,
|
|
808
|
+
forwarding: "all /v1/* paths \u2014 no whitelist"
|
|
809
|
+
},
|
|
810
|
+
chat: {
|
|
811
|
+
port: CHAT_DEFAULT_PORT,
|
|
812
|
+
url: `http://${PROXY_DEFAULT_HOST}:${CHAT_DEFAULT_PORT}`
|
|
813
|
+
},
|
|
814
|
+
defaults: {
|
|
815
|
+
model: DEFAULT_MODEL
|
|
816
|
+
},
|
|
817
|
+
endpoints: [
|
|
818
|
+
{
|
|
819
|
+
path: "/v1/responses",
|
|
820
|
+
method: "POST",
|
|
821
|
+
type: "streaming",
|
|
822
|
+
description: "Responses API \u2014 tools, reasoning, citations"
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
path: "/v1/chat/completions",
|
|
826
|
+
method: "POST",
|
|
827
|
+
type: "streaming",
|
|
828
|
+
description: "OpenAI-compatible chat"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
path: "/v1/models",
|
|
832
|
+
method: "GET",
|
|
833
|
+
type: "sync",
|
|
834
|
+
description: "List models"
|
|
835
|
+
},
|
|
836
|
+
{
|
|
837
|
+
path: "/v1/language-models",
|
|
838
|
+
method: "GET",
|
|
839
|
+
type: "sync",
|
|
840
|
+
description: "Detailed models: pricing, aliases, modalities"
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
path: "/v1/images/generations",
|
|
844
|
+
method: "POST",
|
|
845
|
+
type: "sync",
|
|
846
|
+
description: "Image generation (returns URL)"
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
path: "/v1/videos/generations",
|
|
850
|
+
method: "POST",
|
|
851
|
+
type: "async",
|
|
852
|
+
description: "Video generation (returns request_id)"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
path: "/v1/videos/{id}",
|
|
856
|
+
method: "GET",
|
|
857
|
+
type: "poll",
|
|
858
|
+
description: "Video status: pending \u2192 done"
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
path: "/v1/tts",
|
|
862
|
+
method: "POST",
|
|
863
|
+
type: "binary",
|
|
864
|
+
description: "Text-to-speech (MP3)"
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
path: "/v1/stt",
|
|
868
|
+
method: "POST",
|
|
869
|
+
type: "multipart",
|
|
870
|
+
description: "Speech-to-text"
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
path: "/v1/embeddings",
|
|
874
|
+
method: "POST",
|
|
875
|
+
type: "sync",
|
|
876
|
+
description: "Text embeddings"
|
|
877
|
+
},
|
|
878
|
+
{
|
|
879
|
+
path: "/v1/*",
|
|
880
|
+
method: "*",
|
|
881
|
+
type: "passthrough",
|
|
882
|
+
description: "All paths forwarded to api.x.ai"
|
|
883
|
+
}
|
|
884
|
+
],
|
|
885
|
+
models: [
|
|
886
|
+
{
|
|
887
|
+
id: "grok-4.3",
|
|
888
|
+
type: "reasoning",
|
|
889
|
+
use: "General chat, analysis, search",
|
|
890
|
+
input: ["text", "image"],
|
|
891
|
+
context: "1M tokens",
|
|
892
|
+
reasoning: {
|
|
893
|
+
effort: ["none", "low", "medium", "high"],
|
|
894
|
+
default: "low",
|
|
895
|
+
note: "none disables reasoning entirely for instant responses"
|
|
896
|
+
},
|
|
897
|
+
structuredOutput: true,
|
|
898
|
+
functionCalling: true,
|
|
899
|
+
tools: ["web_search", "x_search", "code_interpreter", "file_search"]
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
id: "grok-4.20-0309-reasoning",
|
|
903
|
+
type: "deep-reasoning",
|
|
904
|
+
use: "Complex coding, planning",
|
|
905
|
+
input: ["text", "image"],
|
|
906
|
+
context: "128K standard, long-context above",
|
|
907
|
+
reasoning: {
|
|
908
|
+
effort: ["low", "medium", "high"],
|
|
909
|
+
default: "low"
|
|
910
|
+
},
|
|
911
|
+
structuredOutput: true,
|
|
912
|
+
functionCalling: true,
|
|
913
|
+
tools: ["web_search", "x_search"]
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
id: "grok-4.20-0309-non-reasoning",
|
|
917
|
+
type: "fast",
|
|
918
|
+
use: "Quick tasks, no thinking overhead",
|
|
919
|
+
input: ["text", "image"],
|
|
920
|
+
context: "128K standard, long-context above",
|
|
921
|
+
reasoning: false,
|
|
922
|
+
structuredOutput: true,
|
|
923
|
+
functionCalling: true,
|
|
924
|
+
tools: ["web_search", "x_search"]
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
id: "grok-4.20-multi-agent-0309",
|
|
928
|
+
type: "multi-agent",
|
|
929
|
+
use: "Deep research (4 or 16 parallel agents)",
|
|
930
|
+
input: ["text", "image"],
|
|
931
|
+
context: "128K standard",
|
|
932
|
+
reasoning: {
|
|
933
|
+
effort: ["low", "medium", "high", "xhigh"],
|
|
934
|
+
default: "medium",
|
|
935
|
+
note: "Controls agent count, not reasoning depth. low/medium=4 agents, high/xhigh=16 agents."
|
|
936
|
+
},
|
|
937
|
+
structuredOutput: true,
|
|
938
|
+
functionCalling: true,
|
|
939
|
+
tools: ["web_search", "x_search"],
|
|
940
|
+
multiAgent: {
|
|
941
|
+
agentCount: [4, 16],
|
|
942
|
+
effortToAgents: { low: 4, medium: 4, high: 16, xhigh: 16 },
|
|
943
|
+
perAgentConfig: false
|
|
944
|
+
}
|
|
945
|
+
},
|
|
946
|
+
{
|
|
947
|
+
id: "grok-build-0.1",
|
|
948
|
+
type: "code",
|
|
949
|
+
use: "Code generation, agentic coding",
|
|
950
|
+
input: ["text", "image"],
|
|
951
|
+
context: "256K tokens",
|
|
952
|
+
reasoning: {
|
|
953
|
+
effort: ["low", "medium", "high"],
|
|
954
|
+
default: "low"
|
|
955
|
+
},
|
|
956
|
+
structuredOutput: false,
|
|
957
|
+
functionCalling: false,
|
|
958
|
+
tools: []
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
id: "grok-imagine-image",
|
|
962
|
+
type: "image",
|
|
963
|
+
use: "Fast image gen",
|
|
964
|
+
input: ["text"],
|
|
965
|
+
reasoning: false,
|
|
966
|
+
structuredOutput: false,
|
|
967
|
+
functionCalling: false,
|
|
968
|
+
tools: []
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
id: "grok-imagine-image-quality",
|
|
972
|
+
type: "image-hq",
|
|
973
|
+
use: "High-quality image gen",
|
|
974
|
+
input: ["text"],
|
|
975
|
+
reasoning: false,
|
|
976
|
+
structuredOutput: false,
|
|
977
|
+
functionCalling: false,
|
|
978
|
+
tools: []
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
id: "grok-imagine-video",
|
|
982
|
+
type: "video",
|
|
983
|
+
use: "Video gen (async)",
|
|
984
|
+
input: ["text"],
|
|
985
|
+
reasoning: false,
|
|
986
|
+
structuredOutput: false,
|
|
987
|
+
functionCalling: false,
|
|
988
|
+
tools: []
|
|
989
|
+
}
|
|
990
|
+
],
|
|
991
|
+
tools: [
|
|
992
|
+
{ type: "web_search", description: "Web search with citations" },
|
|
993
|
+
{ type: "x_search", description: "X (Twitter) search with citations" },
|
|
994
|
+
{
|
|
995
|
+
type: "code_interpreter",
|
|
996
|
+
description: "Server-side code execution"
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
type: "file_search",
|
|
1000
|
+
description: "Vector store search (needs vector_store_ids)"
|
|
1001
|
+
},
|
|
1002
|
+
{ type: "function", description: "Custom function calling" }
|
|
1003
|
+
],
|
|
1004
|
+
guidance: {
|
|
1005
|
+
auth: "Run progrok login once. No API key needed \u2014 OAuth only.",
|
|
1006
|
+
proxy: "progrok proxy forwards all /v1/* paths. Set OPENAI_BASE_URL=http://127.0.0.1:18645/v1 and OPENAI_API_KEY=anything.",
|
|
1007
|
+
streaming: "Use stream:true for responses/chat. Proxy passes through SSE events verbatim.",
|
|
1008
|
+
video: "Video gen is async: POST /v1/videos/generations \u2192 poll GET /v1/videos/{id} until done."
|
|
1009
|
+
}
|
|
1010
|
+
};
|
|
1011
|
+
}
|
|
1012
|
+
function printText(cap) {
|
|
1013
|
+
console.log(`progrok capabilities (${cap.source})`);
|
|
1014
|
+
console.log(`version: ${cap.version}`);
|
|
1015
|
+
console.log(`upstream: ${cap.upstream}`);
|
|
1016
|
+
console.log("");
|
|
1017
|
+
console.log(`proxy: ${cap.proxy.baseUrl}`);
|
|
1018
|
+
console.log(`chat: ${cap.chat.url}`);
|
|
1019
|
+
console.log(`model: ${cap.defaults.model}`);
|
|
1020
|
+
console.log("");
|
|
1021
|
+
console.log("endpoints:");
|
|
1022
|
+
for (const ep of cap.endpoints) {
|
|
1023
|
+
const label = ` ${ep.method.padEnd(5)} ${ep.path.padEnd(28)}`;
|
|
1024
|
+
console.log(`${label} ${ep.description}`);
|
|
1025
|
+
}
|
|
1026
|
+
console.log("");
|
|
1027
|
+
console.log("models:");
|
|
1028
|
+
for (const m of cap.models) {
|
|
1029
|
+
console.log(` ${m.id.padEnd(38)} ${m.use}`);
|
|
1030
|
+
}
|
|
1031
|
+
console.log("");
|
|
1032
|
+
console.log("tools:");
|
|
1033
|
+
for (const t of cap.tools) {
|
|
1034
|
+
console.log(` ${t.type.padEnd(20)} ${t.description}`);
|
|
1035
|
+
}
|
|
1036
|
+
console.log("");
|
|
1037
|
+
console.log(`commands: ${cap.commands.join(", ")}`);
|
|
1038
|
+
}
|
|
1039
|
+
function capabilitiesCommand() {
|
|
1040
|
+
return new Command8("capabilities").description("Print agent-friendly capability metadata.").option("--json", "Output as JSON").action((opts) => {
|
|
1041
|
+
const cap = buildCapabilities();
|
|
1042
|
+
if (opts.json) {
|
|
1043
|
+
console.log(JSON.stringify(cap, null, 2));
|
|
1044
|
+
} else {
|
|
1045
|
+
printText(cap);
|
|
1046
|
+
}
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// src/utils/config.ts
|
|
1051
|
+
import {
|
|
1052
|
+
readFileSync as readFileSync4,
|
|
1053
|
+
writeFileSync as writeFileSync2,
|
|
1054
|
+
existsSync as existsSync3,
|
|
1055
|
+
mkdirSync as mkdirSync2
|
|
1056
|
+
} from "fs";
|
|
1057
|
+
function ensureConfigDir2() {
|
|
1058
|
+
if (!existsSync3(CONFIG_DIR)) {
|
|
1059
|
+
mkdirSync2(CONFIG_DIR, { recursive: true, mode: 448 });
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
function readConfig() {
|
|
1063
|
+
try {
|
|
1064
|
+
return JSON.parse(readFileSync4(CONFIG_FILE, "utf8"));
|
|
1065
|
+
} catch {
|
|
1066
|
+
return {};
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
function writeConfig(config) {
|
|
1070
|
+
ensureConfigDir2();
|
|
1071
|
+
writeFileSync2(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 384 });
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
// src/utils/star-prompt.ts
|
|
1075
|
+
async function showStarPrompt() {
|
|
1076
|
+
const config = readConfig();
|
|
1077
|
+
if (config.onboarding?.starPrompted) return;
|
|
1078
|
+
log.dim("\u2500".repeat(50));
|
|
1079
|
+
log.info("\u2B50 If progrok is useful, star the repo!");
|
|
1080
|
+
log.dim(` ${GITHUB_URL}`);
|
|
1081
|
+
log.dim("\u2500".repeat(50) + "\n");
|
|
1082
|
+
writeConfig({
|
|
1083
|
+
...config,
|
|
1084
|
+
onboarding: { ...config.onboarding, starPrompted: true }
|
|
1085
|
+
});
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
// src/index.ts
|
|
1089
|
+
import { readFileSync as readFileSync5 } from "fs";
|
|
1090
|
+
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
1091
|
+
import { dirname as dirname4, join as join5 } from "path";
|
|
1092
|
+
var __dirname2 = dirname4(fileURLToPath4(import.meta.url));
|
|
1093
|
+
function getVersion() {
|
|
1094
|
+
try {
|
|
1095
|
+
const pkg = JSON.parse(
|
|
1096
|
+
readFileSync5(join5(__dirname2, "..", "package.json"), "utf8")
|
|
1097
|
+
);
|
|
1098
|
+
return pkg.version;
|
|
1099
|
+
} catch {
|
|
1100
|
+
return "0.0.0";
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
var program = new Command9();
|
|
1104
|
+
program.name("progrok").description(
|
|
1105
|
+
`Use Grok models for free via OAuth proxy. No API key needed.
|
|
1106
|
+
|
|
1107
|
+
SuperGrok OAuth \u2192 local proxy \u2192 OpenAI-compatible API for any client.
|
|
1108
|
+
All xAI endpoints forwarded: responses, chat, images, video, tts, stt.
|
|
1109
|
+
|
|
1110
|
+
Quick start:
|
|
1111
|
+
$ progrok login # OAuth via browser (or --device-code for SSH)
|
|
1112
|
+
$ progrok proxy # Start proxy on 127.0.0.1:18645
|
|
1113
|
+
$ curl localhost:18645/v1/chat/completions -d '{"model":"grok-4.3",...}'
|
|
1114
|
+
|
|
1115
|
+
Proxy forwards ALL /v1/* paths to api.x.ai \u2014 no whitelist.
|
|
1116
|
+
Supported xAI surfaces:
|
|
1117
|
+
/v1/responses Responses API (streaming, tools, reasoning)
|
|
1118
|
+
/v1/chat/completions OpenAI-compatible chat
|
|
1119
|
+
/v1/models Model list
|
|
1120
|
+
/v1/language-models Detailed models (pricing, aliases, modalities)
|
|
1121
|
+
/v1/images/generations Image generation (grok-imagine-image)
|
|
1122
|
+
/v1/videos/generations Video generation (async, poll /v1/videos/{id})
|
|
1123
|
+
/v1/tts Text-to-speech
|
|
1124
|
+
/v1/stt Speech-to-text
|
|
1125
|
+
/v1/batch/completions Batch processing
|
|
1126
|
+
/v1/embeddings Embeddings`
|
|
1127
|
+
).version(getVersion());
|
|
1128
|
+
program.addCommand(loginCommand());
|
|
1129
|
+
program.addCommand(logoutCommand());
|
|
1130
|
+
program.addCommand(proxyCommand());
|
|
1131
|
+
program.addCommand(chatCommand());
|
|
1132
|
+
program.addCommand(modelsCommand());
|
|
1133
|
+
program.addCommand(statusCommand());
|
|
1134
|
+
program.addCommand(skillCommand());
|
|
1135
|
+
program.addCommand(capabilitiesCommand());
|
|
1136
|
+
var REAL_COMMANDS = /* @__PURE__ */ new Set(["login", "logout", "proxy", "chat", "models", "status", "skill", "capabilities"]);
|
|
1137
|
+
var subcommand = process.argv[2];
|
|
1138
|
+
if (subcommand && REAL_COMMANDS.has(subcommand)) {
|
|
1139
|
+
await showStarPrompt();
|
|
1140
|
+
}
|
|
1141
|
+
program.parse();
|
|
1142
|
+
//# sourceMappingURL=index.js.map
|