@cortexkit/opencode-antigravity-auth 3.0.5 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -352
- package/dist/cli.js +9199 -8799
- package/dist/cli.js.map +4 -4
- package/dist/cli.meta.json +1286 -1064
- package/dist/index.js +13641 -14559
- package/dist/index.js.map +4 -4
- package/dist/index.meta.json +1333 -1342
- package/dist/server.js +10618 -11080
- package/dist/server.js.map +4 -4
- package/dist/server.meta.json +1 -1
- package/dist/src/auth-method-labels.d.ts +3 -0
- package/dist/src/auth-method-labels.d.ts.map +1 -0
- package/dist/src/auth-method-labels.js +5 -0
- package/dist/src/auth-method-labels.js.map +1 -0
- package/dist/src/cli.d.ts +3 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +98 -12
- package/dist/src/cli.js.map +1 -1
- package/dist/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
- package/dist/src/common-auth-embedded/claustrum/consumer.js +96 -1
- package/dist/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
- package/dist/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
- package/dist/src/common-auth-embedded/claustrum/enrollment.js +6 -1
- package/dist/src/common-auth-embedded/claustrum/index.d.ts +2 -1
- package/dist/src/common-auth-embedded/claustrum/index.js +5 -3
- package/dist/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
- package/dist/src/common-auth-embedded/claustrum/insula.js +152 -0
- package/dist/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
- package/dist/src/common-auth-embedded/claustrum/roster.js +33 -3
- package/dist/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
- package/dist/src/common-auth-embedded/quota/codec.d.ts +2 -0
- package/dist/src/common-auth-embedded/quota/codec.js +2 -1
- package/dist/src/common-auth-embedded/quota/format.d.ts +26 -0
- package/dist/src/common-auth-embedded/quota/format.js +78 -42
- package/dist/src/common-auth-embedded/quota/index.d.ts +4 -4
- package/dist/src/common-auth-embedded/quota/index.js +2 -2
- package/dist/src/common-auth-embedded/quota/map.d.ts +11 -0
- package/dist/src/common-auth-embedded/quota/map.js +36 -1
- package/dist/src/common-auth-embedded/quota/merge.d.ts +3 -1
- package/dist/src/common-auth-embedded/quota/merge.js +21 -5
- package/dist/src/common-auth-embedded/quota/projection.d.ts +2 -1
- package/dist/src/common-auth-embedded/quota/projection.js +3 -1
- package/dist/src/common-auth-embedded/setup/command-runner.js +49 -0
- package/dist/src/common-auth-embedded/setup/command.d.ts +3 -0
- package/dist/src/common-auth-embedded/setup/command.js +215 -0
- package/dist/src/common-auth-embedded/setup/config-write.js +60 -0
- package/dist/src/common-auth-embedded/setup/detect.d.ts +6 -0
- package/dist/src/common-auth-embedded/setup/detect.js +224 -0
- package/dist/src/common-auth-embedded/setup/enroll.js +70 -0
- package/dist/src/common-auth-embedded/setup/index.d.ts +5 -0
- package/dist/src/common-auth-embedded/setup/index.js +4 -0
- package/dist/src/common-auth-embedded/setup/paths.js +33 -0
- package/dist/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
- package/dist/src/common-auth-embedded/setup/process-fence.js +270 -0
- package/dist/src/common-auth-embedded/setup/prompts.js +26 -0
- package/dist/src/common-auth-embedded/setup/register.d.ts +11 -0
- package/dist/src/common-auth-embedded/setup/register.js +130 -0
- package/dist/src/common-auth-embedded/setup/types.d.ts +136 -0
- package/dist/src/common-auth-embedded/source-output.json +228 -80
- package/dist/src/common-auth-embedded/store/schema.d.ts +2 -0
- package/dist/src/common-auth-embedded/store/schema.js +3 -2
- package/dist/src/ga/rpc/protocol.d.ts +4 -7
- package/dist/src/ga/rpc/protocol.d.ts.map +1 -1
- package/dist/src/ga/rpc/protocol.js +5 -13
- package/dist/src/ga/rpc/protocol.js.map +1 -1
- package/dist/src/ga/server/auth.d.ts +8 -3
- package/dist/src/ga/server/auth.d.ts.map +1 -1
- package/dist/src/ga/server/auth.js +25 -9
- package/dist/src/ga/server/auth.js.map +1 -1
- package/dist/src/ga/server/index.d.ts +39 -12
- package/dist/src/ga/server/index.d.ts.map +1 -1
- package/dist/src/ga/server/index.js +214 -53
- package/dist/src/ga/server/index.js.map +1 -1
- package/dist/src/ga/server/pool-login.d.ts +22 -0
- package/dist/src/ga/server/pool-login.d.ts.map +1 -0
- package/dist/src/ga/server/pool-login.js +150 -0
- package/dist/src/ga/server/pool-login.js.map +1 -0
- package/dist/src/ga/tui/host-ga.d.ts +2 -5
- package/dist/src/ga/tui/host-ga.d.ts.map +1 -1
- package/dist/src/ga/tui/host-ga.js +17 -49
- package/dist/src/ga/tui/host-ga.js.map +1 -1
- package/dist/src/plugin/accounts.d.ts +1 -1
- package/dist/src/plugin/accounts.d.ts.map +1 -1
- package/dist/src/plugin/accounts.js +1 -0
- package/dist/src/plugin/accounts.js.map +1 -1
- package/dist/src/plugin/background-vault-quota-refresh.d.ts +2 -0
- package/dist/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
- package/dist/src/plugin/background-vault-quota-refresh.js +125 -10
- package/dist/src/plugin/background-vault-quota-refresh.js.map +1 -1
- package/dist/src/plugin/command-apply.d.ts +2 -2
- package/dist/src/plugin/command-apply.d.ts.map +1 -1
- package/dist/src/plugin/command-apply.js +3 -10
- package/dist/src/plugin/command-apply.js.map +1 -1
- package/dist/src/plugin/commands.d.ts +1 -0
- package/dist/src/plugin/commands.d.ts.map +1 -1
- package/dist/src/plugin/commands.js +2 -2
- package/dist/src/plugin/commands.js.map +1 -1
- package/dist/src/plugin/config/operator-settings-schema.d.ts +0 -4
- package/dist/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
- package/dist/src/plugin/config/operator-settings-schema.js +0 -5
- package/dist/src/plugin/config/operator-settings-schema.js.map +1 -1
- package/dist/src/plugin/config/schema.d.ts +0 -7
- package/dist/src/plugin/config/schema.d.ts.map +1 -1
- package/dist/src/plugin/config/schema.js +0 -43
- package/dist/src/plugin/config/schema.js.map +1 -1
- package/dist/src/plugin/config/writer.d.ts +1 -1
- package/dist/src/plugin/config/writer.js +1 -1
- package/dist/src/plugin/fetch/retry-state.d.ts +19 -3
- package/dist/src/plugin/fetch/retry-state.d.ts.map +1 -1
- package/dist/src/plugin/fetch/retry-state.js +0 -6
- package/dist/src/plugin/fetch/retry-state.js.map +1 -1
- package/dist/src/plugin/fetch-interceptor.d.ts.map +1 -1
- package/dist/src/plugin/fetch-interceptor.js +0 -3
- package/dist/src/plugin/fetch-interceptor.js.map +1 -1
- package/dist/src/plugin/fetch-routing.d.ts +0 -16
- package/dist/src/plugin/fetch-routing.d.ts.map +1 -1
- package/dist/src/plugin/fetch-routing.js +0 -49
- package/dist/src/plugin/fetch-routing.js.map +1 -1
- package/dist/src/plugin/ga-location-services.d.ts +14 -9
- package/dist/src/plugin/ga-location-services.d.ts.map +1 -1
- package/dist/src/plugin/ga-location-services.js +120 -40
- package/dist/src/plugin/ga-location-services.js.map +1 -1
- package/dist/src/plugin/google-origin.d.ts +7 -0
- package/dist/src/plugin/google-origin.d.ts.map +1 -0
- package/dist/src/plugin/google-origin.js +14 -0
- package/dist/src/plugin/google-origin.js.map +1 -0
- package/dist/src/plugin/index.d.ts.map +1 -1
- package/dist/src/plugin/index.js +15 -4
- package/dist/src/plugin/index.js.map +1 -1
- package/dist/src/plugin/oauth-methods.d.ts.map +1 -1
- package/dist/src/plugin/oauth-methods.js +0 -33
- package/dist/src/plugin/oauth-methods.js.map +1 -1
- package/dist/src/plugin/operator-settings.d.ts +1 -1
- package/dist/src/plugin/operator-settings.d.ts.map +1 -1
- package/dist/src/plugin/operator-settings.js +1 -8
- package/dist/src/plugin/operator-settings.js.map +1 -1
- package/dist/src/plugin/quota.d.ts +11 -7
- package/dist/src/plugin/quota.d.ts.map +1 -1
- package/dist/src/plugin/quota.js +128 -102
- package/dist/src/plugin/quota.js.map +1 -1
- package/dist/src/plugin/request.d.ts +5 -3
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +87 -168
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/server.d.ts.map +1 -1
- package/dist/src/plugin/server.js +60 -53
- package/dist/src/plugin/server.js.map +1 -1
- package/dist/src/plugin/shared/advisory-repository.d.ts +20 -0
- package/dist/src/plugin/shared/advisory-repository.d.ts.map +1 -0
- package/dist/src/plugin/shared/advisory-repository.js +91 -0
- package/dist/src/plugin/shared/advisory-repository.js.map +1 -0
- package/dist/src/plugin/shared/request-services.d.ts +19 -25
- package/dist/src/plugin/shared/request-services.d.ts.map +1 -1
- package/dist/src/plugin/shared/request-services.js +105 -188
- package/dist/src/plugin/shared/request-services.js.map +1 -1
- package/dist/src/plugin/shared/runtime.js +4 -2
- package/dist/src/plugin/shared/runtime.js.map +1 -1
- package/dist/src/plugin/shared/vault-request-credentials.d.ts +4 -1
- package/dist/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
- package/dist/src/plugin/shared/vault-request-credentials.js +41 -7
- package/dist/src/plugin/shared/vault-request-credentials.js.map +1 -1
- package/dist/src/plugin/storage.d.ts +2 -2
- package/dist/src/plugin/storage.d.ts.map +1 -1
- package/dist/src/plugin/storage.js.map +1 -1
- package/dist/src/plugin/vault-custody.d.ts.map +1 -1
- package/dist/src/plugin/vault-custody.js +147 -35
- package/dist/src/plugin/vault-custody.js.map +1 -1
- package/dist/src/plugin/vault-quota-outcome.d.ts +19 -0
- package/dist/src/plugin/vault-quota-outcome.d.ts.map +1 -0
- package/dist/src/plugin/vault-quota-outcome.js +47 -0
- package/dist/src/plugin/vault-quota-outcome.js.map +1 -0
- package/dist/src/quota-presentation.d.ts +29 -1
- package/dist/src/quota-presentation.d.ts.map +1 -1
- package/dist/src/quota-presentation.js +52 -17
- package/dist/src/quota-presentation.js.map +1 -1
- package/dist/src/setup.d.ts +15 -0
- package/dist/src/setup.d.ts.map +1 -0
- package/dist/src/setup.js +320 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/sidebar-projection.d.ts +1 -1
- package/dist/src/sidebar-projection.d.ts.map +1 -1
- package/dist/src/sidebar-state.d.ts +1 -1
- package/dist/src/sidebar-state.d.ts.map +1 -1
- package/dist/src/sidebar-state.js +19 -1
- package/dist/src/sidebar-state.js.map +1 -1
- package/dist/src/tui.d.ts.map +1 -1
- package/dist/src/tui.js +205 -110
- package/dist/src/tui.js.map +1 -1
- package/dist/tui-build-map.json +37 -37
- package/dist/tui-ga-build-map.json +33 -33
- package/dist/types/src/auth-method-labels.d.ts +3 -0
- package/dist/types/src/auth-method-labels.d.ts.map +1 -0
- package/dist/types/src/cli.d.ts +3 -1
- package/dist/types/src/cli.d.ts.map +1 -1
- package/dist/types/src/common-auth-embedded/auth-menu/terminal.d.ts +43 -0
- package/dist/types/src/common-auth-embedded/claustrum/consumer.d.ts +132 -0
- package/dist/types/src/common-auth-embedded/claustrum/custody.d.ts +178 -0
- package/dist/types/src/common-auth-embedded/claustrum/enrollment.d.ts +164 -0
- package/dist/types/src/common-auth-embedded/claustrum/errors.d.ts +16 -0
- package/dist/types/src/common-auth-embedded/claustrum/host-slot.d.ts +39 -0
- package/dist/types/src/common-auth-embedded/claustrum/index.d.ts +19 -0
- package/dist/types/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
- package/dist/types/src/common-auth-embedded/claustrum/interlock.d.ts +27 -0
- package/dist/types/src/common-auth-embedded/claustrum/roster.d.ts +221 -0
- package/dist/types/src/common-auth-embedded/opencode2/errors.d.ts +25 -0
- package/dist/types/src/common-auth-embedded/opencode2/index.d.ts +8 -0
- package/dist/types/src/common-auth-embedded/opencode2/install.d.ts +55 -0
- package/dist/types/src/common-auth-embedded/opencode2/integration.d.ts +112 -0
- package/dist/types/src/common-auth-embedded/opencode2/sse.d.ts +12 -0
- package/dist/types/src/common-auth-embedded/opencode2/types.d.ts +413 -0
- package/dist/types/src/common-auth-embedded/quota/codec.d.ts +2 -0
- package/dist/types/src/common-auth-embedded/quota/format.d.ts +26 -0
- package/dist/types/src/common-auth-embedded/quota/index.d.ts +4 -4
- package/dist/types/src/common-auth-embedded/quota/map.d.ts +11 -0
- package/dist/types/src/common-auth-embedded/quota/merge.d.ts +3 -1
- package/dist/types/src/common-auth-embedded/quota/projection.d.ts +2 -1
- package/dist/types/src/common-auth-embedded/routing/admission.d.ts +93 -0
- package/dist/types/src/common-auth-embedded/routing/index.d.ts +8 -0
- package/dist/types/src/common-auth-embedded/routing/ordered.d.ts +47 -0
- package/dist/types/src/common-auth-embedded/routing/pins.d.ts +22 -0
- package/dist/types/src/common-auth-embedded/routing/sticky.d.ts +158 -0
- package/dist/types/src/common-auth-embedded/setup/command.d.ts +3 -0
- package/dist/types/src/common-auth-embedded/setup/detect.d.ts +6 -0
- package/dist/types/src/common-auth-embedded/setup/index.d.ts +5 -0
- package/dist/types/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
- package/dist/types/src/common-auth-embedded/setup/register.d.ts +11 -0
- package/dist/types/src/common-auth-embedded/setup/types.d.ts +136 -0
- package/dist/types/src/common-auth-embedded/store/schema.d.ts +2 -0
- package/dist/types/src/ga/rpc/protocol.d.ts +4 -7
- package/dist/types/src/ga/rpc/protocol.d.ts.map +1 -1
- package/dist/types/src/ga/server/auth.d.ts +8 -3
- package/dist/types/src/ga/server/auth.d.ts.map +1 -1
- package/dist/types/src/ga/server/index.d.ts +39 -12
- package/dist/types/src/ga/server/index.d.ts.map +1 -1
- package/dist/types/src/ga/server/pool-login.d.ts +22 -0
- package/dist/types/src/ga/server/pool-login.d.ts.map +1 -0
- package/dist/types/src/plugin/accounts.d.ts +1 -1
- package/dist/types/src/plugin/accounts.d.ts.map +1 -1
- package/dist/types/src/plugin/background-vault-quota-refresh.d.ts +2 -0
- package/dist/types/src/plugin/background-vault-quota-refresh.d.ts.map +1 -1
- package/dist/types/src/plugin/command-apply.d.ts +2 -2
- package/dist/types/src/plugin/command-apply.d.ts.map +1 -1
- package/dist/types/src/plugin/commands.d.ts +1 -0
- package/dist/types/src/plugin/commands.d.ts.map +1 -1
- package/dist/types/src/plugin/config/operator-settings-schema.d.ts +0 -4
- package/dist/types/src/plugin/config/operator-settings-schema.d.ts.map +1 -1
- package/dist/types/src/plugin/config/schema.d.ts +0 -7
- package/dist/types/src/plugin/config/schema.d.ts.map +1 -1
- package/dist/types/src/plugin/config/writer.d.ts +1 -1
- package/dist/types/src/plugin/fetch/retry-state.d.ts +19 -3
- package/dist/types/src/plugin/fetch/retry-state.d.ts.map +1 -1
- package/dist/types/src/plugin/fetch-interceptor.d.ts.map +1 -1
- package/dist/types/src/plugin/fetch-routing.d.ts +0 -16
- package/dist/types/src/plugin/fetch-routing.d.ts.map +1 -1
- package/dist/types/src/plugin/ga-location-services.d.ts +14 -9
- package/dist/types/src/plugin/ga-location-services.d.ts.map +1 -1
- package/dist/types/src/plugin/google-origin.d.ts +7 -0
- package/dist/types/src/plugin/google-origin.d.ts.map +1 -0
- package/dist/types/src/plugin/index.d.ts.map +1 -1
- package/dist/types/src/plugin/oauth-methods.d.ts.map +1 -1
- package/dist/types/src/plugin/operator-settings.d.ts +1 -1
- package/dist/types/src/plugin/operator-settings.d.ts.map +1 -1
- package/dist/types/src/plugin/quota.d.ts +11 -7
- package/dist/types/src/plugin/quota.d.ts.map +1 -1
- package/dist/types/src/plugin/request.d.ts +5 -3
- package/dist/types/src/plugin/request.d.ts.map +1 -1
- package/dist/types/src/plugin/server.d.ts.map +1 -1
- package/dist/types/src/plugin/shared/advisory-repository.d.ts +20 -0
- package/dist/types/src/plugin/shared/advisory-repository.d.ts.map +1 -0
- package/dist/types/src/plugin/shared/request-services.d.ts +19 -25
- package/dist/types/src/plugin/shared/request-services.d.ts.map +1 -1
- package/dist/types/src/plugin/shared/vault-request-credentials.d.ts +4 -1
- package/dist/types/src/plugin/shared/vault-request-credentials.d.ts.map +1 -1
- package/dist/types/src/plugin/storage.d.ts +2 -2
- package/dist/types/src/plugin/storage.d.ts.map +1 -1
- package/dist/types/src/plugin/vault-custody.d.ts.map +1 -1
- package/dist/types/src/plugin/vault-quota-outcome.d.ts +19 -0
- package/dist/types/src/plugin/vault-quota-outcome.d.ts.map +1 -0
- package/dist/types/src/setup.d.ts +15 -0
- package/dist/types/src/setup.d.ts.map +1 -0
- package/dist/types/src/sidebar-state.d.ts +1 -1
- package/dist/types/src/sidebar-state.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/common-auth-embedded/claustrum/consumer.d.ts +33 -3
- package/src/common-auth-embedded/claustrum/consumer.js +96 -1
- package/src/common-auth-embedded/claustrum/custody.d.ts +4 -1
- package/src/common-auth-embedded/claustrum/enrollment.d.ts +6 -1
- package/src/common-auth-embedded/claustrum/enrollment.js +6 -1
- package/src/common-auth-embedded/claustrum/index.d.ts +2 -1
- package/src/common-auth-embedded/claustrum/index.js +5 -3
- package/src/common-auth-embedded/claustrum/insula.d.ts +69 -0
- package/src/common-auth-embedded/claustrum/insula.js +152 -0
- package/src/common-auth-embedded/claustrum/roster.d.ts +13 -0
- package/src/common-auth-embedded/claustrum/roster.js +33 -3
- package/src/common-auth-embedded/fs/refresh-file-lock.js +20 -11
- package/src/common-auth-embedded/quota/codec.d.ts +2 -0
- package/src/common-auth-embedded/quota/codec.js +2 -1
- package/src/common-auth-embedded/quota/format.d.ts +26 -0
- package/src/common-auth-embedded/quota/format.js +78 -42
- package/src/common-auth-embedded/quota/index.d.ts +4 -4
- package/src/common-auth-embedded/quota/index.js +2 -2
- package/src/common-auth-embedded/quota/map.d.ts +11 -0
- package/src/common-auth-embedded/quota/map.js +36 -1
- package/src/common-auth-embedded/quota/merge.d.ts +3 -1
- package/src/common-auth-embedded/quota/merge.js +21 -5
- package/src/common-auth-embedded/quota/projection.d.ts +2 -1
- package/src/common-auth-embedded/quota/projection.js +3 -1
- package/src/common-auth-embedded/setup/command-runner.js +49 -0
- package/src/common-auth-embedded/setup/command.d.ts +3 -0
- package/src/common-auth-embedded/setup/command.js +215 -0
- package/src/common-auth-embedded/setup/config-write.js +60 -0
- package/src/common-auth-embedded/setup/detect.d.ts +6 -0
- package/src/common-auth-embedded/setup/detect.js +224 -0
- package/src/common-auth-embedded/setup/enroll.js +70 -0
- package/src/common-auth-embedded/setup/index.d.ts +5 -0
- package/src/common-auth-embedded/setup/index.js +4 -0
- package/src/common-auth-embedded/setup/paths.js +33 -0
- package/src/common-auth-embedded/setup/process-fence.d.ts +43 -0
- package/src/common-auth-embedded/setup/process-fence.js +270 -0
- package/src/common-auth-embedded/setup/prompts.js +26 -0
- package/src/common-auth-embedded/setup/register.d.ts +11 -0
- package/src/common-auth-embedded/setup/register.js +130 -0
- package/src/common-auth-embedded/setup/types.d.ts +136 -0
- package/src/common-auth-embedded/source-output.json +228 -80
- package/src/common-auth-embedded/store/schema.d.ts +2 -0
- package/src/common-auth-embedded/store/schema.js +3 -2
- package/src/sidebar-state.ts +19 -2
- package/src/tui-compiled/common-auth-embedded/quota/codec.js +2 -1
- package/src/tui-compiled/common-auth-embedded/quota/format.js +78 -42
- package/src/tui-compiled/common-auth-embedded/quota/index.js +2 -2
- package/src/tui-compiled/common-auth-embedded/quota/map.js +36 -1
- package/src/tui-compiled/common-auth-embedded/quota/merge.js +21 -5
- package/src/tui-compiled/common-auth-embedded/quota/projection.js +3 -1
- package/src/tui-compiled/quota-presentation.js +42 -9
- package/src/tui-compiled/sidebar-state.js +15 -1
- package/src/tui-compiled/tui.js +516 -334
- package/src/tui-ga-compiled/host-ga.js +11 -38
- package/src/tui-ga-compiled/shared/1ff34afa7c42d196-projection.js +3 -1
- package/src/tui-ga-compiled/shared/77138df80c7ae006-map.js +36 -1
- package/src/tui-ga-compiled/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
- package/src/tui-ga-compiled/shared/aef2402f8fc342f0-format.js +78 -42
- package/src/tui-ga-compiled/shared/bf17cbee28e58197-index.js +2 -2
- package/src/tui-ga-compiled/shared/ca21dc417b36dc5d-codec.js +2 -1
- package/src/tui-ga-compiled/shared/ecc214300932dfb6-merge.js +21 -5
- package/src/tui-ga-raw/host-ga.tsx +31 -62
- package/src/tui-ga-raw/shared/1ff34afa7c42d196-projection.js +3 -1
- package/src/tui-ga-raw/shared/77138df80c7ae006-map.js +36 -1
- package/src/tui-ga-raw/shared/98cc0c186c46c42d-quota-presentation.js +42 -9
- package/src/tui-ga-raw/shared/aef2402f8fc342f0-format.js +78 -42
- package/src/tui-ga-raw/shared/bf17cbee28e58197-index.js +2 -2
- package/src/tui-ga-raw/shared/ca21dc417b36dc5d-codec.js +2 -1
- package/src/tui-ga-raw/shared/ecc214300932dfb6-merge.js +21 -5
- package/src/tui-raw/common-auth-embedded/quota/codec.js +2 -1
- package/src/tui-raw/common-auth-embedded/quota/format.js +78 -42
- package/src/tui-raw/common-auth-embedded/quota/index.js +2 -2
- package/src/tui-raw/common-auth-embedded/quota/map.js +36 -1
- package/src/tui-raw/common-auth-embedded/quota/merge.js +21 -5
- package/src/tui-raw/common-auth-embedded/quota/projection.js +3 -1
- package/src/tui-raw/quota-presentation.js +42 -9
- package/src/tui-raw/sidebar-state.js +15 -1
- package/src/tui-raw/tui.tsx +423 -218
- package/src/tui.tsx +423 -218
- package/dist/src/tui/vault-setup.d.ts +0 -98
- package/dist/src/tui/vault-setup.d.ts.map +0 -1
- package/dist/src/tui/vault-setup.js +0 -198
- package/dist/src/tui/vault-setup.js.map +0 -1
- package/dist/types/src/plugin/transform/model-resolver.d.ts +0 -2
- package/dist/types/src/plugin/transform/model-resolver.d.ts.map +0 -1
- package/dist/types/src/quota-presentation.d.ts +0 -18
- package/dist/types/src/quota-presentation.d.ts.map +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Closed diagnostic vocabulary: never copy an error message or remote identifier into a tick record. */
|
|
2
|
+
export type VaultQuotaReason = 'recorded' | 'fresh' | 'lock-busy' | 'lock-lost' | 'authority' | 'no-rows' | 'fetch-failed' | 'deadline' | 'unattributed' | 'binding-stale' | 'version-changed' | 'state-lock' | 'state-invalid' | 'write-uncertain' | 'publish-failed' | 'aborted' | 'admission-refused' | 'roster-unavailable' | 'commit-unchanged';
|
|
3
|
+
export type VaultQuotaStage = 'authority' | 'lock' | 'roster' | 'state' | 'fetch' | 'commit' | 'publish';
|
|
4
|
+
export interface VaultQuotaOutcome {
|
|
5
|
+
tick: string;
|
|
6
|
+
reason: VaultQuotaReason;
|
|
7
|
+
stage: VaultQuotaStage;
|
|
8
|
+
elapsedMs: number;
|
|
9
|
+
rows: number;
|
|
10
|
+
checked: number;
|
|
11
|
+
notChecked: number;
|
|
12
|
+
reasons: Partial<Record<VaultQuotaReason, number>>;
|
|
13
|
+
endpoint?: 'summary' | 'models';
|
|
14
|
+
status?: number;
|
|
15
|
+
errorKind?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function vaultQuotaErrorReason(error: unknown, fallback: VaultQuotaReason): VaultQuotaReason;
|
|
18
|
+
export declare function vaultQuotaErrorKind(error: unknown): string;
|
|
19
|
+
//# sourceMappingURL=vault-quota-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-quota-outcome.d.ts","sourceRoot":"","sources":["../../../../src/plugin/vault-quota-outcome.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,OAAO,GACP,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,GACT,cAAc,GACd,UAAU,GACV,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,gBAAgB,GAChB,SAAS,GACT,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,CAAA;AAEtB,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,MAAM,GACN,QAAQ,GACR,OAAO,GACP,OAAO,GACP,QAAQ,GACR,SAAS,CAAA;AAEb,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,EAAE,eAAe,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,CAmClB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU1D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CliDependencies } from './cli.js';
|
|
2
|
+
import { type SetupCallbackContext, type SetupIO, type SetupPlugin } from './common-auth-embedded/setup/index.js';
|
|
3
|
+
import type { AntigravityTokenExchangeSuccess } from './plugin/oauth-login.js';
|
|
4
|
+
/**
|
|
5
|
+
* Refuse local sign-in if vault access is approved or auth.json holds its vault
|
|
6
|
+
* marker. Re-read both because they can change while the OAuth browser is open.
|
|
7
|
+
*/
|
|
8
|
+
export declare function assertLocalOpenCodeLogin(legacyPath: string, generation?: SetupCallbackContext['opencodeGeneration']): Promise<void>;
|
|
9
|
+
export declare function assertSetupHostsStopped(): Promise<void>;
|
|
10
|
+
/** Pi stores its local login in auth.json, not OpenCode's account pool. */
|
|
11
|
+
export declare function persistPiSetupLogin(result: AntigravityTokenExchangeSuccess, context: SetupCallbackContext): Promise<void>;
|
|
12
|
+
export declare function createSetupPlugin(deps: CliDependencies, migrateOpenCode: () => Promise<number>, forceLogin?: boolean): Promise<SetupPlugin>;
|
|
13
|
+
/** CLI-only entry: importing setup must never add the vault client to a renderer graph. */
|
|
14
|
+
export declare function runPluginSetup(argv: string[], deps: CliDependencies, migrateOpenCode: () => Promise<number>, io?: SetupIO): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/setup.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAIL,KAAK,oBAAoB,EAEzB,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAA;AA8C9E;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,oBAAoB,CAAC,oBAAoB,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7D;AA4CD,2EAA2E;AAC3E,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,+BAA+B,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACtC,UAAU,UAAQ,GACjB,OAAO,CAAC,WAAW,CAAC,CA4RtB;AAED,2FAA2F;AAC3F,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACtC,EAAE,GAAE,OAAY,GACf,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -81,7 +81,7 @@ export interface SidebarAccountState {
|
|
|
81
81
|
export interface SidebarRoutingEntry {
|
|
82
82
|
accountId: string;
|
|
83
83
|
modelFamily: 'claude' | 'gemini';
|
|
84
|
-
headerStyle: 'antigravity'
|
|
84
|
+
headerStyle: 'antigravity';
|
|
85
85
|
strategy?: 'sticky' | 'round-robin' | 'hybrid';
|
|
86
86
|
updatedAt: number;
|
|
87
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar-state.d.ts","sourceRoot":"","sources":["../../../src/sidebar-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAeH,eAAO,MAAM,qBAAqB,EAAG,CAAU,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,CAAA;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,CAAA;IACxB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAC1D;;;OAGG;IACH,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3D;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAChC,WAAW,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"sidebar-state.d.ts","sourceRoot":"","sources":["../../../src/sidebar-state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cortexkit/opencode-antigravity-auth",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.6",
|
|
4
4
|
"description": "Google Antigravity OAuth auth plugin for OpenCode - access Gemini and Claude models using Google credentials",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
],
|
|
71
71
|
"scripts": {
|
|
72
72
|
"embed:check": "bun scripts/build-tui.ts --check",
|
|
73
|
-
"build": "bun run embed:check && bun scripts/build-tui.ts --library && esbuild src/server.ts --bundle --platform=node --format=esm --external:zod --external:@cortexkit/private-files --outfile=dist/server.js --sourcemap --metafile=dist/server.meta.json --log-level=warning && tsc -p tsconfig.ga.emit.json && bun ../../scripts/finalize-declaration-specifiers.ts dist/types .",
|
|
73
|
+
"build": "bun run embed:check && bun scripts/build-tui.ts --library && esbuild src/server.ts --bundle --platform=node --format=esm --external:zod --external:jsonc-parser --external:@cortexkit/private-files --external:@cortexkit/claustrum-client --external:@cortexkit/subc-client --outfile=dist/server.js --sourcemap --metafile=dist/server.meta.json --log-level=warning && tsc -p tsconfig.ga.emit.json && bun ../../scripts/finalize-declaration-specifiers.ts dist/types .",
|
|
74
74
|
"build:tui": "bun run embed:check && bun scripts/build-tui.ts",
|
|
75
75
|
"build:schema": "bun script/build-schema.ts",
|
|
76
76
|
"smoke:tui": "bun run embed:check && bun scripts/smoke-tui-pack-install.ts",
|
|
@@ -117,7 +117,6 @@
|
|
|
117
117
|
}
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
|
-
"@cortexkit/claustrum-client": "0.9.0",
|
|
121
120
|
"@opencode-ai/sdk": "1.17.13",
|
|
122
121
|
"@opencode/plugin": "2.0.22",
|
|
123
122
|
"@opentui/core-ga": "npm:@opentui/core@0.5.14",
|
|
@@ -129,7 +128,9 @@
|
|
|
129
128
|
"zod-to-json-schema": "^3.25.1"
|
|
130
129
|
},
|
|
131
130
|
"dependencies": {
|
|
132
|
-
"@cortexkit/
|
|
131
|
+
"@cortexkit/claustrum-client": "0.9.0",
|
|
132
|
+
"@cortexkit/subc-client": "0.16.1",
|
|
133
|
+
"@cortexkit/antigravity-auth-core": "3.0.6",
|
|
133
134
|
"@cortexkit/private-files": "0.2.1",
|
|
134
135
|
"jsonc-parser": "^3.3.1",
|
|
135
136
|
"xdg-basedir": "^5.1.0",
|
|
@@ -3,8 +3,9 @@ import type { QuotaObservation } from '../quota/index.js';
|
|
|
3
3
|
import type { RoutingRow } from '../routing/index.js';
|
|
4
4
|
import { type ClaustrumFamily, type ClaustrumScopedAttempt, type ClaustrumScopedClient, type IdentityParser } from './custody.js';
|
|
5
5
|
import { type ClaustrumLogger } from './errors.js';
|
|
6
|
+
import { type InsulaQuotaOptions } from './insula.js';
|
|
6
7
|
import { type AccountMapper, type QuotaReceipt, type VaultRosterFile } from './roster.js';
|
|
7
|
-
export interface ClaustrumConsumerOptions {
|
|
8
|
+
export interface ClaustrumConsumerOptions<Q = QuotaObservation> {
|
|
8
9
|
/**
|
|
9
10
|
* The roster file: one row per vault account (route id, credential id,
|
|
10
11
|
* account identity, state, quota), plus the accounts the user declined. It
|
|
@@ -45,6 +46,8 @@ export interface ClaustrumConsumerOptions {
|
|
|
45
46
|
clearTimeoutImpl?: typeof clearTimeout;
|
|
46
47
|
now?: () => number;
|
|
47
48
|
logger?: ClaustrumLogger;
|
|
49
|
+
/** Optional background quota source. In-band readings still use recordQuota. */
|
|
50
|
+
insula?: InsulaQuotaOptions<Q>;
|
|
48
51
|
}
|
|
49
52
|
export interface SendOptions {
|
|
50
53
|
/**
|
|
@@ -63,15 +66,34 @@ export interface SendOptions {
|
|
|
63
66
|
* never are. It never enrolls: a missing token is an error here, and setup
|
|
64
67
|
* is where enrollment happens.
|
|
65
68
|
*/
|
|
66
|
-
export declare class ClaustrumConsumer {
|
|
69
|
+
export declare class ClaustrumConsumer<Q = QuotaObservation> {
|
|
67
70
|
#private;
|
|
68
|
-
constructor(options: ClaustrumConsumerOptions);
|
|
71
|
+
constructor(options: ClaustrumConsumerOptions<Q>);
|
|
69
72
|
/** The last committed roster this instance saw, without any I/O. */
|
|
70
73
|
snapshot(): VaultRosterFile | undefined;
|
|
71
74
|
/** Rows for `/routing`, from the last committed roster. */
|
|
72
75
|
routingRows(): RoutingRow[];
|
|
73
76
|
refresh(): Promise<VaultRosterFile | undefined>;
|
|
74
77
|
start(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Fetch on a background tick, at most once per minute across projects with
|
|
80
|
+
* the same daemon and enrollment token path. Admission must use the cache
|
|
81
|
+
* instead, so an optional quota daemon never delays a provider request.
|
|
82
|
+
*/
|
|
83
|
+
refreshInsulaQuota(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Cache-only, for unknown-quota admission with a served receipt. Undefined
|
|
86
|
+
* means poll the provider normally. Only get_scoped's asserted account_id
|
|
87
|
+
* joins insula; parsed identities and display metadata cannot substitute.
|
|
88
|
+
* Background polling should use cachedInsulaQuotaForRoute instead.
|
|
89
|
+
*/
|
|
90
|
+
cachedInsulaQuota(receipt: Pick<ClaustrumScopedAttempt, 'assertedAccountIdentity'>): Promise<Q | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Background cache lookup without fetching a credential. Re-read the roster
|
|
93
|
+
* so a peer's account replacement invalidates the old route immediately.
|
|
94
|
+
* A route without a known provider account cannot join an insula entry.
|
|
95
|
+
*/
|
|
96
|
+
cachedInsulaQuotaForRoute(routeId: string): Promise<Q | undefined>;
|
|
75
97
|
/**
|
|
76
98
|
* Authorize one physical send on a vault route. The roster file is re-read
|
|
77
99
|
* first, so a decline committed by another process applies before the next
|
|
@@ -98,5 +120,13 @@ export declare class ClaustrumConsumer {
|
|
|
98
120
|
* (see `recordVaultQuota`), so a reading for a replaced account is dropped.
|
|
99
121
|
*/
|
|
100
122
|
recordQuota(routeId: string, observation: QuotaObservation, attempt: QuotaReceipt): Promise<boolean>;
|
|
123
|
+
/**
|
|
124
|
+
* Store a background observation that belongs to an account rather than to
|
|
125
|
+
* a served credential (an insula reading from `cachedInsulaQuotaForRoute`).
|
|
126
|
+
* It lands only while the route is still bound to that known account, so no
|
|
127
|
+
* credential fetch is needed and a replaced account's reading is dropped.
|
|
128
|
+
* The in-memory roster is reloaded from the file, without a vault call.
|
|
129
|
+
*/
|
|
130
|
+
recordAccountQuota(routeId: string, accountIdentity: string, observation: QuotaObservation): Promise<boolean>;
|
|
101
131
|
close(): void;
|
|
102
132
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createLogger } from '../logger/index.js';
|
|
2
2
|
import { combineAbortSignals } from '../util/any-signal.js';
|
|
3
3
|
import { ClaustrumScopedCustody, decideScopedRetryAfter401, } from './custody.js';
|
|
4
|
+
import { readClaustrumEnrollmentToken } from './enrollment.js';
|
|
4
5
|
import { ClaustrumConsumerError } from './errors.js';
|
|
5
|
-
import {
|
|
6
|
+
import { acquireInsulaQuotaSource } from './insula.js';
|
|
7
|
+
import { acceptVaultRoute, declineVaultRoute, readVaultRoster, recordVaultAccountQuota, recordVaultQuota, refreshVaultRoster, vaultRoutingRows, } from './roster.js';
|
|
6
8
|
/**
|
|
7
9
|
* One plugin host's view of its vault accounts. It turns vault credentials
|
|
8
10
|
* into rows for `/routing`, authorizes each physical send with the vault, and
|
|
@@ -21,6 +23,7 @@ export class ClaustrumConsumer {
|
|
|
21
23
|
#roster;
|
|
22
24
|
#timer;
|
|
23
25
|
#started = false;
|
|
26
|
+
#insula;
|
|
24
27
|
constructor(options) {
|
|
25
28
|
this.#options = options;
|
|
26
29
|
this.#logger = options.logger ?? createLogger('claustrum');
|
|
@@ -84,6 +87,9 @@ export class ClaustrumConsumer {
|
|
|
84
87
|
now: this.#options.now,
|
|
85
88
|
logger: this.#logger,
|
|
86
89
|
});
|
|
90
|
+
if (this.#options.insula && client.insula) {
|
|
91
|
+
this.#insula = acquireInsulaQuotaSource(client.insula, this.#options.tokenPath);
|
|
92
|
+
}
|
|
87
93
|
return this.#custody;
|
|
88
94
|
})
|
|
89
95
|
.finally(() => {
|
|
@@ -109,6 +115,8 @@ export class ClaustrumConsumer {
|
|
|
109
115
|
this.#roster = undefined;
|
|
110
116
|
this.#custody?.close();
|
|
111
117
|
this.#custody = undefined;
|
|
118
|
+
this.#insula?.release();
|
|
119
|
+
this.#insula = undefined;
|
|
112
120
|
return undefined;
|
|
113
121
|
}
|
|
114
122
|
const custody = await this.#getCustody();
|
|
@@ -145,6 +153,7 @@ export class ClaustrumConsumer {
|
|
|
145
153
|
const tick = async () => {
|
|
146
154
|
try {
|
|
147
155
|
await this.refresh();
|
|
156
|
+
await this.refreshInsulaQuota();
|
|
148
157
|
}
|
|
149
158
|
catch (error) {
|
|
150
159
|
if (!this.#shutdown.signal.aborted)
|
|
@@ -163,6 +172,72 @@ export class ClaustrumConsumer {
|
|
|
163
172
|
};
|
|
164
173
|
void tick();
|
|
165
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Fetch on a background tick, at most once per minute across projects with
|
|
177
|
+
* the same daemon and enrollment token path. Admission must use the cache
|
|
178
|
+
* instead, so an optional quota daemon never delays a provider request.
|
|
179
|
+
*/
|
|
180
|
+
async refreshInsulaQuota() {
|
|
181
|
+
if (!this.#options.insula ||
|
|
182
|
+
this.#shutdown.signal.aborted ||
|
|
183
|
+
!(await this.#active()))
|
|
184
|
+
return;
|
|
185
|
+
try {
|
|
186
|
+
await readClaustrumEnrollmentToken(this.#options.tokenPath);
|
|
187
|
+
await this.#getCustody();
|
|
188
|
+
await this.#insula?.source.refresh((this.#options.now ?? Date.now)());
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// An optional source must never prevent the plugin's own quota poll.
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Cache-only, for unknown-quota admission with a served receipt. Undefined
|
|
196
|
+
* means poll the provider normally. Only get_scoped's asserted account_id
|
|
197
|
+
* joins insula; parsed identities and display metadata cannot substitute.
|
|
198
|
+
* Background polling should use cachedInsulaQuotaForRoute instead.
|
|
199
|
+
*/
|
|
200
|
+
async cachedInsulaQuota(receipt) {
|
|
201
|
+
if (!this.#options.insula ||
|
|
202
|
+
this.#shutdown.signal.aborted ||
|
|
203
|
+
!(await this.#active()))
|
|
204
|
+
return undefined;
|
|
205
|
+
try {
|
|
206
|
+
await readClaustrumEnrollmentToken(this.#options.tokenPath);
|
|
207
|
+
return this.#normalizeInsulaQuota(receipt.assertedAccountIdentity);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Background cache lookup without fetching a credential. Re-read the roster
|
|
215
|
+
* so a peer's account replacement invalidates the old route immediately.
|
|
216
|
+
* A route without a known provider account cannot join an insula entry.
|
|
217
|
+
*/
|
|
218
|
+
async cachedInsulaQuotaForRoute(routeId) {
|
|
219
|
+
if (!this.#options.insula ||
|
|
220
|
+
this.#shutdown.signal.aborted ||
|
|
221
|
+
!(await this.#active()))
|
|
222
|
+
return undefined;
|
|
223
|
+
try {
|
|
224
|
+
await readClaustrumEnrollmentToken(this.#options.tokenPath);
|
|
225
|
+
const roster = await readVaultRoster(this.#options.rosterPath);
|
|
226
|
+
const row = roster?.rows.find((entry) => entry.routeId === routeId);
|
|
227
|
+
return this.#normalizeInsulaQuota(row?.accountIdentity);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
#normalizeInsulaQuota(accountIdentity) {
|
|
234
|
+
if (!this.#options.insula || !accountIdentity)
|
|
235
|
+
return undefined;
|
|
236
|
+
const current = this.#insula?.source.current(this.#options.insula.provider, accountIdentity, (this.#options.now ?? Date.now)());
|
|
237
|
+
return current
|
|
238
|
+
? this.#options.insula.normalize(current.entry, current.context)
|
|
239
|
+
: undefined;
|
|
240
|
+
}
|
|
166
241
|
/**
|
|
167
242
|
* Authorize one physical send on a vault route. The roster file is re-read
|
|
168
243
|
* first, so a decline committed by another process applies before the next
|
|
@@ -285,6 +360,24 @@ export class ClaustrumConsumer {
|
|
|
285
360
|
this.#roster = await readVaultRoster(this.#options.rosterPath);
|
|
286
361
|
return kept;
|
|
287
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* Store a background observation that belongs to an account rather than to
|
|
365
|
+
* a served credential (an insula reading from `cachedInsulaQuotaForRoute`).
|
|
366
|
+
* It lands only while the route is still bound to that known account, so no
|
|
367
|
+
* credential fetch is needed and a replaced account's reading is dropped.
|
|
368
|
+
* The in-memory roster is reloaded from the file, without a vault call.
|
|
369
|
+
*/
|
|
370
|
+
async recordAccountQuota(routeId, accountIdentity, observation) {
|
|
371
|
+
this.#assertOpen();
|
|
372
|
+
const kept = await recordVaultAccountQuota(this.#options.rosterPath, {
|
|
373
|
+
routeId,
|
|
374
|
+
accountIdentity,
|
|
375
|
+
observation,
|
|
376
|
+
});
|
|
377
|
+
if (kept)
|
|
378
|
+
this.#roster = await readVaultRoster(this.#options.rosterPath);
|
|
379
|
+
return kept;
|
|
380
|
+
}
|
|
288
381
|
close() {
|
|
289
382
|
if (this.#shutdown.signal.aborted)
|
|
290
383
|
return;
|
|
@@ -293,6 +386,8 @@ export class ClaustrumConsumer {
|
|
|
293
386
|
(this.#options.clearTimeoutImpl ?? clearTimeout)(this.#timer);
|
|
294
387
|
this.#timer = undefined;
|
|
295
388
|
this.#custody?.close();
|
|
389
|
+
this.#insula?.release();
|
|
390
|
+
this.#insula = undefined;
|
|
296
391
|
this.#roster = undefined;
|
|
297
392
|
}
|
|
298
393
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { type ClaustrumClient, type ClaustrumReporterSource, type EnrollmentTokenFile } from '@cortexkit/claustrum-client';
|
|
2
2
|
import { type ClaustrumLogger } from './errors.js';
|
|
3
|
-
|
|
3
|
+
import type { InsulaUsageTransport } from './insula.js';
|
|
4
|
+
export type ClaustrumScopedClient = Pick<ClaustrumClient, 'listScoped' | 'getScoped' | 'reportAuthFailureScoped' | 'close'> & {
|
|
5
|
+
insula?: InsulaUsageTransport;
|
|
6
|
+
};
|
|
4
7
|
/** The two credential types a plugin's family can hold; routing differs by type. */
|
|
5
8
|
export type VaultCredentialType = 'oauth' | 'api_key';
|
|
6
9
|
/**
|
|
@@ -103,7 +103,12 @@ export interface EnrollmentAncestorOptions {
|
|
|
103
103
|
*/
|
|
104
104
|
export declare function refuseWritableAncestor(parent: string, options?: EnrollmentAncestorOptions): Promise<void>;
|
|
105
105
|
export declare function readClaustrumEnrollmentStatus(paths: ClaustrumEnrollmentPaths, proposedName: string): Promise<ClaustrumEnrollmentStatus>;
|
|
106
|
-
/**
|
|
106
|
+
/**
|
|
107
|
+
* Resolve the host's account mode from its enrollment files. It never changes
|
|
108
|
+
* their contents or the host's mode. On Windows, reading them may create a
|
|
109
|
+
* missing private state folder and tighten an enrollment file's permissions to
|
|
110
|
+
* owner-only, as every private-file read there does.
|
|
111
|
+
*/
|
|
107
112
|
export declare function enrollmentAuthority(paths: ClaustrumEnrollmentPaths, proposedName: string): Promise<'vault' | 'local' | 'unreadable'>;
|
|
108
113
|
/**
|
|
109
114
|
* Read fresh bearer material for one scoped operation; never publish it.
|
|
@@ -419,7 +419,12 @@ export async function readClaustrumEnrollmentStatus(paths, proposedName) {
|
|
|
419
419
|
}
|
|
420
420
|
return statusFromState(state);
|
|
421
421
|
}
|
|
422
|
-
/**
|
|
422
|
+
/**
|
|
423
|
+
* Resolve the host's account mode from its enrollment files. It never changes
|
|
424
|
+
* their contents or the host's mode. On Windows, reading them may create a
|
|
425
|
+
* missing private state folder and tighten an enrollment file's permissions to
|
|
426
|
+
* owner-only, as every private-file read there does.
|
|
427
|
+
*/
|
|
423
428
|
export async function enrollmentAuthority(paths, proposedName) {
|
|
424
429
|
let status;
|
|
425
430
|
try {
|
|
@@ -6,8 +6,9 @@ export { type AccountIdentitySource, type ClaustrumFamily, type ClaustrumScopedA
|
|
|
6
6
|
export { type ClaustrumEnrollmentClient, type ClaustrumEnrollmentConnection, type ClaustrumEnrollmentDisconnectResult, ClaustrumEnrollmentManager, type ClaustrumEnrollmentPaths, type ClaustrumEnrollmentResetResult, type ClaustrumEnrollmentStatus, classifyEnrollmentError, connectClaustrumEnrollmentClient, disconnectClaustrumEnrollment, type EnrollmentDisposition, enrollmentAuthority, enrollmentName, getClaustrumEnrollmentPaths, hostEnrollmentPaths, RETRYABLE_ENROLLMENT_CODES, readClaustrumEnrollmentStatus, readClaustrumEnrollmentToken, resetClaustrumEnrollmentState, TERMINAL_ENROLLMENT_CODES, } from './enrollment.js';
|
|
7
7
|
export { ClaustrumConsumerError, type ClaustrumConsumerFailureKind, type ClaustrumLogger, } from './errors.js';
|
|
8
8
|
export { assertHostSlotMatchesMode, assertNotCustodyPlaceholder, CUSTODY_PLACEHOLDER_PREFIX, classifyHostSlot, custodyPlaceholder, custodyPlaceholderKey, type HostSlotContent, isCustodyPlaceholder, isCustodyPlaceholderValue, } from './host-slot.js';
|
|
9
|
+
export type { InsulaQuotaContext, InsulaQuotaOptions, InsulaUsageEntry, InsulaUsageTransport, InsulaUsageWindow, } from './insula.js';
|
|
9
10
|
export { acceptAccount, type DeclinedAccount, declineAccount, isDeclined, } from './interlock.js';
|
|
10
|
-
export { type AccountMapper, acceptVaultRoute, DEFAULT_ROUTE_PREFIX, declineVaultRoute, type MutateVaultRosterOptions, mutateVaultRoster, type ProjectionOptions, projectVaultRoster, type QuotaReceipt, readVaultRoster, recordVaultQuota, refreshVaultRoster, resolveVaultPrimary, type VaultPrimary, type VaultPrimaryBinding, type VaultPrimaryUnavailableReason, type VaultRosterFile, type VaultRosterLockContext, type VaultRosterRow, vaultRoutingRows, } from './roster.js';
|
|
11
|
+
export { type AccountMapper, acceptVaultRoute, DEFAULT_ROUTE_PREFIX, declineVaultRoute, type MutateVaultRosterOptions, mutateVaultRoster, type ProjectionOptions, projectVaultRoster, type QuotaReceipt, readVaultRoster, recordVaultAccountQuota, recordVaultQuota, refreshVaultRoster, resolveVaultPrimary, type VaultPrimary, type VaultPrimaryBinding, type VaultPrimaryUnavailableReason, type VaultRosterFile, type VaultRosterLockContext, type VaultRosterRow, vaultRoutingRows, } from './roster.js';
|
|
11
12
|
/**
|
|
12
13
|
* Connect the client that lists and fetches this consumer's vault credentials
|
|
13
14
|
* on the request path. `connectionFile` is required: this library
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// declined-account interlock and the host-slot guard. Needs the optional
|
|
5
5
|
// peer `@cortexkit/claustrum-client`.
|
|
6
6
|
import { ClaustrumClient, } from '@cortexkit/claustrum-client';
|
|
7
|
+
import { insulaUsageTransport } from './insula.js';
|
|
7
8
|
export { ClaustrumCredentialError, } from '@cortexkit/claustrum-client';
|
|
8
9
|
export { ClaustrumConsumer, } from './consumer.js';
|
|
9
10
|
export { ClaustrumScopedCustody, decideScopedRetryAfter401, isScopedCredentialRotation, SERVING_MARGIN_MS, } from './custody.js';
|
|
@@ -11,12 +12,13 @@ export { ClaustrumEnrollmentManager, classifyEnrollmentError, connectClaustrumEn
|
|
|
11
12
|
export { ClaustrumConsumerError, } from './errors.js';
|
|
12
13
|
export { assertHostSlotMatchesMode, assertNotCustodyPlaceholder, CUSTODY_PLACEHOLDER_PREFIX, classifyHostSlot, custodyPlaceholder, custodyPlaceholderKey, isCustodyPlaceholder, isCustodyPlaceholderValue, } from './host-slot.js';
|
|
13
14
|
export { acceptAccount, declineAccount, isDeclined, } from './interlock.js';
|
|
14
|
-
export { acceptVaultRoute, DEFAULT_ROUTE_PREFIX, declineVaultRoute, mutateVaultRoster, projectVaultRoster, readVaultRoster, recordVaultQuota, refreshVaultRoster, resolveVaultPrimary, vaultRoutingRows, } from './roster.js';
|
|
15
|
+
export { acceptVaultRoute, DEFAULT_ROUTE_PREFIX, declineVaultRoute, mutateVaultRoster, projectVaultRoster, readVaultRoster, recordVaultAccountQuota, recordVaultQuota, refreshVaultRoster, resolveVaultPrimary, vaultRoutingRows, } from './roster.js';
|
|
15
16
|
/**
|
|
16
17
|
* Connect the client that lists and fetches this consumer's vault credentials
|
|
17
18
|
* on the request path. `connectionFile` is required: this library
|
|
18
19
|
* reads no environment, so the plugin resolves the vault's connection file.
|
|
19
20
|
*/
|
|
20
|
-
export function connectClaustrumScopedClient(options) {
|
|
21
|
-
|
|
21
|
+
export async function connectClaustrumScopedClient(options) {
|
|
22
|
+
const client = await ClaustrumClient.connect(options);
|
|
23
|
+
return Object.assign(client, { insula: insulaUsageTransport(options) });
|
|
22
24
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ClaustrumClientOptions } from '@cortexkit/claustrum-client';
|
|
2
|
+
/** Insula's window fields are open: plugins choose which limits they understand. */
|
|
3
|
+
export interface InsulaUsageWindow {
|
|
4
|
+
usedPercent: number;
|
|
5
|
+
rawUsedPercent?: number;
|
|
6
|
+
resetsAt?: string;
|
|
7
|
+
windowMinutes?: number;
|
|
8
|
+
windowKind?: string;
|
|
9
|
+
[field: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface InsulaUsageEntry {
|
|
12
|
+
provider: string;
|
|
13
|
+
account?: string;
|
|
14
|
+
fetchedAt?: string;
|
|
15
|
+
source?: string;
|
|
16
|
+
stale?: unknown;
|
|
17
|
+
errorClass?: unknown;
|
|
18
|
+
usage?: {
|
|
19
|
+
primary?: InsulaUsageWindow;
|
|
20
|
+
secondary?: InsulaUsageWindow;
|
|
21
|
+
tertiary?: InsulaUsageWindow;
|
|
22
|
+
extraRateWindows?: Array<{
|
|
23
|
+
id?: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
window?: InsulaUsageWindow;
|
|
26
|
+
}>;
|
|
27
|
+
[field: string]: unknown;
|
|
28
|
+
};
|
|
29
|
+
[field: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface InsulaQuotaContext {
|
|
32
|
+
/** Milliseconds since the epoch, parsed from the producer's fetchedAt. */
|
|
33
|
+
fetchedAt: number;
|
|
34
|
+
source?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface InsulaQuotaOptions<Q> {
|
|
37
|
+
provider: 'codex' | 'claude' | 'antigravity';
|
|
38
|
+
/**
|
|
39
|
+
* Set every converted window's reading time to context.fetchedAt, not poll
|
|
40
|
+
* time. Return undefined for entries the plugin cannot use. Antigravity can
|
|
41
|
+
* receive its own sidebar reading back from insula: accept it only from the
|
|
42
|
+
* vault or when fetchedAt is newer than the plugin's last reading.
|
|
43
|
+
*/
|
|
44
|
+
normalize: (entry: InsulaUsageEntry, context: InsulaQuotaContext) => Q | undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Optional transport for custom scoped clients; getUsage must not retry refusals. */
|
|
47
|
+
export interface InsulaUsageTransport {
|
|
48
|
+
connectionFile: string;
|
|
49
|
+
getUsage(): Promise<unknown>;
|
|
50
|
+
}
|
|
51
|
+
/** Constructing this transport opens no connection; getUsage opens one per call. */
|
|
52
|
+
export declare function insulaUsageTransport(options: ClaustrumClientOptions & {
|
|
53
|
+
connectionFile: string;
|
|
54
|
+
}): InsulaUsageTransport;
|
|
55
|
+
export declare class InsulaQuotaSource {
|
|
56
|
+
#private;
|
|
57
|
+
private readonly transport;
|
|
58
|
+
private readonly key;
|
|
59
|
+
constructor(transport: InsulaUsageTransport, key: string);
|
|
60
|
+
refresh(now: number): Promise<void>;
|
|
61
|
+
current(provider: string, accountId: string, now: number): {
|
|
62
|
+
entry: InsulaUsageEntry;
|
|
63
|
+
context: InsulaQuotaContext;
|
|
64
|
+
} | undefined;
|
|
65
|
+
}
|
|
66
|
+
export declare function acquireInsulaQuotaSource(transport: InsulaUsageTransport, tokenPath: string): {
|
|
67
|
+
source: InsulaQuotaSource;
|
|
68
|
+
release(): void;
|
|
69
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { storeIdentity } from '@cortexkit/claustrum-client';
|
|
3
|
+
// A static import: claustrum-client already loads subc-client whenever
|
|
4
|
+
// /claustrum is imported, so loading it lazily saves nothing, and a dynamic
|
|
5
|
+
// import makes bundlers emit a separate chunk that a running host loses when
|
|
6
|
+
// its dist folder is rebuilt underneath it.
|
|
7
|
+
import { SubcClient } from '@cortexkit/subc-client';
|
|
8
|
+
/** Constructing this transport opens no connection; getUsage opens one per call. */
|
|
9
|
+
export function insulaUsageTransport(options) {
|
|
10
|
+
const identity = options.identity ??
|
|
11
|
+
storeIdentity(options.projectRoot ?? process.cwd(), options.storagePath ?? process.cwd());
|
|
12
|
+
return {
|
|
13
|
+
connectionFile: options.connectionFile,
|
|
14
|
+
async getUsage() {
|
|
15
|
+
let client;
|
|
16
|
+
let expired = false;
|
|
17
|
+
let timer;
|
|
18
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
19
|
+
timer = setTimeout(() => reject(new Error('insula usage timeout')), 3_000);
|
|
20
|
+
timer.unref?.();
|
|
21
|
+
});
|
|
22
|
+
const request = (async () => {
|
|
23
|
+
client = options.connector
|
|
24
|
+
? await options.connector({
|
|
25
|
+
connectionFile: options.connectionFile,
|
|
26
|
+
handshakeTimeoutMs: Math.min(options.handshakeTimeoutMs ?? 3_000, 3_000),
|
|
27
|
+
})
|
|
28
|
+
: await SubcClient.connect({
|
|
29
|
+
connectionFile: options.connectionFile,
|
|
30
|
+
handshakeTimeoutMs: Math.min(options.handshakeTimeoutMs ?? 3_000, 3_000),
|
|
31
|
+
});
|
|
32
|
+
// A slow connector may resolve after the whole-call deadline. It still
|
|
33
|
+
// owns a socket, which must not survive or open a route after fallback.
|
|
34
|
+
if (expired) {
|
|
35
|
+
client.close();
|
|
36
|
+
throw new Error('insula usage timeout');
|
|
37
|
+
}
|
|
38
|
+
// Managed call() retries warming routes. A single routeOpen/request
|
|
39
|
+
// instead lets the plugin fall back as soon as the daemon refuses.
|
|
40
|
+
const route = await client.routeOpen({ kind: 'management_surface', module_id: 'insula' }, identity);
|
|
41
|
+
return await client.request(route, { method: 'usage.get', params: {} });
|
|
42
|
+
})();
|
|
43
|
+
try {
|
|
44
|
+
return await Promise.race([request, timeout]);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
expired = true;
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
client?.close();
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const MINUTE = 60_000;
|
|
55
|
+
const MAX_AGE = 4 * MINUTE;
|
|
56
|
+
const sources = new Map();
|
|
57
|
+
// Keep only the minute budget after the last owner closes, so project churn
|
|
58
|
+
// cannot reset the bound. Expired budgets are pruned on the next tick.
|
|
59
|
+
const attempts = new Map();
|
|
60
|
+
function record(value) {
|
|
61
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
62
|
+
}
|
|
63
|
+
export class InsulaQuotaSource {
|
|
64
|
+
transport;
|
|
65
|
+
key;
|
|
66
|
+
#entries = [];
|
|
67
|
+
#pending;
|
|
68
|
+
constructor(transport, key) {
|
|
69
|
+
this.transport = transport;
|
|
70
|
+
this.key = key;
|
|
71
|
+
}
|
|
72
|
+
refresh(now) {
|
|
73
|
+
if (this.#pending)
|
|
74
|
+
return this.#pending;
|
|
75
|
+
for (const [key, time] of attempts) {
|
|
76
|
+
if (now - time >= MINUTE)
|
|
77
|
+
attempts.delete(key);
|
|
78
|
+
}
|
|
79
|
+
const lastAttempt = attempts.get(this.key);
|
|
80
|
+
if (lastAttempt !== undefined && now - lastAttempt < MINUTE)
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
// Reserve the minute before I/O, so concurrent projects cannot each poll.
|
|
83
|
+
attempts.set(this.key, now);
|
|
84
|
+
this.#pending = (async () => {
|
|
85
|
+
try {
|
|
86
|
+
const reply = await this.transport.getUsage();
|
|
87
|
+
if (!record(reply) ||
|
|
88
|
+
!Array.isArray(reply.result) ||
|
|
89
|
+
reply.error !== undefined)
|
|
90
|
+
throw new Error('unavailable insula usage');
|
|
91
|
+
// Each response is a snapshot, not a delta. Missing accounts fall back;
|
|
92
|
+
// neither pending nor the entry count asserts provider completeness.
|
|
93
|
+
this.#entries = reply.result.filter((entry) => record(entry) && typeof entry.provider === 'string');
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Refusal is absence, even if the previous reading was still young.
|
|
97
|
+
this.#entries = [];
|
|
98
|
+
}
|
|
99
|
+
})().finally(() => {
|
|
100
|
+
this.#pending = undefined;
|
|
101
|
+
});
|
|
102
|
+
return this.#pending;
|
|
103
|
+
}
|
|
104
|
+
current(provider, accountId, now) {
|
|
105
|
+
for (const entry of this.#entries) {
|
|
106
|
+
if (entry.provider !== provider ||
|
|
107
|
+
typeof entry.account !== 'string' ||
|
|
108
|
+
entry.account.trim() !== accountId)
|
|
109
|
+
continue;
|
|
110
|
+
if (entry.stale !== undefined ||
|
|
111
|
+
entry.errorClass !== undefined ||
|
|
112
|
+
!record(entry.usage))
|
|
113
|
+
continue;
|
|
114
|
+
const fetchedAt = typeof entry.fetchedAt === 'string'
|
|
115
|
+
? Date.parse(entry.fetchedAt)
|
|
116
|
+
: Number.NaN;
|
|
117
|
+
if (!Number.isFinite(fetchedAt) || now - fetchedAt >= MAX_AGE)
|
|
118
|
+
continue;
|
|
119
|
+
return {
|
|
120
|
+
entry,
|
|
121
|
+
context: {
|
|
122
|
+
fetchedAt,
|
|
123
|
+
...(typeof entry.source === 'string' && { source: entry.source }),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function acquireInsulaQuotaSource(transport, tokenPath) {
|
|
131
|
+
const key = JSON.stringify([
|
|
132
|
+
resolve(transport.connectionFile),
|
|
133
|
+
resolve(tokenPath),
|
|
134
|
+
]);
|
|
135
|
+
let shared = sources.get(key);
|
|
136
|
+
if (!shared) {
|
|
137
|
+
shared = { source: new InsulaQuotaSource(transport, key), refs: 0 };
|
|
138
|
+
sources.set(key, shared);
|
|
139
|
+
}
|
|
140
|
+
shared.refs++;
|
|
141
|
+
let released = false;
|
|
142
|
+
return {
|
|
143
|
+
source: shared.source,
|
|
144
|
+
release() {
|
|
145
|
+
if (released)
|
|
146
|
+
return;
|
|
147
|
+
released = true;
|
|
148
|
+
if (--shared.refs === 0)
|
|
149
|
+
sources.delete(key);
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|