@tuturuuu/ai 0.0.10

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 (130) hide show
  1. package/README.md +76 -0
  2. package/package.json +106 -0
  3. package/src/api-key-hash.ts +28 -0
  4. package/src/calendar/events.ts +34 -0
  5. package/src/calendar/route.ts +114 -0
  6. package/src/chat/credit-source.ts +1 -0
  7. package/src/chat/google/chat-request-schema.ts +150 -0
  8. package/src/chat/google/default-system-instruction.ts +198 -0
  9. package/src/chat/google/message-file-processing.ts +212 -0
  10. package/src/chat/google/mira-step-preparation.ts +221 -0
  11. package/src/chat/google/new/route.ts +368 -0
  12. package/src/chat/google/route-auth.ts +81 -0
  13. package/src/chat/google/route-chat-resolution.ts +98 -0
  14. package/src/chat/google/route-credits.ts +61 -0
  15. package/src/chat/google/route-message-preparation.ts +331 -0
  16. package/src/chat/google/route-mira-runtime.ts +206 -0
  17. package/src/chat/google/route.ts +632 -0
  18. package/src/chat/google/stream-finish-persistence.ts +722 -0
  19. package/src/chat/google/summary/route.ts +153 -0
  20. package/src/chat/mira-render-ui-policy.ts +540 -0
  21. package/src/chat/mira-system-instruction.ts +484 -0
  22. package/src/chat-sdk/adapters.ts +389 -0
  23. package/src/chat-sdk/registry.ts +197 -0
  24. package/src/chat-sdk.ts +33 -0
  25. package/src/core.ts +3 -0
  26. package/src/credits/cap-output-tokens.ts +90 -0
  27. package/src/credits/check-credits.ts +232 -0
  28. package/src/credits/constants.ts +30 -0
  29. package/src/credits/index.ts +46 -0
  30. package/src/credits/model-mapping.ts +92 -0
  31. package/src/credits/reservations.ts +514 -0
  32. package/src/credits/resolve-plan-model.ts +219 -0
  33. package/src/credits/sync-gateway-models.ts +351 -0
  34. package/src/credits/types.ts +109 -0
  35. package/src/credits/use-ai-credits.ts +3 -0
  36. package/src/embeddings/metered.ts +283 -0
  37. package/src/executions/route.ts +137 -0
  38. package/src/generate/route.ts +411 -0
  39. package/src/hooks.ts +7 -0
  40. package/src/meetings/summary/route.ts +7 -0
  41. package/src/meetings/transcription/route.ts +134 -0
  42. package/src/memory/client.ts +158 -0
  43. package/src/memory/config.ts +38 -0
  44. package/src/memory/index.ts +32 -0
  45. package/src/memory/ingest.ts +51 -0
  46. package/src/memory/middleware.ts +35 -0
  47. package/src/memory/operations.ts +480 -0
  48. package/src/memory/scope.ts +102 -0
  49. package/src/memory/settings.ts +121 -0
  50. package/src/memory/types.ts +101 -0
  51. package/src/memory/workspace.ts +36 -0
  52. package/src/memory.ts +1 -0
  53. package/src/mind/patch.ts +146 -0
  54. package/src/mind/route.ts +687 -0
  55. package/src/mind/tools.ts +1500 -0
  56. package/src/mind/types.ts +20 -0
  57. package/src/object/core.ts +3 -0
  58. package/src/object/flashcards/route.ts +140 -0
  59. package/src/object/quizzes/explanation/route.ts +145 -0
  60. package/src/object/quizzes/route.ts +142 -0
  61. package/src/object/types.ts +187 -0
  62. package/src/object/year-plan/route.ts +196 -0
  63. package/src/react.ts +1 -0
  64. package/src/scheduling/algorithm.ts +791 -0
  65. package/src/scheduling/default.ts +36 -0
  66. package/src/scheduling/duration-optimizer.ts +689 -0
  67. package/src/scheduling/index.ts +79 -0
  68. package/src/scheduling/priority-calculator.ts +187 -0
  69. package/src/scheduling/recurrence-calculator.ts +621 -0
  70. package/src/scheduling/templates.ts +892 -0
  71. package/src/scheduling/types.ts +136 -0
  72. package/src/scheduling/web-adapter.ts +308 -0
  73. package/src/scheduling.ts +6 -0
  74. package/src/supported-actions.ts +1 -0
  75. package/src/supported-providers.ts +6 -0
  76. package/src/tools/context-builder.ts +372 -0
  77. package/src/tools/core.ts +1 -0
  78. package/src/tools/definitions/calendar.ts +106 -0
  79. package/src/tools/definitions/finance.ts +197 -0
  80. package/src/tools/definitions/image.ts +74 -0
  81. package/src/tools/definitions/memory.ts +83 -0
  82. package/src/tools/definitions/meta.ts +154 -0
  83. package/src/tools/definitions/render-ui.ts +81 -0
  84. package/src/tools/definitions/tasks.ts +343 -0
  85. package/src/tools/definitions/time-tracking.ts +381 -0
  86. package/src/tools/definitions/workspace-context.ts +45 -0
  87. package/src/tools/definitions/workspace-user-chat.ts +111 -0
  88. package/src/tools/executors/calendar.ts +371 -0
  89. package/src/tools/executors/chat.ts +15 -0
  90. package/src/tools/executors/finance.ts +638 -0
  91. package/src/tools/executors/helpers/encryption.ts +107 -0
  92. package/src/tools/executors/image.ts +247 -0
  93. package/src/tools/executors/markitdown.ts +684 -0
  94. package/src/tools/executors/memory.ts +277 -0
  95. package/src/tools/executors/parallel-checks.ts +176 -0
  96. package/src/tools/executors/qr.ts +170 -0
  97. package/src/tools/executors/scope-helpers.ts +192 -0
  98. package/src/tools/executors/search.ts +149 -0
  99. package/src/tools/executors/settings.ts +40 -0
  100. package/src/tools/executors/tasks.ts +1087 -0
  101. package/src/tools/executors/theme.ts +23 -0
  102. package/src/tools/executors/timer/timer-categories-executor.ts +110 -0
  103. package/src/tools/executors/timer/timer-category-mutations.ts +240 -0
  104. package/src/tools/executors/timer/timer-goal-mutations.ts +323 -0
  105. package/src/tools/executors/timer/timer-goals-executor.ts +272 -0
  106. package/src/tools/executors/timer/timer-helpers.ts +372 -0
  107. package/src/tools/executors/timer/timer-mutation-schemas.ts +160 -0
  108. package/src/tools/executors/timer/timer-mutation-types.ts +212 -0
  109. package/src/tools/executors/timer/timer-mutations.ts +19 -0
  110. package/src/tools/executors/timer/timer-queries.ts +18 -0
  111. package/src/tools/executors/timer/timer-session-lifecycle.ts +299 -0
  112. package/src/tools/executors/timer/timer-session-mutations.ts +10 -0
  113. package/src/tools/executors/timer/timer-session-queries.ts +153 -0
  114. package/src/tools/executors/timer/timer-session-updates.ts +200 -0
  115. package/src/tools/executors/timer/timer-sessions-executor.ts +91 -0
  116. package/src/tools/executors/timer/timer-stats-executor.ts +157 -0
  117. package/src/tools/executors/timer.ts +22 -0
  118. package/src/tools/executors/user.ts +60 -0
  119. package/src/tools/executors/workspace.ts +135 -0
  120. package/src/tools/json-render-catalog.ts +875 -0
  121. package/src/tools/mira-tool-definitions.ts +55 -0
  122. package/src/tools/mira-tool-dispatcher.ts +265 -0
  123. package/src/tools/mira-tool-metadata.ts +164 -0
  124. package/src/tools/mira-tool-names.ts +95 -0
  125. package/src/tools/mira-tool-render-ui.ts +54 -0
  126. package/src/tools/mira-tool-types.ts +17 -0
  127. package/src/tools/mira-tools.ts +167 -0
  128. package/src/tools/normalize-render-ui-input.ts +321 -0
  129. package/src/tools/workspace-context.ts +233 -0
  130. package/src/types.ts +38 -0
@@ -0,0 +1,55 @@
1
+ import { calendarToolDefinitions } from './definitions/calendar';
2
+ import { financeToolDefinitions } from './definitions/finance';
3
+ import { imageToolDefinitions } from './definitions/image';
4
+ import { memoryToolDefinitions } from './definitions/memory';
5
+ import { metaToolDefinitions } from './definitions/meta';
6
+ import { renderUiToolDefinitions } from './definitions/render-ui';
7
+ import { taskToolDefinitions } from './definitions/tasks';
8
+ import { timeTrackingToolDefinitions } from './definitions/time-tracking';
9
+ import { workspaceContextToolDefinitions } from './definitions/workspace-context';
10
+ import { workspaceUserChatToolDefinitions } from './definitions/workspace-user-chat';
11
+ import type { DefinedMiraToolName, MiraToolName } from './mira-tool-names';
12
+
13
+ type MiraToolDefinitions = typeof metaToolDefinitions &
14
+ typeof taskToolDefinitions &
15
+ typeof calendarToolDefinitions &
16
+ typeof financeToolDefinitions &
17
+ typeof timeTrackingToolDefinitions &
18
+ typeof memoryToolDefinitions &
19
+ typeof imageToolDefinitions &
20
+ typeof workspaceContextToolDefinitions &
21
+ typeof workspaceUserChatToolDefinitions &
22
+ typeof renderUiToolDefinitions;
23
+
24
+ function mergeUniqueToolDefinitions(
25
+ ...sources: ReadonlyArray<Record<string, unknown>>
26
+ ): MiraToolDefinitions {
27
+ const merged: Record<string, unknown> = {};
28
+
29
+ for (const source of sources) {
30
+ for (const [key, value] of Object.entries(source)) {
31
+ if (key in merged) {
32
+ throw new Error(`Duplicate Mira tool definition key: ${key}`);
33
+ }
34
+
35
+ merged[key] = value;
36
+ }
37
+ }
38
+
39
+ return merged as MiraToolDefinitions;
40
+ }
41
+
42
+ export const miraToolDefinitions = mergeUniqueToolDefinitions(
43
+ metaToolDefinitions,
44
+ taskToolDefinitions,
45
+ calendarToolDefinitions,
46
+ financeToolDefinitions,
47
+ timeTrackingToolDefinitions,
48
+ memoryToolDefinitions,
49
+ imageToolDefinitions,
50
+ workspaceContextToolDefinitions,
51
+ workspaceUserChatToolDefinitions,
52
+ renderUiToolDefinitions
53
+ );
54
+
55
+ export type { DefinedMiraToolName, MiraToolName };
@@ -0,0 +1,265 @@
1
+ import {
2
+ executeCheckE2EEStatus,
3
+ executeCreateEvent,
4
+ executeDeleteEvent,
5
+ executeEnableE2EE,
6
+ executeGetUpcomingEvents,
7
+ executeUpdateEvent,
8
+ } from './executors/calendar';
9
+ import { executeSetImmersiveMode } from './executors/chat';
10
+ import {
11
+ executeCreateTransactionCategory,
12
+ executeCreateTransactionTag,
13
+ executeCreateWallet,
14
+ executeDeleteTransaction,
15
+ executeDeleteTransactionCategory,
16
+ executeDeleteTransactionTag,
17
+ executeDeleteWallet,
18
+ executeGetSpendingSummary,
19
+ executeGetTransaction,
20
+ executeListTransactionCategories,
21
+ executeListTransactions,
22
+ executeListTransactionTags,
23
+ executeListWallets,
24
+ executeLogTransaction,
25
+ executeSetDefaultCurrency,
26
+ executeUpdateTransaction,
27
+ executeUpdateTransactionCategory,
28
+ executeUpdateTransactionTag,
29
+ executeUpdateWallet,
30
+ } from './executors/finance';
31
+ import { executeGenerateImage } from './executors/image';
32
+ import { executeConvertFileToMarkdown } from './executors/markitdown';
33
+ import {
34
+ executeDeleteMemory,
35
+ executeListMemories,
36
+ executeMergeMemories,
37
+ executeRecall,
38
+ executeRemember,
39
+ } from './executors/memory';
40
+ import { executeParallelChecks } from './executors/parallel-checks';
41
+ import { executeCreateQrCode } from './executors/qr';
42
+ import { executeGoogleSearch } from './executors/search';
43
+ import { executeUpdateMySettings } from './executors/settings';
44
+ import {
45
+ executeAddTaskAssignee,
46
+ executeAddTaskLabels,
47
+ executeAddTaskToProject,
48
+ executeCompleteTask,
49
+ executeCreateBoard,
50
+ executeCreateProject,
51
+ executeCreateTask,
52
+ executeCreateTaskLabel,
53
+ executeCreateTaskList,
54
+ executeDeleteBoard,
55
+ executeDeleteProject,
56
+ executeDeleteTask,
57
+ executeDeleteTaskLabel,
58
+ executeDeleteTaskList,
59
+ executeGetMyTasks,
60
+ executeListBoards,
61
+ executeListProjects,
62
+ executeListTaskLabels,
63
+ executeListTaskLists,
64
+ executeRemoveTaskAssignee,
65
+ executeRemoveTaskFromProject,
66
+ executeRemoveTaskLabels,
67
+ executeUpdateBoard,
68
+ executeUpdateProject,
69
+ executeUpdateTask,
70
+ executeUpdateTaskLabel,
71
+ executeUpdateTaskList,
72
+ } from './executors/tasks';
73
+ import { executeSetTheme } from './executors/theme';
74
+ import {
75
+ executeCreateTimeTrackerGoal,
76
+ executeCreateTimeTrackingCategory,
77
+ executeCreateTimeTrackingEntry,
78
+ executeDeleteTimeTrackerGoal,
79
+ executeDeleteTimeTrackingCategory,
80
+ executeDeleteTimeTrackingSession,
81
+ executeGetTimeTrackerGoals,
82
+ executeGetTimeTrackerStats,
83
+ executeGetTimeTrackingSession,
84
+ executeListTimeTrackingCategories,
85
+ executeListTimeTrackingSessions,
86
+ executeMoveTimeTrackingSession,
87
+ executeStartTimer,
88
+ executeStopTimer,
89
+ executeUpdateTimeTrackerGoal,
90
+ executeUpdateTimeTrackingCategory,
91
+ executeUpdateTimeTrackingSession,
92
+ } from './executors/timer';
93
+ import { executeUpdateUserName } from './executors/user';
94
+ import {
95
+ executeGetWorkspaceContext,
96
+ executeListAccessibleWorkspaces,
97
+ executeListWorkspaceMembers,
98
+ executeSetWorkspaceContext,
99
+ } from './executors/workspace';
100
+ import type { DefinedMiraToolName } from './mira-tool-definitions';
101
+ import {
102
+ buildRenderUiRecoverySpec,
103
+ isRenderableRenderUiSpec,
104
+ } from './mira-tool-render-ui';
105
+ import type { MiraToolContext } from './mira-tool-types';
106
+
107
+ type ToolHandler = (
108
+ args: Record<string, unknown>,
109
+ ctx: MiraToolContext,
110
+ options?: { abortSignal?: AbortSignal }
111
+ ) => Promise<unknown> | unknown;
112
+
113
+ const toolHandlers = {
114
+ select_tools: (args) => ({ ok: true, selectedTools: args.tools }),
115
+ no_action_needed: () => ({ ok: true }),
116
+ google_search: executeGoogleSearch,
117
+ run_parallel_checks: (args, ctx, options) =>
118
+ executeParallelChecks(args, ctx, options),
119
+
120
+ get_my_tasks: executeGetMyTasks,
121
+ create_task: executeCreateTask,
122
+ complete_task: executeCompleteTask,
123
+ update_task: executeUpdateTask,
124
+ delete_task: executeDeleteTask,
125
+ list_boards: executeListBoards,
126
+ create_board: executeCreateBoard,
127
+ update_board: executeUpdateBoard,
128
+ delete_board: executeDeleteBoard,
129
+ list_task_lists: executeListTaskLists,
130
+ create_task_list: executeCreateTaskList,
131
+ update_task_list: executeUpdateTaskList,
132
+ delete_task_list: executeDeleteTaskList,
133
+ list_task_labels: executeListTaskLabels,
134
+ create_task_label: executeCreateTaskLabel,
135
+ update_task_label: executeUpdateTaskLabel,
136
+ delete_task_label: executeDeleteTaskLabel,
137
+ add_task_labels: executeAddTaskLabels,
138
+ remove_task_labels: executeRemoveTaskLabels,
139
+ list_projects: executeListProjects,
140
+ create_project: executeCreateProject,
141
+ update_project: executeUpdateProject,
142
+ delete_project: executeDeleteProject,
143
+ add_task_to_project: executeAddTaskToProject,
144
+ remove_task_from_project: executeRemoveTaskFromProject,
145
+ add_task_assignee: executeAddTaskAssignee,
146
+ remove_task_assignee: executeRemoveTaskAssignee,
147
+
148
+ get_upcoming_events: executeGetUpcomingEvents,
149
+ create_event: executeCreateEvent,
150
+ update_event: executeUpdateEvent,
151
+ delete_event: executeDeleteEvent,
152
+ check_e2ee_status: executeCheckE2EEStatus,
153
+ enable_e2ee: executeEnableE2EE,
154
+
155
+ log_transaction: executeLogTransaction,
156
+ get_spending_summary: executeGetSpendingSummary,
157
+ list_wallets: executeListWallets,
158
+ create_wallet: executeCreateWallet,
159
+ update_wallet: executeUpdateWallet,
160
+ delete_wallet: executeDeleteWallet,
161
+ list_transactions: executeListTransactions,
162
+ get_transaction: executeGetTransaction,
163
+ update_transaction: executeUpdateTransaction,
164
+ delete_transaction: executeDeleteTransaction,
165
+ list_transaction_categories: executeListTransactionCategories,
166
+ create_transaction_category: executeCreateTransactionCategory,
167
+ update_transaction_category: executeUpdateTransactionCategory,
168
+ delete_transaction_category: executeDeleteTransactionCategory,
169
+ list_transaction_tags: executeListTransactionTags,
170
+ create_transaction_tag: executeCreateTransactionTag,
171
+ update_transaction_tag: executeUpdateTransactionTag,
172
+ delete_transaction_tag: executeDeleteTransactionTag,
173
+
174
+ start_timer: executeStartTimer,
175
+ stop_timer: executeStopTimer,
176
+ list_time_tracking_sessions: executeListTimeTrackingSessions,
177
+ list_time_tracking_categories: executeListTimeTrackingCategories,
178
+ create_time_tracking_category: executeCreateTimeTrackingCategory,
179
+ update_time_tracking_category: executeUpdateTimeTrackingCategory,
180
+ delete_time_tracking_category: executeDeleteTimeTrackingCategory,
181
+ get_time_tracking_session: executeGetTimeTrackingSession,
182
+ get_time_tracker_stats: executeGetTimeTrackerStats,
183
+ get_time_tracker_goals: executeGetTimeTrackerGoals,
184
+ create_time_tracker_goal: executeCreateTimeTrackerGoal,
185
+ update_time_tracker_goal: executeUpdateTimeTrackerGoal,
186
+ delete_time_tracker_goal: executeDeleteTimeTrackerGoal,
187
+ create_time_tracking_entry: executeCreateTimeTrackingEntry,
188
+ update_time_tracking_session: executeUpdateTimeTrackingSession,
189
+ delete_time_tracking_session: executeDeleteTimeTrackingSession,
190
+ move_time_tracking_session: executeMoveTimeTrackingSession,
191
+
192
+ remember: executeRemember,
193
+ recall: executeRecall,
194
+ list_memories: executeListMemories,
195
+ delete_memory: executeDeleteMemory,
196
+ merge_memories: executeMergeMemories,
197
+
198
+ create_image: executeGenerateImage,
199
+ create_qr_code: executeCreateQrCode,
200
+ convert_file_to_markdown: executeConvertFileToMarkdown,
201
+ list_accessible_workspaces: executeListAccessibleWorkspaces,
202
+ get_workspace_context: executeGetWorkspaceContext,
203
+ set_workspace_context: executeSetWorkspaceContext,
204
+
205
+ update_my_settings: executeUpdateMySettings,
206
+ set_default_currency: executeSetDefaultCurrency,
207
+ set_theme: executeSetTheme,
208
+ list_workspace_members: executeListWorkspaceMembers,
209
+ update_user_name: executeUpdateUserName,
210
+ set_immersive_mode: executeSetImmersiveMode,
211
+ } satisfies Record<Exclude<DefinedMiraToolName, 'render_ui'>, ToolHandler>;
212
+
213
+ export async function executeMiraTool(
214
+ toolName: string,
215
+ args: Record<string, unknown>,
216
+ ctx: MiraToolContext,
217
+ options?: { abortSignal?: AbortSignal }
218
+ ): Promise<unknown> {
219
+ if (toolName === 'render_ui') {
220
+ if (!isRenderableRenderUiSpec(args)) {
221
+ const diagnosisParts: string[] = [];
222
+ if (typeof args.root !== 'string' || args.root.length === 0) {
223
+ diagnosisParts.push('`root` is missing or not a string');
224
+ }
225
+ const elements = args.elements;
226
+ if (
227
+ !elements ||
228
+ typeof elements !== 'object' ||
229
+ Array.isArray(elements)
230
+ ) {
231
+ diagnosisParts.push('`elements` is missing or not an object');
232
+ } else if (Object.keys(elements as object).length === 0) {
233
+ diagnosisParts.push(
234
+ '`elements` is empty — you must define at least elements[root]'
235
+ );
236
+ } else if (
237
+ typeof args.root === 'string' &&
238
+ args.root.length > 0 &&
239
+ !(args.root in (elements as Record<string, unknown>))
240
+ ) {
241
+ diagnosisParts.push(
242
+ `elements["${args.root}"] does not exist — the root element ID must be a key in elements`
243
+ );
244
+ }
245
+ const diagnosis =
246
+ diagnosisParts.length > 0
247
+ ? ` Diagnosis: ${diagnosisParts.join('; ')}.`
248
+ : '';
249
+
250
+ return {
251
+ spec: buildRenderUiRecoverySpec(args),
252
+ recoveredFromInvalidSpec: true,
253
+ warning: `Invalid render_ui spec was auto-recovered.${diagnosis} Fix: elements MUST contain the root element. Example: { "root": "r", "elements": { "r": { "type": "Card", "props": { "title": "Result" }, "children": ["t"] }, "t": { "type": "Text", "props": { "content": "Your content here" }, "children": [] } } }.`,
254
+ };
255
+ }
256
+ return { spec: args };
257
+ }
258
+
259
+ if (!(toolName in toolHandlers))
260
+ return { error: `Unknown tool: ${toolName}` };
261
+
262
+ const handler = toolHandlers[toolName as keyof typeof toolHandlers];
263
+
264
+ return handler(args, ctx, options);
265
+ }
@@ -0,0 +1,164 @@
1
+ import type { PermissionId } from '@tuturuuu/types';
2
+ import type { MiraToolName } from './mira-tool-names';
3
+
4
+ export const MIRA_TOOL_DIRECTORY: Record<MiraToolName, string> = {
5
+ select_tools: 'Present user with tool selection options',
6
+ get_my_tasks: 'Get your tasks by status (overdue, today, upcoming)',
7
+ create_task: 'Create a new task',
8
+ complete_task: 'Mark a task as completed',
9
+ update_task: 'Update task fields (name, priority, dates, etc.)',
10
+ delete_task: 'Soft-delete a task',
11
+ list_boards: 'List all task boards in the workspace',
12
+ create_board: 'Create a new task board',
13
+ update_board: 'Update a task board name',
14
+ delete_board: 'Delete a task board',
15
+ list_task_lists: 'List columns/lists within a board',
16
+ create_task_list: 'Create a new list in a board',
17
+ update_task_list: 'Update a task list',
18
+ delete_task_list: 'Delete a task list',
19
+ list_task_labels: 'List workspace task labels',
20
+ create_task_label: 'Create a task label',
21
+ update_task_label: 'Update a task label',
22
+ delete_task_label: 'Delete a task label',
23
+ add_task_labels: 'Assign labels to a task',
24
+ remove_task_labels: 'Remove labels from a task',
25
+ list_projects: 'List workspace projects',
26
+ create_project: 'Create a project',
27
+ update_project: 'Update a project',
28
+ delete_project: 'Delete a project',
29
+ add_task_to_project: 'Link a task to a project',
30
+ remove_task_from_project: 'Unlink a task from a project',
31
+ add_task_assignee: 'Assign a user to a task',
32
+ remove_task_assignee: 'Remove a user from a task',
33
+ get_upcoming_events: 'Get calendar events for the next N days',
34
+ create_event: 'Create a calendar event',
35
+ update_event: 'Update a calendar event',
36
+ delete_event: 'Delete a calendar event',
37
+ check_e2ee_status: 'Check E2EE encryption status for calendar',
38
+ enable_e2ee: 'Enable end-to-end encryption for calendar events',
39
+ log_transaction: 'Log an income or expense transaction',
40
+ get_spending_summary: 'Get spending/income summary for N days',
41
+ list_wallets: 'List workspace wallets',
42
+ create_wallet: 'Create a new wallet',
43
+ update_wallet: 'Update wallet details',
44
+ delete_wallet: 'Delete a wallet',
45
+ list_transactions: 'List recent transactions (with filters)',
46
+ get_transaction: 'Get a single transaction by ID',
47
+ update_transaction: 'Update a transaction',
48
+ delete_transaction: 'Delete a transaction',
49
+ list_transaction_categories: 'List transaction categories',
50
+ create_transaction_category: 'Create a transaction category',
51
+ update_transaction_category: 'Update a transaction category',
52
+ delete_transaction_category: 'Delete a transaction category',
53
+ list_transaction_tags: 'List transaction tags',
54
+ create_transaction_tag: 'Create a transaction tag',
55
+ update_transaction_tag: 'Update a transaction tag',
56
+ delete_transaction_tag: 'Delete a transaction tag',
57
+ set_default_currency: 'Set the default currency for the workspace',
58
+ start_timer: 'Start a time tracking session',
59
+ stop_timer: 'Stop the running time tracking session',
60
+ list_time_tracking_sessions:
61
+ 'List your time tracking history with pagination and filters',
62
+ list_time_tracking_categories:
63
+ 'List time-tracking categories and IDs for category selection/mapping',
64
+ create_time_tracking_category:
65
+ 'Create a time-tracking category in the current workspace',
66
+ update_time_tracking_category:
67
+ 'Update a time-tracking category by ID in the current workspace',
68
+ delete_time_tracking_category:
69
+ 'Delete a time-tracking category by ID in the current workspace',
70
+ get_time_tracking_session: 'Get one time tracking session by ID',
71
+ get_time_tracker_stats:
72
+ 'Get time-tracker summary stats and activity data for insights',
73
+ get_time_tracker_goals:
74
+ 'List time-tracker goals with optional daily/weekly progress',
75
+ create_time_tracker_goal: 'Create a time-tracker goal',
76
+ update_time_tracker_goal: 'Update a time-tracker goal',
77
+ delete_time_tracker_goal: 'Delete a time-tracker goal',
78
+ create_time_tracking_entry:
79
+ 'Create a stopped/manual time tracking history entry. If approval is required, it returns requiresApproval with next-step guidance for the user/UI to handle approval.',
80
+ update_time_tracking_session: 'Update a time tracking history session',
81
+ delete_time_tracking_session: 'Delete a time tracking history session',
82
+ move_time_tracking_session:
83
+ 'Move a session to another workspace if you are a member of both',
84
+ remember: 'Save a fact/preference about the user',
85
+ recall: 'Search saved memories',
86
+ list_memories: 'List saved memories with filters/pagination',
87
+ delete_memory: 'Delete a saved memory',
88
+ merge_memories: 'Merge multiple memories into one',
89
+ create_image: 'Generate an image from a text description',
90
+ create_qr_code:
91
+ 'Generate a QR code from text with custom colors/size and save it to Drive',
92
+ google_search:
93
+ 'Search the web for real-time info (news, prices, weather, facts).',
94
+ run_parallel_checks:
95
+ 'Run lightweight parallel subagents for complex verification, planning, or conflicting-assumption checks.',
96
+ convert_file_to_markdown:
97
+ 'Convert attached files (Excel, Word, PowerPoint, PDF, etc.) into markdown via MarkItDown. Do not use for YouTube links; Google/Gemini handles YouTube URLs as native video input. Costs 100 credits per file conversion.',
98
+ list_accessible_workspaces:
99
+ 'List every workspace you can access, with member counts',
100
+ get_workspace_context:
101
+ 'Show the current workspace context used for tasks, calendar, and finance queries',
102
+ set_workspace_context:
103
+ 'Switch the current workspace context for task, calendar, and finance tools',
104
+ update_my_settings: "Update the assistant's personality settings",
105
+ set_theme: 'Switch dark mode, light mode, or system theme',
106
+ render_ui:
107
+ 'Generate an interactive, actionable UI component or widget instead of plain text when it significantly improves user experience (e.g. for forms, dashboards, blog-like insight layouts, or data visualization).',
108
+ list_workspace_members: 'List all members of the workspace',
109
+ update_user_name: "Update the user's display name or full name",
110
+ set_immersive_mode: 'Enter or exit immersive fullscreen mode for the chat',
111
+ no_action_needed: 'Conversational message — no tool action required',
112
+ };
113
+
114
+ export const MIRA_TOOL_PERMISSIONS: Partial<
115
+ Record<MiraToolName, PermissionId | PermissionId[]>
116
+ > = {
117
+ create_task: 'manage_projects',
118
+ complete_task: 'manage_projects',
119
+ update_task: 'manage_projects',
120
+ delete_task: 'manage_projects',
121
+ create_board: 'manage_projects',
122
+ update_board: 'manage_projects',
123
+ delete_board: 'manage_projects',
124
+ create_task_list: 'manage_projects',
125
+ update_task_list: 'manage_projects',
126
+ delete_task_list: 'manage_projects',
127
+ create_task_label: 'manage_projects',
128
+ update_task_label: 'manage_projects',
129
+ delete_task_label: 'manage_projects',
130
+ add_task_labels: 'manage_projects',
131
+ remove_task_labels: 'manage_projects',
132
+ create_project: 'manage_projects',
133
+ update_project: 'manage_projects',
134
+ delete_project: 'manage_projects',
135
+ add_task_to_project: 'manage_projects',
136
+ remove_task_from_project: 'manage_projects',
137
+ add_task_assignee: 'manage_projects',
138
+ remove_task_assignee: 'manage_projects',
139
+ get_upcoming_events: 'manage_calendar',
140
+ create_event: 'manage_calendar',
141
+ update_event: 'manage_calendar',
142
+ delete_event: 'manage_calendar',
143
+ check_e2ee_status: 'manage_calendar',
144
+ enable_e2ee: 'manage_calendar',
145
+ log_transaction: 'manage_finance',
146
+ get_spending_summary: 'manage_finance',
147
+ list_wallets: 'manage_finance',
148
+ create_wallet: 'manage_finance',
149
+ update_wallet: 'manage_finance',
150
+ delete_wallet: 'manage_finance',
151
+ list_transactions: 'manage_finance',
152
+ get_transaction: 'manage_finance',
153
+ update_transaction: 'manage_finance',
154
+ delete_transaction: 'manage_finance',
155
+ list_transaction_categories: 'manage_finance',
156
+ create_transaction_category: 'manage_finance',
157
+ update_transaction_category: 'manage_finance',
158
+ delete_transaction_category: 'manage_finance',
159
+ list_transaction_tags: 'manage_finance',
160
+ create_transaction_tag: 'manage_finance',
161
+ update_transaction_tag: 'manage_finance',
162
+ delete_transaction_tag: 'manage_finance',
163
+ set_default_currency: 'manage_finance',
164
+ };
@@ -0,0 +1,95 @@
1
+ export const MIRA_TOOL_NAMES = [
2
+ 'select_tools',
3
+ 'get_my_tasks',
4
+ 'create_task',
5
+ 'complete_task',
6
+ 'update_task',
7
+ 'delete_task',
8
+ 'list_boards',
9
+ 'create_board',
10
+ 'update_board',
11
+ 'delete_board',
12
+ 'list_task_lists',
13
+ 'create_task_list',
14
+ 'update_task_list',
15
+ 'delete_task_list',
16
+ 'list_task_labels',
17
+ 'create_task_label',
18
+ 'update_task_label',
19
+ 'delete_task_label',
20
+ 'add_task_labels',
21
+ 'remove_task_labels',
22
+ 'list_projects',
23
+ 'create_project',
24
+ 'update_project',
25
+ 'delete_project',
26
+ 'add_task_to_project',
27
+ 'remove_task_from_project',
28
+ 'add_task_assignee',
29
+ 'remove_task_assignee',
30
+ 'get_upcoming_events',
31
+ 'create_event',
32
+ 'update_event',
33
+ 'delete_event',
34
+ 'check_e2ee_status',
35
+ 'enable_e2ee',
36
+ 'log_transaction',
37
+ 'get_spending_summary',
38
+ 'list_wallets',
39
+ 'create_wallet',
40
+ 'update_wallet',
41
+ 'delete_wallet',
42
+ 'list_transactions',
43
+ 'get_transaction',
44
+ 'update_transaction',
45
+ 'delete_transaction',
46
+ 'list_transaction_categories',
47
+ 'create_transaction_category',
48
+ 'update_transaction_category',
49
+ 'delete_transaction_category',
50
+ 'list_transaction_tags',
51
+ 'create_transaction_tag',
52
+ 'update_transaction_tag',
53
+ 'delete_transaction_tag',
54
+ 'set_default_currency',
55
+ 'start_timer',
56
+ 'stop_timer',
57
+ 'list_time_tracking_sessions',
58
+ 'list_time_tracking_categories',
59
+ 'create_time_tracking_category',
60
+ 'update_time_tracking_category',
61
+ 'delete_time_tracking_category',
62
+ 'get_time_tracking_session',
63
+ 'get_time_tracker_stats',
64
+ 'get_time_tracker_goals',
65
+ 'create_time_tracker_goal',
66
+ 'update_time_tracker_goal',
67
+ 'delete_time_tracker_goal',
68
+ 'create_time_tracking_entry',
69
+ 'update_time_tracking_session',
70
+ 'delete_time_tracking_session',
71
+ 'move_time_tracking_session',
72
+ 'remember',
73
+ 'recall',
74
+ 'list_memories',
75
+ 'delete_memory',
76
+ 'merge_memories',
77
+ 'create_image',
78
+ 'create_qr_code',
79
+ 'google_search',
80
+ 'run_parallel_checks',
81
+ 'convert_file_to_markdown',
82
+ 'list_accessible_workspaces',
83
+ 'get_workspace_context',
84
+ 'set_workspace_context',
85
+ 'update_my_settings',
86
+ 'set_theme',
87
+ 'render_ui',
88
+ 'list_workspace_members',
89
+ 'update_user_name',
90
+ 'set_immersive_mode',
91
+ 'no_action_needed',
92
+ ] as const;
93
+
94
+ export type MiraToolName = (typeof MIRA_TOOL_NAMES)[number];
95
+ export type DefinedMiraToolName = MiraToolName;
@@ -0,0 +1,54 @@
1
+ export function isRenderableRenderUiSpec(
2
+ value: Record<string, unknown> | undefined
3
+ ): boolean {
4
+ if (!value) return false;
5
+ if (typeof value.root !== 'string' || value.root.length === 0) return false;
6
+
7
+ const elements = value.elements;
8
+ if (!elements || typeof elements !== 'object' || Array.isArray(elements)) {
9
+ return false;
10
+ }
11
+
12
+ if (!(value.root in elements)) return false;
13
+
14
+ const rootElement = (elements as Record<string, unknown>)[value.root];
15
+ return (
16
+ !!rootElement &&
17
+ typeof rootElement === 'object' &&
18
+ !Array.isArray(rootElement)
19
+ );
20
+ }
21
+
22
+ export function buildRenderUiRecoverySpec(args: Record<string, unknown>) {
23
+ return buildRenderUiCalloutSpec(args, 'render_ui_recovery_root');
24
+ }
25
+
26
+ function buildRenderUiCalloutSpec(
27
+ args: Record<string, unknown>,
28
+ fallbackRoot: string
29
+ ) {
30
+ const requestedRoot =
31
+ typeof args.root === 'string' && args.root.trim().length > 0
32
+ ? args.root.trim()
33
+ : fallbackRoot;
34
+
35
+ return {
36
+ root: requestedRoot,
37
+ elements: {
38
+ [requestedRoot]: {
39
+ type: 'Callout',
40
+ props: {
41
+ title: 'UI unavailable',
42
+ variant: 'warning',
43
+ content:
44
+ 'Could not render the generated UI spec. Please retry this request.',
45
+ },
46
+ children: [],
47
+ },
48
+ },
49
+ };
50
+ }
51
+
52
+ export function buildRenderUiFailsafeSpec(args: Record<string, unknown>) {
53
+ return buildRenderUiCalloutSpec(args, 'render_ui_failsafe_root');
54
+ }
@@ -0,0 +1,17 @@
1
+ import type { TypedSupabaseClient } from '@tuturuuu/supabase/next/client';
2
+ import type { MiraWorkspaceContextState } from './workspace-context';
3
+
4
+ export interface MiraToolContext {
5
+ userId: string;
6
+ wsId: string;
7
+ creditWsId?: string;
8
+ workspaceContext?: MiraWorkspaceContextState;
9
+ chatId?: string;
10
+ supabase: TypedSupabaseClient;
11
+ timezone?: string;
12
+ canReadUserGroupStorage?: (input: {
13
+ groupId: string;
14
+ storagePath: string;
15
+ wsId: string;
16
+ }) => boolean | Promise<boolean>;
17
+ }