@cartanova/qgrid-cli 2.10.9 → 2.11.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/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
- package/bundle/dist/application/monit/log-buffer.js +12 -6
- package/bundle/dist/application/monit/monit.frame.js +11 -3
- package/bundle/dist/application/monit/monit.types.js +1 -1
- package/bundle/dist/application/qgrid/conv-routing.js +9 -6
- package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
- package/bundle/dist/application/qgrid/oauth.js +31 -4
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
- package/bundle/dist/application/qgrid/qgrid-response-format.js +22 -20
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +43 -34
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
- package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
- package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
- package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
- package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
- package/bundle/dist/application/qgrid/token-death.js +1 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
- package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
- package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
- package/bundle/dist/application/request-log/request-log.model.js +83 -69
- package/bundle/dist/application/request-log/request-log.types.js +8 -2
- package/bundle/dist/application/request-log/zod-code-format.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +1 -1
- package/bundle/dist/application/setting/setting.model.js +2 -2
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +40 -16
- package/bundle/dist/application/sonamu.generated.sso.js +2 -1
- package/bundle/dist/application/token/token.model.js +26 -9
- package/bundle/dist/application/token/token.types.js +20 -3
- package/bundle/dist/i18n/en.js +15 -1
- package/bundle/dist/i18n/ko.js +15 -1
- package/bundle/dist/i18n/sd.generated.js +2 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
- package/bundle/dist/migrations/20261018215031_alter_request_logs_add1_alter1.js +15 -0
- package/bundle/dist/server-bootstrap.js +4 -2
- package/bundle/dist/server-error-handler.js +1 -1
- package/bundle/dist/sonamu.config.js +37 -8
- package/bundle/dist/startup-migrations.js +17 -7
- package/bundle/dist/testing/global.js +1 -1
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/testing/test-database-name.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
- package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
- package/bundle/dist/utils/providers/common/credentials.js +5 -1
- package/bundle/dist/utils/providers/common/effort.js +3 -3
- package/bundle/dist/utils/providers/common/model-cost.js +69 -14
- package/bundle/dist/utils/providers/common/provider-types.js +29 -1
- package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
- package/bundle/dist/utils/providers/common/strictifier.js +62 -43
- package/bundle/dist/utils/providers/common/thinking.js +3 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -1
- package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
- package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
- package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
- package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
- package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
- package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
- package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
- package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
- package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
- package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
- package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
- package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
- package/bundle/dist/utils/providers/grok/index.js +11 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
- package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
- package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
- package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
- package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
- package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
- package/bundle/dist/utils/quiet-hours.js +1 -1
- package/bundle/dist/utils/slack-notify.js +14 -8
- package/bundle/dist/utils/subset-loaders.js +4 -5
- package/bundle/src/application/monit/log-buffer.ts +23 -9
- package/bundle/src/application/monit/monit.frame.ts +22 -5
- package/bundle/src/application/monit/monit.types.ts +6 -0
- package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
- package/bundle/src/application/qgrid/conv-routing.ts +35 -9
- package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
- package/bundle/src/application/qgrid/oauth.ts +51 -15
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
- package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +33 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +87 -40
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
- package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
- package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
- package/bundle/src/application/qgrid/token-death.ts +4 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
- package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
- package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
- package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
- package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
- package/bundle/src/application/request-log/request-log.entity.json +8 -0
- package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
- package/bundle/src/application/request-log/request-log.model.ts +279 -145
- package/bundle/src/application/request-log/request-log.types.ts +17 -0
- package/bundle/src/application/request-log/zod-code-format.ts +11 -0
- package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
- package/bundle/src/application/setting/setting.constant.ts +9 -0
- package/bundle/src/application/setting/setting.model.ts +12 -2
- package/bundle/src/application/setting/setting.store.ts +5 -1
- package/bundle/src/application/setting/setting.types.ts +8 -0
- package/bundle/src/application/sonamu.generated.http +135 -0
- package/bundle/src/application/sonamu.generated.sso.ts +3 -0
- package/bundle/src/application/sonamu.generated.ts +29 -0
- package/bundle/src/application/token/token.identity.test.ts +20 -0
- package/bundle/src/application/token/token.model.ts +66 -7
- package/bundle/src/application/token/token.types.ts +24 -1
- package/bundle/src/i18n/en.ts +19 -0
- package/bundle/src/i18n/ko.ts +21 -0
- package/bundle/src/i18n/sd.generated.ts +24 -2
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
- package/bundle/src/migrations/20261018215031_alter_request_logs_add1_alter1.ts +15 -0
- package/bundle/src/server-bootstrap.ts +4 -2
- package/bundle/src/server-error-handler.ts +1 -0
- package/bundle/src/sonamu.config.ts +69 -7
- package/bundle/src/startup-migrations.ts +27 -9
- package/bundle/src/testing/global.ts +20 -0
- package/bundle/src/testing/schema-bench.ts +105 -30
- package/bundle/src/testing/test-database-name.ts +2 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
- package/bundle/src/utils/providers/common/credentials.ts +8 -0
- package/bundle/src/utils/providers/common/effort.ts +9 -2
- package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
- package/bundle/src/utils/providers/common/model-cost.ts +259 -158
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
- package/bundle/src/utils/providers/common/provider-types.ts +46 -3
- package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
- package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
- package/bundle/src/utils/providers/common/strictifier.ts +185 -59
- package/bundle/src/utils/providers/common/thinking.ts +2 -2
- package/bundle/src/utils/providers/common/ttft.ts +4 -2
- package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
- package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
- package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
- package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
- package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
- package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
- package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
- package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
- package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
- package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
- package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
- package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
- package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
- package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
- package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
- package/bundle/src/utils/providers/grok/index.ts +20 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
- package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
- package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
- package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
- package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
- package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
- package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
- package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
- package/bundle/src/utils/quiet-hours.ts +12 -1
- package/bundle/src/utils/slack-notify.ts +44 -13
- package/bundle/src/utils/subset-loaders.ts +7 -7
- package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
- package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
- package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
- package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
- package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
- package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
- package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
- package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
- package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
- package/bundle/web-dist/client/assets/{services.generated-BsieU37H.js → services.generated-CefiDXEv.js} +5 -5
- package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
- package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
- package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
- package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
- package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
- package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
- package/bundle/web-dist/client/index.html +6 -6
- package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
- package/bundle/web-dist/server/assets/{lazyRouteComponent-Dtd0NR4r.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
- package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
- package/bundle/web-dist/server/assets/{monit-DvzribSE.js → monit-B2hqorPe.js} +385 -126
- package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
- package/bundle/web-dist/server/assets/{react-dom-B4a6-uuR.js → react-dom-BIYQzBqG.js} +2 -129
- package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
- package/bundle/web-dist/server/assets/{request-model-CbqfnQOJ.js → request-model-I6OdODSH.js} +15 -6
- package/bundle/web-dist/server/assets/{routes-BAPWTizT.js → routes-B95YlUv2.js} +760 -213
- package/bundle/web-dist/server/assets/{services.generated-CEbGjsI0.js → services.generated-DQATJ6qf.js} +12821 -12194
- package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
- package/bundle/web-dist/server/assets/{show-CxVZTAdv.js → show-Bxaj3rhH.js} +1355 -419
- package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
- package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
- package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
- package/bundle/web-dist/server/assets/{use-update-token-mutation-CfYmk_4_.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +4303 -22810
- package/dist/cli.js +9 -9
- package/package.json +4 -11
- package/postinstall.mjs +12 -0
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
- package/skills/qgrid/references/decision-rationale.md +24 -1
- package/skills/qgrid/references/grok-runtime.md +89 -0
- package/skills/qgrid/references/provider-runtime-differences.md +30 -29
- package/skills/qgrid/references/repo-map.md +10 -0
- package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
- package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
- package/bundle/dist/testing/setup-mocks.js +0 -16
- package/bundle/src/testing/setup-mocks.ts +0 -44
- package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
- package/bundle/web-dist/client/assets/index-CrXKu_J8.js +0 -106
- package/bundle/web-dist/client/assets/logs-B2SmWJXA.js +0 -1
- package/bundle/web-dist/client/assets/monit-D-JwXXoA.js +0 -1
- package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
- package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
- package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
- package/bundle/web-dist/client/assets/routes-C5r4gTvY.js +0 -5
- package/bundle/web-dist/client/assets/settings-D3tDSAck.js +0 -1
- package/bundle/web-dist/client/assets/show-Cah_kUKC.js +0 -2
- package/bundle/web-dist/client/assets/tokens-DU2Iyxxd.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-D0UaR9_e.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-DAq0F8p-.js +0 -1
- package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
- package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
- package/bundle/web-dist/server/assets/logs-l91avYif.js +0 -509
- package/bundle/web-dist/server/assets/plus-KZrECewT.js +0 -19
- package/bundle/web-dist/server/assets/refresh-cw-BND93JrF.js +0 -23
- package/bundle/web-dist/server/assets/settings-BZR5HSAL.js +0 -461
- package/bundle/web-dist/server/assets/tokens-D1hb4eKk.js +0 -448
- package/bundle/web-dist/server/assets/use-oauth-login-flow-Cvdy0zF8.js +0 -178
- package/dist/cli.d.ts +0 -10
- /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
- /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { classifyGrokHttpError, readGrokResponseHeaders } from "./grok-backend-protocol";
|
|
4
|
+
import { GROK_PUBLIC_API_URL, GROK_STT_DEFAULT_MODEL } from "./grok-constants";
|
|
5
|
+
import { GrokHttpError, grokHttpErrorFromResponse } from "./grok-direct-client";
|
|
6
|
+
import { buildGrokVoiceHeaders, type GrokPlatform } from "./grok-headers";
|
|
7
|
+
import {
|
|
8
|
+
GrokSttResponse,
|
|
9
|
+
GrokTtsRequest,
|
|
10
|
+
type GrokSpeechResult,
|
|
11
|
+
type GrokTranscribeRequest,
|
|
12
|
+
type GrokVoicePort,
|
|
13
|
+
} from "./grok-types";
|
|
14
|
+
|
|
15
|
+
// HTTP client for api.x.ai speech-to-text (multipart `POST /stt`) and text-to-speech (JSON
|
|
16
|
+
// `POST /tts`), both accepted with the subscription JWT (U0). grok-build only ships a WebSocket
|
|
17
|
+
// STT client, so there is no grok-build precedent for an HTTP timeout; 120 s total covers
|
|
18
|
+
// upload, server processing and the body download of long audio. Requests are never re-issued:
|
|
19
|
+
// once the body may have been sent, upstream may already be executing (and billing) it.
|
|
20
|
+
|
|
21
|
+
export const GROK_VOICE_TIMEOUT_MS = 120_000;
|
|
22
|
+
export const GROK_TTS_DEFAULT_VOICE = "ara";
|
|
23
|
+
export const GROK_TTS_DEFAULT_LANGUAGE = "en";
|
|
24
|
+
export const GROK_TTS_DEFAULT_FORMAT = "mp3";
|
|
25
|
+
|
|
26
|
+
// Undici / Node error codes that prove no connection existed, so no request byte left qgrid.
|
|
27
|
+
const CONNECT_FAILURE_CODES = new Set([
|
|
28
|
+
"ECONNREFUSED",
|
|
29
|
+
"ENOTFOUND",
|
|
30
|
+
"EAI_AGAIN",
|
|
31
|
+
"EHOSTUNREACH",
|
|
32
|
+
"ENETUNREACH",
|
|
33
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
// Same subtype mapping as @ai-sdk/provider-utils mediaTypeToExtension.
|
|
37
|
+
const EXTENSION_BY_SUBTYPE: ReadonlyMap<string, string> = new Map([
|
|
38
|
+
["mpeg", "mp3"],
|
|
39
|
+
["x-wav", "wav"],
|
|
40
|
+
["opus", "ogg"],
|
|
41
|
+
["mp4", "m4a"],
|
|
42
|
+
["x-m4a", "m4a"],
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
const MEDIA_TYPE_BY_FORMAT: ReadonlyMap<string, string> = new Map([
|
|
46
|
+
["mp3", "audio/mpeg"],
|
|
47
|
+
["wav", "audio/wav"],
|
|
48
|
+
["pcm", "audio/pcm"],
|
|
49
|
+
["mulaw", "audio/basic"],
|
|
50
|
+
["alaw", "audio/x-alaw-basic"],
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
export interface GrokVoiceClientOptions {
|
|
54
|
+
fetch?: typeof fetch;
|
|
55
|
+
baseUrl?: string;
|
|
56
|
+
timeoutMs?: number;
|
|
57
|
+
platform?: GrokPlatform;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** `speak` input: the port's request with `voice`, `language` and `format` defaulted. */
|
|
61
|
+
export type GrokSpeakInput = Pick<GrokTtsRequest, "text"> &
|
|
62
|
+
Partial<Omit<GrokTtsRequest, "text">> & { signal?: AbortSignal };
|
|
63
|
+
|
|
64
|
+
// One link of a thrown value's cause chain; any non-null object qualifies.
|
|
65
|
+
const errorChainLink = z.looseObject({
|
|
66
|
+
code: z.unknown().optional(),
|
|
67
|
+
errors: z.unknown().optional(),
|
|
68
|
+
cause: z.unknown().optional(),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const coded = z.looseObject({ code: z.string() });
|
|
72
|
+
|
|
73
|
+
function errorCodes(cause: unknown): string[] {
|
|
74
|
+
const codes: string[] = [];
|
|
75
|
+
let link = errorChainLink.safeParse(cause);
|
|
76
|
+
|
|
77
|
+
for (let depth = 0; depth < 5 && link.success; depth++) {
|
|
78
|
+
const code = z.string().safeParse(link.data.code);
|
|
79
|
+
|
|
80
|
+
if (code.success) codes.push(code.data);
|
|
81
|
+
const nested = z.array(z.unknown()).safeParse(link.data.errors);
|
|
82
|
+
|
|
83
|
+
if (nested.success) {
|
|
84
|
+
for (const inner of nested.data) {
|
|
85
|
+
const innerCode = coded.safeParse(inner);
|
|
86
|
+
|
|
87
|
+
if (innerCode.success) codes.push(innerCode.data.code);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
link = errorChainLink.safeParse(link.data.cause);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return codes;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function isConnectFailure(cause: unknown): boolean {
|
|
98
|
+
const codes = errorCodes(cause);
|
|
99
|
+
|
|
100
|
+
return codes.length > 0 && codes.every((code) => CONNECT_FAILURE_CODES.has(code));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function abortReason(signal: AbortSignal): Error {
|
|
104
|
+
const reason: unknown = signal.reason;
|
|
105
|
+
|
|
106
|
+
return reason instanceof Error ? reason : new DOMException("Aborted", "AbortError");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Status-0 transient error. `afterSend` failures carry `shouldRetry: false` so no layer replays a
|
|
111
|
+
* POST whose body may have been executed upstream.
|
|
112
|
+
*/
|
|
113
|
+
function transportError(message: string, afterSend: boolean, cause: unknown): GrokHttpError {
|
|
114
|
+
const classification = { ...classifyGrokHttpError(0, "", {}), message };
|
|
115
|
+
|
|
116
|
+
if (afterSend) classification.shouldRetry = false;
|
|
117
|
+
|
|
118
|
+
return new GrokHttpError(classification, "", {}, { cause });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function invalidBodyError(response: Response, message: string, cause?: unknown): GrokHttpError {
|
|
122
|
+
return new GrokHttpError(
|
|
123
|
+
{ ...classifyGrokHttpError(502, "", response.headers), message, shouldRetry: false },
|
|
124
|
+
"",
|
|
125
|
+
readGrokResponseHeaders(response.headers),
|
|
126
|
+
cause === undefined ? undefined : { cause },
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function audioExtension(mediaType: string): string {
|
|
131
|
+
const subtype = mediaType.toLowerCase().split(";")[0]?.split("/")[1]?.trim() ?? "";
|
|
132
|
+
|
|
133
|
+
return EXTENSION_BY_SUBTYPE.get(subtype) ?? (/^[a-z0-9.+-]+$/.test(subtype) ? subtype : "bin");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function contentMediaType(response: Response): string | undefined {
|
|
137
|
+
const value = response.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase();
|
|
138
|
+
|
|
139
|
+
return value ? value : undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export class GrokVoiceClient implements GrokVoicePort {
|
|
143
|
+
private readonly fetchImpl: typeof fetch;
|
|
144
|
+
private readonly baseUrl: string;
|
|
145
|
+
private readonly timeoutMs: number;
|
|
146
|
+
private readonly platform: GrokPlatform | undefined;
|
|
147
|
+
|
|
148
|
+
constructor(options: GrokVoiceClientOptions = {}) {
|
|
149
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
150
|
+
this.baseUrl = options.baseUrl ?? GROK_PUBLIC_API_URL;
|
|
151
|
+
this.timeoutMs = options.timeoutMs ?? GROK_VOICE_TIMEOUT_MS;
|
|
152
|
+
this.platform = options.platform;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Multipart `POST /stt`: `model` first, optional `language`, `file` last (xAI requirement). */
|
|
156
|
+
async transcribe(bearer: string, request: GrokTranscribeRequest): Promise<GrokSttResponse> {
|
|
157
|
+
if (request.audio.byteLength === 0) throw new TypeError("audio must not be empty");
|
|
158
|
+
|
|
159
|
+
if (!/^[\w.+-]+\/[\w.+-]+/.test(request.mediaType))
|
|
160
|
+
throw new TypeError("mediaType must be a type/subtype media type");
|
|
161
|
+
const form = new FormData();
|
|
162
|
+
form.append("model", request.model ?? GROK_STT_DEFAULT_MODEL);
|
|
163
|
+
|
|
164
|
+
if (request.language) form.append("language", request.language);
|
|
165
|
+
const filename = `audio.${audioExtension(request.mediaType)}`;
|
|
166
|
+
form.append(
|
|
167
|
+
"file",
|
|
168
|
+
new File([new Uint8Array(request.audio)], filename, { type: request.mediaType }),
|
|
169
|
+
filename,
|
|
170
|
+
);
|
|
171
|
+
// fetch sets the multipart content-type with its boundary.
|
|
172
|
+
const headers = buildGrokVoiceHeaders({ bearer, platform: this.platform });
|
|
173
|
+
|
|
174
|
+
return this.post("/stt", headers, form, request.signal, async (response) => {
|
|
175
|
+
let json: unknown;
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
json = await response.json();
|
|
179
|
+
} catch (error) {
|
|
180
|
+
throw invalidBodyError(response, "invalid JSON body", error);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// The SDK schema allows null language/duration; treat null as absent.
|
|
184
|
+
const record = z.looseObject({}).safeParse(json);
|
|
185
|
+
|
|
186
|
+
const normalized = record.success
|
|
187
|
+
? Object.fromEntries(Object.entries(record.data).filter(([, value]) => value !== null))
|
|
188
|
+
: json;
|
|
189
|
+
|
|
190
|
+
const parsed = GrokSttResponse.safeParse(normalized);
|
|
191
|
+
|
|
192
|
+
if (!parsed.success) throw invalidBodyError(response, "invalid STT response", parsed.error);
|
|
193
|
+
const { language, ...rest } = parsed.data;
|
|
194
|
+
|
|
195
|
+
return language ? { ...rest, language } : rest;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** JSON `POST /tts` returning the raw audio bytes. `language` is required upstream (U0). */
|
|
200
|
+
async speak(bearer: string, request: GrokSpeakInput): Promise<GrokSpeechResult> {
|
|
201
|
+
const body = GrokTtsRequest.parse({
|
|
202
|
+
text: request.text,
|
|
203
|
+
voice: request.voice ?? GROK_TTS_DEFAULT_VOICE,
|
|
204
|
+
language: request.language ?? GROK_TTS_DEFAULT_LANGUAGE,
|
|
205
|
+
format: request.format ?? GROK_TTS_DEFAULT_FORMAT,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const headers = {
|
|
209
|
+
...buildGrokVoiceHeaders({ bearer, platform: this.platform }),
|
|
210
|
+
"content-type": "application/json",
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
return this.post("/tts", headers, JSON.stringify(body), request.signal, async (response) => {
|
|
214
|
+
const mediaType = contentMediaType(response);
|
|
215
|
+
|
|
216
|
+
if (mediaType === "application/json" || mediaType?.startsWith("text/"))
|
|
217
|
+
throw invalidBodyError(response, `expected audio, got ${mediaType}`);
|
|
218
|
+
let audio: Uint8Array;
|
|
219
|
+
|
|
220
|
+
try {
|
|
221
|
+
audio = new Uint8Array(await response.arrayBuffer());
|
|
222
|
+
} catch (error) {
|
|
223
|
+
throw invalidBodyError(response, "failed to read audio body", error);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (audio.byteLength === 0) throw invalidBodyError(response, "empty audio body");
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
audio,
|
|
230
|
+
mediaType: mediaType ?? MEDIA_TYPE_BY_FORMAT.get(body.format) ?? "application/octet-stream",
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* One POST, never retried. The total timeout covers the response body too; a caller abort
|
|
237
|
+
* rethrows the caller's reason.
|
|
238
|
+
*/
|
|
239
|
+
private async post<T>(
|
|
240
|
+
path: string,
|
|
241
|
+
headers: Record<string, string>,
|
|
242
|
+
body: FormData | string,
|
|
243
|
+
callerSignal: AbortSignal | undefined,
|
|
244
|
+
readBody: (response: Response) => Promise<T>,
|
|
245
|
+
): Promise<T> {
|
|
246
|
+
if (callerSignal?.aborted) throw abortReason(callerSignal);
|
|
247
|
+
const timeout = AbortSignal.timeout(this.timeoutMs);
|
|
248
|
+
const signal = callerSignal ? AbortSignal.any([callerSignal, timeout]) : timeout;
|
|
249
|
+
|
|
250
|
+
const interrupted = (cause: unknown): Error | undefined => {
|
|
251
|
+
if (callerSignal?.aborted) return abortReason(callerSignal);
|
|
252
|
+
|
|
253
|
+
if (timeout.aborted)
|
|
254
|
+
return transportError(`timed out after ${this.timeoutMs} ms`, true, cause);
|
|
255
|
+
|
|
256
|
+
return undefined;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
let response: Response;
|
|
260
|
+
|
|
261
|
+
try {
|
|
262
|
+
response = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
263
|
+
method: "POST",
|
|
264
|
+
headers,
|
|
265
|
+
body,
|
|
266
|
+
signal,
|
|
267
|
+
});
|
|
268
|
+
} catch (error) {
|
|
269
|
+
const stop = interrupted(error);
|
|
270
|
+
|
|
271
|
+
if (stop) throw stop;
|
|
272
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
273
|
+
throw transportError(message, !isConnectFailure(error), error);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
if (!response.ok) throw await grokHttpErrorFromResponse(response);
|
|
278
|
+
|
|
279
|
+
return await readBody(response);
|
|
280
|
+
} catch (error) {
|
|
281
|
+
throw interrupted(error) ?? error;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Public surface of the Grok (xAI) provider runtime.
|
|
2
|
+
export * from "./grok-backend-protocol";
|
|
3
|
+
|
|
4
|
+
export * from "./grok-constants";
|
|
5
|
+
|
|
6
|
+
export * from "./grok-direct-client";
|
|
7
|
+
|
|
8
|
+
export * from "./grok-dispatcher";
|
|
9
|
+
|
|
10
|
+
export * from "./grok-headers";
|
|
11
|
+
|
|
12
|
+
export * from "./grok-models";
|
|
13
|
+
|
|
14
|
+
export * from "./grok-oauth";
|
|
15
|
+
|
|
16
|
+
export * from "./grok-quota";
|
|
17
|
+
|
|
18
|
+
export * from "./grok-refresh";
|
|
19
|
+
|
|
20
|
+
export * from "./grok-types";
|