@promptbook/cli 0.112.0-104 → 0.112.0-106
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/apps/agents-server/src/app/admin/image-generator-test/ImageAttachmentsEditor.tsx +19 -3
- package/apps/agents-server/src/app/admin/limits/LimitsClient.tsx +11 -12
- package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +34 -2
- package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +6 -1
- package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +13 -1
- package/apps/agents-server/src/app/agents/[agentName]/AgentChatWrapper.tsx +11 -2
- package/apps/agents-server/src/app/agents/[agentName]/AgentProfileChat.tsx +11 -1
- package/apps/agents-server/src/app/agents/[agentName]/book/BookEditorWrapper.tsx +7 -1
- package/apps/agents-server/src/app/agents/[agentName]/chat/CanonicalAgentChatSurface.tsx +11 -1
- package/apps/agents-server/src/app/agents/[agentName]/images/default-avatar.png/route.ts +6 -2
- package/apps/agents-server/src/app/api/images/[filename]/route.ts +6 -2
- package/apps/agents-server/src/app/api/internal/agent-runner-limits/route.ts +51 -0
- package/apps/agents-server/src/app/api/upload/route.ts +48 -12
- package/apps/agents-server/src/app/layout.tsx +13 -0
- package/apps/agents-server/src/components/FileUploadAvailability/FileUploadAvailabilityContext.tsx +50 -0
- package/apps/agents-server/src/components/FileUploadAvailability/FileUploadUnavailableNotice.tsx +45 -0
- package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +85 -76
- package/apps/agents-server/src/components/NewAgentDialog/NewAgentDialog.tsx +7 -3
- package/apps/agents-server/src/components/NewAgentDialog/NewAgentWizardKnowledgeStep.tsx +6 -0
- package/apps/agents-server/src/components/NewAgentDialog/useNewAgentWizardKnowledgeState.ts +8 -1
- package/apps/agents-server/src/constants/serverLimits.ts +22 -2
- package/apps/agents-server/src/database/seedDefaultAgents.ts +218 -0
- package/apps/agents-server/src/tools/$provideCdnForServer.ts +72 -8
- package/apps/agents-server/src/utils/defaultAgents/loadDefaultAgentBooks.ts +103 -0
- package/apps/agents-server/src/utils/knowledge/createInlineKnowledgeSourceUploader.ts +24 -5
- package/apps/agents-server/src/utils/serverLimits.ts +26 -1
- package/apps/agents-server/src/utils/serverManagement/createManagedServer/seedServerDefaultAgents.ts +1 -85
- package/apps/agents-server/src/utils/shareTargetPayloads.ts +20 -2
- package/apps/agents-server/src/utils/upload/fileUploadAvailability.ts +91 -0
- package/apps/agents-server/src/utils/upload/uploadFileToServer.ts +46 -2
- package/esm/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
- package/esm/apps/agents-server/src/constants/serverLimits.d.ts +207 -0
- package/esm/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
- package/esm/index.es.js +602 -39
- package/esm/index.es.js.map +1 -1
- package/esm/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
- package/esm/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
- package/esm/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
- package/esm/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
- package/esm/src/book-components/BookEditor/BookEditor.d.ts +5 -4
- package/esm/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
- package/esm/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
- package/esm/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
- package/esm/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
- package/esm/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +6 -0
- package/esm/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/avatars/visuals/octopus3d3AvatarVisual.ts +28 -29
- package/src/book-components/BookEditor/BookEditor.tsx +10 -7
- package/src/book-components/BookEditor/BookEditorMonaco.tsx +3 -1
- package/src/book-components/BookEditor/BookEditorTheme.ts +32 -0
- package/src/book-components/BookEditor/useBookEditorMonacoLanguage.ts +15 -15
- package/src/book-components/BookEditor/useBookEditorMonacoLifecycle.ts +1 -5
- package/src/book-components/BookEditor/useBookEditorMonacoStyles.ts +2 -1
- package/src/cli/cli-commands/agent-folder/agentProjectPaths.ts +7 -0
- package/src/cli/cli-commands/agents-server/buildAgentsServer.ts +109 -9
- package/src/cli/cli-commands/agents-server/startAgentsServer.ts +132 -4
- package/src/other/templates/getTemplatesPipelineCollection.ts +874 -760
- package/src/version.ts +2 -2
- package/src/versions.txt +2 -0
- package/umd/apps/agents-server/src/constants/federatedAgentImport.d.ts +42 -0
- package/umd/apps/agents-server/src/constants/serverLimits.d.ts +207 -0
- package/umd/apps/agents-server/src/constants/toolUsageLimits.d.ts +55 -0
- package/umd/index.umd.js +602 -39
- package/umd/index.umd.js.map +1 -1
- package/umd/scripts/run-agent-messages/main/AgentMessageFailureTracker.d.ts +27 -0
- package/umd/scripts/run-agent-messages/main/handleAgentWatchError.d.ts +4 -0
- package/umd/scripts/run-agent-messages/main/runAgentMessages.d.ts +1 -0
- package/umd/scripts/run-agent-messages/messages/moveAgentMessageToFailed.d.ts +17 -0
- package/umd/src/book-components/BookEditor/BookEditor.d.ts +5 -4
- package/umd/src/book-components/BookEditor/BookEditorTheme.d.ts +24 -0
- package/umd/src/book-components/BookEditor/useBookEditorMonacoLanguage.d.ts +1 -6
- package/umd/src/book-components/BookEditor/useBookEditorMonacoLifecycle.d.ts +1 -4
- package/umd/src/book-components/BookEditor/useBookEditorMonacoStyles.d.ts +2 -1
- package/umd/src/cli/cli-commands/agent-folder/agentProjectPaths.d.ts +6 -0
- package/umd/src/version.d.ts +1 -1
- package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddress.test.ts.todo +0 -108
- package/apps/agents-server/src/message-providers/email/_common/utils/parseEmailAddresses.test.ts.todo +0 -117
- package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddress.test.ts.todo +0 -119
- package/apps/agents-server/src/message-providers/email/_common/utils/stringifyEmailAddresses.test.ts.todo +0 -74
- package/apps/agents-server/src/utils/defaultAgents/defaultAgents.ts +0 -168
- package/apps/agents-server/src/utils/defaultAgents/installDefaultAgents.ts +0 -139
- package/apps/agents-server/tests/e2e/authentication-and-navigation.spec.ts.todo +0 -178
- package/src/_packages/browser.index.ts +0 -31
- package/src/_packages/browser.readme.md +0 -43
- package/src/book-2.0/agent-source/parseAgentSourceWithCommitments.test.ts.todo +0 -265
- package/src/book-components/BookEditor/BookEditorMonaco.test.tsx.todo +0 -115
- package/src/book-components/Chat/utils/renderMarkdown.test.ts.tmp +0 -199
- package/src/collection/agent-collection/constructors/agent-collection-in-directory/AgentCollectionInDirectory.test.ts.todo +0 -131
- package/src/commands/_common/parseCommand.test.ts.todo +0 -48
- package/src/commitments/META_LINK/META_LINK.test.ts.todo +0 -75
- package/src/conversion/validation/pipelineStringToJson-errors.test.ts.todo +0 -33
- package/src/dialogs/simple-prompt/SimplePromptInterfaceTools.ts +0 -51
- package/src/executables/browsers/locateSafari.test.ts.tmp +0 -15
- package/src/execution/PromptbookFetch.test-type.ts +0 -14
- package/src/execution/createPipelineExecutor/00-createPipelineExecutor.test.ts.todo +0 -0
- package/src/execution/execution-report/executionReportJsonToString.test.ts.todo +0 -83
- package/src/execution/utils/usageToHuman.test.ts.todo +0 -80
- package/src/llm-providers/_common/register/$provideLlmToolsForTestingAndScriptsAndPlayground.ts +0 -76
- package/src/llm-providers/_common/utils/assertUniqueModels.ts +0 -27
- package/src/llm-providers/_multiple/playground/playground.ts +0 -141
- package/src/llm-providers/_multiple/playground/tsconfig.json +0 -19
- package/src/llm-providers/agent/playground/playground.ts +0 -190
- package/src/llm-providers/agent/playground/tsconfig.json +0 -19
- package/src/llm-providers/anthropic-claude/playground/playground.ts +0 -99
- package/src/llm-providers/anthropic-claude/playground/tsconfig.json +0 -19
- package/src/llm-providers/azure-openai/playground/playground.ts +0 -101
- package/src/llm-providers/azure-openai/playground/tsconfig.json +0 -19
- package/src/llm-providers/ollama/playground/playground.ts +0 -120
- package/src/llm-providers/ollama/playground/tsconfig.json +0 -19
- package/src/llm-providers/openai/playground/playground.ts +0 -406
- package/src/llm-providers/openai/playground/tsconfig.json +0 -19
- package/src/llm-providers/remote/playground/playground.ts +0 -144
- package/src/llm-providers/remote/playground/tsconfig.json +0 -19
- package/src/llm-providers/vercel/playground/playground.ts +0 -133
- package/src/llm-providers/vercel/playground/tsconfig.json +0 -19
- package/src/personas/preparePersona.test.ts.todo +0 -126
- package/src/playground/backup/_playground-boilerplate.ts.txt +0 -37
- package/src/playground/backup/playground-agent-os.txt +0 -62
- package/src/playground/backup/playground-brj-app.ts.txt +0 -302
- package/src/playground/backup/playground-browser-playwright.txt +0 -110
- package/src/playground/backup/playground-claude-mcp.txt +0 -43
- package/src/playground/backup/playground-document-conversion.txt +0 -84
- package/src/playground/backup/playground-glob.ts.txt +0 -42
- package/src/playground/backup/playground-mcp-server.txt +0 -1
- package/src/playground/backup/playground-openai-agent-kit.txt +0 -73
- package/src/playground/backup/playground-openai-function-calling.txt +0 -131
- package/src/playground/backup/playground-openai-streaming.ts.txt +0 -68
- package/src/playground/backup/playground-scrape-knowledge.txt +0 -65
- package/src/playground/backup/playground-scraperFetch.ts.txt +0 -44
- package/src/playground/backup/playground-using-openai-compatible-route-on-agents-server.ts.txt +0 -49
- package/src/playground/backup/playground-write-pavolhejny-bio.txt +0 -120
- package/src/playground/permanent/_boilerplate.ts +0 -54
- package/src/playground/permanent/agent-with-browser-playground.ts +0 -92
- package/src/playground/permanent/error-handling-playground.ts +0 -103
- package/src/playground/playground.ts +0 -36
- package/src/playground/tsconfig.json +0 -19
- package/src/scrapers/_boilerplate/BoilerplateScraper.test.ts.todo +0 -73
- package/src/scrapers/_boilerplate/playground/boilerplate-scraper-playground.ts +0 -79
- package/src/scrapers/_boilerplate/playground/tsconfig.json +0 -19
- package/src/scrapers/_common/utils/files/blobToDataurl.test.ts.todo +0 -17
- package/src/scrapers/_common/utils/files/dataurlToBlob.test.ts.todo +0 -52
- package/src/scrapers/_common/utils/files/isValidDataurl.test.ts.todo +0 -42
- package/src/scrapers/_common/utils/files/shorten.test.ts.todo +0 -13
- package/src/scrapers/document/playground/document-scraper-playground.ts +0 -80
- package/src/scrapers/document/playground/tsconfig.json +0 -19
- package/src/scrapers/document-legacy/playground/legacy-document-scraper-playground.ts +0 -80
- package/src/scrapers/document-legacy/playground/tsconfig.json +0 -19
- package/src/scrapers/markdown/playground/markdown-scraper-playground.ts +0 -74
- package/src/scrapers/markdown/playground/tsconfig.json +0 -19
- package/src/scrapers/markitdown/MarkitdownScraper.test.ts.todo +0 -132
- package/src/scrapers/markitdown/playground/markitdown-scraper-playground.ts +0 -91
- package/src/scrapers/markitdown/playground/tsconfig.json +0 -19
- package/src/scrapers/pdf/PdfScraper.test.ts.todo +0 -52
- package/src/scrapers/pdf/playground/pdf-scraper-playground.ts +0 -75
- package/src/scrapers/pdf/playground/tsconfig.json +0 -19
- package/src/scrapers/website/playground/tsconfig.json +0 -19
- package/src/scrapers/website/playground/website-scraper-playground.ts +0 -82
- package/src/storage/_common/PromptbookStorage.test-type.ts +0 -14
- package/src/storage/local-storage/getIndexedDbStorage.ts +0 -36
- package/src/storage/local-storage/getLocalStorage.ts +0 -33
- package/src/storage/local-storage/getSessionStorage.ts +0 -33
- package/src/storage/local-storage/utils/IndexedDbStorageOptions.ts +0 -16
- package/src/storage/local-storage/utils/makePromptbookStorageFromIndexedDb.ts +0 -58
- package/src/storage/local-storage/utils/makePromptbookStorageFromWebStorage.ts +0 -45
- package/src/transpilers/formatted-book-in-markdown/FormattedBookInMarkdownTranspiler.test.ts.todo +0 -35
- package/src/transpilers/openai-sdk/playground/playground.ts +0 -85
- package/src/transpilers/openai-sdk/playground/tmp/chatbot-openaisdk-1.js +0 -194
- package/src/transpilers/openai-sdk/playground/tmp/package.json +0 -3
- package/src/transpilers/openai-sdk/playground/tsconfig.json +0 -18
- package/src/utils/editable/utils/findUsableParameters.test.ts.todo +0 -43
- package/src/utils/editable/utils/stringifyPipelineJson.test.ts.todo +0 -38
- package/src/utils/markdown/prettifyMarkdown.test.ts.tmp +0 -42
- 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('')).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
|
-
*/
|