@automattic/jetpack-ai-client 0.14.6 → 0.15.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/CHANGELOG.md +8 -0
- package/build/ask-question/sync.d.ts +2 -8
- package/build/ask-question/sync.js +20 -19
- package/build/hooks/use-image-generator/index.js +1 -1
- package/build/hooks/use-save-to-media-library/index.d.ts +12 -0
- package/build/hooks/use-save-to-media-library/index.js +74 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +5 -0
- package/build/libs/index.d.ts +1 -1
- package/build/libs/index.js +1 -1
- package/build/libs/markdown/index.d.ts +2 -2
- package/build/libs/markdown/index.js +2 -2
- package/build/libs/markdown/markdown-to-html.d.ts +8 -1
- package/build/libs/markdown/markdown-to-html.js +10 -1
- package/build/logo-generator/assets/icons/ai.d.ts +6 -0
- package/build/logo-generator/assets/icons/ai.js +8 -0
- package/build/logo-generator/assets/icons/check.d.ts +6 -0
- package/build/logo-generator/assets/icons/check.js +8 -0
- package/build/logo-generator/assets/icons/logo.d.ts +6 -0
- package/build/logo-generator/assets/icons/logo.js +8 -0
- package/build/logo-generator/assets/icons/media.d.ts +6 -0
- package/build/logo-generator/assets/icons/media.js +8 -0
- package/build/logo-generator/components/feature-fetch-failure-screen.d.ts +8 -0
- package/build/logo-generator/components/feature-fetch-failure-screen.js +10 -0
- package/build/logo-generator/components/first-load-screen.d.ts +5 -0
- package/build/logo-generator/components/first-load-screen.js +16 -0
- package/build/logo-generator/components/generator-modal.d.ts +7 -0
- package/build/logo-generator/components/generator-modal.js +184 -0
- package/build/logo-generator/components/history-carousel.d.ts +6 -0
- package/build/logo-generator/components/history-carousel.js +36 -0
- package/build/logo-generator/components/image-loader.d.ts +7 -0
- package/build/logo-generator/components/image-loader.js +12 -0
- package/build/logo-generator/components/logo-presenter.d.ts +4 -0
- package/build/logo-generator/components/logo-presenter.js +106 -0
- package/build/logo-generator/components/prompt.d.ts +5 -0
- package/build/logo-generator/components/prompt.js +96 -0
- package/build/logo-generator/components/upgrade-nudge.d.ts +2 -0
- package/build/logo-generator/components/upgrade-nudge.js +30 -0
- package/build/logo-generator/components/upgrade-screen.d.ts +9 -0
- package/build/logo-generator/components/upgrade-screen.js +24 -0
- package/build/logo-generator/components/visit-site-banner.d.ts +10 -0
- package/build/logo-generator/components/visit-site-banner.js +16 -0
- package/build/logo-generator/constants.d.ts +16 -0
- package/build/logo-generator/constants.js +19 -0
- package/build/logo-generator/hooks/use-checkout.d.ts +4 -0
- package/build/logo-generator/hooks/use-checkout.js +26 -0
- package/build/logo-generator/hooks/use-logo-generator.d.ts +46 -0
- package/build/logo-generator/hooks/use-logo-generator.js +286 -0
- package/build/logo-generator/hooks/use-request-errors.d.ts +16 -0
- package/build/logo-generator/hooks/use-request-errors.js +46 -0
- package/build/logo-generator/index.d.ts +1 -0
- package/build/logo-generator/index.js +1 -0
- package/build/logo-generator/lib/logo-storage.d.ts +58 -0
- package/build/logo-generator/lib/logo-storage.js +123 -0
- package/build/logo-generator/lib/media-exists.d.ts +12 -0
- package/build/logo-generator/lib/media-exists.js +33 -0
- package/build/logo-generator/lib/set-site-logo.d.ts +13 -0
- package/build/logo-generator/lib/set-site-logo.js +26 -0
- package/build/logo-generator/lib/wpcom-limited-request.d.ts +7 -0
- package/build/logo-generator/lib/wpcom-limited-request.js +33 -0
- package/build/logo-generator/store/actions.d.ts +105 -0
- package/build/logo-generator/store/actions.js +193 -0
- package/build/logo-generator/store/constants.d.ts +44 -0
- package/build/logo-generator/store/constants.js +44 -0
- package/build/logo-generator/store/index.d.ts +1 -0
- package/build/logo-generator/store/index.js +19 -0
- package/build/logo-generator/store/initial-state.d.ts +3 -0
- package/build/logo-generator/store/initial-state.js +40 -0
- package/build/logo-generator/store/reducer.d.ts +347 -0
- package/build/logo-generator/store/reducer.js +293 -0
- package/build/logo-generator/store/selectors.d.ts +119 -0
- package/build/logo-generator/store/selectors.js +173 -0
- package/build/logo-generator/store/types.d.ts +164 -0
- package/build/logo-generator/store/types.js +1 -0
- package/build/logo-generator/types.d.ts +82 -0
- package/build/logo-generator/types.js +1 -0
- package/build/types.d.ts +6 -0
- package/package.json +5 -3
- package/src/ask-question/sync.ts +22 -27
- package/src/hooks/use-image-generator/index.ts +1 -1
- package/src/hooks/use-save-to-media-library/index.ts +95 -0
- package/src/index.ts +6 -0
- package/src/libs/index.ts +1 -0
- package/src/libs/markdown/index.ts +2 -2
- package/src/libs/markdown/markdown-to-html.ts +20 -3
- package/src/logo-generator/assets/icons/ai.tsx +21 -0
- package/src/logo-generator/assets/icons/check.tsx +23 -0
- package/src/logo-generator/assets/icons/icons.scss +5 -0
- package/src/logo-generator/assets/icons/logo.tsx +23 -0
- package/src/logo-generator/assets/icons/media.tsx +24 -0
- package/src/logo-generator/assets/images/jetpack-logo.svg +4 -0
- package/src/logo-generator/assets/images/loader.gif +0 -0
- package/src/logo-generator/assets/index.d.ts +3 -0
- package/src/logo-generator/components/feature-fetch-failure-screen.tsx +35 -0
- package/src/logo-generator/components/first-load-screen.scss +12 -0
- package/src/logo-generator/components/first-load-screen.tsx +32 -0
- package/src/logo-generator/components/generator-modal.scss +92 -0
- package/src/logo-generator/components/generator-modal.tsx +291 -0
- package/src/logo-generator/components/history-carousel.scss +36 -0
- package/src/logo-generator/components/history-carousel.tsx +57 -0
- package/src/logo-generator/components/image-loader.tsx +22 -0
- package/src/logo-generator/components/logo-presenter.scss +116 -0
- package/src/logo-generator/components/logo-presenter.tsx +234 -0
- package/src/logo-generator/components/prompt.scss +102 -0
- package/src/logo-generator/components/prompt.tsx +211 -0
- package/src/logo-generator/components/upgrade-nudge.scss +43 -0
- package/src/logo-generator/components/upgrade-nudge.tsx +58 -0
- package/src/logo-generator/components/upgrade-screen.tsx +67 -0
- package/src/logo-generator/components/visit-site-banner.scss +29 -0
- package/src/logo-generator/components/visit-site-banner.tsx +50 -0
- package/src/logo-generator/constants.ts +22 -0
- package/src/logo-generator/hooks/use-checkout.ts +37 -0
- package/src/logo-generator/hooks/use-logo-generator.ts +389 -0
- package/src/logo-generator/hooks/use-request-errors.ts +70 -0
- package/src/logo-generator/index.ts +1 -0
- package/src/logo-generator/lib/logo-storage.ts +166 -0
- package/src/logo-generator/lib/media-exists.ts +42 -0
- package/src/logo-generator/lib/set-site-logo.ts +32 -0
- package/src/logo-generator/lib/wpcom-limited-request.ts +41 -0
- package/src/logo-generator/store/actions.ts +251 -0
- package/src/logo-generator/store/constants.ts +49 -0
- package/src/logo-generator/store/index.ts +25 -0
- package/src/logo-generator/store/initial-state.ts +43 -0
- package/src/logo-generator/store/reducer.ts +387 -0
- package/src/logo-generator/store/selectors.ts +201 -0
- package/src/logo-generator/store/types.ts +207 -0
- package/src/logo-generator/types.ts +97 -0
- package/src/types.ts +8 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { AiFeatureProps, LogoGeneratorStateProp, Logo, RequestError } from './types.js';
|
|
2
|
+
import type { SiteDetails } from '../types.js';
|
|
3
|
+
declare const selectors: {
|
|
4
|
+
/**
|
|
5
|
+
* Return the AI Assistant feature.
|
|
6
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
7
|
+
* @returns {Partial<AiFeatureProps>} The AI Assistant feature data.
|
|
8
|
+
*/
|
|
9
|
+
getAiAssistantFeature(state: LogoGeneratorStateProp): Partial<AiFeatureProps>;
|
|
10
|
+
/**
|
|
11
|
+
* Return the site details.
|
|
12
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
13
|
+
* @returns {Partial<SiteDetails> | undefined} The site details.
|
|
14
|
+
*/
|
|
15
|
+
getSiteDetails(state: LogoGeneratorStateProp): Partial<SiteDetails> | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Get the isRequesting flag for the AI Assistant feature.
|
|
18
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
19
|
+
* @returns {boolean} The isRequesting flag.
|
|
20
|
+
*/
|
|
21
|
+
getIsRequestingAiAssistantFeature(state: LogoGeneratorStateProp): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get the logos history.
|
|
24
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
25
|
+
* @returns {Array<Logo>} The logos history array.
|
|
26
|
+
*/
|
|
27
|
+
getLogos(state: LogoGeneratorStateProp): Array<Logo>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the selected logo index.
|
|
30
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
31
|
+
* @returns {number | null} The selected logo index.
|
|
32
|
+
*/
|
|
33
|
+
getSelectedLogoIndex(state: LogoGeneratorStateProp): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Get the selected logo.
|
|
36
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
37
|
+
* @returns {Logo} The selected logo.
|
|
38
|
+
*/
|
|
39
|
+
getSelectedLogo(state: LogoGeneratorStateProp): Logo;
|
|
40
|
+
/**
|
|
41
|
+
* Get the isSavingToLibrary flag.
|
|
42
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
43
|
+
* @returns {boolean} The isSavingToLibrary flag.
|
|
44
|
+
*/
|
|
45
|
+
getIsSavingLogoToLibrary(state: LogoGeneratorStateProp): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get the isApplyingLogo flag.
|
|
48
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
49
|
+
* @returns {boolean} The isApplyingLogo flag.
|
|
50
|
+
*/
|
|
51
|
+
getIsApplyingLogo(state: LogoGeneratorStateProp): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get the isEnhancingPrompt flag.
|
|
54
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
55
|
+
* @returns {boolean} The isEnhancingPrompt flag.
|
|
56
|
+
*/
|
|
57
|
+
getIsEnhancingPrompt(state: LogoGeneratorStateProp): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get the isRequestingImage flag.
|
|
60
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
61
|
+
* @returns {boolean} The isRequestingImage flag.
|
|
62
|
+
*/
|
|
63
|
+
getIsRequestingImage(state: LogoGeneratorStateProp): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Get an aggregated isBusy flag, based on the loading states of the app.
|
|
66
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
67
|
+
* @returns {boolean} The isBusy flag.
|
|
68
|
+
*/
|
|
69
|
+
getIsBusy(state: LogoGeneratorStateProp): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get the requireUpgrade value from aiAssistantFeature
|
|
72
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
73
|
+
* @returns {boolean} The requireUpgrade flag.
|
|
74
|
+
*/
|
|
75
|
+
getRequireUpgrade(state: LogoGeneratorStateProp): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Get the featureFetchError value.
|
|
78
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
79
|
+
* @returns {RequestError} The featureFetchError value.
|
|
80
|
+
*/
|
|
81
|
+
getFeatureFetchError(state: LogoGeneratorStateProp): RequestError;
|
|
82
|
+
/**
|
|
83
|
+
* Get the firstLogoPromptFetchError value.
|
|
84
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
85
|
+
* @returns {RequestError} The firstLogoPromptFetchError value.
|
|
86
|
+
*/
|
|
87
|
+
getFirstLogoPromptFetchError(state: LogoGeneratorStateProp): RequestError;
|
|
88
|
+
/**
|
|
89
|
+
* Get the enhancePromptFetchError value.
|
|
90
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
91
|
+
* @returns {RequestError} The enhancePromptFetchError value.
|
|
92
|
+
*/
|
|
93
|
+
getEnhancePromptFetchError(state: LogoGeneratorStateProp): RequestError;
|
|
94
|
+
/**
|
|
95
|
+
* Get the logoFetchError value.
|
|
96
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
97
|
+
* @returns {RequestError} The logoFetchError value.
|
|
98
|
+
*/
|
|
99
|
+
getLogoFetchError(state: LogoGeneratorStateProp): RequestError;
|
|
100
|
+
/**
|
|
101
|
+
* Get the saveToLibraryError value.
|
|
102
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
103
|
+
* @returns {RequestError} The saveToLibraryError value.
|
|
104
|
+
*/
|
|
105
|
+
getSaveToLibraryError(state: LogoGeneratorStateProp): RequestError;
|
|
106
|
+
/**
|
|
107
|
+
* Get the logoUpdateError value.
|
|
108
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
109
|
+
* @returns {RequestError} The logoUpdateError value.
|
|
110
|
+
*/
|
|
111
|
+
getLogoUpdateError(state: LogoGeneratorStateProp): RequestError;
|
|
112
|
+
/**
|
|
113
|
+
* Get the context value.
|
|
114
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
115
|
+
* @returns {string} The context value.
|
|
116
|
+
*/
|
|
117
|
+
getContext(state: LogoGeneratorStateProp): string;
|
|
118
|
+
};
|
|
119
|
+
export default selectors;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types
|
|
3
|
+
*/
|
|
4
|
+
import { DEFAULT_LOGO_COST } from '../constants.js';
|
|
5
|
+
const selectors = {
|
|
6
|
+
/**
|
|
7
|
+
* Return the AI Assistant feature.
|
|
8
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
9
|
+
* @returns {Partial<AiFeatureProps>} The AI Assistant feature data.
|
|
10
|
+
*/
|
|
11
|
+
getAiAssistantFeature(state) {
|
|
12
|
+
// Clean up the _meta property.
|
|
13
|
+
const data = { ...state.features.aiAssistantFeature };
|
|
14
|
+
delete data._meta;
|
|
15
|
+
return data;
|
|
16
|
+
},
|
|
17
|
+
/**
|
|
18
|
+
* Return the site details.
|
|
19
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
20
|
+
* @returns {Partial<SiteDetails> | undefined} The site details.
|
|
21
|
+
*/
|
|
22
|
+
getSiteDetails(state) {
|
|
23
|
+
return state.siteDetails;
|
|
24
|
+
},
|
|
25
|
+
/**
|
|
26
|
+
* Get the isRequesting flag for the AI Assistant feature.
|
|
27
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
28
|
+
* @returns {boolean} The isRequesting flag.
|
|
29
|
+
*/
|
|
30
|
+
getIsRequestingAiAssistantFeature(state) {
|
|
31
|
+
return state.features.aiAssistantFeature?._meta?.isRequesting ?? false;
|
|
32
|
+
},
|
|
33
|
+
/**
|
|
34
|
+
* Get the logos history.
|
|
35
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
36
|
+
* @returns {Array<Logo>} The logos history array.
|
|
37
|
+
*/
|
|
38
|
+
getLogos(state) {
|
|
39
|
+
return state.history ?? [];
|
|
40
|
+
},
|
|
41
|
+
/**
|
|
42
|
+
* Get the selected logo index.
|
|
43
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
44
|
+
* @returns {number | null} The selected logo index.
|
|
45
|
+
*/
|
|
46
|
+
getSelectedLogoIndex(state) {
|
|
47
|
+
return state.selectedLogoIndex ?? null;
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* Get the selected logo.
|
|
51
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
52
|
+
* @returns {Logo} The selected logo.
|
|
53
|
+
*/
|
|
54
|
+
getSelectedLogo(state) {
|
|
55
|
+
return state.history?.[state.selectedLogoIndex] ?? null;
|
|
56
|
+
},
|
|
57
|
+
/**
|
|
58
|
+
* Get the isSavingToLibrary flag.
|
|
59
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
60
|
+
* @returns {boolean} The isSavingToLibrary flag.
|
|
61
|
+
*/
|
|
62
|
+
getIsSavingLogoToLibrary(state) {
|
|
63
|
+
return state._meta?.isSavingLogoToLibrary ?? false;
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Get the isApplyingLogo flag.
|
|
67
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
68
|
+
* @returns {boolean} The isApplyingLogo flag.
|
|
69
|
+
*/
|
|
70
|
+
getIsApplyingLogo(state) {
|
|
71
|
+
return state._meta?.isApplyingLogo ?? false;
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* Get the isEnhancingPrompt flag.
|
|
75
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
76
|
+
* @returns {boolean} The isEnhancingPrompt flag.
|
|
77
|
+
*/
|
|
78
|
+
getIsEnhancingPrompt(state) {
|
|
79
|
+
return state._meta?.isEnhancingPrompt ?? false;
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Get the isRequestingImage flag.
|
|
83
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
84
|
+
* @returns {boolean} The isRequestingImage flag.
|
|
85
|
+
*/
|
|
86
|
+
getIsRequestingImage(state) {
|
|
87
|
+
return state._meta?.isRequestingImage ?? false;
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* Get an aggregated isBusy flag, based on the loading states of the app.
|
|
91
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
92
|
+
* @returns {boolean} The isBusy flag.
|
|
93
|
+
*/
|
|
94
|
+
getIsBusy(state) {
|
|
95
|
+
return (selectors.getIsApplyingLogo(state) ||
|
|
96
|
+
selectors.getIsSavingLogoToLibrary(state) ||
|
|
97
|
+
selectors.getIsRequestingImage(state) ||
|
|
98
|
+
selectors.getIsEnhancingPrompt(state));
|
|
99
|
+
},
|
|
100
|
+
/**
|
|
101
|
+
* Get the requireUpgrade value from aiAssistantFeature
|
|
102
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
103
|
+
* @returns {boolean} The requireUpgrade flag.
|
|
104
|
+
*/
|
|
105
|
+
getRequireUpgrade(state) {
|
|
106
|
+
const feature = state.features.aiAssistantFeature;
|
|
107
|
+
const logoCost = feature?.costs?.['jetpack-ai-logo-generator']?.logo ?? DEFAULT_LOGO_COST;
|
|
108
|
+
const currentLimit = feature?.currentTier?.value || 0;
|
|
109
|
+
const currentUsage = feature?.usagePeriod?.requestsCount || 0;
|
|
110
|
+
const isUnlimited = currentLimit === 1;
|
|
111
|
+
const hasNoNextTier = !feature?.nextTier; // If there is no next tier, the user cannot upgrade.
|
|
112
|
+
// Add a local check on top of the feature flag, based on the current usage and logo cost.
|
|
113
|
+
return (state.features.aiAssistantFeature?.requireUpgrade ||
|
|
114
|
+
(!isUnlimited && !hasNoNextTier && currentLimit - currentUsage < logoCost));
|
|
115
|
+
},
|
|
116
|
+
/**
|
|
117
|
+
* Get the featureFetchError value.
|
|
118
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
119
|
+
* @returns {RequestError} The featureFetchError value.
|
|
120
|
+
*/
|
|
121
|
+
getFeatureFetchError(state) {
|
|
122
|
+
return state._meta?.featureFetchError ?? null;
|
|
123
|
+
},
|
|
124
|
+
/**
|
|
125
|
+
* Get the firstLogoPromptFetchError value.
|
|
126
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
127
|
+
* @returns {RequestError} The firstLogoPromptFetchError value.
|
|
128
|
+
*/
|
|
129
|
+
getFirstLogoPromptFetchError(state) {
|
|
130
|
+
return state._meta?.firstLogoPromptFetchError ?? null;
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Get the enhancePromptFetchError value.
|
|
134
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
135
|
+
* @returns {RequestError} The enhancePromptFetchError value.
|
|
136
|
+
*/
|
|
137
|
+
getEnhancePromptFetchError(state) {
|
|
138
|
+
return state._meta?.enhancePromptFetchError ?? null;
|
|
139
|
+
},
|
|
140
|
+
/**
|
|
141
|
+
* Get the logoFetchError value.
|
|
142
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
143
|
+
* @returns {RequestError} The logoFetchError value.
|
|
144
|
+
*/
|
|
145
|
+
getLogoFetchError(state) {
|
|
146
|
+
return state._meta?.logoFetchError ?? null;
|
|
147
|
+
},
|
|
148
|
+
/**
|
|
149
|
+
* Get the saveToLibraryError value.
|
|
150
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
151
|
+
* @returns {RequestError} The saveToLibraryError value.
|
|
152
|
+
*/
|
|
153
|
+
getSaveToLibraryError(state) {
|
|
154
|
+
return state._meta?.saveToLibraryError ?? null;
|
|
155
|
+
},
|
|
156
|
+
/**
|
|
157
|
+
* Get the logoUpdateError value.
|
|
158
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
159
|
+
* @returns {RequestError} The logoUpdateError value.
|
|
160
|
+
*/
|
|
161
|
+
getLogoUpdateError(state) {
|
|
162
|
+
return state._meta?.logoUpdateError ?? null;
|
|
163
|
+
},
|
|
164
|
+
/**
|
|
165
|
+
* Get the context value.
|
|
166
|
+
* @param {LogoGeneratorStateProp} state - The app state tree.
|
|
167
|
+
* @returns {string} The context value.
|
|
168
|
+
*/
|
|
169
|
+
getContext(state) {
|
|
170
|
+
return state._meta?.context ?? '';
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
export default selectors;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { SiteDetails } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Types for the AI Assistant feature.
|
|
4
|
+
*/
|
|
5
|
+
export type Plan = {
|
|
6
|
+
product_id: number;
|
|
7
|
+
product_name: string;
|
|
8
|
+
product_slug: string;
|
|
9
|
+
};
|
|
10
|
+
export type UpgradeTypeProp = 'vip' | 'default';
|
|
11
|
+
export type TierUnlimitedProps = {
|
|
12
|
+
slug: 'ai-assistant-tier-unlimited';
|
|
13
|
+
limit: 999999999;
|
|
14
|
+
value: 1;
|
|
15
|
+
readableLimit: string;
|
|
16
|
+
};
|
|
17
|
+
export type TierFreeProps = {
|
|
18
|
+
slug: 'ai-assistant-tier-free';
|
|
19
|
+
limit: 20;
|
|
20
|
+
value: 0;
|
|
21
|
+
};
|
|
22
|
+
export type Tier100Props = {
|
|
23
|
+
slug: 'ai-assistant-tier-100';
|
|
24
|
+
limit: 100;
|
|
25
|
+
value: 100;
|
|
26
|
+
};
|
|
27
|
+
export type Tier200Props = {
|
|
28
|
+
slug: 'ai-assistant-tier-200';
|
|
29
|
+
limit: 200;
|
|
30
|
+
value: 200;
|
|
31
|
+
};
|
|
32
|
+
export type Tier500Props = {
|
|
33
|
+
slug: 'ai-assistant-tier-500';
|
|
34
|
+
limit: 500;
|
|
35
|
+
value: 500;
|
|
36
|
+
};
|
|
37
|
+
export type Tier750Props = {
|
|
38
|
+
slug: 'ai-assistant-tier-750';
|
|
39
|
+
limit: 750;
|
|
40
|
+
value: 750;
|
|
41
|
+
};
|
|
42
|
+
export type Tier1000Props = {
|
|
43
|
+
slug: 'ai-assistant-tier-1000';
|
|
44
|
+
limit: 1000;
|
|
45
|
+
value: 1000;
|
|
46
|
+
};
|
|
47
|
+
export type TierProp = {
|
|
48
|
+
slug: TierSlugProp;
|
|
49
|
+
limit: TierLimitProp;
|
|
50
|
+
value: TierValueProp;
|
|
51
|
+
readableLimit?: string;
|
|
52
|
+
};
|
|
53
|
+
export type TierLimitProp = TierUnlimitedProps['limit'] | TierFreeProps['limit'] | Tier100Props['limit'] | Tier200Props['limit'] | Tier500Props['limit'] | Tier750Props['limit'] | Tier1000Props['limit'];
|
|
54
|
+
export type TierSlugProp = TierUnlimitedProps['slug'] | TierFreeProps['slug'] | Tier100Props['slug'] | Tier200Props['slug'] | Tier500Props['slug'] | Tier750Props['slug'] | Tier1000Props['slug'];
|
|
55
|
+
export type TierValueProp = TierUnlimitedProps['value'] | TierFreeProps['value'] | Tier100Props['value'] | Tier200Props['value'] | Tier500Props['value'] | Tier750Props['value'] | Tier1000Props['value'];
|
|
56
|
+
export type AiFeatureProps = {
|
|
57
|
+
hasFeature: boolean;
|
|
58
|
+
isOverLimit: boolean;
|
|
59
|
+
requestsCount: number;
|
|
60
|
+
requestsLimit: number;
|
|
61
|
+
requireUpgrade: boolean;
|
|
62
|
+
errorMessage?: string;
|
|
63
|
+
errorCode?: string;
|
|
64
|
+
upgradeType: UpgradeTypeProp;
|
|
65
|
+
currentTier?: TierProp;
|
|
66
|
+
usagePeriod?: {
|
|
67
|
+
currentStart: string;
|
|
68
|
+
nextStart: string;
|
|
69
|
+
requestsCount: number;
|
|
70
|
+
};
|
|
71
|
+
nextTier?: TierProp | null;
|
|
72
|
+
tierPlansEnabled?: boolean;
|
|
73
|
+
costs?: {
|
|
74
|
+
'jetpack-ai-logo-generator': {
|
|
75
|
+
logo: number;
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
export type AiFeatureStateProps = AiFeatureProps & {
|
|
80
|
+
_meta?: {
|
|
81
|
+
isRequesting: boolean;
|
|
82
|
+
asyncRequestCountdown: number;
|
|
83
|
+
asyncRequestTimerId: number;
|
|
84
|
+
isRequestingImage: boolean;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
export type Logo = {
|
|
88
|
+
url: string;
|
|
89
|
+
description: string;
|
|
90
|
+
mediaId?: number;
|
|
91
|
+
};
|
|
92
|
+
export type RequestError = string | Error | null;
|
|
93
|
+
export type LogoGeneratorStateProp = {
|
|
94
|
+
_meta?: {
|
|
95
|
+
isSavingLogoToLibrary: boolean;
|
|
96
|
+
isApplyingLogo: boolean;
|
|
97
|
+
isRequestingImage: boolean;
|
|
98
|
+
isEnhancingPrompt: boolean;
|
|
99
|
+
featureFetchError?: RequestError;
|
|
100
|
+
firstLogoPromptFetchError?: RequestError;
|
|
101
|
+
enhancePromptFetchError?: RequestError;
|
|
102
|
+
logoFetchError?: RequestError;
|
|
103
|
+
saveToLibraryError?: RequestError;
|
|
104
|
+
logoUpdateError?: RequestError;
|
|
105
|
+
context: string;
|
|
106
|
+
};
|
|
107
|
+
siteDetails?: SiteDetails | Record<string, never>;
|
|
108
|
+
features: {
|
|
109
|
+
aiAssistantFeature?: AiFeatureStateProps;
|
|
110
|
+
};
|
|
111
|
+
history: Array<Logo>;
|
|
112
|
+
selectedLogoIndex: number;
|
|
113
|
+
};
|
|
114
|
+
export type Selectors = {
|
|
115
|
+
getAiAssistantFeature(siteId?: string): Partial<AiFeatureProps>;
|
|
116
|
+
getIsRequestingAiAssistantFeature(): boolean;
|
|
117
|
+
getLogos(): Array<Logo>;
|
|
118
|
+
getSelectedLogoIndex(): number | null;
|
|
119
|
+
getSelectedLogo(): Logo;
|
|
120
|
+
getSiteDetails(): SiteDetails;
|
|
121
|
+
getIsSavingLogoToLibrary(): boolean;
|
|
122
|
+
getIsApplyingLogo(): boolean;
|
|
123
|
+
getIsRequestingImage(): boolean;
|
|
124
|
+
getIsEnhancingPrompt(): boolean;
|
|
125
|
+
getIsBusy(): boolean;
|
|
126
|
+
getRequireUpgrade(): boolean;
|
|
127
|
+
getFeatureFetchError(): RequestError;
|
|
128
|
+
getFirstLogoPromptFetchError(): RequestError;
|
|
129
|
+
getEnhancePromptFetchError(): RequestError;
|
|
130
|
+
getLogoFetchError(): RequestError;
|
|
131
|
+
getSaveToLibraryError(): RequestError;
|
|
132
|
+
getLogoUpdateError(): RequestError;
|
|
133
|
+
getContext(): string;
|
|
134
|
+
};
|
|
135
|
+
export type AiAssistantFeatureEndpointResponseProps = {
|
|
136
|
+
'is-enabled': boolean;
|
|
137
|
+
'has-feature': boolean;
|
|
138
|
+
'is-over-limit': boolean;
|
|
139
|
+
'requests-count': number;
|
|
140
|
+
'requests-limit': number;
|
|
141
|
+
'usage-period': {
|
|
142
|
+
'current-start': string;
|
|
143
|
+
'next-start': string;
|
|
144
|
+
'requests-count': number;
|
|
145
|
+
};
|
|
146
|
+
'site-require-upgrade': boolean;
|
|
147
|
+
'error-message'?: string;
|
|
148
|
+
'error-code'?: string;
|
|
149
|
+
'is-playground-visible'?: boolean;
|
|
150
|
+
'upgrade-type': UpgradeTypeProp;
|
|
151
|
+
'current-tier': TierProp;
|
|
152
|
+
'tier-plans': Array<TierProp>;
|
|
153
|
+
'next-tier'?: TierProp | null;
|
|
154
|
+
'tier-plans-enabled': boolean;
|
|
155
|
+
costs: {
|
|
156
|
+
'jetpack-ai-logo-generator': {
|
|
157
|
+
logo: number;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
export type SaveLogo = (logo: Logo) => Promise<{
|
|
162
|
+
mediaId: number;
|
|
163
|
+
mediaURL: string;
|
|
164
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types
|
|
3
|
+
*/
|
|
4
|
+
import type { Logo } from './store/types.js';
|
|
5
|
+
export type SiteDetails = {
|
|
6
|
+
ID: number;
|
|
7
|
+
URL: string;
|
|
8
|
+
domain: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
export interface GeneratorModalProps {
|
|
13
|
+
siteDetails?: SiteDetails;
|
|
14
|
+
isOpen: boolean;
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
context: string;
|
|
17
|
+
}
|
|
18
|
+
export interface LogoPresenterProps {
|
|
19
|
+
logo?: Logo;
|
|
20
|
+
loading?: boolean;
|
|
21
|
+
onApplyLogo: () => void;
|
|
22
|
+
logoAccepted?: boolean;
|
|
23
|
+
siteId: string | number;
|
|
24
|
+
}
|
|
25
|
+
export type SaveToMediaLibraryProps = {
|
|
26
|
+
siteId: string | number;
|
|
27
|
+
url: string;
|
|
28
|
+
attrs?: {
|
|
29
|
+
caption?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
title?: string;
|
|
32
|
+
alt?: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type SaveToMediaLibraryResponseProps = {
|
|
36
|
+
code: number;
|
|
37
|
+
media: [
|
|
38
|
+
{
|
|
39
|
+
ID: number;
|
|
40
|
+
URL: string;
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
};
|
|
44
|
+
export type CheckMediaProps = {
|
|
45
|
+
siteId: string | number;
|
|
46
|
+
mediaId: Logo['mediaId'];
|
|
47
|
+
};
|
|
48
|
+
export type SetSiteLogoProps = {
|
|
49
|
+
siteId: string | number;
|
|
50
|
+
imageId: string | number;
|
|
51
|
+
};
|
|
52
|
+
export type SetSiteLogoResponseProps = {
|
|
53
|
+
id: number;
|
|
54
|
+
url: string;
|
|
55
|
+
};
|
|
56
|
+
export type RequestTokenOptions = {
|
|
57
|
+
siteDetails?: SiteDetails;
|
|
58
|
+
isJetpackSite?: boolean;
|
|
59
|
+
expirationTime?: number;
|
|
60
|
+
};
|
|
61
|
+
export type TokenDataProps = {
|
|
62
|
+
token: string;
|
|
63
|
+
blogId: string | undefined;
|
|
64
|
+
expire: number;
|
|
65
|
+
};
|
|
66
|
+
export type TokenDataEndpointResponseProps = {
|
|
67
|
+
token: string;
|
|
68
|
+
blog_id: string;
|
|
69
|
+
};
|
|
70
|
+
export type SaveToStorageProps = Logo & {
|
|
71
|
+
siteId: string;
|
|
72
|
+
};
|
|
73
|
+
export type UpdateInStorageProps = {
|
|
74
|
+
siteId: string;
|
|
75
|
+
url: Logo['url'];
|
|
76
|
+
newUrl: Logo['url'];
|
|
77
|
+
mediaId: Logo['mediaId'];
|
|
78
|
+
};
|
|
79
|
+
export type RemoveFromStorageProps = {
|
|
80
|
+
mediaId: Logo['mediaId'];
|
|
81
|
+
siteId: string;
|
|
82
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/build/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as BlockEditorSelectors from '@wordpress/block-editor/store/selectors.js';
|
|
1
2
|
export declare const ERROR_SERVICE_UNAVAILABLE: "error_service_unavailable";
|
|
2
3
|
export declare const ERROR_QUOTA_EXCEEDED: "error_quota_exceeded";
|
|
3
4
|
export declare const ERROR_MODERATION: "error_moderation";
|
|
@@ -40,3 +41,8 @@ export type Block = {
|
|
|
40
41
|
};
|
|
41
42
|
export type TranscriptionState = RecordingState | 'validating' | 'processing' | 'error';
|
|
42
43
|
export type { RenderHTMLRules } from './libs/index.js';
|
|
44
|
+
export interface BlockEditorStore {
|
|
45
|
+
selectors: {
|
|
46
|
+
[key in keyof typeof BlockEditorSelectors]: (typeof BlockEditorSelectors)[key];
|
|
47
|
+
};
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"private": false,
|
|
3
3
|
"name": "@automattic/jetpack-ai-client",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.15.0",
|
|
5
5
|
"description": "A JS client for consuming Jetpack AI services",
|
|
6
6
|
"homepage": "https://github.com/Automattic/jetpack/tree/HEAD/projects/js-packages/ai-client/#readme",
|
|
7
7
|
"bugs": {
|
|
@@ -43,11 +43,13 @@
|
|
|
43
43
|
"types": "./build/index.d.ts",
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@automattic/jetpack-base-styles": "^0.6.28",
|
|
46
|
-
"@automattic/jetpack-connection": "^0.
|
|
47
|
-
"@automattic/jetpack-shared-extension-utils": "^0.14.
|
|
46
|
+
"@automattic/jetpack-connection": "^0.34.1",
|
|
47
|
+
"@automattic/jetpack-shared-extension-utils": "^0.14.19",
|
|
48
48
|
"@microsoft/fetch-event-source": "2.0.1",
|
|
49
49
|
"@types/react": "18.3.1",
|
|
50
|
+
"@types/wordpress__block-editor": "11.5.14",
|
|
50
51
|
"@wordpress/api-fetch": "7.2.0",
|
|
52
|
+
"@wordpress/blob": "4.2.0",
|
|
51
53
|
"@wordpress/block-editor": "13.2.0",
|
|
52
54
|
"@wordpress/components": "28.2.0",
|
|
53
55
|
"@wordpress/compose": "7.2.0",
|
package/src/ask-question/sync.ts
CHANGED
|
@@ -12,13 +12,7 @@ import type { PromptProp } from '../types.js';
|
|
|
12
12
|
/**
|
|
13
13
|
* The response data from the AI assistant when doing a sync, not-streamed question.
|
|
14
14
|
*/
|
|
15
|
-
export type ResponseData =
|
|
16
|
-
choices: Array< {
|
|
17
|
-
message: {
|
|
18
|
-
content: string;
|
|
19
|
-
};
|
|
20
|
-
} >;
|
|
21
|
-
};
|
|
15
|
+
export type ResponseData = string;
|
|
22
16
|
|
|
23
17
|
const debug = debugFactory( 'jetpack-ai-client:ask-question-sync' );
|
|
24
18
|
|
|
@@ -41,13 +35,9 @@ const debug = debugFactory( 'jetpack-ai-client:ask-question-sync' );
|
|
|
41
35
|
*/
|
|
42
36
|
export default async function askQuestionSync(
|
|
43
37
|
question: PromptProp,
|
|
44
|
-
|
|
38
|
+
options: AskQuestionOptionsArgProps = {}
|
|
45
39
|
): Promise< ResponseData > {
|
|
46
|
-
debug( 'Asking question with no streaming: %o. options: %o', question,
|
|
47
|
-
postId,
|
|
48
|
-
feature,
|
|
49
|
-
model,
|
|
50
|
-
} );
|
|
40
|
+
debug( 'Asking question with no streaming: %o. options: %o', question, options );
|
|
51
41
|
|
|
52
42
|
/**
|
|
53
43
|
* The URL to the AI assistant query endpoint.
|
|
@@ -63,12 +53,12 @@ export default async function askQuestionSync(
|
|
|
63
53
|
return Promise.reject( error );
|
|
64
54
|
}
|
|
65
55
|
|
|
56
|
+
const messages = Array.isArray( question ) ? { messages: question } : { question: question };
|
|
57
|
+
|
|
66
58
|
const body = {
|
|
67
|
-
|
|
59
|
+
...messages,
|
|
60
|
+
...options,
|
|
68
61
|
stream: false,
|
|
69
|
-
postId,
|
|
70
|
-
feature,
|
|
71
|
-
model,
|
|
72
62
|
};
|
|
73
63
|
|
|
74
64
|
const headers = {
|
|
@@ -76,16 +66,21 @@ export default async function askQuestionSync(
|
|
|
76
66
|
'Content-Type': 'application/json',
|
|
77
67
|
};
|
|
78
68
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
try {
|
|
70
|
+
const data = await fetch( URL, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers,
|
|
73
|
+
body: JSON.stringify( body ),
|
|
74
|
+
} ).then( response => response.json() );
|
|
84
75
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
if ( data?.data?.status && data?.data?.status > 200 ) {
|
|
77
|
+
debug( 'Error generating prompt: %o', data );
|
|
78
|
+
return Promise.reject( data );
|
|
79
|
+
}
|
|
89
80
|
|
|
90
|
-
|
|
81
|
+
return data.choices?.[ 0 ]?.message?.content as string;
|
|
82
|
+
} catch ( error ) {
|
|
83
|
+
debug( 'Error asking question: %o', error );
|
|
84
|
+
return Promise.reject( error );
|
|
85
|
+
}
|
|
91
86
|
}
|