Compare commits

...
Author SHA1 Message Date
Prospector cdb9ac5663 prepr 2026-08-26 11:05:28 -07:00
Prospector 5eced2a9c2 openapi 2026-08-26 11:04:53 -07:00
Prospector e79d925047 frontend: migrate genai functionality disclosure 2026-08-26 10:58:09 -07:00
sychic 3ed7ed1bf9 chore: increase stack size 2026-08-25 21:45:22 -04:00
sychic 1be5a0a355 feat(labrinth): separate out ai functionality into its own disclosure 2026-08-25 15:42:47 -04:00
34 changed files with 197 additions and 118 deletions
+1 -1
View File
@@ -86,7 +86,7 @@ jobs:
GIT_HASH: ${{ github.sha }}
SCCACHE_CACHE_SIZE: ${{ needs.skip-if-clean.outputs.internal == 'true' && '20G' || '' }}
RUSTC_WRAPPER: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'sccache' || '' }}
RUST_MIN_STACK: '16777216'
RUST_MIN_STACK: '268435456'
steps:
- name: Check out code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+2 -2
View File
@@ -436,7 +436,7 @@ components:
- ai_content_code
- ai_content_assets
- ai_content_text
- ai_content_functionality
- ai_functionality
- advertisements
- epilepsy_triggers
- system_interactions
@@ -2202,7 +2202,7 @@ paths:
- `ai_content_code`
- `ai_content_assets`
- `ai_content_text`
- `ai_content_functionality`
- `ai_functionality`
- `advertisements`
- `epilepsy_triggers`
- `system_interactions`
@@ -25,7 +25,7 @@ const emit = defineEmits<{
const { formatMessage } = useVIntl()
const AI_USES: AiUsage[] = ['code', 'assets', 'text', 'functionality']
const AI_USES: AiUsage[] = ['code', 'assets', 'text']
const messages = defineMessages({
title: {
@@ -35,9 +35,8 @@ const messages = defineMessages({
description: {
id: 'project.settings.disclosures.ai.description',
defaultMessage: `You must enable this if this project contains a substantial amount of AI-generated code, any
assets that are substantially AI-generated, the project's functionality relies on the use of
generative AI, or if any element of your project's page such as description or publishing
relies on generative AI.`,
assets that are substantially AI-generated, or if any element of your project's page such as
description or publishing relies on generative AI.`,
},
contentRules: {
id: 'project.settings.disclosures.ai.content-rules',
@@ -0,0 +1,67 @@
<script setup lang="ts">
import { BrainCircuitIcon } from '@modrinth/assets'
import {
commonMessages,
defineMessages,
SettingsFormGroup,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import DisclosureToggleCard from './DisclosureToggleCard.vue'
import type { DisclosureCardMetaProps, DisclosureLockStatus, NoteDisclosure } from './types'
const model = defineModel<NoteDisclosure>({ required: true })
const props = defineProps<DisclosureCardMetaProps>()
const emit = defineEmits<{
setLockStatus: [status: DisclosureLockStatus]
}>()
const { formatMessage } = useVIntl()
const messages = defineMessages({
title: {
id: 'project.settings.disclosures.ai-functionality.title',
defaultMessage: 'Contains generative AI functionality',
},
description: {
id: 'project.settings.disclosures.ai-functionality.description',
defaultMessage: 'Placeholder',
},
notePlaceholder: {
id: 'project.settings.disclosures.ai-functionality.note-placeholder',
defaultMessage: 'e.g. The in-game assistant uses generative AI to generate dialogue.',
},
})
</script>
<template>
<DisclosureToggleCard
v-bind="props"
v-model="model.enabled"
:icon="BrainCircuitIcon"
:title="formatMessage(messages.title)"
:description="formatMessage(messages.description)"
@set-lock-status="emit('setLockStatus', $event)"
>
<template #expanded>
<SettingsFormGroup
:title="formatMessage(commonMessages.explanationLabel)"
title-for="ai-functionality-disclosure-note"
optional
>
<StyledInput
id="ai-functionality-disclosure-note"
v-model="model.note"
multiline
:rows="3"
class="max-w-[40rem]"
:disabled="disabled"
:placeholder="formatMessage(messages.notePlaceholder)"
/>
</SettingsFormGroup>
</template>
</DisclosureToggleCard>
</template>
@@ -22,7 +22,7 @@ function findDisclosure<T extends DisclosureType>(
return disclosures.find((disclosure): disclosure is DisclosureOf<T> => disclosure.type === type)
}
type NoteDisclosureType = 'advertisements' | 'epilepsy_triggers' | 'archived'
type NoteDisclosureType = 'ai_functionality' | 'advertisements' | 'epilepsy_triggers' | 'archived'
function createNoteModel(
disclosures: ProjectDisclosureData[],
@@ -66,6 +66,7 @@ export function disclosuresToForm(disclosures: ProjectDisclosureData[]): Disclos
uses: ai ? [...(ai.uses ?? [])] : [],
note: ai?.note ?? '',
},
aiFunctionality: createNoteModel(disclosures, 'ai_functionality'),
advertising: createNoteModel(disclosures, 'advertisements'),
paidFeatures: {
enabled: isActiveDisclosure(paidFeatures),
@@ -110,6 +111,8 @@ export function formToDisclosure(
uses: [...form.ai.uses],
note: form.ai.note.trim() || null,
}
case 'ai_functionality':
return { type: 'ai_functionality', note: form.aiFunctionality.note.trim() || null }
case 'advertisements':
return { type: 'advertisements', note: form.advertising.note.trim() || null }
case 'paid_features':
@@ -151,6 +154,9 @@ export function formToDisclosures(form: DisclosureFormState): ProjectDisclosure[
if (form.ai.enabled) {
set.push(formToDisclosure(form, 'ai_content'))
}
if (form.aiFunctionality.enabled) {
set.push(formToDisclosure(form, 'ai_functionality'))
}
if (form.advertising.enabled) {
set.push(formToDisclosure(form, 'advertisements'))
}
@@ -1,5 +1,6 @@
export { default as AdvertisingDisclosureCard } from './AdvertisingDisclosureCard.vue'
export { default as AiDisclosureCard } from './AiDisclosureCard.vue'
export { default as AiFunctionalityDisclosureCard } from './AiFunctionalityDisclosureCard.vue'
export { default as ArchivedDisclosureCard } from './ArchivedDisclosureCard.vue'
export { default as DerivativeDisclosureCard } from './DerivativeDisclosureCard.vue'
export { default as DisclosureToggleCard } from './DisclosureToggleCard.vue'
@@ -44,6 +44,7 @@ export type DerivativeDisclosure = {
export type DisclosureFormState = {
ai: AiDisclosure
aiFunctionality: NoteDisclosure
advertising: NoteDisclosure
paidFeatures: PaidFeaturesDisclosure
telemetry: TelemetryDisclosure
+10 -1
View File
@@ -3839,11 +3839,20 @@
"project.settings.disclosures.advertising.title": {
"message": "Contains advertisements"
},
"project.settings.disclosures.ai-functionality.description": {
"message": "Placeholder"
},
"project.settings.disclosures.ai-functionality.note-placeholder": {
"message": "e.g. The in-game assistant uses generative AI to generate dialogue."
},
"project.settings.disclosures.ai-functionality.title": {
"message": "Contains generative AI functionality"
},
"project.settings.disclosures.ai.content-rules": {
"message": "Please refer to Section 6 of <rules>Modrinth's Content Rules</rules> for more information."
},
"project.settings.disclosures.ai.description": {
"message": "You must enable this if this project contains a substantial amount of AI-generated code, any\n\t\t\t\tassets that are substantially AI-generated, the project's functionality relies on the use of\n\t\t\t\tgenerative AI, or if any element of your project's page such as description or publishing\n\t\t\t\trelies on generative AI."
"message": "You must enable this if this project contains a substantial amount of AI-generated code, any\n\t\t\t\tassets that are substantially AI-generated, or if any element of your project's page such as\n\t\t\t\tdescription or publishing relies on generative AI."
},
"project.settings.disclosures.ai.note-placeholder": {
"message": "e.g. The Chinese and Arabic translations are AI-generated."
@@ -22,6 +22,7 @@ import { computed, watch } from 'vue'
import {
AdvertisingDisclosureCard,
AiDisclosureCard,
AiFunctionalityDisclosureCard,
ArchivedDisclosureCard,
DerivativeDisclosureCard,
type DisclosureFormIssue,
@@ -293,6 +294,14 @@ const { confirmLeaveModal } = usePageLeaveSafety(hasChanges)
(status: DisclosureLockStatus) => setDisclosureLockStatus('ai_content', status)
"
/>
<AiFunctionalityDisclosureCard
v-if="isDisclosureVisible('ai_functionality')"
v-model="current.aiFunctionality"
v-bind="disclosureUpdateProps('ai_functionality')"
@set-lock-status="
(status: DisclosureLockStatus) => setDisclosureLockStatus('ai_functionality', status)
"
/>
<AdvertisingDisclosureCard
v-if="isDisclosureVisible('advertisements')"
v-model="current.advertising"
@@ -0,0 +1,24 @@
INSERT INTO project_disclosures (project_id, type, metadata, updated_at, updated_by, set_by_moderator, deleted_at, lock_status)
SELECT
project_id,
'ai_functionality',
'{"note":null}'::jsonb,
now(),
0,
set_by_moderator,
deleted_at,
lock_status
FROM project_disclosures
WHERE type = 'ai_content'
AND metadata -> 'uses' ? 'functionality'
ON CONFLICT (project_id, type) DO NOTHING;
DELETE FROM project_disclosures
WHERE type = 'ai_content'
AND metadata -> 'uses' ? 'functionality'
AND jsonb_array_length(metadata -> 'uses') = 1;
UPDATE project_disclosures
SET metadata = jsonb_set(metadata, '{uses}', (metadata -> 'uses') - 'functionality')
WHERE type = 'ai_content'
AND metadata -> 'uses' ? 'functionality';
+3 -1
View File
@@ -18,6 +18,9 @@ pub enum ProjectDisclosure {
note: Option<String>,
uses: BTreeSet<AiUsages>,
},
AiFunctionality {
note: Option<String>,
},
Advertisements {
note: Option<String>,
},
@@ -161,7 +164,6 @@ pub enum AiUsages {
Code,
Assets,
Text,
Functionality,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, IntoStaticStr)]
@@ -1304,7 +1304,7 @@ export namespace Labrinth {
export type TelemetryConsent = 'opt_in' | 'opt_out' | 'always_active'
export type AiUsage = 'code' | 'assets' | 'text' | 'functionality'
export type AiUsage = 'code' | 'assets' | 'text'
export type DisclosureLockStatus = 'unlocked' | 'cannot_disable' | 'fully_locked'
@@ -1320,6 +1320,10 @@ export namespace Labrinth {
uses: AiUsage[]
note?: string | null
}
| {
type: 'ai_functionality'
note?: string | null
}
| {
type: 'advertisements'
note?: string | null
+2
View File
@@ -61,6 +61,7 @@ import _BoxIcon from './icons/box.svg?component'
import _BoxImportIcon from './icons/box-import.svg?component'
import _BoxesIcon from './icons/boxes.svg?component'
import _BracesIcon from './icons/braces.svg?component'
import _BrainCircuitIcon from './icons/brain-circuit.svg?component'
import _BrushCleaningIcon from './icons/brush-cleaning.svg?component'
import _BugIcon from './icons/bug.svg?component'
import _CalendarIcon from './icons/calendar.svg?component'
@@ -505,6 +506,7 @@ export const BoxIcon = _BoxIcon
export const BoxImportIcon = _BoxImportIcon
export const BoxesIcon = _BoxesIcon
export const BracesIcon = _BracesIcon
export const BrainCircuitIcon = _BrainCircuitIcon
export const BrushCleaningIcon = _BrushCleaningIcon
export const BugIcon = _BugIcon
export const CalendarIcon = _CalendarIcon
+27
View File
@@ -0,0 +1,27 @@
<!-- @license lucide-static v0.562.0 - ISC -->
<svg
class="lucide lucide-brain-circuit"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z" />
<path d="M9 13a4.5 4.5 0 0 0 3-4" />
<path d="M6.003 5.125A3 3 0 0 0 6.401 6.5" />
<path d="M3.477 10.896a4 4 0 0 1 .585-.396" />
<path d="M6 18a4 4 0 0 1-1.967-.516" />
<path d="M12 13h4" />
<path d="M12 18h6a2 2 0 0 1 2 2v1" />
<path d="M12 8h8" />
<path d="M16 8V5a2 2 0 0 1 2-2" />
<circle cx="16" cy="13" r=".5" />
<circle cx="18" cy="3" r=".5" />
<circle cx="20" cy="21" r=".5" />
<circle cx="20" cy="8" r=".5" />
</svg>

After

Width:  |  Height:  |  Size: 837 B

@@ -38,6 +38,17 @@
</span>
</div>
</div>
<div v-if="aiFunctionalityDisclosure">
<BrainCircuitIcon aria-hidden="true" />
<div class="flex flex-col gap-1">
<span>
{{ capitalizeString(formatMessage(messages.aiFunctionalityTitle)) }}
</span>
<span v-if="aiFunctionalityDisclosure.note" class="text-sm text-secondary">
<BasicMarkdownText :text="aiFunctionalityDisclosure.note" :target="linkTarget" />
</span>
</div>
</div>
<div v-if="advertisingDisclosure">
<MegaphoneIcon aria-hidden="true" />
<div class="flex flex-col gap-1">
@@ -226,6 +237,7 @@
import type { Labrinth } from '@modrinth/api-client'
import {
BookTextIcon,
BrainCircuitIcon,
CalendarIcon,
CircleDollarSignIcon,
CircuitBoardIcon,
@@ -263,7 +275,7 @@ const formatDateTime = useFormatDateTime({
dateStyle: 'long',
})
const AI_USE_ORDER: Labrinth.Projects.v3.AiUsage[] = ['code', 'assets', 'text', 'functionality']
const AI_USE_ORDER: Labrinth.Projects.v3.AiUsage[] = ['code', 'assets', 'text']
const props = defineProps<{
project: Labrinth.Projects.v2.Project
@@ -304,6 +316,10 @@ const messages = defineMessages({
id: 'project.disclosure.ai-generated-content.title',
defaultMessage: 'Contains AI-generated {types}',
},
aiFunctionalityTitle: {
id: 'project.disclosure.ai-functionality.title',
defaultMessage: 'Generative AI functionality',
},
derivativeWork: {
id: 'project.disclosure.derivative-work.title',
defaultMessage: 'This is a derivative work of:',
@@ -346,6 +362,7 @@ function findDisclosure<T extends Labrinth.Projects.v3.ProjectDisclosureType>(ty
}
const aiDisclosure = computed(() => findDisclosure('ai_content'))
const aiFunctionalityDisclosure = computed(() => findDisclosure('ai_functionality'))
const advertisingDisclosure = computed(() => findDisclosure('advertisements'))
const paidFeaturesDisclosure = computed(() => findDisclosure('paid_features'))
const telemetryDisclosure = computed(() => findDisclosure('telemetry'))
@@ -388,10 +405,6 @@ const aiUseLabels = {
id: 'project.disclosure.ai-generated-content.use.text',
defaultMessage: 'text',
}),
functionality: defineMessage({
id: 'project.disclosure.ai-generated-content.use.functionality',
defaultMessage: 'functionality',
}),
content: defineMessage({
id: 'project.disclosure.ai-generated-content.use.content',
defaultMessage: 'content',
-6
View File
@@ -3458,9 +3458,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "e Inhalte"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "e Funktionen"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "en Text"
},
@@ -3854,9 +3851,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Code"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funktionen"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Text"
},
-6
View File
@@ -3458,9 +3458,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "e Inhalte"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "e Funktionen"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "en Text"
},
@@ -3854,9 +3851,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Code"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funktionen"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Text"
},
+6 -6
View File
@@ -3446,6 +3446,9 @@
"project.disclosure.advertising.title": {
"defaultMessage": "Contains advertising"
},
"project.disclosure.ai-functionality.title": {
"defaultMessage": "Generative AI functionality"
},
"project.disclosure.ai-generated-content.title": {
"defaultMessage": "Contains AI-generated {types}"
},
@@ -3458,9 +3461,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "content"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "functionality"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "text"
},
@@ -3854,9 +3854,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Code"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Functionality"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Text"
},
@@ -4199,6 +4196,9 @@
"search.filter_type.advanced.disclosure.ai_content.usage": {
"defaultMessage": "AI {usage}"
},
"search.filter_type.advanced.disclosure.ai_functionality": {
"defaultMessage": "Generative AI functionality"
},
"search.filter_type.advanced.disclosure.archived": {
"defaultMessage": "Archived"
},
@@ -3458,9 +3458,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "contenido"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funciones"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "texto"
},
@@ -3854,9 +3851,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Código"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funciones"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Texto"
},
-6
View File
@@ -3407,9 +3407,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "contenido"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funcionalidad"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "texto"
},
@@ -3791,9 +3788,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Código"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funcionalidad"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Texto"
},
-6
View File
@@ -2996,9 +2996,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "tartalmat"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funkciókat"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "szöveget"
},
@@ -3356,9 +3353,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Kód"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funkciók"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Szöveg"
},
-6
View File
@@ -3401,9 +3401,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "contenuti generati"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funzionalità generate"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "testo generato"
},
@@ -3797,9 +3794,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Codice"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funzionalità"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Testo"
},
-6
View File
@@ -3284,9 +3284,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "콘텐츠"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "기능"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "텍스트"
},
@@ -3668,9 +3665,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "코드"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "기능"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "텍스트"
},
-6
View File
@@ -3398,9 +3398,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "zawartość wygenerowaną"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funkcjonalność wygenerowaną"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "tekst wygenerowany"
},
@@ -3782,9 +3779,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Kod"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funkcjonalność"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Tekst"
},
-7
View File
@@ -3344,9 +3344,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "conteúdo"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "recurso"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "texto"
},
@@ -3740,9 +3737,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Código"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Recursos"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Texto"
},
@@ -6429,4 +6423,3 @@
"defaultMessage": "Tipo"
}
}
-6
View File
@@ -3371,9 +3371,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "контент"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "функциональность"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "текст"
},
@@ -3764,9 +3761,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Код"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Функциональность"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Текст"
},
-6
View File
@@ -3143,9 +3143,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "innehåll"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "funktionalitet"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "text"
},
@@ -3533,9 +3530,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Kod"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Funktion"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Text"
},
-6
View File
@@ -3335,9 +3335,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "içerik"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "işlevsellik"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "metin"
},
@@ -3707,9 +3704,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Kod"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "İşlevsellik"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Metin"
},
-6
View File
@@ -3305,9 +3305,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "вміст"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "функціонал"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "текст"
},
@@ -3701,9 +3698,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "Код"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "Функціонал"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "Текст"
},
-6
View File
@@ -3458,9 +3458,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "内容"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "功能"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "文本"
},
@@ -3854,9 +3851,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "代码"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "功能"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "文本(如翻译)"
},
-6
View File
@@ -3458,9 +3458,6 @@
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "內容"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "功能"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "文字"
},
@@ -3854,9 +3851,6 @@
"project.settings.disclosures.ai.types-code": {
"defaultMessage": "程式碼"
},
"project.settings.disclosures.ai.types-functionality": {
"defaultMessage": "功能"
},
"project.settings.disclosures.ai.types-text": {
"defaultMessage": "文字"
},
-4
View File
@@ -1240,10 +1240,6 @@ export const disclosureAiUsageMessages = defineMessages({
id: 'project.settings.disclosures.ai.types-text',
defaultMessage: 'Text',
},
functionality: {
id: 'project.settings.disclosures.ai.types-functionality',
defaultMessage: 'Functionality',
},
})
export const disclosureTelemetryConsentMessages = defineMessages({
+2 -1
View File
@@ -2,6 +2,7 @@ import type { Labrinth } from '@modrinth/api-client'
export const PROJECT_DISCLOSURE_TYPES = [
'ai_content',
'ai_functionality',
'advertisements',
'epilepsy_triggers',
'system_interactions',
@@ -15,7 +16,6 @@ export const AI_USAGE_TYPES = [
'code',
'assets',
'text',
'functionality',
] as const satisfies readonly Labrinth.Projects.v3.AiUsage[]
export const TELEMETRY_CONSENT_TYPES = [
@@ -39,6 +39,7 @@ export const DISCLOSURE_SUPPORTED_PROJECT_TYPES: Record<
readonly (typeof ALL_CONTENT_PROJECT_TYPES)[number][]
> = {
ai_content: ALL_CONTENT_PROJECT_TYPES,
ai_functionality: ALL_CONTENT_PROJECT_TYPES,
advertisements: ALL_CONTENT_PROJECT_TYPES,
epilepsy_triggers: ALL_CONTENT_PROJECT_TYPES,
derivative_work: ALL_CONTENT_PROJECT_TYPES,
+9
View File
@@ -1,6 +1,7 @@
import type { Labrinth } from '@modrinth/api-client'
import {
ArchiveIcon,
BrainCircuitIcon,
CircleDollarSignIcon,
CircuitBoardIcon,
ClientIcon,
@@ -224,6 +225,7 @@ export type DisclosureTypeFilter = Labrinth.Projects.v3.ProjectDisclosureType
const DISCLOSURE_TYPE_ICONS: Record<DisclosureTypeFilter, Component> = {
ai_content: SparklesIcon,
ai_functionality: BrainCircuitIcon,
advertisements: MegaphoneIcon,
epilepsy_triggers: EyeIcon,
system_interactions: CircuitBoardIcon,
@@ -254,6 +256,13 @@ export function formatDisclosureTypeLabel(
defaultMessage: 'AI-generated content',
}),
)
case 'ai_functionality':
return formatMessage(
defineMessage({
id: 'search.filter_type.advanced.disclosure.ai_functionality',
defaultMessage: 'Generative AI functionality',
}),
)
case 'advertisements':
return formatMessage(
defineMessage({