@promptbook/node 0.112.0-19 → 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
@@ -48,7 +48,7 @@
48
48
  * @generated
49
49
  * @see https://github.com/webgptorg/promptbook
50
50
  */
51
- const PROMPTBOOK_ENGINE_VERSION = '0.112.0-19';
51
+ const PROMPTBOOK_ENGINE_VERSION = '0.112.0-21';
52
52
  /**
53
53
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
54
54
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -23532,8 +23532,9 @@
23532
23532
  return _spaceTrim.spaceTrim((block) => `
23533
23533
  Timeout scheduling:
23534
23534
  - Use "set_timeout" to wake this same chat thread in the future.
23535
- - Use "list_timeouts" to review timeouts across all chats for the same user+agent scope.
23536
- - "cancel_timeout" accepts a timeout id from any chat in this same user+agent scope.
23535
+ - Use "list_timeouts" to review timeout ids/details across all chats for the same user+agent scope.
23536
+ - "cancel_timeout" accepts either one timeout id or \`allActive: true\` to cancel all active timeouts in this same user+agent scope.
23537
+ - Use "update_timeout" to pause/resume, edit next run, edit recurrence, or update timeout payload details.
23537
23538
  - 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\`.
23538
23539
  - Do not claim a timer was set or cancelled unless the tool confirms it.
23539
23540
  ${block(extraInstructions)}
@@ -23660,9 +23661,18 @@
23660
23661
  */
23661
23662
  cancel(args) {
23662
23663
  const timeoutId = typeof args.timeoutId === 'string' ? args.timeoutId.trim() : '';
23664
+ const allActive = args.allActive === true;
23665
+ if (timeoutId && allActive) {
23666
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23667
+ Timeout cancellation must target either one \`timeoutId\` or \`allActive: true\`, not both.
23668
+ `));
23669
+ }
23670
+ if (allActive) {
23671
+ return { allActive: true };
23672
+ }
23663
23673
  if (!timeoutId) {
23664
23674
  throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23665
- Timeout \`timeoutId\` is required.
23675
+ Timeout \`timeoutId\` is required unless you pass \`allActive: true\`.
23666
23676
  `));
23667
23677
  }
23668
23678
  return { timeoutId };
@@ -23692,6 +23702,111 @@
23692
23702
  limit: parsedLimit,
23693
23703
  };
23694
23704
  },
23705
+ /**
23706
+ * Parses `update_timeout` input.
23707
+ */
23708
+ update(args) {
23709
+ const timeoutId = typeof args.timeoutId === 'string' ? args.timeoutId.trim() : '';
23710
+ const allActive = args.allActive === true;
23711
+ if (timeoutId && allActive) {
23712
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23713
+ Timeout update must target either one \`timeoutId\` or \`allActive: true\`, not both.
23714
+ `));
23715
+ }
23716
+ if (!timeoutId && !allActive) {
23717
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23718
+ Timeout update requires one \`timeoutId\` or \`allActive: true\`.
23719
+ `));
23720
+ }
23721
+ const patch = {};
23722
+ if (typeof args.dueAt === 'string' && args.dueAt.trim().length > 0) {
23723
+ const normalizedDueAt = args.dueAt.trim();
23724
+ const dueAtTimestamp = Date.parse(normalizedDueAt);
23725
+ if (!Number.isFinite(dueAtTimestamp)) {
23726
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23727
+ Timeout \`dueAt\` must be one valid ISO timestamp.
23728
+ `));
23729
+ }
23730
+ patch.dueAt = new Date(dueAtTimestamp).toISOString();
23731
+ }
23732
+ if (typeof args.extendByMs === 'number') {
23733
+ if (!Number.isFinite(args.extendByMs) || args.extendByMs <= 0) {
23734
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23735
+ Timeout \`extendByMs\` must be a positive number of milliseconds.
23736
+ `));
23737
+ }
23738
+ patch.extendByMs = Math.floor(args.extendByMs);
23739
+ }
23740
+ if (patch.dueAt !== undefined && patch.extendByMs !== undefined) {
23741
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23742
+ Timeout update cannot include both \`dueAt\` and \`extendByMs\`.
23743
+ `));
23744
+ }
23745
+ if (args.recurrenceIntervalMs === null) {
23746
+ patch.recurrenceIntervalMs = null;
23747
+ }
23748
+ else if (typeof args.recurrenceIntervalMs === 'number') {
23749
+ if (!Number.isFinite(args.recurrenceIntervalMs) || args.recurrenceIntervalMs <= 0) {
23750
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23751
+ Timeout \`recurrenceIntervalMs\` must be a positive number of milliseconds or \`null\`.
23752
+ `));
23753
+ }
23754
+ patch.recurrenceIntervalMs = Math.floor(args.recurrenceIntervalMs);
23755
+ }
23756
+ if (args.message === null) {
23757
+ patch.message = null;
23758
+ }
23759
+ else if (typeof args.message === 'string') {
23760
+ const normalizedMessage = args.message.trim();
23761
+ patch.message = normalizedMessage.length > 0 ? normalizedMessage : null;
23762
+ }
23763
+ if (args.parameters !== undefined) {
23764
+ if (!args.parameters || typeof args.parameters !== 'object' || Array.isArray(args.parameters)) {
23765
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23766
+ Timeout \`parameters\` must be one JSON object.
23767
+ `));
23768
+ }
23769
+ patch.parameters = args.parameters;
23770
+ }
23771
+ if (typeof args.paused === 'boolean') {
23772
+ patch.paused = args.paused;
23773
+ }
23774
+ if (allActive) {
23775
+ if (patch.paused === undefined) {
23776
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23777
+ Bulk timeout update with \`allActive: true\` requires \`paused\` to be explicitly set.
23778
+ `));
23779
+ }
23780
+ const hasSingleOnlyPatch = patch.dueAt !== undefined ||
23781
+ patch.extendByMs !== undefined ||
23782
+ patch.recurrenceIntervalMs !== undefined ||
23783
+ patch.message !== undefined ||
23784
+ patch.parameters !== undefined;
23785
+ if (hasSingleOnlyPatch) {
23786
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23787
+ Bulk timeout update only supports the \`paused\` field.
23788
+ `));
23789
+ }
23790
+ return {
23791
+ allActive: true,
23792
+ paused: patch.paused,
23793
+ };
23794
+ }
23795
+ if (!timeoutId) {
23796
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23797
+ Timeout \`timeoutId\` is required for single-timeout updates.
23798
+ `));
23799
+ }
23800
+ if (Object.keys(patch).length === 0) {
23801
+ throw new PipelineExecutionError(_spaceTrim.spaceTrim(`
23802
+ Timeout update must include at least one editable field.
23803
+ `));
23804
+ }
23805
+ return {
23806
+ timeoutId,
23807
+ patch,
23808
+ };
23809
+ },
23695
23810
  };
23696
23811
 
23697
23812
  /**
@@ -23703,6 +23818,7 @@
23703
23818
  set: 'set_timeout',
23704
23819
  cancel: 'cancel_timeout',
23705
23820
  list: 'list_timeouts',
23821
+ update: 'update_timeout',
23706
23822
  };
23707
23823
 
23708
23824
  /**
@@ -23735,6 +23851,18 @@
23735
23851
  return Object.fromEntries(normalizedEntries);
23736
23852
  }
23737
23853
 
23854
+ /**
23855
+ * Maximum number of timeout rows rendered into the assistant-visible `list_timeouts` message.
23856
+ *
23857
+ * @private internal USE TIMEOUT constant
23858
+ */
23859
+ const MAX_ASSISTANT_VISIBLE_TIMEOUT_ROWS = 20;
23860
+ /**
23861
+ * Maximum number of timeout ids rendered in bulk-action summaries.
23862
+ *
23863
+ * @private internal USE TIMEOUT constant
23864
+ */
23865
+ const MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS = 10;
23738
23866
  /**
23739
23867
  * Gets `USE TIMEOUT` tool function implementations.
23740
23868
  *
@@ -23780,6 +23908,23 @@
23780
23908
  try {
23781
23909
  const parsedArgs = parseTimeoutToolArgs.cancel(args);
23782
23910
  const cancelledTimeout = await adapter.cancelTimeout(parsedArgs, runtimeContext);
23911
+ if (cancelledTimeout.status === 'cancelled_all') {
23912
+ const result = {
23913
+ action: 'cancel',
23914
+ status: 'cancelled_all',
23915
+ cancelledCount: cancelledTimeout.cancelledCount || 0,
23916
+ cancelledTimeoutIds: cancelledTimeout.cancelledTimeoutIds || [],
23917
+ hasMore: cancelledTimeout.hasMore,
23918
+ };
23919
+ return createToolExecutionEnvelope({
23920
+ assistantMessage: createBulkCancelAssistantMessage({
23921
+ cancelledCount: result.cancelledCount || 0,
23922
+ cancelledTimeoutIds: result.cancelledTimeoutIds || [],
23923
+ hasMore: result.hasMore,
23924
+ }),
23925
+ toolResult: result,
23926
+ });
23927
+ }
23783
23928
  const result = {
23784
23929
  action: 'cancel',
23785
23930
  status: cancelledTimeout.status,
@@ -23818,7 +23963,10 @@
23818
23963
  total: listedTimeouts.total,
23819
23964
  };
23820
23965
  return createToolExecutionEnvelope({
23821
- assistantMessage: listedTimeouts.total === 1 ? 'Found 1 timeout.' : `Found ${listedTimeouts.total} timeouts.`,
23966
+ assistantMessage: createListedTimeoutsAssistantMessage({
23967
+ total: listedTimeouts.total,
23968
+ items: listedTimeouts.items,
23969
+ }),
23822
23970
  toolResult: result,
23823
23971
  });
23824
23972
  }
@@ -23831,8 +23979,155 @@
23831
23979
  return JSON.stringify(result);
23832
23980
  }
23833
23981
  },
23982
+ async [TimeoutToolNames.update](args) {
23983
+ const runtimeContext = resolveTimeoutRuntimeContext(args);
23984
+ const { adapter, disabledResult } = getTimeoutToolRuntimeAdapterOrDisabledResult('update', runtimeContext);
23985
+ if (!adapter || disabledResult) {
23986
+ return JSON.stringify(disabledResult);
23987
+ }
23988
+ try {
23989
+ const parsedArgs = parseTimeoutToolArgs.update(args);
23990
+ const updatedTimeout = await adapter.updateTimeout(parsedArgs, runtimeContext);
23991
+ if (updatedTimeout.status === 'updated_all') {
23992
+ const result = {
23993
+ action: 'update',
23994
+ status: 'updated_all',
23995
+ updatedCount: updatedTimeout.updatedCount,
23996
+ matchedCount: updatedTimeout.matchedCount,
23997
+ updatedTimeoutIds: updatedTimeout.updatedTimeoutIds,
23998
+ hasMore: updatedTimeout.hasMore,
23999
+ };
24000
+ return createToolExecutionEnvelope({
24001
+ assistantMessage: createBulkUpdateAssistantMessage({
24002
+ paused: 'allActive' in parsedArgs && parsedArgs.allActive ? parsedArgs.paused : false,
24003
+ updatedCount: updatedTimeout.updatedCount,
24004
+ matchedCount: updatedTimeout.matchedCount,
24005
+ updatedTimeoutIds: updatedTimeout.updatedTimeoutIds,
24006
+ hasMore: updatedTimeout.hasMore,
24007
+ }),
24008
+ toolResult: result,
24009
+ });
24010
+ }
24011
+ if (updatedTimeout.status === 'not_found') {
24012
+ const result = {
24013
+ action: 'update',
24014
+ status: 'not_found',
24015
+ timeoutId: updatedTimeout.timeoutId,
24016
+ };
24017
+ return createToolExecutionEnvelope({
24018
+ assistantMessage: 'The timeout was not found.',
24019
+ toolResult: result,
24020
+ });
24021
+ }
24022
+ if (updatedTimeout.status === 'conflict') {
24023
+ const conflictMessage = updatedTimeout.reason === 'running'
24024
+ ? 'Running timeout cannot be edited.'
24025
+ : 'Finished timeout cannot be edited.';
24026
+ const result = {
24027
+ action: 'update',
24028
+ status: 'conflict',
24029
+ timeoutId: updatedTimeout.timeoutId,
24030
+ message: conflictMessage,
24031
+ };
24032
+ return createToolExecutionEnvelope({
24033
+ assistantMessage: conflictMessage,
24034
+ toolResult: result,
24035
+ });
24036
+ }
24037
+ const result = {
24038
+ action: 'update',
24039
+ status: 'updated',
24040
+ timeoutId: updatedTimeout.timeout.timeoutId,
24041
+ dueAt: updatedTimeout.timeout.dueAt,
24042
+ paused: updatedTimeout.timeout.paused,
24043
+ recurrenceIntervalMs: updatedTimeout.timeout.recurrenceIntervalMs,
24044
+ };
24045
+ return createToolExecutionEnvelope({
24046
+ assistantMessage: `Updated timeout ${JSON.stringify(updatedTimeout.timeout.timeoutId)}.`,
24047
+ toolResult: result,
24048
+ });
24049
+ }
24050
+ catch (error) {
24051
+ const result = {
24052
+ action: 'update',
24053
+ status: 'error',
24054
+ message: error instanceof Error ? error.message : String(error),
24055
+ };
24056
+ return JSON.stringify(result);
24057
+ }
24058
+ },
23834
24059
  };
23835
24060
  }
24061
+ /**
24062
+ * Creates assistant-visible summary for one `list_timeouts` response.
24063
+ *
24064
+ * @private internal utility of USE TIMEOUT
24065
+ */
24066
+ function createListedTimeoutsAssistantMessage(options) {
24067
+ if (options.total <= 0 || options.items.length === 0) {
24068
+ return 'Found 0 timeouts.';
24069
+ }
24070
+ const visibleItems = options.items.slice(0, MAX_ASSISTANT_VISIBLE_TIMEOUT_ROWS);
24071
+ const summaryRows = visibleItems.map((item, index) => `${index + 1}. ${formatTimeoutListRow(item)}`);
24072
+ const hiddenCount = Math.max(0, options.total - visibleItems.length);
24073
+ if (hiddenCount > 0) {
24074
+ summaryRows.push(`...and ${hiddenCount} more.`);
24075
+ }
24076
+ return [`Found ${options.total} ${options.total === 1 ? 'timeout' : 'timeouts'}:`, ...summaryRows].join('\n');
24077
+ }
24078
+ /**
24079
+ * Formats one timeout row for assistant-visible timeout listings.
24080
+ *
24081
+ * @private internal utility of USE TIMEOUT
24082
+ */
24083
+ function formatTimeoutListRow(item) {
24084
+ const normalizedMessage = typeof item.message === 'string' ? item.message.trim() : '';
24085
+ const messageSuffix = normalizedMessage ? ` | message ${JSON.stringify(normalizedMessage)}` : '';
24086
+ const recurrenceSuffix = typeof item.recurrenceIntervalMs === 'number' && item.recurrenceIntervalMs > 0
24087
+ ? ` | recurrence ${item.recurrenceIntervalMs}ms`
24088
+ : '';
24089
+ const pausedSuffix = item.paused ? ' (paused)' : '';
24090
+ return `${item.timeoutId} | ${item.status}${pausedSuffix} | chat ${item.chatId} | due ${item.dueAt}${recurrenceSuffix}${messageSuffix}`;
24091
+ }
24092
+ /**
24093
+ * Creates assistant-visible summary for bulk timeout cancellation.
24094
+ *
24095
+ * @private internal utility of USE TIMEOUT
24096
+ */
24097
+ function createBulkCancelAssistantMessage(options) {
24098
+ if (options.cancelledCount <= 0) {
24099
+ return 'No active timeouts were found to cancel.';
24100
+ }
24101
+ const visibleTimeoutIds = options.cancelledTimeoutIds.slice(0, MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS);
24102
+ const hiddenIdsCount = Math.max(0, options.cancelledTimeoutIds.length - visibleTimeoutIds.length);
24103
+ const hasMoreSuffix = options.hasMore ? ' Additional active timeouts may still exist.' : '';
24104
+ const idsSuffix = visibleTimeoutIds.length > 0
24105
+ ? ` Cancelled ids: ${visibleTimeoutIds.join(', ')}${hiddenIdsCount > 0 ? `, and ${hiddenIdsCount} more.` : '.'}`
24106
+ : '';
24107
+ return `Cancelled ${options.cancelledCount} active ${options.cancelledCount === 1 ? 'timeout' : 'timeouts'}.${idsSuffix}${hasMoreSuffix}`;
24108
+ }
24109
+ /**
24110
+ * Creates assistant-visible summary for bulk timeout pause/resume updates.
24111
+ *
24112
+ * @private internal utility of USE TIMEOUT
24113
+ */
24114
+ function createBulkUpdateAssistantMessage(options) {
24115
+ if (options.matchedCount <= 0) {
24116
+ return options.paused
24117
+ ? 'No active queued timeouts were found to pause.'
24118
+ : 'No paused queued timeouts were found to resume.';
24119
+ }
24120
+ const verb = options.paused ? 'Paused' : 'Resumed';
24121
+ const visibleTimeoutIds = options.updatedTimeoutIds.slice(0, MAX_ASSISTANT_VISIBLE_BULK_TIMEOUT_IDS);
24122
+ const hiddenIdsCount = Math.max(0, options.updatedTimeoutIds.length - visibleTimeoutIds.length);
24123
+ const skippedCount = Math.max(0, options.matchedCount - options.updatedCount);
24124
+ const idsSuffix = visibleTimeoutIds.length > 0
24125
+ ? ` Updated ids: ${visibleTimeoutIds.join(', ')}${hiddenIdsCount > 0 ? `, and ${hiddenIdsCount} more.` : '.'}`
24126
+ : '';
24127
+ const skippedSuffix = skippedCount > 0 ? ` Skipped ${skippedCount} due to concurrent changes.` : '';
24128
+ const hasMoreSuffix = options.hasMore ? ' Additional matching timeouts may still exist.' : '';
24129
+ return `${verb} ${options.updatedCount} ${options.updatedCount === 1 ? 'timeout' : 'timeouts'}.${idsSuffix}${skippedSuffix}${hasMoreSuffix}`;
24130
+ }
23836
24131
 
23837
24132
  /**
23838
24133
  * Adds `USE TIMEOUT` tool definitions while preserving already registered tools.
@@ -23864,7 +24159,7 @@
23864
24159
  if (!tools.some((tool) => tool.name === TimeoutToolNames.cancel)) {
23865
24160
  tools.push({
23866
24161
  name: TimeoutToolNames.cancel,
23867
- description: 'Cancel one previously scheduled timeout within the same user+agent scope, even if it was set in another chat.',
24162
+ description: 'Cancel one timeout by id or cancel all active timeouts across chats for the same user+agent scope.',
23868
24163
  parameters: {
23869
24164
  type: 'object',
23870
24165
  properties: {
@@ -23872,15 +24167,18 @@
23872
24167
  type: 'string',
23873
24168
  description: 'Identifier returned earlier by `set_timeout` or `list_timeouts`.',
23874
24169
  },
24170
+ allActive: {
24171
+ type: 'boolean',
24172
+ description: 'When true, cancel all currently active timeouts across chats in this user+agent scope.',
24173
+ },
23875
24174
  },
23876
- required: ['timeoutId'],
23877
24175
  },
23878
24176
  });
23879
24177
  }
23880
24178
  if (!tools.some((tool) => tool.name === TimeoutToolNames.list)) {
23881
24179
  tools.push({
23882
24180
  name: TimeoutToolNames.list,
23883
- description: 'List scheduled timeouts across all chats for this same user+agent scope so they can be reviewed or cancelled.',
24181
+ description: 'List timeout details across all chats for this same user+agent scope so they can be reviewed and managed.',
23884
24182
  parameters: {
23885
24183
  type: 'object',
23886
24184
  properties: {
@@ -23896,6 +24194,49 @@
23896
24194
  },
23897
24195
  });
23898
24196
  }
24197
+ if (!tools.some((tool) => tool.name === TimeoutToolNames.update)) {
24198
+ tools.push({
24199
+ name: TimeoutToolNames.update,
24200
+ description: 'Update one timeout (pause/resume, next run, recurrence, payload) or pause/resume all active queued timeouts across chats.',
24201
+ parameters: {
24202
+ type: 'object',
24203
+ properties: {
24204
+ timeoutId: {
24205
+ type: 'string',
24206
+ description: 'Identifier returned earlier by `set_timeout` or `list_timeouts` for one timeout update.',
24207
+ },
24208
+ allActive: {
24209
+ type: 'boolean',
24210
+ description: 'When true, run one bulk pause/resume across all active queued timeouts in this same user+agent scope.',
24211
+ },
24212
+ paused: {
24213
+ type: 'boolean',
24214
+ description: 'Pause (`true`) or resume (`false`) one timeout; with `allActive: true` this pauses/resumes all active queued timeouts.',
24215
+ },
24216
+ dueAt: {
24217
+ type: 'string',
24218
+ description: 'Set the next run timestamp (ISO string). Cannot be used with `extendByMs`.',
24219
+ },
24220
+ extendByMs: {
24221
+ type: 'number',
24222
+ description: 'Move next run by this many milliseconds. Cannot be used with `dueAt`.',
24223
+ },
24224
+ recurrenceIntervalMs: {
24225
+ type: 'number',
24226
+ description: 'Set recurrence interval in milliseconds; pass `null` to disable recurrence.',
24227
+ },
24228
+ message: {
24229
+ type: 'string',
24230
+ description: 'Set wake-up message text for this timeout; pass empty string to clear.',
24231
+ },
24232
+ parameters: {
24233
+ type: 'object',
24234
+ description: 'Replace stored JSON parameters passed back when timeout fires.',
24235
+ },
24236
+ },
24237
+ },
24238
+ });
24239
+ }
23899
24240
  return tools;
23900
24241
  }
23901
24242
 
@@ -23917,7 +24258,7 @@
23917
24258
  * Short one-line description of `USE TIMEOUT`.
23918
24259
  */
23919
24260
  get description() {
23920
- return 'Enable timeout wake-ups plus scoped timeout listing/cancellation across chats.';
24261
+ return 'Enable timeout wake-ups plus scoped timeout listing, updates, and cancellation across chats.';
23921
24262
  }
23922
24263
  /**
23923
24264
  * Icon for this commitment.
@@ -23939,8 +24280,9 @@
23939
24280
  - The agent uses \`set_timeout\` to schedule a future wake-up in the same chat thread.
23940
24281
  - The tool returns immediately while the timeout is stored and executed by the runtime later.
23941
24282
  - The wake-up arrives as a new user-like timeout message in the same conversation.
23942
- - The agent can inspect known timeouts via \`list_timeouts\`.
23943
- - The agent can cancel an existing timeout by \`timeoutId\` via \`cancel_timeout\`, including timeouts created in another chat.
24283
+ - The agent can inspect known timeout details via \`list_timeouts\`.
24284
+ - The agent can cancel one timeout by \`timeoutId\` or cancel all active timeouts via \`cancel_timeout\`.
24285
+ - The agent can pause/resume and edit timeout details via \`update_timeout\`.
23944
24286
  - Commitment content is treated as optional timeout policy instructions.
23945
24287
 
23946
24288
  ## Examples
@@ -23970,6 +24312,7 @@
23970
24312
  [TimeoutToolNames.set]: 'Set timer',
23971
24313
  [TimeoutToolNames.cancel]: 'Cancel timer',
23972
24314
  [TimeoutToolNames.list]: 'List timers',
24315
+ [TimeoutToolNames.update]: 'Update timer',
23973
24316
  };
23974
24317
  }
23975
24318
  /**