@stigmer/react 3.2.3 → 3.3.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/agent/steps/ReviewStep.d.ts.map +1 -1
- package/agent/steps/ReviewStep.js +2 -3
- package/agent/steps/ReviewStep.js.map +1 -1
- package/billing/BaselineEditor.d.ts +9 -0
- package/billing/BaselineEditor.d.ts.map +1 -0
- package/billing/BaselineEditor.js +253 -0
- package/billing/BaselineEditor.js.map +1 -0
- package/billing/ModelCatalogPanel.d.ts +28 -0
- package/billing/ModelCatalogPanel.d.ts.map +1 -0
- package/billing/ModelCatalogPanel.js +102 -0
- package/billing/ModelCatalogPanel.js.map +1 -0
- package/billing/ModelGovernanceDetail.d.ts +8 -0
- package/billing/ModelGovernanceDetail.d.ts.map +1 -0
- package/billing/ModelGovernanceDetail.js +64 -0
- package/billing/ModelGovernanceDetail.js.map +1 -0
- package/billing/OperatorAccessNotice.d.ts +12 -0
- package/billing/OperatorAccessNotice.d.ts.map +1 -0
- package/billing/OperatorAccessNotice.js +15 -0
- package/billing/OperatorAccessNotice.js.map +1 -0
- package/billing/PricingGovernanceConsole.d.ts +57 -0
- package/billing/PricingGovernanceConsole.d.ts.map +1 -0
- package/billing/PricingGovernanceConsole.js +164 -0
- package/billing/PricingGovernanceConsole.js.map +1 -0
- package/billing/PricingGovernancePanel.d.ts +26 -0
- package/billing/PricingGovernancePanel.d.ts.map +1 -0
- package/billing/PricingGovernancePanel.js +64 -0
- package/billing/PricingGovernancePanel.js.map +1 -0
- package/billing/RetireConfirm.d.ts +9 -0
- package/billing/RetireConfirm.d.ts.map +1 -0
- package/billing/RetireConfirm.js +19 -0
- package/billing/RetireConfirm.js.map +1 -0
- package/billing/form-primitives.d.ts +18 -0
- package/billing/form-primitives.d.ts.map +1 -0
- package/billing/form-primitives.js +19 -0
- package/billing/form-primitives.js.map +1 -0
- package/billing/governance-primitives.d.ts +33 -0
- package/billing/governance-primitives.d.ts.map +1 -0
- package/billing/governance-primitives.js +43 -0
- package/billing/governance-primitives.js.map +1 -0
- package/billing/index.d.ts +18 -0
- package/billing/index.d.ts.map +1 -1
- package/billing/index.js +9 -0
- package/billing/index.js.map +1 -1
- package/billing/pricing-format.d.ts +12 -0
- package/billing/pricing-format.d.ts.map +1 -0
- package/billing/pricing-format.js +50 -0
- package/billing/pricing-format.js.map +1 -0
- package/billing/useDecidePricingOverride.d.ts +46 -0
- package/billing/useDecidePricingOverride.d.ts.map +1 -0
- package/billing/useDecidePricingOverride.js +44 -0
- package/billing/useDecidePricingOverride.js.map +1 -0
- package/billing/useModelGovernanceView.d.ts +103 -0
- package/billing/useModelGovernanceView.d.ts.map +1 -0
- package/billing/useModelGovernanceView.js +144 -0
- package/billing/useModelGovernanceView.js.map +1 -0
- package/billing/useModelPricingBaselines.d.ts +40 -0
- package/billing/useModelPricingBaselines.d.ts.map +1 -0
- package/billing/useModelPricingBaselines.js +32 -0
- package/billing/useModelPricingBaselines.js.map +1 -0
- package/billing/usePricingGovernance.d.ts +39 -0
- package/billing/usePricingGovernance.d.ts.map +1 -0
- package/billing/usePricingGovernance.js +31 -0
- package/billing/usePricingGovernance.js.map +1 -0
- package/billing/useRetireModelPricingBaseline.d.ts +31 -0
- package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
- package/billing/useRetireModelPricingBaseline.js +36 -0
- package/billing/useRetireModelPricingBaseline.js.map +1 -0
- package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
- package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
- package/billing/useUpsertModelPricingBaseline.js +37 -0
- package/billing/useUpsertModelPricingBaseline.js.map +1 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +11 -5
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
- package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountEditor.js +51 -0
- package/cursor-accounts/CursorAccountEditor.js.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.js +275 -0
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
- package/cursor-accounts/cursor-account-format.d.ts +10 -0
- package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-format.js +26 -0
- package/cursor-accounts/cursor-account-format.js.map +1 -0
- package/cursor-accounts/index.d.ts +18 -0
- package/cursor-accounts/index.d.ts.map +1 -0
- package/cursor-accounts/index.js +13 -0
- package/cursor-accounts/index.js.map +1 -0
- package/cursor-accounts/useCursorAccountView.d.ts +30 -0
- package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccountView.js +25 -0
- package/cursor-accounts/useCursorAccountView.js.map +1 -0
- package/cursor-accounts/useCursorAccounts.d.ts +33 -0
- package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccounts.js +25 -0
- package/cursor-accounts/useCursorAccounts.js.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
- package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.js +32 -0
- package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.js +31 -0
- package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.js +34 -0
- package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
- package/datastore/CollectionRecordsBrowser.d.ts +34 -0
- package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
- package/datastore/CollectionRecordsBrowser.js +209 -0
- package/datastore/CollectionRecordsBrowser.js.map +1 -0
- package/datastore/CollectionSchemaView.d.ts +29 -0
- package/datastore/CollectionSchemaView.d.ts.map +1 -0
- package/datastore/CollectionSchemaView.js +93 -0
- package/datastore/CollectionSchemaView.js.map +1 -0
- package/datastore/DatastoreDetailView.d.ts +44 -0
- package/datastore/DatastoreDetailView.d.ts.map +1 -0
- package/datastore/DatastoreDetailView.js +76 -0
- package/datastore/DatastoreDetailView.js.map +1 -0
- package/datastore/DatastoreSyncReport.d.ts +19 -0
- package/datastore/DatastoreSyncReport.d.ts.map +1 -0
- package/datastore/DatastoreSyncReport.js +45 -0
- package/datastore/DatastoreSyncReport.js.map +1 -0
- package/datastore/DeleteDatastoreDialog.d.ts +35 -0
- package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
- package/datastore/DeleteDatastoreDialog.js +90 -0
- package/datastore/DeleteDatastoreDialog.js.map +1 -0
- package/datastore/FieldValueControl.d.ts +55 -0
- package/datastore/FieldValueControl.d.ts.map +1 -0
- package/datastore/FieldValueControl.js +138 -0
- package/datastore/FieldValueControl.js.map +1 -0
- package/datastore/RecordFilterBuilder.d.ts +30 -0
- package/datastore/RecordFilterBuilder.d.ts.map +1 -0
- package/datastore/RecordFilterBuilder.js +122 -0
- package/datastore/RecordFilterBuilder.js.map +1 -0
- package/datastore/RecordFormPanel.d.ts +45 -0
- package/datastore/RecordFormPanel.d.ts.map +1 -0
- package/datastore/RecordFormPanel.js +215 -0
- package/datastore/RecordFormPanel.js.map +1 -0
- package/datastore/index.d.ts +43 -0
- package/datastore/index.d.ts.map +1 -0
- package/datastore/index.js +22 -0
- package/datastore/index.js.map +1 -0
- package/datastore/recordFilter.d.ts +54 -0
- package/datastore/recordFilter.d.ts.map +1 -0
- package/datastore/recordFilter.js +93 -0
- package/datastore/recordFilter.js.map +1 -0
- package/datastore/recordValues.d.ts +85 -0
- package/datastore/recordValues.d.ts.map +1 -0
- package/datastore/recordValues.js +282 -0
- package/datastore/recordValues.js.map +1 -0
- package/datastore/useDatastore.d.ts +39 -0
- package/datastore/useDatastore.d.ts.map +1 -0
- package/datastore/useDatastore.js +44 -0
- package/datastore/useDatastore.js.map +1 -0
- package/datastore/useDatastoreCount.d.ts +48 -0
- package/datastore/useDatastoreCount.d.ts.map +1 -0
- package/datastore/useDatastoreCount.js +27 -0
- package/datastore/useDatastoreCount.js.map +1 -0
- package/datastore/useDatastoreDescription.d.ts +54 -0
- package/datastore/useDatastoreDescription.d.ts.map +1 -0
- package/datastore/useDatastoreDescription.js +50 -0
- package/datastore/useDatastoreDescription.js.map +1 -0
- package/datastore/useDatastoreList.d.ts +57 -0
- package/datastore/useDatastoreList.d.ts.map +1 -0
- package/datastore/useDatastoreList.js +29 -0
- package/datastore/useDatastoreList.js.map +1 -0
- package/datastore/useDatastoreSearch.d.ts +19 -0
- package/datastore/useDatastoreSearch.d.ts.map +1 -0
- package/datastore/useDatastoreSearch.js +22 -0
- package/datastore/useDatastoreSearch.js.map +1 -0
- package/datastore/useDeleteDatastore.d.ts +53 -0
- package/datastore/useDeleteDatastore.d.ts.map +1 -0
- package/datastore/useDeleteDatastore.js +40 -0
- package/datastore/useDeleteDatastore.js.map +1 -0
- package/datastore/useDeleteRecord.d.ts +34 -0
- package/datastore/useDeleteRecord.d.ts.map +1 -0
- package/datastore/useDeleteRecord.js +43 -0
- package/datastore/useDeleteRecord.js.map +1 -0
- package/datastore/useInsertRecord.d.ts +50 -0
- package/datastore/useInsertRecord.d.ts.map +1 -0
- package/datastore/useInsertRecord.js +55 -0
- package/datastore/useInsertRecord.js.map +1 -0
- package/datastore/useRecordCollection.d.ts +104 -0
- package/datastore/useRecordCollection.d.ts.map +1 -0
- package/datastore/useRecordCollection.js +136 -0
- package/datastore/useRecordCollection.js.map +1 -0
- package/datastore/useRecordList.d.ts +66 -0
- package/datastore/useRecordList.d.ts.map +1 -0
- package/datastore/useRecordList.js +58 -0
- package/datastore/useRecordList.js.map +1 -0
- package/datastore/useUpdateRecord.d.ts +52 -0
- package/datastore/useUpdateRecord.d.ts.map +1 -0
- package/datastore/useUpdateRecord.js +55 -0
- package/datastore/useUpdateRecord.js.map +1 -0
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +12 -7
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/iam-policy/index.d.ts +1 -1
- package/iam-policy/index.d.ts.map +1 -1
- package/iam-policy/index.js.map +1 -1
- package/iam-policy/useCheckPermission.d.ts +32 -11
- package/iam-policy/useCheckPermission.d.ts.map +1 -1
- package/iam-policy/useCheckPermission.js +24 -19
- package/iam-policy/useCheckPermission.js.map +1 -1
- package/index.d.ts +12 -6
- package/index.d.ts.map +1 -1
- package/index.js +14 -3
- package/index.js.map +1 -1
- package/library/index.d.ts +0 -7
- package/library/index.d.ts.map +1 -1
- package/library/index.js +0 -4
- package/library/index.js.map +1 -1
- package/library/useApplyResource.d.ts +12 -12
- package/library/useApplyResource.d.ts.map +1 -1
- package/library/useApplyResource.js +16 -25
- package/library/useApplyResource.js.map +1 -1
- package/library/useExportResource.d.ts +13 -9
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +18 -36
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts +48 -0
- package/manifest/ApplyManifestDialog.d.ts.map +1 -0
- package/manifest/ApplyManifestDialog.js +135 -0
- package/manifest/ApplyManifestDialog.js.map +1 -0
- package/manifest/EditResourceYamlDialog.d.ts +51 -0
- package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
- package/manifest/EditResourceYamlDialog.js +104 -0
- package/manifest/EditResourceYamlDialog.js.map +1 -0
- package/manifest/RedactedSecretsNotice.d.ts +14 -0
- package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
- package/manifest/RedactedSecretsNotice.js +14 -0
- package/manifest/RedactedSecretsNotice.js.map +1 -0
- package/manifest/YamlEditor.d.ts +44 -0
- package/manifest/YamlEditor.d.ts.map +1 -0
- package/manifest/YamlEditor.js +216 -0
- package/manifest/YamlEditor.js.map +1 -0
- package/manifest/index.d.ts +13 -0
- package/manifest/index.d.ts.map +1 -0
- package/manifest/index.js +13 -0
- package/manifest/index.js.map +1 -0
- package/manifest/useApplyManifest.d.ts +82 -0
- package/manifest/useApplyManifest.d.ts.map +1 -0
- package/manifest/useApplyManifest.js +180 -0
- package/manifest/useApplyManifest.js.map +1 -0
- package/manifest/useEditResourceYaml.d.ts +106 -0
- package/manifest/useEditResourceYaml.d.ts.map +1 -0
- package/manifest/useEditResourceYaml.js +168 -0
- package/manifest/useEditResourceYaml.js.map +1 -0
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
- package/mcp-server/steps/ReviewStep.js +2 -3
- package/mcp-server/steps/ReviewStep.js.map +1 -1
- package/package.json +4 -4
- package/resource-creation/templates/workflow-templates.js +4 -4
- package/session/useEditSessionPrep.js +3 -3
- package/session/useEditSessionPrep.js.map +1 -1
- package/settings/index.d.ts +2 -1
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -1
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts +22 -0
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +32 -1
- package/settings/settings-nav.js.map +1 -1
- package/settings/useSettingsNavGroups.d.ts +29 -0
- package/settings/useSettingsNavGroups.d.ts.map +1 -0
- package/settings/useSettingsNavGroups.js +61 -0
- package/settings/useSettingsNavGroups.js.map +1 -0
- package/src/agent/steps/ReviewStep.tsx +2 -3
- package/src/billing/BaselineEditor.tsx +619 -0
- package/src/billing/ModelCatalogPanel.tsx +283 -0
- package/src/billing/ModelGovernanceDetail.tsx +289 -0
- package/src/billing/OperatorAccessNotice.tsx +32 -0
- package/src/billing/PricingGovernanceConsole.tsx +465 -0
- package/src/billing/PricingGovernancePanel.tsx +166 -0
- package/src/billing/RetireConfirm.tsx +82 -0
- package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
- package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
- package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
- package/src/billing/form-primitives.tsx +68 -0
- package/src/billing/governance-primitives.tsx +133 -0
- package/src/billing/index.ts +37 -0
- package/src/billing/pricing-format.ts +53 -0
- package/src/billing/useDecidePricingOverride.ts +78 -0
- package/src/billing/useModelGovernanceView.ts +290 -0
- package/src/billing/useModelPricingBaselines.ts +69 -0
- package/src/billing/usePricingGovernance.ts +57 -0
- package/src/billing/useRetireModelPricingBaseline.ts +65 -0
- package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
- package/src/channel/AgentChannelsPanel.tsx +27 -1
- package/src/composer/SessionComposer.tsx +1 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
- package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
- package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
- package/src/cursor-accounts/cursor-account-format.ts +29 -0
- package/src/cursor-accounts/index.ts +29 -0
- package/src/cursor-accounts/useCursorAccountView.ts +49 -0
- package/src/cursor-accounts/useCursorAccounts.ts +49 -0
- package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
- package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
- package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
- package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
- package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
- package/src/datastore/CollectionSchemaView.tsx +247 -0
- package/src/datastore/DatastoreDetailView.tsx +201 -0
- package/src/datastore/DatastoreSyncReport.tsx +105 -0
- package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
- package/src/datastore/FieldValueControl.tsx +289 -0
- package/src/datastore/RecordFilterBuilder.tsx +411 -0
- package/src/datastore/RecordFormPanel.tsx +432 -0
- package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
- package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
- package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
- package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
- package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
- package/src/datastore/__tests__/recordFilter.test.ts +156 -0
- package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
- package/src/datastore/__tests__/recordValues.test.ts +359 -0
- package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
- package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
- package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
- package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
- package/src/datastore/index.ts +111 -0
- package/src/datastore/recordFilter.ts +140 -0
- package/src/datastore/recordValues.ts +327 -0
- package/src/datastore/useDatastore.ts +67 -0
- package/src/datastore/useDatastoreCount.ts +67 -0
- package/src/datastore/useDatastoreDescription.ts +90 -0
- package/src/datastore/useDatastoreList.ts +79 -0
- package/src/datastore/useDatastoreSearch.ts +39 -0
- package/src/datastore/useDeleteDatastore.ts +87 -0
- package/src/datastore/useDeleteRecord.ts +77 -0
- package/src/datastore/useInsertRecord.ts +92 -0
- package/src/datastore/useRecordCollection.ts +256 -0
- package/src/datastore/useRecordList.ts +131 -0
- package/src/datastore/useUpdateRecord.ts +95 -0
- package/src/environment/EnvironmentListPanel.tsx +24 -0
- package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
- package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
- package/src/iam-policy/index.ts +1 -0
- package/src/iam-policy/useCheckPermission.ts +45 -19
- package/src/index.ts +163 -13
- package/src/library/index.ts +0 -20
- package/src/library/useApplyResource.ts +27 -34
- package/src/library/useExportResource.ts +21 -40
- package/src/manifest/ApplyManifestDialog.tsx +315 -0
- package/src/manifest/EditResourceYamlDialog.tsx +265 -0
- package/src/manifest/RedactedSecretsNotice.tsx +30 -0
- package/src/manifest/YamlEditor.tsx +272 -0
- package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
- package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
- package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
- package/src/manifest/index.ts +33 -0
- package/src/manifest/useApplyManifest.ts +270 -0
- package/src/manifest/useEditResourceYaml.ts +273 -0
- package/src/mcp-server/steps/ReviewStep.tsx +2 -3
- package/src/resource-creation/templates/workflow-templates.ts +4 -4
- package/src/session/useEditSessionPrep.ts +3 -3
- package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
- package/src/settings/index.ts +5 -1
- package/src/settings/settings-nav.ts +43 -0
- package/src/settings/useSettingsNavGroups.ts +81 -0
- package/src/workflow/WorkflowYamlEditor.tsx +6 -270
- package/styles.css +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/WorkflowYamlEditor.d.ts +2 -42
- package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
- package/workflow/WorkflowYamlEditor.js +5 -214
- package/workflow/WorkflowYamlEditor.js.map +1 -1
- package/library/ImportResourceDialog.d.ts +0 -43
- package/library/ImportResourceDialog.d.ts.map +0 -1
- package/library/ImportResourceDialog.js +0 -90
- package/library/ImportResourceDialog.js.map +0 -1
- package/library/parse-resource-yaml.d.ts +0 -63
- package/library/parse-resource-yaml.d.ts.map +0 -1
- package/library/parse-resource-yaml.js +0 -407
- package/library/parse-resource-yaml.js.map +0 -1
- package/library/serialize-resource-yaml.d.ts +0 -103
- package/library/serialize-resource-yaml.d.ts.map +0 -1
- package/library/serialize-resource-yaml.js +0 -565
- package/library/serialize-resource-yaml.js.map +0 -1
- package/library/useImportResource.d.ts +0 -84
- package/library/useImportResource.d.ts.map +0 -1
- package/library/useImportResource.js +0 -188
- package/library/useImportResource.js.map +0 -1
- package/src/library/ImportResourceDialog.tsx +0 -227
- package/src/library/parse-resource-yaml.ts +0 -630
- package/src/library/serialize-resource-yaml.ts +0 -756
- package/src/library/useImportResource.ts +0 -253
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
import { ModelPricingBaselineStatus } from "@stigmer/protos/ai/stigmer/billing/v1/model_pricing_baseline_pb";
|
|
5
|
+
import { Button } from "../button/index.js";
|
|
6
|
+
import { GovernanceBadge } from "./governance-primitives.js";
|
|
7
|
+
import { RATE_FIELD_LABELS, ZERO, formatDeltaBp, formatRate, } from "./pricing-format.js";
|
|
8
|
+
/** The five rate fields of a pricing block, in canonical display order. */
|
|
9
|
+
function blockRates(pricing) {
|
|
10
|
+
return [
|
|
11
|
+
["Input", pricing?.inputPriceMicrosPerMillion ?? ZERO],
|
|
12
|
+
["Output", pricing?.outputPriceMicrosPerMillion ?? ZERO],
|
|
13
|
+
["Cache write", pricing?.cacheWritePriceMicrosPerMillion ?? ZERO],
|
|
14
|
+
["Cache read", pricing?.cacheReadPriceMicrosPerMillion ?? ZERO],
|
|
15
|
+
["Cursor token rate", pricing?.cursorTokenRateMicrosPerMillion ?? ZERO],
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
export function ModelGovernanceDetail({ row, onEdit, onRetire, onBack, }) {
|
|
19
|
+
const { baseline, governance } = row;
|
|
20
|
+
const hasOverrides = (governance?.activeOverrides.length ?? 0) > 0;
|
|
21
|
+
const baseRates = [
|
|
22
|
+
{
|
|
23
|
+
label: "Input",
|
|
24
|
+
baseline: baseline.pricing?.inputPriceMicrosPerMillion ?? ZERO,
|
|
25
|
+
effective: governance?.effectiveInputMicrosPerMillion ?? null,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: "Output",
|
|
29
|
+
baseline: baseline.pricing?.outputPriceMicrosPerMillion ?? ZERO,
|
|
30
|
+
effective: governance?.effectiveOutputMicrosPerMillion ?? null,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "Cache write",
|
|
34
|
+
baseline: baseline.pricing?.cacheWritePriceMicrosPerMillion ?? ZERO,
|
|
35
|
+
effective: governance?.effectiveCacheWriteMicrosPerMillion ?? null,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: "Cache read",
|
|
39
|
+
baseline: baseline.pricing?.cacheReadPriceMicrosPerMillion ?? ZERO,
|
|
40
|
+
effective: governance?.effectiveCacheReadMicrosPerMillion ?? null,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: "Cursor token rate",
|
|
44
|
+
baseline: baseline.pricing?.cursorTokenRateMicrosPerMillion ?? ZERO,
|
|
45
|
+
effective: governance?.effectiveCursorTokenRateMicrosPerMillion ?? null,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
return (_jsxs("div", { className: "space-y-4 rounded-lg border border-border bg-card px-4 py-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("h4", { className: "flex flex-wrap items-center gap-2 text-sm font-semibold text-foreground", children: [baseline.displayName || baseline.modelId, governance && (_jsx(GovernanceBadge, { ledgerReconcilable: governance.ledgerReconcilable, hasOverrides: hasOverrides })), baseline.featured && (_jsx("span", { className: "rounded bg-accent px-1.5 py-0.5 text-[10px] font-medium text-primary", children: "Featured" }))] }), _jsxs("p", { className: "mt-0.5 text-[11px] text-muted-foreground", children: [baseline.modelId, " \u00B7 ", baseline.provider, " \u00B7 ", baseline.harness, baseline.shortDescription ? ` — ${baseline.shortDescription}` : ""] })] }), _jsxs("div", { className: "flex shrink-0 gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: onBack, children: "Back" }), _jsx(Button, { size: "sm", onClick: onEdit, children: "Edit" }), _jsx(Button, { size: "sm", variant: "outline", onClick: onRetire, children: "Retire" })] })] }), _jsxs("section", { "aria-label": "Rates", children: [_jsx("h5", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: "Rates ($ per million tokens)" }), _jsxs("div", { className: "rounded-md border border-border-muted", role: "table", "aria-label": "Baseline vs effective rates", children: [_jsxs("div", { role: "row", className: "grid grid-cols-[1.5fr_1fr_1fr] gap-2 border-b border-border-muted px-2.5 py-1.5 text-[11px] font-medium text-muted-foreground", children: [_jsx("span", { role: "columnheader", children: "Rate" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Baseline" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Effective" })] }), baseRates.map((rate) => {
|
|
49
|
+
const overridden = rate.effective !== null && rate.effective !== rate.baseline;
|
|
50
|
+
return (_jsxs("div", { role: "row", className: "grid grid-cols-[1.5fr_1fr_1fr] gap-2 border-b border-border-muted px-2.5 py-1.5 text-xs last:border-b-0", children: [_jsx("span", { role: "cell", className: "text-muted-foreground", children: rate.label }), _jsx("span", { role: "cell", className: cn("text-right text-foreground", overridden && "line-through text-muted-foreground"), children: formatRate(rate.baseline) }), _jsx("span", { role: "cell", className: cn("text-right text-foreground", overridden && "font-medium"), children: rate.effective !== null ? formatRate(rate.effective) : "—" })] }, rate.label));
|
|
51
|
+
})] })] }), hasOverrides && governance && (_jsxs("section", { "aria-label": "Active pricing overrides", children: [_jsx("h5", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: "Active Overrides" }), _jsx("div", { className: "space-y-1", children: governance.activeOverrides.map((override) => (_jsxs("p", { className: "text-[11px] text-muted-foreground", children: [_jsxs("span", { className: "font-medium text-foreground", children: [RATE_FIELD_LABELS[override.rateField] ?? "Rate", override.variant ? ` (${override.variant})` : ""] }), " → ", formatRate(override.rateMicrosPerMillion), override.provenance && (_jsxs(_Fragment, { children: [" · ledger observed ", formatRate(override.provenance.observedRateMicrosPerMillion), " (", formatDeltaBp(override.provenance.deltaBasisPoints), ") over ", override.provenance.windowFrom, "..", override.provenance.windowTo] }))] }, override.overrideId))) })] })), Object.keys(baseline.pricingVariants).length > 0 && (_jsxs("section", { "aria-label": "Pricing variants", children: [_jsx("h5", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: "Variants" }), _jsx("div", { className: "space-y-2", children: Object.entries(baseline.pricingVariants).map(([key, variant]) => {
|
|
52
|
+
const variantEntry = row.variantGovernance.find((entry) => entry.variant === key) ?? null;
|
|
53
|
+
return (_jsxs("div", { className: "rounded-md border border-border-muted px-2.5 py-2", children: [_jsxs("p", { className: "text-xs font-medium text-foreground", children: [key, variantEntry && (_jsx("span", { className: "ml-2 align-middle", children: _jsx(GovernanceBadge, { ledgerReconcilable: variantEntry.ledgerReconcilable, hasOverrides: variantEntry.activeOverrides.length > 0 }) }))] }), _jsx("p", { className: "mt-0.5 text-[11px] text-muted-foreground", children: blockRates(variant.pricing)
|
|
54
|
+
.filter(([, micros]) => micros > ZERO)
|
|
55
|
+
.map(([label, micros]) => `${label} ${formatRate(micros)}`)
|
|
56
|
+
.join(" · ") || "No rates set" }), variant.wireIds.length > 0 && (_jsxs("p", { className: "mt-0.5 text-[11px] text-muted-foreground", children: ["Wire ids: ", variant.wireIds.join(", ")] }))] }, key));
|
|
57
|
+
}) })] })), _jsxs("section", { "aria-label": "Catalog metadata", children: [_jsx("h5", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: "Catalog" }), _jsxs("dl", { className: "grid grid-cols-2 gap-x-4 gap-y-1 text-xs sm:grid-cols-3", children: [_jsx(MetaItem, { label: "Provider API id", value: baseline.apiModelId || "—" }), _jsx(MetaItem, { label: "Speed tier", value: baseline.speedTier || "—" }), _jsx(MetaItem, { label: "Cost tier", value: baseline.costTier || "—" }), _jsx(MetaItem, { label: "Context window", value: baseline.contextWindowTokens > 0 ? baseline.contextWindowTokens.toLocaleString() : "—" }), _jsx(MetaItem, { label: "Max output tokens", value: baseline.maxOutputTokens > 0 ? baseline.maxOutputTokens.toLocaleString() : "—" }), _jsx(MetaItem, { label: "Token counter", value: baseline.tokenCounterMethod || "—" })] })] }), _jsxs("section", { "aria-label": "Revision history", children: [_jsx("h5", { className: "mb-1.5 text-[11px] font-medium uppercase tracking-wider text-muted-foreground", children: "Revision History" }), row.history.length === 0 ? (_jsx("p", { className: "text-[11px] text-muted-foreground", children: "No previous revisions \u2014 this is the original entry." })) : (_jsx("div", { className: "space-y-1", children: row.history.map((revision) => (_jsxs("p", { className: "text-[11px] text-muted-foreground", children: [revision.status === ModelPricingBaselineStatus.pricing_baseline_retired
|
|
58
|
+
? "Retired"
|
|
59
|
+
: "Superseded", " · ", formatRate(revision.pricing?.inputPriceMicrosPerMillion ?? ZERO), " in /", " ", formatRate(revision.pricing?.outputPriceMicrosPerMillion ?? ZERO), " out", " · ", revision.decidedBy, revision.revisionNote ? ` — ${revision.revisionNote}` : ""] }, revision.baselineId))) }))] })] }));
|
|
60
|
+
}
|
|
61
|
+
function MetaItem({ label, value }) {
|
|
62
|
+
return (_jsxs("div", { children: [_jsx("dt", { className: "text-[11px] text-muted-foreground", children: label }), _jsx("dd", { className: "text-foreground", children: value })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ModelGovernanceDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGovernanceDetail.js","sourceRoot":"","sources":["../../src/billing/ModelGovernanceDetail.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The access-denied state for platform-operator pricing surfaces
|
|
3
|
+
* (governance + catalog panels). Server-side authorization
|
|
4
|
+
* (`can_manage_model_pricing` on `platform:stigmer`) is the real gate —
|
|
5
|
+
* this is the honest, designed face of that denial for anyone who
|
|
6
|
+
* navigates to an operator route without the permission, instead of a
|
|
7
|
+
* raw RPC error string.
|
|
8
|
+
*/
|
|
9
|
+
export declare function OperatorAccessNotice({ className }: {
|
|
10
|
+
readonly className?: string;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=OperatorAccessNotice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperatorAccessNotice.d.ts","sourceRoot":"","sources":["../../src/billing/OperatorAccessNotice.tsx"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAmBlF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
/**
|
|
5
|
+
* The access-denied state for platform-operator pricing surfaces
|
|
6
|
+
* (governance + catalog panels). Server-side authorization
|
|
7
|
+
* (`can_manage_model_pricing` on `platform:stigmer`) is the real gate —
|
|
8
|
+
* this is the honest, designed face of that denial for anyone who
|
|
9
|
+
* navigates to an operator route without the permission, instead of a
|
|
10
|
+
* raw RPC error string.
|
|
11
|
+
*/
|
|
12
|
+
export function OperatorAccessNotice({ className }) {
|
|
13
|
+
return (_jsxs("div", { className: cn("rounded-lg border border-border bg-card px-4 py-6 text-center", className), role: "status", children: [_jsx("p", { className: "text-xs font-semibold text-foreground", children: "Platform operator access required" }), _jsx("p", { className: "mx-auto mt-1 max-w-md text-xs text-muted-foreground", children: "Model pricing governance is a Stigmer-internal surface. It needs the platform operator role \u2014 organization roles do not grant it. If you believe you should have access, contact a platform operator." })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=OperatorAccessNotice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperatorAccessNotice.js","sourceRoot":"","sources":["../../src/billing/OperatorAccessNotice.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,SAAS,EAAmC;IACjF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,SAAS,CACV,EACD,IAAI,EAAC,QAAQ,aAEb,YAAG,SAAS,EAAC,uCAAuC,kDAEhD,EACJ,YAAG,SAAS,EAAC,qDAAqD,2NAI9D,IACA,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tab ids of {@link PricingGovernanceConsole}, accepted by
|
|
3
|
+
* {@link PricingGovernanceConsoleProps.defaultTab}.
|
|
4
|
+
*
|
|
5
|
+
* These ids are deep-link targets: consumers wire them from their own
|
|
6
|
+
* routing (e.g. a `?tab=sign-offs` query param), and external surfaces
|
|
7
|
+
* compose URLs against them. Renaming a member is a breaking change to
|
|
8
|
+
* every link in the wild, not just to this component's props.
|
|
9
|
+
*/
|
|
10
|
+
export type PricingGovernanceTab = "models" | "sign-offs";
|
|
11
|
+
/** Props for {@link PricingGovernanceConsole}. */
|
|
12
|
+
export interface PricingGovernanceConsoleProps {
|
|
13
|
+
/** Additional CSS class names. */
|
|
14
|
+
readonly className?: string;
|
|
15
|
+
/**
|
|
16
|
+
* The tab shown on first render. Defaults to `"models"`.
|
|
17
|
+
*
|
|
18
|
+
* Read once at mount, like a form field's `defaultValue` — changing
|
|
19
|
+
* it afterwards has no effect, and the user's tab choice stays local
|
|
20
|
+
* (the console never writes it back anywhere). Wire it from routing
|
|
21
|
+
* to make the tab URL-addressable:
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* // e.g. honoring a ?tab=sign-offs deep link
|
|
25
|
+
* const tab = new URLSearchParams(window.location.search).get("tab");
|
|
26
|
+
* <PricingGovernanceConsole
|
|
27
|
+
* defaultTab={tab === "sign-offs" ? "sign-offs" : undefined}
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
readonly defaultTab?: PricingGovernanceTab;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The platform-operator pricing console: a tabbed surface over the
|
|
35
|
+
* model registry baseline and the pricing feedback loop.
|
|
36
|
+
*
|
|
37
|
+
* - **Models** — every catalog entry joined with its governance state
|
|
38
|
+
* (effective vs baseline rates, ledger verification), searchable.
|
|
39
|
+
* Selecting a row opens a read-only detail record; editing (with an
|
|
40
|
+
* explicit old→new rate confirmation) and typed-confirmation
|
|
41
|
+
* retirement are deliberate steps from there.
|
|
42
|
+
* - **Sign-Offs** — pricing overrides proposed by reconciliation and
|
|
43
|
+
* awaiting a human decision, searchable; the tab badge shows the
|
|
44
|
+
* pending count from anywhere in the console.
|
|
45
|
+
*
|
|
46
|
+
* Requires `can_manage_model_pricing` on `platform:stigmer` — render it
|
|
47
|
+
* only in operator-scoped surfaces (non-operators see the designed
|
|
48
|
+
* access notice). Rates shown are raw provider prices (pre-markup),
|
|
49
|
+
* not customer prices.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```tsx
|
|
53
|
+
* <PricingGovernanceConsole />
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function PricingGovernanceConsole({ className, defaultTab, }: PricingGovernanceConsoleProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
//# sourceMappingURL=PricingGovernanceConsole.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PricingGovernanceConsole.d.ts","sourceRoot":"","sources":["../../src/billing/PricingGovernanceConsole.tsx"],"names":[],"mappings":"AAuBA;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1D,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;CAC5C;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,UAAU,GACX,EAAE,6BAA6B,2CA+H/B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { getUserMessage, isPermissionDenied } from "@stigmer/sdk";
|
|
6
|
+
import { Button } from "../button/index.js";
|
|
7
|
+
import { Tabs } from "../tabs/Tabs.js";
|
|
8
|
+
import { BaselineEditor } from "./BaselineEditor.js";
|
|
9
|
+
import { RetireConfirm } from "./RetireConfirm.js";
|
|
10
|
+
import { ModelGovernanceDetail } from "./ModelGovernanceDetail.js";
|
|
11
|
+
import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
|
|
12
|
+
import { GovernanceBadge, PendingOverrideCard, RateCell } from "./governance-primitives.js";
|
|
13
|
+
import { INPUT_CLASSES } from "./form-primitives.js";
|
|
14
|
+
import { ZERO } from "./pricing-format.js";
|
|
15
|
+
import { useDecidePricingOverride } from "./useDecidePricingOverride.js";
|
|
16
|
+
import { useRetireModelPricingBaseline } from "./useRetireModelPricingBaseline.js";
|
|
17
|
+
import { useUpsertModelPricingBaseline } from "./useUpsertModelPricingBaseline.js";
|
|
18
|
+
import { useModelGovernanceView, } from "./useModelGovernanceView.js";
|
|
19
|
+
const TABS = [
|
|
20
|
+
{ id: "models", label: "Models" },
|
|
21
|
+
{ id: "sign-offs", label: "Sign-Offs" },
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* The platform-operator pricing console: a tabbed surface over the
|
|
25
|
+
* model registry baseline and the pricing feedback loop.
|
|
26
|
+
*
|
|
27
|
+
* - **Models** — every catalog entry joined with its governance state
|
|
28
|
+
* (effective vs baseline rates, ledger verification), searchable.
|
|
29
|
+
* Selecting a row opens a read-only detail record; editing (with an
|
|
30
|
+
* explicit old→new rate confirmation) and typed-confirmation
|
|
31
|
+
* retirement are deliberate steps from there.
|
|
32
|
+
* - **Sign-Offs** — pricing overrides proposed by reconciliation and
|
|
33
|
+
* awaiting a human decision, searchable; the tab badge shows the
|
|
34
|
+
* pending count from anywhere in the console.
|
|
35
|
+
*
|
|
36
|
+
* Requires `can_manage_model_pricing` on `platform:stigmer` — render it
|
|
37
|
+
* only in operator-scoped surfaces (non-operators see the designed
|
|
38
|
+
* access notice). Rates shown are raw provider prices (pre-markup),
|
|
39
|
+
* not customer prices.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <PricingGovernanceConsole />
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function PricingGovernanceConsole({ className, defaultTab, }) {
|
|
47
|
+
const view = useModelGovernanceView();
|
|
48
|
+
// Seeded once from `defaultTab`, then owned locally (see the prop's
|
|
49
|
+
// JSDoc). The membership check is a public-API boundary guard: a JS
|
|
50
|
+
// consumer passing an out-of-union string must land on Models, not on
|
|
51
|
+
// a tabless surface.
|
|
52
|
+
const [activeTab, setActiveTab] = useState(() => defaultTab !== undefined && TABS.some((t) => t.id === defaultTab)
|
|
53
|
+
? defaultTab
|
|
54
|
+
: "models");
|
|
55
|
+
const { decide, isSubmitting: isDeciding, error: decisionError } = useDecidePricingOverride();
|
|
56
|
+
const { upsert, isSubmitting: isUpserting, error: upsertError, clearError: clearUpsertError } = useUpsertModelPricingBaseline();
|
|
57
|
+
const { retire, isSubmitting: isRetiring, error: retireError, clearError: clearRetireError } = useRetireModelPricingBaseline();
|
|
58
|
+
const handleDecide = useCallback(async (overrideId, approve) => {
|
|
59
|
+
try {
|
|
60
|
+
await decide({ overrideId, approve });
|
|
61
|
+
// A decision changes both the pending queue and (on approval)
|
|
62
|
+
// the effective rates — reload the whole view.
|
|
63
|
+
view.refetch();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Surfaced via decisionError below.
|
|
67
|
+
}
|
|
68
|
+
}, [decide, view.refetch]);
|
|
69
|
+
const handleUpsert = useCallback(async (baseline, revisionNote) => {
|
|
70
|
+
await upsert({ baseline, revisionNote: revisionNote || undefined });
|
|
71
|
+
view.refetch();
|
|
72
|
+
// An edit lands back on the (refreshed) detail; a create lands on
|
|
73
|
+
// the list — the new row's key is derivable but focusing it before
|
|
74
|
+
// the refetch resolves would show stale data.
|
|
75
|
+
if (view.flow.phase === "detail")
|
|
76
|
+
view.backToDetail();
|
|
77
|
+
else
|
|
78
|
+
view.backToList();
|
|
79
|
+
}, [upsert, view.refetch, view.flow.phase, view.backToDetail, view.backToList]);
|
|
80
|
+
const handleCancelEdit = useCallback(() => {
|
|
81
|
+
clearUpsertError();
|
|
82
|
+
if (view.flow.phase === "detail")
|
|
83
|
+
view.backToDetail();
|
|
84
|
+
else
|
|
85
|
+
view.backToList();
|
|
86
|
+
}, [clearUpsertError, view.flow.phase, view.backToDetail, view.backToList]);
|
|
87
|
+
const handleRetire = useCallback(async (target, revisionNote) => {
|
|
88
|
+
await retire({
|
|
89
|
+
modelId: target.modelId,
|
|
90
|
+
provider: target.provider,
|
|
91
|
+
harness: target.harness,
|
|
92
|
+
revisionNote: revisionNote || undefined,
|
|
93
|
+
});
|
|
94
|
+
view.refetch();
|
|
95
|
+
view.backToList();
|
|
96
|
+
}, [retire, view.refetch, view.backToList]);
|
|
97
|
+
const handleCancelRetire = useCallback(() => {
|
|
98
|
+
clearRetireError();
|
|
99
|
+
view.backToDetail();
|
|
100
|
+
}, [clearRetireError, view.backToDetail]);
|
|
101
|
+
if (view.isLoading) {
|
|
102
|
+
return (_jsxs("div", { className: cn("space-y-2", className), "aria-busy": "true", children: [_jsx("div", { className: "h-4 w-40 animate-pulse rounded bg-muted-subtle" }), Array.from({ length: 4 }, (_, i) => (_jsx("div", { className: "h-10 animate-pulse rounded-lg bg-muted-subtle" }, i)))] }));
|
|
103
|
+
}
|
|
104
|
+
if (view.error) {
|
|
105
|
+
// A non-operator landing here is expected (the route is reachable by
|
|
106
|
+
// URL) — show the designed access notice, not a raw RPC error.
|
|
107
|
+
if (isPermissionDenied(view.error)) {
|
|
108
|
+
return _jsx(OperatorAccessNotice, { className: className });
|
|
109
|
+
}
|
|
110
|
+
return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(view.error) }));
|
|
111
|
+
}
|
|
112
|
+
return (_jsx(Tabs, { className: className, tabs: [
|
|
113
|
+
TABS[0],
|
|
114
|
+
{ ...TABS[1], badge: view.pendingCount },
|
|
115
|
+
], activeTab: activeTab, onTabChange: (id) => setActiveTab(id), "aria-label": "Pricing governance sections", children: activeTab === "models" ? (_jsx(ModelsTab, { view: view, isUpserting: isUpserting, upsertError: upsertError, onUpsert: handleUpsert, onCancelEdit: handleCancelEdit, isRetiring: isRetiring, retireError: retireError, onRetire: handleRetire, onCancelRetire: handleCancelRetire })) : (_jsx(SignOffsTab, { view: view, isDeciding: isDeciding, decisionError: decisionError, onDecide: handleDecide })) }));
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// ModelsTab (internal)
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
function ModelsTab({ view, isUpserting, upsertError, onUpsert, onCancelEdit, isRetiring, retireError, onRetire, onCancelRetire, }) {
|
|
121
|
+
const { flow, selected } = view;
|
|
122
|
+
if (flow.phase === "create") {
|
|
123
|
+
return (_jsx(BaselineEditor, { initial: null, isSubmitting: isUpserting, submitError: upsertError, onSubmit: onUpsert, onCancel: onCancelEdit }));
|
|
124
|
+
}
|
|
125
|
+
// A stale detail key (e.g. the model was just retired) falls through
|
|
126
|
+
// to the list rather than rendering an empty record.
|
|
127
|
+
if (flow.phase === "detail" && selected) {
|
|
128
|
+
if (flow.mode === "edit") {
|
|
129
|
+
return (_jsx(BaselineEditor, { initial: selected.baseline, isSubmitting: isUpserting, submitError: upsertError, onSubmit: onUpsert, onCancel: onCancelEdit }));
|
|
130
|
+
}
|
|
131
|
+
if (flow.mode === "retire") {
|
|
132
|
+
return (_jsx(RetireConfirm, { target: selected.baseline, isSubmitting: isRetiring, submitError: retireError, onConfirm: onRetire, onCancel: onCancelRetire }));
|
|
133
|
+
}
|
|
134
|
+
return (_jsx(ModelGovernanceDetail, { row: selected, onEdit: view.openEdit, onRetire: view.openRetire, onBack: view.backToList }));
|
|
135
|
+
}
|
|
136
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("input", { type: "search", className: cn(INPUT_CLASSES, "max-w-xs"), value: view.modelQuery, onChange: (e) => view.setModelQuery(e.target.value), placeholder: "Search models\u2026", "aria-label": "Search models" }), _jsx(Button, { size: "sm", onClick: view.openCreate, children: "Add model" })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card", children: [_jsxs("div", { "aria-hidden": "true", className: "grid grid-cols-[2fr_1fr_1fr_1fr_0.7fr_1fr] gap-2 border-b border-border px-3 py-2 text-[11px] font-medium text-muted-foreground", children: [_jsx("span", { children: "Model" }), _jsx("span", { children: "Harness" }), _jsx("span", { className: "text-right", children: "Input" }), _jsx("span", { className: "text-right", children: "Output" }), _jsx("span", { className: "text-right", children: "Variants" }), _jsx("span", { className: "text-right", children: "Governance" })] }), view.models.length === 0 ? (_jsx("p", { className: "px-3 py-2 text-xs text-muted-foreground", children: view.modelQuery.trim() !== ""
|
|
137
|
+
? `No models match "${view.modelQuery.trim()}".`
|
|
138
|
+
: "The catalog is empty — has the baseline seed migration run?" })) : (_jsx("ul", { role: "list", "aria-label": "Models", className: "m-0 list-none p-0", children: view.models.map((row) => (_jsx(ModelRow, { row: row, onOpen: () => view.openDetail(row.key) }, row.key))) }))] })] }));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* One model row: a real button (keyboard + AT support for "open the
|
|
142
|
+
* record" for free) laid out on the shared column grid. Its full text
|
|
143
|
+
* content is its accessible name, so AT users hear the same facts the
|
|
144
|
+
* columns show.
|
|
145
|
+
*/
|
|
146
|
+
function ModelRow({ row, onOpen, }) {
|
|
147
|
+
const { baseline, governance } = row;
|
|
148
|
+
const variantCount = Object.keys(baseline.pricingVariants).length;
|
|
149
|
+
const hasOverrides = (governance?.activeOverrides.length ?? 0) > 0;
|
|
150
|
+
return (_jsx("li", { className: "border-b border-border last:border-b-0", children: _jsxs("button", { type: "button", onClick: onOpen, className: cn("grid w-full grid-cols-[2fr_1fr_1fr_1fr_0.7fr_1fr] items-center gap-2 px-3 py-2 text-left text-xs", "transition-colors hover:bg-accent", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block truncate font-medium text-foreground", title: baseline.modelId, children: baseline.displayName || baseline.modelId }), _jsxs("span", { className: "block truncate text-[11px] text-muted-foreground", children: [baseline.modelId, baseline.featured ? " · featured" : ""] })] }), _jsx("span", { className: "text-muted-foreground", children: baseline.harness }), _jsx(RateCell, { baseline: baseline.pricing?.inputPriceMicrosPerMillion ?? ZERO, effective: governance?.effectiveInputMicrosPerMillion ??
|
|
151
|
+
baseline.pricing?.inputPriceMicrosPerMillion ??
|
|
152
|
+
ZERO }), _jsx(RateCell, { baseline: baseline.pricing?.outputPriceMicrosPerMillion ?? ZERO, effective: governance?.effectiveOutputMicrosPerMillion ??
|
|
153
|
+
baseline.pricing?.outputPriceMicrosPerMillion ??
|
|
154
|
+
ZERO }), _jsx("span", { className: "text-right text-muted-foreground", children: variantCount > 0 ? variantCount : "—" }), _jsx("span", { className: "text-right", children: governance ? (_jsx(GovernanceBadge, { ledgerReconcilable: governance.ledgerReconcilable, hasOverrides: hasOverrides })) : (_jsx("span", { className: "text-[10px] text-muted-foreground", children: "\u2014" })) })] }) }));
|
|
155
|
+
}
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
// SignOffsTab (internal)
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
function SignOffsTab({ view, isDeciding, decisionError, onDecide, }) {
|
|
160
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsx("input", { type: "search", className: cn(INPUT_CLASSES, "max-w-xs"), value: view.signOffQuery, onChange: (e) => view.setSignOffQuery(e.target.value), placeholder: "Search sign-offs\u2026", "aria-label": "Search sign-offs" }), decisionError && (_jsx("p", { className: "text-destructive text-xs", role: "alert", children: getUserMessage(decisionError) })), view.pendingOverrides.length === 0 ? (_jsx("p", { className: "text-xs text-muted-foreground", children: view.signOffQuery.trim() !== ""
|
|
161
|
+
? `No pending sign-offs match "${view.signOffQuery.trim()}".`
|
|
162
|
+
: "No pricing overrides awaiting a decision." })) : (_jsx("div", { className: "space-y-2", children: view.pendingOverrides.map((override) => (_jsx(PendingOverrideCard, { override: override, isSubmitting: isDeciding, onDecide: onDecide }, override.overrideId))) }))] }));
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=PricingGovernanceConsole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PricingGovernanceConsole.js","sourceRoot":"","sources":["../../src/billing/PricingGovernanceConsole.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Props for {@link PricingGovernancePanel}. */
|
|
2
|
+
export interface PricingGovernancePanelProps {
|
|
3
|
+
/** Additional CSS class names. */
|
|
4
|
+
readonly className?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Platform-operator panel for the pricing feedback loop: pending
|
|
8
|
+
* override sign-offs (approve/reject) and the effective-vs-baseline
|
|
9
|
+
* pricing state of every model.
|
|
10
|
+
*
|
|
11
|
+
* Prefer {@link PricingGovernanceConsole} for new surfaces — it
|
|
12
|
+
* composes this panel's content with the model catalog into one tabbed
|
|
13
|
+
* console. This standalone panel remains for consumers embedding just
|
|
14
|
+
* the governance view.
|
|
15
|
+
*
|
|
16
|
+
* Requires `can_manage_model_pricing` on `platform:stigmer` — render it
|
|
17
|
+
* only in operator-scoped surfaces. Rates shown are raw provider prices
|
|
18
|
+
* (pre-markup), not customer prices.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <PricingGovernancePanel />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function PricingGovernancePanel({ className }: PricingGovernancePanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
|
+
//# sourceMappingURL=PricingGovernancePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PricingGovernancePanel.d.ts","sourceRoot":"","sources":["../../src/billing/PricingGovernancePanel.tsx"],"names":[],"mappings":"AAYA,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE,2BAA2B,kDA8FhF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
import { getUserMessage, isPermissionDenied } from "@stigmer/sdk";
|
|
5
|
+
import { OperatorAccessNotice } from "./OperatorAccessNotice.js";
|
|
6
|
+
import { GovernanceBadge, PendingOverrideCard, RateCell } from "./governance-primitives.js";
|
|
7
|
+
import { usePricingGovernance } from "./usePricingGovernance.js";
|
|
8
|
+
import { useDecidePricingOverride } from "./useDecidePricingOverride.js";
|
|
9
|
+
/**
|
|
10
|
+
* Platform-operator panel for the pricing feedback loop: pending
|
|
11
|
+
* override sign-offs (approve/reject) and the effective-vs-baseline
|
|
12
|
+
* pricing state of every model.
|
|
13
|
+
*
|
|
14
|
+
* Prefer {@link PricingGovernanceConsole} for new surfaces — it
|
|
15
|
+
* composes this panel's content with the model catalog into one tabbed
|
|
16
|
+
* console. This standalone panel remains for consumers embedding just
|
|
17
|
+
* the governance view.
|
|
18
|
+
*
|
|
19
|
+
* Requires `can_manage_model_pricing` on `platform:stigmer` — render it
|
|
20
|
+
* only in operator-scoped surfaces. Rates shown are raw provider prices
|
|
21
|
+
* (pre-markup), not customer prices.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <PricingGovernancePanel />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function PricingGovernancePanel({ className }) {
|
|
29
|
+
const { governance, isLoading, error, refetch } = usePricingGovernance();
|
|
30
|
+
const { decide, isSubmitting, error: decisionError } = useDecidePricingOverride();
|
|
31
|
+
if (isLoading) {
|
|
32
|
+
return (_jsxs("div", { className: cn("space-y-2", className), "aria-busy": "true", children: [_jsx("div", { className: "h-4 w-40 animate-pulse rounded bg-muted-subtle" }), Array.from({ length: 4 }, (_, i) => (_jsx("div", { className: "h-10 animate-pulse rounded-lg bg-muted-subtle" }, i)))] }));
|
|
33
|
+
}
|
|
34
|
+
if (error) {
|
|
35
|
+
// A non-operator landing here is expected (the route is reachable by
|
|
36
|
+
// URL) — show the designed access notice, not a raw RPC error.
|
|
37
|
+
if (isPermissionDenied(error)) {
|
|
38
|
+
return _jsx(OperatorAccessNotice, { className: className });
|
|
39
|
+
}
|
|
40
|
+
return (_jsx("p", { className: cn("text-destructive text-xs", className), role: "alert", children: getUserMessage(error) }));
|
|
41
|
+
}
|
|
42
|
+
if (!governance)
|
|
43
|
+
return null;
|
|
44
|
+
const onDecide = async (overrideId, approve) => {
|
|
45
|
+
try {
|
|
46
|
+
await decide({ overrideId, approve });
|
|
47
|
+
// A decision changes both the pending queue and (on approval) the
|
|
48
|
+
// effective rates — reload the whole view.
|
|
49
|
+
refetch();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Surfaced via decisionError below.
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return (_jsxs("div", { className: cn("space-y-6", className), children: [_jsxs("section", { "aria-label": "Pending pricing override proposals", children: [_jsx("h3", { className: "mb-2 text-xs font-semibold text-foreground", children: "Pending Sign-Offs" }), decisionError && (_jsx("p", { className: "mb-2 text-destructive text-xs", role: "alert", children: getUserMessage(decisionError) })), governance.pendingOverrides.length === 0 ? (_jsx("p", { className: "text-xs text-muted-foreground", children: "No pricing overrides awaiting a decision." })) : (_jsx("div", { className: "space-y-2", children: governance.pendingOverrides.map((override) => (_jsx(PendingOverrideCard, { override: override, isSubmitting: isSubmitting, onDecide: onDecide }, override.overrideId))) }))] }), _jsxs("section", { "aria-label": "Model pricing state", children: [_jsx("h3", { className: "mb-2 text-xs font-semibold text-foreground", children: "Model Pricing" }), _jsxs("div", { className: "rounded-lg border border-border bg-card", role: "table", "aria-label": "Model pricing governance", children: [_jsxs("div", { role: "row", className: "grid grid-cols-[2fr_1fr_1fr_1fr_1fr] gap-2 border-b border-border px-3 py-2 text-[11px] font-medium text-muted-foreground", children: [_jsx("span", { role: "columnheader", children: "Model" }), _jsx("span", { role: "columnheader", children: "Harness" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Input" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Output" }), _jsx("span", { role: "columnheader", className: "text-right", children: "Governance" })] }), governance.entries.map((entry) => (_jsx(GovernanceRow, { entry: entry }, `${entry.modelId}-${entry.harness}-${entry.variant}`)))] })] })] }));
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// GovernanceRow (internal)
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function GovernanceRow({ entry }) {
|
|
61
|
+
const hasOverrides = entry.activeOverrides.length > 0;
|
|
62
|
+
return (_jsxs("div", { role: "row", className: "grid grid-cols-[2fr_1fr_1fr_1fr_1fr] items-center gap-2 border-b border-border px-3 py-2 text-xs last:border-b-0", children: [_jsx("span", { role: "cell", className: "truncate font-medium text-foreground", title: entry.modelId, children: entry.displayName || entry.modelId }), _jsx("span", { role: "cell", className: "text-muted-foreground", children: entry.harness }), _jsx(RateCell, { role: "cell", baseline: entry.baselineInputMicrosPerMillion, effective: entry.effectiveInputMicrosPerMillion }), _jsx(RateCell, { role: "cell", baseline: entry.baselineOutputMicrosPerMillion, effective: entry.effectiveOutputMicrosPerMillion }), _jsx("span", { role: "cell", className: "text-right", children: _jsx(GovernanceBadge, { ledgerReconcilable: entry.ledgerReconcilable, hasOverrides: hasOverrides }) })] }));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=PricingGovernancePanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PricingGovernancePanel.js","sourceRoot":"","sources":["../../src/billing/PricingGovernancePanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModelPricingBaseline } from "@stigmer/protos/ai/stigmer/billing/v1/model_pricing_baseline_pb";
|
|
2
|
+
export declare function RetireConfirm({ target, isSubmitting, submitError, onConfirm, onCancel, }: {
|
|
3
|
+
readonly target: ModelPricingBaseline;
|
|
4
|
+
readonly isSubmitting: boolean;
|
|
5
|
+
readonly submitError: Error | null;
|
|
6
|
+
readonly onConfirm: (target: ModelPricingBaseline, revisionNote: string) => Promise<void>;
|
|
7
|
+
readonly onCancel: () => void;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=RetireConfirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetireConfirm.d.ts","sourceRoot":"","sources":["../../src/billing/RetireConfirm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iEAAiE,CAAC;AAW5G,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;CAC/B,2CAsDA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
5
|
+
import { Button } from "../button/index.js";
|
|
6
|
+
import { INPUT_CLASSES } from "./form-primitives.js";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// RetireConfirm — typed confirmation for retiring a catalog entry (a
|
|
9
|
+
// destructive, billing-visible action). Internal to the billing module:
|
|
10
|
+
// rendered by PricingGovernanceConsole and ModelCatalogPanel, never
|
|
11
|
+
// exported from the barrel.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export function RetireConfirm({ target, isSubmitting, submitError, onConfirm, onCancel, }) {
|
|
14
|
+
const [typed, setTyped] = useState("");
|
|
15
|
+
const [note, setNote] = useState("");
|
|
16
|
+
const confirmed = typed === target.modelId;
|
|
17
|
+
return (_jsxs("div", { className: "space-y-2 rounded-lg border border-destructive bg-card px-3 py-3", children: [_jsxs("h4", { className: "text-xs font-semibold text-foreground", children: ["Retire ", target.displayName || target.modelId, "?"] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["The model disappears from every price surface (billing lookups, model pickers, the served registry) and any active pricing overrides on it are archived. The revision history is kept, and the key can be revived by a later upsert. Type ", _jsx("span", { className: "font-medium text-foreground", children: target.modelId }), " ", "to confirm."] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx("input", { className: INPUT_CLASSES, value: typed, onChange: (e) => setTyped(e.target.value), placeholder: target.modelId, disabled: isSubmitting, "aria-label": "Type the model id to confirm retirement" }), _jsx("input", { className: INPUT_CLASSES, value: note, onChange: (e) => setNote(e.target.value), placeholder: "Reason (audit trail)", disabled: isSubmitting })] }), submitError && (_jsx("p", { className: "text-destructive text-xs", role: "alert", children: getUserMessage(submitError) })), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { size: "sm", variant: "destructive", disabled: !confirmed || isSubmitting, onClick: () => onConfirm(target, note.trim()).catch(() => undefined), children: isSubmitting ? "Retiring…" : "Retire model" }), _jsx(Button, { size: "sm", variant: "outline", disabled: isSubmitting, onClick: onCancel, children: "Cancel" })] })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=RetireConfirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetireConfirm.js","sourceRoot":"","sources":["../../src/billing/RetireConfirm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,8EAA8E;AAC9E,qEAAqE;AACrE,wEAAwE;AACxE,oEAAoE;AACpE,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,GAOT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC;IAE3C,OAAO,CACL,eAAK,SAAS,EAAC,kEAAkE,aAC/E,cAAI,SAAS,EAAC,uCAAuC,wBAC3C,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,SACzC,EACL,aAAG,SAAS,EAAC,+BAA+B,2PAIvB,eAAM,SAAS,EAAC,6BAA6B,YAAE,MAAM,CAAC,OAAO,GAAQ,EAAC,GAAG,mBAE1F,EACJ,eAAK,SAAS,EAAC,wBAAwB,aACrC,gBACE,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,MAAM,CAAC,OAAO,EAC3B,QAAQ,EAAE,YAAY,gBACX,yCAAyC,GACpD,EACF,gBACE,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,WAAW,EAAC,sBAAsB,EAClC,QAAQ,EAAE,YAAY,GACtB,IACE,EACL,WAAW,IAAI,CACd,YAAG,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,OAAO,YACjD,cAAc,CAAC,WAAW,CAAC,GAC1B,CACL,EACD,eAAK,SAAS,EAAC,YAAY,aACzB,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,aAAa,EACrB,QAAQ,EAAE,CAAC,SAAS,IAAI,YAAY,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,YAEnE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,GACrC,EACT,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,uBAEpE,IACL,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Standard text-input styling for the pricing surfaces. */
|
|
2
|
+
export declare const INPUT_CLASSES: string;
|
|
3
|
+
/** Labelled form field wrapper. */
|
|
4
|
+
export declare function Field({ label, required, className, children, }: {
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly required?: boolean;
|
|
7
|
+
readonly className?: string;
|
|
8
|
+
readonly children: React.ReactNode;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
/** Dollar-rate input field (decimal keypad, "$ per million tokens"). */
|
|
11
|
+
export declare function RateField({ label, value, placeholder, disabled, onChange, }: {
|
|
12
|
+
readonly label: string;
|
|
13
|
+
readonly value: string;
|
|
14
|
+
readonly placeholder?: string;
|
|
15
|
+
readonly disabled: boolean;
|
|
16
|
+
readonly onChange: (value: string) => void;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=form-primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-primitives.d.ts","sourceRoot":"","sources":["../../src/billing/form-primitives.tsx"],"names":[],"mappings":"AAUA,4DAA4D;AAC5D,eAAO,MAAM,aAAa,QAKzB,CAAC;AAEF,mCAAmC;AACnC,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,2CAUA;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,2CAaA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Shared form primitives for the operator pricing surfaces (BaselineEditor,
|
|
6
|
+
// RetireConfirm, the console's search inputs). Internal — not exported
|
|
7
|
+
// from the billing barrel.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/** Standard text-input styling for the pricing surfaces. */
|
|
10
|
+
export const INPUT_CLASSES = cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50");
|
|
11
|
+
/** Labelled form field wrapper. */
|
|
12
|
+
export function Field({ label, required, className, children, }) {
|
|
13
|
+
return (_jsxs("label", { className: cn("block space-y-1", className), children: [_jsxs("span", { className: "text-[11px] font-medium text-muted-foreground", children: [label, required ? " *" : ""] }), children] }));
|
|
14
|
+
}
|
|
15
|
+
/** Dollar-rate input field (decimal keypad, "$ per million tokens"). */
|
|
16
|
+
export function RateField({ label, value, placeholder, disabled, onChange, }) {
|
|
17
|
+
return (_jsx(Field, { label: label, children: _jsx("input", { className: INPUT_CLASSES, inputMode: "decimal", value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder ?? "0.00", disabled: disabled }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=form-primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-primitives.js","sourceRoot":"","sources":["../../src/billing/form-primitives.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,8EAA8E;AAC9E,4EAA4E;AAC5E,uEAAuE;AACvE,2BAA2B;AAC3B,8EAA8E;AAE9E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAC7B,2FAA2F,EAC3F,mCAAmC,EACnC,yEAAyE,EACzE,kDAAkD,CACnD,CAAC;AAEF,mCAAmC;AACnC,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,QAAQ,GAMT;IACC,OAAO,CACL,iBAAO,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,aAChD,gBAAM,SAAS,EAAC,+CAA+C,aAC5D,KAAK,EACL,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAChB,EACN,QAAQ,IACH,CACT,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,QAAQ,GAOT;IACC,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,YACjB,gBACE,SAAS,EAAE,aAAa,EACxB,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,WAAW,IAAI,MAAM,EAClC,QAAQ,EAAE,QAAQ,GAClB,GACI,CACT,CAAC;AACJ,CAAC"}
|