@webiny/ai-powerups 6.5.1 → 6.5.2-beta.1
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/admin/Extension.js +16 -2
- package/admin/Extension.js.map +1 -1
- package/admin/features/permissions/abstractions.d.ts +17 -0
- package/admin/features/permissions/abstractions.js +6 -0
- package/admin/features/permissions/abstractions.js.map +1 -0
- package/admin/features/permissions/feature.d.ts +14 -0
- package/admin/features/permissions/feature.js +7 -0
- package/admin/features/permissions/feature.js.map +1 -0
- package/admin/features/permissions/index.d.ts +2 -0
- package/admin/features/permissions/index.js +2 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +2 -2
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +2 -2
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -1
- package/admin/presentation/CmsCompareEntryRevisions/feature.js +2 -2
- package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -1
- package/admin/presentation/security/HasPermission.d.ts +10 -0
- package/admin/presentation/security/HasPermission.js +6 -0
- package/admin/presentation/security/HasPermission.js.map +1 -0
- package/api/Extension.js +6 -0
- package/api/Extension.js.map +1 -1
- package/api/features/Capabilities/ListAiCapabilitiesUseCase.d.ts +7 -4
- package/api/features/Capabilities/ListAiCapabilitiesUseCase.js +11 -5
- package/api/features/Capabilities/ListAiCapabilitiesUseCase.js.map +1 -1
- package/api/features/Capabilities/ResolveAiCapabilityUseCase.d.ts +4 -6
- package/api/features/Capabilities/ResolveAiCapabilityUseCase.js +12 -11
- package/api/features/Capabilities/ResolveAiCapabilityUseCase.js.map +1 -1
- package/api/features/Capabilities/abstractions.d.ts +1 -1
- package/api/features/Capabilities/abstractions.js.map +1 -1
- package/api/features/Capabilities/feature.js +4 -4
- package/api/features/Capabilities/feature.js.map +1 -1
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +5 -3
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +11 -6
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -1
- package/api/features/CmsCompareEntryRevisions/feature.js +2 -2
- package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -1
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +2 -2
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +3 -3
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -1
- package/api/features/CmsGenerateEntryContent/QueueCmsGenerateEntryContentUseCase.d.ts +19 -0
- package/api/features/CmsGenerateEntryContent/QueueCmsGenerateEntryContentUseCase.js +61 -0
- package/api/features/CmsGenerateEntryContent/QueueCmsGenerateEntryContentUseCase.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/abstractions.d.ts +14 -0
- package/api/features/CmsGenerateEntryContent/abstractions.js +2 -1
- package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -1
- package/api/features/CmsGenerateEntryContent/feature.js +4 -2
- package/api/features/CmsGenerateEntryContent/feature.js.map +1 -1
- package/api/features/CmsGenerateEntryContent/index.d.ts +1 -1
- package/api/features/CmsGenerateEntryContent/index.js +1 -1
- package/api/features/Connections/ConnectionsGraphQLMapper.js +1 -1
- package/api/features/Connections/ConnectionsGraphQLMapper.js.map +1 -1
- package/api/features/GetDecryptedSettings/GetDecryptedSettingsUseCase.d.ts +17 -0
- package/api/features/GetDecryptedSettings/GetDecryptedSettingsUseCase.js +41 -0
- package/api/features/GetDecryptedSettings/GetDecryptedSettingsUseCase.js.map +1 -0
- package/api/features/GetDecryptedSettings/abstractions.d.ts +13 -0
- package/api/features/GetDecryptedSettings/abstractions.js +5 -0
- package/api/features/GetDecryptedSettings/abstractions.js.map +1 -0
- package/api/features/GetDecryptedSettings/feature.d.ts +4 -0
- package/api/features/GetDecryptedSettings/feature.js +11 -0
- package/api/features/GetDecryptedSettings/feature.js.map +1 -0
- package/api/features/GetDecryptedSettings/index.d.ts +2 -0
- package/api/features/GetDecryptedSettings/index.js +2 -0
- package/api/features/GetSettings/GetSettingsRepository.d.ts +2 -2
- package/api/features/GetSettings/GetSettingsRepository.js +2 -2
- package/api/features/GetSettings/GetSettingsRepository.js.map +1 -1
- package/api/features/GetSettings/GetSettingsUseCase.d.ts +15 -4
- package/api/features/GetSettings/GetSettingsUseCase.js +34 -5
- package/api/features/GetSettings/GetSettingsUseCase.js.map +1 -1
- package/api/features/GetSettings/abstractions.d.ts +1 -1
- package/api/features/GetSettings/abstractions.js.map +1 -1
- package/api/features/GetSettings/feature.js +4 -4
- package/api/features/GetSettings/feature.js.map +1 -1
- package/api/features/ListModels/ListModelsUseCase.d.ts +15 -0
- package/api/features/ListModels/ListModelsUseCase.js +25 -0
- package/api/features/ListModels/ListModelsUseCase.js.map +1 -0
- package/api/features/ListModels/abstractions.d.ts +10 -0
- package/api/features/ListModels/abstractions.js +5 -0
- package/api/features/ListModels/abstractions.js.map +1 -0
- package/api/features/ListModels/feature.d.ts +4 -0
- package/api/features/ListModels/feature.js +11 -0
- package/api/features/ListModels/feature.js.map +1 -0
- package/api/features/ListModels/index.d.ts +1 -0
- package/api/features/ListModels/index.js +1 -0
- package/api/features/Providers/ProvidersGraphQLMapper.js +1 -1
- package/api/features/Providers/ProvidersGraphQLMapper.js.map +1 -1
- package/api/features/UpdateSettings/UpdateSettingsRepository.d.ts +2 -2
- package/api/features/UpdateSettings/UpdateSettingsRepository.js +2 -2
- package/api/features/UpdateSettings/UpdateSettingsRepository.js.map +1 -1
- package/api/features/UpdateSettings/UpdateSettingsUseCase.d.ts +5 -3
- package/api/features/UpdateSettings/UpdateSettingsUseCase.js +10 -3
- package/api/features/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
- package/api/features/UpdateSettings/feature.js +4 -4
- package/api/features/UpdateSettings/feature.js.map +1 -1
- package/api/features/WbGeneratePageContent/QueueWbGeneratePageContentUseCase.d.ts +13 -0
- package/api/features/WbGeneratePageContent/QueueWbGeneratePageContentUseCase.js +42 -0
- package/api/features/WbGeneratePageContent/QueueWbGeneratePageContentUseCase.js.map +1 -0
- package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.d.ts +2 -2
- package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +2 -2
- package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
- package/api/features/WbGeneratePageContent/abstractions.d.ts +14 -0
- package/api/features/WbGeneratePageContent/abstractions.js +2 -1
- package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
- package/api/features/WbGeneratePageContent/feature.js +4 -2
- package/api/features/WbGeneratePageContent/feature.js.map +1 -1
- package/api/features/WbGeneratePageContent/index.d.ts +1 -1
- package/api/features/WbGeneratePageContent/index.js +1 -1
- package/api/features/permissions/abstractions.d.ts +15 -0
- package/api/features/permissions/abstractions.js +6 -0
- package/api/features/permissions/abstractions.js.map +1 -0
- package/api/features/permissions/feature.d.ts +4 -0
- package/api/features/permissions/feature.js +7 -0
- package/api/features/permissions/feature.js.map +1 -0
- package/api/features/permissions/index.d.ts +2 -0
- package/api/features/permissions/index.js +2 -0
- package/api/graphql/BaseGraphQLSchema.js +22 -45
- package/api/graphql/BaseGraphQLSchema.js.map +1 -1
- package/domain/LlmJsonResponse.js +2 -1
- package/domain/LlmJsonResponse.js.map +1 -1
- package/package.json +30 -28
- package/shared/permissionsSchema.d.ts +20 -0
- package/shared/permissionsSchema.js +17 -0
- package/shared/permissionsSchema.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.ts"],"sourcesContent":["import { stepCountIs } from \"ai\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { AiSdkTools } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListTagsUseCase } from \"@webiny/api-file-manager/features/file/ListTags/index.js\";\nimport {\n ResolveAiCapabilityUseCase,\n withAdditionalInstructions\n} from \"~/api/features/Capabilities/index.js\";\nimport { WB_GENERATE_PAGE_CAPABILITY } from \"./capability.js\";\nimport {\n AiPromptContextBuilder,\n formatAdditionalFilesContext\n} from \"~/api/features/AiPromptContext/index.js\";\nimport { createReadProjectFileTool } from \"~/api/features/AiPromptContext/ReadProjectFileTool.js\";\nimport { WbGeneratePageContentUseCase } from \"./abstractions.js\";\nimport type {\n WbGeneratePageContentParams,\n GeneratePageContentResult,\n GenerationTelemetry\n} from \"./abstractions.js\";\nimport { buildDomainPrompt } from \"./buildPrompt.js\";\nimport { LlmJsonResponse } from \"~/domain/LlmJsonResponse.js\";\nimport { ComponentFilter } from \"./ComponentFilter.js\";\n\nclass WbGeneratePageContentUseCaseImpl implements WbGeneratePageContentUseCase.Interface {\n constructor(\n private promptContextBuilder: AiPromptContextBuilder.Interface,\n private resolveCapability: ResolveAiCapabilityUseCase.Interface,\n private ai: Ai.Interface,\n private aiSdkTools: AiSdkTools.Interface,\n private listTags: ListTagsUseCase.Interface\n ) {}\n\n async execute(\n params: WbGeneratePageContentParams\n ): Promise<Result<GeneratePageContentResult, Error>> {\n const resolved = await this.resolveCapability.execute(WB_GENERATE_PAGE_CAPABILITY);\n if (resolved.isFail()) {\n return Result.fail(resolved.error);\n }\n\n const capability = resolved.value;\n\n const sdkTools = this.aiSdkTools.getToolSet();\n\n const context = await this.promptContextBuilder.execute({\n projectId: params.projectId,\n readerPersonaId: params.readerPersonaId,\n writerPersonaId: params.writerPersonaId,\n excludedFileIds: params.excludedFileIds,\n additionalFileIds: params.additionalFileIds\n });\n\n if (context.allProjectFiles.length > 0) {\n const projectFileTool = createReadProjectFileTool(\n context.allProjectFiles,\n context.excludedFileIds\n );\n Object.assign(sdkTools, projectFileTool);\n }\n\n // Fetch image tags so the prompt can enumerate what's queryable; without\n // this the model invents tag/IDs instead of calling listImagesByTag.\n const tagsResult = await this.listTags.execute({\n where: { type_startsWith: \"image/\" },\n limit: 100\n });\n const imageTags = tagsResult.isOk() ? tagsResult.value.map(t => t.tag) : [];\n\n const components = params.components as Array<{ name: string }>;\n const systemText = withAdditionalInstructions(\n capability,\n buildDomainPrompt(components, params.tools, imageTags) + context.toString()\n );\n\n const system = {\n role: \"system\" as const,\n content: systemText,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" }\n }\n }\n };\n\n try {\n const aiResult = await this.ai.generateText({\n model: capability.model,\n connection: capability.connection,\n system,\n toolChoice: \"auto\",\n prompt: params.prompt + formatAdditionalFilesContext(context.additionalFiles),\n ...(Object.keys(sdkTools).length > 0\n ? { tools: sdkTools, stopWhen: stepCountIs(20) }\n : {})\n });\n\n const text =\n aiResult.text ||\n (aiResult.steps.filter(step => step.text.length > 0).pop()?.text ?? \"\");\n\n const elements = LlmJsonResponse.fromRawText(text).toArray();\n const componentFilter = new ComponentFilter(components);\n const output = JSON.stringify(componentFilter.filter(elements));\n\n const filesRead = new Set<string>();\n let toolCallsMade = 0;\n for (const step of aiResult.steps) {\n for (const call of step.toolCalls) {\n toolCallsMade++;\n if (call.toolName === \"read_project_file\") {\n const input = call.input as { fileId?: string };\n if (input.fileId) {\n filesRead.add(input.fileId);\n }\n }\n }\n }\n\n const telemetry: GenerationTelemetry = {\n filesRead: [...filesRead],\n cacheHit: context.cacheHit,\n toolCallsMade,\n totalSteps: aiResult.steps.length,\n toolsAvailable: Object.keys(sdkTools),\n imageTagsInPrompt: imageTags\n };\n\n return Result.ok({ output, telemetry });\n } catch (error) {\n return Result.fail(\n new Error(\n `AI generation failed: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n}\n\nexport
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.ts"],"sourcesContent":["import { stepCountIs } from \"ai\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { AiSdkTools } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListTagsUseCase } from \"@webiny/api-file-manager/features/file/ListTags/index.js\";\nimport {\n ResolveAiCapabilityUseCase,\n withAdditionalInstructions\n} from \"~/api/features/Capabilities/index.js\";\nimport { WB_GENERATE_PAGE_CAPABILITY } from \"./capability.js\";\nimport {\n AiPromptContextBuilder,\n formatAdditionalFilesContext\n} from \"~/api/features/AiPromptContext/index.js\";\nimport { createReadProjectFileTool } from \"~/api/features/AiPromptContext/ReadProjectFileTool.js\";\nimport { WbGeneratePageContentUseCase } from \"./abstractions.js\";\nimport type {\n WbGeneratePageContentParams,\n GeneratePageContentResult,\n GenerationTelemetry\n} from \"./abstractions.js\";\nimport { buildDomainPrompt } from \"./buildPrompt.js\";\nimport { LlmJsonResponse } from \"~/domain/LlmJsonResponse.js\";\nimport { ComponentFilter } from \"./ComponentFilter.js\";\n\nclass WbGeneratePageContentUseCaseImpl implements WbGeneratePageContentUseCase.Interface {\n constructor(\n private promptContextBuilder: AiPromptContextBuilder.Interface,\n private resolveCapability: ResolveAiCapabilityUseCase.Interface,\n private ai: Ai.Interface,\n private aiSdkTools: AiSdkTools.Interface,\n private listTags: ListTagsUseCase.Interface\n ) {}\n\n async execute(\n params: WbGeneratePageContentParams\n ): Promise<Result<GeneratePageContentResult, Error>> {\n const resolved = await this.resolveCapability.execute(WB_GENERATE_PAGE_CAPABILITY);\n if (resolved.isFail()) {\n return Result.fail(resolved.error);\n }\n\n const capability = resolved.value;\n\n const sdkTools = this.aiSdkTools.getToolSet();\n\n const context = await this.promptContextBuilder.execute({\n projectId: params.projectId,\n readerPersonaId: params.readerPersonaId,\n writerPersonaId: params.writerPersonaId,\n excludedFileIds: params.excludedFileIds,\n additionalFileIds: params.additionalFileIds\n });\n\n if (context.allProjectFiles.length > 0) {\n const projectFileTool = createReadProjectFileTool(\n context.allProjectFiles,\n context.excludedFileIds\n );\n Object.assign(sdkTools, projectFileTool);\n }\n\n // Fetch image tags so the prompt can enumerate what's queryable; without\n // this the model invents tag/IDs instead of calling listImagesByTag.\n const tagsResult = await this.listTags.execute({\n where: { type_startsWith: \"image/\" },\n limit: 100\n });\n const imageTags = tagsResult.isOk() ? tagsResult.value.map(t => t.tag) : [];\n\n const components = params.components as Array<{ name: string }>;\n const systemText = withAdditionalInstructions(\n capability,\n buildDomainPrompt(components, params.tools, imageTags) + context.toString()\n );\n\n const system = {\n role: \"system\" as const,\n content: systemText,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" }\n }\n }\n };\n\n try {\n const aiResult = await this.ai.generateText({\n model: capability.model,\n connection: capability.connection,\n system,\n toolChoice: \"auto\",\n prompt: params.prompt + formatAdditionalFilesContext(context.additionalFiles),\n ...(Object.keys(sdkTools).length > 0\n ? { tools: sdkTools, stopWhen: stepCountIs(20) }\n : {})\n });\n\n const text =\n aiResult.text ||\n (aiResult.steps.filter(step => step.text.length > 0).pop()?.text ?? \"\");\n\n const elements = LlmJsonResponse.fromRawText(text).toArray();\n const componentFilter = new ComponentFilter(components);\n const output = JSON.stringify(componentFilter.filter(elements));\n\n const filesRead = new Set<string>();\n let toolCallsMade = 0;\n for (const step of aiResult.steps) {\n for (const call of step.toolCalls) {\n toolCallsMade++;\n if (call.toolName === \"read_project_file\") {\n const input = call.input as { fileId?: string };\n if (input.fileId) {\n filesRead.add(input.fileId);\n }\n }\n }\n }\n\n const telemetry: GenerationTelemetry = {\n filesRead: [...filesRead],\n cacheHit: context.cacheHit,\n toolCallsMade,\n totalSteps: aiResult.steps.length,\n toolsAvailable: Object.keys(sdkTools),\n imageTagsInPrompt: imageTags\n };\n\n return Result.ok({ output, telemetry });\n } catch (error) {\n return Result.fail(\n new Error(\n `AI generation failed: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n}\n\nexport default WbGeneratePageContentUseCase.createImplementation({\n implementation: WbGeneratePageContentUseCaseImpl,\n dependencies: [\n AiPromptContextBuilder,\n ResolveAiCapabilityUseCase,\n Ai,\n AiSdkTools,\n ListTagsUseCase\n ]\n});\n"],"names":["WbGeneratePageContentUseCaseImpl","promptContextBuilder","resolveCapability","ai","aiSdkTools","listTags","params","resolved","WB_GENERATE_PAGE_CAPABILITY","Result","capability","sdkTools","context","projectFileTool","createReadProjectFileTool","Object","tagsResult","imageTags","t","components","systemText","withAdditionalInstructions","buildDomainPrompt","system","aiResult","formatAdditionalFilesContext","stepCountIs","text","step","elements","LlmJsonResponse","componentFilter","ComponentFilter","output","JSON","filesRead","Set","toolCallsMade","call","input","telemetry","error","Error","String","WbGeneratePageContentUseCase","AiPromptContextBuilder","ResolveAiCapabilityUseCase","Ai","AiSdkTools","ListTagsUseCase"],"mappings":"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"}
|
|
@@ -29,3 +29,17 @@ export declare namespace WbGeneratePageContentUseCase {
|
|
|
29
29
|
type Interface = IWbGeneratePageContentUseCase;
|
|
30
30
|
type Params = WbGeneratePageContentParams;
|
|
31
31
|
}
|
|
32
|
+
export interface IQueueWbGeneratePageContentUseCase {
|
|
33
|
+
execute(params: WbGeneratePageContentParams): Promise<Result<{
|
|
34
|
+
id: string;
|
|
35
|
+
}, Error>>;
|
|
36
|
+
}
|
|
37
|
+
/** Queues the background task that generates page content. */
|
|
38
|
+
export declare const QueueWbGeneratePageContentUseCase: import("@webiny/di").Abstraction<IQueueWbGeneratePageContentUseCase>;
|
|
39
|
+
export declare namespace QueueWbGeneratePageContentUseCase {
|
|
40
|
+
type Interface = IQueueWbGeneratePageContentUseCase;
|
|
41
|
+
type Params = WbGeneratePageContentParams;
|
|
42
|
+
type Return = Promise<Result<{
|
|
43
|
+
id: string;
|
|
44
|
+
}, Error>>;
|
|
45
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
2
|
const WbGeneratePageContentUseCase = createAbstraction("AiPowerUpsWbGeneratePageContentUseCase");
|
|
3
|
-
|
|
3
|
+
const QueueWbGeneratePageContentUseCase = createAbstraction("AiPowerUpsQueueWbGeneratePageContentUseCase");
|
|
4
|
+
export { QueueWbGeneratePageContentUseCase, WbGeneratePageContentUseCase };
|
|
4
5
|
|
|
5
6
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/abstractions.js","sources":["../../../../src/api/features/WbGeneratePageContent/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\n\nexport interface WbGeneratePageContentParams {\n prompt: string;\n components: unknown;\n tools: unknown;\n projectId?: string | null;\n excludedFileIds?: string[] | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n additionalFileIds?: string[] | null;\n}\n\nexport interface GenerationTelemetry {\n filesRead: string[];\n cacheHit: boolean;\n toolCallsMade: number;\n totalSteps: number;\n toolsAvailable: string[];\n imageTagsInPrompt: string[];\n}\n\nexport interface GeneratePageContentResult {\n output: string;\n telemetry: GenerationTelemetry;\n}\n\nexport interface IWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;\n}\n\nexport const WbGeneratePageContentUseCase = createAbstraction<IWbGeneratePageContentUseCase>(\n \"AiPowerUpsWbGeneratePageContentUseCase\"\n);\n\nexport namespace WbGeneratePageContentUseCase {\n export type Interface = IWbGeneratePageContentUseCase;\n export type Params = WbGeneratePageContentParams;\n}\n"],"names":["WbGeneratePageContentUseCase","createAbstraction"],"mappings":";AA+BO,MAAMA,+BAA+BC,kBACxC"}
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/abstractions.js","sources":["../../../../src/api/features/WbGeneratePageContent/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\n\nexport interface WbGeneratePageContentParams {\n prompt: string;\n components: unknown;\n tools: unknown;\n projectId?: string | null;\n excludedFileIds?: string[] | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n additionalFileIds?: string[] | null;\n}\n\nexport interface GenerationTelemetry {\n filesRead: string[];\n cacheHit: boolean;\n toolCallsMade: number;\n totalSteps: number;\n toolsAvailable: string[];\n imageTagsInPrompt: string[];\n}\n\nexport interface GeneratePageContentResult {\n output: string;\n telemetry: GenerationTelemetry;\n}\n\nexport interface IWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;\n}\n\nexport const WbGeneratePageContentUseCase = createAbstraction<IWbGeneratePageContentUseCase>(\n \"AiPowerUpsWbGeneratePageContentUseCase\"\n);\n\nexport namespace WbGeneratePageContentUseCase {\n export type Interface = IWbGeneratePageContentUseCase;\n export type Params = WbGeneratePageContentParams;\n}\n\nexport interface IQueueWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<{ id: string }, Error>>;\n}\n\n/** Queues the background task that generates page content. */\nexport const QueueWbGeneratePageContentUseCase =\n createAbstraction<IQueueWbGeneratePageContentUseCase>(\n \"AiPowerUpsQueueWbGeneratePageContentUseCase\"\n );\n\nexport namespace QueueWbGeneratePageContentUseCase {\n export type Interface = IQueueWbGeneratePageContentUseCase;\n export type Params = WbGeneratePageContentParams;\n export type Return = Promise<Result<{ id: string }, Error>>;\n}\n"],"names":["WbGeneratePageContentUseCase","createAbstraction","QueueWbGeneratePageContentUseCase"],"mappings":";AA+BO,MAAMA,+BAA+BC,kBACxC;AAaG,MAAMC,oCACTD,kBACI"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
|
-
import
|
|
2
|
+
import WbGeneratePageContentUseCase from "./WbGeneratePageContentUseCase.js";
|
|
3
3
|
import { WbGeneratePageContentTask } from "./WbGeneratePageContentTask.js";
|
|
4
4
|
import { WbGeneratePageCapability } from "./capability.js";
|
|
5
|
+
import QueueWbGeneratePageContentUseCase from "./QueueWbGeneratePageContentUseCase.js";
|
|
5
6
|
const WbGeneratePageContentFeature = createFeature({
|
|
6
7
|
name: "AiPowerUps/WbGeneratePageContent",
|
|
7
8
|
register (container) {
|
|
8
9
|
container.register(WbGeneratePageCapability);
|
|
9
|
-
container.register(
|
|
10
|
+
container.register(WbGeneratePageContentUseCase);
|
|
10
11
|
container.register(WbGeneratePageContentTask);
|
|
12
|
+
container.register(QueueWbGeneratePageContentUseCase);
|
|
11
13
|
}
|
|
12
14
|
});
|
|
13
15
|
export { WbGeneratePageContentFeature };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/feature.js","sources":["../../../../src/api/features/WbGeneratePageContent/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/feature.js","sources":["../../../../src/api/features/WbGeneratePageContent/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport WbGeneratePageContentUseCase from \"./WbGeneratePageContentUseCase.js\";\nimport { WbGeneratePageContentTask } from \"./WbGeneratePageContentTask.js\";\nimport { WbGeneratePageCapability } from \"./capability.js\";\nimport QueueWbGeneratePageContentUseCase from \"./QueueWbGeneratePageContentUseCase.js\";\n\nexport const WbGeneratePageContentFeature = createFeature({\n name: \"AiPowerUps/WbGeneratePageContent\",\n register(container) {\n container.register(WbGeneratePageCapability);\n container.register(WbGeneratePageContentUseCase);\n container.register(WbGeneratePageContentTask);\n container.register(QueueWbGeneratePageContentUseCase);\n }\n});\n"],"names":["WbGeneratePageContentFeature","createFeature","container","WbGeneratePageCapability","WbGeneratePageContentUseCase","WbGeneratePageContentTask","QueueWbGeneratePageContentUseCase"],"mappings":";;;;;AAMO,MAAMA,+BAA+BC,cAAc;IACtD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;IACvB;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { WbGeneratePageContentUseCase } from "./abstractions.js";
|
|
1
|
+
export { WbGeneratePageContentUseCase, QueueWbGeneratePageContentUseCase } from "./abstractions.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { WbGeneratePageContentUseCase } from "./abstractions.js";
|
|
1
|
+
export { QueueWbGeneratePageContentUseCase, WbGeneratePageContentUseCase } from "./abstractions.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Permissions } from "@webiny/api-core/features/security/permissions/index.js";
|
|
2
|
+
import { AI_POWERUPS_PERMISSIONS_SCHEMA } from "../../../shared/permissionsSchema.js";
|
|
3
|
+
export declare const AiPowerUpsPermissions: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
|
|
4
|
+
prefix: string;
|
|
5
|
+
fullAccess: boolean;
|
|
6
|
+
entities: {
|
|
7
|
+
id: "settings";
|
|
8
|
+
title: string;
|
|
9
|
+
permission: string;
|
|
10
|
+
scopes: "full"[];
|
|
11
|
+
}[];
|
|
12
|
+
}>>;
|
|
13
|
+
export declare namespace AiPowerUpsPermissions {
|
|
14
|
+
type Interface = Permissions<typeof AI_POWERUPS_PERMISSIONS_SCHEMA>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createPermissionsAbstraction } from "@webiny/api-core/features/security/permissions/index.js";
|
|
2
|
+
import { AI_POWERUPS_PERMISSIONS_SCHEMA } from "../../../shared/permissionsSchema.js";
|
|
3
|
+
const AiPowerUpsPermissions = createPermissionsAbstraction(AI_POWERUPS_PERMISSIONS_SCHEMA);
|
|
4
|
+
export { AiPowerUpsPermissions };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/permissions/abstractions.js","sources":["../../../../src/api/features/permissions/abstractions.ts"],"sourcesContent":["import { createPermissionsAbstraction } from \"@webiny/api-core/features/security/permissions/index.js\";\nimport type { Permissions } from \"@webiny/api-core/features/security/permissions/index.js\";\nimport { AI_POWERUPS_PERMISSIONS_SCHEMA } from \"~/shared/permissionsSchema.js\";\n\nexport const AiPowerUpsPermissions = createPermissionsAbstraction(AI_POWERUPS_PERMISSIONS_SCHEMA);\n\nexport namespace AiPowerUpsPermissions {\n export type Interface = Permissions<typeof AI_POWERUPS_PERMISSIONS_SCHEMA>;\n}\n"],"names":["AiPowerUpsPermissions","createPermissionsAbstraction","AI_POWERUPS_PERMISSIONS_SCHEMA"],"mappings":";;AAIO,MAAMA,wBAAwBC,6BAA6BC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createPermissionsFeature } from "@webiny/api-core/features/security/permissions/index.js";
|
|
2
|
+
import { AI_POWERUPS_PERMISSIONS_SCHEMA } from "../../../shared/permissionsSchema.js";
|
|
3
|
+
import { AiPowerUpsPermissions } from "./abstractions.js";
|
|
4
|
+
const AiPowerUpsPermissionsFeature = createPermissionsFeature(AI_POWERUPS_PERMISSIONS_SCHEMA, AiPowerUpsPermissions);
|
|
5
|
+
export { AiPowerUpsPermissionsFeature };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/permissions/feature.js","sources":["../../../../src/api/features/permissions/feature.ts"],"sourcesContent":["import { createPermissionsFeature } from \"@webiny/api-core/features/security/permissions/index.js\";\nimport { AI_POWERUPS_PERMISSIONS_SCHEMA } from \"~/shared/permissionsSchema.js\";\nimport { AiPowerUpsPermissions } from \"./abstractions.js\";\n\nexport const AiPowerUpsPermissionsFeature = createPermissionsFeature(\n AI_POWERUPS_PERMISSIONS_SCHEMA,\n AiPowerUpsPermissions\n);\n"],"names":["AiPowerUpsPermissionsFeature","createPermissionsFeature","AI_POWERUPS_PERMISSIONS_SCHEMA","AiPowerUpsPermissions"],"mappings":";;;AAIO,MAAMA,+BAA+BC,yBACxCC,gCACAC"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js";
|
|
2
2
|
import { ErrorResponse, Response } from "@webiny/handler-graphql/responses.js";
|
|
3
|
-
import { AiModelRegistry } from "@webiny/api-core/features/ai/index.js";
|
|
4
|
-
import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
|
|
5
|
-
import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
|
|
6
3
|
import { GetSettingsUseCase } from "../features/GetSettings/index.js";
|
|
7
4
|
import { UpdateSettingsUseCase } from "../features/UpdateSettings/index.js";
|
|
5
|
+
import { ListModelsUseCase } from "../features/ListModels/index.js";
|
|
8
6
|
import { ListAiCapabilitiesUseCase } from "../features/Capabilities/index.js";
|
|
7
|
+
import { QueueWbGeneratePageContentUseCase } from "../features/WbGeneratePageContent/index.js";
|
|
8
|
+
import { QueueCmsGenerateEntryContentUseCase } from "../features/CmsGenerateEntryContent/index.js";
|
|
9
9
|
import { AiPowerUpsSettingsGraphQLMapper } from "./abstractions.js";
|
|
10
|
-
import { WB_GENERATE_PAGE_CONTENT_TASK_ID } from "../features/WbGeneratePageContent/WbGeneratePageContentTask.js";
|
|
11
|
-
import { CMS_GENERATE_ENTRY_CONTENT_TASK_ID } from "../features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js";
|
|
12
10
|
class BaseGraphQLSchemaImpl {
|
|
13
11
|
async execute(builder) {
|
|
14
12
|
builder.addTypeDefs(`
|
|
@@ -88,16 +86,24 @@ class BaseGraphQLSchemaImpl {
|
|
|
88
86
|
builder.addResolver({
|
|
89
87
|
path: "AiPowerUpsQuery.listModels",
|
|
90
88
|
dependencies: [
|
|
91
|
-
|
|
89
|
+
ListModelsUseCase
|
|
92
90
|
],
|
|
93
|
-
resolver: (
|
|
91
|
+
resolver: (useCase)=>async ()=>{
|
|
92
|
+
const result = await useCase.execute();
|
|
93
|
+
if (result.isFail()) throw result.error;
|
|
94
|
+
return result.value;
|
|
95
|
+
}
|
|
94
96
|
});
|
|
95
97
|
builder.addResolver({
|
|
96
98
|
path: "AiPowerUpsQuery.listCapabilities",
|
|
97
99
|
dependencies: [
|
|
98
100
|
ListAiCapabilitiesUseCase
|
|
99
101
|
],
|
|
100
|
-
resolver: (useCase)=>async ()=>
|
|
102
|
+
resolver: (useCase)=>async ()=>{
|
|
103
|
+
const result = await useCase.execute();
|
|
104
|
+
if (result.isFail()) throw result.error;
|
|
105
|
+
return result.value;
|
|
106
|
+
}
|
|
101
107
|
});
|
|
102
108
|
builder.addResolver({
|
|
103
109
|
path: "AiPowerUpsQuery.getSettings",
|
|
@@ -114,52 +120,23 @@ class BaseGraphQLSchemaImpl {
|
|
|
114
120
|
builder.addResolver({
|
|
115
121
|
path: "AiPowerUpsMutation.generatePageContent",
|
|
116
122
|
dependencies: [
|
|
117
|
-
|
|
123
|
+
QueueWbGeneratePageContentUseCase
|
|
118
124
|
],
|
|
119
|
-
resolver: (
|
|
120
|
-
const result = await
|
|
121
|
-
definition: WB_GENERATE_PAGE_CONTENT_TASK_ID,
|
|
122
|
-
input: {
|
|
123
|
-
prompt: args.prompt,
|
|
124
|
-
components: args.components,
|
|
125
|
-
tools: args.tools,
|
|
126
|
-
projectId: args.projectId ?? null,
|
|
127
|
-
excludedFileIds: args.excludedFileIds ?? null,
|
|
128
|
-
readerPersonaId: args.readerPersonaId ?? null,
|
|
129
|
-
writerPersonaId: args.writerPersonaId ?? null,
|
|
130
|
-
additionalFileIds: args.additionalFileIds ?? null
|
|
131
|
-
}
|
|
132
|
-
});
|
|
125
|
+
resolver: (useCase)=>async ({ args })=>{
|
|
126
|
+
const result = await useCase.execute(args);
|
|
133
127
|
if (result.isFail()) throw result.error;
|
|
134
|
-
return
|
|
135
|
-
id: result.value.id
|
|
136
|
-
};
|
|
128
|
+
return result.value;
|
|
137
129
|
}
|
|
138
130
|
});
|
|
139
131
|
builder.addResolver({
|
|
140
132
|
path: "AiPowerUpsMutation.generateEntryContent",
|
|
141
133
|
dependencies: [
|
|
142
|
-
|
|
143
|
-
WcpContext
|
|
134
|
+
QueueCmsGenerateEntryContentUseCase
|
|
144
135
|
],
|
|
145
|
-
resolver: (
|
|
146
|
-
|
|
147
|
-
const result = await taskService.trigger({
|
|
148
|
-
definition: CMS_GENERATE_ENTRY_CONTENT_TASK_ID,
|
|
149
|
-
input: {
|
|
150
|
-
prompt: args.prompt,
|
|
151
|
-
modelId: args.modelId,
|
|
152
|
-
projectId: args.projectId ?? null,
|
|
153
|
-
excludedFileIds: args.excludedFileIds ?? null,
|
|
154
|
-
readerPersonaId: args.readerPersonaId ?? null,
|
|
155
|
-
writerPersonaId: args.writerPersonaId ?? null,
|
|
156
|
-
additionalFileIds: args.additionalFileIds ?? null
|
|
157
|
-
}
|
|
158
|
-
});
|
|
136
|
+
resolver: (useCase)=>async ({ args })=>{
|
|
137
|
+
const result = await useCase.execute(args);
|
|
159
138
|
if (result.isFail()) throw result.error;
|
|
160
|
-
return
|
|
161
|
-
id: result.value.id
|
|
162
|
-
};
|
|
139
|
+
return result.value;
|
|
163
140
|
}
|
|
164
141
|
});
|
|
165
142
|
builder.addResolver({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/graphql/BaseGraphQLSchema.js","sources":["../../../src/api/graphql/BaseGraphQLSchema.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\nimport { Response, ErrorResponse } from \"@webiny/handler-graphql/responses.js\";\nimport { AiModelRegistry } from \"@webiny/api-core/features/ai/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport { UpdateSettingsUseCase } from \"~/api/features/UpdateSettings/index.js\";\nimport { ListAiCapabilitiesUseCase } from \"~/api/features/Capabilities/index.js\";\nimport { AiPowerUpsSettingsGraphQLMapper } from \"./abstractions.js\";\nimport {\n WB_GENERATE_PAGE_CONTENT_TASK_ID,\n type IWbGeneratePageContentTaskInput\n} from \"~/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js\";\nimport {\n CMS_GENERATE_ENTRY_CONTENT_TASK_ID,\n type ICmsGenerateEntryContentTaskInput\n} from \"~/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js\";\n\nclass BaseGraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): Promise<CoreGraphQLSchemaFactory.SchemaBuilder> {\n builder.addTypeDefs(/* GraphQL */ `\n type AiModel {\n providerId: String!\n providerName: String!\n modelId: String!\n modelName: String!\n deprecated: Date\n endOfLife: Date\n }\n\n type AiCapability {\n id: String!\n label: String!\n description: String!\n defaultRole: String!\n }\n\n type AiPowerUpsQuery {\n listModels: [AiModel!]!\n listCapabilities: [AiCapability!]!\n getSettings: JSON\n }\n\n type AiPowerUpsError {\n code: String\n message: String\n data: JSON\n stack: String\n }\n\n type AiPowerUpsSettingsResponse {\n data: JSON\n error: AiPowerUpsError\n }\n\n type AiPowerUpsMutation {\n updateSettings(input: JSON!): AiPowerUpsSettingsResponse!\n generatePageContent(\n prompt: String!\n components: JSON!\n tools: JSON!\n projectId: String\n excludedFileIds: [String!]\n readerPersonaId: String\n writerPersonaId: String\n additionalFileIds: [String!]\n ): JSON!\n generateEntryContent(\n prompt: String!\n modelId: String!\n projectId: String\n excludedFileIds: [String!]\n readerPersonaId: String\n writerPersonaId: String\n additionalFileIds: [String!]\n ): JSON!\n }\n\n extend type Query {\n aiPowerUps: AiPowerUpsQuery\n }\n\n extend type Mutation {\n aiPowerUps: AiPowerUpsMutation\n }\n `);\n\n builder.addResolver({\n path: \"Query.aiPowerUps\",\n resolver: () => () => ({})\n });\n\n builder.addResolver({\n path: \"Mutation.aiPowerUps\",\n resolver: () => () => ({})\n });\n\n builder.addResolver({\n path: \"AiPowerUpsQuery.listModels\",\n dependencies: [AiModelRegistry],\n resolver: (registry: AiModelRegistry.Interface) => {\n return async () => registry.listModels();\n }\n });\n\n /*\n * Whatever features registered. The admin screen has no list of its own, so a feature that\n * registers a capability gets a settings row without touching the admin app.\n */\n builder.addResolver({\n path: \"AiPowerUpsQuery.listCapabilities\",\n dependencies: [ListAiCapabilitiesUseCase],\n resolver: (useCase: ListAiCapabilitiesUseCase.Interface) => {\n return async () => useCase.execute();\n }\n });\n\n builder.addResolver({\n path: \"AiPowerUpsQuery.getSettings\",\n dependencies: [GetSettingsUseCase, AiPowerUpsSettingsGraphQLMapper],\n resolver: (\n useCase: GetSettingsUseCase.Interface,\n mapper: AiPowerUpsSettingsGraphQLMapper.Interface\n ) => {\n return async () => {\n const result = await useCase.execute();\n if (result.isFail()) {\n throw result.error;\n }\n\n return mapper.toApi(result.value);\n };\n }\n });\n\n builder.addResolver<IWbGeneratePageContentTaskInput>({\n path: \"AiPowerUpsMutation.generatePageContent\",\n dependencies: [TaskService],\n resolver: (taskService: TaskService.Interface) => {\n return async ({ args }) => {\n const result = await taskService.trigger<IWbGeneratePageContentTaskInput>({\n definition: WB_GENERATE_PAGE_CONTENT_TASK_ID,\n input: {\n prompt: args.prompt,\n components: args.components,\n tools: args.tools,\n projectId: args.projectId ?? null,\n excludedFileIds: args.excludedFileIds ?? null,\n readerPersonaId: args.readerPersonaId ?? null,\n writerPersonaId: args.writerPersonaId ?? null,\n additionalFileIds: args.additionalFileIds ?? null\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return { id: result.value.id };\n };\n }\n });\n\n builder.addResolver<ICmsGenerateEntryContentTaskInput>({\n path: \"AiPowerUpsMutation.generateEntryContent\",\n dependencies: [TaskService, WcpContext],\n resolver: (taskService: TaskService.Interface, wcp: WcpContext.Interface) => {\n return async ({ args }) => {\n // Gated at resolver-time, NOT at feature-registration time: the WCP license is\n // loaded per request, so a register-time check reads the placeholder\n // NullLicense (canUse* → false).\n if (!wcp.canUseAiEntryGeneration()) {\n throw new Error(\n \"AI entry generation cannot be used because your project license does not permit it.\"\n );\n }\n\n const result = await taskService.trigger<ICmsGenerateEntryContentTaskInput>({\n definition: CMS_GENERATE_ENTRY_CONTENT_TASK_ID,\n input: {\n prompt: args.prompt,\n modelId: args.modelId,\n projectId: args.projectId ?? null,\n excludedFileIds: args.excludedFileIds ?? null,\n readerPersonaId: args.readerPersonaId ?? null,\n writerPersonaId: args.writerPersonaId ?? null,\n additionalFileIds: args.additionalFileIds ?? null\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return { id: result.value.id };\n };\n }\n });\n\n builder.addResolver<{ input: Record<string, unknown> }>({\n path: \"AiPowerUpsMutation.updateSettings\",\n dependencies: [\n GetSettingsUseCase,\n UpdateSettingsUseCase,\n AiPowerUpsSettingsGraphQLMapper\n ],\n resolver: (\n getSettings: GetSettingsUseCase.Interface,\n updateSettings: UpdateSettingsUseCase.Interface,\n mapper: AiPowerUpsSettingsGraphQLMapper.Interface\n ) => {\n return async ({ args }) => {\n const currentResult = await getSettings.execute();\n if (currentResult.isFail()) {\n return new ErrorResponse(currentResult.error);\n }\n\n const assembled = await mapper.fromApi(args.input, currentResult.value);\n const result = await updateSettings.execute(assembled);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return new Response(await mapper.toApi(result.value));\n };\n }\n });\n\n return builder;\n }\n}\n\nexport const BaseGraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({\n implementation: BaseGraphQLSchemaImpl,\n dependencies: []\n});\n"],"names":["BaseGraphQLSchemaImpl","builder","AiModelRegistry","registry","ListAiCapabilitiesUseCase","useCase","GetSettingsUseCase","AiPowerUpsSettingsGraphQLMapper","mapper","result","TaskService","taskService","args","WB_GENERATE_PAGE_CONTENT_TASK_ID","WcpContext","wcp","Error","CMS_GENERATE_ENTRY_CONTENT_TASK_ID","UpdateSettingsUseCase","getSettings","updateSettings","currentResult","ErrorResponse","assembled","Response","BaseGraphQLSchema","CoreGraphQLSchemaFactory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api/graphql/BaseGraphQLSchema.js","sources":["../../../src/api/graphql/BaseGraphQLSchema.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\nimport { Response, ErrorResponse } from \"@webiny/handler-graphql/responses.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport { UpdateSettingsUseCase } from \"~/api/features/UpdateSettings/index.js\";\nimport { ListModelsUseCase } from \"~/api/features/ListModels/index.js\";\nimport { ListAiCapabilitiesUseCase } from \"~/api/features/Capabilities/index.js\";\nimport { QueueWbGeneratePageContentUseCase } from \"~/api/features/WbGeneratePageContent/index.js\";\nimport { QueueCmsGenerateEntryContentUseCase } from \"~/api/features/CmsGenerateEntryContent/index.js\";\nimport type { IWbGeneratePageContentTaskInput } from \"~/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js\";\nimport type { ICmsGenerateEntryContentTaskInput } from \"~/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js\";\nimport { AiPowerUpsSettingsGraphQLMapper } from \"./abstractions.js\";\n\nclass BaseGraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): Promise<CoreGraphQLSchemaFactory.SchemaBuilder> {\n builder.addTypeDefs(/* GraphQL */ `\n type AiModel {\n providerId: String!\n providerName: String!\n modelId: String!\n modelName: String!\n deprecated: Date\n endOfLife: Date\n }\n\n type AiCapability {\n id: String!\n label: String!\n description: String!\n defaultRole: String!\n }\n\n type AiPowerUpsQuery {\n listModels: [AiModel!]!\n listCapabilities: [AiCapability!]!\n getSettings: JSON\n }\n\n type AiPowerUpsError {\n code: String\n message: String\n data: JSON\n stack: String\n }\n\n type AiPowerUpsSettingsResponse {\n data: JSON\n error: AiPowerUpsError\n }\n\n type AiPowerUpsMutation {\n updateSettings(input: JSON!): AiPowerUpsSettingsResponse!\n generatePageContent(\n prompt: String!\n components: JSON!\n tools: JSON!\n projectId: String\n excludedFileIds: [String!]\n readerPersonaId: String\n writerPersonaId: String\n additionalFileIds: [String!]\n ): JSON!\n generateEntryContent(\n prompt: String!\n modelId: String!\n projectId: String\n excludedFileIds: [String!]\n readerPersonaId: String\n writerPersonaId: String\n additionalFileIds: [String!]\n ): JSON!\n }\n\n extend type Query {\n aiPowerUps: AiPowerUpsQuery\n }\n\n extend type Mutation {\n aiPowerUps: AiPowerUpsMutation\n }\n `);\n\n builder.addResolver({\n path: \"Query.aiPowerUps\",\n resolver: () => () => ({})\n });\n\n builder.addResolver({\n path: \"Mutation.aiPowerUps\",\n resolver: () => () => ({})\n });\n\n builder.addResolver({\n path: \"AiPowerUpsQuery.listModels\",\n dependencies: [ListModelsUseCase],\n resolver: (useCase: ListModelsUseCase.Interface) => {\n return async () => {\n const result = await useCase.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n };\n }\n });\n\n /*\n * Whatever features registered. The admin screen has no list of its own, so a feature that\n * registers a capability gets a settings row without touching the admin app.\n */\n builder.addResolver({\n path: \"AiPowerUpsQuery.listCapabilities\",\n dependencies: [ListAiCapabilitiesUseCase],\n resolver: (useCase: ListAiCapabilitiesUseCase.Interface) => {\n return async () => {\n const result = await useCase.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n };\n }\n });\n\n builder.addResolver({\n path: \"AiPowerUpsQuery.getSettings\",\n dependencies: [GetSettingsUseCase, AiPowerUpsSettingsGraphQLMapper],\n resolver: (\n useCase: GetSettingsUseCase.Interface,\n mapper: AiPowerUpsSettingsGraphQLMapper.Interface\n ) => {\n return async () => {\n const result = await useCase.execute();\n if (result.isFail()) {\n throw result.error;\n }\n\n return mapper.toApi(result.value);\n };\n }\n });\n\n builder.addResolver<IWbGeneratePageContentTaskInput>({\n path: \"AiPowerUpsMutation.generatePageContent\",\n dependencies: [QueueWbGeneratePageContentUseCase],\n resolver: (useCase: QueueWbGeneratePageContentUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n };\n }\n });\n\n builder.addResolver<ICmsGenerateEntryContentTaskInput>({\n path: \"AiPowerUpsMutation.generateEntryContent\",\n dependencies: [QueueCmsGenerateEntryContentUseCase],\n resolver: (useCase: QueueCmsGenerateEntryContentUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n };\n }\n });\n\n builder.addResolver<{ input: Record<string, unknown> }>({\n path: \"AiPowerUpsMutation.updateSettings\",\n dependencies: [\n GetSettingsUseCase,\n UpdateSettingsUseCase,\n AiPowerUpsSettingsGraphQLMapper\n ],\n resolver: (\n getSettings: GetSettingsUseCase.Interface,\n updateSettings: UpdateSettingsUseCase.Interface,\n mapper: AiPowerUpsSettingsGraphQLMapper.Interface\n ) => {\n return async ({ args }) => {\n const currentResult = await getSettings.execute();\n if (currentResult.isFail()) {\n return new ErrorResponse(currentResult.error);\n }\n\n const assembled = await mapper.fromApi(args.input, currentResult.value);\n const result = await updateSettings.execute(assembled);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return new Response(await mapper.toApi(result.value));\n };\n }\n });\n\n return builder;\n }\n}\n\nexport const BaseGraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({\n implementation: BaseGraphQLSchemaImpl,\n dependencies: []\n});\n"],"names":["BaseGraphQLSchemaImpl","builder","ListModelsUseCase","useCase","result","ListAiCapabilitiesUseCase","GetSettingsUseCase","AiPowerUpsSettingsGraphQLMapper","mapper","QueueWbGeneratePageContentUseCase","args","QueueCmsGenerateEntryContentUseCase","UpdateSettingsUseCase","getSettings","updateSettings","currentResult","ErrorResponse","assembled","Response","BaseGraphQLSchema","CoreGraphQLSchemaFactory"],"mappings":";;;;;;;;;AAYA,MAAMA;IACF,MAAM,QACFC,OAA+C,EACA;QAC/CA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiEnC,CAAC;QAEDA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,UAAU,IAAM,IAAO,EAAC;QAC5B;QAEAA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,UAAU,IAAM,IAAO,EAAC;QAC5B;QAEAA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,cAAc;gBAACC;aAAkB;YACjC,UAAU,CAACC,UACA;oBACH,MAAMC,SAAS,MAAMD,QAAQ,OAAO;oBACpC,IAAIC,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAEtB,OAAOA,OAAO,KAAK;gBACvB;QAER;QAMAH,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,cAAc;gBAACI;aAA0B;YACzC,UAAU,CAACF,UACA;oBACH,MAAMC,SAAS,MAAMD,QAAQ,OAAO;oBACpC,IAAIC,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAEtB,OAAOA,OAAO,KAAK;gBACvB;QAER;QAEAH,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,cAAc;gBAACK;gBAAoBC;aAAgC;YACnE,UAAU,CACNJ,SACAK,SAEO;oBACH,MAAMJ,SAAS,MAAMD,QAAQ,OAAO;oBACpC,IAAIC,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOI,OAAO,KAAK,CAACJ,OAAO,KAAK;gBACpC;QAER;QAEAH,QAAQ,WAAW,CAAkC;YACjD,MAAM;YACN,cAAc;gBAACQ;aAAkC;YACjD,UAAU,CAACN,UACA,OAAO,EAAEO,IAAI,EAAE;oBAClB,MAAMN,SAAS,MAAMD,QAAQ,OAAO,CAACO;oBACrC,IAAIN,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;QAER;QAEAH,QAAQ,WAAW,CAAoC;YACnD,MAAM;YACN,cAAc;gBAACU;aAAoC;YACnD,UAAU,CAACR,UACA,OAAO,EAAEO,IAAI,EAAE;oBAClB,MAAMN,SAAS,MAAMD,QAAQ,OAAO,CAACO;oBACrC,IAAIN,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;QAER;QAEAH,QAAQ,WAAW,CAAqC;YACpD,MAAM;YACN,cAAc;gBACVK;gBACAM;gBACAL;aACH;YACD,UAAU,CACNM,aACAC,gBACAN,SAEO,OAAO,EAAEE,IAAI,EAAE;oBAClB,MAAMK,gBAAgB,MAAMF,YAAY,OAAO;oBAC/C,IAAIE,cAAc,MAAM,IACpB,OAAO,IAAIC,cAAcD,cAAc,KAAK;oBAGhD,MAAME,YAAY,MAAMT,OAAO,OAAO,CAACE,KAAK,KAAK,EAAEK,cAAc,KAAK;oBACtE,MAAMX,SAAS,MAAMU,eAAe,OAAO,CAACG;oBAE5C,IAAIb,OAAO,MAAM,IACb,OAAO,IAAIY,cAAcZ,OAAO,KAAK;oBAGzC,OAAO,IAAIc,SAAS,MAAMV,OAAO,KAAK,CAACJ,OAAO,KAAK;gBACvD;QAER;QAEA,OAAOH;IACX;AACJ;AAEO,MAAMkB,oBAAoBC,yBAAyB,oBAAoB,CAAC;IAC3E,gBAAgBpB;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseJson } from "@webiny/utils/parseJson.js";
|
|
1
2
|
class LlmJsonResponse {
|
|
2
3
|
constructor(text){
|
|
3
4
|
this.text = text;
|
|
@@ -19,7 +20,7 @@ class LlmJsonResponse {
|
|
|
19
20
|
return JSON.parse(this.text);
|
|
20
21
|
}
|
|
21
22
|
toArray() {
|
|
22
|
-
const parsed =
|
|
23
|
+
const parsed = parseJson(this.text);
|
|
23
24
|
if (Array.isArray(parsed)) return parsed;
|
|
24
25
|
if (parsed && "object" == typeof parsed) {
|
|
25
26
|
const firstKey = Object.keys(parsed)[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain/LlmJsonResponse.js","sources":["../../src/domain/LlmJsonResponse.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"domain/LlmJsonResponse.js","sources":["../../src/domain/LlmJsonResponse.ts"],"sourcesContent":["import { parseJson } from \"@webiny/utils/parseJson.js\";\nexport class LlmJsonResponse {\n private constructor(private readonly text: string) {}\n\n static fromRawText(raw: string): LlmJsonResponse {\n let text = raw\n .replace(/^```(?:json)?\\s*\\n?/, \"\")\n .replace(/\\n?```\\s*$/, \"\")\n .trim();\n\n // Models that use tool calls sometimes emit a brief preamble before\n // the JSON (\"Now I have the images, here's the page:\") and/or trailing\n // prose after. Slice to the first `[`/`{` and the matching last\n // `]`/`}` so JSON.parse sees only the structured block.\n const startIdx = text.search(/[\\[{]/);\n if (startIdx > 0) {\n text = text.slice(startIdx);\n }\n if (text.startsWith(\"[\")) {\n const endIdx = text.lastIndexOf(\"]\");\n if (endIdx >= 0) {\n text = text.slice(0, endIdx + 1);\n }\n } else if (text.startsWith(\"{\")) {\n const endIdx = text.lastIndexOf(\"}\");\n if (endIdx >= 0) {\n text = text.slice(0, endIdx + 1);\n }\n }\n\n return new LlmJsonResponse(text);\n }\n\n toJSON<T = unknown>(): T {\n return JSON.parse(this.text);\n }\n\n toArray(): unknown[] {\n const parsed = parseJson(this.text);\n\n if (Array.isArray(parsed)) {\n return parsed;\n }\n\n if (parsed && typeof parsed === \"object\") {\n const firstKey = Object.keys(parsed)[0];\n if (firstKey && Array.isArray(parsed[firstKey])) {\n return parsed[firstKey];\n }\n }\n\n return [parsed];\n }\n\n toString(): string {\n return JSON.stringify(this.toArray());\n }\n}\n"],"names":["LlmJsonResponse","text","raw","startIdx","endIdx","JSON","parsed","parseJson","Array","firstKey","Object"],"mappings":";AACO,MAAMA;IACT,YAAqCC,IAAY,CAAE;aAAdA,IAAI,GAAJA;IAAe;IAEpD,OAAO,YAAYC,GAAW,EAAmB;QAC7C,IAAID,OAAOC,IACN,OAAO,CAAC,uBAAuB,IAC/B,OAAO,CAAC,cAAc,IACtB,IAAI;QAMT,MAAMC,WAAWF,KAAK,MAAM,CAAC;QAC7B,IAAIE,WAAW,GACXF,OAAOA,KAAK,KAAK,CAACE;QAEtB,IAAIF,KAAK,UAAU,CAAC,MAAM;YACtB,MAAMG,SAASH,KAAK,WAAW,CAAC;YAChC,IAAIG,UAAU,GACVH,OAAOA,KAAK,KAAK,CAAC,GAAGG,SAAS;QAEtC,OAAO,IAAIH,KAAK,UAAU,CAAC,MAAM;YAC7B,MAAMG,SAASH,KAAK,WAAW,CAAC;YAChC,IAAIG,UAAU,GACVH,OAAOA,KAAK,KAAK,CAAC,GAAGG,SAAS;QAEtC;QAEA,OAAO,IAAIJ,gBAAgBC;IAC/B;IAEA,SAAyB;QACrB,OAAOI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI;IAC/B;IAEA,UAAqB;QACjB,MAAMC,SAASC,UAAU,IAAI,CAAC,IAAI;QAElC,IAAIC,MAAM,OAAO,CAACF,SACd,OAAOA;QAGX,IAAIA,UAAU,AAAkB,YAAlB,OAAOA,QAAqB;YACtC,MAAMG,WAAWC,OAAO,IAAI,CAACJ,OAAO,CAAC,EAAE;YACvC,IAAIG,YAAYD,MAAM,OAAO,CAACF,MAAM,CAACG,SAAS,GAC1C,OAAOH,MAAM,CAACG,SAAS;QAE/B;QAEA,OAAO;YAACH;SAAO;IACnB;IAEA,WAAmB;QACf,OAAOD,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO;IACtC;AACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/ai-powerups",
|
|
3
|
-
"version": "6.5.1",
|
|
3
|
+
"version": "6.5.2-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"exports": {
|
|
@@ -18,42 +18,44 @@
|
|
|
18
18
|
"author": "Webiny Ltd.",
|
|
19
19
|
"license": "Webiny Enterprise",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@webiny/admin-ui": "6.5.1",
|
|
22
|
-
"@webiny/api-core": "6.5.1",
|
|
23
|
-
"@webiny/api-file-manager": "6.5.1",
|
|
24
|
-
"@webiny/api-headless-cms": "6.5.1",
|
|
25
|
-
"@webiny/api-website-builder": "6.5.1",
|
|
26
|
-
"@webiny/api-websockets": "6.5.1",
|
|
27
|
-
"@webiny/app": "6.5.1",
|
|
28
|
-
"@webiny/app-admin": "6.5.1",
|
|
29
|
-
"@webiny/app-headless-cms": "6.5.1",
|
|
30
|
-
"@webiny/app-website-builder": "6.5.1",
|
|
31
|
-
"@webiny/app-websockets": "6.5.1",
|
|
32
|
-
"@webiny/background-tasks": "6.5.1",
|
|
21
|
+
"@webiny/admin-ui": "6.5.2-beta.1",
|
|
22
|
+
"@webiny/api-core": "6.5.2-beta.1",
|
|
23
|
+
"@webiny/api-file-manager": "6.5.2-beta.1",
|
|
24
|
+
"@webiny/api-headless-cms": "6.5.2-beta.1",
|
|
25
|
+
"@webiny/api-website-builder": "6.5.2-beta.1",
|
|
26
|
+
"@webiny/api-websockets": "6.5.2-beta.1",
|
|
27
|
+
"@webiny/app": "6.5.2-beta.1",
|
|
28
|
+
"@webiny/app-admin": "6.5.2-beta.1",
|
|
29
|
+
"@webiny/app-headless-cms": "6.5.2-beta.1",
|
|
30
|
+
"@webiny/app-website-builder": "6.5.2-beta.1",
|
|
31
|
+
"@webiny/app-websockets": "6.5.2-beta.1",
|
|
32
|
+
"@webiny/background-tasks": "6.5.2-beta.1",
|
|
33
33
|
"@webiny/di": "1.1.0",
|
|
34
|
-
"@webiny/feature": "6.5.1",
|
|
35
|
-
"@webiny/icons": "6.5.1",
|
|
36
|
-
"@webiny/languages": "6.5.1",
|
|
37
|
-
"@webiny/lexical-converter": "6.5.1",
|
|
38
|
-
"@webiny/project": "6.5.1",
|
|
39
|
-
"@webiny/project-aws": "6.5.1",
|
|
40
|
-
"@webiny/utils": "6.5.1",
|
|
41
|
-
"ai": "7.0.
|
|
34
|
+
"@webiny/feature": "6.5.2-beta.1",
|
|
35
|
+
"@webiny/icons": "6.5.2-beta.1",
|
|
36
|
+
"@webiny/languages": "6.5.2-beta.1",
|
|
37
|
+
"@webiny/lexical-converter": "6.5.2-beta.1",
|
|
38
|
+
"@webiny/project": "6.5.2-beta.1",
|
|
39
|
+
"@webiny/project-aws": "6.5.2-beta.1",
|
|
40
|
+
"@webiny/utils": "6.5.2-beta.1",
|
|
41
|
+
"ai": "7.0.159",
|
|
42
42
|
"front-matter": "4.0.2",
|
|
43
43
|
"happy-dom": "21.0.4",
|
|
44
44
|
"lodash": "4.18.1",
|
|
45
|
-
"mobx": "7.1.
|
|
46
|
-
"mobx-react-lite": "5.1.
|
|
45
|
+
"mobx": "7.1.4",
|
|
46
|
+
"mobx-react-lite": "5.1.2",
|
|
47
47
|
"react": "18.3.1",
|
|
48
48
|
"react-dom": "18.3.1",
|
|
49
49
|
"zod": "4.6.7"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@webiny/
|
|
53
|
-
"@webiny/
|
|
54
|
-
"@webiny/handler
|
|
55
|
-
"@webiny/
|
|
56
|
-
"@webiny/
|
|
52
|
+
"@webiny/api": "6.5.2-beta.1",
|
|
53
|
+
"@webiny/build-tools": "6.5.2-beta.1",
|
|
54
|
+
"@webiny/handler": "6.5.2-beta.1",
|
|
55
|
+
"@webiny/handler-aws": "6.5.2-beta.1",
|
|
56
|
+
"@webiny/handler-graphql": "6.5.2-beta.1",
|
|
57
|
+
"@webiny/project-utils": "6.5.2-beta.1",
|
|
58
|
+
"@webiny/wcp": "6.5.2-beta.1",
|
|
57
59
|
"rimraf": "6.1.3",
|
|
58
60
|
"typescript": "7.0.2",
|
|
59
61
|
"vitest": "5.0.5"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Power-Ups permissions, shared by the API and the Admin app.
|
|
3
|
+
*
|
|
4
|
+
* Defined as a plain object, without either app's `createPermissionSchema`, so neither side
|
|
5
|
+
* pulls in the other's code. The literal types are kept by hand: the entity `id` drives the
|
|
6
|
+
* typed `canAccess("settings")`, and `scopes` must be a mutable array for the Admin app's types.
|
|
7
|
+
*
|
|
8
|
+
* Only the settings are gated. They hold the AI provider API keys, so viewing the masked keys and
|
|
9
|
+
* changing the settings needs `aiPowerups.settings`. Using the AI features needs a logged-in user.
|
|
10
|
+
*/
|
|
11
|
+
export declare const AI_POWERUPS_PERMISSIONS_SCHEMA: {
|
|
12
|
+
prefix: string;
|
|
13
|
+
fullAccess: boolean;
|
|
14
|
+
entities: {
|
|
15
|
+
id: "settings";
|
|
16
|
+
title: string;
|
|
17
|
+
permission: string;
|
|
18
|
+
scopes: "full"[];
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const AI_POWERUPS_PERMISSIONS_SCHEMA = {
|
|
2
|
+
prefix: "aiPowerups",
|
|
3
|
+
fullAccess: true,
|
|
4
|
+
entities: [
|
|
5
|
+
{
|
|
6
|
+
id: "settings",
|
|
7
|
+
title: "Settings",
|
|
8
|
+
permission: "aiPowerups.settings",
|
|
9
|
+
scopes: [
|
|
10
|
+
"full"
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
export { AI_POWERUPS_PERMISSIONS_SCHEMA };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=permissionsSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared/permissionsSchema.js","sources":["../../src/shared/permissionsSchema.ts"],"sourcesContent":["/**\n * AI Power-Ups permissions, shared by the API and the Admin app.\n *\n * Defined as a plain object, without either app's `createPermissionSchema`, so neither side\n * pulls in the other's code. The literal types are kept by hand: the entity `id` drives the\n * typed `canAccess(\"settings\")`, and `scopes` must be a mutable array for the Admin app's types.\n *\n * Only the settings are gated. They hold the AI provider API keys, so viewing the masked keys and\n * changing the settings needs `aiPowerups.settings`. Using the AI features needs a logged-in user.\n */\nexport const AI_POWERUPS_PERMISSIONS_SCHEMA = {\n prefix: \"aiPowerups\",\n fullAccess: true,\n entities: [\n {\n id: \"settings\" as const,\n title: \"Settings\",\n permission: \"aiPowerups.settings\",\n scopes: [\"full\" as const]\n }\n ]\n};\n"],"names":["AI_POWERUPS_PERMISSIONS_SCHEMA"],"mappings":"AAUO,MAAMA,iCAAiC;IAC1C,QAAQ;IACR,YAAY;IACZ,UAAU;QACN;YACI,IAAI;YACJ,OAAO;YACP,YAAY;YACZ,QAAQ;gBAAC;aAAgB;QAC7B;KACH;AACL"}
|