ima2-gen 3.15.1 → 3.16.0
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/CHANGELOG.md +11 -1
- package/README.md +7 -6
- package/bin/commands/grok.js +150 -64
- package/bin/commands/service.js +5 -4
- package/bin/ima2.js +3 -3
- package/bin/lib/doctor-providers.js +6 -1
- package/bin/lib/doctor-runtime.js +1 -1
- package/config.js +0 -9
- package/docs/API.md +7 -7
- package/docs/API.zh-CN.md +7 -7
- package/docs/API.zh-TW.md +7 -7
- package/docs/CLI.md +9 -8
- package/docs/CLI.zh-CN.md +8 -8
- package/docs/CLI.zh-TW.md +8 -8
- package/docs/README.ko.md +5 -6
- package/docs/README.zh-CN.md +6 -5
- package/docs/README.zh-TW.md +6 -5
- package/docs/migration/runtime-test-inventory.md +4 -6
- package/lib/agentPlannerModel.js +17 -16
- package/lib/capabilities.js +3 -2
- package/lib/errors/providerMap.js +13 -0
- package/lib/grokImageCore.js +9 -16
- package/lib/grokImagePlanner.js +15 -3
- package/lib/grokRuntime.js +47 -16
- package/lib/grokVideoAdapter.js +23 -7
- package/lib/grokVideoPoll.js +3 -3
- package/lib/grokVideoShared.js +6 -13
- package/lib/promptBuilder/router.js +22 -6
- package/lib/providers/adapters/grokExecution.js +15 -14
- package/lib/providers/adapters/grokMultimodeOperations.js +9 -7
- package/lib/providers/adapters/grokOperations.js +19 -12
- package/lib/providers/execution/admission.js +20 -4
- package/lib/providers/registry.js +1 -1
- package/lib/runtimeContext.js +0 -12
- package/lib/videoExtendI2vOperation.js +5 -1
- package/lib/xaiAuth.js +369 -0
- package/lib/xaiDeviceLogin.js +157 -0
- package/package.json +2 -4
- package/routes/auth.js +18 -26
- package/routes/grok.js +25 -19
- package/routes/health.js +4 -5
- package/routes/models.js +12 -26
- package/routes/quota.js +2 -1
- package/routes/video.js +7 -2
- package/routes/videoExtended.js +37 -24
- package/server.js +7 -58
- package/skills/ima2/SKILL.md +2 -2
- package/ui/dist/.vite/manifest.json +56 -56
- package/ui/dist/assets/{AgentWorkspace-CLJDCRMQ.js → AgentWorkspace-DlLaTsPK.js} +1 -1
- package/ui/dist/assets/{App-DkvU6Sex.js → App-BfpvLzSs.js} +4 -4
- package/ui/dist/assets/{AssetGenWorkspace-BepUrz23.js → AssetGenWorkspace-C8eIs-bS.js} +2 -2
- package/ui/dist/assets/{AssetsWorkspace-IipC1FdD.js → AssetsWorkspace-BcbAM8uC.js} +1 -1
- package/ui/dist/assets/{CardNewsWorkspace-ZXDwYz4l.js → CardNewsWorkspace-CM5hwbRV.js} +1 -1
- package/ui/dist/assets/{GenerationRequestLogPanel-BL2C0DcW.js → GenerationRequestLogPanel-CTs8OymS.js} +1 -1
- package/ui/dist/assets/{HomeWorkspace-DFfrwS9a.js → HomeWorkspace-KGUtIZyG.js} +1 -1
- package/ui/dist/assets/{KeyingPanel-BQkEMTe9.js → KeyingPanel-D8ZHmWcC.js} +1 -1
- package/ui/dist/assets/{NodeCanvas-5u8IO1MA.js → NodeCanvas-D2N3m-1s.js} +1 -1
- package/ui/dist/assets/{PromptBuilderPanel-DNt7LHMi.js → PromptBuilderPanel-BolZnOa7.js} +1 -1
- package/ui/dist/assets/{PromptImportDialog-Bl-SB4mK.js → PromptImportDialog-DBpe7Vkj.js} +2 -2
- package/ui/dist/assets/{PromptImportDiscoverySection-DdZAdRMW.js → PromptImportDiscoverySection-Dk6v6lUZ.js} +1 -1
- package/ui/dist/assets/{PromptImportFolderSection-DLHQKl9T.js → PromptImportFolderSection-BE7Nfq9Y.js} +1 -1
- package/ui/dist/assets/{PromptLibraryPanel-PLWyvEz1.js → PromptLibraryPanel-Qdujpb4L.js} +2 -2
- package/ui/dist/assets/{SettingsWorkspace-Etfeu2IF.js → SettingsWorkspace-Dm4wezu_.js} +1 -1
- package/ui/dist/assets/{SpriteRecipeWorkspace-D7H5seOM.js → SpriteRecipeWorkspace-D9do9V7F.js} +1 -1
- package/ui/dist/assets/index-CfGRmfFv.js +22 -0
- package/ui/dist/assets/{index-BAkbTbUC.js → index-CfrOcJIe.js} +3 -3
- package/ui/dist/assets/{pptxgen.es-Apxh5DQ9.js → pptxgen.es-BLI_YKez.js} +1 -1
- package/ui/dist/assets/{promptBuilderStore-prvdLIUP.js → promptBuilderStore-BMiudG9n.js} +1 -1
- package/ui/dist/assets/useAgentDialogFocus-CCj5EYE9.js +1 -0
- package/ui/dist/index.html +1 -1
- package/lib/grokProxyLauncher.js +0 -279
- package/node_modules/array-flatten/LICENSE +0 -21
- package/node_modules/array-flatten/README.md +0 -43
- package/node_modules/array-flatten/array-flatten.js +0 -64
- package/node_modules/array-flatten/package.json +0 -39
- package/node_modules/bundle-name/index.js +0 -5
- package/node_modules/bundle-name/license +0 -9
- package/node_modules/bundle-name/package.json +0 -45
- package/node_modules/bundle-name/readme.md +0 -23
- package/node_modules/bytes/History.md +0 -97
- package/node_modules/bytes/LICENSE +0 -23
- package/node_modules/bytes/Readme.md +0 -152
- package/node_modules/bytes/index.js +0 -170
- package/node_modules/bytes/package.json +0 -42
- package/node_modules/call-bind-apply-helpers/.eslintrc +0 -17
- package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +0 -12
- package/node_modules/call-bind-apply-helpers/.nycrc +0 -9
- package/node_modules/call-bind-apply-helpers/CHANGELOG.md +0 -30
- package/node_modules/call-bind-apply-helpers/LICENSE +0 -21
- package/node_modules/call-bind-apply-helpers/README.md +0 -62
- package/node_modules/call-bind-apply-helpers/actualApply.d.ts +0 -1
- package/node_modules/call-bind-apply-helpers/actualApply.js +0 -10
- package/node_modules/call-bind-apply-helpers/applyBind.d.ts +0 -19
- package/node_modules/call-bind-apply-helpers/applyBind.js +0 -10
- package/node_modules/call-bind-apply-helpers/functionApply.d.ts +0 -1
- package/node_modules/call-bind-apply-helpers/functionApply.js +0 -4
- package/node_modules/call-bind-apply-helpers/functionCall.d.ts +0 -1
- package/node_modules/call-bind-apply-helpers/functionCall.js +0 -4
- package/node_modules/call-bind-apply-helpers/index.d.ts +0 -64
- package/node_modules/call-bind-apply-helpers/index.js +0 -15
- package/node_modules/call-bind-apply-helpers/package.json +0 -85
- package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +0 -3
- package/node_modules/call-bind-apply-helpers/reflectApply.js +0 -4
- package/node_modules/call-bind-apply-helpers/test/index.js +0 -63
- package/node_modules/call-bind-apply-helpers/tsconfig.json +0 -9
- package/node_modules/call-bound/.eslintrc +0 -13
- package/node_modules/call-bound/.github/FUNDING.yml +0 -12
- package/node_modules/call-bound/.nycrc +0 -9
- package/node_modules/call-bound/CHANGELOG.md +0 -42
- package/node_modules/call-bound/LICENSE +0 -21
- package/node_modules/call-bound/README.md +0 -53
- package/node_modules/call-bound/index.d.ts +0 -94
- package/node_modules/call-bound/index.js +0 -19
- package/node_modules/call-bound/package.json +0 -99
- package/node_modules/call-bound/test/index.js +0 -61
- package/node_modules/call-bound/tsconfig.json +0 -10
- package/node_modules/commander/LICENSE +0 -22
- package/node_modules/commander/Readme.md +0 -1149
- package/node_modules/commander/esm.mjs +0 -16
- package/node_modules/commander/index.js +0 -24
- package/node_modules/commander/lib/argument.js +0 -149
- package/node_modules/commander/lib/command.js +0 -2662
- package/node_modules/commander/lib/error.js +0 -39
- package/node_modules/commander/lib/help.js +0 -709
- package/node_modules/commander/lib/option.js +0 -367
- package/node_modules/commander/lib/suggestSimilar.js +0 -101
- package/node_modules/commander/package-support.json +0 -16
- package/node_modules/commander/package.json +0 -82
- package/node_modules/commander/typings/esm.d.mts +0 -3
- package/node_modules/commander/typings/index.d.ts +0 -1045
- package/node_modules/content-type/HISTORY.md +0 -29
- package/node_modules/content-type/LICENSE +0 -22
- package/node_modules/content-type/README.md +0 -94
- package/node_modules/content-type/index.js +0 -225
- package/node_modules/content-type/package.json +0 -42
- package/node_modules/cookie/LICENSE +0 -24
- package/node_modules/cookie/README.md +0 -317
- package/node_modules/cookie/SECURITY.md +0 -25
- package/node_modules/cookie/index.js +0 -335
- package/node_modules/cookie/package.json +0 -44
- package/node_modules/default-browser/index.d.ts +0 -29
- package/node_modules/default-browser/index.js +0 -34
- package/node_modules/default-browser/license +0 -9
- package/node_modules/default-browser/package.json +0 -54
- package/node_modules/default-browser/readme.md +0 -24
- package/node_modules/default-browser/windows.js +0 -57
- package/node_modules/default-browser-id/index.js +0 -25
- package/node_modules/default-browser-id/license +0 -9
- package/node_modules/default-browser-id/package.json +0 -41
- package/node_modules/default-browser-id/readme.md +0 -19
- package/node_modules/define-lazy-prop/index.d.ts +0 -31
- package/node_modules/define-lazy-prop/index.js +0 -18
- package/node_modules/define-lazy-prop/license +0 -9
- package/node_modules/define-lazy-prop/package.json +0 -51
- package/node_modules/define-lazy-prop/readme.md +0 -55
- package/node_modules/depd/History.md +0 -103
- package/node_modules/depd/LICENSE +0 -22
- package/node_modules/depd/Readme.md +0 -280
- package/node_modules/depd/index.js +0 -538
- package/node_modules/depd/lib/browser/index.js +0 -77
- package/node_modules/depd/package.json +0 -45
- package/node_modules/destroy/LICENSE +0 -23
- package/node_modules/destroy/README.md +0 -63
- package/node_modules/destroy/index.js +0 -209
- package/node_modules/destroy/package.json +0 -48
- package/node_modules/dunder-proto/.eslintrc +0 -5
- package/node_modules/dunder-proto/.github/FUNDING.yml +0 -12
- package/node_modules/dunder-proto/.nycrc +0 -13
- package/node_modules/dunder-proto/CHANGELOG.md +0 -24
- package/node_modules/dunder-proto/LICENSE +0 -21
- package/node_modules/dunder-proto/README.md +0 -54
- package/node_modules/dunder-proto/get.d.ts +0 -5
- package/node_modules/dunder-proto/get.js +0 -30
- package/node_modules/dunder-proto/package.json +0 -76
- package/node_modules/dunder-proto/set.d.ts +0 -5
- package/node_modules/dunder-proto/set.js +0 -35
- package/node_modules/dunder-proto/test/get.js +0 -34
- package/node_modules/dunder-proto/test/index.js +0 -4
- package/node_modules/dunder-proto/test/set.js +0 -50
- package/node_modules/dunder-proto/tsconfig.json +0 -9
- package/node_modules/ee-first/LICENSE +0 -22
- package/node_modules/ee-first/README.md +0 -80
- package/node_modules/ee-first/index.js +0 -95
- package/node_modules/ee-first/package.json +0 -29
- package/node_modules/encodeurl/LICENSE +0 -22
- package/node_modules/encodeurl/README.md +0 -109
- package/node_modules/encodeurl/index.js +0 -60
- package/node_modules/encodeurl/package.json +0 -40
- package/node_modules/es-define-property/.eslintrc +0 -13
- package/node_modules/es-define-property/.github/FUNDING.yml +0 -12
- package/node_modules/es-define-property/.nycrc +0 -9
- package/node_modules/es-define-property/CHANGELOG.md +0 -29
- package/node_modules/es-define-property/LICENSE +0 -21
- package/node_modules/es-define-property/README.md +0 -49
- package/node_modules/es-define-property/index.d.ts +0 -3
- package/node_modules/es-define-property/index.js +0 -14
- package/node_modules/es-define-property/package.json +0 -81
- package/node_modules/es-define-property/test/index.js +0 -56
- package/node_modules/es-define-property/tsconfig.json +0 -10
- package/node_modules/es-errors/.eslintrc +0 -5
- package/node_modules/es-errors/.github/FUNDING.yml +0 -12
- package/node_modules/es-errors/CHANGELOG.md +0 -40
- package/node_modules/es-errors/LICENSE +0 -21
- package/node_modules/es-errors/README.md +0 -55
- package/node_modules/es-errors/eval.d.ts +0 -3
- package/node_modules/es-errors/eval.js +0 -4
- package/node_modules/es-errors/index.d.ts +0 -3
- package/node_modules/es-errors/index.js +0 -4
- package/node_modules/es-errors/package.json +0 -80
- package/node_modules/es-errors/range.d.ts +0 -3
- package/node_modules/es-errors/range.js +0 -4
- package/node_modules/es-errors/ref.d.ts +0 -3
- package/node_modules/es-errors/ref.js +0 -4
- package/node_modules/es-errors/syntax.d.ts +0 -3
- package/node_modules/es-errors/syntax.js +0 -4
- package/node_modules/es-errors/test/index.js +0 -19
- package/node_modules/es-errors/tsconfig.json +0 -49
- package/node_modules/es-errors/type.d.ts +0 -3
- package/node_modules/es-errors/type.js +0 -4
- package/node_modules/es-errors/uri.d.ts +0 -3
- package/node_modules/es-errors/uri.js +0 -4
- package/node_modules/es-object-atoms/.eslintrc +0 -16
- package/node_modules/es-object-atoms/.github/FUNDING.yml +0 -12
- package/node_modules/es-object-atoms/CHANGELOG.md +0 -37
- package/node_modules/es-object-atoms/LICENSE +0 -21
- package/node_modules/es-object-atoms/README.md +0 -63
- package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +0 -3
- package/node_modules/es-object-atoms/RequireObjectCoercible.js +0 -11
- package/node_modules/es-object-atoms/ToObject.d.ts +0 -7
- package/node_modules/es-object-atoms/ToObject.js +0 -10
- package/node_modules/es-object-atoms/index.d.ts +0 -3
- package/node_modules/es-object-atoms/index.js +0 -4
- package/node_modules/es-object-atoms/isObject.d.ts +0 -3
- package/node_modules/es-object-atoms/isObject.js +0 -6
- package/node_modules/es-object-atoms/package.json +0 -80
- package/node_modules/es-object-atoms/test/index.js +0 -38
- package/node_modules/es-object-atoms/tsconfig.json +0 -6
- package/node_modules/escape-html/LICENSE +0 -24
- package/node_modules/escape-html/Readme.md +0 -43
- package/node_modules/escape-html/index.js +0 -78
- package/node_modules/escape-html/package.json +0 -24
- package/node_modules/etag/HISTORY.md +0 -83
- package/node_modules/etag/LICENSE +0 -22
- package/node_modules/etag/README.md +0 -159
- package/node_modules/etag/index.js +0 -131
- package/node_modules/etag/package.json +0 -47
- package/node_modules/forwarded/HISTORY.md +0 -21
- package/node_modules/forwarded/LICENSE +0 -22
- package/node_modules/forwarded/README.md +0 -57
- package/node_modules/forwarded/index.js +0 -90
- package/node_modules/forwarded/package.json +0 -45
- package/node_modules/function-bind/.eslintrc +0 -21
- package/node_modules/function-bind/.github/FUNDING.yml +0 -12
- package/node_modules/function-bind/.github/SECURITY.md +0 -3
- package/node_modules/function-bind/.nycrc +0 -13
- package/node_modules/function-bind/CHANGELOG.md +0 -136
- package/node_modules/function-bind/LICENSE +0 -20
- package/node_modules/function-bind/README.md +0 -46
- package/node_modules/function-bind/implementation.js +0 -84
- package/node_modules/function-bind/index.js +0 -5
- package/node_modules/function-bind/package.json +0 -87
- package/node_modules/function-bind/test/.eslintrc +0 -9
- package/node_modules/function-bind/test/index.js +0 -252
- package/node_modules/get-intrinsic/.eslintrc +0 -42
- package/node_modules/get-intrinsic/.github/FUNDING.yml +0 -12
- package/node_modules/get-intrinsic/.nycrc +0 -9
- package/node_modules/get-intrinsic/CHANGELOG.md +0 -186
- package/node_modules/get-intrinsic/LICENSE +0 -21
- package/node_modules/get-intrinsic/README.md +0 -71
- package/node_modules/get-intrinsic/index.js +0 -378
- package/node_modules/get-intrinsic/package.json +0 -97
- package/node_modules/get-intrinsic/test/GetIntrinsic.js +0 -274
- package/node_modules/get-proto/.eslintrc +0 -10
- package/node_modules/get-proto/.github/FUNDING.yml +0 -12
- package/node_modules/get-proto/.nycrc +0 -9
- package/node_modules/get-proto/CHANGELOG.md +0 -21
- package/node_modules/get-proto/LICENSE +0 -21
- package/node_modules/get-proto/Object.getPrototypeOf.d.ts +0 -5
- package/node_modules/get-proto/Object.getPrototypeOf.js +0 -6
- package/node_modules/get-proto/README.md +0 -50
- package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +0 -3
- package/node_modules/get-proto/Reflect.getPrototypeOf.js +0 -4
- package/node_modules/get-proto/index.d.ts +0 -5
- package/node_modules/get-proto/index.js +0 -27
- package/node_modules/get-proto/package.json +0 -81
- package/node_modules/get-proto/test/index.js +0 -68
- package/node_modules/get-proto/tsconfig.json +0 -9
- package/node_modules/gopd/.eslintrc +0 -16
- package/node_modules/gopd/.github/FUNDING.yml +0 -12
- package/node_modules/gopd/CHANGELOG.md +0 -45
- package/node_modules/gopd/LICENSE +0 -21
- package/node_modules/gopd/README.md +0 -40
- package/node_modules/gopd/gOPD.d.ts +0 -1
- package/node_modules/gopd/gOPD.js +0 -4
- package/node_modules/gopd/index.d.ts +0 -5
- package/node_modules/gopd/index.js +0 -15
- package/node_modules/gopd/package.json +0 -77
- package/node_modules/gopd/test/index.js +0 -36
- package/node_modules/gopd/tsconfig.json +0 -9
- package/node_modules/has-symbols/.eslintrc +0 -11
- package/node_modules/has-symbols/.github/FUNDING.yml +0 -12
- package/node_modules/has-symbols/.nycrc +0 -9
- package/node_modules/has-symbols/CHANGELOG.md +0 -91
- package/node_modules/has-symbols/LICENSE +0 -21
- package/node_modules/has-symbols/README.md +0 -46
- package/node_modules/has-symbols/index.d.ts +0 -3
- package/node_modules/has-symbols/index.js +0 -14
- package/node_modules/has-symbols/package.json +0 -111
- package/node_modules/has-symbols/shams.d.ts +0 -3
- package/node_modules/has-symbols/shams.js +0 -45
- package/node_modules/has-symbols/test/index.js +0 -22
- package/node_modules/has-symbols/test/shams/core-js.js +0 -29
- package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +0 -29
- package/node_modules/has-symbols/test/tests.js +0 -58
- package/node_modules/has-symbols/tsconfig.json +0 -10
- package/node_modules/hasown/.github/FUNDING.yml +0 -12
- package/node_modules/hasown/.nycrc +0 -13
- package/node_modules/hasown/CHANGELOG.md +0 -51
- package/node_modules/hasown/LICENSE +0 -21
- package/node_modules/hasown/README.md +0 -40
- package/node_modules/hasown/eslint.config.mjs +0 -6
- package/node_modules/hasown/index.d.ts +0 -4
- package/node_modules/hasown/index.js +0 -8
- package/node_modules/hasown/package.json +0 -92
- package/node_modules/hasown/tsconfig.json +0 -6
- package/node_modules/http-errors/HISTORY.md +0 -186
- package/node_modules/http-errors/LICENSE +0 -23
- package/node_modules/http-errors/README.md +0 -169
- package/node_modules/http-errors/index.js +0 -290
- package/node_modules/http-errors/package.json +0 -54
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/ipaddr.js/LICENSE +0 -19
- package/node_modules/ipaddr.js/README.md +0 -233
- package/node_modules/ipaddr.js/ipaddr.min.js +0 -1
- package/node_modules/ipaddr.js/lib/ipaddr.js +0 -673
- package/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +0 -68
- package/node_modules/ipaddr.js/package.json +0 -35
- package/node_modules/is-docker/cli.js +0 -5
- package/node_modules/is-docker/index.d.ts +0 -13
- package/node_modules/is-docker/index.js +0 -29
- package/node_modules/is-docker/license +0 -9
- package/node_modules/is-docker/package.json +0 -44
- package/node_modules/is-docker/readme.md +0 -27
- package/node_modules/is-inside-container/cli.js +0 -5
- package/node_modules/is-inside-container/index.d.ts +0 -13
- package/node_modules/is-inside-container/index.js +0 -23
- package/node_modules/is-inside-container/license +0 -9
- package/node_modules/is-inside-container/package.json +0 -51
- package/node_modules/is-inside-container/readme.md +0 -36
- package/node_modules/is-wsl/index.d.ts +0 -15
- package/node_modules/is-wsl/index.js +0 -36
- package/node_modules/is-wsl/license +0 -9
- package/node_modules/is-wsl/package.json +0 -58
- package/node_modules/is-wsl/readme.md +0 -21
- package/node_modules/math-intrinsics/.eslintrc +0 -16
- package/node_modules/math-intrinsics/.github/FUNDING.yml +0 -12
- package/node_modules/math-intrinsics/CHANGELOG.md +0 -24
- package/node_modules/math-intrinsics/LICENSE +0 -21
- package/node_modules/math-intrinsics/README.md +0 -50
- package/node_modules/math-intrinsics/abs.d.ts +0 -1
- package/node_modules/math-intrinsics/abs.js +0 -4
- package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +0 -3
- package/node_modules/math-intrinsics/constants/maxArrayLength.js +0 -4
- package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +0 -3
- package/node_modules/math-intrinsics/constants/maxSafeInteger.js +0 -5
- package/node_modules/math-intrinsics/constants/maxValue.d.ts +0 -3
- package/node_modules/math-intrinsics/constants/maxValue.js +0 -5
- package/node_modules/math-intrinsics/floor.d.ts +0 -1
- package/node_modules/math-intrinsics/floor.js +0 -4
- package/node_modules/math-intrinsics/isFinite.d.ts +0 -3
- package/node_modules/math-intrinsics/isFinite.js +0 -12
- package/node_modules/math-intrinsics/isInteger.d.ts +0 -3
- package/node_modules/math-intrinsics/isInteger.js +0 -16
- package/node_modules/math-intrinsics/isNaN.d.ts +0 -1
- package/node_modules/math-intrinsics/isNaN.js +0 -6
- package/node_modules/math-intrinsics/isNegativeZero.d.ts +0 -3
- package/node_modules/math-intrinsics/isNegativeZero.js +0 -6
- package/node_modules/math-intrinsics/max.d.ts +0 -1
- package/node_modules/math-intrinsics/max.js +0 -4
- package/node_modules/math-intrinsics/min.d.ts +0 -1
- package/node_modules/math-intrinsics/min.js +0 -4
- package/node_modules/math-intrinsics/mod.d.ts +0 -3
- package/node_modules/math-intrinsics/mod.js +0 -9
- package/node_modules/math-intrinsics/package.json +0 -86
- package/node_modules/math-intrinsics/pow.d.ts +0 -1
- package/node_modules/math-intrinsics/pow.js +0 -4
- package/node_modules/math-intrinsics/round.d.ts +0 -1
- package/node_modules/math-intrinsics/round.js +0 -4
- package/node_modules/math-intrinsics/sign.d.ts +0 -3
- package/node_modules/math-intrinsics/sign.js +0 -11
- package/node_modules/math-intrinsics/test/index.js +0 -192
- package/node_modules/math-intrinsics/tsconfig.json +0 -3
- package/node_modules/methods/HISTORY.md +0 -29
- package/node_modules/methods/LICENSE +0 -24
- package/node_modules/methods/README.md +0 -51
- package/node_modules/methods/index.js +0 -69
- package/node_modules/methods/package.json +0 -36
- package/node_modules/mime/.npmignore +0 -0
- package/node_modules/mime/CHANGELOG.md +0 -164
- package/node_modules/mime/LICENSE +0 -21
- package/node_modules/mime/README.md +0 -90
- package/node_modules/mime/cli.js +0 -8
- package/node_modules/mime/mime.js +0 -108
- package/node_modules/mime/package.json +0 -44
- package/node_modules/mime/src/build.js +0 -53
- package/node_modules/mime/src/test.js +0 -60
- package/node_modules/mime/types.json +0 -1
- package/node_modules/ms/index.js +0 -162
- package/node_modules/ms/license.md +0 -21
- package/node_modules/ms/package.json +0 -38
- package/node_modules/ms/readme.md +0 -59
- package/node_modules/object-inspect/.eslintrc +0 -53
- package/node_modules/object-inspect/.github/FUNDING.yml +0 -12
- package/node_modules/object-inspect/.nycrc +0 -13
- package/node_modules/object-inspect/CHANGELOG.md +0 -424
- package/node_modules/object-inspect/LICENSE +0 -21
- package/node_modules/object-inspect/example/all.js +0 -23
- package/node_modules/object-inspect/example/circular.js +0 -6
- package/node_modules/object-inspect/example/fn.js +0 -5
- package/node_modules/object-inspect/example/inspect.js +0 -10
- package/node_modules/object-inspect/index.js +0 -544
- package/node_modules/object-inspect/package-support.json +0 -20
- package/node_modules/object-inspect/package.json +0 -105
- package/node_modules/object-inspect/readme.markdown +0 -84
- package/node_modules/object-inspect/test/bigint.js +0 -58
- package/node_modules/object-inspect/test/browser/dom.js +0 -15
- package/node_modules/object-inspect/test/circular.js +0 -16
- package/node_modules/object-inspect/test/deep.js +0 -12
- package/node_modules/object-inspect/test/element.js +0 -53
- package/node_modules/object-inspect/test/err.js +0 -48
- package/node_modules/object-inspect/test/fakes.js +0 -29
- package/node_modules/object-inspect/test/fn.js +0 -76
- package/node_modules/object-inspect/test/global.js +0 -17
- package/node_modules/object-inspect/test/has.js +0 -15
- package/node_modules/object-inspect/test/holes.js +0 -15
- package/node_modules/object-inspect/test/indent-option.js +0 -271
- package/node_modules/object-inspect/test/inspect.js +0 -139
- package/node_modules/object-inspect/test/lowbyte.js +0 -12
- package/node_modules/object-inspect/test/number.js +0 -58
- package/node_modules/object-inspect/test/quoteStyle.js +0 -26
- package/node_modules/object-inspect/test/toStringTag.js +0 -40
- package/node_modules/object-inspect/test/undef.js +0 -12
- package/node_modules/object-inspect/test/values.js +0 -261
- package/node_modules/object-inspect/test-core-js.js +0 -26
- package/node_modules/object-inspect/util.inspect.js +0 -1
- package/node_modules/on-finished/HISTORY.md +0 -98
- package/node_modules/on-finished/LICENSE +0 -23
- package/node_modules/on-finished/README.md +0 -162
- package/node_modules/on-finished/index.js +0 -234
- package/node_modules/on-finished/package.json +0 -39
- package/node_modules/open/index.d.ts +0 -158
- package/node_modules/open/index.js +0 -366
- package/node_modules/open/license +0 -9
- package/node_modules/open/node_modules/wsl-utils/index.d.ts +0 -21
- package/node_modules/open/node_modules/wsl-utils/index.js +0 -57
- package/node_modules/open/node_modules/wsl-utils/license +0 -9
- package/node_modules/open/node_modules/wsl-utils/package.json +0 -46
- package/node_modules/open/node_modules/wsl-utils/readme.md +0 -50
- package/node_modules/open/package.json +0 -68
- package/node_modules/open/readme.md +0 -183
- package/node_modules/open/xdg-open +0 -1267
- package/node_modules/parseurl/HISTORY.md +0 -58
- package/node_modules/parseurl/LICENSE +0 -24
- package/node_modules/parseurl/README.md +0 -133
- package/node_modules/parseurl/index.js +0 -158
- package/node_modules/parseurl/package.json +0 -40
- package/node_modules/progrok/LICENSE +0 -21
- package/node_modules/progrok/README.md +0 -331
- package/node_modules/progrok/THIRD_PARTY_NOTICES.md +0 -13
- package/node_modules/progrok/dist/index.js +0 -1626
- package/node_modules/progrok/dist/index.js.map +0 -1
- package/node_modules/progrok/dist/public/app.js +0 -529
- package/node_modules/progrok/dist/public/index.html +0 -47
- package/node_modules/progrok/dist/public/style.css +0 -392
- package/node_modules/progrok/node_modules/accepts/HISTORY.md +0 -243
- package/node_modules/progrok/node_modules/accepts/LICENSE +0 -23
- package/node_modules/progrok/node_modules/accepts/README.md +0 -140
- package/node_modules/progrok/node_modules/accepts/index.js +0 -238
- package/node_modules/progrok/node_modules/accepts/package.json +0 -47
- package/node_modules/progrok/node_modules/body-parser/HISTORY.md +0 -686
- package/node_modules/progrok/node_modules/body-parser/LICENSE +0 -23
- package/node_modules/progrok/node_modules/body-parser/README.md +0 -476
- package/node_modules/progrok/node_modules/body-parser/index.js +0 -156
- package/node_modules/progrok/node_modules/body-parser/lib/read.js +0 -205
- package/node_modules/progrok/node_modules/body-parser/lib/types/json.js +0 -243
- package/node_modules/progrok/node_modules/body-parser/lib/types/raw.js +0 -101
- package/node_modules/progrok/node_modules/body-parser/lib/types/text.js +0 -121
- package/node_modules/progrok/node_modules/body-parser/lib/types/urlencoded.js +0 -299
- package/node_modules/progrok/node_modules/body-parser/package.json +0 -55
- package/node_modules/progrok/node_modules/content-disposition/HISTORY.md +0 -60
- package/node_modules/progrok/node_modules/content-disposition/LICENSE +0 -22
- package/node_modules/progrok/node_modules/content-disposition/README.md +0 -142
- package/node_modules/progrok/node_modules/content-disposition/index.js +0 -458
- package/node_modules/progrok/node_modules/content-disposition/package.json +0 -44
- package/node_modules/progrok/node_modules/cookie-signature/History.md +0 -42
- package/node_modules/progrok/node_modules/cookie-signature/Readme.md +0 -42
- package/node_modules/progrok/node_modules/cookie-signature/index.js +0 -51
- package/node_modules/progrok/node_modules/cookie-signature/package.json +0 -18
- package/node_modules/progrok/node_modules/debug/.coveralls.yml +0 -1
- package/node_modules/progrok/node_modules/debug/.eslintrc +0 -11
- package/node_modules/progrok/node_modules/debug/.npmignore +0 -9
- package/node_modules/progrok/node_modules/debug/.travis.yml +0 -14
- package/node_modules/progrok/node_modules/debug/CHANGELOG.md +0 -362
- package/node_modules/progrok/node_modules/debug/LICENSE +0 -19
- package/node_modules/progrok/node_modules/debug/Makefile +0 -50
- package/node_modules/progrok/node_modules/debug/README.md +0 -312
- package/node_modules/progrok/node_modules/debug/component.json +0 -19
- package/node_modules/progrok/node_modules/debug/karma.conf.js +0 -70
- package/node_modules/progrok/node_modules/debug/node.js +0 -1
- package/node_modules/progrok/node_modules/debug/node_modules/ms/index.js +0 -152
- package/node_modules/progrok/node_modules/debug/node_modules/ms/license.md +0 -21
- package/node_modules/progrok/node_modules/debug/node_modules/ms/package.json +0 -37
- package/node_modules/progrok/node_modules/debug/node_modules/ms/readme.md +0 -51
- package/node_modules/progrok/node_modules/debug/package.json +0 -49
- package/node_modules/progrok/node_modules/debug/src/browser.js +0 -185
- package/node_modules/progrok/node_modules/debug/src/debug.js +0 -202
- package/node_modules/progrok/node_modules/debug/src/index.js +0 -10
- package/node_modules/progrok/node_modules/debug/src/inspector-log.js +0 -15
- package/node_modules/progrok/node_modules/debug/src/node.js +0 -248
- package/node_modules/progrok/node_modules/express/History.md +0 -3676
- package/node_modules/progrok/node_modules/express/LICENSE +0 -24
- package/node_modules/progrok/node_modules/express/Readme.md +0 -260
- package/node_modules/progrok/node_modules/express/index.js +0 -11
- package/node_modules/progrok/node_modules/express/lib/application.js +0 -661
- package/node_modules/progrok/node_modules/express/lib/express.js +0 -116
- package/node_modules/progrok/node_modules/express/lib/middleware/init.js +0 -43
- package/node_modules/progrok/node_modules/express/lib/middleware/query.js +0 -47
- package/node_modules/progrok/node_modules/express/lib/request.js +0 -525
- package/node_modules/progrok/node_modules/express/lib/response.js +0 -1179
- package/node_modules/progrok/node_modules/express/lib/router/index.js +0 -673
- package/node_modules/progrok/node_modules/express/lib/router/layer.js +0 -181
- package/node_modules/progrok/node_modules/express/lib/router/route.js +0 -230
- package/node_modules/progrok/node_modules/express/lib/utils.js +0 -304
- package/node_modules/progrok/node_modules/express/lib/view.js +0 -182
- package/node_modules/progrok/node_modules/express/package.json +0 -102
- package/node_modules/progrok/node_modules/finalhandler/HISTORY.md +0 -216
- package/node_modules/progrok/node_modules/finalhandler/LICENSE +0 -22
- package/node_modules/progrok/node_modules/finalhandler/README.md +0 -147
- package/node_modules/progrok/node_modules/finalhandler/SECURITY.md +0 -25
- package/node_modules/progrok/node_modules/finalhandler/index.js +0 -341
- package/node_modules/progrok/node_modules/finalhandler/package.json +0 -47
- package/node_modules/progrok/node_modules/fresh/HISTORY.md +0 -70
- package/node_modules/progrok/node_modules/fresh/LICENSE +0 -23
- package/node_modules/progrok/node_modules/fresh/README.md +0 -119
- package/node_modules/progrok/node_modules/fresh/index.js +0 -137
- package/node_modules/progrok/node_modules/fresh/package.json +0 -46
- package/node_modules/progrok/node_modules/iconv-lite/Changelog.md +0 -162
- package/node_modules/progrok/node_modules/iconv-lite/LICENSE +0 -21
- package/node_modules/progrok/node_modules/iconv-lite/README.md +0 -156
- package/node_modules/progrok/node_modules/iconv-lite/encodings/dbcs-codec.js +0 -555
- package/node_modules/progrok/node_modules/iconv-lite/encodings/dbcs-data.js +0 -176
- package/node_modules/progrok/node_modules/iconv-lite/encodings/index.js +0 -22
- package/node_modules/progrok/node_modules/iconv-lite/encodings/internal.js +0 -188
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-codec.js +0 -72
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-data-generated.js +0 -451
- package/node_modules/progrok/node_modules/iconv-lite/encodings/sbcs-data.js +0 -174
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/big5-added.json +0 -122
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp936.json +0 -264
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp949.json +0 -273
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/cp950.json +0 -177
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/eucjp.json +0 -182
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +0 -1
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/gbk-added.json +0 -55
- package/node_modules/progrok/node_modules/iconv-lite/encodings/tables/shiftjis.json +0 -125
- package/node_modules/progrok/node_modules/iconv-lite/encodings/utf16.js +0 -177
- package/node_modules/progrok/node_modules/iconv-lite/encodings/utf7.js +0 -290
- package/node_modules/progrok/node_modules/iconv-lite/lib/bom-handling.js +0 -52
- package/node_modules/progrok/node_modules/iconv-lite/lib/extend-node.js +0 -217
- package/node_modules/progrok/node_modules/iconv-lite/lib/index.d.ts +0 -24
- package/node_modules/progrok/node_modules/iconv-lite/lib/index.js +0 -153
- package/node_modules/progrok/node_modules/iconv-lite/lib/streams.js +0 -121
- package/node_modules/progrok/node_modules/iconv-lite/package.json +0 -46
- package/node_modules/progrok/node_modules/media-typer/HISTORY.md +0 -22
- package/node_modules/progrok/node_modules/media-typer/LICENSE +0 -22
- package/node_modules/progrok/node_modules/media-typer/README.md +0 -81
- package/node_modules/progrok/node_modules/media-typer/index.js +0 -270
- package/node_modules/progrok/node_modules/media-typer/package.json +0 -26
- package/node_modules/progrok/node_modules/merge-descriptors/HISTORY.md +0 -21
- package/node_modules/progrok/node_modules/merge-descriptors/LICENSE +0 -23
- package/node_modules/progrok/node_modules/merge-descriptors/README.md +0 -49
- package/node_modules/progrok/node_modules/merge-descriptors/index.js +0 -60
- package/node_modules/progrok/node_modules/merge-descriptors/package.json +0 -39
- package/node_modules/progrok/node_modules/mime-db/HISTORY.md +0 -507
- package/node_modules/progrok/node_modules/mime-db/LICENSE +0 -23
- package/node_modules/progrok/node_modules/mime-db/README.md +0 -100
- package/node_modules/progrok/node_modules/mime-db/db.json +0 -8519
- package/node_modules/progrok/node_modules/mime-db/index.js +0 -12
- package/node_modules/progrok/node_modules/mime-db/package.json +0 -60
- package/node_modules/progrok/node_modules/mime-types/HISTORY.md +0 -397
- package/node_modules/progrok/node_modules/mime-types/LICENSE +0 -23
- package/node_modules/progrok/node_modules/mime-types/README.md +0 -113
- package/node_modules/progrok/node_modules/mime-types/index.js +0 -188
- package/node_modules/progrok/node_modules/mime-types/package.json +0 -44
- package/node_modules/progrok/node_modules/negotiator/HISTORY.md +0 -108
- package/node_modules/progrok/node_modules/negotiator/LICENSE +0 -24
- package/node_modules/progrok/node_modules/negotiator/README.md +0 -203
- package/node_modules/progrok/node_modules/negotiator/index.js +0 -82
- package/node_modules/progrok/node_modules/negotiator/lib/charset.js +0 -169
- package/node_modules/progrok/node_modules/negotiator/lib/encoding.js +0 -184
- package/node_modules/progrok/node_modules/negotiator/lib/language.js +0 -179
- package/node_modules/progrok/node_modules/negotiator/lib/mediaType.js +0 -294
- package/node_modules/progrok/node_modules/negotiator/package.json +0 -42
- package/node_modules/progrok/node_modules/path-to-regexp/LICENSE +0 -21
- package/node_modules/progrok/node_modules/path-to-regexp/Readme.md +0 -35
- package/node_modules/progrok/node_modules/path-to-regexp/index.js +0 -158
- package/node_modules/progrok/node_modules/path-to-regexp/package.json +0 -30
- package/node_modules/progrok/node_modules/raw-body/LICENSE +0 -22
- package/node_modules/progrok/node_modules/raw-body/README.md +0 -223
- package/node_modules/progrok/node_modules/raw-body/index.d.ts +0 -87
- package/node_modules/progrok/node_modules/raw-body/index.js +0 -336
- package/node_modules/progrok/node_modules/raw-body/package.json +0 -47
- package/node_modules/progrok/node_modules/send/HISTORY.md +0 -538
- package/node_modules/progrok/node_modules/send/LICENSE +0 -23
- package/node_modules/progrok/node_modules/send/README.md +0 -327
- package/node_modules/progrok/node_modules/send/SECURITY.md +0 -24
- package/node_modules/progrok/node_modules/send/index.js +0 -1142
- package/node_modules/progrok/node_modules/send/package.json +0 -62
- package/node_modules/progrok/node_modules/serve-static/HISTORY.md +0 -493
- package/node_modules/progrok/node_modules/serve-static/LICENSE +0 -25
- package/node_modules/progrok/node_modules/serve-static/README.md +0 -257
- package/node_modules/progrok/node_modules/serve-static/index.js +0 -209
- package/node_modules/progrok/node_modules/serve-static/package.json +0 -42
- package/node_modules/progrok/node_modules/type-is/HISTORY.md +0 -259
- package/node_modules/progrok/node_modules/type-is/LICENSE +0 -23
- package/node_modules/progrok/node_modules/type-is/README.md +0 -170
- package/node_modules/progrok/node_modules/type-is/index.js +0 -266
- package/node_modules/progrok/node_modules/type-is/package.json +0 -45
- package/node_modules/progrok/package.json +0 -52
- package/node_modules/progrok/skills/progrok/SKILL.md +0 -293
- package/node_modules/proxy-addr/HISTORY.md +0 -161
- package/node_modules/proxy-addr/LICENSE +0 -22
- package/node_modules/proxy-addr/README.md +0 -139
- package/node_modules/proxy-addr/index.js +0 -327
- package/node_modules/proxy-addr/package.json +0 -47
- package/node_modules/qs/.editorconfig +0 -46
- package/node_modules/qs/.github/FUNDING.yml +0 -12
- package/node_modules/qs/.github/SECURITY.md +0 -11
- package/node_modules/qs/.github/THREAT_MODEL.md +0 -78
- package/node_modules/qs/.nycrc +0 -13
- package/node_modules/qs/CHANGELOG.md +0 -822
- package/node_modules/qs/LICENSE.md +0 -29
- package/node_modules/qs/README.md +0 -758
- package/node_modules/qs/dist/qs.js +0 -141
- package/node_modules/qs/eslint.config.mjs +0 -57
- package/node_modules/qs/lib/formats.js +0 -23
- package/node_modules/qs/lib/index.js +0 -11
- package/node_modules/qs/lib/parse.js +0 -403
- package/node_modules/qs/lib/stringify.js +0 -363
- package/node_modules/qs/lib/utils.js +0 -342
- package/node_modules/qs/package.json +0 -94
- package/node_modules/qs/test/empty-keys-cases.js +0 -267
- package/node_modules/qs/test/parse.js +0 -1703
- package/node_modules/qs/test/stringify.js +0 -1448
- package/node_modules/qs/test/utils.js +0 -432
- package/node_modules/range-parser/HISTORY.md +0 -56
- package/node_modules/range-parser/LICENSE +0 -23
- package/node_modules/range-parser/README.md +0 -84
- package/node_modules/range-parser/index.js +0 -162
- package/node_modules/range-parser/package.json +0 -44
- package/node_modules/run-applescript/index.d.ts +0 -66
- package/node_modules/run-applescript/index.js +0 -37
- package/node_modules/run-applescript/license +0 -9
- package/node_modules/run-applescript/package.json +0 -42
- package/node_modules/run-applescript/readme.md +0 -78
- package/node_modules/safe-buffer/LICENSE +0 -21
- package/node_modules/safe-buffer/README.md +0 -584
- package/node_modules/safe-buffer/index.d.ts +0 -187
- package/node_modules/safe-buffer/index.js +0 -65
- package/node_modules/safe-buffer/package.json +0 -51
- package/node_modules/safer-buffer/LICENSE +0 -21
- package/node_modules/safer-buffer/Porting-Buffer.md +0 -268
- package/node_modules/safer-buffer/Readme.md +0 -156
- package/node_modules/safer-buffer/dangerous.js +0 -58
- package/node_modules/safer-buffer/package.json +0 -34
- package/node_modules/safer-buffer/safer.js +0 -77
- package/node_modules/safer-buffer/tests.js +0 -406
- package/node_modules/setprototypeof/LICENSE +0 -13
- package/node_modules/setprototypeof/README.md +0 -31
- package/node_modules/setprototypeof/index.d.ts +0 -2
- package/node_modules/setprototypeof/index.js +0 -17
- package/node_modules/setprototypeof/package.json +0 -38
- package/node_modules/setprototypeof/test/index.js +0 -24
- package/node_modules/side-channel/.editorconfig +0 -9
- package/node_modules/side-channel/.eslintrc +0 -12
- package/node_modules/side-channel/.github/FUNDING.yml +0 -12
- package/node_modules/side-channel/.nycrc +0 -13
- package/node_modules/side-channel/CHANGELOG.md +0 -110
- package/node_modules/side-channel/LICENSE +0 -21
- package/node_modules/side-channel/README.md +0 -61
- package/node_modules/side-channel/index.d.ts +0 -14
- package/node_modules/side-channel/index.js +0 -43
- package/node_modules/side-channel/package.json +0 -85
- package/node_modules/side-channel/test/index.js +0 -104
- package/node_modules/side-channel/tsconfig.json +0 -9
- package/node_modules/side-channel-list/.editorconfig +0 -9
- package/node_modules/side-channel-list/.eslintrc +0 -11
- package/node_modules/side-channel-list/.github/FUNDING.yml +0 -12
- package/node_modules/side-channel-list/.nycrc +0 -13
- package/node_modules/side-channel-list/CHANGELOG.md +0 -36
- package/node_modules/side-channel-list/LICENSE +0 -21
- package/node_modules/side-channel-list/README.md +0 -62
- package/node_modules/side-channel-list/index.d.ts +0 -13
- package/node_modules/side-channel-list/index.js +0 -111
- package/node_modules/side-channel-list/list.d.ts +0 -14
- package/node_modules/side-channel-list/package.json +0 -77
- package/node_modules/side-channel-list/test/index.js +0 -154
- package/node_modules/side-channel-list/tsconfig.json +0 -9
- package/node_modules/side-channel-map/.editorconfig +0 -9
- package/node_modules/side-channel-map/.eslintrc +0 -11
- package/node_modules/side-channel-map/.github/FUNDING.yml +0 -12
- package/node_modules/side-channel-map/.nycrc +0 -13
- package/node_modules/side-channel-map/CHANGELOG.md +0 -22
- package/node_modules/side-channel-map/LICENSE +0 -21
- package/node_modules/side-channel-map/README.md +0 -62
- package/node_modules/side-channel-map/index.d.ts +0 -15
- package/node_modules/side-channel-map/index.js +0 -68
- package/node_modules/side-channel-map/package.json +0 -80
- package/node_modules/side-channel-map/test/index.js +0 -114
- package/node_modules/side-channel-map/tsconfig.json +0 -9
- package/node_modules/side-channel-weakmap/.editorconfig +0 -9
- package/node_modules/side-channel-weakmap/.eslintrc +0 -12
- package/node_modules/side-channel-weakmap/.github/FUNDING.yml +0 -12
- package/node_modules/side-channel-weakmap/.nycrc +0 -13
- package/node_modules/side-channel-weakmap/CHANGELOG.md +0 -28
- package/node_modules/side-channel-weakmap/LICENSE +0 -21
- package/node_modules/side-channel-weakmap/README.md +0 -62
- package/node_modules/side-channel-weakmap/index.d.ts +0 -15
- package/node_modules/side-channel-weakmap/index.js +0 -84
- package/node_modules/side-channel-weakmap/package.json +0 -87
- package/node_modules/side-channel-weakmap/test/index.js +0 -114
- package/node_modules/side-channel-weakmap/tsconfig.json +0 -9
- package/node_modules/statuses/HISTORY.md +0 -87
- package/node_modules/statuses/LICENSE +0 -23
- package/node_modules/statuses/README.md +0 -139
- package/node_modules/statuses/codes.json +0 -65
- package/node_modules/statuses/index.js +0 -146
- package/node_modules/statuses/package.json +0 -49
- package/node_modules/toidentifier/HISTORY.md +0 -9
- package/node_modules/toidentifier/LICENSE +0 -21
- package/node_modules/toidentifier/README.md +0 -61
- package/node_modules/toidentifier/index.js +0 -32
- package/node_modules/toidentifier/package.json +0 -38
- package/node_modules/unpipe/HISTORY.md +0 -4
- package/node_modules/unpipe/LICENSE +0 -22
- package/node_modules/unpipe/README.md +0 -43
- package/node_modules/unpipe/index.js +0 -69
- package/node_modules/unpipe/package.json +0 -27
- package/node_modules/utils-merge/.npmignore +0 -9
- package/node_modules/utils-merge/LICENSE +0 -20
- package/node_modules/utils-merge/README.md +0 -34
- package/node_modules/utils-merge/index.js +0 -23
- package/node_modules/utils-merge/package.json +0 -40
- package/node_modules/vary/HISTORY.md +0 -39
- package/node_modules/vary/LICENSE +0 -22
- package/node_modules/vary/README.md +0 -101
- package/node_modules/vary/index.js +0 -149
- package/node_modules/vary/package.json +0 -43
- package/ui/dist/assets/index-DYtUJ4t0.js +0 -22
- package/ui/dist/assets/useAgentDialogFocus-B2snKbzK.js +0 -1
- package/vendor/progrok-0.2.0.tgz +0 -0
package/lib/xaiAuth.js
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI (Grok) OAuth credential store and refresh client.
|
|
3
|
+
*
|
|
4
|
+
* Ported from OpenCodex `src/oauth/xai.ts` (refresh path only) with the D1-D6/D9 fixes
|
|
5
|
+
* recorded in devlog/_plan/260909_grok_native_oauth/001_opencodex_port_spec.md.
|
|
6
|
+
*
|
|
7
|
+
* MUST stay a leaf module: only node:fs, node:crypto, node:os, node:path. No imports from
|
|
8
|
+
* config, routes, adapters, or the logger — adapters call loadGrokCredentials() synchronously.
|
|
9
|
+
*
|
|
10
|
+
* The file on disk (~/.progrok/auth.json) is the single source of truth. There is deliberately
|
|
11
|
+
* no in-memory credential cache: progrok may refresh the same file from another process, and a
|
|
12
|
+
* cache would make this module serve a token that was already rotated away.
|
|
13
|
+
*/
|
|
14
|
+
import { randomBytes } from "node:crypto";
|
|
15
|
+
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
export const XAI_OAUTH_ISSUER = "https://auth.x.ai";
|
|
19
|
+
export const XAI_OAUTH_DISCOVERY_URL = `${XAI_OAUTH_ISSUER}/.well-known/openid-configuration`;
|
|
20
|
+
export const XAI_OAUTH_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
|
|
21
|
+
export const XAI_OAUTH_SCOPE = "openid profile email offline_access grok-cli:access api:access";
|
|
22
|
+
export const XAI_TOKEN_ENDPOINT_FALLBACK = `${XAI_OAUTH_ISSUER}/oauth2/token`;
|
|
23
|
+
export const XAI_TOKEN_REFRESH_SKEW_MS = 120_000;
|
|
24
|
+
export const XAI_TOKEN_REQUEST_TIMEOUT_MS = 30_000;
|
|
25
|
+
/** progrok's CORS allow-list (dist/index.js:24). Any other host is a poisoned discovery doc. */
|
|
26
|
+
const XAI_TRUSTED_AUTH_HOSTS = new Set(["auth.x.ai", "accounts.x.ai"]);
|
|
27
|
+
const XAI_TOKEN_MAX_ATTEMPTS = 3;
|
|
28
|
+
/** Retry-After is honored as sent (D1), but never long enough to hang a request forever. */
|
|
29
|
+
const RETRY_AFTER_CAP_MS = 60_000;
|
|
30
|
+
const JITTER_CAP_MS = 2_000;
|
|
31
|
+
const FLIGHT_STALE_MS = 120_000;
|
|
32
|
+
const TERMINAL_FAILURE_TTL_MS = 30_000;
|
|
33
|
+
const TERMINAL_OAUTH_ERRORS = new Set(["invalid_grant", "refresh_token_reused", "revoked_token"]);
|
|
34
|
+
const httpStatusForGrokAuthCode = {
|
|
35
|
+
GROK_AUTH_REQUIRED: 401,
|
|
36
|
+
GROK_AUTH_REFRESH_FAILED: 502,
|
|
37
|
+
};
|
|
38
|
+
export class GrokAuthError extends Error {
|
|
39
|
+
code;
|
|
40
|
+
status;
|
|
41
|
+
oauthError;
|
|
42
|
+
constructor(code, message, options) {
|
|
43
|
+
super(message, options && "cause" in options ? { cause: options.cause } : undefined);
|
|
44
|
+
this.name = "GrokAuthError";
|
|
45
|
+
this.code = code;
|
|
46
|
+
this.status = httpStatusForGrokAuthCode[code];
|
|
47
|
+
if (options?.oauthError !== undefined)
|
|
48
|
+
this.oauthError = options.oauthError;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class XaiTokenRequestError extends Error {
|
|
52
|
+
status;
|
|
53
|
+
oauthError;
|
|
54
|
+
constructor(status, oauthError, message = "xAI token request failed", options) {
|
|
55
|
+
super(message, options && "cause" in options ? { cause: options.cause } : undefined);
|
|
56
|
+
this.name = "XaiTokenRequestError";
|
|
57
|
+
if (status !== undefined)
|
|
58
|
+
this.status = status;
|
|
59
|
+
if (oauthError !== undefined)
|
|
60
|
+
this.oauthError = oauthError;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Credential file I/O
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
export function grokAuthFilePath(homeDir = homedir()) {
|
|
67
|
+
return join(homeDir, ".progrok", "auth.json");
|
|
68
|
+
}
|
|
69
|
+
/** Never throws: a missing, unreadable, or malformed file is simply "not logged in". */
|
|
70
|
+
export function loadGrokCredentials(homeDir) {
|
|
71
|
+
try {
|
|
72
|
+
const parsed = JSON.parse(readFileSync(grokAuthFilePath(homeDir), "utf8"));
|
|
73
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
74
|
+
return null;
|
|
75
|
+
const record = parsed;
|
|
76
|
+
if (typeof record.accessToken !== "string" || record.accessToken.length === 0)
|
|
77
|
+
return null;
|
|
78
|
+
// Keep the raw record so unknown keys written by progrok survive a round-trip.
|
|
79
|
+
return record;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Atomic 0600 write (tmp + rename); the directory is forced to 0700. */
|
|
86
|
+
export function saveGrokCredentials(creds, homeDir) {
|
|
87
|
+
const target = grokAuthFilePath(homeDir);
|
|
88
|
+
const dir = dirname(target);
|
|
89
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
90
|
+
const tmp = join(dir, `auth.json.tmp-${randomBytes(6).toString("hex")}`);
|
|
91
|
+
writeFileSync(tmp, JSON.stringify(creds, null, 2), { mode: 0o600 });
|
|
92
|
+
renameSync(tmp, target);
|
|
93
|
+
}
|
|
94
|
+
/** Explicit logout only. A refresh failure must never delete the file. */
|
|
95
|
+
export function clearGrokCredentials(homeDir) {
|
|
96
|
+
rmSync(grokAuthFilePath(homeDir), { force: true });
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Discovery
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
function requestSignal(signal) {
|
|
102
|
+
const timeoutSignal = AbortSignal.timeout(XAI_TOKEN_REQUEST_TIMEOUT_MS);
|
|
103
|
+
return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
104
|
+
}
|
|
105
|
+
/** D6: exact host allow-list, https only, and no userinfo that fetch could turn into auth. */
|
|
106
|
+
function validateXaiAuthEndpoint(rawUrl) {
|
|
107
|
+
const parsed = new URL(rawUrl);
|
|
108
|
+
const host = parsed.hostname.toLowerCase();
|
|
109
|
+
if (parsed.protocol !== "https:" || parsed.username || parsed.password || !XAI_TRUSTED_AUTH_HOSTS.has(host)) {
|
|
110
|
+
throw new Error(`xAI OAuth endpoint is not trusted: ${rawUrl}`);
|
|
111
|
+
}
|
|
112
|
+
return parsed.toString();
|
|
113
|
+
}
|
|
114
|
+
export async function discoverXaiOAuthEndpoints(signal) {
|
|
115
|
+
const response = await fetch(XAI_OAUTH_DISCOVERY_URL, {
|
|
116
|
+
headers: { Accept: "application/json" },
|
|
117
|
+
signal: requestSignal(signal),
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(`xAI OAuth discovery failed: ${response.status} ${await response.text()}`);
|
|
121
|
+
}
|
|
122
|
+
const payload = (await response.json());
|
|
123
|
+
if (typeof payload.authorization_endpoint !== "string" || typeof payload.token_endpoint !== "string") {
|
|
124
|
+
throw new Error("xAI OAuth discovery response missing authorization/token endpoints");
|
|
125
|
+
}
|
|
126
|
+
const discovery = {
|
|
127
|
+
authorizationEndpoint: validateXaiAuthEndpoint(payload.authorization_endpoint),
|
|
128
|
+
tokenEndpoint: validateXaiAuthEndpoint(payload.token_endpoint),
|
|
129
|
+
};
|
|
130
|
+
if (typeof payload.device_authorization_endpoint === "string") {
|
|
131
|
+
discovery.deviceAuthorizationEndpoint = validateXaiAuthEndpoint(payload.device_authorization_endpoint);
|
|
132
|
+
}
|
|
133
|
+
return discovery;
|
|
134
|
+
}
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
// Token endpoint
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
function defaultSleep(ms) {
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
setTimeout(resolve, ms);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** D2: RFC 9110 allows delay-seconds (including fractions) and HTTP-date. */
|
|
144
|
+
function parseRetryAfterMs(retryAfter) {
|
|
145
|
+
const raw = retryAfter?.trim();
|
|
146
|
+
if (!raw)
|
|
147
|
+
return undefined;
|
|
148
|
+
const seconds = Number(raw);
|
|
149
|
+
if (Number.isFinite(seconds))
|
|
150
|
+
return Math.max(0, seconds * 1000);
|
|
151
|
+
const dateMs = Date.parse(raw);
|
|
152
|
+
if (!Number.isFinite(dateMs))
|
|
153
|
+
return undefined;
|
|
154
|
+
return Math.max(0, dateMs - Date.now());
|
|
155
|
+
}
|
|
156
|
+
function retryDelayMs(attempt, retryAfter, random) {
|
|
157
|
+
const fromHeader = parseRetryAfterMs(retryAfter);
|
|
158
|
+
// D1: a server instruction wins over local jitter; only the absolute ceiling clamps it.
|
|
159
|
+
if (fromHeader !== undefined)
|
|
160
|
+
return Math.min(fromHeader, RETRY_AFTER_CAP_MS);
|
|
161
|
+
const base = attempt === 1 ? 100 : 250;
|
|
162
|
+
return Math.min(JITTER_CAP_MS, Math.round(base * (0.75 + random() * 0.5)));
|
|
163
|
+
}
|
|
164
|
+
function isTimeoutError(error) {
|
|
165
|
+
return error instanceof Error && error.name === "TimeoutError";
|
|
166
|
+
}
|
|
167
|
+
/** D9: always drain the failed body so undici can reuse the socket. */
|
|
168
|
+
async function readTokenError(response) {
|
|
169
|
+
let raw = "";
|
|
170
|
+
try {
|
|
171
|
+
raw = await response.text();
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Body already gone; the status alone still classifies the failure.
|
|
175
|
+
}
|
|
176
|
+
let oauthError;
|
|
177
|
+
let detail = "";
|
|
178
|
+
try {
|
|
179
|
+
const body = JSON.parse(raw);
|
|
180
|
+
if (typeof body.error === "string")
|
|
181
|
+
oauthError = body.error;
|
|
182
|
+
if (typeof body.error_description === "string")
|
|
183
|
+
detail = body.error_description;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Non-JSON error body.
|
|
187
|
+
}
|
|
188
|
+
const suffix = detail ? `: ${detail}` : oauthError ? `: ${oauthError}` : "";
|
|
189
|
+
return new XaiTokenRequestError(response.status, oauthError, `xAI token request failed: ${response.status}${suffix}`);
|
|
190
|
+
}
|
|
191
|
+
function sendTokenRequest(tokenEndpoint, body, signal) {
|
|
192
|
+
return fetch(tokenEndpoint, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: { Accept: "application/json", "Content-Type": "application/x-www-form-urlencoded" },
|
|
195
|
+
body: new URLSearchParams(body).toString(),
|
|
196
|
+
signal: requestSignal(signal),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
export async function postXaiToken(tokenEndpoint, body, signal, deps = {}) {
|
|
200
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
201
|
+
const random = deps.random ?? Math.random;
|
|
202
|
+
let last;
|
|
203
|
+
for (let attempt = 1; attempt <= XAI_TOKEN_MAX_ATTEMPTS; attempt++) {
|
|
204
|
+
let response;
|
|
205
|
+
try {
|
|
206
|
+
response = await sendTokenRequest(tokenEndpoint, body, signal);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
// D3: the caller's abort reason can be any value, so trust signal.aborted, not the error type.
|
|
210
|
+
if (signal?.aborted)
|
|
211
|
+
throw error;
|
|
212
|
+
if (isTimeoutError(error)) {
|
|
213
|
+
throw new XaiTokenRequestError(undefined, undefined, "xAI token request timed out", { cause: error });
|
|
214
|
+
}
|
|
215
|
+
last = error;
|
|
216
|
+
if (attempt === XAI_TOKEN_MAX_ATTEMPTS)
|
|
217
|
+
break;
|
|
218
|
+
await sleep(retryDelayMs(attempt, null, random));
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (response.ok)
|
|
222
|
+
return (await response.json());
|
|
223
|
+
const error = await readTokenError(response);
|
|
224
|
+
last = error;
|
|
225
|
+
if (!(response.status === 429 || response.status >= 500) || attempt === XAI_TOKEN_MAX_ATTEMPTS)
|
|
226
|
+
throw error;
|
|
227
|
+
await sleep(retryDelayMs(attempt, response.headers.get("retry-after"), random));
|
|
228
|
+
}
|
|
229
|
+
// D4: never rethrow the bare last value — it can be undefined and erases the failure shape.
|
|
230
|
+
throw new XaiTokenRequestError(undefined, undefined, "xAI token request exhausted retries", { cause: last });
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// Refresh
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
function decodeJwtPayload(token) {
|
|
236
|
+
const parts = token.split(".");
|
|
237
|
+
const payload = parts[1];
|
|
238
|
+
if (parts.length !== 3 || !payload)
|
|
239
|
+
return undefined;
|
|
240
|
+
try {
|
|
241
|
+
return JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/** Display metadata only: the signature is never verified, so this cannot gate authorization. */
|
|
248
|
+
function getTokenIdentity(accessToken, idToken) {
|
|
249
|
+
const payload = (idToken ? decodeJwtPayload(idToken) : undefined) ?? decodeJwtPayload(accessToken);
|
|
250
|
+
const identity = {};
|
|
251
|
+
if (typeof payload?.sub === "string" && payload.sub.length > 0)
|
|
252
|
+
identity.accountId = payload.sub;
|
|
253
|
+
if (typeof payload?.email === "string" && payload.email.length > 0)
|
|
254
|
+
identity.email = payload.email.toLowerCase();
|
|
255
|
+
return identity;
|
|
256
|
+
}
|
|
257
|
+
function credentialsFromTokenPayload(payload, refreshFallback, tokenEndpoint, now) {
|
|
258
|
+
if (typeof payload.access_token !== "string" || payload.access_token.length === 0) {
|
|
259
|
+
throw new Error("xAI token response did not include an access token");
|
|
260
|
+
}
|
|
261
|
+
const refreshToken = typeof payload.refresh_token === "string" && payload.refresh_token.length > 0
|
|
262
|
+
? payload.refresh_token
|
|
263
|
+
: refreshFallback;
|
|
264
|
+
if (!refreshToken)
|
|
265
|
+
throw new Error("xAI token response did not include a refresh token");
|
|
266
|
+
const creds = { accessToken: payload.access_token, refreshToken, tokenEndpoint };
|
|
267
|
+
// D5: no 3600 fallback. An absent expires_in means "unknown", and 401 becomes the signal —
|
|
268
|
+
// inventing an hour would let this module hand out a token it already knows nothing about.
|
|
269
|
+
if (typeof payload.expires_in === "number" && Number.isFinite(payload.expires_in)) {
|
|
270
|
+
creds.expiresAt = now() + payload.expires_in * 1000;
|
|
271
|
+
}
|
|
272
|
+
if (typeof payload.id_token === "string" && payload.id_token.length > 0)
|
|
273
|
+
creds.idToken = payload.id_token;
|
|
274
|
+
const identity = getTokenIdentity(creds.accessToken, creds.idToken);
|
|
275
|
+
if (identity.accountId !== undefined)
|
|
276
|
+
creds.accountId = identity.accountId;
|
|
277
|
+
if (identity.email !== undefined)
|
|
278
|
+
creds.email = identity.email;
|
|
279
|
+
return creds;
|
|
280
|
+
}
|
|
281
|
+
export async function refreshXaiToken(refreshToken, opts = {}) {
|
|
282
|
+
if (!refreshToken)
|
|
283
|
+
throw new Error("xAI credentials are expired and do not include a refresh token");
|
|
284
|
+
const raw = opts.tokenEndpoint ?? (await discoverXaiOAuthEndpoints(opts.signal)).tokenEndpoint;
|
|
285
|
+
const tokenEndpoint = validateXaiAuthEndpoint(raw);
|
|
286
|
+
const payload = await postXaiToken(tokenEndpoint, { grant_type: "refresh_token", client_id: XAI_OAUTH_CLIENT_ID, refresh_token: refreshToken }, opts.signal, opts.deps);
|
|
287
|
+
return credentialsFromTokenPayload(payload, refreshToken, tokenEndpoint, opts.deps?.now ?? Date.now);
|
|
288
|
+
}
|
|
289
|
+
let refreshFlight;
|
|
290
|
+
let terminalFailureUntil = 0;
|
|
291
|
+
const LOGIN_REQUIRED_MESSAGE = "Grok login required. Run: ima2 grok login";
|
|
292
|
+
function toGrokAuthError(error, now) {
|
|
293
|
+
if (error instanceof GrokAuthError)
|
|
294
|
+
return error;
|
|
295
|
+
const oauthError = error instanceof XaiTokenRequestError ? error.oauthError : undefined;
|
|
296
|
+
if (oauthError !== undefined && TERMINAL_OAUTH_ERRORS.has(oauthError)) {
|
|
297
|
+
// Terminal: block further round-trips for a while, but leave the file alone so the user
|
|
298
|
+
// keeps their display metadata and a misclassified failure stays recoverable.
|
|
299
|
+
terminalFailureUntil = now() + TERMINAL_FAILURE_TTL_MS;
|
|
300
|
+
return new GrokAuthError("GROK_AUTH_REQUIRED", `Grok session is no longer valid. ${LOGIN_REQUIRED_MESSAGE}`, {
|
|
301
|
+
oauthError,
|
|
302
|
+
cause: error,
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
306
|
+
return new GrokAuthError("GROK_AUTH_REFRESH_FAILED", `Grok token refresh failed: ${detail}`, {
|
|
307
|
+
...(oauthError !== undefined ? { oauthError } : {}),
|
|
308
|
+
cause: error,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
async function performRefresh(stored, opts) {
|
|
312
|
+
const now = opts.deps?.now ?? Date.now;
|
|
313
|
+
try {
|
|
314
|
+
const fresh = await refreshXaiToken(stored.refreshToken ?? "", {
|
|
315
|
+
...(stored.tokenEndpoint !== undefined ? { tokenEndpoint: stored.tokenEndpoint } : {}),
|
|
316
|
+
...(opts.signal !== undefined ? { signal: opts.signal } : {}),
|
|
317
|
+
...(opts.deps !== undefined ? { deps: opts.deps } : {}),
|
|
318
|
+
});
|
|
319
|
+
const merged = { ...stored, ...fresh };
|
|
320
|
+
// An unknown new expiry must erase the old one rather than inherit a stale deadline.
|
|
321
|
+
if (fresh.expiresAt === undefined)
|
|
322
|
+
delete merged.expiresAt;
|
|
323
|
+
saveGrokCredentials(merged, opts.homeDir);
|
|
324
|
+
return merged;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
throw toGrokAuthError(error, now);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function runRefreshFlight(stored, opts) {
|
|
331
|
+
const now = opts.deps?.now ?? Date.now;
|
|
332
|
+
const existing = refreshFlight;
|
|
333
|
+
if (existing && now() - existing.startedAt <= FLIGHT_STALE_MS)
|
|
334
|
+
return existing.promise;
|
|
335
|
+
const flight = { startedAt: now(), promise: performRefresh(stored, opts) };
|
|
336
|
+
// Release only when we are still the current flight, so a slow earlier refresh cannot
|
|
337
|
+
// clear a newer one (OpenCodex index.ts:537 pattern).
|
|
338
|
+
flight.promise = flight.promise.finally(() => {
|
|
339
|
+
if (refreshFlight === flight)
|
|
340
|
+
refreshFlight = undefined;
|
|
341
|
+
});
|
|
342
|
+
refreshFlight = flight;
|
|
343
|
+
return flight.promise;
|
|
344
|
+
}
|
|
345
|
+
export async function getGrokAccessToken(opts = {}) {
|
|
346
|
+
const now = opts.deps?.now ?? Date.now;
|
|
347
|
+
if (now() < terminalFailureUntil) {
|
|
348
|
+
throw new GrokAuthError("GROK_AUTH_REQUIRED", `Grok session is no longer valid. ${LOGIN_REQUIRED_MESSAGE}`);
|
|
349
|
+
}
|
|
350
|
+
const stored = loadGrokCredentials(opts.homeDir);
|
|
351
|
+
if (!stored)
|
|
352
|
+
throw new GrokAuthError("GROK_AUTH_REQUIRED", LOGIN_REQUIRED_MESSAGE);
|
|
353
|
+
if (opts.rejectedAccessToken !== undefined && stored.accessToken !== opts.rejectedAccessToken) {
|
|
354
|
+
return stored.accessToken;
|
|
355
|
+
}
|
|
356
|
+
const expiring = stored.expiresAt !== undefined && now() + XAI_TOKEN_REFRESH_SKEW_MS >= stored.expiresAt;
|
|
357
|
+
if (!opts.forceRefresh && !expiring)
|
|
358
|
+
return stored.accessToken;
|
|
359
|
+
if (!stored.refreshToken) {
|
|
360
|
+
throw new GrokAuthError("GROK_AUTH_REQUIRED", `Grok session expired and cannot be refreshed. ${LOGIN_REQUIRED_MESSAGE}`);
|
|
361
|
+
}
|
|
362
|
+
const fresh = await runRefreshFlight(stored, opts);
|
|
363
|
+
return fresh.accessToken;
|
|
364
|
+
}
|
|
365
|
+
/** Test-only: clears the single-flight slot and the terminal-failure negative cache. */
|
|
366
|
+
export function __resetGrokAuthStateForTest() {
|
|
367
|
+
refreshFlight = undefined;
|
|
368
|
+
terminalFailureUntil = 0;
|
|
369
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless xAI (Grok) OAuth device-code login.
|
|
3
|
+
*
|
|
4
|
+
* routes/auth.ts keeps its own device-code flow because it is bound to the GUI session Map
|
|
5
|
+
* and its cleanup timers (030 wp4, audit item 6). This module is the CLI-side twin: one call,
|
|
6
|
+
* no module state, no timers left behind, and the only shared surface is lib/xaiAuth.ts.
|
|
7
|
+
*
|
|
8
|
+
* MUST stay a leaf module: only lib/xaiAuth.js. No config, routes, or adapters.
|
|
9
|
+
*/
|
|
10
|
+
import { XAI_OAUTH_CLIENT_ID, XAI_OAUTH_SCOPE, discoverXaiOAuthEndpoints, saveGrokCredentials, } from "./xaiAuth.js";
|
|
11
|
+
const DEVICE_CODE_GRANT = "urn:ietf:params:oauth:grant-type:device_code";
|
|
12
|
+
/** RFC 8628 floor: never poll faster than this even if the server asks for less. */
|
|
13
|
+
const MIN_POLL_INTERVAL_SECONDS = 5;
|
|
14
|
+
const SLOW_DOWN_STEP_MS = 5_000;
|
|
15
|
+
const DEVICE_REQUEST_TIMEOUT_MS = 15_000;
|
|
16
|
+
const TOKEN_REQUEST_TIMEOUT_MS = 10_000;
|
|
17
|
+
function defaultSleep(ms) {
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
setTimeout(resolve, ms);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function requestSignal(signal, timeoutMs) {
|
|
23
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
24
|
+
return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
25
|
+
}
|
|
26
|
+
function formEncoded(body) {
|
|
27
|
+
return {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { Accept: "application/json", "Content-Type": "application/x-www-form-urlencoded" },
|
|
30
|
+
body: new URLSearchParams(body).toString(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function requestDeviceCode(endpoint, deps) {
|
|
34
|
+
const response = await deps.doFetch(endpoint, {
|
|
35
|
+
...formEncoded({ client_id: XAI_OAUTH_CLIENT_ID, scope: XAI_OAUTH_SCOPE }),
|
|
36
|
+
signal: requestSignal(deps.signal, DEVICE_REQUEST_TIMEOUT_MS),
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw new Error(`xAI device code request failed: ${response.status} ${await response.text()}`);
|
|
40
|
+
}
|
|
41
|
+
const body = (await response.json());
|
|
42
|
+
const verification = typeof body.verification_uri_complete === "string" && body.verification_uri_complete
|
|
43
|
+
? body.verification_uri_complete
|
|
44
|
+
: body.verification_uri;
|
|
45
|
+
if (typeof body.device_code !== "string" || typeof body.user_code !== "string" || typeof verification !== "string") {
|
|
46
|
+
throw new Error("xAI device code response is missing device_code/user_code/verification_uri");
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
deviceCode: body.device_code,
|
|
50
|
+
userCode: body.user_code,
|
|
51
|
+
verificationUrl: verification,
|
|
52
|
+
expiresIn: typeof body.expires_in === "number" && Number.isFinite(body.expires_in) ? body.expires_in : 600,
|
|
53
|
+
intervalSeconds: typeof body.interval === "number" && Number.isFinite(body.interval) ? body.interval : MIN_POLL_INTERVAL_SECONDS,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function pollTokenOnce(tokenEndpoint, deviceCode, deps) {
|
|
57
|
+
const response = await deps.doFetch(tokenEndpoint, {
|
|
58
|
+
...formEncoded({ grant_type: DEVICE_CODE_GRANT, client_id: XAI_OAUTH_CLIENT_ID, device_code: deviceCode }),
|
|
59
|
+
signal: requestSignal(deps.signal, TOKEN_REQUEST_TIMEOUT_MS),
|
|
60
|
+
});
|
|
61
|
+
if (response.ok)
|
|
62
|
+
return { kind: "token", payload: (await response.json()) };
|
|
63
|
+
const raw = await response.text();
|
|
64
|
+
let oauthError;
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(raw);
|
|
67
|
+
if (typeof parsed.error === "string")
|
|
68
|
+
oauthError = parsed.error;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Non-JSON error body; the status alone classifies the failure.
|
|
72
|
+
}
|
|
73
|
+
if (oauthError === "authorization_pending")
|
|
74
|
+
return { kind: "pending" };
|
|
75
|
+
if (oauthError === "slow_down")
|
|
76
|
+
return { kind: "slow_down" };
|
|
77
|
+
throw new Error(`xAI device login failed: ${oauthError ?? `HTTP ${response.status}`}`);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Elapsed time is the larger of wall time and the time we asked to sleep, so an injected
|
|
81
|
+
* no-op sleep still walks the clock to expires_in instead of spinning forever.
|
|
82
|
+
*/
|
|
83
|
+
async function pollUntilAuthorized(tokenEndpoint, grant, deps) {
|
|
84
|
+
const startedAt = Date.now();
|
|
85
|
+
const deadlineMs = grant.expiresIn * 1000;
|
|
86
|
+
let intervalMs = Math.max(grant.intervalSeconds, MIN_POLL_INTERVAL_SECONDS) * 1000;
|
|
87
|
+
let sleptMs = 0;
|
|
88
|
+
while (Math.max(Date.now() - startedAt, sleptMs) < deadlineMs) {
|
|
89
|
+
await deps.sleep(intervalMs);
|
|
90
|
+
sleptMs += intervalMs;
|
|
91
|
+
if (deps.signal?.aborted)
|
|
92
|
+
throw new Error("xAI device login was aborted");
|
|
93
|
+
const outcome = await pollTokenOnce(tokenEndpoint, grant.deviceCode, deps);
|
|
94
|
+
if (outcome.kind === "token")
|
|
95
|
+
return outcome.payload;
|
|
96
|
+
if (outcome.kind === "slow_down")
|
|
97
|
+
intervalMs += SLOW_DOWN_STEP_MS;
|
|
98
|
+
}
|
|
99
|
+
throw new Error("xAI device login expired before it was approved");
|
|
100
|
+
}
|
|
101
|
+
/** Display metadata only: the id_token signature is never verified here. */
|
|
102
|
+
function emailFromIdToken(idToken) {
|
|
103
|
+
const segment = idToken.split(".")[1];
|
|
104
|
+
if (!segment)
|
|
105
|
+
return undefined;
|
|
106
|
+
try {
|
|
107
|
+
const payload = JSON.parse(Buffer.from(segment, "base64url").toString("utf8"));
|
|
108
|
+
if (typeof payload.email !== "string" || payload.email.length === 0)
|
|
109
|
+
return undefined;
|
|
110
|
+
return payload.email.toLowerCase();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function credentialsFromDeviceToken(payload, tokenEndpoint) {
|
|
117
|
+
if (typeof payload.access_token !== "string" || payload.access_token.length === 0) {
|
|
118
|
+
throw new Error("xAI token response did not include an access token");
|
|
119
|
+
}
|
|
120
|
+
const creds = { accessToken: payload.access_token, tokenEndpoint };
|
|
121
|
+
if (typeof payload.refresh_token === "string" && payload.refresh_token.length > 0) {
|
|
122
|
+
creds.refreshToken = payload.refresh_token;
|
|
123
|
+
}
|
|
124
|
+
// Same rule as lib/xaiAuth.ts (D5): an absent expires_in means "unknown", never one hour.
|
|
125
|
+
if (typeof payload.expires_in === "number" && Number.isFinite(payload.expires_in)) {
|
|
126
|
+
creds.expiresAt = Date.now() + payload.expires_in * 1000;
|
|
127
|
+
}
|
|
128
|
+
if (typeof payload.id_token === "string" && payload.id_token.length > 0) {
|
|
129
|
+
creds.idToken = payload.id_token;
|
|
130
|
+
const email = emailFromIdToken(payload.id_token);
|
|
131
|
+
if (email !== undefined)
|
|
132
|
+
creds.email = email;
|
|
133
|
+
}
|
|
134
|
+
return creds;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Runs one complete device-code login and writes the session with saveGrokCredentials().
|
|
138
|
+
* Rejects on discovery failure, a missing device_authorization_endpoint, a terminal OAuth
|
|
139
|
+
* error, an abort, or expiry. Nothing is written unless a token actually came back.
|
|
140
|
+
*/
|
|
141
|
+
export async function runXaiDeviceLogin(opts) {
|
|
142
|
+
const deps = {
|
|
143
|
+
doFetch: opts.fetchImpl ?? ((...args) => fetch(...args)),
|
|
144
|
+
sleep: opts.sleep ?? defaultSleep,
|
|
145
|
+
signal: opts.signal,
|
|
146
|
+
};
|
|
147
|
+
const discovery = await discoverXaiOAuthEndpoints(opts.signal);
|
|
148
|
+
const deviceEndpoint = discovery.deviceAuthorizationEndpoint;
|
|
149
|
+
if (!deviceEndpoint)
|
|
150
|
+
throw new Error("xAI does not expose device_authorization_endpoint");
|
|
151
|
+
const grant = await requestDeviceCode(deviceEndpoint, deps);
|
|
152
|
+
opts.onUserCode({ userCode: grant.userCode, verificationUrl: grant.verificationUrl, expiresIn: grant.expiresIn });
|
|
153
|
+
const payload = await pollUntilAuthorized(discovery.tokenEndpoint, grant, deps);
|
|
154
|
+
const creds = credentialsFromDeviceToken(payload, discovery.tokenEndpoint);
|
|
155
|
+
saveGrokCredentials(creds, opts.homeDir);
|
|
156
|
+
return creds;
|
|
157
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ima2-gen",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.16.0",
|
|
4
4
|
"packageManager": "npm@11.18.0",
|
|
5
5
|
"description": "Local-first visual generation runtime and studio for people and coding agents, with reproducible image and video workflows across multiple providers.",
|
|
6
6
|
"type": "module",
|
|
@@ -99,7 +99,6 @@
|
|
|
99
99
|
"google-auth-library": "^11.0.1",
|
|
100
100
|
"openai": "^7.4.0",
|
|
101
101
|
"openai-oauth": "file:vendor/openai-oauth-1.0.2-ima2.1.tgz",
|
|
102
|
-
"progrok": "file:vendor/progrok-0.2.0.tgz",
|
|
103
102
|
"sharp": "^0.35.3",
|
|
104
103
|
"trash": "^10.1.1",
|
|
105
104
|
"ulid": "^3.0.2",
|
|
@@ -109,7 +108,6 @@
|
|
|
109
108
|
"fast-uri": "3.1.7"
|
|
110
109
|
},
|
|
111
110
|
"bundleDependencies": [
|
|
112
|
-
"progrok",
|
|
113
111
|
"openai-oauth",
|
|
114
112
|
"zod"
|
|
115
113
|
],
|
|
@@ -127,5 +125,5 @@
|
|
|
127
125
|
"typescript": "^5.9.3",
|
|
128
126
|
"yaml": "2.9.0"
|
|
129
127
|
},
|
|
130
|
-
"gitHead": "
|
|
128
|
+
"gitHead": "7fa7d426d92813caeeff667a458b781237029df0"
|
|
131
129
|
}
|
package/routes/auth.js
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { randomBytes } from "node:crypto";
|
|
3
|
-
import { writeFileSync, renameSync, mkdirSync, existsSync } from "node:fs";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
import { join } from "node:path";
|
|
6
3
|
import { codexFileLoginArgs, detectCodexAuth } from "../lib/codexDetect.js";
|
|
7
4
|
import { packageCliCommand } from "../lib/packageCli.js";
|
|
8
|
-
|
|
9
|
-
const GROK_SCOPE = "openid profile email offline_access grok-cli:access api:access";
|
|
10
|
-
const GROK_TOKEN_URL = "https://auth.x.ai/oauth2/token";
|
|
5
|
+
import { XAI_OAUTH_CLIENT_ID as GROK_CLIENT_ID, XAI_OAUTH_SCOPE as GROK_SCOPE, XAI_TOKEN_ENDPOINT_FALLBACK as GROK_TOKEN_URL, loadGrokCredentials, saveGrokCredentials, } from "../lib/xaiAuth.js";
|
|
11
6
|
const CODEX_DEVICE_CODE_GRANT = "urn:ietf:params:oauth:grant-type:device_code";
|
|
12
7
|
const MAX_CONCURRENT_SESSIONS = 20;
|
|
13
8
|
const sessions = new Map();
|
|
@@ -28,9 +23,9 @@ function stripAnsi(s) {
|
|
|
28
23
|
return s.replace(/\x1B\[[0-9;]*m/g, "");
|
|
29
24
|
}
|
|
30
25
|
function saveGrokTokens(tokens) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
if (typeof tokens.access_token !== "string" || tokens.access_token.length === 0) {
|
|
27
|
+
throw new Error("xAI token response did not include an access token");
|
|
28
|
+
}
|
|
34
29
|
let email;
|
|
35
30
|
if (typeof tokens.id_token === "string") {
|
|
36
31
|
try {
|
|
@@ -42,23 +37,20 @@ function saveGrokTokens(tokens) {
|
|
|
42
37
|
}
|
|
43
38
|
catch { /* ignore */ }
|
|
44
39
|
}
|
|
40
|
+
// Merge over the existing file so a field only progrok writes (idToken) survives a
|
|
41
|
+
// fresh login; the atomic 0600 write itself lives in lib/xaiAuth.ts.
|
|
45
42
|
const data = {
|
|
43
|
+
...(loadGrokCredentials() ?? {}),
|
|
46
44
|
accessToken: tokens.access_token,
|
|
47
|
-
refreshToken: tokens.refresh_token,
|
|
48
|
-
|
|
45
|
+
...(typeof tokens.refresh_token === "string" ? { refreshToken: tokens.refresh_token } : {}),
|
|
46
|
+
...(typeof tokens.expires_in === "number" ? { expiresAt: Date.now() + tokens.expires_in * 1000 } : {}),
|
|
49
47
|
tokenEndpoint: GROK_TOKEN_URL,
|
|
48
|
+
...(typeof tokens.id_token === "string" ? { idToken: tokens.id_token } : {}),
|
|
49
|
+
...(email ? { email } : {}),
|
|
50
50
|
};
|
|
51
|
-
|
|
52
|
-
data.email = email;
|
|
53
|
-
// Atomic write: temp file (0600) + rename, so concurrent completions or a crash
|
|
54
|
-
// mid-flush can never truncate/corrupt the only credential file. Rename also
|
|
55
|
-
// guarantees final perms are 0600 even if a looser-perm file pre-existed.
|
|
56
|
-
const target = join(dir, "auth.json");
|
|
57
|
-
const tmp = join(dir, `auth.json.tmp-${randomBytes(6).toString("hex")}`);
|
|
58
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
59
|
-
renameSync(tmp, target);
|
|
51
|
+
saveGrokCredentials(data);
|
|
60
52
|
}
|
|
61
|
-
async function startGrokDeviceCode(
|
|
53
|
+
async function startGrokDeviceCode() {
|
|
62
54
|
const discovery = await fetch("https://auth.x.ai/.well-known/openid-configuration", { signal: AbortSignal.timeout(10000) });
|
|
63
55
|
const disc = await discovery.json();
|
|
64
56
|
if (!disc.device_authorization_endpoint)
|
|
@@ -107,9 +99,6 @@ async function startGrokDeviceCode(onCredentialsSaved) {
|
|
|
107
99
|
if (tokenRes.ok) {
|
|
108
100
|
const tokens = await tokenRes.json();
|
|
109
101
|
saveGrokTokens(tokens);
|
|
110
|
-
// progrok checks credentials only at startup, so a proxy that gave up
|
|
111
|
-
// before login stays dead until something tells it the world changed.
|
|
112
|
-
onCredentialsSaved?.();
|
|
113
102
|
session.status = "complete";
|
|
114
103
|
cleanup(id);
|
|
115
104
|
return;
|
|
@@ -218,7 +207,10 @@ function startCodexDeviceCode() {
|
|
|
218
207
|
}, 30000);
|
|
219
208
|
});
|
|
220
209
|
}
|
|
221
|
-
|
|
210
|
+
/** `_ctx` is accepted only to keep the registration signature uniform in
|
|
211
|
+
* routes/index.ts; the device-code flow writes credentials to disk and no
|
|
212
|
+
* longer notifies any in-process supervisor. */
|
|
213
|
+
export function registerAuthRoutes(app, _ctx) {
|
|
222
214
|
app.post("/api/auth/switch", async (req, res) => {
|
|
223
215
|
const provider = req.body?.provider;
|
|
224
216
|
if (provider !== "grok" && provider !== "codex") {
|
|
@@ -229,7 +221,7 @@ export function registerAuthRoutes(app, ctx) {
|
|
|
229
221
|
}
|
|
230
222
|
try {
|
|
231
223
|
const result = provider === "grok"
|
|
232
|
-
? await startGrokDeviceCode(
|
|
224
|
+
? await startGrokDeviceCode()
|
|
233
225
|
: await startCodexDeviceCode();
|
|
234
226
|
res.json(result);
|
|
235
227
|
}
|