@promptbook/cli 0.112.0-111 → 0.112.0-113

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 (96) hide show
  1. package/README.md +7 -7
  2. package/apps/agents-server/README.md +1 -1
  3. package/apps/agents-server/next.config.ts +20 -1
  4. package/apps/agents-server/src/app/admin/servers/CreateServerDialog.tsx +16 -0
  5. package/apps/agents-server/src/app/admin/servers/useCreateServerWizard.ts +31 -5
  6. package/apps/agents-server/src/app/api/admin/code-runners/route.ts +1 -1
  7. package/apps/agents-server/src/app/api/admin/servers/route.ts +5 -0
  8. package/apps/agents-server/src/app/api/internal/user-chat-jobs/run/route.ts +1 -1
  9. package/apps/agents-server/src/app/api/metadata/route.ts +4 -0
  10. package/apps/agents-server/src/database/customJavascript.ts +62 -1
  11. package/apps/agents-server/src/database/customStylesheet.ts +60 -1
  12. package/apps/agents-server/src/database/getMetadata.ts +84 -3
  13. package/apps/agents-server/src/instrumentation-client.ts +28 -0
  14. package/apps/agents-server/src/instrumentation.ts +19 -0
  15. package/apps/agents-server/src/sentry.edge.config.ts +18 -0
  16. package/apps/agents-server/src/sentry.server.config.ts +19 -0
  17. package/apps/agents-server/src/utils/codeRunnerConfiguration.ts +1 -1
  18. package/apps/agents-server/src/utils/errorReporting/agentsServerSentryContext.ts +203 -0
  19. package/apps/agents-server/src/utils/errorReporting/registerServerErrorSentryLogging.ts +381 -0
  20. package/apps/agents-server/src/utils/errorReporting/sendApplicationErrorReportToSentry.ts +43 -152
  21. package/apps/agents-server/src/utils/errorReporting/sentrySdkConfig.ts +237 -0
  22. package/apps/agents-server/src/utils/errorReporting/sentryStore.ts +187 -0
  23. package/apps/agents-server/src/utils/externalChatRunner/createExternalAgentRepositoryFiles.ts +2 -2
  24. package/apps/agents-server/src/utils/serverManagement/createManagedServer/bootstrapManagedServer.ts +3 -1
  25. package/apps/agents-server/src/utils/serverManagement/createManagedServer/normalizeCreateServerInput.ts +6 -0
  26. package/apps/agents-server/src/utils/serverManagement/createManagedServer/seedServerDefaultAgents.ts +7 -3
  27. package/apps/agents-server/src/utils/serverManagement/createManagedServer.ts +5 -0
  28. package/apps/agents-server/src/utils/userChat/listUserChats.ts +109 -0
  29. package/apps/agents-server/src/utils/userChat/triggerUserChatJobWorker.ts +54 -19
  30. package/apps/agents-server/src/utils/vpsConfiguration.ts +1 -1
  31. package/esm/index.es.js +9256 -8795
  32. package/esm/index.es.js.map +1 -1
  33. package/esm/scripts/run-agent-chat/executeAgentChatTurn.d.ts +28 -0
  34. package/esm/scripts/run-agent-chat/runAgentChat.d.ts +5 -0
  35. package/esm/scripts/run-agent-chat/runAgentExec.d.ts +11 -0
  36. package/esm/scripts/run-agent-messages/messages/createAgentRunnerSystemMessage.d.ts +10 -0
  37. package/esm/scripts/run-codex-prompts/common/resolveInlineOrFileText.d.ts +14 -0
  38. package/esm/src/_packages/node.index.d.ts +20 -0
  39. package/esm/src/_packages/types.index.d.ts +16 -0
  40. package/esm/src/book-3.0/BookNodeAgentSource.d.ts +38 -0
  41. package/esm/src/book-3.0/CliAgent.d.ts +68 -0
  42. package/esm/src/book-3.0/CliAgent.test.d.ts +1 -0
  43. package/esm/src/book-3.0/LiteAgent.d.ts +68 -0
  44. package/esm/src/book-3.0/LiteAgent.test.d.ts +1 -0
  45. package/esm/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.d.ts +12 -0
  46. package/esm/src/cli/cli-commands/agent/agentCliOptions.d.ts +29 -0
  47. package/esm/src/cli/cli-commands/agent/chat.d.ts +10 -0
  48. package/esm/src/cli/cli-commands/agent/exec.d.ts +10 -0
  49. package/esm/src/cli/cli-commands/agent/run.test.d.ts +1 -0
  50. package/esm/src/cli/cli-commands/agent.d.ts +14 -0
  51. package/esm/src/cli/cli-commands/agents-server/startAgentsServer.d.ts +2 -2
  52. package/esm/src/cli/cli-commands/common/promptRunnerCliOptions.d.ts +9 -9
  53. package/esm/src/version.d.ts +1 -1
  54. package/package.json +2 -1
  55. package/src/_packages/node.index.ts +20 -0
  56. package/src/_packages/types.index.ts +16 -0
  57. package/src/book-3.0/BookNodeAgentSource.ts +135 -0
  58. package/src/book-3.0/CliAgent.ts +236 -0
  59. package/src/book-3.0/LiteAgent.ts +463 -0
  60. package/src/book-components/BookEditor/BookEditor.module.css +61 -0
  61. package/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.tsx +74 -0
  62. package/src/book-components/BookEditor/BookEditorActionbar.tsx +3 -3
  63. package/src/cli/cli-commands/agent/agentCliOptions.ts +63 -0
  64. package/src/cli/cli-commands/agent/chat.ts +54 -0
  65. package/src/cli/cli-commands/agent/exec.ts +60 -0
  66. package/src/cli/cli-commands/agent.ts +45 -0
  67. package/src/cli/cli-commands/agents-server/startAgentsServer.ts +2 -2
  68. package/src/cli/cli-commands/coder/getDefaultCoderPackageJsonScripts.ts +1 -1
  69. package/src/cli/cli-commands/common/promptRunnerCliOptions.ts +27 -23
  70. package/src/cli/promptbookCli.ts +2 -0
  71. package/src/other/templates/getTemplatesPipelineCollection.ts +809 -901
  72. package/src/version.ts +2 -2
  73. package/src/versions.txt +2 -0
  74. package/umd/index.umd.js +9255 -8794
  75. package/umd/index.umd.js.map +1 -1
  76. package/umd/scripts/run-agent-chat/executeAgentChatTurn.d.ts +28 -0
  77. package/umd/scripts/run-agent-chat/runAgentChat.d.ts +5 -0
  78. package/umd/scripts/run-agent-chat/runAgentExec.d.ts +11 -0
  79. package/umd/scripts/run-agent-messages/messages/createAgentRunnerSystemMessage.d.ts +10 -0
  80. package/umd/scripts/run-codex-prompts/common/resolveInlineOrFileText.d.ts +14 -0
  81. package/umd/src/_packages/node.index.d.ts +20 -0
  82. package/umd/src/_packages/types.index.d.ts +16 -0
  83. package/umd/src/book-3.0/BookNodeAgentSource.d.ts +38 -0
  84. package/umd/src/book-3.0/CliAgent.d.ts +68 -0
  85. package/umd/src/book-3.0/CliAgent.test.d.ts +1 -0
  86. package/umd/src/book-3.0/LiteAgent.d.ts +68 -0
  87. package/umd/src/book-3.0/LiteAgent.test.d.ts +1 -0
  88. package/umd/src/book-components/BookEditor/BookEditorAboutPromptbookInformation.d.ts +12 -0
  89. package/umd/src/cli/cli-commands/agent/agentCliOptions.d.ts +29 -0
  90. package/umd/src/cli/cli-commands/agent/chat.d.ts +10 -0
  91. package/umd/src/cli/cli-commands/agent/exec.d.ts +10 -0
  92. package/umd/src/cli/cli-commands/agent/run.test.d.ts +1 -0
  93. package/umd/src/cli/cli-commands/agent.d.ts +14 -0
  94. package/umd/src/cli/cli-commands/agents-server/startAgentsServer.d.ts +2 -2
  95. package/umd/src/cli/cli-commands/common/promptRunnerCliOptions.d.ts +9 -9
  96. package/umd/src/version.d.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  import { createAgentPersistenceRecords } from '../../../../../../src/collection/agent-collection/constructors/agent-collection-in-supabase/createAgentPersistenceRecords';
2
2
  import type { Client } from 'pg';
3
+ import { DEFAULT_AGENT_VISIBILITY } from '../../agentVisibility';
3
4
  import { loadDefaultAgentBooks } from '../../defaultAgents/loadDefaultAgentBooks';
4
5
  import { createInsertStatement, quoteIdentifier, type SqlRecorder } from './createSqlRecorder';
5
6
  import type { NormalizedCreateServerInput } from './normalizeCreateServerInput';
@@ -28,7 +29,7 @@ export async function seedServerDefaultAgents(
28
29
  const createdAt = new Date().toISOString();
29
30
  const { agentInsertRecord, agentHistoryInsertRecord } = createAgentPersistenceRecords(
30
31
  defaultAgentBook,
31
- { sortOrder: index },
32
+ { sortOrder: index, visibility: DEFAULT_AGENT_VISIBILITY },
32
33
  createdAt,
33
34
  );
34
35
 
@@ -45,9 +46,10 @@ export async function seedServerDefaultAgents(
45
46
  "promptbookEngineVersion",
46
47
  "usage",
47
48
  "folderId",
48
- "sortOrder"
49
+ "sortOrder",
50
+ "visibility"
49
51
  )
50
- VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, $8, $9::jsonb, $10, $11)
52
+ VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, $8, $9::jsonb, $10, $11, $12)
51
53
  `,
52
54
  [
53
55
  agentInsertRecord.agentName,
@@ -61,6 +63,7 @@ export async function seedServerDefaultAgents(
61
63
  JSON.stringify(agentInsertRecord.usage),
62
64
  agentInsertRecord.folderId ?? null,
63
65
  agentInsertRecord.sortOrder ?? index,
66
+ agentInsertRecord.visibility ?? DEFAULT_AGENT_VISIBILITY,
64
67
  ],
65
68
  );
66
69
  sqlRecorder.addStatement(
@@ -70,6 +73,7 @@ export async function seedServerDefaultAgents(
70
73
  usage: JSON.stringify(agentInsertRecord.usage),
71
74
  folderId: agentInsertRecord.folderId ?? null,
72
75
  sortOrder: agentInsertRecord.sortOrder ?? index,
76
+ visibility: agentInsertRecord.visibility ?? DEFAULT_AGENT_VISIBILITY,
73
77
  }),
74
78
  );
75
79
 
@@ -108,6 +108,11 @@ export type CreateServerInput = {
108
108
  */
109
109
  readonly additionalUsers?: ReadonlyArray<ServerSeedUserInput>;
110
110
 
111
+ /**
112
+ * Whether bundled default agents from `agents/default` should be created during bootstrap.
113
+ */
114
+ readonly isDefaultAgentsInstalled?: boolean;
115
+
111
116
  /**
112
117
  * Initial metadata values for the new server.
113
118
  */
@@ -1,5 +1,7 @@
1
1
  import { $getTableName } from '@/src/database/$getTableName';
2
2
  import { $provideClientSql } from '@/src/database/$provideClientSql';
3
+ import { isAgentsServerSqliteMode } from '@/src/database/agentsServerDatabaseMode';
4
+ import { $provideAgentsServerSqliteDatabase } from '@/src/database/sqlite/$provideAgentsServerSqliteDatabase';
3
5
  import type { ListUserChatsOptions, UserChatRecord } from './UserChatRecord';
4
6
  import type { UserChatSource } from './UserChatSource';
5
7
  import type { UserChatRow } from './UserChatRow';
@@ -30,6 +32,13 @@ const POSTGRES_UNDEFINED_COLUMN_ERROR_CODE = '42703';
30
32
  const CLIENT_SQL_MISSING_CONNECTION_MESSAGE_FRAGMENT =
31
33
  'Environment variable `POSTGRES_URL` or `DATABASE_URL` must be defined.';
32
34
 
35
+ /**
36
+ * SQLite expression that safely exposes chat messages as a JSON array.
37
+ *
38
+ * @private function of `userChat`
39
+ */
40
+ const SQLITE_CHAT_MESSAGES_JSON_EXPRESSION = `CASE WHEN json_valid(chat."messages") THEN chat."messages" ELSE '[]' END`;
41
+
33
42
  /**
34
43
  * Lists all user chats for one agent ordered by last activity.
35
44
  */
@@ -69,6 +78,10 @@ export async function listUserChats(options: ListUserChatsOptions): Promise<Arra
69
78
  * @private function of `userChat`
70
79
  */
71
80
  export async function listUserChatSummarySeeds(options: ListUserChatsOptions): Promise<Array<UserChatSummarySeed>> {
81
+ if (isAgentsServerSqliteMode()) {
82
+ return listUserChatSummarySeedsViaSqlite(options);
83
+ }
84
+
72
85
  if (!isDirectSqlConnectionConfigured()) {
73
86
  return listUserChatSummarySeedsViaSupabase(options);
74
87
  }
@@ -151,6 +164,92 @@ export async function listUserChatSummarySeeds(options: ListUserChatsOptions): P
151
164
  }
152
165
  }
153
166
 
167
+ /**
168
+ * Lists lightweight chat-summary seeds through direct SQLite JSON queries.
169
+ *
170
+ * @private function of `userChat`
171
+ */
172
+ async function listUserChatSummarySeedsViaSqlite(options: ListUserChatsOptions): Promise<Array<UserChatSummarySeed>> {
173
+ const userChatTableName = quoteIdentifier(await $getTableName('UserChat'));
174
+ const shouldLoadExternalChats = options.viewerIsAdmin && options.includeExternalChats;
175
+ const whereClause = shouldLoadExternalChats
176
+ ? `
177
+ chat."agentPermanentId" = ?
178
+ AND (chat."source" <> ? OR chat."userId" = ?)
179
+ `
180
+ : `
181
+ chat."userId" = ?
182
+ AND chat."agentPermanentId" = ?
183
+ AND chat."source" = ?
184
+ `;
185
+ const queryValues = shouldLoadExternalChats
186
+ ? [options.agentPermanentId, USER_CHAT_SOURCES.WEB_UI, options.userId]
187
+ : [options.userId, options.agentPermanentId, USER_CHAT_SOURCES.WEB_UI];
188
+
189
+ try {
190
+ const database = $provideAgentsServerSqliteDatabase();
191
+ const summaryRows = database
192
+ .prepare(
193
+ `
194
+ SELECT
195
+ chat."id",
196
+ chat."createdAt",
197
+ chat."updatedAt",
198
+ chat."lastMessageAt",
199
+ chat."title",
200
+ chat."source",
201
+ COALESCE(json_array_length(${SQLITE_CHAT_MESSAGES_JSON_EXPRESSION}), 0) AS "messagesCount",
202
+ COALESCE(
203
+ (
204
+ SELECT CAST(json_extract(message.value, '$.content') AS TEXT)
205
+ FROM json_each(${SQLITE_CHAT_MESSAGES_JSON_EXPRESSION}) AS message
206
+ WHERE UPPER(CAST(COALESCE(json_extract(message.value, '$.sender'), '') AS TEXT)) = 'USER'
207
+ ORDER BY CAST(message.key AS INTEGER) ASC
208
+ LIMIT 1
209
+ ),
210
+ ''
211
+ ) AS "firstUserMessageContent",
212
+ COALESCE(
213
+ (
214
+ SELECT CAST(json_extract(message.value, '$.content') AS TEXT)
215
+ FROM json_each(${SQLITE_CHAT_MESSAGES_JSON_EXPRESSION}) AS message
216
+ WHERE LENGTH(TRIM(CAST(COALESCE(json_extract(message.value, '$.content'), '') AS TEXT))) > 0
217
+ ORDER BY CAST(message.key AS INTEGER) DESC
218
+ LIMIT 1
219
+ ),
220
+ ''
221
+ ) AS "lastPreviewMessageContent",
222
+ COALESCE(
223
+ (
224
+ SELECT COUNT(*)
225
+ FROM json_each(${SQLITE_CHAT_MESSAGES_JSON_EXPRESSION}) AS message
226
+ WHERE
227
+ UPPER(CAST(COALESCE(json_extract(message.value, '$.sender'), '') AS TEXT)) IN ('AGENT', 'MODEL')
228
+ AND (
229
+ json_extract(message.value, '$.isComplete') = 0
230
+ OR LOWER(CAST(COALESCE(json_extract(message.value, '$.isComplete'), '') AS TEXT)) = 'false'
231
+ OR LOWER(CAST(COALESCE(json_extract(message.value, '$.lifecycleState'), '') AS TEXT)) IN ('queued', 'running')
232
+ )
233
+ ),
234
+ 0
235
+ ) AS "pendingAssistantMessageCount"
236
+ FROM ${userChatTableName} AS chat
237
+ WHERE ${whereClause}
238
+ ORDER BY chat."lastMessageAt" IS NULL ASC, chat."lastMessageAt" DESC, chat."updatedAt" DESC
239
+ `,
240
+ )
241
+ .all(...queryValues) as Array<UserChatSummarySeedSqlRow>;
242
+
243
+ return summaryRows.map(mapUserChatSummarySeedSqlRow);
244
+ } catch (error) {
245
+ if (!isUserChatSummarySeedSqliteFallbackError(error)) {
246
+ throw error;
247
+ }
248
+
249
+ return listUserChatSummarySeedsViaSupabase(options);
250
+ }
251
+ }
252
+
154
253
  /**
155
254
  * Raw SQL row shape loaded for lightweight chat summary seeds.
156
255
  *
@@ -260,6 +359,16 @@ function isUserChatSummarySeedSqlFallbackError(error: unknown): boolean {
260
359
  return /relation .* does not exist|column .* does not exist/i.test(errorMessage);
261
360
  }
262
361
 
362
+ /**
363
+ * Returns true when SQLite summary optimization should gracefully fallback to Supabase-shaped reads.
364
+ *
365
+ * @private function of `userChat`
366
+ */
367
+ function isUserChatSummarySeedSqliteFallbackError(error: unknown): boolean {
368
+ const errorMessage = error instanceof Error ? error.message : String(error);
369
+ return /no such table|no such column|no such function: json_|malformed JSON/i.test(errorMessage);
370
+ }
371
+
263
372
  /**
264
373
  * Loads chat-summary seeds using standard Supabase reads when SQL optimization is unavailable.
265
374
  *
@@ -1,28 +1,63 @@
1
1
  import { resolveUserChatWorkerInternalToken } from './resolveUserChatWorkerInternalToken';
2
+ import { retryWithBackoff } from '../retryWithBackoff';
3
+
4
+ /**
5
+ * Number of retries for transient transport failures while waking the durable chat worker.
6
+ */
7
+ const USER_CHAT_WORKER_TRIGGER_FETCH_RETRIES = 2;
8
+
9
+ /**
10
+ * Initial wait before retrying a failed worker wake-up request.
11
+ */
12
+ const USER_CHAT_WORKER_TRIGGER_FETCH_INITIAL_DELAY_MS = 250;
13
+
14
+ /**
15
+ * Maximum wait before retrying a failed worker wake-up request.
16
+ */
17
+ const USER_CHAT_WORKER_TRIGGER_FETCH_MAX_DELAY_MS = 1_000;
18
+
19
+ /**
20
+ * Multiplier used between worker wake-up retry waits.
21
+ */
22
+ const USER_CHAT_WORKER_TRIGGER_FETCH_BACKOFF_FACTOR = 2;
23
+
24
+ /**
25
+ * Randomized extra delay ratio for worker wake-up retry waits.
26
+ */
27
+ const USER_CHAT_WORKER_TRIGGER_FETCH_JITTER_RATIO = 0.2;
2
28
 
3
29
  /**
4
30
  * Schedules one best-effort internal worker invocation for durable chat jobs.
5
31
  */
6
- export async function triggerUserChatJobWorker(options: {
7
- origin: string;
8
- preferredJobId?: string;
9
- }): Promise<void> {
32
+ export async function triggerUserChatJobWorker(options: { origin: string; preferredJobId?: string }): Promise<void> {
10
33
  const workerUrl = new URL('/api/internal/user-chat-jobs/run', ensureTrailingSlashlessOrigin(options.origin));
11
- const response = await fetch(workerUrl, {
12
- method: 'POST',
13
- cache: 'no-store',
14
- headers: {
15
- 'Content-Type': 'application/json',
16
- 'x-user-chat-worker-token': resolveUserChatWorkerInternalToken(),
17
- },
18
- body: JSON.stringify(
19
- options.preferredJobId
20
- ? {
21
- preferredJobId: options.preferredJobId,
22
- }
23
- : {},
24
- ),
25
- });
34
+ const response = (
35
+ await retryWithBackoff(
36
+ async () =>
37
+ await fetch(workerUrl, {
38
+ method: 'POST',
39
+ cache: 'no-store',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'x-user-chat-worker-token': resolveUserChatWorkerInternalToken(),
43
+ },
44
+ body: JSON.stringify(
45
+ options.preferredJobId
46
+ ? {
47
+ preferredJobId: options.preferredJobId,
48
+ }
49
+ : {},
50
+ ),
51
+ }),
52
+ {
53
+ retries: USER_CHAT_WORKER_TRIGGER_FETCH_RETRIES,
54
+ initialDelayMs: USER_CHAT_WORKER_TRIGGER_FETCH_INITIAL_DELAY_MS,
55
+ maxDelayMs: USER_CHAT_WORKER_TRIGGER_FETCH_MAX_DELAY_MS,
56
+ backoffFactor: USER_CHAT_WORKER_TRIGGER_FETCH_BACKOFF_FACTOR,
57
+ jitterRatio: USER_CHAT_WORKER_TRIGGER_FETCH_JITTER_RATIO,
58
+ },
59
+ )
60
+ ).value;
26
61
 
27
62
  if (!response.ok && response.status !== 204) {
28
63
  throw new Error(`Failed to trigger user chat worker: ${response.status} ${response.statusText}`);
@@ -23,7 +23,7 @@ export const VPS_ENVIRONMENT_VARIABLE_KEYS = [
23
23
  'NEXT_PUBLIC_SITE_URL',
24
24
  'ADMIN_PASSWORD',
25
25
  'OPENAI_API_KEY',
26
- 'PTBK_AGENT',
26
+ 'PTBK_HARNESS',
27
27
  'PTBK_MODEL',
28
28
  'PTBK_THINKING_LEVEL',
29
29
  'PORT',