@mvriu5/payload-ai 0.5.9 → 1.1.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.
Files changed (73) hide show
  1. package/README.md +62 -6
  2. package/dist/ai/{proposals.d.ts → proposalSigning.d.ts} +1 -1
  3. package/dist/ai/{proposals.js → proposalSigning.js} +6 -11
  4. package/dist/ai/providerOptions.d.ts +17 -1
  5. package/dist/ai/providerOptions.js +35 -7
  6. package/dist/ai/providerRuntime.d.ts +2 -2
  7. package/dist/ai/providerRuntime.js +50 -16
  8. package/dist/ai/sensitiveData.js +2 -6
  9. package/dist/components/AIInput.d.ts +2 -1
  10. package/dist/components/AIInput.js +363 -135
  11. package/dist/components/AIInput.module.css +15 -1
  12. package/dist/components/APIKeyField.d.ts +3 -0
  13. package/dist/components/APIKeyField.js +63 -0
  14. package/dist/components/ActionToast.d.ts +30 -0
  15. package/dist/components/ActionToast.js +263 -0
  16. package/dist/components/AuditLogList.d.ts +32 -0
  17. package/dist/components/AuditLogList.js +104 -0
  18. package/dist/components/{RecentChangesList.module.css → AuditLogList.module.css} +18 -1
  19. package/dist/components/DiffDialog.d.ts +10 -3
  20. package/dist/components/DiffDialog.js +284 -97
  21. package/dist/components/DiffDialog.module.css +86 -2
  22. package/dist/components/Icons.d.ts +5 -0
  23. package/dist/components/Icons.js +436 -214
  24. package/dist/components/MentionPopover.d.ts +19 -0
  25. package/dist/components/MentionPopover.js +95 -0
  26. package/dist/components/{CollectionMentionPopover.module.css → MentionPopover.module.css} +0 -2
  27. package/dist/components/hooks/useAISettings.d.ts +6 -4
  28. package/dist/components/hooks/useAISettings.js +18 -3
  29. package/dist/components/hooks/useDocumentMentionSuggestions.d.ts +3 -3
  30. package/dist/components/hooks/useDocumentMentionSuggestions.js +2 -2
  31. package/dist/exports/client.d.ts +4 -2
  32. package/dist/exports/client.js +4 -2
  33. package/dist/handlers/applyActionHandler.d.ts +8 -0
  34. package/dist/handlers/applyActionHandler.js +563 -0
  35. package/dist/handlers/auditLogHandler.d.ts +6 -0
  36. package/dist/{endpoints/aiRecentChangesEndpointHandler.js → handlers/auditLogHandler.js} +12 -8
  37. package/dist/handlers/chatHandler.d.ts +42 -0
  38. package/dist/handlers/chatHandler.js +721 -0
  39. package/dist/handlers/mentionSuggestionHandler.d.ts +7 -0
  40. package/dist/handlers/mentionSuggestionHandler.js +97 -0
  41. package/dist/handlers/proposalDiffHandler.d.ts +7 -0
  42. package/dist/handlers/proposalDiffHandler.js +208 -0
  43. package/dist/index.d.ts +6 -6
  44. package/dist/index.js +52 -20
  45. package/dist/payload/collectionPermissions.d.ts +14 -13
  46. package/dist/payload/collectionPermissions.js +3 -2
  47. package/dist/payload/normalizeData.d.ts +8 -0
  48. package/dist/payload/normalizeData.js +25 -3
  49. package/dist/payload/schemaContext.d.ts +43 -16
  50. package/dist/payload/schemaContext.js +139 -18
  51. package/dist/payload/shared.d.ts +33 -0
  52. package/dist/payload/shared.js +114 -0
  53. package/package.json +45 -9
  54. package/dist/components/AIActionProposalList.d.ts +0 -26
  55. package/dist/components/AIActionProposalList.js +0 -162
  56. package/dist/components/AIApiKeyField.d.ts +0 -2
  57. package/dist/components/AIApiKeyField.js +0 -47
  58. package/dist/components/CollectionMentionPopover.d.ts +0 -16
  59. package/dist/components/CollectionMentionPopover.js +0 -77
  60. package/dist/components/RecentChangesList.d.ts +0 -18
  61. package/dist/components/RecentChangesList.js +0 -66
  62. package/dist/components/hooks/utils.d.ts +0 -1
  63. package/dist/components/hooks/utils.js +0 -3
  64. package/dist/endpoints/aiApplyActionEndpointHandler.d.ts +0 -8
  65. package/dist/endpoints/aiApplyActionEndpointHandler.js +0 -365
  66. package/dist/endpoints/aiChatEndpointHandler.d.ts +0 -35
  67. package/dist/endpoints/aiChatEndpointHandler.js +0 -382
  68. package/dist/endpoints/aiMentionSuggestionsEndpointHandler.d.ts +0 -7
  69. package/dist/endpoints/aiMentionSuggestionsEndpointHandler.js +0 -63
  70. package/dist/endpoints/aiProposalDiffEndpointHandler.d.ts +0 -7
  71. package/dist/endpoints/aiProposalDiffEndpointHandler.js +0 -138
  72. package/dist/endpoints/aiRecentChangesEndpointHandler.d.ts +0 -6
  73. /package/dist/components/{AIActionProposalList.module.css → ActionToast.module.css} +0 -0
@@ -0,0 +1,19 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { RefObject } from "react";
3
+ export type MentionOption = {
4
+ collection?: string;
5
+ id?: string;
6
+ isDefault?: boolean;
7
+ label: string;
8
+ parent?: string;
9
+ slug: string;
10
+ type: "block" | "collection" | "doc" | "global" | "locale";
11
+ };
12
+ type MentionPopoverProps = {
13
+ containerRef?: RefObject<HTMLDivElement | null>;
14
+ suggestions: MentionOption[];
15
+ onSelect: (suggestion: MentionOption) => void;
16
+ style?: CSSProperties;
17
+ };
18
+ export declare const MentionPopover: ({ containerRef, onSelect, style, suggestions }: MentionPopoverProps) => import("react").JSX.Element | null;
19
+ export {};
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import styles from "./MentionPopover.module.css";
3
+ const suggestionGroups = [
4
+ {
5
+ label: "Collections",
6
+ type: "collection"
7
+ },
8
+ {
9
+ label: "Documents",
10
+ type: "doc"
11
+ },
12
+ {
13
+ label: "Globals",
14
+ type: "global"
15
+ },
16
+ {
17
+ label: "Blocks",
18
+ type: "block"
19
+ },
20
+ {
21
+ label: "Locales",
22
+ type: "locale"
23
+ }
24
+ ];
25
+ const getSuggestionTitle = (suggestion)=>{
26
+ if (suggestion.type === "collection") return `@${suggestion.slug}`;
27
+ if (suggestion.type === "global") return `@${suggestion.slug}`;
28
+ if (suggestion.type === "block") return `@${suggestion.slug}`;
29
+ if (suggestion.type === "locale") return `@${suggestion.slug}`;
30
+ return suggestion.label;
31
+ };
32
+ const getSuggestionLabel = (suggestion)=>{
33
+ if (suggestion.type === "collection") return suggestion.label;
34
+ if (suggestion.type === "global") return "global";
35
+ if (suggestion.type === "block") return `${suggestion.parent} block`;
36
+ if (suggestion.type === "locale") return suggestion.isDefault ? "default locale" : "locale";
37
+ return `${suggestion.collection} item`;
38
+ };
39
+ export const MentionPopover = ({ containerRef, onSelect, style, suggestions })=>{
40
+ if (suggestions.length === 0) return null;
41
+ const onKeyDown = (event, suggestion)=>{
42
+ if (event.key === "Enter" || event.key === " ") {
43
+ event.preventDefault();
44
+ onSelect(suggestion);
45
+ return;
46
+ }
47
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
48
+ const popover = event.currentTarget.closest(`.${styles.popover}`);
49
+ if (!popover) return;
50
+ const buttons = Array.from(popover.querySelectorAll("button"));
51
+ const currentIndex = buttons.indexOf(event.currentTarget);
52
+ if (currentIndex === -1) return;
53
+ event.preventDefault();
54
+ const nextIndex = event.key === "ArrowDown" ? Math.min(currentIndex + 1, buttons.length - 1) : Math.max(currentIndex - 1, 0);
55
+ buttons[nextIndex]?.focus();
56
+ };
57
+ const onMouseDown = (event, suggestion)=>{
58
+ event.preventDefault();
59
+ onSelect(suggestion);
60
+ };
61
+ return /*#__PURE__*/ _jsx("div", {
62
+ className: styles.popover,
63
+ ref: containerRef,
64
+ style: style,
65
+ children: suggestionGroups.map((group)=>{
66
+ const groupSuggestions = suggestions.filter((s)=>s.type === group.type);
67
+ if (groupSuggestions.length === 0) return null;
68
+ return /*#__PURE__*/ _jsxs("div", {
69
+ className: styles.group,
70
+ children: [
71
+ /*#__PURE__*/ _jsx("div", {
72
+ className: styles.groupLabel,
73
+ children: group.label
74
+ }),
75
+ groupSuggestions.map((suggestion)=>/*#__PURE__*/ _jsxs("button", {
76
+ className: styles.option,
77
+ onMouseDown: (e)=>onMouseDown(e, suggestion),
78
+ onKeyDown: (e)=>onKeyDown(e, suggestion),
79
+ type: "button",
80
+ children: [
81
+ /*#__PURE__*/ _jsx("span", {
82
+ className: styles.slug,
83
+ children: getSuggestionTitle(suggestion)
84
+ }),
85
+ /*#__PURE__*/ _jsx("span", {
86
+ className: styles.label,
87
+ children: getSuggestionLabel(suggestion)
88
+ })
89
+ ]
90
+ }, `${suggestion.type}-${suggestion.slug}-${suggestion.parent || ""}-${suggestion.collection || ""}-${suggestion.id || ""}`))
91
+ ]
92
+ }, group.type);
93
+ })
94
+ });
95
+ };
@@ -3,14 +3,12 @@
3
3
  border: 1px solid var(--theme-elevation-150);
4
4
  border-radius: 6px;
5
5
  box-shadow: 0 8px 24px rgb(0 0 0 / 12%);
6
- left: 0;
7
6
  max-height: 220px;
8
7
  max-width: calc(100% - 96px);
9
8
  min-width: 260px;
10
9
  overflow: auto;
11
10
  padding: 6px;
12
11
  position: absolute;
13
- top: calc(100% + 6px);
14
12
  z-index: 10;
15
13
  }
16
14
 
@@ -1,10 +1,12 @@
1
1
  import { type AIProvider } from "../../ai/providerOptions.js";
2
- export declare const useAISettings: ({ adminUserSlug, apiRoute, defaultModels, }: {
2
+ interface UseAISettingsOptions {
3
3
  adminUserSlug?: string;
4
4
  apiRoute: string;
5
5
  defaultModels: Record<AIProvider, string>;
6
- }) => {
6
+ }
7
+ export declare const useAISettings: ({ adminUserSlug, apiRoute, defaultModels }: UseAISettingsOptions) => {
7
8
  selectedModel: string;
8
- setSelectedModel: import("react").Dispatch<import("react").SetStateAction<string>>;
9
- settingsProvider: "claude" | "google" | "mistral" | "openai" | null;
9
+ setSelectedModel: (model: string) => void;
10
+ settingsProvider: "claude" | "google" | "mistral" | "openai" | "openrouter" | null;
10
11
  };
12
+ export {};
@@ -2,10 +2,25 @@
2
2
  import { formatAdminURL } from "payload/shared";
3
3
  import { useEffect, useState } from "react";
4
4
  import { isAIProvider } from "../../ai/providerOptions.js";
5
- import { isAbortError } from "./utils.js";
5
+ import { isAbortError } from "../../payload/shared.js";
6
+ const getStoredModelKey = (provider)=>`payload-ai:selected-model:${provider}`;
7
+ const getStoredModel = (provider)=>{
8
+ if (typeof window === "undefined") return null;
9
+ return window.localStorage.getItem(getStoredModelKey(provider));
10
+ };
11
+ const storeModel = (provider, model)=>{
12
+ if (typeof window === "undefined") return;
13
+ window.localStorage.setItem(getStoredModelKey(provider), model);
14
+ };
6
15
  export const useAISettings = ({ adminUserSlug, apiRoute, defaultModels })=>{
7
16
  const [settingsProvider, setSettingsProvider] = useState(null);
8
17
  const [selectedModel, setSelectedModel] = useState("");
18
+ const setStoredSelectedModel = (model)=>{
19
+ setSelectedModel(model);
20
+ if (settingsProvider && model) {
21
+ storeModel(settingsProvider, model);
22
+ }
23
+ };
9
24
  useEffect(()=>{
10
25
  if (!adminUserSlug) {
11
26
  setSettingsProvider(null);
@@ -34,7 +49,7 @@ export const useAISettings = ({ adminUserSlug, apiRoute, defaultModels })=>{
34
49
  return;
35
50
  }
36
51
  setSettingsProvider(provider);
37
- setSelectedModel(defaultModels[provider]);
52
+ setSelectedModel(getStoredModel(provider) || defaultModels[provider]);
38
53
  } catch (err) {
39
54
  if (isAbortError(err)) return;
40
55
  setSettingsProvider(null);
@@ -50,7 +65,7 @@ export const useAISettings = ({ adminUserSlug, apiRoute, defaultModels })=>{
50
65
  ]);
51
66
  return {
52
67
  selectedModel,
53
- setSelectedModel,
68
+ setSelectedModel: setStoredSelectedModel,
54
69
  settingsProvider
55
70
  };
56
71
  };
@@ -1,4 +1,4 @@
1
- import type { CollectionMentionOption } from "../CollectionMentionPopover.js";
1
+ import type { MentionOption } from "../MentionPopover.js";
2
2
  type MentionRange = {
3
3
  end: number;
4
4
  start: number;
@@ -9,8 +9,8 @@ interface DocumentMentionSuggestions {
9
9
  mentionQuery: string;
10
10
  mentionRange: MentionRange | null;
11
11
  }
12
- export declare const useDocumentMentionSuggestions: ({ apiRoute, documentSuggestionCollection, mentionQuery, mentionRange, }: DocumentMentionSuggestions) => {
13
- documentSuggestions: CollectionMentionOption[];
12
+ export declare const useDocumentMentionSuggestions: ({ apiRoute, documentSuggestionCollection, mentionQuery, mentionRange }: DocumentMentionSuggestions) => {
13
+ documentSuggestions: MentionOption[];
14
14
  resetDocumentSuggestions: () => void;
15
15
  };
16
16
  export {};
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { formatAdminURL } from "payload/shared";
3
3
  import { useEffect, useState } from "react";
4
- import { isAbortError } from "./utils.js";
4
+ import { isAbortError } from "../../payload/shared.js";
5
5
  export const useDocumentMentionSuggestions = ({ apiRoute, documentSuggestionCollection, mentionQuery, mentionRange })=>{
6
6
  const [documentSuggestions, setDocumentSuggestions] = useState([]);
7
7
  useEffect(()=>{
@@ -15,7 +15,7 @@ export const useDocumentMentionSuggestions = ({ apiRoute, documentSuggestionColl
15
15
  try {
16
16
  const res = await fetch(formatAdminURL({
17
17
  apiRoute,
18
- path: "/ai-mention-suggestions"
18
+ path: "/ai-mention-suggestion"
19
19
  }), {
20
20
  body: JSON.stringify({
21
21
  collectionSlug: documentSuggestionCollection,
@@ -1,2 +1,4 @@
1
- export { AIInput } from "../components/AIInput.js";
2
- export { AIApiKeyField } from "../components/AIApiKeyField.js";
1
+ import AIInput from "../components/AIInput.js";
2
+ import APIKeyField from "../components/APIKeyField.js";
3
+ export { AIInput };
4
+ export { APIKeyField as AIApiKeyField };
@@ -1,2 +1,4 @@
1
- export { AIInput } from "../components/AIInput.js";
2
- export { AIApiKeyField } from "../components/AIApiKeyField.js";
1
+ import AIInput from "../components/AIInput.js";
2
+ import APIKeyField from "../components/APIKeyField.js";
3
+ export { AIInput };
4
+ export { APIKeyField as AIApiKeyField };
@@ -0,0 +1,8 @@
1
+ import type { PayloadHandler } from "payload";
2
+ import { type ResolvedCollectionPermissionMap } from "../payload/collectionPermissions.js";
3
+ type ApplyActionOptions = {
4
+ changeLogCollection?: string;
5
+ collections?: ResolvedCollectionPermissionMap;
6
+ };
7
+ export declare const createApplyActionHandler: (options?: ApplyActionOptions) => PayloadHandler;
8
+ export {};