@promptbook/cli 0.112.0-104 → 0.112.0-105

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 (174) hide show
  1. package/apps/agents-server/src/app/admin/image-generator-test/ImageAttachmentsEditor.tsx +19 -3
  2. package/apps/agents-server/src/app/admin/limits/LimitsClient.tsx +11 -12
  3. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +34 -2
  4. package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +6 -1
  5. package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +13 -1
  6. package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +11 -2
  7. package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +11 -1
  8. package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +7 -1
  9. package/apps/agents-server/src/app/agents/[agentName]/chat/CanonicalAgentChatSurface.tsx +11 -1
  10. package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/route.ts +6 -2
  11. package/apps/agents-server/src/app/api/images/[filename]/route.ts +6 -2
  12. package/apps/agents-server/src/app/api/internal/agent-runner-limits/route.ts +51 -0
  13. package/apps/agents-server/src/app/api/upload/route.ts +48 -12
  14. package/apps/agents-server/src/app/layout.tsx +13 -0
  15. package/apps/agents-server/src/components/FileUploadAvailability/FileUploadAvailabilityContext.tsx +50 -0
  16. package/apps/agents-server/src/components/FileUploadAvailability/FileUploadUnavailableNotice.tsx +45 -0
  17. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +85 -76
  18. package/apps/agents-server/src/components/NewAgentDialog/NewAgentDialog.tsx +7 -3
  19. package/apps/agents-server/src/components/NewAgentDialog/NewAgentWizardKnowledgeStep.tsx +6 -0
  20. package/apps/agents-server/src/components/NewAgentDialog/useNewAgentWizardKnowledgeState.ts +8 -1
  21. package/apps/agents-server/src/constants/serverLimits.ts +22 -2
  22. package/apps/agents-server/src/database/seedDefaultAgents.ts +218 -0
  23. package/apps/agents-server/src/tools/$provideCdnForServer.ts +72 -8
  24. package/apps/agents-server/src/utils/defaultAgents/loadDefaultAgentBooks.ts +103 -0
  25. package/apps/agents-server/src/utils/knowledge/createInlineKnowledgeSourceUploader.ts +24 -5
  26. package/apps/agents-server/src/utils/serverLimits.ts +26 -1
  27. package/apps/agents-server/src/utils/serverManagement/createManagedServer/seedServerDefaultAgents.ts +1 -85
  28. package/apps/agents-server/src/utils/shareTargetPayloads.ts +20 -2
  29. package/apps/agents-server/src/utils/upload/fileUploadAvailability.ts +91 -0
  30. package/apps/agents-server/src/utils/upload/uploadFileToServer.ts +46 -2
  31. package/esm/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
  32. package/esm/apps/agents-server/src/constants/serverLimits.d.ts +207 -0
  33. package/esm/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
  34. package/esm/index.es.js +602 -39
  35. package/esm/index.es.js.map +1 -1
  36. package/esm/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
  37. package/esm/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
  38. package/esm/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
  39. package/esm/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
  40. package/esm/src/book-components/BookEditor/BookEditor.d.ts +5 -4
  41. package/esm/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
  42. package/esm/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
  43. package/esm/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
  44. package/esm/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
  45. package/esm/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +6 -0
  46. package/esm/src/version.d.ts +1 -1
  47. package/package.json +1 -1
  48. package/src/avatars/visuals/octopus3d3AvatarVisual.ts +28 -29
  49. package/src/book-components/BookEditor/BookEditor.tsx +10 -7
  50. package/src/book-components/BookEditor/BookEditorMonaco.tsx +3 -1
  51. package/src/book-components/BookEditor/BookEditorTheme.ts +32 -0
  52. package/src/book-components/BookEditor/useBookEditorMonacoLanguage.ts +12 -15
  53. package/src/book-components/BookEditor/useBookEditorMonacoLifecycle.ts +1 -5
  54. package/src/book-components/BookEditor/useBookEditorMonacoStyles.ts +2 -1
  55. package/src/cli/cli-commands/agent-folder/agentProjectPaths.ts +7 -0
  56. package/src/cli/cli-commands/agents-server/buildAgentsServer.ts +109 -9
  57. package/src/cli/cli-commands/agents-server/startAgentsServer.ts +132 -4
  58. package/src/other/templates/getTemplatesPipelineCollection.ts +729 -854
  59. package/src/version.ts +2 -2
  60. package/src/versions.txt +1 -0
  61. package/umd/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
  62. package/umd/apps/agents-server/src/constants/serverLimits.d.ts +207 -0
  63. package/umd/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
  64. package/umd/index.umd.js +602 -39
  65. package/umd/index.umd.js.map +1 -1
  66. package/umd/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
  67. package/umd/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
  68. package/umd/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
  69. package/umd/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
  70. package/umd/src/book-components/BookEditor/BookEditor.d.ts +5 -4
  71. package/umd/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
  72. package/umd/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
  73. package/umd/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
  74. package/umd/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
  75. package/umd/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +6 -0
  76. package/umd/src/version.d.ts +1 -1
  77. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.test.ts.todo +0 -108
  78. package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.test.ts.todo +0 -117
  79. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.test.ts.todo +0 -119
  80. package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.test.ts.todo +0 -74
  81. package/apps/agents-server/src/utils/defaultAgents/defaultAgents.ts +0 -168
  82. package/apps/agents-server/src/utils/defaultAgents/installDefaultAgents.ts +0 -139
  83. package/apps/agents-server/tests/e2e/authentication-and-navigation.spec.ts.todo +0 -178
  84. package/src/_packages/browser.index.ts +0 -31
  85. package/src/_packages/browser.readme.md +0 -43
  86. package/src/book-2.0/agent-source/parseAgentSourceWithCommitments.test.ts.todo +0 -265
  87. package/src/book-components/BookEditor/BookEditorMonaco.test.tsx.todo +0 -115
  88. package/src/book-components/Chat/utils/renderMarkdown.test.ts.tmp +0 -199
  89. package/src/collection/agent-collection/constructors/agent-collection-in-directory/AgentCollectionInDirectory.test.ts.todo +0 -131
  90. package/src/commands/_common/parseCommand.test.ts.todo +0 -48
  91. package/src/commitments/META_LINK/META_LINK.test.ts.todo +0 -75
  92. package/src/conversion/validation/pipelineStringToJson-errors.test.ts.todo +0 -33
  93. package/src/dialogs/simple-prompt/SimplePromptInterfaceTools.ts +0 -51
  94. package/src/executables/browsers/locateSafari.test.ts.tmp +0 -15
  95. package/src/execution/PromptbookFetch.test-type.ts +0 -14
  96. package/src/execution/createPipelineExecutor/00-createPipelineExecutor.test.ts.todo +0 -0
  97. package/src/execution/execution-report/executionReportJsonToString.test.ts.todo +0 -83
  98. package/src/execution/utils/usageToHuman.test.ts.todo +0 -80
  99. package/src/llm-providers/_common/register/$provideLlmToolsForTestingAndScriptsAndPlayground.ts +0 -76
  100. package/src/llm-providers/_common/utils/assertUniqueModels.ts +0 -27
  101. package/src/llm-providers/_multiple/playground/playground.ts +0 -141
  102. package/src/llm-providers/_multiple/playground/tsconfig.json +0 -19
  103. package/src/llm-providers/agent/playground/playground.ts +0 -190
  104. package/src/llm-providers/agent/playground/tsconfig.json +0 -19
  105. package/src/llm-providers/anthropic-claude/playground/playground.ts +0 -99
  106. package/src/llm-providers/anthropic-claude/playground/tsconfig.json +0 -19
  107. package/src/llm-providers/azure-openai/playground/playground.ts +0 -101
  108. package/src/llm-providers/azure-openai/playground/tsconfig.json +0 -19
  109. package/src/llm-providers/ollama/playground/playground.ts +0 -120
  110. package/src/llm-providers/ollama/playground/tsconfig.json +0 -19
  111. package/src/llm-providers/openai/playground/playground.ts +0 -406
  112. package/src/llm-providers/openai/playground/tsconfig.json +0 -19
  113. package/src/llm-providers/remote/playground/playground.ts +0 -144
  114. package/src/llm-providers/remote/playground/tsconfig.json +0 -19
  115. package/src/llm-providers/vercel/playground/playground.ts +0 -133
  116. package/src/llm-providers/vercel/playground/tsconfig.json +0 -19
  117. package/src/personas/preparePersona.test.ts.todo +0 -126
  118. package/src/playground/backup/_playground-boilerplate.ts.txt +0 -37
  119. package/src/playground/backup/playground-agent-os.txt +0 -62
  120. package/src/playground/backup/playground-brj-app.ts.txt +0 -302
  121. package/src/playground/backup/playground-browser-playwright.txt +0 -110
  122. package/src/playground/backup/playground-claude-mcp.txt +0 -43
  123. package/src/playground/backup/playground-document-conversion.txt +0 -84
  124. package/src/playground/backup/playground-glob.ts.txt +0 -42
  125. package/src/playground/backup/playground-mcp-server.txt +0 -1
  126. package/src/playground/backup/playground-openai-agent-kit.txt +0 -73
  127. package/src/playground/backup/playground-openai-function-calling.txt +0 -131
  128. package/src/playground/backup/playground-openai-streaming.ts.txt +0 -68
  129. package/src/playground/backup/playground-scrape-knowledge.txt +0 -65
  130. package/src/playground/backup/playground-scraperFetch.ts.txt +0 -44
  131. package/src/playground/backup/playground-using-openai-compatible-route-on-agents-server.ts.txt +0 -49
  132. package/src/playground/backup/playground-write-pavolhejny-bio.txt +0 -120
  133. package/src/playground/permanent/_boilerplate.ts +0 -54
  134. package/src/playground/permanent/agent-with-browser-playground.ts +0 -92
  135. package/src/playground/permanent/error-handling-playground.ts +0 -103
  136. package/src/playground/playground.ts +0 -36
  137. package/src/playground/tsconfig.json +0 -19
  138. package/src/scrapers/_boilerplate/BoilerplateScraper.test.ts.todo +0 -73
  139. package/src/scrapers/_boilerplate/playground/boilerplate-scraper-playground.ts +0 -79
  140. package/src/scrapers/_boilerplate/playground/tsconfig.json +0 -19
  141. package/src/scrapers/_common/utils/files/blobToDataurl.test.ts.todo +0 -17
  142. package/src/scrapers/_common/utils/files/dataurlToBlob.test.ts.todo +0 -52
  143. package/src/scrapers/_common/utils/files/isValidDataurl.test.ts.todo +0 -42
  144. package/src/scrapers/_common/utils/files/shorten.test.ts.todo +0 -13
  145. package/src/scrapers/document/playground/document-scraper-playground.ts +0 -80
  146. package/src/scrapers/document/playground/tsconfig.json +0 -19
  147. package/src/scrapers/document-legacy/playground/legacy-document-scraper-playground.ts +0 -80
  148. package/src/scrapers/document-legacy/playground/tsconfig.json +0 -19
  149. package/src/scrapers/markdown/playground/markdown-scraper-playground.ts +0 -74
  150. package/src/scrapers/markdown/playground/tsconfig.json +0 -19
  151. package/src/scrapers/markitdown/MarkitdownScraper.test.ts.todo +0 -132
  152. package/src/scrapers/markitdown/playground/markitdown-scraper-playground.ts +0 -91
  153. package/src/scrapers/markitdown/playground/tsconfig.json +0 -19
  154. package/src/scrapers/pdf/PdfScraper.test.ts.todo +0 -52
  155. package/src/scrapers/pdf/playground/pdf-scraper-playground.ts +0 -75
  156. package/src/scrapers/pdf/playground/tsconfig.json +0 -19
  157. package/src/scrapers/website/playground/tsconfig.json +0 -19
  158. package/src/scrapers/website/playground/website-scraper-playground.ts +0 -82
  159. package/src/storage/_common/PromptbookStorage.test-type.ts +0 -14
  160. package/src/storage/local-storage/getIndexedDbStorage.ts +0 -36
  161. package/src/storage/local-storage/getLocalStorage.ts +0 -33
  162. package/src/storage/local-storage/getSessionStorage.ts +0 -33
  163. package/src/storage/local-storage/utils/IndexedDbStorageOptions.ts +0 -16
  164. package/src/storage/local-storage/utils/makePromptbookStorageFromIndexedDb.ts +0 -58
  165. package/src/storage/local-storage/utils/makePromptbookStorageFromWebStorage.ts +0 -45
  166. package/src/transpilers/formatted-book-in-markdown/FormattedBookInMarkdownTranspiler.test.ts.todo +0 -35
  167. package/src/transpilers/openai-sdk/playground/playground.ts +0 -85
  168. package/src/transpilers/openai-sdk/playground/tmp/chatbot-openaisdk-1.js +0 -194
  169. package/src/transpilers/openai-sdk/playground/tmp/package.json +0 -3
  170. package/src/transpilers/openai-sdk/playground/tsconfig.json +0 -18
  171. package/src/utils/editable/utils/findUsableParameters.test.ts.todo +0 -43
  172. package/src/utils/editable/utils/stringifyPipelineJson.test.ts.todo +0 -38
  173. package/src/utils/markdown/prettifyMarkdown.test.ts.tmp +0 -42
  174. package/src/utils/serialization/serializeToPromptbookJavascript.test.ts.todo +0 -116
@@ -1,265 +0,0 @@
1
- // TODO: Uncomment the test
2
-
3
- import { describe, expect, it } from '@jest/globals';
4
- import { spaceTrim } from 'spacetrim';
5
- import { validateBook } from '../../agent-source/string_book';
6
- import { parseAgentSourceWithCommitments } from './parseAgentSourceWithCommitments';
7
-
8
- describe('parseAgentSourceWithCommitments with multiline support', () => {
9
- it('should parse single-line commitments correctly', () => {
10
- const agentSource = validateBook(
11
- spaceTrim(`
12
- Test Agent
13
- PERSONA Some persona description
14
- KNOWLEDGE https://example.com/knowledge.pdf
15
- `),
16
- );
17
-
18
- const result = parseAgentSourceWithCommitments(agentSource);
19
-
20
- expect(result.agentName).toBe('Test Agent');
21
- expect(result.commitments).toHaveLength(2);
22
-
23
- expect(result.commitments[0]).toEqual({
24
- type: 'PERSONA',
25
- content: 'Some persona description',
26
- originalLine: 'PERSONA Some persona description',
27
- lineNumber: 2,
28
- });
29
-
30
- expect(result.commitments[1]).toEqual({
31
- type: 'KNOWLEDGE',
32
- content: 'https://example.com/knowledge.pdf',
33
- originalLine: 'KNOWLEDGE https://example.com/knowledge.pdf',
34
- lineNumber: 3,
35
- });
36
- });
37
-
38
- it('should parse multiline commitments correctly', () => {
39
- const agentSource = validateBook(
40
- spaceTrim(`
41
- Test Agent
42
- PERSONA Another persona description
43
- which is continued on the next line
44
- and also on the next line
45
-
46
-
47
- and also on the next paragraph
48
- PERSONA New persona description
49
- KNOWLEDGE Some knowledge description
50
-
51
- which is continued on the next line
52
-
53
-
54
- PERSONA Yet another persona description
55
- continued description of the PERSONA
56
- and continued on the next line because the last keyword PERSONA was not at the start of the line
57
- `),
58
- );
59
-
60
- const result = parseAgentSourceWithCommitments(agentSource);
61
-
62
- expect(result.agentName).toBe('Test Agent');
63
- expect(result.commitments).toHaveLength(3);
64
-
65
- // First multiline PERSONA
66
- expect(result.commitments[0]).toEqual({
67
- type: 'PERSONA',
68
- content: spaceTrim(`
69
- Another persona description
70
- which is continued on the next line
71
- and also on the next line
72
-
73
-
74
- and also on the next paragraph
75
- `),
76
- originalLine: 'PERSONA Another persona description',
77
- lineNumber: 2,
78
- });
79
-
80
- // Second PERSONA (single line)
81
- expect(result.commitments[1]).toEqual({
82
- type: 'PERSONA',
83
- content: 'New persona description',
84
- originalLine: 'PERSONA New persona description',
85
- lineNumber: 8,
86
- });
87
-
88
- // KNOWLEDGE with multiline content
89
- expect(result.commitments[2]).toEqual({
90
- type: 'KNOWLEDGE',
91
- content: spaceTrim(`
92
- Some knowledge description
93
-
94
- which is continued on the next line
95
-
96
-
97
- PERSONA Yet another persona description
98
- continued description of the PERSONA
99
- and continued on the next line because the last keyword PERSONA was not at the start of the line
100
- `),
101
- originalLine: 'KNOWLEDGE Some knowledge description',
102
- lineNumber: 9,
103
- });
104
- });
105
-
106
- it('should handle the exact example from the requirements', () => {
107
- const agentSource = validateBook(`Test Agent
108
- PERSONA Some persona description
109
- PERSONA Another persona description
110
- which is continued on the next line
111
- and also on the next line
112
-
113
-
114
- and also on the next paragraph
115
- PERSONA New persona description
116
- KNOWLEDGE https://example.com/knowledge.pdf
117
- KNOWLEDGE Some knowledge description
118
-
119
- which is continued on the next line
120
-
121
-
122
- PERSONA Yet another persona description
123
- continued description of the PERSONA
124
- and continued on the next line because the last keyword PERSONA was not at the start of the line`);
125
-
126
- const result = parseAgentSourceWithCommitments(agentSource);
127
-
128
- expect(result.agentName).toBe('Test Agent');
129
- expect(result.commitments).toHaveLength(6);
130
-
131
- // First PERSONA (single line)
132
- expect(result.commitments[0]).toEqual({
133
- type: 'PERSONA',
134
- content: 'Some persona description',
135
- originalLine: 'PERSONA Some persona description',
136
- lineNumber: 2,
137
- });
138
-
139
- // Second PERSONA (multiline)
140
- expect(result.commitments[1]).toEqual({
141
- type: 'PERSONA',
142
- content: `Another persona description
143
- which is continued on the next line
144
- and also on the next line
145
-
146
-
147
- and also on the next paragraph`,
148
- originalLine: 'PERSONA Another persona description',
149
- lineNumber: 3,
150
- });
151
-
152
- // Third PERSONA (single line)
153
- expect(result.commitments[2]).toEqual({
154
- type: 'PERSONA',
155
- content: 'New persona description',
156
- originalLine: 'PERSONA New persona description',
157
- lineNumber: 9,
158
- });
159
-
160
- // First KNOWLEDGE (single line)
161
- expect(result.commitments[3]).toEqual({
162
- type: 'KNOWLEDGE',
163
- content: 'https://example.com/knowledge.pdf',
164
- originalLine: 'KNOWLEDGE https://example.com/knowledge.pdf',
165
- lineNumber: 10,
166
- });
167
-
168
- // Second KNOWLEDGE (multiline)
169
- expect(result.commitments[4]).toEqual({
170
- type: 'KNOWLEDGE',
171
- content: `Some knowledge description
172
-
173
- which is continued on the next line
174
-
175
-
176
- `,
177
- originalLine: 'KNOWLEDGE Some knowledge description',
178
- lineNumber: 11,
179
- });
180
-
181
- // Fourth PERSONA (multiline, continues until end)
182
- expect(result.commitments[5]).toEqual({
183
- type: 'PERSONA',
184
- content: `Yet another persona description
185
- continued description of the PERSONA
186
- and continued on the next line because the last keyword PERSONA was not at the start of the line`,
187
- originalLine: 'PERSONA Yet another persona description',
188
- lineNumber: 15,
189
- });
190
- });
191
-
192
- it('should handle empty lines and preserve spacing in multiline content', () => {
193
- const agentSource = validateBook(`Test Agent
194
- PERSONA First persona
195
-
196
- with empty line above
197
- PERSONA Second persona`);
198
-
199
- const result = parseAgentSourceWithCommitments(agentSource);
200
-
201
- expect(result.commitments).toHaveLength(2);
202
-
203
- expect(result.commitments[0]).toEqual({
204
- type: 'PERSONA',
205
- content: `First persona
206
-
207
- with empty line above`,
208
- originalLine: 'PERSONA First persona',
209
- lineNumber: 2,
210
- });
211
-
212
- expect(result.commitments[1]).toEqual({
213
- type: 'PERSONA',
214
- content: 'Second persona',
215
- originalLine: 'PERSONA Second persona',
216
- lineNumber: 5,
217
- });
218
- });
219
-
220
- it('should handle commitments with no initial content on the same line', () => {
221
- const agentSource = validateBook(`Test Agent
222
- PERSONA
223
- This is the content
224
- that continues on multiple lines
225
- KNOWLEDGE
226
- https://example.com/knowledge.pdf`);
227
-
228
- const result = parseAgentSourceWithCommitments(agentSource);
229
-
230
- expect(result.commitments).toHaveLength(2);
231
-
232
- expect(result.commitments[0]).toEqual({
233
- type: 'PERSONA',
234
- content: `This is the content
235
- that continues on multiple lines`,
236
- originalLine: 'PERSONA',
237
- lineNumber: 2,
238
- });
239
-
240
- expect(result.commitments[1]).toEqual({
241
- type: 'KNOWLEDGE',
242
- content: 'https://example.com/knowledge.pdf',
243
- originalLine: 'KNOWLEDGE',
244
- lineNumber: 5,
245
- });
246
- });
247
-
248
- it('should handle non-commitment lines correctly', () => {
249
- const agentSource = validateBook(`Test Agent
250
- This is not a commitment
251
- PERSONA Some persona
252
- Another line that is not a commitment
253
- KNOWLEDGE Some knowledge
254
- Final non-commitment line`);
255
-
256
- const result = parseAgentSourceWithCommitments(agentSource);
257
-
258
- expect(result.commitments).toHaveLength(2);
259
- expect(result.nonCommitmentLines).toEqual([
260
- 'Test Agent',
261
- 'This is not a commitment',
262
- 'Final non-commitment line',
263
- ]);
264
- });
265
- });
@@ -1,115 +0,0 @@
1
- /** @jest-environment jsdom */
2
-
3
- import { describe, expect, it, jest } from '@jest/globals';
4
- import { render } from '@testing-library/react';
5
- import { string_book } from '../../book-2.0/agent-source/string_book';
6
- import { BookEditorMonaco } from './BookEditorMonaco';
7
-
8
- // Mock the monaco editor
9
- const mockSetMonarchTokensProvider = jest.fn();
10
- const mockDispose = jest.fn();
11
- mockSetMonarchTokensProvider.mockReturnValue({ dispose: mockDispose });
12
-
13
- jest.mock('@monaco-editor/react', () => ({
14
- __esModule: true,
15
- Editor: (props: { [key: string]: unknown }) => <div data-testid="mock-editor">{JSON.stringify(props)}</div>,
16
- useMonaco: () => ({
17
- languages: {
18
- register: jest.fn(),
19
- setMonarchTokensProvider: mockSetMonarchTokensProvider,
20
- registerCompletionItemProvider: jest.fn(() => ({ dispose: jest.fn() })),
21
- },
22
- editor: {
23
- defineTheme: jest.fn(),
24
- setTheme: jest.fn(),
25
- },
26
- }),
27
- }));
28
-
29
- // Mock other dependencies
30
- jest.mock('../../book-2.0/commitments', () => ({
31
- getAllCommitmentDefinitions: () => [{ type: 'ASK' }, { type: 'TELL' }, { type: 'META' }],
32
- }));
33
-
34
- jest.mock('../../config', () => ({
35
- PROMPTBOOK_SYNTAX_COLORS: {
36
- TITLE: { toHex: () => '#000000' },
37
- COMMITMENT: { toHex: () => '#000000' },
38
- PARAMETER: { toHex: () => '#000000' },
39
- },
40
- }));
41
-
42
- describe('BookEditorMonaco', () => {
43
- it('should use a regex that supports international characters for parameters', () => {
44
- render(<BookEditorMonaco value={'' as string_book} isReadonly={false} />);
45
-
46
- expect(mockSetMonarchTokensProvider).toHaveBeenCalled();
47
-
48
- const monarchTokensProvider = mockSetMonarchTokensProvider!.mock!.calls[0]![1]! as {
49
- tokenizer: { body: [RegExp, string][] };
50
- };
51
- const bookRules = monarchTokensProvider.tokenizer.body;
52
-
53
- const parameterRule = bookRules.find((rule) => rule[1] === 'parameter');
54
- expect(parameterRule).toBeDefined();
55
-
56
- const parameterRegex = parameterRule![0];
57
- expect(parameterRegex).toBeInstanceOf(RegExp);
58
-
59
- // Test the regex with various strings
60
- const textWithParams = 'Tohle je @Slovník a také @мир.';
61
- const matches = textWithParams.match(new RegExp(parameterRegex.source, 'g'));
62
- expect(matches).toEqual(['@Slovník', '@мир']);
63
-
64
- expect('@Slovník'.match(parameterRegex)?.[0]).toBe('@Slovník');
65
- expect('@мир'.match(parameterRegex)?.[0]).toBe('@мир');
66
- expect('@parameter123'.match(parameterRegex)?.[0]).toBe('@parameter123');
67
- expect('@onlyAscii'.match(parameterRegex)?.[0]).toBe('@onlyAscii');
68
- expect('not a parameter'.match(parameterRegex)).toBeNull();
69
- });
70
-
71
- describe('BookEditorMonaco padding', () => {
72
- it('should add 5 empty lines to an empty book', () => {
73
- const { getByTestId } = render(<BookEditorMonaco value={undefined} isReadonly={false} />);
74
- const editor = getByTestId('mock-editor');
75
- const props = JSON.parse(editor.textContent || '{}');
76
- expect(props.value).toBe('\n\n\n\n\n');
77
- });
78
-
79
- it('should add 5 empty lines to a book with no trailing newlines', () => {
80
- const { getByTestId } = render(<BookEditorMonaco value={'Hello' as string_book} isReadonly={false} />);
81
- const editor = getByTestId('mock-editor');
82
- const props = JSON.parse(editor.textContent || '{}');
83
- expect(props.value).toBe('Hello\n\n\n\n\n');
84
- });
85
-
86
- it('should add remaining empty lines to a book with some trailing newlines', () => {
87
- const { getByTestId } = render(<BookEditorMonaco value={'Hello\n\n' as string_book} isReadonly={false} />);
88
- const editor = getByTestId('mock-editor');
89
- const props = JSON.parse(editor.textContent || '{}');
90
- expect(props.value).toBe('Hello\n\n\n\n\n');
91
- });
92
-
93
- it('should not add empty lines to a book with 5 trailing newlines', () => {
94
- const { getByTestId } = render(
95
- <BookEditorMonaco value={'Hello\n\n\n\n\n' as string_book} isReadonly={false} />,
96
- );
97
- const editor = getByTestId('mock-editor');
98
- const props = JSON.parse(editor.textContent || '{}');
99
- expect(props.value).toBe('Hello\n\n\n\n\n');
100
- });
101
-
102
- it('should not add empty lines to a book with more than 5 trailing newlines', () => {
103
- const { getByTestId } = render(
104
- <BookEditorMonaco value={'Hello\n\n\n\n\n\n' as string_book} isReadonly={false} />,
105
- );
106
- const editor = getByTestId('mock-editor');
107
- const props = JSON.parse(editor.textContent || '{}');
108
- expect(props.value).toBe('Hello\n\n\n\n\n\n');
109
- });
110
- });
111
- });
112
-
113
- /**
114
- * TODO: Make this test working, now it fails because css modules import doesn't work in the test env
115
- */
@@ -1,199 +0,0 @@
1
- import { isMarkdownContent, renderMarkdown } from './renderMarkdown';
2
-
3
- describe('renderMarkdown', () => {
4
- it('should render simple text without markdown', () => {
5
- const result = renderMarkdown('Hello world');
6
- expect(result).toBe('<p>Hello world</p>');
7
- });
8
-
9
- it('should render bold text', () => {
10
- const result = renderMarkdown('**bold text**');
11
- expect(result).toBe('<p><strong>bold text</strong></p>');
12
- });
13
-
14
- it('should render italic text', () => {
15
- const result = renderMarkdown('*italic text*');
16
- expect(result).toBe('<p><em>italic text</em></p>');
17
- });
18
-
19
- it('should render inline code', () => {
20
- const result = renderMarkdown('`inline code`');
21
- expect(result).toBe('<p><code>inline code</code></p>');
22
- });
23
-
24
- it('should render code blocks', () => {
25
- const markdown = '```javascript\nconsole.log("Hello");\n```';
26
- const result = renderMarkdown(markdown);
27
- expect(result).toContain('<pre><code class="javascript language-javascript">');
28
- expect(result).toContain('console.log("Hello");');
29
- expect(result).toContain('</code></pre>');
30
- });
31
-
32
- /*
33
- TODO: Make these tests pass
34
- it('should render headers', () => {
35
- const result = renderMarkdown('# Header 1\n## Header 2');
36
- expect(result).toContain('<h1 id="chat-header-header1">Header 1</h1>');
37
- expect(result).toContain('<h2 id="chat-header-header2">Header 2</h2>');
38
- });
39
- */
40
-
41
- it('should render unordered lists', () => {
42
- const markdown = '- Item 1\n- Item 2\n- Item 3';
43
- const result = renderMarkdown(markdown);
44
- expect(result).toContain('<ul>');
45
- expect(result).toContain('<li>Item 1</li>');
46
- expect(result).toContain('<li>Item 2</li>');
47
- expect(result).toContain('<li>Item 3</li>');
48
- expect(result).toContain('</ul>');
49
- });
50
-
51
- it('should render ordered lists', () => {
52
- const markdown = '1. First item\n2. Second item\n3. Third item';
53
- const result = renderMarkdown(markdown);
54
- expect(result).toContain('<ol>');
55
- expect(result).toContain('<li>First item</li>');
56
- expect(result).toContain('<li>Second item</li>');
57
- expect(result).toContain('<li>Third item</li>');
58
- expect(result).toContain('</ol>');
59
- });
60
-
61
- /*
62
- TODO: Make these tests pass
63
- it('should render links', () => {
64
- const result = renderMarkdown('[OpenAI](https://openai.com)');
65
- expect(result).toContain('<a href="https://openai.com" target="_blank">OpenAI</a>');
66
- });
67
- */
68
-
69
- it('should render blockquotes', () => {
70
- const result = renderMarkdown('> This is a quote');
71
- expect(result).toContain('<blockquote');
72
- expect(result).toContain('<p>This is a quote</p>');
73
- expect(result).toContain('</blockquote>');
74
- });
75
-
76
- it('should render strikethrough text', () => {
77
- const result = renderMarkdown('~~strikethrough~~');
78
- expect(result).toContain('<del>strikethrough</del>');
79
- });
80
-
81
- it('should render tables', () => {
82
- const markdown = '| Header 1 | Header 2 |\n|----------|----------|\n| Cell 1 | Cell 2 |';
83
- const result = renderMarkdown(markdown);
84
- expect(result).toContain('<table');
85
- expect(result).toContain('<thead');
86
- expect(result).toContain('<th>Header 1</th>');
87
- expect(result).toContain('<th>Header 2</th>');
88
- expect(result).toContain('<tbody');
89
- expect(result).toContain('<td>Cell 1</td>');
90
- expect(result).toContain('<td>Cell 2</td>');
91
- });
92
-
93
- it('should handle empty or null input', () => {
94
- expect(renderMarkdown('')).toBe('');
95
- expect(renderMarkdown(null as unknown as string)).toBe('');
96
- expect(renderMarkdown(undefined as unknown as string)).toBe('');
97
- });
98
-
99
- /*
100
- TODO: Make these tests pass
101
- it('should sanitize dangerous HTML attributes', () => {
102
- const maliciousMarkdown =
103
- '<div onclick="alert(\'xss\')" onload="alert(\'xss\')" href="javascript:alert(\'xss\')">Test</div>';
104
- const result = renderMarkdown(maliciousMarkdown);
105
- expect(result).not.toContain('onclick');
106
- expect(result).not.toContain('onload');
107
- expect(result).not.toContain('javascript:');
108
- });
109
- */
110
-
111
- it('should handle markdown parsing errors gracefully', () => {
112
- // Mock console.error to avoid noise in test output
113
- const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
114
-
115
- // This should not throw an error, but return escaped HTML instead
116
- const result = renderMarkdown('Some content');
117
- expect(result).toBeDefined();
118
- expect(typeof result).toBe('string');
119
-
120
- consoleSpy.mockRestore();
121
- });
122
- });
123
-
124
- describe('isMarkdownContent', () => {
125
- it('should detect headers', () => {
126
- expect(isMarkdownContent('# Header')).toBe(true);
127
- expect(isMarkdownContent('## Header 2')).toBe(true);
128
- expect(isMarkdownContent('### Header 3')).toBe(true);
129
- });
130
-
131
- it('should detect bold text', () => {
132
- expect(isMarkdownContent('**bold**')).toBe(true);
133
- expect(isMarkdownContent('Some **bold** text')).toBe(true);
134
- });
135
-
136
- it('should detect italic text', () => {
137
- expect(isMarkdownContent('*italic*')).toBe(true);
138
- expect(isMarkdownContent('Some *italic* text')).toBe(true);
139
- });
140
-
141
- it('should detect inline code', () => {
142
- expect(isMarkdownContent('`code`')).toBe(true);
143
- expect(isMarkdownContent('Some `code` here')).toBe(true);
144
- });
145
-
146
- it('should detect code blocks', () => {
147
- expect(isMarkdownContent('```\ncode block\n```')).toBe(true);
148
- expect(isMarkdownContent('```javascript\nconsole.log("test");\n```')).toBe(true);
149
- });
150
-
151
- it('should detect lists', () => {
152
- expect(isMarkdownContent('- Item 1')).toBe(true);
153
- expect(isMarkdownContent('* Item 1')).toBe(true);
154
- expect(isMarkdownContent('+ Item 1')).toBe(true);
155
- expect(isMarkdownContent('1. Item 1')).toBe(true);
156
- });
157
-
158
- it('should detect blockquotes', () => {
159
- expect(isMarkdownContent('> Quote')).toBe(true);
160
- expect(isMarkdownContent(' > Indented quote')).toBe(true);
161
- });
162
-
163
- it('should detect links', () => {
164
- expect(isMarkdownContent('[Link](https://example.com)')).toBe(true);
165
- });
166
-
167
- it('should detect images', () => {
168
- expect(isMarkdownContent('![Alt text](image.jpg)')).toBe(true);
169
- });
170
-
171
- it('should detect tables', () => {
172
- expect(isMarkdownContent('| Header |')).toBe(true);
173
- expect(isMarkdownContent('| Col1 | Col2 |')).toBe(true);
174
- });
175
-
176
- it('should detect strikethrough', () => {
177
- expect(isMarkdownContent('~~strikethrough~~')).toBe(true);
178
- });
179
-
180
- it('should detect horizontal rules', () => {
181
- expect(isMarkdownContent('---')).toBe(true);
182
- expect(isMarkdownContent('-----')).toBe(true);
183
- });
184
-
185
- it('should return false for plain text', () => {
186
- expect(isMarkdownContent('Just plain text')).toBe(false);
187
- expect(isMarkdownContent('No markdown here at all')).toBe(false);
188
- });
189
-
190
- it('should handle empty or null input', () => {
191
- expect(isMarkdownContent('')).toBe(false);
192
- expect(isMarkdownContent(null as unknown as string)).toBe(false);
193
- expect(isMarkdownContent(undefined as unknown as string)).toBe(false);
194
- });
195
- });
196
-
197
- /**
198
- * TODO: Make this test work
199
- */