feat(mcp): WhatsApp connector, archivable catalog, MCP connector config endpoint

This commit is contained in:
2026-07-19 10:55:44 +01:00
parent ffea3f41f9
commit f85876350e
23 changed files with 1324 additions and 3614 deletions
+53 -22
View File
@@ -153,6 +153,22 @@ export default {
'config.loading': 'Loading…',
'config.developer': 'Developer',
'config.error_save':'Error saving "{name}": {msg}',
'config.enabled': 'Enabled',
'config.disabled': 'Disabled',
'config.set.interface.name': 'Interface',
'config.set.interface.desc': 'Look and feel of the web interface.',
'config.set.tic_agent.name': 'TIC Agent',
'config.set.tic_agent.desc': 'TIC is a background agent that monitors all async events generated by connected MCP servers (new emails, calendar updates, WhatsApp messages, etc.). It reads your notification rules from data/notifications.md and your memory to decide — via an LLM call — which events are worth surfacing. Relevant notifications are forwarded to the home agent set via /sethome.',
'config.prop.ui_locale.name': 'Language',
'config.prop.ui_locale.desc': 'Default interface language for the whole instance. Each user can override it on their profile.',
'config.prop.tic__enabled.name': 'Enabled',
'config.prop.tic__enabled.desc': 'Enable or disable the TIC agent. When disabled, no MCP events are processed.',
'config.prop.tic__security_group.name': 'Security Group',
'config.prop.tic__security_group.desc': 'Tool permission group applied to each TIC agent session. Leave empty to use the default group.',
'config.prop.tic__interval_minutes.name': 'Check Interval (minutes)',
'config.prop.tic__interval_minutes.desc': 'How often TIC runs, in minutes. Leave empty to use the value from config.yml (tic.interval_secs).',
// ── Projects ────────────────────────────────────────────────────────────────
'projects.title': 'Projects',
@@ -799,6 +815,16 @@ export default {
'connectors.detail.oauth.cancel': 'Cancel',
'connectors.detail.oauth.deactivate': 'Deactivate',
'connectors.detail.qr.title': 'Link your phone',
'connectors.detail.qr.desc': 'Scan a QR code with your phone to link this device. The session stays on this box — no password is stored.',
'connectors.detail.qr.connected': 'Connected and active.',
'connectors.detail.qr.scan': 'Scan this code with your phone:',
'connectors.detail.qr.hint': 'WhatsApp → Settings → Linked Devices → Link a Device.',
'connectors.detail.qr.connecting': 'Connecting…',
'connectors.detail.qr.btn_start': 'Start sign-in',
'connectors.detail.qr.btn_starting': 'Preparing… (this can take a minute the first time)',
'connectors.detail.qr.btn_relink': 'Re-link (new QR)',
'connectors.detail.test.running': 'Testing credentials…',
'connectors.detail.test.skipped': 'No verification step for this connector.',
'connectors.detail.test.ok_label': 'OK',
@@ -891,6 +917,9 @@ export default {
'marketplace.grid.no_match': 'No connector matches these filters.',
'marketplace.card.installed': 'installed',
'marketplace.card.update_available': 'update available',
'marketplace.card.installed_version': 'installed v{v}',
'marketplace.card.update': 'Update',
'marketplace.card.scope_global': 'global',
'marketplace.card.scope_per_user': 'per-user',
'marketplace.card.type_script': 'local script',
@@ -986,28 +1015,29 @@ export default {
'catalog.action.remove': 'Remove from catalog',
'catalog.modal.title': 'Add connector manually',
'catalog.modal.script_warn': '<i class="bi bi-exclamation-triangle me-1"></i>A local script runs code on this box. Nothing verifies it — unlike the marketplace path, there is no digest to check.',
'catalog.modal.name': 'Name',
'catalog.modal.name_hint': 'slug',
'catalog.modal.scope': 'Scope',
'catalog.modal.type': 'Type',
'catalog.modal.transport': 'Transport',
'catalog.modal.command': 'Command',
'catalog.modal.command_ph': 'python3',
'catalog.modal.script_path': 'Script path',
'catalog.modal.script_path_hint': 'as <connector>/<file>, under ./connectors',
'catalog.modal.url': 'URL',
'catalog.modal.args': 'Args',
'catalog.modal.args_hint': 'one per line',
'catalog.modal.config_schema': 'Required secret/env keys',
'catalog.modal.config_schema_hint': 'comma/newline',
'catalog.modal.auth': 'Auth',
'catalog.modal.friendly': 'Friendly name',
'catalog.modal.desc': 'Description',
'catalog.modal.desc_hint': 'the LLM reads this when deciding to activate the connector',
'catalog.modal.cancel': 'Cancel',
'catalog.modal.save': 'Add to catalog',
'catalog.new.back': 'Back',
'catalog.new.title': 'Add connector manually',
'catalog.new.script_warn': '<i class="bi bi-exclamation-triangle me-1"></i>A local script runs code on this box. Nothing verifies it — unlike the marketplace path, there is no digest to check.',
'catalog.new.name': 'Name',
'catalog.new.name_hint': 'slug',
'catalog.new.scope': 'Scope',
'catalog.new.type': 'Type',
'catalog.new.transport': 'Transport',
'catalog.new.command': 'Command',
'catalog.new.command_ph': 'python3',
'catalog.new.script_path': 'Script path',
'catalog.new.script_path_hint': 'as <connector>/<file>, under ./connectors',
'catalog.new.url': 'URL',
'catalog.new.args': 'Args',
'catalog.new.args_hint': 'one per line',
'catalog.new.config_schema': 'Required secret/env keys',
'catalog.new.config_schema_hint': 'comma/newline',
'catalog.new.auth': 'Auth',
'catalog.new.friendly': 'Friendly name',
'catalog.new.desc': 'Description',
'catalog.new.desc_hint': 'the LLM reads this when deciding to activate the connector',
'catalog.new.cancel': 'Cancel',
'catalog.new.save': 'Add to catalog',
'catalog.error.name': 'Name is required.',
'catalog.confirm.delete': 'Remove "{name}" from the catalog?\n\nAnything already activated from it keeps running.',
@@ -1039,6 +1069,7 @@ export default {
'common.saving': 'Saving…',
'common.cancel': 'Cancel',
'common.loading': 'Loading…',
'common.saved': 'Saved',
// ── Shared Folders (blueprint §6) ────────────────────────────────────────────
'nav.shared_folders': 'Shared Folders',