/** * Plain step names for Opengeni's own tools. * * Every built-in tool reads as an everyday step ("Searching the web" while it * runs, "Searched the web" once done) instead of its wire name * ("web_search_call"). Several tools share a step when a person would describe * them the same way. Hosts reword or translate a step through the catalog keys * `timeline.toolStep..running` and `timeline.toolStep..done`. * * A test keeps this map complete: adding a built-in tool without a step fails it. */ import type { OpenGeniText } from "../messages/runtime"; export const TOOL_STEP_IDS = [ "archiveDocument", "archiveNote", "askForHelp", "askYou", "changeModel", "checkAccounts", "checkChats", "checkDocuments", "checkModels", "checkNotes", "checkProgress", "checkProjects", "checkSchedules", "checkScreens", "checkSettings", "checkSite", "chooseChat", "completeGoal", "confirmUpdate", "coordinateWork", "createDocument", "createImage", "createSchedule", "createVideo", "deleteMessage", "deletePassword", "download", "editDocument", "editFile", "enableScreenControl", "exportDocument", "findComputers", "findGuides", "findPassword", "findTools", "listRepositories", "lookAtImage", "lookAtPage", "lookAtScreen", "manageChat", "manageSetup", "manageSignIns", "manageWorkspace", "messageAssistant", "nameChat", "noteProgress", "notify", "openBrowser", "openFile", "openScreen", "organizeProjects", "pauseGoal", "postSlack", "proposeUpdate", "readAccounting", "readGuide", "readPage", "readPosts", "readSlack", "recordBrowser", "removeComputer", "removeGuide", "replyToPost", "requestAccess", "restoreDocument", "resumeGoal", "runCode", "runCommand", "runSchedule", "saveGuide", "saveNote", "savePassword", "searchCode", "searchDocuments", "searchFiles", "searchWeb", "setGoal", "setUpComputer", "shareBrowser", "shareFile", "signIn", "startHelper", "switchComputer", "syncPosts", "tidyInbox", "updateAccounting", "updateInstructions", "updateSchedule", "updateSettings", "updateSite", "useBrowser", "useClipboard", "useComputer", "useScreen", "useTool", "wait", "withdrawNotification", "workInBrowser", "workInExcel", ] as const; export type ToolStepId = (typeof TOOL_STEP_IDS)[number]; /** Running reads as ongoing ("Searching the web"); done as finished ("Searched the web"). */ export type ToolStepPhase = "running" | "done"; /** Opengeni's own tools, by leaf name, and the step each one reads as. */ const BUILT_IN_TOOL_STEPS: Readonly> = { // Chats, goals and notifications set_session_title: "nameChat", set_other_session_title: "nameChat", notify_user: "notify", notification_withdraw: "withdrawNotification", inbox_tidy: "tidyInbox", goal_set: "setGoal", goal_update: "setGoal", goal_progress: "noteProgress", goal_complete: "completeGoal", goal_pause: "pauseGoal", goal_resume: "resumeGoal", wait_for_input: "wait", request_human_input: "askYou", interaction_request_human: "askForHelp", // Notes, knowledge and instructions knowledge_search: "checkNotes", knowledge_get: "checkNotes", knowledge_browse: "checkNotes", knowledge_source_fetch: "checkNotes", knowledge_source_read: "checkNotes", memory_search: "checkNotes", preference_registry_summary: "checkNotes", preference_registry_get: "checkNotes", task_notes_list: "checkNotes", instruction_policy_get: "checkNotes", knowledge_prepare_save: "saveNote", knowledge_save: "saveNote", knowledge_retain_file: "saveNote", knowledge_retain_message: "saveNote", knowledge_correct: "saveNote", memory_save: "saveNote", memory_correct: "saveNote", task_note_save: "saveNote", task_note_replace: "saveNote", task_note_promote_knowledge: "saveNote", task_note_promote_preference: "saveNote", task_note_promote_instruction_policy: "saveNote", remember: "saveNote", remember_confirm: "saveNote", knowledge_archive: "archiveNote", task_note_archive: "archiveNote", knowledge_propose: "proposeUpdate", instruction_policy_propose: "proposeUpdate", preference_propose: "proposeUpdate", company_profile_propose: "proposeUpdate", company_profile_confirm: "confirmUpdate", instruction_policy_save: "updateInstructions", work_claim_upsert: "coordinateWork", work_claim_release: "coordinateWork", // Guides (Skills) skill_read: "readGuide", repository_skill_read: "readGuide", skill_checkout: "readGuide", skill_search: "findGuides", skill_save: "saveGuide", skill_publish: "saveGuide", skill_install: "saveGuide", skill_remove: "removeGuide", // Computers sandboxes_list: "findComputers", sandbox_attach: "switchComputer", sandbox_swap: "switchComputer", run_on: "useComputer", sandbox_provision: "setUpComputer", connected_machine_enroll_token: "setUpComputer", connected_machine_remove: "removeComputer", connected_machine_enable_screen_control: "enableScreenControl", exec_command: "runCommand", write_stdin: "runCommand", local_shell_call: "runCommand", shell_call: "runCommand", code_interpreter_call: "runCode", apply_patch: "editFile", apply_patch_call: "editFile", view_image: "lookAtImage", code_search: "searchCode", file_search_call: "searchFiles", files_get_download_url: "openFile", // Screens and the browser interaction_discover: "checkScreens", computer_open: "openScreen", computer_targets: "lookAtScreen", computer_observe: "lookAtScreen", computer_screenshot: "lookAtScreen", computer_act: "useScreen", computer_call: "useScreen", computer_lifecycle: "useScreen", computer_clipboard: "useClipboard", browser_open: "openBrowser", browser_tabs: "useBrowser", browser_lifecycle: "useBrowser", browser_debug: "useBrowser", browser_observe: "readPage", browser_read: "readPage", browser_screenshot: "lookAtPage", browser_act: "workInBrowser", browser_clipboard: "useClipboard", browser_downloads: "download", browser_download_save: "download", browser_record: "recordBrowser", browser_auth: "signIn", browser_identity: "manageSignIns", browser_publish: "shareBrowser", excel_run: "workInExcel", // Projects, other chats and helpers project_list: "checkProjects", project_get: "checkProjects", project_create: "organizeProjects", project_update: "organizeProjects", project_reorder: "organizeProjects", project_delete: "organizeProjects", session_set_project: "organizeProjects", sessions_list: "checkChats", session_get: "checkChats", session_events: "checkChats", session_target_get: "checkChats", session_message_status: "checkChats", session_target_set: "chooseChat", session_wait: "wait", command_wait: "wait", command_read: "checkProgress", operation_read: "checkProgress", session_set_model: "changeModel", session_create: "startHelper", session_send_message: "messageAssistant", session_steer: "messageAssistant", session_human_input_respond: "messageAssistant", session_pause: "manageChat", session_resume: "manageChat", // Workspace administration and setup admin_actions_search: "manageWorkspace", admin_action_describe: "manageWorkspace", admin_action_call: "manageWorkspace", rig_list: "manageSetup", rig_get: "manageSetup", rig_propose_change: "manageSetup", rig_verify: "manageSetup", rig_promote: "manageSetup", list_models: "checkModels", get_video_generation_capabilities: "checkModels", // Passwords and settings secret_search: "findPassword", secret_get: "findPassword", secret_save: "savePassword", secret_move: "savePassword", secret_delete: "deletePassword", variable_set_list: "checkSettings", environment_list: "checkSettings", variable_set_get_variable: "checkSettings", variable_set_set_variable: "updateSettings", environment_set_variable: "updateSettings", // Tools and connections tool_search: "findTools", tool_list: "findTools", capability_catalog_search: "findTools", tool_invoke: "useTool", capability_authorization_request: "requestAccess", custom_mcp_setup_request: "requestAccess", github_connect_link: "requestAccess", github_repositories_list: "listRepositories", // Web, images and video web_search_call: "searchWeb", generate_image: "createImage", image_generation_call: "createImage", generate_video: "createVideo", // Social accounts social_connections_list: "checkAccounts", x_accounts_list: "checkAccounts", reddit_accounts_list: "checkAccounts", social_posts_recent: "readPosts", social_daily_analysis_context: "readPosts", social_search_live: "readPosts", social_mentions_live: "readPosts", social_thread_fetch: "readPosts", x_search_live: "readPosts", x_mentions_live: "readPosts", x_thread_fetch: "readPosts", reddit_search_live: "readPosts", reddit_mentions_live: "readPosts", reddit_thread_fetch: "readPosts", social_posts_sync: "syncPosts", x_posts_sync: "syncPosts", reddit_posts_sync: "syncPosts", social_post_reply: "replyToPost", x_post_reply: "replyToPost", reddit_post_reply: "replyToPost", // Scheduled tasks scheduled_tasks_list: "checkSchedules", scheduled_tasks_get: "checkSchedules", scheduled_task_runs_list: "checkSchedules", scheduled_tasks_create: "createSchedule", scheduled_tasks_update: "updateSchedule", scheduled_tasks_pause: "updateSchedule", scheduled_tasks_resume: "updateSchedule", scheduled_tasks_delete: "updateSchedule", scheduled_tasks_trigger: "runSchedule", // Slack slack_bot_list_channels: "readSlack", slack_bot_search: "readSlack", slack_bot_channel_history: "readSlack", slack_bot_thread_replies: "readSlack", slack_bot_list_users: "readSlack", slack_bot_list_files: "readSlack", slack_bot_file_info: "readSlack", slack_bot_file_content: "readSlack", slack_bot_upload_file: "postSlack", slack_bot_post_message: "postSlack", slack_bot_prepare_message: "postSlack", slack_bot_send_prepared_message: "postSlack", slack_bot_delete_message: "deleteMessage", // Accounting fiken_companies_list: "readAccounting", fiken_contacts_list: "readAccounting", fiken_products_list: "readAccounting", fiken_invoices_list: "readAccounting", fiken_invoice_get: "readAccounting", fiken_bank_accounts_list: "readAccounting", fiken_purchases_list: "readAccounting", fiken_sales_list: "readAccounting", fiken_contact_create: "updateAccounting", fiken_invoice_draft_create: "updateAccounting", // Documents, files and Sites search_documents: "searchDocuments", list_document_bases: "checkDocuments", memory_propose: "proposeUpdate", atlassian_sources_list: "searchDocuments", atlassian_search: "searchDocuments", atlassian_get: "searchDocuments", artifacts_list: "checkDocuments", artifacts_get_source: "checkDocuments", editable_artifact_list: "checkDocuments", editable_artifact_get: "checkDocuments", editable_artifact_inspect: "checkDocuments", editable_artifact_export_status: "checkDocuments", artifacts_prepare_upload: "createDocument", artifacts_create: "createDocument", editable_artifact_create: "createDocument", editable_artifact_import: "createDocument", editable_artifact_apply: "editDocument", editable_artifact_export: "exportDocument", artifacts_publish: "shareFile", sandbox_file_publish: "shareFile", artifacts_rollback: "restoreDocument", artifacts_restore: "restoreDocument", artifacts_archive: "archiveDocument", site_data_describe: "checkSite", site_data_query: "checkSite", site_data_export: "checkSite", site_files_list: "checkSite", site_publication_get: "checkSite", site_hostname_check: "checkSite", site_sql_inspect: "checkSite", site_sql_query: "checkSite", site_sql_export: "checkSite", site_data_define_collection: "updateSite", site_data_write: "updateSite", site_data_import: "updateSite", site_data_reset: "updateSite", site_files_upload: "updateSite", site_files_delete: "updateSite", site_publication_update: "updateSite", site_publication_apply_fix: "updateSite", site_sql_enable: "updateSite", site_sql_migrate: "updateSite", site_sql_define_query: "updateSite", site_sql_run: "updateSite", site_sql_execute: "updateSite", site_sql_import: "updateSite", site_sql_reset: "updateSite", }; /** Every tool leaf name that has a built-in step (for completeness checks). */ export const BUILT_IN_TOOL_STEP_NAMES: readonly string[] = Object.keys(BUILT_IN_TOOL_STEPS); /** The plain step a built-in tool reads as, by leaf name; null for any other tool. */ export function builtInToolStep(leaf: string): ToolStepId | null { return Object.hasOwn(BUILT_IN_TOOL_STEPS, leaf) ? BUILT_IN_TOOL_STEPS[leaf]! : null; } /** A step's words in the host's catalog: running ("Searching the web") or done ("Searched the web"). */ export function toolStepLabel(t: OpenGeniText, step: ToolStepId, phase: ToolStepPhase): string { return t(`timeline.toolStep.${step}.${phase}`); } /** * The phase a call's status reads in: only a call that finished reads as done. * A running, failed or interrupted call keeps the ongoing form, so its chip * ("Failed", "Interrupted") finishes the sentence. */ export function toolStepPhase(status: string | undefined): ToolStepPhase { return status === "complete" ? "done" : "running"; } /** The plain step name for a built-in tool, by leaf name; null for any other tool. */ export function builtInToolStepLabel( t: OpenGeniText, leaf: string, phase: ToolStepPhase, ): string | null { const step = builtInToolStep(leaf); return step ? toolStepLabel(t, step, phase) : null; }