@promptbook/cli 0.114.0-1 → 0.114.0-3

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 (199) hide show
  1. package/README.md +16 -15
  2. package/apps/agents-server/next.config.ts +11 -0
  3. package/apps/agents-server/package.json +6 -4
  4. package/apps/agents-server/playwright.config.ts +28 -38
  5. package/apps/agents-server/scripts/build-agents-server.js +62 -0
  6. package/apps/agents-server/scripts/build-e2e.js +38 -0
  7. package/apps/agents-server/scripts/ensure-root-dependencies.js +86 -0
  8. package/apps/agents-server/scripts/prerender-homepage.js +1 -1
  9. package/apps/agents-server/scripts/run-e2e-tests.js +34 -0
  10. package/apps/agents-server/scripts/run-npm.js +42 -0
  11. package/apps/agents-server/src/app/admin/email-server/page.tsx +14 -6
  12. package/apps/agents-server/src/app/api/elevenlabs/tts/route.ts +3 -3
  13. package/apps/agents-server/src/app/api/onboarding/book/route.ts +7 -6
  14. package/apps/agents-server/src/app/layout.tsx +6 -0
  15. package/apps/agents-server/src/app/superadmin/servers/ServersRegistryTable.tsx +105 -102
  16. package/apps/agents-server/src/app/superadmin/servers/useServersRegistryState.ts +15 -7
  17. package/apps/agents-server/src/components/AgentProjectDnsInstructions/AgentProjectDnsInstructions.tsx +11 -11
  18. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/ManGoBookEditor.tsx +82 -0
  19. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/WizardShell.tsx +2 -2
  20. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/BookStep.tsx +13 -16
  21. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/steps/ZadaniStep.tsx +4 -4
  22. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/config/bookSections.ts +23 -16
  23. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/lib/bookSource.ts +54 -0
  24. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/bookService.ts +15 -8
  25. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/createManGoAgentSource.ts +3 -37
  26. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/createManGoOpenEditorRequest.ts +1 -1
  27. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/state/OnboardingProvider.tsx +2 -2
  28. package/apps/agents-server/src/components/UsersList/CreateUserDialog.tsx +13 -22
  29. package/apps/agents-server/src/components/UsersList/PasswordGeneratorDialog.tsx +216 -0
  30. package/apps/agents-server/src/components/UsersList/UsersList.tsx +16 -11
  31. package/apps/agents-server/src/components/UsersList/generateSecurePassword.ts +112 -24
  32. package/apps/agents-server/src/components/UsersList/userDialogClassNames.ts +11 -0
  33. package/apps/agents-server/src/languages/ServerTranslationKeys.ts +11 -0
  34. package/apps/agents-server/src/languages/translations/czech.yaml +11 -0
  35. package/apps/agents-server/src/languages/translations/english.yaml +11 -0
  36. package/apps/agents-server/src/utils/agentProjects/agentProjectHrefs.ts +11 -0
  37. package/apps/agents-server/src/utils/agentProjects/createAgentProjectDnsRecords.ts +53 -7
  38. package/apps/agents-server/src/utils/agentProjects/createAgentProjectMarkdownReferences.ts +37 -27
  39. package/apps/agents-server/src/utils/manGoOnboarding/manGoOnboardingAgentBooks.ts +2 -13
  40. package/apps/agents-server/src/utils/manGoOnboarding/manGoOnboardingAgentRuntime.ts +21 -73
  41. package/apps/agents-server/src/utils/stalwart/createEmailDnsInstructions.ts +9 -5
  42. package/apps/agents-server/src/utils/stalwart/readStalwartEmailSnapshot.ts +23 -5
  43. package/apps/agents-server/src/utils/stalwart/stalwartBootstrap.ts +2 -1
  44. package/apps/agents-server/src/utils/stalwart/stalwartMailBridge.ts +7 -0
  45. package/apps/agents-server/tests/e2e/e2eEnvironment.cjs +49 -0
  46. package/esm/index.es.js +1105 -273
  47. package/esm/index.es.js.map +1 -1
  48. package/esm/scripts/run-codex-prompts/common/runGoScript/scriptExecutionLog.d.ts +7 -0
  49. package/esm/scripts/run-codex-prompts/git/coderGitSync.d.ts +43 -0
  50. package/esm/scripts/run-codex-prompts/git/commitChanges.d.ts +3 -0
  51. package/esm/scripts/run-codex-prompts/main/resolvePromptRunner.d.ts +8 -1
  52. package/esm/scripts/run-codex-prompts/ping/buildCoderPingPrompt.d.ts +20 -0
  53. package/esm/scripts/run-codex-prompts/ping/extractCoderPingAnswer.d.ts +9 -0
  54. package/esm/scripts/run-codex-prompts/ping/pingCoderHarness.d.ts +23 -0
  55. package/esm/scripts/run-codex-prompts/ping/printCoderPingResult.d.ts +5 -0
  56. package/esm/scripts/run-codex-prompts/prompts/findNextTodoPrompt.d.ts +2 -1
  57. package/esm/scripts/run-codex-prompts/prompts/isPromptCompatibleWithRunner.d.ts +27 -0
  58. package/esm/scripts/run-codex-prompts/prompts/listRunnablePrompts.d.ts +2 -1
  59. package/esm/scripts/run-codex-prompts/prompts/listUpcomingTasks.d.ts +2 -1
  60. package/esm/scripts/run-codex-prompts/prompts/replacePromptTodoStatusLine.d.ts +7 -0
  61. package/esm/scripts/run-codex-prompts/testing/TestBeforeMode.d.ts +16 -0
  62. package/esm/scripts/run-codex-prompts/testing/createTestBeforeRepairPrompt.d.ts +9 -0
  63. package/esm/scripts/run-codex-prompts/testing/limitTestOutput.d.ts +4 -0
  64. package/esm/scripts/run-codex-prompts/testing/runPromptTestCommand.d.ts +1 -2
  65. package/esm/scripts/run-codex-prompts/testing/runTestBefore.d.ts +24 -0
  66. package/esm/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +1 -0
  67. package/esm/scripts/verify-prompts/verify-prompts.d.ts +5 -0
  68. package/esm/src/book-2.0/book-language-documentation/BookLanguageManualDictionary.d.ts +1 -15
  69. package/esm/src/book-2.0/book-language-documentation/getBookLanguageManualCommitmentGroups.d.ts +1 -1
  70. package/esm/src/book-2.0/book-language-documentation/renderCommitmentCatalogSection.d.ts +0 -4
  71. package/esm/src/book-components/Chat/utils/$provideServerDomWindow.d.ts +11 -0
  72. package/esm/src/book-components/Chat/utils/renderMarkdown.d.ts +7 -0
  73. package/esm/src/cli/cli-commands/agents-server/buildAgentsServer/createAgentsServerRuntimeEnvironment.d.ts +7 -0
  74. package/esm/src/cli/cli-commands/coder/agentCodingFile.d.ts +2 -3
  75. package/esm/src/cli/cli-commands/coder/ping.d.ts +10 -0
  76. package/esm/src/cli/cli-commands/coder/ping.test.d.ts +1 -0
  77. package/esm/src/cli/cli-commands/coder.d.ts +1 -0
  78. package/esm/src/cli/cli-commands/common/coderGitSyncCliOptions.d.ts +34 -0
  79. package/esm/src/cli/cli-commands/common/coderGitSyncCliOptions.test.d.ts +1 -0
  80. package/esm/src/cli/common/loadPromptsModule.d.ts +16 -0
  81. package/esm/src/llm-providers/anthropic-claude/AnthropicClaudeExecutionTools.d.ts +1 -1
  82. package/esm/src/llm-providers/azure-openai/AzureOpenAiExecutionTools.d.ts +1 -1
  83. package/esm/src/llm-providers/openai/OpenAiAgentKitExecutionTools.d.ts +1 -1
  84. package/esm/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.d.ts +1 -1
  85. package/esm/src/llm-providers/openai/OpenAiAssistantExecutionToolsStreamRunner.d.ts +1 -1
  86. package/esm/src/llm-providers/openai/OpenAiAssistantExecutionToolsToolRunner.d.ts +1 -1
  87. package/esm/src/llm-providers/openai/OpenAiCompatibleNonChatPromptCaller.d.ts +1 -1
  88. package/esm/src/llm-providers/openai/OpenAiCompatibleRequestManager.d.ts +1 -1
  89. package/esm/src/llm-providers/openai/utils/callOpenAiCompatibleChatModel.d.ts +1 -1
  90. package/esm/src/llm-providers/openai/utils/loadOpenAiAgentsModule.d.ts +203 -0
  91. package/esm/src/llm-providers/openai/utils/uploadFilesToOpenAi.d.ts +1 -1
  92. package/esm/src/utils/misc/createLazyModuleLoader.d.ts +14 -0
  93. package/esm/src/version.d.ts +1 -1
  94. package/package.json +1 -1
  95. package/src/book-2.0/book-language-documentation/BookLanguageManualDictionary.ts +1 -15
  96. package/src/book-2.0/book-language-documentation/bookLanguageDocumentationExamples.ts +1 -2
  97. package/src/book-2.0/book-language-documentation/createStandaloneBookLanguageMarkdown.ts +92 -32
  98. package/src/book-2.0/book-language-documentation/czechBookLanguageManualDictionary.ts +16 -39
  99. package/src/book-2.0/book-language-documentation/englishBookLanguageManualDictionary.ts +16 -36
  100. package/src/book-2.0/book-language-documentation/getBookLanguageManualCommitmentGroups.ts +9 -1
  101. package/src/book-2.0/book-language-documentation/renderCommitmentCatalogSection.ts +4 -51
  102. package/src/book-2.0/book-language-documentation/renderGroupedCommitmentDocumentationMarkdown.ts +291 -4
  103. package/src/book-3.0/LiteAgent.ts +11 -9
  104. package/src/book-components/Chat/utils/$provideServerDomWindow.ts +77 -0
  105. package/src/book-components/Chat/utils/renderMarkdown.ts +135 -32
  106. package/src/cli/cli-commands/agents-server/buildAgentsServer/createAgentsServerRuntimeEnvironment.ts +14 -0
  107. package/src/cli/cli-commands/agents-server/buildAgentsServer/ensureAgentsServerBuild.ts +1 -0
  108. package/src/cli/cli-commands/agents-server/startAgentsServer/createLocalAgentRunOptions.ts +1 -0
  109. package/src/cli/cli-commands/coder/add.ts +40 -12
  110. package/src/cli/cli-commands/coder/agentCodingFile.ts +6 -129
  111. package/src/cli/cli-commands/coder/generate-boilerplates.ts +31 -5
  112. package/src/cli/cli-commands/coder/getDefaultCoderPackageJsonScripts.ts +1 -1
  113. package/src/cli/cli-commands/coder/init.ts +27 -1
  114. package/src/cli/cli-commands/coder/initializeCoderProjectConfiguration.ts +1 -4
  115. package/src/cli/cli-commands/coder/ping.ts +72 -0
  116. package/src/cli/cli-commands/coder/run.ts +25 -2
  117. package/src/cli/cli-commands/coder/verify.ts +27 -12
  118. package/src/cli/cli-commands/coder.ts +4 -0
  119. package/src/cli/cli-commands/common/coderGitSyncCliOptions.ts +78 -0
  120. package/src/cli/cli-commands/run/prepareRunCommandResources.ts +2 -1
  121. package/src/cli/cli-commands/run/resolveRunInputParameters.ts +2 -1
  122. package/src/cli/cli-commands/runInteractiveChatbot.ts +2 -1
  123. package/src/cli/common/$provideLlmToolsForCli.ts +2 -1
  124. package/src/cli/common/loadPromptsModule.ts +13 -0
  125. package/src/conversion/archive/loadArchive.ts +2 -1
  126. package/src/conversion/archive/loadJsZipModule.ts +10 -0
  127. package/src/conversion/archive/saveArchive.ts +2 -1
  128. package/src/llm-providers/anthropic-claude/AnthropicClaudeExecutionTools.ts +13 -1
  129. package/src/llm-providers/azure-openai/AzureOpenAiExecutionTools.ts +13 -1
  130. package/src/llm-providers/openai/OpenAiAgentKitExecutionTools.ts +6 -2
  131. package/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.ts +7 -5
  132. package/src/llm-providers/openai/OpenAiAssistantExecutionTools.ts +1 -1
  133. package/src/llm-providers/openai/OpenAiAssistantExecutionToolsStreamRunner.ts +1 -1
  134. package/src/llm-providers/openai/OpenAiAssistantExecutionToolsToolRunner.ts +1 -1
  135. package/src/llm-providers/openai/OpenAiCompatibleNonChatPromptCaller.ts +1 -1
  136. package/src/llm-providers/openai/OpenAiCompatibleRequestManager.ts +12 -1
  137. package/src/llm-providers/openai/utils/callOpenAiCompatibleChatModel.ts +1 -1
  138. package/src/llm-providers/openai/utils/loadOpenAiAgentsModule.ts +11 -0
  139. package/src/llm-providers/openai/utils/uploadFilesToOpenAi.ts +1 -1
  140. package/src/other/templates/getTemplatesPipelineCollection.ts +731 -923
  141. package/src/remote-server/createRemoteClient.ts +12 -1
  142. package/src/scrapers/website/WebsiteScraper.ts +22 -2
  143. package/src/utils/agent-message-runtime/resolveAgentMessageRuntimeActivity.ts +101 -0
  144. package/src/utils/misc/createLazyModuleLoader.ts +27 -0
  145. package/src/version.ts +2 -2
  146. package/src/versions.txt +2 -1
  147. package/umd/index.umd.js +1180 -342
  148. package/umd/index.umd.js.map +1 -1
  149. package/umd/scripts/run-codex-prompts/common/runGoScript/scriptExecutionLog.d.ts +7 -0
  150. package/umd/scripts/run-codex-prompts/git/coderGitSync.d.ts +43 -0
  151. package/umd/scripts/run-codex-prompts/git/commitChanges.d.ts +3 -0
  152. package/umd/scripts/run-codex-prompts/main/resolvePromptRunner.d.ts +8 -1
  153. package/umd/scripts/run-codex-prompts/ping/buildCoderPingPrompt.d.ts +20 -0
  154. package/umd/scripts/run-codex-prompts/ping/extractCoderPingAnswer.d.ts +9 -0
  155. package/umd/scripts/run-codex-prompts/ping/pingCoderHarness.d.ts +23 -0
  156. package/umd/scripts/run-codex-prompts/ping/printCoderPingResult.d.ts +5 -0
  157. package/umd/scripts/run-codex-prompts/prompts/findNextTodoPrompt.d.ts +2 -1
  158. package/umd/scripts/run-codex-prompts/prompts/isPromptCompatibleWithRunner.d.ts +27 -0
  159. package/umd/scripts/run-codex-prompts/prompts/listRunnablePrompts.d.ts +2 -1
  160. package/umd/scripts/run-codex-prompts/prompts/listUpcomingTasks.d.ts +2 -1
  161. package/umd/scripts/run-codex-prompts/prompts/replacePromptTodoStatusLine.d.ts +7 -0
  162. package/umd/scripts/run-codex-prompts/testing/TestBeforeMode.d.ts +16 -0
  163. package/umd/scripts/run-codex-prompts/testing/createTestBeforeRepairPrompt.d.ts +9 -0
  164. package/umd/scripts/run-codex-prompts/testing/limitTestOutput.d.ts +4 -0
  165. package/umd/scripts/run-codex-prompts/testing/runPromptTestCommand.d.ts +1 -2
  166. package/umd/scripts/run-codex-prompts/testing/runTestBefore.d.ts +24 -0
  167. package/umd/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +1 -0
  168. package/umd/scripts/verify-prompts/verify-prompts.d.ts +5 -0
  169. package/umd/src/book-2.0/book-language-documentation/BookLanguageManualDictionary.d.ts +1 -15
  170. package/umd/src/book-2.0/book-language-documentation/getBookLanguageManualCommitmentGroups.d.ts +1 -1
  171. package/umd/src/book-2.0/book-language-documentation/renderCommitmentCatalogSection.d.ts +0 -4
  172. package/umd/src/book-components/Chat/utils/$provideServerDomWindow.d.ts +11 -0
  173. package/umd/src/book-components/Chat/utils/renderMarkdown.d.ts +7 -0
  174. package/umd/src/cli/cli-commands/agents-server/buildAgentsServer/createAgentsServerRuntimeEnvironment.d.ts +7 -0
  175. package/umd/src/cli/cli-commands/coder/agentCodingFile.d.ts +2 -3
  176. package/umd/src/cli/cli-commands/coder/ping.d.ts +10 -0
  177. package/umd/src/cli/cli-commands/coder/ping.test.d.ts +1 -0
  178. package/umd/src/cli/cli-commands/coder.d.ts +1 -0
  179. package/umd/src/cli/cli-commands/common/coderGitSyncCliOptions.d.ts +34 -0
  180. package/umd/src/cli/cli-commands/common/coderGitSyncCliOptions.test.d.ts +1 -0
  181. package/umd/src/cli/common/loadPromptsModule.d.ts +16 -0
  182. package/umd/src/llm-providers/anthropic-claude/AnthropicClaudeExecutionTools.d.ts +1 -1
  183. package/umd/src/llm-providers/azure-openai/AzureOpenAiExecutionTools.d.ts +1 -1
  184. package/umd/src/llm-providers/openai/OpenAiAgentKitExecutionTools.d.ts +1 -1
  185. package/umd/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.d.ts +1 -1
  186. package/umd/src/llm-providers/openai/OpenAiAssistantExecutionToolsStreamRunner.d.ts +1 -1
  187. package/umd/src/llm-providers/openai/OpenAiAssistantExecutionToolsToolRunner.d.ts +1 -1
  188. package/umd/src/llm-providers/openai/OpenAiCompatibleNonChatPromptCaller.d.ts +1 -1
  189. package/umd/src/llm-providers/openai/OpenAiCompatibleRequestManager.d.ts +1 -1
  190. package/umd/src/llm-providers/openai/utils/callOpenAiCompatibleChatModel.d.ts +1 -1
  191. package/umd/src/llm-providers/openai/utils/loadOpenAiAgentsModule.d.ts +203 -0
  192. package/umd/src/llm-providers/openai/utils/uploadFilesToOpenAi.d.ts +1 -1
  193. package/umd/src/utils/misc/createLazyModuleLoader.d.ts +14 -0
  194. package/umd/src/version.d.ts +1 -1
  195. package/apps/agents-server/src/app/api/onboarding/draft/route.ts +0 -23
  196. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/BookLanguagePanel.tsx +0 -125
  197. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/MarkdownBookEditor.tsx +0 -154
  198. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/components/MarkdownPreview.tsx +0 -188
  199. package/apps/agents-server/src/components/NewAgentDialog/ManGoNewAgentWizard/services/draftService.ts +0 -32
@@ -0,0 +1,203 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Loads the OpenAI AgentKit SDK (`@openai/agents`) on demand
4
+ *
5
+ * Note: [🐌] The AgentKit SDK is one of the heaviest dependencies of Promptbook, loading it eagerly would slow down
6
+ * every single run of the `ptbk` CLI utility even when no AgentKit agent is used
7
+ *
8
+ * @private internal utility of `@promptbook/openai`
9
+ */
10
+ export declare const loadOpenAiAgentsModule: () => Promise<{
11
+ default: typeof import("@openai/agents");
12
+ applyPatchTool: typeof import("@openai/agents").applyPatchTool;
13
+ shellTool: typeof import("@openai/agents").shellTool;
14
+ realtime: typeof import("@openai/agents-realtime");
15
+ RuntimeEventEmitter: typeof import("events");
16
+ Agent: typeof import("@openai/agents").Agent;
17
+ AgentsError: typeof import("@openai/agents").AgentsError;
18
+ GuardrailExecutionError: typeof import("@openai/agents").GuardrailExecutionError;
19
+ InputGuardrailTripwireTriggered: typeof import("@openai/agents").InputGuardrailTripwireTriggered;
20
+ MaxTurnsExceededError: typeof import("@openai/agents").MaxTurnsExceededError;
21
+ ModelBehaviorError: typeof import("@openai/agents").ModelBehaviorError;
22
+ OutputGuardrailTripwireTriggered: typeof import("@openai/agents").OutputGuardrailTripwireTriggered;
23
+ ToolInputGuardrailTripwireTriggered: typeof import("@openai/agents").ToolInputGuardrailTripwireTriggered;
24
+ ToolOutputGuardrailTripwireTriggered: typeof import("@openai/agents").ToolOutputGuardrailTripwireTriggered;
25
+ ToolCallError: typeof import("@openai/agents").ToolCallError;
26
+ ToolTimeoutError: typeof import("@openai/agents").ToolTimeoutError;
27
+ UserError: typeof import("@openai/agents").UserError;
28
+ SystemError: typeof import("@openai/agents").SystemError;
29
+ RunAgentUpdatedStreamEvent: typeof import("@openai/agents").RunAgentUpdatedStreamEvent;
30
+ RunRawModelStreamEvent: typeof import("@openai/agents").RunRawModelStreamEvent;
31
+ RunItemStreamEvent: typeof import("@openai/agents").RunItemStreamEvent;
32
+ defineOutputGuardrail: typeof import("@openai/agents").defineOutputGuardrail;
33
+ ToolGuardrailFunctionOutputFactory: {
34
+ allow(outputInfo?: any): import("@openai/agents").ToolGuardrailFunctionOutput;
35
+ rejectContent(message: string, outputInfo?: any): import("@openai/agents").ToolGuardrailFunctionOutput;
36
+ throwException(outputInfo?: any): import("@openai/agents").ToolGuardrailFunctionOutput;
37
+ };
38
+ defineToolInputGuardrail: typeof import("@openai/agents").defineToolInputGuardrail;
39
+ defineToolOutputGuardrail: typeof import("@openai/agents").defineToolOutputGuardrail;
40
+ resolveToolInputGuardrails: typeof import("@openai/agents").resolveToolInputGuardrails;
41
+ resolveToolOutputGuardrails: typeof import("@openai/agents").resolveToolOutputGuardrails;
42
+ getHandoff: typeof import("@openai/agents").getHandoff;
43
+ getTransferMessage: typeof import("@openai/agents").getTransferMessage;
44
+ Handoff: typeof import("@openai/agents").Handoff;
45
+ handoff: typeof import("@openai/agents").handoff;
46
+ assistant: typeof import("@openai/agents").assistant;
47
+ system: typeof import("@openai/agents").system;
48
+ user: typeof import("@openai/agents").user;
49
+ extractAllTextOutput: typeof import("@openai/agents").extractAllTextOutput;
50
+ RunHandoffCallItem: typeof import("@openai/agents").RunHandoffCallItem;
51
+ RunHandoffOutputItem: typeof import("@openai/agents").RunHandoffOutputItem;
52
+ RunMessageOutputItem: typeof import("@openai/agents").RunMessageOutputItem;
53
+ RunReasoningItem: typeof import("@openai/agents").RunReasoningItem;
54
+ RunToolApprovalItem: typeof import("@openai/agents").RunToolApprovalItem;
55
+ RunToolCallItem: typeof import("@openai/agents").RunToolCallItem;
56
+ RunToolCallOutputItem: typeof import("@openai/agents").RunToolCallOutputItem;
57
+ AgentHooks: typeof import("@openai/agents").AgentHooks;
58
+ getLogger: typeof import("@openai/agents").getLogger;
59
+ applyDiff: typeof import("@openai/agents").applyDiff;
60
+ getAllMcpTools: typeof import("@openai/agents").getAllMcpTools;
61
+ invalidateServerToolsCache: typeof import("@openai/agents").invalidateServerToolsCache;
62
+ mcpToFunctionTool: typeof import("@openai/agents").mcpToFunctionTool;
63
+ MCPServerStdio: typeof import("@openai/agents").MCPServerStdio;
64
+ MCPServerStreamableHttp: typeof import("@openai/agents").MCPServerStreamableHttp;
65
+ MCPServerSSE: typeof import("@openai/agents").MCPServerSSE;
66
+ MCPServers: typeof import("@openai/agents").MCPServers;
67
+ connectMcpServers: typeof import("@openai/agents").connectMcpServers;
68
+ createMCPToolStaticFilter: typeof import("@openai/agents").createMCPToolStaticFilter;
69
+ OPENAI_DEFAULT_MODEL_ENV_VARIABLE_NAME: "OPENAI_DEFAULT_MODEL";
70
+ gpt5ReasoningSettingsRequired: typeof import("@openai/agents").gpt5ReasoningSettingsRequired;
71
+ getDefaultModel: typeof import("@openai/agents").getDefaultModel;
72
+ getDefaultModelSettings: typeof import("@openai/agents").getDefaultModelSettings;
73
+ isGpt5Default: typeof import("@openai/agents").isGpt5Default;
74
+ setDefaultModelProvider: typeof import("@openai/agents").setDefaultModelProvider;
75
+ RunResult: typeof import("@openai/agents").RunResult;
76
+ StreamedRunResult: typeof import("@openai/agents").StreamedRunResult;
77
+ run: typeof import("@openai/agents").run;
78
+ Runner: typeof import("@openai/agents").Runner;
79
+ RunContext: typeof import("@openai/agents").RunContext;
80
+ RunState: typeof import("@openai/agents").RunState;
81
+ computerTool: typeof import("@openai/agents").computerTool;
82
+ hostedMcpTool: typeof import("@openai/agents").hostedMcpTool;
83
+ tool: typeof import("@openai/agents").tool;
84
+ invokeFunctionTool: typeof import("@openai/agents").invokeFunctionTool;
85
+ getGlobalTraceProvider: typeof import("@openai/agents").getGlobalTraceProvider;
86
+ TraceProvider: typeof import("@openai/agents").TraceProvider;
87
+ runToolInputGuardrails: typeof import("@openai/agents").runToolInputGuardrails;
88
+ runToolOutputGuardrails: typeof import("@openai/agents").runToolOutputGuardrails;
89
+ RequestUsage: typeof import("@openai/agents").RequestUsage;
90
+ Usage: typeof import("@openai/agents").Usage;
91
+ isOpenAIResponsesCompactionAwareSession: typeof import("@openai/agents").isOpenAIResponsesCompactionAwareSession;
92
+ MemorySession: typeof import("@openai/agents").MemorySession;
93
+ protocol: typeof import("@openai/agents-core/dist/types/protocol");
94
+ addTraceProcessor(processor: import("@openai/agents").TracingProcessor): void;
95
+ setTraceProcessors(processors: import("@openai/agents").TracingProcessor[]): void;
96
+ setTracingDisabled(disabled: boolean): void;
97
+ startTraceExportLoop(): void;
98
+ getCurrentSpan: typeof import("@openai/agents").getCurrentSpan;
99
+ getCurrentTrace: typeof import("@openai/agents").getCurrentTrace;
100
+ getOrCreateTrace: typeof import("@openai/agents").getOrCreateTrace;
101
+ resetCurrentSpan: typeof import("@openai/agents").resetCurrentSpan;
102
+ setCurrentSpan: typeof import("@openai/agents").setCurrentSpan;
103
+ withTrace: typeof import("@openai/agents").withTrace;
104
+ BatchTraceProcessor: typeof import("@openai/agents").BatchTraceProcessor;
105
+ ConsoleSpanExporter: typeof import("@openai/agents").ConsoleSpanExporter;
106
+ NoopSpan: typeof import("@openai/agents").NoopSpan;
107
+ Span: typeof import("@openai/agents").Span;
108
+ NoopTrace: typeof import("@openai/agents").NoopTrace;
109
+ Trace: typeof import("@openai/agents").Trace;
110
+ generateGroupId: typeof import("@openai/agents").generateGroupId;
111
+ generateSpanId: typeof import("@openai/agents").generateSpanId;
112
+ generateTraceId: typeof import("@openai/agents").generateTraceId;
113
+ createResponseSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").ResponseSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").ResponseSpanData>;
114
+ createAgentSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").AgentSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").AgentSpanData>;
115
+ createFunctionSpan(options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").FunctionSpanData>> & {
116
+ data: {
117
+ name: string;
118
+ };
119
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").FunctionSpanData>;
120
+ createHandoffSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").HandoffSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").HandoffSpanData>;
121
+ createGenerationSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").GenerationSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").GenerationSpanData>;
122
+ createCustomSpan(options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").CustomSpanData>> & {
123
+ data: {
124
+ name: string;
125
+ };
126
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").CustomSpanData>;
127
+ createGuardrailSpan(options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").GuardrailSpanData>> & {
128
+ data: {
129
+ name: string;
130
+ };
131
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").GuardrailSpanData>;
132
+ createTranscriptionSpan(options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").TranscriptionSpanData>> & {
133
+ data: {
134
+ input: {
135
+ data: string;
136
+ format: (string & {}) | "pcm";
137
+ };
138
+ };
139
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").TranscriptionSpanData>;
140
+ createSpeechSpan(options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").SpeechSpanData>> & {
141
+ data: {
142
+ output: {
143
+ data: string;
144
+ format: (string & {}) | "pcm";
145
+ };
146
+ };
147
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").SpeechSpanData>;
148
+ createSpeechGroupSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").SpeechGroupSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").SpeechGroupSpanData>;
149
+ createMCPListToolsSpan(options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").MCPListToolsSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined): import("@openai/agents").Span<import("@openai/agents").MCPListToolsSpanData>;
150
+ withResponseSpan: <TOutput>(fn: (span: import("@openai/agents").Span<import("@openai/agents").ResponseSpanData>) => Promise<TOutput>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").ResponseSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput>;
151
+ withAgentSpan: <TOutput_1>(fn: (span: import("@openai/agents").Span<import("@openai/agents").AgentSpanData>) => Promise<TOutput_1>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").AgentSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_1>;
152
+ withFunctionSpan: <TOutput_2>(fn: (span: import("@openai/agents").Span<import("@openai/agents").FunctionSpanData>) => Promise<TOutput_2>, options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").FunctionSpanData>> & {
153
+ data: {
154
+ name: string;
155
+ };
156
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_2>;
157
+ withHandoffSpan: <TOutput_3>(fn: (span: import("@openai/agents").Span<import("@openai/agents").HandoffSpanData>) => Promise<TOutput_3>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").HandoffSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_3>;
158
+ withGenerationSpan: <TOutput_4>(fn: (span: import("@openai/agents").Span<import("@openai/agents").GenerationSpanData>) => Promise<TOutput_4>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").GenerationSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_4>;
159
+ withCustomSpan: <TOutput_5>(fn: (span: import("@openai/agents").Span<import("@openai/agents").CustomSpanData>) => Promise<TOutput_5>, options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").CustomSpanData>> & {
160
+ data: {
161
+ name: string;
162
+ };
163
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_5>;
164
+ withGuardrailSpan: <TOutput_6>(fn: (span: import("@openai/agents").Span<import("@openai/agents").GuardrailSpanData>) => Promise<TOutput_6>, options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").GuardrailSpanData>> & {
165
+ data: {
166
+ name: string;
167
+ };
168
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_6>;
169
+ withTranscriptionSpan: <TOutput_7>(fn: (span: import("@openai/agents").Span<import("@openai/agents").TranscriptionSpanData>) => Promise<TOutput_7>, options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").TranscriptionSpanData>> & {
170
+ data: {
171
+ input: {
172
+ data: string;
173
+ format: (string & {}) | "pcm";
174
+ };
175
+ };
176
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_7>;
177
+ withSpeechSpan: <TOutput_8>(fn: (span: import("@openai/agents").Span<import("@openai/agents").SpeechSpanData>) => Promise<TOutput_8>, options: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").SpeechSpanData>> & {
178
+ data: {
179
+ output: {
180
+ data: string;
181
+ format: (string & {}) | "pcm";
182
+ };
183
+ };
184
+ }, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_8>;
185
+ withSpeechGroupSpan: <TOutput_9>(fn: (span: import("@openai/agents").Span<import("@openai/agents").SpeechGroupSpanData>) => Promise<TOutput_9>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").SpeechGroupSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_9>;
186
+ withMCPListToolsSpan: <TOutput_10>(fn: (span: import("@openai/agents").Span<import("@openai/agents").MCPListToolsSpanData>) => Promise<TOutput_10>, options?: import("@openai/agents-core/types").DeepPartial<import("@openai/agents-core/dist/tracing/provider").CreateSpanOptions<import("@openai/agents").MCPListToolsSpanData>> | undefined, parent?: import("@openai/agents").Trace | import("@openai/agents").Span<any> | undefined) => Promise<TOutput_10>;
187
+ OpenAIProvider: typeof import("@openai/agents").OpenAIProvider;
188
+ OpenAIResponsesModel: typeof import("@openai/agents").OpenAIResponsesModel;
189
+ OpenAIChatCompletionsModel: typeof import("@openai/agents").OpenAIChatCompletionsModel;
190
+ setDefaultOpenAIClient: typeof import("@openai/agents").setDefaultOpenAIClient;
191
+ setOpenAIAPI: typeof import("@openai/agents").setOpenAIAPI;
192
+ setDefaultOpenAIKey: typeof import("@openai/agents").setDefaultOpenAIKey;
193
+ setTracingExportApiKey: typeof import("@openai/agents").setTracingExportApiKey;
194
+ setDefaultOpenAITracingExporter: typeof import("@openai/agents").setDefaultOpenAITracingExporter;
195
+ OpenAITracingExporter: typeof import("@openai/agents").OpenAITracingExporter;
196
+ webSearchTool: typeof import("@openai/agents").webSearchTool;
197
+ fileSearchTool: typeof import("@openai/agents").fileSearchTool;
198
+ codeInterpreterTool: typeof import("@openai/agents").codeInterpreterTool;
199
+ imageGenerationTool: typeof import("@openai/agents").imageGenerationTool;
200
+ OpenAIConversationsSession: typeof import("@openai/agents").OpenAIConversationsSession;
201
+ startOpenAIConversationsSession: typeof import("@openai/agents").startOpenAIConversationsSession;
202
+ OpenAIResponsesCompactionSession: typeof import("@openai/agents").OpenAIResponsesCompactionSession;
203
+ }>;
@@ -1,4 +1,4 @@
1
- import OpenAI from 'openai';
1
+ import type OpenAI from 'openai';
2
2
  /**
3
3
  * Uploads files to OpenAI and returns their IDs
4
4
  *
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Creates a loader which imports one module on the first call and reuses the very same module afterwards
3
+ *
4
+ * Note: [🐌] Heavy third-party dependencies are imported lazily to keep the startup of the Promptbook CLI fast.
5
+ * A statically imported dependency is loaded every single time the bundle is loaded, even when the running
6
+ * command never touches it. A lazily imported dependency is loaded only when the feature is really used.
7
+ *
8
+ * @example
9
+ * const loadJsdomModule = createLazyModuleLoader(() => import('jsdom'));
10
+ * const { JSDOM } = await loadJsdomModule();
11
+ *
12
+ * @private internal utility of Promptbook
13
+ */
14
+ export declare function createLazyModuleLoader<TModule>(importModule: () => Promise<TModule>): () => Promise<TModule>;
@@ -15,7 +15,7 @@ export declare const BOOK_LANGUAGE_VERSION: string_semantic_version;
15
15
  export declare const PROMPTBOOK_ENGINE_VERSION: string_promptbook_version;
16
16
  /**
17
17
  * Represents the version string of the Promptbook engine.
18
- * It follows semantic versioning (e.g., `0.113.1-0`).
18
+ * It follows semantic versioning (e.g., `0.114.0-2`).
19
19
  *
20
20
  * @generated
21
21
  */
@@ -1,23 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server';
2
- import { createManGoOnboardingApiErrorResponse } from '@/src/utils/manGoOnboarding/manGoOnboardingApiResponses';
3
- import { generateManGoBookDraft } from '@/src/utils/manGoOnboarding/manGoOnboardingAgentRuntime';
4
- import { readManGoOnboardingStringProperty } from '@/src/utils/manGoOnboarding/manGoOnboardingApiRequest';
5
-
6
- /**
7
- * Handles `POST /api/onboarding/draft`.
8
- *
9
- * @param request - Incoming request with `agentName` and `agentBrief`.
10
- * @returns Generated Book draft.
11
- */
12
- export async function POST(request: NextRequest) {
13
- try {
14
- const body = await request.json();
15
- const agentName = readManGoOnboardingStringProperty(body, 'agentName');
16
- const agentBrief = readManGoOnboardingStringProperty(body, 'agentBrief');
17
- const draft = await generateManGoBookDraft({ agentName, agentBrief });
18
-
19
- return NextResponse.json({ draft });
20
- } catch (error) {
21
- return createManGoOnboardingApiErrorResponse(error);
22
- }
23
- }
@@ -1,125 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
-
5
- import type { string_book } from '../../../../../../../src/book-2.0/agent-source/string_book';
6
- import { BookEditor } from '../../../../../../../src/book-components/BookEditor/BookEditor';
7
- import { convertToBook } from '../services/bookService';
8
- import { Badge } from './ui/Badge';
9
- import { Button } from './ui/Button';
10
- import { Spinner } from './ui/Spinner';
11
-
12
- type Phase = 'idle' | 'loading' | 'ready' | 'error';
13
-
14
- /**
15
- * Converts the editor's markdown draft into canonical Book language via the `generateBook`
16
- * endpoint and shows the validated result. Optional, on-demand — keeps the free-markdown
17
- * editing flow intact while exposing the "real" Book artifact.
18
- */
19
- export function BookLanguagePanel({ source }: { readonly source: string }) {
20
- const [phase, setPhase] = useState<Phase>('idle');
21
- const [book, setBook] = useState('');
22
- const [isValid, setIsValid] = useState(true);
23
- const [error, setError] = useState<string | null>(null);
24
- const [generatedFrom, setGeneratedFrom] = useState('');
25
- const [copied, setCopied] = useState(false);
26
-
27
- async function generate() {
28
- setPhase('loading');
29
- setError(null);
30
- try {
31
- const result = await convertToBook(source);
32
- setBook(result.book);
33
- setIsValid(result.isValid);
34
- setGeneratedFrom(source);
35
- setPhase('ready');
36
- } catch (caught) {
37
- setError(caught instanceof Error ? caught.message : 'Převod na Book selhal.');
38
- setPhase('error');
39
- }
40
- }
41
-
42
- function copy() {
43
- void navigator.clipboard?.writeText(book).then(() => {
44
- setCopied(true);
45
- setTimeout(() => setCopied(false), 1500);
46
- });
47
- }
48
-
49
- const isStale = phase === 'ready' && source !== generatedFrom;
50
-
51
- return (
52
- <div className="mt-5 rounded-2xl border border-zinc-200/60 bg-white p-5 shadow-[var(--ob-shadow-sm)]">
53
- <div className="flex items-center justify-between gap-3">
54
- <div className="min-w-0">
55
- <div className="text-sm font-semibold text-zinc-800">Book language</div>
56
- <div className="mt-0.5 text-xs text-zinc-400">
57
- Kanonická, validovaná podoba agenta vygenerovaná z vašeho draftu.
58
- </div>
59
- </div>
60
- {phase === 'ready' && (
61
- <Badge tone={isValid ? 'success' : 'warning'} dot>
62
- {isValid ? 'Validní book' : 'Nevalidní'}
63
- </Badge>
64
- )}
65
- </div>
66
-
67
- {phase === 'idle' && (
68
- <div className="mt-4">
69
- <Button
70
- variant="outline"
71
- size="sm"
72
- disabled={!source.trim()}
73
- leadingIcon={<span aria-hidden>✨</span>}
74
- onClick={() => void generate()}
75
- >
76
- Převést na Book language
77
- </Button>
78
- </div>
79
- )}
80
-
81
- {phase === 'loading' && (
82
- <div className="mt-4 flex items-center gap-2 text-sm text-zinc-500">
83
- <Spinner className="h-4 w-4" /> Generuji Book…
84
- </div>
85
- )}
86
-
87
- {phase === 'error' && (
88
- <div className="mt-4 rounded-xl border border-amber-200 bg-amber-50 px-3.5 py-2.5 text-sm text-amber-800">
89
- <p>{error}</p>
90
- <button
91
- type="button"
92
- onClick={() => void generate()}
93
- className="mt-1 font-medium underline underline-offset-2"
94
- >
95
- Zkusit znovu
96
- </button>
97
- </div>
98
- )}
99
-
100
- {phase === 'ready' && (
101
- <div className="mt-4">
102
- <BookEditor value={book as string_book} isReadonly />
103
- {isStale && (
104
- <p className="mt-2 text-xs text-amber-600">
105
- Draft se od převodu změnil — přegenerujte pro aktuální book.
106
- </p>
107
- )}
108
- <div className="mt-3 flex items-center gap-2">
109
- <Button
110
- variant="outline"
111
- size="sm"
112
- leadingIcon={<span aria-hidden>↻</span>}
113
- onClick={() => void generate()}
114
- >
115
- Přegenerovat
116
- </Button>
117
- <Button variant="ghost" size="sm" onClick={copy}>
118
- {copied ? '✓ Zkopírováno' : 'Kopírovat'}
119
- </Button>
120
- </div>
121
- </div>
122
- )}
123
- </div>
124
- );
125
- }
@@ -1,154 +0,0 @@
1
- 'use client';
2
-
3
- import { useRef, useState } from 'react';
4
-
5
- import { BOOK_SECTION_PRESETS } from '../config/bookSections';
6
- import { cn } from '../lib/cn';
7
- import { MarkdownPreview } from './MarkdownPreview';
8
- import { Badge } from './ui/Badge';
9
- import { Spinner } from './ui/Spinner';
10
-
11
- type MarkdownBookEditorProps = {
12
- readonly value: string;
13
- readonly onChange: (value: string) => void;
14
- readonly onRegenerate?: () => void;
15
- readonly isRegenerating?: boolean;
16
- };
17
-
18
- type ViewMode = 'edit' | 'split' | 'preview';
19
-
20
- const VIEW_MODES: ReadonlyArray<{ id: ViewMode; label: string; icon: string }> = [
21
- { id: 'edit', label: 'Editor', icon: '✎' },
22
- { id: 'split', label: 'Obojí', icon: '⊟' },
23
- { id: 'preview', label: 'Náhled', icon: '◳' },
24
- ];
25
-
26
- const PANE_HEIGHT = 'h-[28rem]';
27
-
28
- export function MarkdownBookEditor({ value, onChange, onRegenerate, isRegenerating }: MarkdownBookEditorProps) {
29
- const textareaRef = useRef<HTMLTextAreaElement>(null);
30
- const [mode, setMode] = useState<ViewMode>('edit');
31
-
32
- function appendSection(markdown: string) {
33
- const trimmed = value.replace(/\s+$/, '');
34
- const next = trimmed ? `${trimmed}\n\n${markdown}\n` : `${markdown}\n`;
35
- onChange(next);
36
-
37
- // Make sure the new section is visible to edit.
38
- if (mode === 'preview') {
39
- setMode('split');
40
- }
41
-
42
- const textarea = textareaRef.current;
43
- if (textarea) {
44
- textarea.focus();
45
- requestAnimationFrame(() => {
46
- textarea.scrollTop = textarea.scrollHeight;
47
- textarea.setSelectionRange(next.length, next.length);
48
- });
49
- }
50
- }
51
-
52
- const isEditorShown = mode !== 'preview';
53
- const isPreviewShown = mode !== 'edit';
54
-
55
- return (
56
- <div>
57
- <div className="overflow-hidden rounded-2xl border border-zinc-200 bg-white shadow-[var(--ob-shadow-md)] transition-shadow focus-within:shadow-[var(--ob-shadow-lg)] focus-within:ring-1 focus-within:ring-[color:var(--ob-accent-200)]">
58
- <div className="flex flex-wrap items-center justify-between gap-3 border-b border-zinc-200 bg-zinc-50/80 px-4 py-2.5">
59
- <span className="flex items-center gap-2 text-[13px] text-zinc-600">
60
- <span aria-hidden>📄</span>
61
- <strong className="font-semibold text-zinc-800">book.md</strong>
62
- <span className="hidden sm:inline">
63
- <Badge tone="accent">Plně editovatelný</Badge>
64
- </span>
65
- </span>
66
- <span className="flex items-center gap-2">
67
- <ViewToggle mode={mode} onChange={setMode} />
68
- {onRegenerate && (
69
- <button
70
- type="button"
71
- onClick={onRegenerate}
72
- disabled={isRegenerating}
73
- title="Přegenerovat ze zadání"
74
- className="inline-flex items-center gap-1.5 rounded-lg px-1.5 py-1 text-xs font-medium text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-[color:var(--ob-accent-700)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--ob-ring)] disabled:cursor-not-allowed disabled:opacity-50"
75
- >
76
- {isRegenerating ? <Spinner className="h-3.5 w-3.5" /> : <span aria-hidden>↻</span>}
77
- <span className="hidden md:inline">Přegenerovat</span>
78
- </button>
79
- )}
80
- </span>
81
- </div>
82
-
83
- <div className={cn('grid', mode === 'split' && 'md:grid-cols-2 md:divide-x md:divide-zinc-200')}>
84
- {isEditorShown && (
85
- <textarea
86
- ref={textareaRef}
87
- value={value}
88
- spellCheck={false}
89
- onChange={(event) => onChange(event.target.value)}
90
- aria-label="Obsah booku v markdownu"
91
- className={cn(
92
- 'block w-full resize-none border-0 bg-white p-4 font-mono text-[13px] leading-relaxed text-zinc-800 focus:outline-none focus:ring-0',
93
- mode === 'edit' ? 'min-h-[28rem] resize-y' : PANE_HEIGHT,
94
- )}
95
- />
96
- )}
97
- {isPreviewShown && (
98
- <div className={cn('overflow-y-auto bg-white p-4', mode === 'preview' ? 'min-h-[28rem]' : PANE_HEIGHT)}>
99
- {value.trim() ? (
100
- <MarkdownPreview source={value} />
101
- ) : (
102
- <p className="text-sm text-zinc-400">Náhled se zobrazí, jakmile book nebude prázdný.</p>
103
- )}
104
- </div>
105
- )}
106
- </div>
107
- </div>
108
-
109
- <div className="mt-4">
110
- <div className="mb-2 text-xs font-semibold text-zinc-500">Přidat předepsanou sekci:</div>
111
- <div className="flex flex-wrap gap-2">
112
- {BOOK_SECTION_PRESETS.map((preset) => (
113
- <button
114
- key={preset.key}
115
- type="button"
116
- onClick={() => appendSection(preset.markdown)}
117
- className="inline-flex items-center gap-1 rounded-full border border-dashed border-zinc-300 bg-white px-3 py-1.5 text-xs font-medium text-zinc-500 transition-colors hover:border-[color:var(--ob-accent-400)] hover:bg-[color:var(--ob-accent-50)] hover:text-[color:var(--ob-accent-700)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--ob-ring)]"
118
- >
119
- + {preset.label}
120
- </button>
121
- ))}
122
- </div>
123
- </div>
124
- </div>
125
- );
126
- }
127
-
128
- function ViewToggle({ mode, onChange }: { readonly mode: ViewMode; readonly onChange: (mode: ViewMode) => void }) {
129
- return (
130
- <div className="inline-flex rounded-lg border border-zinc-200 bg-white p-0.5" role="tablist" aria-label="Zobrazení editoru">
131
- {VIEW_MODES.map((view) => {
132
- const isActive = view.id === mode;
133
- return (
134
- <button
135
- key={view.id}
136
- type="button"
137
- role="tab"
138
- aria-selected={isActive}
139
- onClick={() => onChange(view.id)}
140
- className={cn(
141
- 'inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--ob-ring)]',
142
- isActive
143
- ? 'bg-[color:var(--ob-accent-600)] text-white'
144
- : 'text-zinc-500 hover:bg-zinc-100 hover:text-zinc-800',
145
- )}
146
- >
147
- <span aria-hidden>{view.icon}</span>
148
- <span className="hidden sm:inline">{view.label}</span>
149
- </button>
150
- );
151
- })}
152
- </div>
153
- );
154
- }