@promptbook/cli 0.112.0-101 → 0.112.0-103

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 (91) hide show
  1. package/apps/agents-server/package.json +1 -1
  2. package/apps/agents-server/scripts/prerender-homepage.js +76 -1
  3. package/apps/agents-server/src/app/actions.ts +0 -6
  4. package/apps/agents-server/src/app/admin/about/page.tsx +1 -1
  5. package/apps/agents-server/src/app/admin/image-generator-test/ImageAttachmentsEditor.tsx +11 -6
  6. package/apps/agents-server/src/app/admin/login-methods/shibboleth/page.tsx +365 -0
  7. package/apps/agents-server/src/app/admin/metadata/MetadataClient.tsx +13 -15
  8. package/apps/agents-server/src/app/admin/servers/ServersRegistryTable.tsx +3 -3
  9. package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +13 -14
  10. package/apps/agents-server/src/app/admin/update/UpdateClient.tsx +12 -3
  11. package/apps/agents-server/src/app/admin/usage/UsageClientTimelineChart.tsx +1 -1
  12. package/apps/agents-server/src/app/admin/users/[userId]/UserDetailClient.tsx +21 -14
  13. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatPageLayout.tsx +2 -2
  14. package/apps/agents-server/src/app/agents/[agentName]/chat/AgentChatSidebarDefault.tsx +11 -7
  15. package/apps/agents-server/src/app/api/admin/cli-access/route.ts +27 -123
  16. package/apps/agents-server/src/app/api/admin/code-runners/authentication/route.ts +33 -125
  17. package/apps/agents-server/src/app/api/auth/login/route.ts +0 -10
  18. package/apps/agents-server/src/app/api/auth/shibboleth/acs/route.ts +77 -57
  19. package/apps/agents-server/src/app/api/auth/shibboleth/login/route.ts +57 -33
  20. package/apps/agents-server/src/app/api/auth/shibboleth/metadata/route.ts +4 -29
  21. package/apps/agents-server/src/app/api/auth/shibboleth/status/route.ts +17 -0
  22. package/apps/agents-server/src/app/api/upload/route.ts +148 -209
  23. package/apps/agents-server/src/app/api/users/[username]/route.ts +1 -1
  24. package/apps/agents-server/src/app/api/users/route.ts +5 -5
  25. package/apps/agents-server/src/app/dashboard/page.tsx +1 -1
  26. package/apps/agents-server/src/app/docs/[docId]/page.tsx +1 -1
  27. package/apps/agents-server/src/app/docs/page.tsx +1 -1
  28. package/apps/agents-server/src/app/globals.css +100 -0
  29. package/apps/agents-server/src/app/layout.tsx +7 -0
  30. package/apps/agents-server/src/app/recycle-bin/page.tsx +1 -1
  31. package/apps/agents-server/src/app/system/settings/KeybindingsSettingsClient.tsx +13 -7
  32. package/apps/agents-server/src/components/AdminTerminal/useAdminTerminalSession.ts +29 -1
  33. package/apps/agents-server/src/components/AgentProfile/AgentProfile.tsx +3 -3
  34. package/apps/agents-server/src/components/AgentProfile/AgentProfileImage.tsx +8 -2
  35. package/apps/agents-server/src/components/DocsToolbar/DocsToolbar.tsx +4 -4
  36. package/apps/agents-server/src/components/DocumentationContent/DocumentationContent.tsx +9 -9
  37. package/apps/agents-server/src/components/Footer/Footer.tsx +7 -7
  38. package/apps/agents-server/src/components/Header/Header.tsx +24 -4
  39. package/apps/agents-server/src/components/Header/HeaderTypes.ts +6 -0
  40. package/apps/agents-server/src/components/Header/buildHeaderSystemMenuItems.ts +51 -1
  41. package/apps/agents-server/src/components/Homepage/Card.tsx +1 -1
  42. package/apps/agents-server/src/components/Homepage/Section.tsx +3 -1
  43. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +12 -1
  44. package/apps/agents-server/src/components/LoginForm/LoginForm.tsx +100 -149
  45. package/apps/agents-server/src/components/Skeleton/ConsolePageLoadingSkeleton.tsx +1 -1
  46. package/apps/agents-server/src/components/Skeleton/DocumentationRouteLoadingSkeleton.tsx +1 -1
  47. package/apps/agents-server/src/components/Skeleton/HomepageLoadingSkeleton.tsx +1 -1
  48. package/apps/agents-server/src/components/UsersList/UsersList.tsx +20 -4
  49. package/apps/agents-server/src/components/UsersList/useUsersAdmin.ts +3 -0
  50. package/apps/agents-server/src/constants/shibbolethAuth.ts +139 -0
  51. package/apps/agents-server/src/database/metadataDefaults.ts +54 -80
  52. package/apps/agents-server/src/database/migrate.ts +30 -1
  53. package/apps/agents-server/src/database/migrations/2026-06-0100-shibboleth-auth.sql +136 -0
  54. package/apps/agents-server/src/database/sqlite/$provideLocalSqliteSupabase.ts +88 -36
  55. package/apps/agents-server/src/languages/ServerTranslationKeys.ts +4 -2
  56. package/apps/agents-server/src/languages/translations/czech.yaml +4 -2
  57. package/apps/agents-server/src/languages/translations/english.yaml +5 -3
  58. package/apps/agents-server/src/tools/$provideCdnForServer.ts +54 -11
  59. package/apps/agents-server/src/utils/cdn/classes/DigitalOceanSpaces.ts +18 -2
  60. package/apps/agents-server/src/utils/cdn/classes/TrackedFilesStorage.ts +6 -5
  61. package/apps/agents-server/src/utils/cdn/interfaces/IFilesStorage.ts +5 -0
  62. package/apps/agents-server/src/utils/chatExport/renderHtmlToPdfOnServer.ts +11 -0
  63. package/apps/agents-server/src/utils/createAdminTerminalRouteHandlers.ts +264 -0
  64. package/apps/agents-server/src/utils/shareTargetPayloads.ts +19 -66
  65. package/apps/agents-server/src/utils/shibbolethAuthentication.ts +729 -621
  66. package/apps/agents-server/src/utils/upload/createBookEditorUploadHandler.ts +19 -28
  67. package/apps/agents-server/src/utils/upload/uploadFileToServer.ts +113 -0
  68. package/esm/index.es.js +194 -35
  69. package/esm/index.es.js.map +1 -1
  70. package/esm/scripts/run-codex-prompts/common/waitForPause.d.ts +12 -0
  71. package/esm/scripts/run-codex-prompts/main/runPromptRound.d.ts +2 -1
  72. package/esm/scripts/run-codex-prompts/ui/buildCoderRunUiFrame.d.ts +1 -0
  73. package/esm/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +1 -1
  74. package/esm/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  75. package/esm/src/version.d.ts +1 -1
  76. package/package.json +2 -2
  77. package/src/book-components/Chat/MarkdownContent/MarkdownContent.tsx +63 -4
  78. package/src/other/templates/getTemplatesPipelineCollection.ts +730 -739
  79. package/src/version.ts +2 -2
  80. package/src/versions.txt +2 -0
  81. package/umd/index.umd.js +194 -35
  82. package/umd/index.umd.js.map +1 -1
  83. package/umd/scripts/run-codex-prompts/common/waitForPause.d.ts +12 -0
  84. package/umd/scripts/run-codex-prompts/main/runPromptRound.d.ts +2 -1
  85. package/umd/scripts/run-codex-prompts/ui/buildCoderRunUiFrame.d.ts +1 -0
  86. package/umd/scripts/run-codex-prompts/ui/buildRunUiFrameShared.d.ts +1 -1
  87. package/umd/src/book-components/Chat/MarkdownContent/MarkdownContent.d.ts +1 -0
  88. package/umd/src/version.d.ts +1 -1
  89. package/apps/agents-server/src/app/api/auth/methods/route.ts +0 -44
  90. package/apps/agents-server/src/constants/authenticationMethods.ts +0 -74
  91. package/apps/agents-server/src/constants/shibbolethAuthentication.ts +0 -107
@@ -1,22 +1,20 @@
1
1
  'use client';
2
2
 
3
- import { upload } from '@vercel/blob/client';
4
- import type { number_percent, string_knowledge_source_content } from '@promptbook-local/types';
3
+ import type { string_knowledge_source_content } from '@promptbook-local/types';
5
4
  import { getSafeCdnPath } from '../cdn/utils/getSafeCdnPath';
6
5
  import { normalizeUploadFilename } from '../normalization/normalizeUploadFilename';
6
+ import {
7
+ buildDefaultUserFileUploadPath,
8
+ uploadFileToServer,
9
+ type FileUploadProgressCallback,
10
+ } from './uploadFileToServer';
7
11
 
8
12
  /**
9
13
  * Progress callback invoked during file uploads.
10
14
  *
11
15
  * @private used by chat and book editors.
12
16
  */
13
- export type FileUploadProgressCallback = (
14
- progress: number_percent,
15
- stats?: {
16
- loadedBytes: number;
17
- totalBytes: number;
18
- },
19
- ) => void;
17
+ export type { FileUploadProgressCallback };
20
18
 
21
19
  /**
22
20
  * Optional upload configuration such as progress reporting or cancellation.
@@ -55,8 +53,8 @@ type UploadPathBuilder = (normalizedFilename: string, pathPrefix: string) => str
55
53
  /**
56
54
  * Constant for build default user file path.
57
55
  */
58
- const buildDefaultUserFilePath: UploadPathBuilder = (normalizedFilename, pathPrefix) =>
59
- pathPrefix ? `${pathPrefix}/user/files/${normalizedFilename}` : `user/files/${normalizedFilename}`;
56
+ const buildDefaultUserFilePath: UploadPathBuilder = (normalizedFilename) =>
57
+ buildDefaultUserFileUploadPath(normalizedFilename);
60
58
 
61
59
  /**
62
60
  * Configuration of the shared upload handler.
@@ -95,33 +93,26 @@ export function createFileUploadHandler<ReturnType extends string = string>(
95
93
  const pathPrefix = process.env.NEXT_PUBLIC_CDN_PATH_PREFIX || '';
96
94
  const normalizedFilename = normalizeUploadFilename(file.name);
97
95
  const uploadPath = pathBuilder(normalizedFilename, pathPrefix);
98
- const safeUploadPath = getSafeCdnPath({ pathname: uploadPath });
99
-
100
- const blob = await upload(safeUploadPath, file, {
101
- access: 'public',
102
- handleUploadUrl: '/api/upload',
103
- clientPayload: JSON.stringify({
104
- purpose,
105
- contentType: file.type || 'application/octet-stream',
106
- }),
96
+ const safeUploadPath = getSafeCdnPath({ pathname: uploadPath, pathPrefix });
97
+
98
+ const uploadResult = await uploadFileToServer({
99
+ file,
100
+ pathname: safeUploadPath,
101
+ purpose,
102
+ contentType: file.type || 'application/octet-stream',
107
103
  abortSignal,
108
- onUploadProgress: (progressEvent) => {
109
- onProgress?.(progressEvent.percentage / 100, {
110
- loadedBytes: progressEvent.loaded,
111
- totalBytes: progressEvent.total,
112
- });
113
- },
104
+ onProgress,
114
105
  });
115
106
 
116
107
  if (returnShortUrl && process.env.NEXT_PUBLIC_CDN_PUBLIC_URL) {
117
108
  const slashIndex = uploadPath.lastIndexOf('/');
118
109
  const directoryPath = slashIndex === -1 ? '' : `${uploadPath.slice(0, slashIndex + 1)}`;
119
110
  const longUrlPrefix = `${process.env.NEXT_PUBLIC_CDN_PUBLIC_URL}/${directoryPath}`;
120
- const shortUrl = blob.url.split(longUrlPrefix).join(shortUrlPrefix);
111
+ const shortUrl = uploadResult.url.split(longUrlPrefix).join(shortUrlPrefix);
121
112
  return shortUrl as ReturnType;
122
113
  }
123
114
 
124
- return blob.url as ReturnType;
115
+ return uploadResult.url as ReturnType;
125
116
  };
126
117
  }
127
118
 
@@ -0,0 +1,113 @@
1
+ 'use client';
2
+
3
+ import type { number_percent } from '@promptbook-local/types';
4
+
5
+ /**
6
+ * Progress callback invoked during file uploads.
7
+ *
8
+ * @private used by chat, book editor, and admin upload surfaces.
9
+ */
10
+ export type FileUploadProgressCallback = (
11
+ progress: number_percent,
12
+ stats?: {
13
+ loadedBytes: number;
14
+ totalBytes: number;
15
+ },
16
+ ) => void;
17
+
18
+ /**
19
+ * Options for uploading one file through the Agents Server upload endpoint.
20
+ *
21
+ * @private used by browser upload helpers.
22
+ */
23
+ export type ServerFileUploadOptions = {
24
+ file: File;
25
+ pathname: string;
26
+ purpose?: string;
27
+ contentType?: string;
28
+ abortSignal?: AbortSignal;
29
+ onProgress?: FileUploadProgressCallback;
30
+ };
31
+
32
+ /**
33
+ * Response returned by the Agents Server upload endpoint.
34
+ *
35
+ * @private used by browser upload helpers.
36
+ */
37
+ export type ServerFileUploadResult = {
38
+ url: string;
39
+ pathname: string;
40
+ contentType: string;
41
+ size: number;
42
+ };
43
+
44
+ /**
45
+ * Builds the default CDN key used for user-uploaded files.
46
+ *
47
+ * @private shared by browser upload surfaces.
48
+ */
49
+ export function buildDefaultUserFileUploadPath(normalizedFilename: string): string {
50
+ return `user/files/${normalizedFilename}`;
51
+ }
52
+
53
+ /**
54
+ * Uploads one browser file to `/api/upload` using normal multipart form data.
55
+ *
56
+ * @private shared by browser upload surfaces.
57
+ */
58
+ export function uploadFileToServer(options: ServerFileUploadOptions): Promise<ServerFileUploadResult> {
59
+ const { file, pathname, purpose = 'GENERIC_UPLOAD', contentType = file.type || 'application/octet-stream' } = options;
60
+
61
+ return new Promise((resolve, reject) => {
62
+ const request = new XMLHttpRequest();
63
+ const formData = new FormData();
64
+
65
+ formData.append('file', file);
66
+ formData.append('pathname', pathname);
67
+ formData.append('purpose', purpose);
68
+ formData.append('contentType', contentType);
69
+
70
+ request.open('POST', '/api/upload');
71
+ request.responseType = 'json';
72
+
73
+ request.upload.onprogress = (event) => {
74
+ if (!event.lengthComputable || !options.onProgress) {
75
+ return;
76
+ }
77
+
78
+ options.onProgress(event.loaded / event.total, {
79
+ loadedBytes: event.loaded,
80
+ totalBytes: event.total,
81
+ });
82
+ };
83
+
84
+ request.onload = () => {
85
+ const responseBody = request.response as Partial<ServerFileUploadResult> & { error?: string } | null;
86
+
87
+ if (request.status >= 200 && request.status < 300 && responseBody?.url) {
88
+ options.onProgress?.(1 as number_percent, {
89
+ loadedBytes: file.size,
90
+ totalBytes: file.size,
91
+ });
92
+
93
+ resolve(responseBody as ServerFileUploadResult);
94
+ return;
95
+ }
96
+
97
+ reject(new Error(responseBody?.error || `File upload failed with HTTP ${request.status}.`));
98
+ };
99
+
100
+ request.onerror = () => reject(new Error('File upload failed.'));
101
+ request.onabort = () => reject(new DOMException('File upload was aborted.', 'AbortError'));
102
+
103
+ options.abortSignal?.addEventListener(
104
+ 'abort',
105
+ () => {
106
+ request.abort();
107
+ },
108
+ { once: true },
109
+ );
110
+
111
+ request.send(formData);
112
+ });
113
+ }