@humaan/payload-plugin-ai-assistant 0.0.0-stage → 0.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 (190) hide show
  1. package/README.md +277 -2
  2. package/dist/admin/AiAssistantControl.d.ts +11 -0
  3. package/dist/admin/AiAssistantControl.js +31 -0
  4. package/dist/admin/AiAssistantControl.js.map +1 -0
  5. package/dist/admin/AiAssistantPanel.d.ts +10 -0
  6. package/dist/admin/AiAssistantPanel.js +208 -0
  7. package/dist/admin/AiAssistantPanel.js.map +1 -0
  8. package/dist/admin/AiAssistantPanel.module.scss +689 -0
  9. package/dist/admin/AiSourceSwitch.d.ts +13 -0
  10. package/dist/admin/AiSourceSwitch.js +14 -0
  11. package/dist/admin/AiSourceSwitch.js.map +1 -0
  12. package/dist/admin/BudgetField.d.ts +8 -0
  13. package/dist/admin/BudgetField.js +145 -0
  14. package/dist/admin/BudgetField.js.map +1 -0
  15. package/dist/admin/BudgetField.module.scss +47 -0
  16. package/dist/admin/Conversation.d.ts +12 -0
  17. package/dist/admin/Conversation.js +469 -0
  18. package/dist/admin/Conversation.js.map +1 -0
  19. package/dist/admin/Markdown.d.ts +9 -0
  20. package/dist/admin/Markdown.js +63 -0
  21. package/dist/admin/Markdown.js.map +1 -0
  22. package/dist/admin/PageContextBridge.d.ts +5 -0
  23. package/dist/admin/PageContextBridge.js +72 -0
  24. package/dist/admin/PageContextBridge.js.map +1 -0
  25. package/dist/admin/Pill.d.ts +11 -0
  26. package/dist/admin/Pill.js +27 -0
  27. package/dist/admin/Pill.js.map +1 -0
  28. package/dist/admin/PlanCard.d.ts +14 -0
  29. package/dist/admin/PlanCard.js +465 -0
  30. package/dist/admin/PlanCard.js.map +1 -0
  31. package/dist/admin/SettingsAlerts.d.ts +7 -0
  32. package/dist/admin/SettingsAlerts.js +37 -0
  33. package/dist/admin/SettingsAlerts.js.map +1 -0
  34. package/dist/admin/UsageSummary.d.ts +11 -0
  35. package/dist/admin/UsageSummary.js +129 -0
  36. package/dist/admin/UsageSummary.js.map +1 -0
  37. package/dist/admin/attachmentUpload.d.ts +25 -0
  38. package/dist/admin/attachmentUpload.js +76 -0
  39. package/dist/admin/attachmentUpload.js.map +1 -0
  40. package/dist/admin/openDocument.d.ts +13 -0
  41. package/dist/admin/openDocument.js +34 -0
  42. package/dist/admin/openDocument.js.map +1 -0
  43. package/dist/admin/percent.d.ts +10 -0
  44. package/dist/admin/percent.js +21 -0
  45. package/dist/admin/percent.js.map +1 -0
  46. package/dist/admin/threads.d.ts +21 -0
  47. package/dist/admin/threads.js +92 -0
  48. package/dist/admin/threads.js.map +1 -0
  49. package/dist/admin/toolSteps.d.ts +12 -0
  50. package/dist/admin/toolSteps.js +57 -0
  51. package/dist/admin/toolSteps.js.map +1 -0
  52. package/dist/admin/transport.d.ts +24 -0
  53. package/dist/admin/transport.js +75 -0
  54. package/dist/admin/transport.js.map +1 -0
  55. package/dist/admin/useAttachments.d.ts +32 -0
  56. package/dist/admin/useAttachments.js +91 -0
  57. package/dist/admin/useAttachments.js.map +1 -0
  58. package/dist/admin/useEntityLabel.d.ts +3 -0
  59. package/dist/admin/useEntityLabel.js +23 -0
  60. package/dist/admin/useEntityLabel.js.map +1 -0
  61. package/dist/attachments/collection.d.ts +15 -0
  62. package/dist/attachments/collection.js +90 -0
  63. package/dist/attachments/collection.js.map +1 -0
  64. package/dist/attachments/conversation.d.ts +25 -0
  65. package/dist/attachments/conversation.js +105 -0
  66. package/dist/attachments/conversation.js.map +1 -0
  67. package/dist/attachments/rules.d.ts +9 -0
  68. package/dist/attachments/rules.js +17 -0
  69. package/dist/attachments/rules.js.map +1 -0
  70. package/dist/attachments/store.d.ts +27 -0
  71. package/dist/attachments/store.js +187 -0
  72. package/dist/attachments/store.js.map +1 -0
  73. package/dist/billing.d.ts +60 -0
  74. package/dist/billing.js +116 -0
  75. package/dist/billing.js.map +1 -0
  76. package/dist/chat/history.d.ts +37 -0
  77. package/dist/chat/history.js +165 -0
  78. package/dist/chat/history.js.map +1 -0
  79. package/dist/chat/messages.d.ts +5 -0
  80. package/dist/chat/messages.js +3 -0
  81. package/dist/chat/messages.js.map +1 -0
  82. package/dist/chat/threads.d.ts +33 -0
  83. package/dist/chat/threads.js +77 -0
  84. package/dist/chat/threads.js.map +1 -0
  85. package/dist/chat/tools.d.ts +76 -0
  86. package/dist/chat/tools.js +596 -0
  87. package/dist/chat/tools.js.map +1 -0
  88. package/dist/chat/usage.d.ts +66 -0
  89. package/dist/chat/usage.js +219 -0
  90. package/dist/chat/usage.js.map +1 -0
  91. package/dist/collectionAccess.d.ts +6 -0
  92. package/dist/collectionAccess.js +32 -0
  93. package/dist/collectionAccess.js.map +1 -0
  94. package/dist/constants.d.ts +64 -0
  95. package/dist/constants.js +51 -0
  96. package/dist/constants.js.map +1 -0
  97. package/dist/endpoints/access.d.ts +4 -0
  98. package/dist/endpoints/access.js +28 -0
  99. package/dist/endpoints/access.js.map +1 -0
  100. package/dist/endpoints/allowance.d.ts +22 -0
  101. package/dist/endpoints/allowance.js +37 -0
  102. package/dist/endpoints/allowance.js.map +1 -0
  103. package/dist/endpoints/applyEndpoint.d.ts +12 -0
  104. package/dist/endpoints/applyEndpoint.js +170 -0
  105. package/dist/endpoints/applyEndpoint.js.map +1 -0
  106. package/dist/endpoints/budget.d.ts +30 -0
  107. package/dist/endpoints/budget.js +153 -0
  108. package/dist/endpoints/budget.js.map +1 -0
  109. package/dist/endpoints/chatEndpoint.d.ts +12 -0
  110. package/dist/endpoints/chatEndpoint.js +295 -0
  111. package/dist/endpoints/chatEndpoint.js.map +1 -0
  112. package/dist/endpoints/form.d.ts +23 -0
  113. package/dist/endpoints/form.js +95 -0
  114. package/dist/endpoints/form.js.map +1 -0
  115. package/dist/endpoints/usageEndpoint.d.ts +13 -0
  116. package/dist/endpoints/usageEndpoint.js +70 -0
  117. package/dist/endpoints/usageEndpoint.js.map +1 -0
  118. package/dist/index.d.ts +4 -0
  119. package/dist/index.js +5 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/lexical/editorConfig.d.ts +4 -0
  122. package/dist/lexical/editorConfig.js +19 -0
  123. package/dist/lexical/editorConfig.js.map +1 -0
  124. package/dist/lexical/lexicalToMarkdown.d.ts +10 -0
  125. package/dist/lexical/lexicalToMarkdown.js +10 -0
  126. package/dist/lexical/lexicalToMarkdown.js.map +1 -0
  127. package/dist/lexical/markdownToLexical.d.ts +7 -0
  128. package/dist/lexical/markdownToLexical.js +10 -0
  129. package/dist/lexical/markdownToLexical.js.map +1 -0
  130. package/dist/plan/allowed.d.ts +7 -0
  131. package/dist/plan/allowed.js +19 -0
  132. package/dist/plan/allowed.js.map +1 -0
  133. package/dist/plan/applyPlan.d.ts +16 -0
  134. package/dist/plan/applyPlan.js +353 -0
  135. package/dist/plan/applyPlan.js.map +1 -0
  136. package/dist/plan/catalogue.d.ts +37 -0
  137. package/dist/plan/catalogue.js +157 -0
  138. package/dist/plan/catalogue.js.map +1 -0
  139. package/dist/plan/diff.d.ts +13 -0
  140. package/dist/plan/diff.js +87 -0
  141. package/dist/plan/diff.js.map +1 -0
  142. package/dist/plan/parsePlan.d.ts +27 -0
  143. package/dist/plan/parsePlan.js +322 -0
  144. package/dist/plan/parsePlan.js.map +1 -0
  145. package/dist/plan/prompt.d.ts +1 -0
  146. package/dist/plan/prompt.js +45 -0
  147. package/dist/plan/prompt.js.map +1 -0
  148. package/dist/plan/stored.d.ts +53 -0
  149. package/dist/plan/stored.js +3 -0
  150. package/dist/plan/stored.js.map +1 -0
  151. package/dist/plan/tokens.d.ts +8 -0
  152. package/dist/plan/tokens.js +79 -0
  153. package/dist/plan/tokens.js.map +1 -0
  154. package/dist/plan/view.d.ts +4 -0
  155. package/dist/plan/view.js +43 -0
  156. package/dist/plan/view.js.map +1 -0
  157. package/dist/plugin.d.ts +3 -0
  158. package/dist/plugin.js +464 -0
  159. package/dist/plugin.js.map +1 -0
  160. package/dist/read/outline.d.ts +7 -0
  161. package/dist/read/outline.js +70 -0
  162. package/dist/read/outline.js.map +1 -0
  163. package/dist/read/readTarget.d.ts +4 -0
  164. package/dist/read/readTarget.js +13 -0
  165. package/dist/read/readTarget.js.map +1 -0
  166. package/dist/read/readable.d.ts +8 -0
  167. package/dist/read/readable.js +131 -0
  168. package/dist/read/readable.js.map +1 -0
  169. package/dist/runtime.d.ts +15 -0
  170. package/dist/runtime.js +14 -0
  171. package/dist/runtime.js.map +1 -0
  172. package/dist/schema/fields.d.ts +113 -0
  173. package/dist/schema/fields.js +1036 -0
  174. package/dist/schema/fields.js.map +1 -0
  175. package/dist/schema/listingFields.d.ts +9 -0
  176. package/dist/schema/listingFields.js +95 -0
  177. package/dist/schema/listingFields.js.map +1 -0
  178. package/dist/schema/slugify.d.ts +2 -0
  179. package/dist/schema/slugify.js +5 -0
  180. package/dist/schema/slugify.js.map +1 -0
  181. package/dist/settings.d.ts +10 -0
  182. package/dist/settings.js +54 -0
  183. package/dist/settings.js.map +1 -0
  184. package/dist/types.d.ts +198 -0
  185. package/dist/types.js +6 -0
  186. package/dist/types.js.map +1 -0
  187. package/dist/uploads/routeAsset.d.ts +27 -0
  188. package/dist/uploads/routeAsset.js +127 -0
  189. package/dist/uploads/routeAsset.js.map +1 -0
  190. package/package.json +122 -3
@@ -0,0 +1,131 @@
1
+ import { maxReadRichTextCharacters } from '../constants.js';
2
+ const noiseKeys = new Set([
3
+ 'createdAt',
4
+ 'sizes',
5
+ 'thumbnailURL',
6
+ 'updatedAt'
7
+ ]);
8
+ const maxListItems = 40;
9
+ const maxStringCharacters = 4_000;
10
+ const maxDepth = 12;
11
+ /**
12
+ * A document as the assistant reads it. Rich text becomes markdown, timestamps and image sizes are dropped,
13
+ * and long lists and strings are cut so one read cannot fill the model's context.
14
+ */ export async function readableDocument(fields, data, readRichText) {
15
+ return readFields(fields, data, readRichText, 0);
16
+ }
17
+ async function readFields(fields, data, read, depth) {
18
+ const out = plain(data, depth);
19
+ if (!isRecord(data) || !isRecord(out)) {
20
+ return out;
21
+ }
22
+ await readInto(fields, data, out, read, depth);
23
+ return out;
24
+ }
25
+ /** Fields without a name (rows, collapsibles, unnamed tabs and groups) keep their children at the same level. */ async function readInto(fields, data, out, read, depth) {
26
+ for (const field of fields){
27
+ if (field.type === 'tabs') {
28
+ for (const tab of field.tabs){
29
+ if ('name' in tab && tab.name) {
30
+ if (tab.name in data) {
31
+ out[tab.name] = await readFields(tab.fields, data[tab.name], read, depth + 1);
32
+ }
33
+ } else {
34
+ await readInto(tab.fields, data, out, read, depth);
35
+ }
36
+ }
37
+ continue;
38
+ }
39
+ const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined;
40
+ if (!name) {
41
+ if ('fields' in field && Array.isArray(field.fields)) {
42
+ await readInto(field.fields, data, out, read, depth);
43
+ }
44
+ continue;
45
+ }
46
+ if (name in data && !noiseKeys.has(name)) {
47
+ out[name] = await readField(field, data[name], read, depth + 1);
48
+ }
49
+ }
50
+ }
51
+ async function readField(field, value, read, depth) {
52
+ if (value === null || value === undefined || depth > maxDepth) {
53
+ return plain(value, depth);
54
+ }
55
+ if (field.type === 'richText') {
56
+ if (!isLexical(value)) {
57
+ return plain(value, depth);
58
+ }
59
+ try {
60
+ return cut((await read(field, value)).trim(), maxReadRichTextCharacters);
61
+ } catch {
62
+ return '[rich text that could not be read]';
63
+ }
64
+ }
65
+ if (field.type === 'group') {
66
+ return readFields(field.fields, value, read, depth);
67
+ }
68
+ if (field.type === 'array' && Array.isArray(value)) {
69
+ return readList(value, (row)=>readFields(field.fields, row, read, depth + 1));
70
+ }
71
+ if (field.type === 'blocks' && Array.isArray(value)) {
72
+ return readList(value, (row)=>{
73
+ const blockType = isRecord(row) ? row.blockType : undefined;
74
+ const block = field.blocks.find((item)=>item.slug === blockType);
75
+ return block ? readFields(block.fields, row, read, depth + 1) : Promise.resolve(plain(row, depth + 1));
76
+ });
77
+ }
78
+ return plain(value, depth);
79
+ }
80
+ async function readList(items, readItem) {
81
+ const shown = await Promise.all(items.slice(0, maxListItems).map(readItem));
82
+ const hidden = items.length - shown.length;
83
+ return hidden > 0 ? [
84
+ ...shown,
85
+ `[${hidden} more not shown]`
86
+ ] : shown;
87
+ }
88
+ /** A copy without noise keys, cut to size. Rich text with no field to read it by is left as a marker. */ function plain(value, depth) {
89
+ if (typeof value === 'string') {
90
+ return cut(value, maxStringCharacters);
91
+ }
92
+ if (depth > maxDepth) {
93
+ return '[nested too deeply to show]';
94
+ }
95
+ if (Array.isArray(value)) {
96
+ const shown = value.slice(0, maxListItems).map((item)=>plain(item, depth + 1));
97
+ const hidden = value.length - shown.length;
98
+ return hidden > 0 ? [
99
+ ...shown,
100
+ `[${hidden} more not shown]`
101
+ ] : shown;
102
+ }
103
+ if (!isRecord(value)) {
104
+ return value;
105
+ }
106
+ if (isLexical(value)) {
107
+ return '[rich text]';
108
+ }
109
+ const next = {};
110
+ for (const [key, item] of Object.entries(value)){
111
+ if (noiseKeys.has(key)) {
112
+ continue;
113
+ }
114
+ next[key] = plain(item, depth + 1);
115
+ }
116
+ return next;
117
+ }
118
+ function cut(value, limit) {
119
+ if (value.length <= limit) {
120
+ return value;
121
+ }
122
+ return `${value.slice(0, limit)} [cut: ${value.length - limit} more characters]`;
123
+ }
124
+ function isLexical(value) {
125
+ return isRecord(value) && isRecord(value.root);
126
+ }
127
+ function isRecord(value) {
128
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
129
+ }
130
+
131
+ //# sourceMappingURL=readable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/read/readable.ts"],"sourcesContent":["import type { Field, RichTextField } from 'payload'\n\nimport { maxReadRichTextCharacters } from '../constants.js'\n\n/** Turns one rich text value into markdown. Injected so the walk can be tested without a Payload config. */\nexport type RichTextReader = (\n field: RichTextField,\n value: Record<string, unknown>,\n) => Promise<string>\n\nconst noiseKeys = new Set(['createdAt', 'sizes', 'thumbnailURL', 'updatedAt'])\nconst maxListItems = 40\nconst maxStringCharacters = 4_000\nconst maxDepth = 12\n\n/**\n * A document as the assistant reads it. Rich text becomes markdown, timestamps and image sizes are dropped,\n * and long lists and strings are cut so one read cannot fill the model's context.\n */\nexport async function readableDocument(\n fields: Field[],\n data: unknown,\n readRichText: RichTextReader,\n): Promise<unknown> {\n return readFields(fields, data, readRichText, 0)\n}\n\nasync function readFields(\n fields: Field[],\n data: unknown,\n read: RichTextReader,\n depth: number,\n): Promise<unknown> {\n const out = plain(data, depth)\n if (!isRecord(data) || !isRecord(out)) {\n return out\n }\n await readInto(fields, data, out, read, depth)\n return out\n}\n\n/** Fields without a name (rows, collapsibles, unnamed tabs and groups) keep their children at the same level. */\nasync function readInto(\n fields: Field[],\n data: Record<string, unknown>,\n out: Record<string, unknown>,\n read: RichTextReader,\n depth: number,\n): Promise<void> {\n for (const field of fields) {\n if (field.type === 'tabs') {\n for (const tab of field.tabs) {\n if ('name' in tab && tab.name) {\n if (tab.name in data) {\n out[tab.name] = await readFields(tab.fields, data[tab.name], read, depth + 1)\n }\n } else {\n await readInto(tab.fields, data, out, read, depth)\n }\n }\n continue\n }\n const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined\n if (!name) {\n if ('fields' in field && Array.isArray(field.fields)) {\n await readInto(field.fields, data, out, read, depth)\n }\n continue\n }\n if (name in data && !noiseKeys.has(name)) {\n out[name] = await readField(field, data[name], read, depth + 1)\n }\n }\n}\n\nasync function readField(\n field: Field,\n value: unknown,\n read: RichTextReader,\n depth: number,\n): Promise<unknown> {\n if (value === null || value === undefined || depth > maxDepth) {\n return plain(value, depth)\n }\n\n if (field.type === 'richText') {\n if (!isLexical(value)) {\n return plain(value, depth)\n }\n try {\n return cut((await read(field, value)).trim(), maxReadRichTextCharacters)\n } catch {\n return '[rich text that could not be read]'\n }\n }\n if (field.type === 'group') {\n return readFields(field.fields, value, read, depth)\n }\n if (field.type === 'array' && Array.isArray(value)) {\n return readList(value, (row) => readFields(field.fields, row, read, depth + 1))\n }\n if (field.type === 'blocks' && Array.isArray(value)) {\n return readList(value, (row) => {\n const blockType = isRecord(row) ? row.blockType : undefined\n const block = field.blocks.find((item) => item.slug === blockType)\n return block\n ? readFields(block.fields, row, read, depth + 1)\n : Promise.resolve(plain(row, depth + 1))\n })\n }\n return plain(value, depth)\n}\n\nasync function readList(\n items: unknown[],\n readItem: (item: unknown) => Promise<unknown>,\n): Promise<unknown[]> {\n const shown = await Promise.all(items.slice(0, maxListItems).map(readItem))\n const hidden = items.length - shown.length\n return hidden > 0 ? [...shown, `[${hidden} more not shown]`] : shown\n}\n\n/** A copy without noise keys, cut to size. Rich text with no field to read it by is left as a marker. */\nfunction plain(value: unknown, depth: number): unknown {\n if (typeof value === 'string') {\n return cut(value, maxStringCharacters)\n }\n if (depth > maxDepth) {\n return '[nested too deeply to show]'\n }\n if (Array.isArray(value)) {\n const shown = value.slice(0, maxListItems).map((item) => plain(item, depth + 1))\n const hidden = value.length - shown.length\n return hidden > 0 ? [...shown, `[${hidden} more not shown]`] : shown\n }\n if (!isRecord(value)) {\n return value\n }\n if (isLexical(value)) {\n return '[rich text]'\n }\n const next: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) {\n if (noiseKeys.has(key)) {\n continue\n }\n next[key] = plain(item, depth + 1)\n }\n return next\n}\n\nfunction cut(value: string, limit: number): string {\n if (value.length <= limit) {\n return value\n }\n return `${value.slice(0, limit)} [cut: ${value.length - limit} more characters]`\n}\n\nfunction isLexical(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && isRecord(value.root)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n"],"names":["maxReadRichTextCharacters","noiseKeys","Set","maxListItems","maxStringCharacters","maxDepth","readableDocument","fields","data","readRichText","readFields","read","depth","out","plain","isRecord","readInto","field","type","tab","tabs","name","undefined","Array","isArray","has","readField","value","isLexical","cut","trim","readList","row","blockType","block","blocks","find","item","slug","Promise","resolve","items","readItem","shown","all","slice","map","hidden","length","next","key","Object","entries","limit","root","Boolean"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SanitizedConfig } from 'payload';
2
+ import type { OwnKeySummary } from './billing.js';
3
+ import type { AiAssistantPluginOptions } from './types.js';
4
+ /** Plugin options that code holding only the request needs. The plugin keeps them on `config.custom`. */
5
+ export type PluginRuntime = {
6
+ deniedCollections: readonly string[];
7
+ deniedGlobals: readonly string[];
8
+ /** The providers the own key covers, when its credentials are complete. Never the credentials themselves. */
9
+ ownKey?: OwnKeySummary;
10
+ /** Providers in the `byok` option left out because a value is not set. */
11
+ ownKeyIncomplete: string[];
12
+ /** IANA time zone for dates shown to editors. */
13
+ timeZone: string;
14
+ } & Pick<AiAssistantPluginOptions, 'attachmentReadParams'>;
15
+ export declare function pluginRuntime(config: Pick<SanitizedConfig, 'custom'>): PluginRuntime;
@@ -0,0 +1,14 @@
1
+ import { pluginCustomKey } from './constants.js';
2
+ export function pluginRuntime(config) {
3
+ const stored = config.custom?.[pluginCustomKey];
4
+ return {
5
+ attachmentReadParams: stored?.attachmentReadParams,
6
+ timeZone: stored?.timeZone ?? 'UTC',
7
+ ownKey: stored?.ownKey,
8
+ ownKeyIncomplete: stored?.ownKeyIncomplete ?? [],
9
+ deniedCollections: stored?.deniedCollections ?? [],
10
+ deniedGlobals: stored?.deniedGlobals ?? []
11
+ };
12
+ }
13
+
14
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime.ts"],"sourcesContent":["import type { SanitizedConfig } from 'payload'\n\nimport type { OwnKeySummary } from './billing.js'\nimport type { AiAssistantPluginOptions } from './types.js'\n\nimport { pluginCustomKey } from './constants.js'\n\n/** Plugin options that code holding only the request needs. The plugin keeps them on `config.custom`. */\nexport type PluginRuntime = {\n deniedCollections: readonly string[]\n deniedGlobals: readonly string[]\n /** The providers the own key covers, when its credentials are complete. Never the credentials themselves. */\n ownKey?: OwnKeySummary\n /** Providers in the `byok` option left out because a value is not set. */\n ownKeyIncomplete: string[]\n /** IANA time zone for dates shown to editors. */\n timeZone: string\n} & Pick<AiAssistantPluginOptions, 'attachmentReadParams'>\n\nexport function pluginRuntime(config: Pick<SanitizedConfig, 'custom'>): PluginRuntime {\n const stored = config.custom?.[pluginCustomKey] as Partial<PluginRuntime> | undefined\n return {\n attachmentReadParams: stored?.attachmentReadParams,\n timeZone: stored?.timeZone ?? 'UTC',\n ownKey: stored?.ownKey,\n ownKeyIncomplete: stored?.ownKeyIncomplete ?? [],\n deniedCollections: stored?.deniedCollections ?? [],\n deniedGlobals: stored?.deniedGlobals ?? [],\n }\n}\n"],"names":["pluginCustomKey","pluginRuntime","config","stored","custom","attachmentReadParams","timeZone","ownKey","ownKeyIncomplete","deniedCollections","deniedGlobals"],"mappings":"AAKA,SAASA,eAAe,QAAQ,iBAAgB;AAchD,OAAO,SAASC,cAAcC,MAAuC;IACnE,MAAMC,SAASD,OAAOE,MAAM,EAAE,CAACJ,gBAAgB;IAC/C,OAAO;QACLK,sBAAsBF,QAAQE;QAC9BC,UAAUH,QAAQG,YAAY;QAC9BC,QAAQJ,QAAQI;QAChBC,kBAAkBL,QAAQK,oBAAoB,EAAE;QAChDC,mBAAmBN,QAAQM,qBAAqB,EAAE;QAClDC,eAAeP,QAAQO,iBAAiB,EAAE;IAC5C;AACF"}
@@ -0,0 +1,113 @@
1
+ import type { Field, RichTextField } from 'payload';
2
+ /** Whether a field is shown, from its `admin.condition`, given the values beside it. */
3
+ type FieldCondition = (siblingData: Record<string, unknown>) => boolean;
4
+ type GuideMeta = {
5
+ /** Present when the field is shown only for some sibling values, such as a link's doc or url. */
6
+ condition?: FieldCondition;
7
+ description?: string;
8
+ label?: string;
9
+ name: string;
10
+ /** Guidance for the assistant only, from `custom.aiAssistant` on the field. */
11
+ note?: string;
12
+ required: boolean;
13
+ };
14
+ export type CompiledField = ({
15
+ blocks: CompiledBlock[];
16
+ kind: 'blocks';
17
+ maxRows?: number;
18
+ minRows?: number;
19
+ } & GuideMeta) | {
20
+ condition?: FieldCondition;
21
+ fields: CompiledField[];
22
+ kind: 'flatten';
23
+ } | ({
24
+ field: RichTextField;
25
+ kind: 'richText';
26
+ } & GuideMeta) | ({
27
+ fields: CompiledField[];
28
+ kind: 'array';
29
+ maxRows?: number;
30
+ minRows?: number;
31
+ } & GuideMeta) | ({
32
+ fields: CompiledField[];
33
+ kind: 'group';
34
+ } & GuideMeta) | ({
35
+ hasMany: boolean;
36
+ kind: 'date' | 'email' | 'text' | 'textarea';
37
+ } & GuideMeta) | ({
38
+ hasMany: boolean;
39
+ kind: 'number';
40
+ } & GuideMeta) | ({
41
+ hasMany: boolean;
42
+ kind: 'relationship' | 'upload';
43
+ relationTo: string[];
44
+ } & GuideMeta) | ({
45
+ hasMany: boolean;
46
+ kind: 'select';
47
+ options: string[];
48
+ } & GuideMeta) | ({
49
+ kind: 'checkbox';
50
+ } & GuideMeta);
51
+ type CompiledBlock = {
52
+ fields: CompiledField[];
53
+ label?: string;
54
+ /** Guidance for the assistant only, from `custom.aiAssistant` on the block. */
55
+ note?: string;
56
+ slug: string;
57
+ };
58
+ export type FieldError = {
59
+ message: string;
60
+ path: string;
61
+ };
62
+ export type ApplyContext = {
63
+ /** An update may omit fields. Missing required fields stay as they are. */
64
+ partial?: boolean;
65
+ toLexical: (field: RichTextField, markdown: string) => Promise<unknown>;
66
+ };
67
+ /**
68
+ * Guidance for the assistant that editors do not need to see: a string at `custom.aiAssistant` on a field,
69
+ * block, collection, or global. Guidance that helps editors too belongs in `admin.description`, which the
70
+ * guide also includes.
71
+ */
72
+ export declare function assistantNote(config: {
73
+ custom?: unknown;
74
+ }): string | undefined;
75
+ /** Fields the model is allowed to fill. JSON, code, and point fields are left out. Every block in the schema is included. */
76
+ export declare function compileFields(fields: Field[]): CompiledField[];
77
+ export interface FieldGuideOptions {
78
+ /** Blocks to describe in full, by slug. Every other block is listed by name only. */
79
+ blocks?: readonly string[];
80
+ }
81
+ /**
82
+ * Compact field guide the model fills. Names match the collection schema.
83
+ * Block definitions are most of a page's schema, so only the blocks asked for are expanded.
84
+ */
85
+ export declare function formatFieldGuide(fields: Field[], options?: FieldGuideOptions): string;
86
+ /** The field a dotted path points at, through groups, tabs, and rows. Lists and blocks end the walk. */
87
+ export declare function compiledFieldAtPath(fields: Field[], path: string): CompiledField | undefined;
88
+ /**
89
+ * Keys in a set that match no field. Writes drop unknown keys, so these must be rejected
90
+ * before the editor sees a plan that would quietly skip them.
91
+ */
92
+ export declare function unknownFieldPaths(fields: Field[], set: Record<string, unknown>): string[];
93
+ /** Every block slug in the guide, so the model can be told which ones it can ask about. */
94
+ export declare function blockSlugs(fields: Field[]): string[];
95
+ export declare function exampleValues(fields: Field[]): Record<string, unknown>;
96
+ export declare function applyFields(fields: Field[], values: unknown, context: ApplyContext): Promise<{
97
+ data: Record<string, unknown>;
98
+ ok: true;
99
+ } | {
100
+ errors: FieldError[];
101
+ ok: false;
102
+ }>;
103
+ /** Fills slug, path, and hidden defaults the editor never types, so create validation can pass. */
104
+ /**
105
+ * The slug a renamed document gets when its "Use title" toggle is on, matching the slug field in the editor,
106
+ * which rebuilds the slug from the title as it changes. Undefined when the slug stays as it is.
107
+ * The path field's own hook then rebuilds the URL from the slug and adds a redirect if the page was published.
108
+ */
109
+ export declare function followedSlug(fields: Field[], current: unknown, nextTitle: unknown): string | undefined;
110
+ export declare function withDerivedValues(fields: Field[], data: Record<string, unknown>, options?: {
111
+ prependPath?: string;
112
+ }): Record<string, unknown>;
113
+ export {};