@promptbook/remote-server 0.112.0-20 → 0.112.0-21

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/umd/index.umd.js CHANGED
@@ -50,7 +50,7 @@
50
50
  * @generated
51
51
  * @see https://github.com/webgptorg/promptbook
52
52
  */
53
- const PROMPTBOOK_ENGINE_VERSION = '0.112.0-20';
53
+ const PROMPTBOOK_ENGINE_VERSION = '0.112.0-21';
54
54
  /**
55
55
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
56
56
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -20594,8 +20594,9 @@
20594
20594
  return _spaceTrim.spaceTrim((block) => `
20595
20595
  Timeout scheduling:
20596
20596
  - Use "set_timeout" to wake this same chat thread in the future.
20597
- - Use "list_timeouts" to review timeouts across all chats for the same user+agent scope.
20598
- - "cancel_timeout" accepts a timeout id from any chat in this same user+agent scope.
20597
+ - Use "list_timeouts" to review timeout ids/details across all chats for the same user+agent scope.
20598
+ - "cancel_timeout" accepts either one timeout id or \`allActive: true\` to cancel all active timeouts in this same user+agent scope.
20599
+ - Use "update_timeout" to pause/resume, edit next run, edit recurrence, or update timeout payload details.
20599
20600
  - When one timeout elapses, you will receive a new user-like message that explicitly says it is a timeout wake-up and includes the \`timeoutId\`.
20600
20601
  - Do not claim a timer was set or cancelled unless the tool confirms it.
20601
20602
  ${block(extraInstructions)}
@@ -20722,9 +20723,18 @@
20722
20723
  */
20723
20724
  cancel(args) {
20724
20725
  const timeoutId = typeof args.timeoutId === 'string' ? args.timeoutId.trim() : '';
20726
+ const allActive = args.allActive === true;
20727
+ if (timeoutId && allActive) {
20728
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20729
+ Timeout cancellation must target either one \`timeoutId\` or \`allActive: true\`, not both.
20730
+ `));
20731
+ }
20732
+ if (allActive) {
20733
+ return { allActive: true };
20734
+ }
20725
20735
  if (!timeoutId) {
20726
20736
  throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20727
- Timeout \`timeoutId\` is required.
20737
+ Timeout \`timeoutId\` is required unless you pass \`allActive: true\`.
20728
20738
  `));
20729
20739
  }
20730
20740
  return { timeoutId };
@@ -20754,6 +20764,111 @@
20754
20764
  limit: parsedLimit,
20755
20765
  };
20756
20766
  },
20767
+ /**
20768
+ * Parses `update_timeout` input.
20769
+ */
20770
+ update(args) {
20771
+ const timeoutId = typeof args.timeoutId === 'string' ? args.timeoutId.trim() : '';
20772
+ const allActive = args.allActive === true;
20773
+ if (timeoutId && allActive) {
20774
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20775
+ Timeout update must target either one \`timeoutId\` or \`allActive: true\`, not both.
20776
+ `));
20777
+ }
20778
+ if (!timeoutId && !allActive) {
20779
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20780
+ Timeout update requires one \`timeoutId\` or \`allActive: true\`.
20781
+ `));
20782
+ }
20783
+ const patch = {};
20784
+ if (typeof args.dueAt === 'string' && args.dueAt.trim().length > 0) {
20785
+ const normalizedDueAt = args.dueAt.trim();
20786
+ const dueAtTimestamp = Date.parse(normalizedDueAt);
20787
+ if (!Number.isFinite(dueAtTimestamp)) {
20788
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20789
+ Timeout \`dueAt\` must be one valid ISO timestamp.
20790
+ `));
20791
+ }
20792
+ patch.dueAt = new Date(dueAtTimestamp).toISOString();
20793
+ }
20794
+ if (typeof args.extendByMs === 'number') {
20795
+ if (!Number.isFinite(args.extendByMs) || args.extendByMs <= 0) {
20796
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20797
+ Timeout \`extendByMs\` must be a positive number of milliseconds.
20798
+ `));
20799
+ }
20800
+ patch.extendByMs = Math.floor(args.extendByMs);
20801
+ }
20802
+ if (patch.dueAt !== undefined && patch.extendByMs !== undefined) {
20803
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20804
+ Timeout update cannot include both \`dueAt\` and \`extendByMs\`.
20805
+ `));
20806
+ }
20807
+ if (args.recurrenceIntervalMs === null) {
20808
+ patch.recurrenceIntervalMs = null;
20809
+ }
20810
+ else if (typeof args.recurrenceIntervalMs === 'number') {
20811
+ if (!Number.isFinite(args.recurrenceIntervalMs) || args.recurrenceIntervalMs <= 0) {
20812
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20813
+ Timeout \`recurrenceIntervalMs\` must be a positive number of milliseconds or \`null\`.
20814
+ `));
20815
+ }
20816
+ patch.recurrenceIntervalMs = Math.floor(args.recurrenceIntervalMs);
20817
+ }
20818
+ if (args.message === null) {
20819
+ patch.message = null;
20820
+ }
20821
+ else if (typeof args.message === 'string') {
20822
+ const normalizedMessage = args.message.trim();
20823
+ patch.message = normalizedMessage.length > 0 ? normalizedMessage : null;
20824
+ }
20825
+ if (args.parameters !== undefined) {
20826
+ if (!args.parameters || typeof args.parameters !== 'object' || Array.isArray(args.parameters)) {
20827
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20828
+ Timeout \`parameters\` must be one JSON object.
20829
+ `));
20830
+ }
20831
+ patch.parameters = args.parameters;
20832
+ }
20833
+ if (typeof args.paused === 'boolean') {
20834
+ patch.paused = args.paused;
20835
+ }
20836
+ if (allActive) {
20837
+ if (patch.paused === undefined) {
20838
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20839
+ Bulk timeout update with \`allActive: true\` requires \`paused\` to be explicitly set.
20840
+ `));
20841
+ }
20842
+ const hasSingleOnlyPatch = patch.dueAt !== undefined ||
20843
+ patch.extendByMs !== undefined ||
20844
+ patch.recurrenceIntervalMs !== undefined ||
20845
+ patch.message !== undefined ||
20846
+ patch.parameters !== undefined;
20847
+ if (hasSingleOnlyPatch) {
20848
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20849
+ Bulk timeout update only supports the \`paused\` field.
20850
+ `));
20851
+ }
20852
+ return {
20853
+ allActive: true,
20854
+ paused: patch.paused,
20855
+ };
20856
+ }
20857
+ if (!timeoutId) {
20858
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20859
+ Timeout \`timeoutId\` is required for single-timeout updates.
20860
+ `));
20861
+ }
20862
+ if (Object.keys(patch).length === 0) {
20863
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
20864
+ Timeout update must include at least one editable field.
20865
+ `));
20866
+ }
20867
+ return {
20868
+ timeoutId,
20869
+ patch,
20870
+ };
20871
+ },
20757
20872
  };
20758
20873
 
20759
20874
  /**
@@ -20765,6 +20880,7 @@
20765
20880
  set: 'set_timeout',
20766
20881
  cancel: 'cancel_timeout',
20767
20882
  list: 'list_timeouts',
20883
+ update: 'update_timeout',
20768
20884
  };
20769
20885
 
20770
20886
  /**
@@ -20797,6 +20913,18 @@
20797
20913
  return Object.fromEntries(normalizedEntries);
20798
20914
  }
20799
20915
 
20916
+ /**
20917
+ * Maximum number of timeout rows rendered into the assistant-visible `list_timeouts` message.
20918
+ *
20919
+ * @private internal USE TIMEOUT constant
20920
+ */
20921
+ const MAX_ASSISTANT_VISIBLE_TIMEOUT_ROWS = 20;
20922
+ /**
20923
+ * Maximum number of timeout ids rendered in bulk-action summaries.
20924
+ *
20925
+ * @private internal USE TIMEOUT constant
20926
+ */
20927
+ const MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS = 10;
20800
20928
  /**
20801
20929
  * Gets `USE TIMEOUT` tool function implementations.
20802
20930
  *
@@ -20842,6 +20970,23 @@
20842
20970
  try {
20843
20971
  const parsedArgs = parseTimeoutToolArgs.cancel(args);
20844
20972
  const cancelledTimeout = await adapter.cancelTimeout(parsedArgs, runtimeContext);
20973
+ if (cancelledTimeout.status === 'cancelled_all') {
20974
+ const result = {
20975
+ action: 'cancel',
20976
+ status: 'cancelled_all',
20977
+ cancelledCount: cancelledTimeout.cancelledCount || 0,
20978
+ cancelledTimeoutIds: cancelledTimeout.cancelledTimeoutIds || [],
20979
+ hasMore: cancelledTimeout.hasMore,
20980
+ };
20981
+ return createToolExecutionEnvelope({
20982
+ assistantMessage: createBulkCancelAssistantMessage({
20983
+ cancelledCount: result.cancelledCount || 0,
20984
+ cancelledTimeoutIds: result.cancelledTimeoutIds || [],
20985
+ hasMore: result.hasMore,
20986
+ }),
20987
+ toolResult: result,
20988
+ });
20989
+ }
20845
20990
  const result = {
20846
20991
  action: 'cancel',
20847
20992
  status: cancelledTimeout.status,
@@ -20880,7 +21025,10 @@
20880
21025
  total: listedTimeouts.total,
20881
21026
  };
20882
21027
  return createToolExecutionEnvelope({
20883
- assistantMessage: listedTimeouts.total === 1 ? 'Found 1 timeout.' : `Found ${listedTimeouts.total} timeouts.`,
21028
+ assistantMessage: createListedTimeoutsAssistantMessage({
21029
+ total: listedTimeouts.total,
21030
+ items: listedTimeouts.items,
21031
+ }),
20884
21032
  toolResult: result,
20885
21033
  });
20886
21034
  }
@@ -20893,8 +21041,155 @@
20893
21041
  return JSON.stringify(result);
20894
21042
  }
20895
21043
  },
21044
+ async [TimeoutToolNames.update](args) {
21045
+ const runtimeContext = resolveTimeoutRuntimeContext(args);
21046
+ const { adapter, disabledResult } = getTimeoutToolRuntimeAdapterOrDisabledResult('update', runtimeContext);
21047
+ if (!adapter || disabledResult) {
21048
+ return JSON.stringify(disabledResult);
21049
+ }
21050
+ try {
21051
+ const parsedArgs = parseTimeoutToolArgs.update(args);
21052
+ const updatedTimeout = await adapter.updateTimeout(parsedArgs, runtimeContext);
21053
+ if (updatedTimeout.status === 'updated_all') {
21054
+ const result = {
21055
+ action: 'update',
21056
+ status: 'updated_all',
21057
+ updatedCount: updatedTimeout.updatedCount,
21058
+ matchedCount: updatedTimeout.matchedCount,
21059
+ updatedTimeoutIds: updatedTimeout.updatedTimeoutIds,
21060
+ hasMore: updatedTimeout.hasMore,
21061
+ };
21062
+ return createToolExecutionEnvelope({
21063
+ assistantMessage: createBulkUpdateAssistantMessage({
21064
+ paused: 'allActive' in parsedArgs && parsedArgs.allActive ? parsedArgs.paused : false,
21065
+ updatedCount: updatedTimeout.updatedCount,
21066
+ matchedCount: updatedTimeout.matchedCount,
21067
+ updatedTimeoutIds: updatedTimeout.updatedTimeoutIds,
21068
+ hasMore: updatedTimeout.hasMore,
21069
+ }),
21070
+ toolResult: result,
21071
+ });
21072
+ }
21073
+ if (updatedTimeout.status === 'not_found') {
21074
+ const result = {
21075
+ action: 'update',
21076
+ status: 'not_found',
21077
+ timeoutId: updatedTimeout.timeoutId,
21078
+ };
21079
+ return createToolExecutionEnvelope({
21080
+ assistantMessage: 'The timeout was not found.',
21081
+ toolResult: result,
21082
+ });
21083
+ }
21084
+ if (updatedTimeout.status === 'conflict') {
21085
+ const conflictMessage = updatedTimeout.reason === 'running'
21086
+ ? 'Running timeout cannot be edited.'
21087
+ : 'Finished timeout cannot be edited.';
21088
+ const result = {
21089
+ action: 'update',
21090
+ status: 'conflict',
21091
+ timeoutId: updatedTimeout.timeoutId,
21092
+ message: conflictMessage,
21093
+ };
21094
+ return createToolExecutionEnvelope({
21095
+ assistantMessage: conflictMessage,
21096
+ toolResult: result,
21097
+ });
21098
+ }
21099
+ const result = {
21100
+ action: 'update',
21101
+ status: 'updated',
21102
+ timeoutId: updatedTimeout.timeout.timeoutId,
21103
+ dueAt: updatedTimeout.timeout.dueAt,
21104
+ paused: updatedTimeout.timeout.paused,
21105
+ recurrenceIntervalMs: updatedTimeout.timeout.recurrenceIntervalMs,
21106
+ };
21107
+ return createToolExecutionEnvelope({
21108
+ assistantMessage: `Updated timeout ${JSON.stringify(updatedTimeout.timeout.timeoutId)}.`,
21109
+ toolResult: result,
21110
+ });
21111
+ }
21112
+ catch (error) {
21113
+ const result = {
21114
+ action: 'update',
21115
+ status: 'error',
21116
+ message: error instanceof Error ? error.message : String(error),
21117
+ };
21118
+ return JSON.stringify(result);
21119
+ }
21120
+ },
20896
21121
  };
20897
21122
  }
21123
+ /**
21124
+ * Creates assistant-visible summary for one `list_timeouts` response.
21125
+ *
21126
+ * @private internal utility of USE TIMEOUT
21127
+ */
21128
+ function createListedTimeoutsAssistantMessage(options) {
21129
+ if (options.total <= 0 || options.items.length === 0) {
21130
+ return 'Found 0 timeouts.';
21131
+ }
21132
+ const visibleItems = options.items.slice(0, MAX_ASSISTANT_VISIBLE_TIMEOUT_ROWS);
21133
+ const summaryRows = visibleItems.map((item, index) => `${index + 1}. ${formatTimeoutListRow(item)}`);
21134
+ const hiddenCount = Math.max(0, options.total - visibleItems.length);
21135
+ if (hiddenCount > 0) {
21136
+ summaryRows.push(`...and ${hiddenCount} more.`);
21137
+ }
21138
+ return [`Found ${options.total} ${options.total === 1 ? 'timeout' : 'timeouts'}:`, ...summaryRows].join('\n');
21139
+ }
21140
+ /**
21141
+ * Formats one timeout row for assistant-visible timeout listings.
21142
+ *
21143
+ * @private internal utility of USE TIMEOUT
21144
+ */
21145
+ function formatTimeoutListRow(item) {
21146
+ const normalizedMessage = typeof item.message === 'string' ? item.message.trim() : '';
21147
+ const messageSuffix = normalizedMessage ? ` | message ${JSON.stringify(normalizedMessage)}` : '';
21148
+ const recurrenceSuffix = typeof item.recurrenceIntervalMs === 'number' && item.recurrenceIntervalMs > 0
21149
+ ? ` | recurrence ${item.recurrenceIntervalMs}ms`
21150
+ : '';
21151
+ const pausedSuffix = item.paused ? ' (paused)' : '';
21152
+ return `${item.timeoutId} | ${item.status}${pausedSuffix} | chat ${item.chatId} | due ${item.dueAt}${recurrenceSuffix}${messageSuffix}`;
21153
+ }
21154
+ /**
21155
+ * Creates assistant-visible summary for bulk timeout cancellation.
21156
+ *
21157
+ * @private internal utility of USE TIMEOUT
21158
+ */
21159
+ function createBulkCancelAssistantMessage(options) {
21160
+ if (options.cancelledCount <= 0) {
21161
+ return 'No active timeouts were found to cancel.';
21162
+ }
21163
+ const visibleTimeoutIds = options.cancelledTimeoutIds.slice(0, MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS);
21164
+ const hiddenIdsCount = Math.max(0, options.cancelledTimeoutIds.length - visibleTimeoutIds.length);
21165
+ const hasMoreSuffix = options.hasMore ? ' Additional active timeouts may still exist.' : '';
21166
+ const idsSuffix = visibleTimeoutIds.length > 0
21167
+ ? ` Cancelled ids: ${visibleTimeoutIds.join(', ')}${hiddenIdsCount > 0 ? `, and ${hiddenIdsCount} more.` : '.'}`
21168
+ : '';
21169
+ return `Cancelled ${options.cancelledCount} active ${options.cancelledCount === 1 ? 'timeout' : 'timeouts'}.${idsSuffix}${hasMoreSuffix}`;
21170
+ }
21171
+ /**
21172
+ * Creates assistant-visible summary for bulk timeout pause/resume updates.
21173
+ *
21174
+ * @private internal utility of USE TIMEOUT
21175
+ */
21176
+ function createBulkUpdateAssistantMessage(options) {
21177
+ if (options.matchedCount <= 0) {
21178
+ return options.paused
21179
+ ? 'No active queued timeouts were found to pause.'
21180
+ : 'No paused queued timeouts were found to resume.';
21181
+ }
21182
+ const verb = options.paused ? 'Paused' : 'Resumed';
21183
+ const visibleTimeoutIds = options.updatedTimeoutIds.slice(0, MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS);
21184
+ const hiddenIdsCount = Math.max(0, options.updatedTimeoutIds.length - visibleTimeoutIds.length);
21185
+ const skippedCount = Math.max(0, options.matchedCount - options.updatedCount);
21186
+ const idsSuffix = visibleTimeoutIds.length > 0
21187
+ ? ` Updated ids: ${visibleTimeoutIds.join(', ')}${hiddenIdsCount > 0 ? `, and ${hiddenIdsCount} more.` : '.'}`
21188
+ : '';
21189
+ const skippedSuffix = skippedCount > 0 ? ` Skipped ${skippedCount} due to concurrent changes.` : '';
21190
+ const hasMoreSuffix = options.hasMore ? ' Additional matching timeouts may still exist.' : '';
21191
+ return `${verb} ${options.updatedCount} ${options.updatedCount === 1 ? 'timeout' : 'timeouts'}.${idsSuffix}${skippedSuffix}${hasMoreSuffix}`;
21192
+ }
20898
21193
 
20899
21194
  /**
20900
21195
  * Adds `USE TIMEOUT` tool definitions while preserving already registered tools.
@@ -20926,7 +21221,7 @@
20926
21221
  if (!tools.some((tool) => tool.name === TimeoutToolNames.cancel)) {
20927
21222
  tools.push({
20928
21223
  name: TimeoutToolNames.cancel,
20929
- description: 'Cancel one previously scheduled timeout within the same user+agent scope, even if it was set in another chat.',
21224
+ description: 'Cancel one timeout by id or cancel all active timeouts across chats for the same user+agent scope.',
20930
21225
  parameters: {
20931
21226
  type: 'object',
20932
21227
  properties: {
@@ -20934,15 +21229,18 @@
20934
21229
  type: 'string',
20935
21230
  description: 'Identifier returned earlier by `set_timeout` or `list_timeouts`.',
20936
21231
  },
21232
+ allActive: {
21233
+ type: 'boolean',
21234
+ description: 'When true, cancel all currently active timeouts across chats in this user+agent scope.',
21235
+ },
20937
21236
  },
20938
- required: ['timeoutId'],
20939
21237
  },
20940
21238
  });
20941
21239
  }
20942
21240
  if (!tools.some((tool) => tool.name === TimeoutToolNames.list)) {
20943
21241
  tools.push({
20944
21242
  name: TimeoutToolNames.list,
20945
- description: 'List scheduled timeouts across all chats for this same user+agent scope so they can be reviewed or cancelled.',
21243
+ description: 'List timeout details across all chats for this same user+agent scope so they can be reviewed and managed.',
20946
21244
  parameters: {
20947
21245
  type: 'object',
20948
21246
  properties: {
@@ -20958,6 +21256,49 @@
20958
21256
  },
20959
21257
  });
20960
21258
  }
21259
+ if (!tools.some((tool) => tool.name === TimeoutToolNames.update)) {
21260
+ tools.push({
21261
+ name: TimeoutToolNames.update,
21262
+ description: 'Update one timeout (pause/resume, next run, recurrence, payload) or pause/resume all active queued timeouts across chats.',
21263
+ parameters: {
21264
+ type: 'object',
21265
+ properties: {
21266
+ timeoutId: {
21267
+ type: 'string',
21268
+ description: 'Identifier returned earlier by `set_timeout` or `list_timeouts` for one timeout update.',
21269
+ },
21270
+ allActive: {
21271
+ type: 'boolean',
21272
+ description: 'When true, run one bulk pause/resume across all active queued timeouts in this same user+agent scope.',
21273
+ },
21274
+ paused: {
21275
+ type: 'boolean',
21276
+ description: 'Pause (`true`) or resume (`false`) one timeout; with `allActive: true` this pauses/resumes all active queued timeouts.',
21277
+ },
21278
+ dueAt: {
21279
+ type: 'string',
21280
+ description: 'Set the next run timestamp (ISO string). Cannot be used with `extendByMs`.',
21281
+ },
21282
+ extendByMs: {
21283
+ type: 'number',
21284
+ description: 'Move next run by this many milliseconds. Cannot be used with `dueAt`.',
21285
+ },
21286
+ recurrenceIntervalMs: {
21287
+ type: 'number',
21288
+ description: 'Set recurrence interval in milliseconds; pass `null` to disable recurrence.',
21289
+ },
21290
+ message: {
21291
+ type: 'string',
21292
+ description: 'Set wake-up message text for this timeout; pass empty string to clear.',
21293
+ },
21294
+ parameters: {
21295
+ type: 'object',
21296
+ description: 'Replace stored JSON parameters passed back when timeout fires.',
21297
+ },
21298
+ },
21299
+ },
21300
+ });
21301
+ }
20961
21302
  return tools;
20962
21303
  }
20963
21304
 
@@ -20979,7 +21320,7 @@
20979
21320
  * Short one-line description of `USE TIMEOUT`.
20980
21321
  */
20981
21322
  get description() {
20982
- return 'Enable timeout wake-ups plus scoped timeout listing/cancellation across chats.';
21323
+ return 'Enable timeout wake-ups plus scoped timeout listing, updates, and cancellation across chats.';
20983
21324
  }
20984
21325
  /**
20985
21326
  * Icon for this commitment.
@@ -21001,8 +21342,9 @@
21001
21342
  - The agent uses \`set_timeout\` to schedule a future wake-up in the same chat thread.
21002
21343
  - The tool returns immediately while the timeout is stored and executed by the runtime later.
21003
21344
  - The wake-up arrives as a new user-like timeout message in the same conversation.
21004
- - The agent can inspect known timeouts via \`list_timeouts\`.
21005
- - The agent can cancel an existing timeout by \`timeoutId\` via \`cancel_timeout\`, including timeouts created in another chat.
21345
+ - The agent can inspect known timeout details via \`list_timeouts\`.
21346
+ - The agent can cancel one timeout by \`timeoutId\` or cancel all active timeouts via \`cancel_timeout\`.
21347
+ - The agent can pause/resume and edit timeout details via \`update_timeout\`.
21006
21348
  - Commitment content is treated as optional timeout policy instructions.
21007
21349
 
21008
21350
  ## Examples
@@ -21032,6 +21374,7 @@
21032
21374
  [TimeoutToolNames.set]: 'Set timer',
21033
21375
  [TimeoutToolNames.cancel]: 'Cancel timer',
21034
21376
  [TimeoutToolNames.list]: 'List timers',
21377
+ [TimeoutToolNames.update]: 'Update timer',
21035
21378
  };
21036
21379
  }
21037
21380
  /**