diff --git a/CHATGPT-SETUP.md b/CHATGPT-SETUP.md index ec7fbd6..6b1ed65 100644 --- a/CHATGPT-SETUP.md +++ b/CHATGPT-SETUP.md @@ -46,6 +46,13 @@ The expected flow is: 3. The selected widget renders a register, can call the matching detail tool for one selected row and exposes controlled write actions when declared by the render metadata. +4. For controller requests, use the explicit controller data→render pair: + `shd_get_controller_source_inventory` → `shd_render_controller_devices_widget`, + `shd_get_home_live_state` → `shd_render_controller_live_state_widget`, + `shd_get_controller_source_history` → `shd_render_controller_history_widget`, + or `shd_get_controller_state_statistics` → + `shd_render_controller_statistics_widget`. Pass the complete data result and + preserve `project`, `controller` and `item_id` in `meta.sourceArgs`. The widget resources are versioned at `ui://shd/active-projects/v1.html`, `ui://shd/documents/v1.html`, `ui://shd/tasks/v1.html`, @@ -53,6 +60,7 @@ The widget resources are versioned at `ui://shd/active-projects/v1.html`, `ui://shd/discussions/v1.html`, `ui://shd/notifications/v1.html`, `ui://shd/scheduling/v1.html`, `ui://shd/inventory/v1.html`, `ui://shd/agents/v1.html`, `ui://shd/status-page/v1.html`, +`ui://shd/controller-observability/v1.html`, `ui://shd/project-db/v1.html`, `ui://shd/notes/v1.html`, `ui://shd/project-overview/v1.html`, `ui://shd/files/v1.html`, `ui://shd/proposals/v1.html`, `ui://shd/terms/v1.html`, diff --git a/README.md b/README.md index 02899f3..adf82b3 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,15 @@ Finance, CRM, Discussions, Notifications, Scheduling, Inventory, Agents, Status Page, Project DB, Notes, Project overview, Files, Proposals, Terms, Activity, Organizations and access, Gitea Issues and Schemes: -Controller observability uses one parameterized resource for source history, -cross-controller comparisons, expert settings, complete project topology, -telemetry health and source audit: +Controller observability uses one parameterized resource for device inventory, +current state, server-computed statistics, source history, cross-controller +comparisons, expert settings, complete project topology, telemetry health and +source audit: - `shd_render_controller_history_widget` → `ui://shd/controller-observability/v1.html`; +- `shd_render_controller_statistics_widget` → `ui://shd/controller-observability/v1.html`; +- `shd_render_controller_devices_widget` → `ui://shd/controller-observability/v1.html`; +- `shd_render_controller_live_state_widget` → `ui://shd/controller-observability/v1.html`; - `shd_render_controller_compare_widget` → `ui://shd/controller-observability/v1.html`; - `shd_render_controller_settings_widget` → `ui://shd/controller-observability/v1.html`; - `shd_render_controller_topology_widget` → `ui://shd/controller-observability/v1.html`; diff --git a/plugins/shd-mcp-plugin/README.md b/plugins/shd-mcp-plugin/README.md index 7af8638..8bcd77b 100644 --- a/plugins/shd-mcp-plugin/README.md +++ b/plugins/shd-mcp-plugin/README.md @@ -33,7 +33,7 @@ modules. Skills do not grant permissions or bypass server-side ACLs. - linked Gitea issues, labels, comments and attachments; - safe bulk-change planning and validation rules. -When the connected MCP host supports MCP Apps UI, the 42 SHD render tools have +When the connected MCP host supports MCP Apps UI, the 44 SHD render tools have inline interactive widgets: active projects, module registers and specialized Kanban, workload, timeline, funnel, dashboard, calendar, matrix, tree and Project DB views. Each widget sorts or filters normalized records, shows @@ -46,19 +46,31 @@ The same tools still return normal structured data for hosts that do not render widgets. The controller observability render tools share the versioned -`widgets/controller-observability/v1/` resource. It exposes explicit native vs -Influx/Grafana provenance, universal comparison presets, complete controller -topology, telemetry health and operation audit. Expert-setting controls are enabled only -for source-provided writable descriptors. +`widgets/controller-observability/v1/` resource. It exposes controller device +inventory and profiles, normalized live states, server-computed binary/numeric +statistics, explicit native vs Influx/Grafana provenance, universal comparison +presets, complete controller topology, telemetry health and operation audit. +Expert-setting controls are enabled only for source-provided writable descriptors. The active-projects widget is versioned in `widgets/active-projects/v1/` with a manifest, SHA256 checksum and source/provenance note. The SHD MCP backend reads that artifact for the `ui://shd/active-projects/v1.html` resource. -The other versioned resources are stored under `widgets/` with a manifest, -SHA256 checksum and source/provenance note for each resource. Their render -tools are deliberately separate from the list tools so the server can keep -data access and UI rendering auditable. +The standard module resources are generated from the single +`widgets/_shared/universal-widget.html` source by +`scripts/generate-widget-artifacts.mjs`. Each generated artifact still keeps +its own URI, manifest, SHA256 checksum and provenance note: this preserves +resource cache keys and module-scope registration while removing duplicated +HTML, bridge and action runtime code. The generator supports `--check` for a +no-write consistency check. Module copy and fallback tool configuration lives +in the sibling `widgets/_shared/universal-widget-config.json` source and is +injected into each standalone artifact by the generator. For an older template +that still contains the inline configuration block, run `--extract-config` +once and then `--migrate-template` once. The +active-projects and controller-observability resources remain separate because +they are specialized applications with different interaction contracts. Render +tools are deliberately separate from list tools so data access and UI rendering +remain auditable. ## MCP connection diff --git a/plugins/shd-mcp-plugin/skills/shd-agents-operations/SKILL.md b/plugins/shd-mcp-plugin/skills/shd-agents-operations/SKILL.md index 6937ae6..869fd0b 100644 --- a/plugins/shd-mcp-plugin/skills/shd-agents-operations/SKILL.md +++ b/plugins/shd-mcp-plugin/skills/shd-agents-operations/SKILL.md @@ -17,6 +17,23 @@ configuration. - Keep diagnostics, configuration, endpoint publication and network routing as separate operations. Never expose credentials, private keys or tunnel data. +## Controller data and widgets + +- For a controller device list, call `shd_get_controller_source_inventory`, then + `shd_render_controller_devices_widget` with the complete result and scoped + `meta.sourceArgs`. +- For current states across controllers, call `shd_get_home_live_state`, then + `shd_render_controller_live_state_widget`. +- For one presence, binary state or numeric sensor statistics, call + `shd_get_controller_state_statistics`, then + `shd_render_controller_statistics_widget`. The server result is authoritative + for counts, intervals, durations, percentages, medians and hourly buckets; + do not calculate them from raw history in the model. +- For raw time-series history, call `shd_get_controller_source_history`, then + `shd_render_controller_history_widget`. Keep the detailed rows in the widget + after a successful render and use plain text only when the UI call is + unavailable or fails. + ## High-impact actions Creating/closing tunnels, publishing or revoking endpoints, replacing access diff --git a/plugins/shd-mcp-plugin/skills/shd-routing/SKILL.md b/plugins/shd-mcp-plugin/skills/shd-routing/SKILL.md index f5687f7..34f3a32 100644 --- a/plugins/shd-mcp-plugin/skills/shd-routing/SKILL.md +++ b/plugins/shd-mcp-plugin/skills/shd-routing/SKILL.md @@ -24,6 +24,7 @@ readback. Do not invent fields, statuses, identifiers, routes or capabilities. - Notifications, preferences or read state: use Notifications tools and the `shd-notifications` workflow. - Inventory, stock, assets, procurement or stocktakes: use Inventory tools and the `shd-inventory` workflow. - Agents, controllers, diagnostics, tunnels or network access: use Agents tools and the `shd-agents-operations` workflow. +- Controller devices, current states, presence/history or sensor statistics: use the controller-integrations source tools; in a UI-capable host call the matching controller render tool after the data tool and before the final response (`shd_render_controller_devices_widget`, `shd_render_controller_live_state_widget`, `shd_render_controller_history_widget` or `shd_render_controller_statistics_widget`). - Status-page monitors, history, groups or incidents: use Status Page tools and the `shd-status-page` workflow. - Realtime sessions, event cursors or historical activity: use Realtime tools and the `shd-realtime-activity` workflow. - Terms documents, revisions, completeness or contract discussions: use Terms tools and the `shd-terms-contracts` workflow. diff --git a/plugins/shd-mcp-plugin/widgets/_shared/universal-widget-config.json b/plugins/shd-mcp-plugin/widgets/_shared/universal-widget-config.json new file mode 100644 index 0000000..c7ffeb4 --- /dev/null +++ b/plugins/shd-mcp-plugin/widgets/_shared/universal-widget-config.json @@ -0,0 +1,1099 @@ +{ + "version": 1, + "engine": "shd-universal-v1", + "copy": { + "discussions": { + "ru": [ + "Обсуждения", + "Темы обсуждений с поиском и просмотром сообщений.", + "Тема", + "Обновлено", + "Сообщение" + ], + "en": [ + "Discussions", + "Discussion topics with search and message details.", + "Topic", + "Updated", + "Message" + ] + }, + "notifications": { + "ru": [ + "Уведомления", + "Последние уведомления и события модулей.", + "Уведомление", + "Время", + "Источник" + ], + "en": [ + "Notifications", + "Recent notifications and module events.", + "Notification", + "Time", + "Source" + ] + }, + "scheduling": { + "ru": [ + "Расписание", + "Ближайшие события и записи из расписания.", + "Событие", + "Начало", + "Участник" + ], + "en": [ + "Scheduling", + "Upcoming events and bookings from scheduling.", + "Event", + "Starts", + "Guest" + ] + }, + "inventory": { + "ru": [ + "Склад", + "Складские позиции, остатки и статусы.", + "Позиция", + "Обновлено", + "Количество" + ], + "en": [ + "Inventory", + "Stock items, quantities and statuses.", + "Item", + "Updated", + "Quantity" + ] + }, + "agents": { + "ru": [ + "Агенты и контроллеры", + "Доступные агенты, контроллеры и их текущее состояние.", + "Агент или контроллер", + "Проверено", + "Тип" + ], + "en": [ + "Agents & Controllers", + "Available agents, controllers and their current state.", + "Agent or controller", + "Checked", + "Type" + ] + }, + "status-page": { + "ru": [ + "Status Page", + "Состояние доступности сервисов и мониторов.", + "Монитор", + "Проверено", + "Доступность" + ], + "en": [ + "Status Page", + "Service availability and monitor state.", + "Monitor", + "Checked", + "Availability" + ] + }, + "airbase": { + "ru": [ + "AirBase", + "Каталог таблиц AirBase с просмотром схемы.", + "Таблица", + "Обновлено", + "Записей" + ], + "en": [ + "AirBase", + "AirBase table catalog with schema details.", + "Table", + "Updated", + "Records" + ] + }, + "notes": { + "ru": [ + "Заметки", + "Страницы Notes с поиском и просмотром содержимого.", + "Страница", + "Обновлено", + "Пространство" + ], + "en": [ + "Notes", + "Notes pages with search and content details.", + "Page", + "Updated", + "Space" + ] + }, + "project-overview": { + "ru": [ + "Обзор проекта", + "Сводные данные по разделам выбранного проекта.", + "Раздел", + "Обновлено", + "Элементы" + ], + "en": [ + "Project overview", + "Cross-module records for the selected project.", + "Section", + "Updated", + "Items" + ] + }, + "files": { + "ru": [ + "Файлы", + "Файлы выбранного проекта с поиском и безопасным просмотром ссылок.", + "Файл", + "Обновлено", + "Размер или тип" + ], + "en": [ + "Files", + "Files from the selected project with search and safe links.", + "File", + "Updated", + "Size or type" + ] + }, + "proposals": { + "ru": [ + "Предложения", + "Предложения и сметы с поиском, статусами и деталями.", + "Предложение", + "Обновлено", + "Сумма или номер" + ], + "en": [ + "Proposals", + "Proposals with search, statuses and details.", + "Proposal", + "Updated", + "Amount or number" + ] + }, + "terms": { + "ru": [ + "Terms / ТЗ", + "Документы технического задания и их ревизии.", + "Документ", + "Обновлено", + "Страницы или ревизия" + ], + "en": [ + "Terms documents", + "Terms of Reference documents and revisions.", + "Document", + "Updated", + "Pages or revision" + ] + }, + "activity": { + "ru": [ + "Активность", + "Авторизованные realtime-события SHD по выбранному scope.", + "Событие", + "Время", + "Модуль или тип" + ], + "en": [ + "Activity", + "Authenticated SHD realtime events for the selected scope.", + "Event", + "Time", + "Module or type" + ] + }, + "organizations": { + "ru": [ + "Организации и доступ", + "Организации, роли и безопасный просмотр участников.", + "Организация", + "Обновлено", + "Роль или тип" + ], + "en": [ + "Organizations & access", + "Organizations, roles and safe membership details.", + "Organization", + "Updated", + "Role or type" + ] + }, + "gitea": { + "ru": [ + "Gitea Issues", + "Открытые задачи разрешённого site или project репозитория.", + "Issue", + "Обновлено", + "Состояние" + ], + "en": [ + "Gitea Issues", + "Open issues for an allowed site or project repository.", + "Issue", + "Updated", + "State" + ] + }, + "schemes": { + "ru": [ + "Схемы", + "Документы PDF Scheme Editor и их текущее состояние.", + "Схема", + "Обновлено", + "Ревизия или страницы" + ], + "en": [ + "Schemes", + "PDF Scheme Editor documents and their current state.", + "Scheme", + "Updated", + "Revision or pages" + ] + }, + "task-kanban": { + "ru": [ + "Задачи Kanban", + "Задачи по колонкам статусов с поиском и деталями.", + "Задача", + "Срок", + "Исполнитель" + ], + "en": [ + "Task Kanban", + "Tasks grouped by workflow status with search and details.", + "Task", + "Due", + "Assignee" + ] + }, + "team-workload": { + "ru": [ + "Загрузка команды", + "Плановая нагрузка, ёмкость и утилизация команды.", + "Участник", + "Период", + "Часы или процент" + ], + "en": [ + "Team workload", + "Planned workload, capacity and team utilization.", + "Member", + "Period", + "Hours or percent" + ] + }, + "project-timeline": { + "ru": [ + "Timeline проекта", + "Задачи проекта на временной ленте.", + "Задача", + "Срок", + "Статус" + ], + "en": [ + "Project timeline", + "Project tasks on a chronological timeline.", + "Task", + "Due", + "Status" + ] + }, + "crm-funnel": { + "ru": [ + "CRM-воронка", + "Сделки CRM, сгруппированные по стадиям.", + "Стадия", + "Сделки", + "Сумма" + ], + "en": [ + "CRM funnel", + "CRM deals grouped by pipeline stage.", + "Stage", + "Deals", + "Amount" + ] + }, + "finance-dashboard": { + "ru": [ + "Финансовый дашборд", + "Суммы, статусы и документы финансового модуля.", + "Документ", + "Обновлено", + "Сумма" + ], + "en": [ + "Finance dashboard", + "Finance amounts, statuses and documents.", + "Document", + "Updated", + "Amount" + ] + }, + "proposal-approvals": { + "ru": [ + "Согласования предложений", + "Очередь предложений и текущие approval-статусы.", + "Предложение", + "Обновлено", + "Approval" + ], + "en": [ + "Proposal approvals", + "Proposal queue and current approval states.", + "Proposal", + "Updated", + "Approval" + ] + }, + "documents-completeness": { + "ru": [ + "Полнота документов", + "Score, ревизии и состояние Terms-документов.", + "Документ", + "Обновлено", + "Полнота" + ], + "en": [ + "Documents completeness", + "Scores, revisions and Terms document state.", + "Document", + "Updated", + "Completeness" + ] + }, + "agents-health": { + "ru": [ + "Здоровье агентов", + "Состояние агентов и контроллеров.", + "Агент или контроллер", + "Проверено", + "Health" + ], + "en": [ + "Agents health", + "Agent and controller health state.", + "Agent or controller", + "Checked", + "Health" + ] + }, + "schedule-calendar": { + "ru": [ + "Календарь расписания", + "Ближайшие записи, сгруппированные по дням.", + "Событие", + "День", + "Участник" + ], + "en": [ + "Schedule calendar", + "Upcoming bookings grouped by day.", + "Event", + "Day", + "Guest" + ] + }, + "acl-matrix": { + "ru": [ + "ACL-матрица", + "Участники организации, роли и permissions.", + "Участник", + "Роль", + "Права" + ], + "en": [ + "ACL matrix", + "Organization members, roles and permissions.", + "Member", + "Role", + "Permissions" + ] + }, + "inventory-warnings": { + "ru": [ + "Предупреждения склада", + "Низкие остатки и критические складские позиции.", + "Позиция", + "Обновлено", + "Остаток" + ], + "en": [ + "Inventory warnings", + "Low-stock and critical inventory items.", + "Item", + "Updated", + "Stock" + ] + }, + "gitea-board": { + "ru": [ + "Gitea-доска", + "Issues по состояниям разрешённого репозитория.", + "Issue", + "Состояние", + "Ссылка" + ], + "en": [ + "Gitea board", + "Issues grouped by state for an allowed repository.", + "Issue", + "State", + "Link" + ] + }, + "schemes-progress": { + "ru": [ + "Прогресс схем", + "Документы схем, ревизии, страницы и completeness.", + "Схема", + "Обновлено", + "Прогресс" + ], + "en": [ + "Schemes progress", + "Scheme documents, revisions, pages and completeness.", + "Scheme", + "Updated", + "Progress" + ] + }, + "notes-tree": { + "ru": [ + "Дерево Notes", + "Пространства Notes и их иерархия.", + "Узел", + "Обновлено", + "Тип" + ], + "en": [ + "Notes tree", + "Notes spaces and their hierarchy.", + "Node", + "Updated", + "Type" + ] + }, + "airbase-preview": { + "ru": [ + "AirBase preview", + "Предпросмотр записей выбранной таблицы AirBase.", + "Запись", + "Обновлено", + "Поля" + ], + "en": [ + "AirBase preview", + "Preview of records from the selected AirBase table.", + "Record", + "Updated", + "Fields" + ] + }, + "documents": { + "ru": [ + "Документы", + "Реестр документов с поиском и просмотром деталей.", + "Документ", + "Обновлено", + "Сумма" + ], + "en": [ + "Documents", + "Document register with search and details.", + "Document", + "Updated", + "Amount" + ] + }, + "tasks": { + "ru": [ + "Задачи", + "Реестр задач с поиском и просмотром деталей.", + "Задача", + "Срок", + "Приоритет" + ], + "en": [ + "Tasks", + "Task register with search and details.", + "Task", + "Due date", + "Priority" + ] + }, + "finance": { + "ru": [ + "Финансы", + "Реестр финансовых документов с поиском и просмотром деталей.", + "Документ", + "Срок", + "Сумма" + ], + "en": [ + "Finance", + "Finance document register with search and details.", + "Document", + "Due date", + "Amount" + ] + }, + "crm": { + "ru": [ + "CRM", + "Реестр CRM-сущностей с поиском и просмотром деталей.", + "Сущность", + "Обновлено", + "Стадия" + ], + "en": [ + "CRM", + "CRM entity register with search and details.", + "Entity", + "Updated", + "Stage" + ] + }, + "pdf-scheme-editor": { + "ru": [ + "PDF Scheme Editor", + "Документы схем и их текущее состояние.", + "Документ", + "Обновлено", + "Ревизия или страницы" + ], + "en": [ + "PDF Scheme Editor", + "Scheme documents and their current state.", + "Document", + "Updated", + "Revision or pages" + ] + } + }, + "defaults": { + "discussions": { + "listTool": "shd_list_discussion_topics", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_list_discussion_messages", + "detailKey": "topic_id", + "detailArgs": { + "limit": 50 + }, + "paths": [ + "data" + ], + "sort": "desc" + }, + "notifications": { + "listTool": "shd_list_notifications", + "listArgs": { + "limit": 50, + "offset": 0 + }, + "paths": [ + "data" + ], + "sort": "desc" + }, + "scheduling": { + "listTool": "shd_get_scheduling_overview", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_list_scheduling_bookings", + "detailKey": "booking_id", + "detailArgs": { + "limit": 1 + }, + "paths": [ + "data.bookings", + "data.upcoming_bookings", + "data" + ], + "sort": "asc" + }, + "inventory": { + "listTool": "shd_list_inventory_items", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_inventory_item", + "detailKey": "item_id", + "paths": [ + "data" + ], + "sort": "desc" + }, + "agents": { + "listTool": "shd_agents_overview", + "listArgs": {}, + "paths": [ + "data.agents", + "data.user_agents", + "data" + ], + "sort": "asc" + }, + "status-page": { + "listTool": "shd_get_status_page_monitors", + "listArgs": { + "environment": "dev" + }, + "readTool": "shd_get_status_page_monitor_history", + "detailKey": "monitor_id", + "detailArgs": { + "limit": 20 + }, + "paths": [ + "data" + ], + "nested": "monitors", + "sort": "asc" + }, + "airbase": { + "listTool": "shd_airbase_tables", + "listArgs": {}, + "readTool": "shd_airbase_schema", + "detailKey": "table", + "paths": [ + "data.tables", + "data" + ], + "contextRequired": true, + "sort": "asc" + }, + "notes": { + "listTool": "shd_list_note_pages", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_note_page", + "detailKey": "page_id", + "paths": [ + "data" + ], + "sort": "desc" + }, + "project-overview": { + "listTool": "shd_get_project_context", + "listArgs": { + "include": [ + "summary", + "tasks", + "discussions", + "documents", + "finance", + "terms", + "agents" + ], + "limit_per_section": 100 + }, + "paths": [ + "data.sections.tasks", + "data.sections.discussions", + "data.sections.documents", + "data.sections.finance", + "data.sections.terms" + ], + "combinePaths": true, + "contextRequired": true, + "sort": "desc" + }, + "files": { + "listTool": "shd_list_files", + "readTool": "shd_get_file_link", + "detailKey": "path", + "detailArgs": { + "download": false + }, + "detailSourceArgs": [ + "project_code" + ], + "paths": [ + "data" + ], + "contextRequired": true, + "sort": "desc" + }, + "proposals": { + "listTool": "shd_list_proposals", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_proposal", + "detailKey": "proposal_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "sort": "desc" + }, + "terms": { + "listTool": "shd_list_terms_documents", + "readTool": "shd_get_terms_document", + "detailKey": "document_id", + "detailSourceArgs": [ + "project_code" + ], + "paths": [ + "data" + ], + "contextRequired": true, + "sort": "desc" + }, + "activity": { + "listTool": "shd_get_realtime_events", + "listArgs": { + "module": "notifications", + "limit": 100 + }, + "paths": [ + "data.events", + "events", + "data" + ], + "sort": "desc" + }, + "organizations": { + "listTool": "shd_admin_list_organizations", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_admin_get_organization_members", + "detailKey": "organization_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "sort": "asc" + }, + "gitea": { + "listTool": "shd_list_gitea_issues", + "listArgs": { + "target": "site", + "limit": 100 + }, + "paths": [ + "data" + ], + "sort": "desc" + }, + "schemes": { + "listTool": "shd_list_pdf_scheme_editor_documents", + "readTool": "shd_get_pdf_scheme_editor_document", + "detailKey": "document", + "detailSourceArgs": [ + "project" + ], + "paths": [ + "data" + ], + "contextRequired": true, + "sort": "desc" + }, + "task-kanban": { + "listTool": "shd_list_tasks", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_task", + "detailKey": "task_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "view": "kanban", + "groupBy": "status", + "sort": "asc" + }, + "team-workload": { + "listTool": "shd_get_task_workload", + "listArgs": { + "period": "month" + }, + "paths": [ + "data.rows", + "data.workload", + "data.assignees", + "data" + ], + "view": "workload", + "sort": "desc" + }, + "project-timeline": { + "listTool": "shd_list_tasks", + "listArgs": { + "limit": 100 + }, + "paths": [ + "data" + ], + "view": "timeline", + "sort": "asc" + }, + "crm-funnel": { + "listTool": "shd_list_crm", + "listArgs": { + "section": "deals", + "limit": 100 + }, + "readTool": "shd_get_crm_entity", + "detailKey": "entity_id", + "detailSourceArgs": [ + "section" + ], + "paths": [ + "data" + ], + "view": "funnel", + "groupBy": "stage", + "sort": "desc" + }, + "finance-dashboard": { + "listTool": "shd_list_finance_documents", + "listArgs": { + "limit": 100 + }, + "paths": [ + "data" + ], + "view": "dashboard", + "sort": "desc" + }, + "proposal-approvals": { + "listTool": "shd_list_proposals", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_proposal_approval", + "detailKey": "proposal_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "view": "approval", + "sort": "desc" + }, + "documents-completeness": { + "listTool": "shd_list_pdf_scheme_editor_documents", + "readTool": "shd_get_pdf_scheme_editor_document_completeness", + "detailKey": "document_id", + "detailSourceArgs": [ + "project_code" + ], + "paths": [ + "data" + ], + "view": "completeness", + "contextRequired": true, + "contextKeys": [ + "project_code" + ], + "sort": "desc" + }, + "agents-health": { + "listTool": "shd_agents_overview", + "paths": [ + "data.agents", + "data.user_agents", + "data" + ], + "view": "health", + "sort": "asc" + }, + "schedule-calendar": { + "listTool": "shd_get_scheduling_overview", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_list_scheduling_bookings", + "detailKey": "booking_id", + "detailArgs": { + "limit": 1 + }, + "paths": [ + "data.bookings", + "data.upcoming_bookings", + "data" + ], + "view": "calendar", + "sort": "asc" + }, + "acl-matrix": { + "listTool": "shd_list_organization_members", + "listArgs": { + "limit": 100 + }, + "paths": [ + "data" + ], + "view": "matrix", + "contextRequired": true, + "contextKeys": [ + "organization_id" + ], + "contextAll": true, + "sort": "asc" + }, + "inventory-warnings": { + "listTool": "shd_list_inventory_items", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_inventory_item", + "detailKey": "item_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "view": "warnings", + "sort": "asc" + }, + "gitea-board": { + "listTool": "shd_list_gitea_issues", + "listArgs": { + "target": "site", + "limit": 100 + }, + "paths": [ + "data" + ], + "view": "kanban", + "groupBy": "state", + "sort": "asc" + }, + "schemes-progress": { + "listTool": "shd_list_pdf_scheme_editor_documents", + "readTool": "shd_get_pdf_scheme_editor_document", + "detailKey": "document", + "detailSourceArgs": [ + "project" + ], + "paths": [ + "data" + ], + "view": "progress", + "contextRequired": true, + "contextKeys": [ + "project" + ], + "sort": "desc" + }, + "notes-tree": { + "listTool": "shd_list_note_spaces", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_note_space_tree", + "detailKey": "space_id", + "detailSourceArgs": [], + "paths": [ + "data" + ], + "view": "tree", + "sort": "asc" + }, + "airbase-preview": { + "listTool": "shd_airbase_records", + "listArgs": { + "limit": 100, + "include_fields": true, + "include_view_meta": true + }, + "paths": [ + "data.records", + "data" + ], + "view": "preview", + "contextRequired": true, + "contextSets": [ + [ + "base", + "project_code" + ], + [ + "table" + ] + ], + "sort": "asc" + }, + "documents": { + "listTool": "shd_list_contracts", + "listArgs": { + "archived": false, + "limit": 100 + }, + "readTool": "shd_get_contract", + "detailKey": "contract_id", + "paths": [ + "data" + ], + "sort": "desc" + }, + "tasks": { + "listTool": "shd_list_tasks", + "listArgs": { + "archived": false, + "limit": 100 + }, + "readTool": "shd_get_task", + "detailKey": "task_id", + "paths": [ + "data" + ], + "sort": "asc" + }, + "finance": { + "listTool": "shd_list_finance_documents", + "listArgs": { + "archived": false, + "limit": 100 + }, + "readTool": "shd_get_finance_document", + "detailKey": "document_id", + "paths": [ + "data" + ], + "sort": "desc" + }, + "crm": { + "listTool": "shd_list_crm", + "listArgs": { + "limit": 100 + }, + "readTool": "shd_get_crm_entity", + "detailKey": "entity_id", + "detailSourceArgs": [ + "section" + ], + "paths": [ + "data" + ], + "sort": "desc" + }, + "pdf-scheme-editor": { + "listTool": "shd_list_pdf_scheme_editor_documents", + "readTool": "shd_get_pdf_scheme_editor_document", + "detailKey": "document", + "detailSourceArgs": [ + "project" + ], + "paths": [ + "data" + ], + "contextRequired": true, + "sort": "desc" + } + } +} diff --git a/plugins/shd-mcp-plugin/widgets/_shared/universal-widget.html b/plugins/shd-mcp-plugin/widgets/_shared/universal-widget.html new file mode 100644 index 0000000..ef06aeb --- /dev/null +++ b/plugins/shd-mcp-plugin/widgets/_shared/universal-widget.html @@ -0,0 +1,558 @@ + + + + + + SHD MCP + + + + +
+
SHD MCP

SHD

+
+
+
+ +
+ + + + diff --git a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/SHA256SUMS b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/SHA256SUMS index b595428..87e1713 100644 --- a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/SHA256SUMS +++ b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/SHA256SUMS @@ -1 +1 @@ -9e82d5a6f3c35445b5d7400fd4b1aa8ba93c97141cf83a23e585ef051e3f0421 index.html +e0595452b8365206b4bb26cf5b2680c8da2e7107260a0caf7bb0c5c23008743b index.html diff --git a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/UPSTREAM.md b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/UPSTREAM.md index f91d1f0..00ff75a 100644 --- a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/UPSTREAM.md +++ b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/UPSTREAM.md @@ -2,4 +2,4 @@ This artifact is served by the SHD MCP backend as ui://shd/acl-matrix/v1.html. -The HTML is standalone, uses the MCP Apps bridge first, and keeps window.openai as a compatibility extension. It has no external script or network dependency. The widget provides a read-only organization membership and permission matrix. +The standalone HTML is generated from `widgets/_shared/universal-widget.html` and `widgets/_shared/universal-widget-config.json` by `scripts/generate-widget-artifacts.mjs` using the `shd-universal-v1` engine. It uses the MCP Apps bridge first and keeps `window.openai` as a compatibility extension; it has no external script or network dependency. The module supplies its data and view configuration through the render-tool metadata. diff --git a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/index.html b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/index.html index b66c5b8..0401873 100644 --- a/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/index.html +++ b/plugins/shd-mcp-plugin/widgets/acl-matrix/v1/index.html @@ -38,7 +38,7 @@ -
+
SHD MCP

SHD

@@ -49,75 +49,12 @@ (function(){ 'use strict'; var DEFAULT_MODULE='acl-matrix'; - var C={ru:{refresh:'Обновить',search:'Поиск по названию, статусу или ID',loading:'Загрузка…',empty:'Нет данных для отображения.',records:'записей',status:'Статус',date:'Дата',value:'Детали',id:'ID',yes:'Да',no:'Нет',details:'Детали',close:'Закрыть',load:'Не удалось загрузить данные.',detail:'Не удалось загрузить детали.',context:'Для обновления нужен контекст источника',total:'Всего',amount:'Сумма',planned:'План',capacity:'Ёмкость',utilization:'Загрузка',overload:'Перегрузка',warnings:'Предупреждения',complete:'Готово',pending:'Ожидают',approved:'Согласовано',rejected:'Отклонено',progress:'Прогресс',score:'Оценка',member:'Участник',role:'Роль',permissions:'Разрешения',preview:'Предпросмотр',noWarnings:'Предупреждений нет.',health:'Состояние'},en:{refresh:'Refresh',search:'Search by name, status or ID',loading:'Loading…',empty:'No data to display.',records:'records',status:'Status',date:'Date',value:'Details',id:'ID',yes:'Yes',no:'No',details:'Details',close:'Close',load:'Could not load data.',detail:'Could not load details.',context:'A source context is required to refresh.',total:'Total',amount:'Amount',planned:'Planned',capacity:'Capacity',utilization:'Utilization',overload:'Overload',warnings:'Warnings',complete:'Complete',pending:'Pending',approved:'Approved',rejected:'Rejected',progress:'Progress',score:'Score',member:'Member',role:'Role',permissions:'Permissions',preview:'Preview',noWarnings:'No warnings.',health:'Health'}}; + var C={ru:{refresh:'Обновить',search:'Поиск по названию, статусу или ID',loading:'Загрузка…',empty:'Нет данных для отображения.',records:'записей',status:'Статус',date:'Дата',value:'Детали',id:'ID',details:'Детали',close:'Закрыть',load:'Не удалось загрузить данные.',detail:'Не удалось загрузить детали.',context:'Для обновления нужен контекст источника',total:'Всего',amount:'Сумма',planned:'План',capacity:'Ёмкость',utilization:'Загрузка',overload:'Перегрузка',warnings:'Предупреждения',complete:'Готово',pending:'Ожидают',approved:'Согласовано',rejected:'Отклонено',progress:'Прогресс',score:'Оценка',member:'Участник',role:'Роль',permissions:'Разрешения',preview:'Предпросмотр',noWarnings:'Предупреждений нет.',health:'Состояние',yes:'Да',no:'Нет'},en:{refresh:'Refresh',search:'Search by name, status or ID',loading:'Loading…',empty:'No data to display.',records:'records',status:'Status',date:'Date',value:'Details',id:'ID',details:'Details',close:'Close',load:'Could not load data.',detail:'Could not load details.',context:'A source context is required to refresh.',total:'Total',amount:'Amount',planned:'Planned',capacity:'Capacity',utilization:'Utilization',overload:'Overload',warnings:'Warnings',complete:'Complete',pending:'Pending',approved:'Approved',rejected:'Rejected',progress:'Progress',score:'Score',member:'Member',role:'Role',permissions:'Permissions',preview:'Preview',noWarnings:'No warnings.',health:'Health',yes:'Yes',no:'No'}}; var FIELD_LABELS={ru:{id:'ID',key:'Ключ',project_id:'ID проекта',task_project_id:'ID проекта задачи',linked_project_ids:'Связанные проекты',project_code:'Код проекта',base_reference:'Ссылка на базу',base_public_id:'Публичный ID базы',table_public_id:'Публичный ID таблицы',record_public_id:'Публичный ID записи',title:'Название',name:'Название',description:'Описание',status:'Статус',status_id:'ID статуса',is_done:'Завершено',is_complete:'Завершено',section:'Раздел',sort_order:'Порядок сортировки',created_at:'Создано',updated_at:'Обновлено',due_date:'Срок',deadline:'Дедлайн',starts_at:'Начало',ends_at:'Окончание',url:'Ссылка',diagnostic:'Диагностика',message:'Сообщение',type:'Тип',state:'Состояние',phase:'Этап',health:'Состояние',email:'Электронная почта',username:'Имя пользователя',role:'Роль',permissions:'Разрешения',source:'Источник',module:'Модуль',table:'Таблица',fields:'Поля',value:'Значение',stage:'Стадия',approval_status:'Статус согласования',approval_state:'Состояние согласования',priority:'Приоритет',assignee:'Исполнитель',owner:'Владелец',type:'Тип',category:'Категория',permissions:'Разрешения',permission:'Разрешение',read:'Чтение',write:'Запись',manage:'Управление',admin:'Администратор',view:'Просмотр',create:'Создание',update:'Изменение',delete:'Удаление',error:'Ошибка',warning:'Предупреждение',message:'Сообщение',path:'Путь',link:'Ссылка',amount:'Сумма',total:'Итого',quantity:'Количество',available_quantity:'Доступное количество',stock:'Остаток',planned:'План',planned_hours:'Плановые часы',capacity:'Ёмкость',capacity_hours:'Часы ёмкости',utilization:'Загрузка',utilization_percent:'Загрузка, %',overload:'Перегрузка',overload_hours:'Часы перегрузки',score:'Оценка',progress:'Прогресс',completeness_score:'Оценка полноты',completion_percent:'Полнота, %',availability_percent:'Доступность, %',record_count:'Количество записей',revision:'Ревизия',pages:'Страницы',page_count:'Количество страниц',date:'Дата',is_archived:'В архиве',low_stock:'Мало на складе',critical:'Критический',meta:'Метаданные'},en:{id:'ID',key:'Key',project_id:'Project ID',task_project_id:'Task project ID',linked_project_ids:'Linked projects',project_code:'Project code',base_reference:'Base reference',base_public_id:'Public base ID',table_public_id:'Public table ID',record_public_id:'Public record ID',title:'Title',name:'Name',description:'Description',status:'Status',status_id:'Status ID',is_done:'Completed',is_complete:'Completed',section:'Section',sort_order:'Sort order',created_at:'Created',updated_at:'Updated',due_date:'Due date',deadline:'Deadline',starts_at:'Starts',ends_at:'Ends',url:'URL',diagnostic:'Diagnostics',message:'Message',type:'Type',state:'State',phase:'Phase',health:'Health',email:'Email',username:'Username',role:'Role',permissions:'Permissions',source:'Source',module:'Module',table:'Table',fields:'Fields',value:'Value',stage:'Stage',approval_status:'Approval status',approval_state:'Approval state',priority:'Priority',assignee:'Assignee',owner:'Owner',type:'Type',category:'Category',permissions:'Permissions',permission:'Permission',read:'Read',write:'Write',manage:'Manage',admin:'Admin',view:'View',create:'Create',update:'Update',delete:'Delete',error:'Error',warning:'Warning',message:'Message',path:'Path',link:'Link',amount:'Amount',total:'Total',quantity:'Quantity',available_quantity:'Available quantity',stock:'Stock',planned:'Planned',planned_hours:'Planned hours',capacity:'Capacity',capacity_hours:'Capacity hours',utilization:'Utilization',utilization_percent:'Utilization, %',overload:'Overload',overload_hours:'Overload hours',score:'Score',progress:'Progress',completeness_score:'Completeness score',completion_percent:'Completeness, %',availability_percent:'Availability, %',record_count:'Record count',revision:'Revision',pages:'Pages',page_count:'Page count',date:'Date',is_archived:'Archived',low_stock:'Low stock',critical:'Critical',meta:'Metadata'}}; - var VALUE_LABELS={ru:{Tasks_Status_Todo:'К выполнению',Tasks_Status_Done:'Завершено',Tasks_Status_In_Progress:'В работе',Tasks_Status_Review:'На проверке',Modules_Done:'Завершено',todo:'К выполнению',to_do:'К выполнению','to do':'К выполнению',in_progress:'В работе','in progress':'В работе','in-progress':'В работе',in_progress_status:'В работе',done:'Завершено',completed:'Завершено',complete:'Завершено',closed:'Закрыто',active:'Активно',pending:'Ожидает',review:'На проверке',approved:'Согласовано',rejected:'Отклонено',archived:'В архиве',not_set:'Не задано',overdue:'Просрочено',blocked:'Заблокировано',error:'Ошибка',warning:'Предупреждение',maintenance:'Техническое обслуживание',low_stock:'Мало на складе',critical:'Критический',out_of_stock:'Нет на складе',available:'Доступно',unavailable:'Недоступно',read:'Чтение',write:'Запись',manage:'Управление',admin:'Администратор',view:'Просмотр',create:'Создание',update:'Изменение',delete:'Удаление',execute:'Выполнение'},en:{Tasks_Status_Todo:'To do',Tasks_Status_Done:'Done',Tasks_Status_In_Progress:'In progress',Tasks_Status_Review:'In review',Modules_Done:'Done',todo:'To do',to_do:'To do','to do':'To do',in_progress:'In progress','in progress':'In progress','in-progress':'In progress',in_progress_status:'In progress',done:'Done',completed:'Completed',complete:'Complete',closed:'Closed',active:'Active',pending:'Pending',review:'In review',approved:'Approved',rejected:'Rejected',archived:'Archived',not_set:'Not set',overdue:'Overdue',blocked:'Blocked',error:'Error',warning:'Warning',maintenance:'Maintenance',low_stock:'Low stock',critical:'Critical',out_of_stock:'Out of stock',available:'Available',unavailable:'Unavailable',read:'Read',write:'Write',manage:'Manage',admin:'Admin',view:'View',create:'Create',update:'Update',delete:'Delete',execute:'Execute'}}; - var M={ - discussions:{ru:['Обсуждения','Темы обсуждений с поиском и просмотром сообщений.','Тема','Обновлено','Сообщение'],en:['Discussions','Discussion topics with search and message details.','Topic','Updated','Message']}, - notifications:{ru:['Уведомления','Последние уведомления и события модулей.','Уведомление','Время','Источник'],en:['Notifications','Recent notifications and module events.','Notification','Time','Source']}, - scheduling:{ru:['Расписание','Ближайшие события и записи из расписания.','Событие','Начало','Участник'],en:['Scheduling','Upcoming events and bookings from scheduling.','Event','Starts','Guest']}, - inventory:{ru:['Склад','Складские позиции, остатки и статусы.','Позиция','Обновлено','Количество'],en:['Inventory','Stock items, quantities and statuses.','Item','Updated','Quantity']}, - agents:{ru:['Агенты и контроллеры','Доступные агенты, контроллеры и их текущее состояние.','Агент или контроллер','Проверено','Тип'],en:['Agents & Controllers','Available agents, controllers and their current state.','Agent or controller','Checked','Type']}, - 'status-page':{ru:['Status Page','Состояние доступности сервисов и мониторов.','Монитор','Проверено','Доступность'],en:['Status Page','Service availability and monitor state.','Monitor','Checked','Availability']}, - 'project-db':{ru:['Project DB','Каталог таблиц Project DB с просмотром схемы.','Таблица','Обновлено','Записей'],en:['Project DB','Project DB table catalog with schema details.','Table','Updated','Records']}, - notes:{ru:['Заметки','Страницы Notes с поиском и просмотром содержимого.','Страница','Обновлено','Пространство'],en:['Notes','Notes pages with search and content details.','Page','Updated','Space']}, - 'project-overview':{ru:['Обзор проекта','Сводные данные по разделам выбранного проекта.','Раздел','Обновлено','Элементы'],en:['Project overview','Cross-module records for the selected project.','Section','Updated','Items']}, - files:{ru:['Файлы','Файлы выбранного проекта с поиском и безопасным просмотром ссылок.','Файл','Обновлено','Размер или тип'],en:['Files','Files from the selected project with search and safe links.','File','Updated','Size or type']}, - proposals:{ru:['Предложения','Предложения и сметы с поиском, статусами и деталями.','Предложение','Обновлено','Сумма или номер'],en:['Proposals','Proposals with search, statuses and details.','Proposal','Updated','Amount or number']}, - terms:{ru:['Terms / ТЗ','Документы технического задания и их ревизии.','Документ','Обновлено','Страницы или ревизия'],en:['Terms documents','Terms of Reference documents and revisions.','Document','Updated','Pages or revision']}, - activity:{ru:['Активность','Авторизованные realtime-события SHD по выбранному scope.','Событие','Время','Модуль или тип'],en:['Activity','Authenticated SHD realtime events for the selected scope.','Event','Time','Module or type']}, - organizations:{ru:['Организации и доступ','Организации, роли и безопасный просмотр участников.','Организация','Обновлено','Роль или тип'],en:['Organizations & access','Organizations, roles and safe membership details.','Organization','Updated','Role or type']}, - gitea:{ru:['Gitea Issues','Открытые задачи разрешённого site или project репозитория.','Issue','Обновлено','Состояние'],en:['Gitea Issues','Open issues for an allowed site or project repository.','Issue','Updated','State']}, - schemes:{ru:['Схемы','Документы PDF Scheme Editor и их текущее состояние.','Схема','Обновлено','Ревизия или страницы'],en:['Schemes','PDF Scheme Editor documents and their current state.','Scheme','Updated','Revision or pages']}, - 'task-kanban':{ru:['Задачи Kanban','Задачи по колонкам статусов с поиском и деталями.','Задача','Срок','Исполнитель'],en:['Task Kanban','Tasks grouped by workflow status with search and details.','Task','Due','Assignee']}, - 'team-workload':{ru:['Загрузка команды','Плановая нагрузка, ёмкость и утилизация команды.','Участник','Период','Часы или процент'],en:['Team workload','Planned workload, capacity and team utilization.','Member','Period','Hours or percent']}, - 'project-timeline':{ru:['Timeline проекта','Задачи проекта на временной ленте.','Задача','Срок','Статус'],en:['Project timeline','Project tasks on a chronological timeline.','Task','Due','Status']}, - 'crm-funnel':{ru:['CRM-воронка','Сделки CRM, сгруппированные по стадиям.','Стадия','Сделки','Сумма'],en:['CRM funnel','CRM deals grouped by pipeline stage.','Stage','Deals','Amount']}, - 'finance-dashboard':{ru:['Финансовый дашборд','Суммы, статусы и документы финансового модуля.','Документ','Обновлено','Сумма'],en:['Finance dashboard','Finance amounts, statuses and documents.','Document','Updated','Amount']}, - 'proposal-approvals':{ru:['Согласования предложений','Очередь предложений и текущие approval-статусы.','Предложение','Обновлено','Approval'],en:['Proposal approvals','Proposal queue and current approval states.','Proposal','Updated','Approval']}, - 'documents-completeness':{ru:['Полнота документов','Score, ревизии и состояние Terms-документов.','Документ','Обновлено','Полнота'],en:['Documents completeness','Scores, revisions and Terms document state.','Document','Updated','Completeness']}, - 'agents-health':{ru:['Здоровье агентов','Состояние агентов и контроллеров.','Агент или контроллер','Проверено','Health'],en:['Agents health','Agent and controller health state.','Agent or controller','Checked','Health']}, - 'schedule-calendar':{ru:['Календарь расписания','Ближайшие записи, сгруппированные по дням.','Событие','День','Участник'],en:['Schedule calendar','Upcoming bookings grouped by day.','Event','Day','Guest']}, - 'acl-matrix':{ru:['ACL-матрица','Участники организации, роли и permissions.','Участник','Роль','Права'],en:['ACL matrix','Organization members, roles and permissions.','Member','Role','Permissions']}, - 'inventory-warnings':{ru:['Предупреждения склада','Низкие остатки и критические складские позиции.','Позиция','Обновлено','Остаток'],en:['Inventory warnings','Low-stock and critical inventory items.','Item','Updated','Stock']}, - 'gitea-board':{ru:['Gitea-доска','Issues по состояниям разрешённого репозитория.','Issue','Состояние','Ссылка'],en:['Gitea board','Issues grouped by state for an allowed repository.','Issue','State','Link']}, - 'schemes-progress':{ru:['Прогресс схем','Документы схем, ревизии, страницы и completeness.','Схема','Обновлено','Прогресс'],en:['Schemes progress','Scheme documents, revisions, pages and completeness.','Scheme','Updated','Progress']}, - 'notes-tree':{ru:['Дерево Notes','Пространства Notes и их иерархия.','Узел','Обновлено','Тип'],en:['Notes tree','Notes spaces and their hierarchy.','Node','Updated','Type']}, - 'project-db-preview':{ru:['Project DB preview','Предпросмотр записей выбранной таблицы Project DB.','Запись','Обновлено','Поля'],en:['Project DB preview','Preview of records from the selected Project DB table.','Record','Updated','Fields']} - }; - var S={ - discussions:{listTool:'shd_list_discussion_topics',listArgs:{limit:100},readTool:'shd_list_discussion_messages',detailKey:'topic_id',detailArgs:{limit:50},paths:['data'],sort:'desc'}, - notifications:{listTool:'shd_list_notifications',listArgs:{limit:50,offset:0},paths:['data'],sort:'desc'}, - scheduling:{listTool:'shd_get_scheduling_overview',listArgs:{limit:100},readTool:'shd_list_scheduling_bookings',detailKey:'booking_id',detailArgs:{limit:1},paths:['data.bookings','data.upcoming_bookings','data'],sort:'asc'}, - inventory:{listTool:'shd_list_inventory_items',listArgs:{limit:100},readTool:'shd_get_inventory_item',detailKey:'item_id',paths:['data'],sort:'desc'}, - agents:{listTool:'shd_agents_overview',listArgs:{},paths:['data.agents','data.user_agents','data'],sort:'asc'}, - 'status-page':{listTool:'shd_get_status_page_monitors',listArgs:{environment:'dev'},readTool:'shd_get_status_page_monitor_history',detailKey:'monitor_id',detailArgs:{limit:20},paths:['data'],nested:'monitors',sort:'asc'}, - 'project-db':{listTool:'shd_project_db_tables',listArgs:{},readTool:'shd_project_db_schema',detailKey:'table',paths:['data.tables','data'],contextRequired:true,sort:'asc'}, - notes:{listTool:'shd_list_note_pages',listArgs:{limit:100},readTool:'shd_get_note_page',detailKey:'page_id',paths:['data'],sort:'desc'}, - 'project-overview':{listTool:'shd_get_project_context',listArgs:{include:['summary','tasks','discussions','documents','finance','terms','agents'],limit_per_section:100},paths:['data.sections.tasks','data.sections.discussions','data.sections.documents','data.sections.finance','data.sections.terms'],combinePaths:true,contextRequired:true,sort:'desc'}, - files:{listTool:'shd_list_files',readTool:'shd_get_file_link',detailKey:'path',detailArgs:{download:false},detailSourceArgs:['project_code'],paths:['data'],contextRequired:true,sort:'desc'}, - proposals:{listTool:'shd_list_proposals',listArgs:{limit:100},readTool:'shd_get_proposal',detailKey:'proposal_id',detailSourceArgs:[],paths:['data'],sort:'desc'}, - terms:{listTool:'shd_list_terms_documents',readTool:'shd_get_terms_document',detailKey:'document_id',detailSourceArgs:['project_code'],paths:['data'],contextRequired:true,sort:'desc'}, - activity:{listTool:'shd_get_realtime_events',listArgs:{module:'notifications',limit:100},paths:['data.events','events','data'],sort:'desc'}, - organizations:{listTool:'shd_admin_list_organizations',listArgs:{limit:100},readTool:'shd_admin_get_organization_members',detailKey:'organization_id',detailSourceArgs:[],paths:['data'],sort:'asc'}, - gitea:{listTool:'shd_list_gitea_issues',listArgs:{target:'site',limit:100},paths:['data'],sort:'desc'}, - schemes:{listTool:'shd_list_scheme_documents',readTool:'shd_get_scheme_document',detailKey:'document',detailSourceArgs:['project'],paths:['data'],contextRequired:true,sort:'desc'}, - 'task-kanban':{listTool:'shd_list_tasks',listArgs:{limit:100},readTool:'shd_get_task',detailKey:'task_id',detailSourceArgs:[],paths:['data'],view:'kanban',groupBy:'status',sort:'asc'}, - 'team-workload':{listTool:'shd_get_task_workload',listArgs:{period:'month'},paths:['data.rows','data.workload','data.assignees','data'],view:'workload',sort:'desc'}, - 'project-timeline':{listTool:'shd_list_tasks',listArgs:{limit:100},paths:['data'],view:'timeline',sort:'asc'}, - 'crm-funnel':{listTool:'shd_list_crm',listArgs:{section:'deals',limit:100},readTool:'shd_get_crm_entity',detailKey:'entity_id',detailSourceArgs:['section'],paths:['data'],view:'funnel',groupBy:'stage',sort:'desc'}, - 'finance-dashboard':{listTool:'shd_list_finance_documents',listArgs:{limit:100},paths:['data'],view:'dashboard',sort:'desc'}, - 'proposal-approvals':{listTool:'shd_list_proposals',listArgs:{limit:100},readTool:'shd_get_proposal_approval',detailKey:'proposal_id',detailSourceArgs:[],paths:['data'],view:'approval',sort:'desc'}, - 'documents-completeness':{listTool:'shd_list_terms_documents',readTool:'shd_get_terms_document_completeness',detailKey:'document_id',detailSourceArgs:['project_code'],paths:['data'],view:'completeness',contextRequired:true,contextKeys:['project_code'],sort:'desc'}, - 'agents-health':{listTool:'shd_agents_overview',paths:['data.agents','data.user_agents','data'],view:'health',sort:'asc'}, - 'schedule-calendar':{listTool:'shd_get_scheduling_overview',listArgs:{limit:100},readTool:'shd_list_scheduling_bookings',detailKey:'booking_id',detailArgs:{limit:1},paths:['data.bookings','data.upcoming_bookings','data'],view:'calendar',sort:'asc'}, - 'acl-matrix':{listTool:'shd_list_organization_members',listArgs:{limit:100},paths:['data'],view:'matrix',contextRequired:true,contextKeys:['organization_id'],contextAll:true,sort:'asc'}, - 'inventory-warnings':{listTool:'shd_list_inventory_items',listArgs:{limit:100},readTool:'shd_get_inventory_item',detailKey:'item_id',detailSourceArgs:[],paths:['data'],view:'warnings',sort:'asc'}, - 'gitea-board':{listTool:'shd_list_gitea_issues',listArgs:{target:'site',limit:100},paths:['data'],view:'kanban',groupBy:'state',sort:'asc'}, - 'schemes-progress':{listTool:'shd_list_scheme_documents',readTool:'shd_get_scheme_document',detailKey:'document',detailSourceArgs:['project'],paths:['data'],view:'progress',contextRequired:true,contextKeys:['project'],sort:'desc'}, - 'notes-tree':{listTool:'shd_list_note_spaces',listArgs:{limit:100},readTool:'shd_get_note_space_tree',detailKey:'space_id',detailSourceArgs:[],paths:['data'],view:'tree',sort:'asc'}, - 'project-db-preview':{listTool:'shd_project_db_records',listArgs:{limit:100,include_fields:true,include_view_meta:true},paths:['data.records','data'],view:'preview',contextRequired:true,contextKeys:['base','project_code','table'],contextAll:true,sort:'asc'} - }; + var VALUE_LABELS={ru:{Tasks_Status_Todo:'К выполнению',Tasks_Status_Done:'Завершено',Tasks_Status_In_Progress:'В работе',Tasks_Status_Review:'На проверке',Modules_Done:'Завершено',todo:'К выполнению',to_do:'К выполнению','to do':'К выполнению',in_progress:'В работе','in progress':'В работе','in-progress':'В работе',in_progress_status:'В работе',done:'Завершено',completed:'Завершено',complete:'Завершено',closed:'Закрыто',active:'Активно',pending:'Ожидает',review:'На проверке',approved:'Согласовано',rejected:'Отклонено',archived:'В архиве',not_set:'Не задано'},en:{Tasks_Status_Todo:'To do',Tasks_Status_Done:'Done',Tasks_Status_In_Progress:'In progress',Tasks_Status_Review:'In review',Modules_Done:'Done',todo:'To do',to_do:'To do','to do':'To do',in_progress:'In progress','in progress':'In progress','in-progress':'In progress',in_progress_status:'In progress',done:'Done',completed:'Completed',complete:'Complete',closed:'Closed',active:'Active',pending:'Pending',review:'In review',approved:'Approved',rejected:'Rejected',archived:'Archived',not_set:'Not set'}}; + var MODULE_CONFIG={"copy":{"discussions":{"ru":["Обсуждения","Темы обсуждений с поиском и просмотром сообщений.","Тема","Обновлено","Сообщение"],"en":["Discussions","Discussion topics with search and message details.","Topic","Updated","Message"]},"notifications":{"ru":["Уведомления","Последние уведомления и события модулей.","Уведомление","Время","Источник"],"en":["Notifications","Recent notifications and module events.","Notification","Time","Source"]},"scheduling":{"ru":["Расписание","Ближайшие события и записи из расписания.","Событие","Начало","Участник"],"en":["Scheduling","Upcoming events and bookings from scheduling.","Event","Starts","Guest"]},"inventory":{"ru":["Склад","Складские позиции, остатки и статусы.","Позиция","Обновлено","Количество"],"en":["Inventory","Stock items, quantities and statuses.","Item","Updated","Quantity"]},"agents":{"ru":["Агенты и контроллеры","Доступные агенты, контроллеры и их текущее состояние.","Агент или контроллер","Проверено","Тип"],"en":["Agents & Controllers","Available agents, controllers and their current state.","Agent or controller","Checked","Type"]},"status-page":{"ru":["Status Page","Состояние доступности сервисов и мониторов.","Монитор","Проверено","Доступность"],"en":["Status Page","Service availability and monitor state.","Monitor","Checked","Availability"]},"airbase":{"ru":["AirBase","Каталог таблиц AirBase с просмотром схемы.","Таблица","Обновлено","Записей"],"en":["AirBase","AirBase table catalog with schema details.","Table","Updated","Records"]},"notes":{"ru":["Заметки","Страницы Notes с поиском и просмотром содержимого.","Страница","Обновлено","Пространство"],"en":["Notes","Notes pages with search and content details.","Page","Updated","Space"]},"project-overview":{"ru":["Обзор проекта","Сводные данные по разделам выбранного проекта.","Раздел","Обновлено","Элементы"],"en":["Project overview","Cross-module records for the selected project.","Section","Updated","Items"]},"files":{"ru":["Файлы","Файлы выбранного проекта с поиском и безопасным просмотром ссылок.","Файл","Обновлено","Размер или тип"],"en":["Files","Files from the selected project with search and safe links.","File","Updated","Size or type"]},"proposals":{"ru":["Предложения","Предложения и сметы с поиском, статусами и деталями.","Предложение","Обновлено","Сумма или номер"],"en":["Proposals","Proposals with search, statuses and details.","Proposal","Updated","Amount or number"]},"terms":{"ru":["Terms / ТЗ","Документы технического задания и их ревизии.","Документ","Обновлено","Страницы или ревизия"],"en":["Terms documents","Terms of Reference documents and revisions.","Document","Updated","Pages or revision"]},"activity":{"ru":["Активность","Авторизованные realtime-события SHD по выбранному scope.","Событие","Время","Модуль или тип"],"en":["Activity","Authenticated SHD realtime events for the selected scope.","Event","Time","Module or type"]},"organizations":{"ru":["Организации и доступ","Организации, роли и безопасный просмотр участников.","Организация","Обновлено","Роль или тип"],"en":["Organizations & access","Organizations, roles and safe membership details.","Organization","Updated","Role or type"]},"gitea":{"ru":["Gitea Issues","Открытые задачи разрешённого site или project репозитория.","Issue","Обновлено","Состояние"],"en":["Gitea Issues","Open issues for an allowed site or project repository.","Issue","Updated","State"]},"schemes":{"ru":["Схемы","Документы PDF Scheme Editor и их текущее состояние.","Схема","Обновлено","Ревизия или страницы"],"en":["Schemes","PDF Scheme Editor documents and their current state.","Scheme","Updated","Revision or pages"]},"task-kanban":{"ru":["Задачи Kanban","Задачи по колонкам статусов с поиском и деталями.","Задача","Срок","Исполнитель"],"en":["Task Kanban","Tasks grouped by workflow status with search and details.","Task","Due","Assignee"]},"team-workload":{"ru":["Загрузка команды","Плановая нагрузка, ёмкость и утилизация команды.","Участник","Период","Часы или процент"],"en":["Team workload","Planned workload, capacity and team utilization.","Member","Period","Hours or percent"]},"project-timeline":{"ru":["Timeline проекта","Задачи проекта на временной ленте.","Задача","Срок","Статус"],"en":["Project timeline","Project tasks on a chronological timeline.","Task","Due","Status"]},"crm-funnel":{"ru":["CRM-воронка","Сделки CRM, сгруппированные по стадиям.","Стадия","Сделки","Сумма"],"en":["CRM funnel","CRM deals grouped by pipeline stage.","Stage","Deals","Amount"]},"finance-dashboard":{"ru":["Финансовый дашборд","Суммы, статусы и документы финансового модуля.","Документ","Обновлено","Сумма"],"en":["Finance dashboard","Finance amounts, statuses and documents.","Document","Updated","Amount"]},"proposal-approvals":{"ru":["Согласования предложений","Очередь предложений и текущие approval-статусы.","Предложение","Обновлено","Approval"],"en":["Proposal approvals","Proposal queue and current approval states.","Proposal","Updated","Approval"]},"documents-completeness":{"ru":["Полнота документов","Score, ревизии и состояние Terms-документов.","Документ","Обновлено","Полнота"],"en":["Documents completeness","Scores, revisions and Terms document state.","Document","Updated","Completeness"]},"agents-health":{"ru":["Здоровье агентов","Состояние агентов и контроллеров.","Агент или контроллер","Проверено","Health"],"en":["Agents health","Agent and controller health state.","Agent or controller","Checked","Health"]},"schedule-calendar":{"ru":["Календарь расписания","Ближайшие записи, сгруппированные по дням.","Событие","День","Участник"],"en":["Schedule calendar","Upcoming bookings grouped by day.","Event","Day","Guest"]},"acl-matrix":{"ru":["ACL-матрица","Участники организации, роли и permissions.","Участник","Роль","Права"],"en":["ACL matrix","Organization members, roles and permissions.","Member","Role","Permissions"]},"inventory-warnings":{"ru":["Предупреждения склада","Низкие остатки и критические складские позиции.","Позиция","Обновлено","Остаток"],"en":["Inventory warnings","Low-stock and critical inventory items.","Item","Updated","Stock"]},"gitea-board":{"ru":["Gitea-доска","Issues по состояниям разрешённого репозитория.","Issue","Состояние","Ссылка"],"en":["Gitea board","Issues grouped by state for an allowed repository.","Issue","State","Link"]},"schemes-progress":{"ru":["Прогресс схем","Документы схем, ревизии, страницы и completeness.","Схема","Обновлено","Прогресс"],"en":["Schemes progress","Scheme documents, revisions, pages and completeness.","Scheme","Updated","Progress"]},"notes-tree":{"ru":["Дерево Notes","Пространства Notes и их иерархия.","Узел","Обновлено","Тип"],"en":["Notes tree","Notes spaces and their hierarchy.","Node","Updated","Type"]},"airbase-preview":{"ru":["AirBase preview","Предпросмотр записей выбранной таблицы AirBase.","Запись","Обновлено","Поля"],"en":["AirBase preview","Preview of records from the selected AirBase table.","Record","Updated","Fields"]},"documents":{"ru":["Документы","Реестр документов с поиском и просмотром деталей.","Документ","Обновлено","Сумма"],"en":["Documents","Document register with search and details.","Document","Updated","Amount"]},"tasks":{"ru":["Задачи","Реестр задач с поиском и просмотром деталей.","Задача","Срок","Приоритет"],"en":["Tasks","Task register with search and details.","Task","Due date","Priority"]},"finance":{"ru":["Финансы","Реестр финансовых документов с поиском и просмотром деталей.","Документ","Срок","Сумма"],"en":["Finance","Finance document register with search and details.","Document","Due date","Amount"]},"crm":{"ru":["CRM","Реестр CRM-сущностей с поиском и просмотром деталей.","Сущность","Обновлено","Стадия"],"en":["CRM","CRM entity register with search and details.","Entity","Updated","Stage"]},"pdf-scheme-editor":{"ru":["PDF Scheme Editor","Документы схем и их текущее состояние.","Документ","Обновлено","Ревизия или страницы"],"en":["PDF Scheme Editor","Scheme documents and their current state.","Document","Updated","Revision or pages"]}},"defaults":{"discussions":{"listTool":"shd_list_discussion_topics","listArgs":{"limit":100},"readTool":"shd_list_discussion_messages","detailKey":"topic_id","detailArgs":{"limit":50},"paths":["data"],"sort":"desc"},"notifications":{"listTool":"shd_list_notifications","listArgs":{"limit":50,"offset":0},"paths":["data"],"sort":"desc"},"scheduling":{"listTool":"shd_get_scheduling_overview","listArgs":{"limit":100},"readTool":"shd_list_scheduling_bookings","detailKey":"booking_id","detailArgs":{"limit":1},"paths":["data.bookings","data.upcoming_bookings","data"],"sort":"asc"},"inventory":{"listTool":"shd_list_inventory_items","listArgs":{"limit":100},"readTool":"shd_get_inventory_item","detailKey":"item_id","paths":["data"],"sort":"desc"},"agents":{"listTool":"shd_agents_overview","listArgs":{},"paths":["data.agents","data.user_agents","data"],"sort":"asc"},"status-page":{"listTool":"shd_get_status_page_monitors","listArgs":{"environment":"dev"},"readTool":"shd_get_status_page_monitor_history","detailKey":"monitor_id","detailArgs":{"limit":20},"paths":["data"],"nested":"monitors","sort":"asc"},"airbase":{"listTool":"shd_airbase_tables","listArgs":{},"readTool":"shd_airbase_schema","detailKey":"table","paths":["data.tables","data"],"contextRequired":true,"sort":"asc"},"notes":{"listTool":"shd_list_note_pages","listArgs":{"limit":100},"readTool":"shd_get_note_page","detailKey":"page_id","paths":["data"],"sort":"desc"},"project-overview":{"listTool":"shd_get_project_context","listArgs":{"include":["summary","tasks","discussions","documents","finance","terms","agents"],"limit_per_section":100},"paths":["data.sections.tasks","data.sections.discussions","data.sections.documents","data.sections.finance","data.sections.terms"],"combinePaths":true,"contextRequired":true,"sort":"desc"},"files":{"listTool":"shd_list_files","readTool":"shd_get_file_link","detailKey":"path","detailArgs":{"download":false},"detailSourceArgs":["project_code"],"paths":["data"],"contextRequired":true,"sort":"desc"},"proposals":{"listTool":"shd_list_proposals","listArgs":{"limit":100},"readTool":"shd_get_proposal","detailKey":"proposal_id","detailSourceArgs":[],"paths":["data"],"sort":"desc"},"terms":{"listTool":"shd_list_terms_documents","readTool":"shd_get_terms_document","detailKey":"document_id","detailSourceArgs":["project_code"],"paths":["data"],"contextRequired":true,"sort":"desc"},"activity":{"listTool":"shd_get_realtime_events","listArgs":{"module":"notifications","limit":100},"paths":["data.events","events","data"],"sort":"desc"},"organizations":{"listTool":"shd_admin_list_organizations","listArgs":{"limit":100},"readTool":"shd_admin_get_organization_members","detailKey":"organization_id","detailSourceArgs":[],"paths":["data"],"sort":"asc"},"gitea":{"listTool":"shd_list_gitea_issues","listArgs":{"target":"site","limit":100},"paths":["data"],"sort":"desc"},"schemes":{"listTool":"shd_list_pdf_scheme_editor_documents","readTool":"shd_get_pdf_scheme_editor_document","detailKey":"document","detailSourceArgs":["project"],"paths":["data"],"contextRequired":true,"sort":"desc"},"task-kanban":{"listTool":"shd_list_tasks","listArgs":{"limit":100},"readTool":"shd_get_task","detailKey":"task_id","detailSourceArgs":[],"paths":["data"],"view":"kanban","groupBy":"status","sort":"asc"},"team-workload":{"listTool":"shd_get_task_workload","listArgs":{"period":"month"},"paths":["data.rows","data.workload","data.assignees","data"],"view":"workload","sort":"desc"},"project-timeline":{"listTool":"shd_list_tasks","listArgs":{"limit":100},"paths":["data"],"view":"timeline","sort":"asc"},"crm-funnel":{"listTool":"shd_list_crm","listArgs":{"section":"deals","limit":100},"readTool":"shd_get_crm_entity","detailKey":"entity_id","detailSourceArgs":["section"],"paths":["data"],"view":"funnel","groupBy":"stage","sort":"desc"},"finance-dashboard":{"listTool":"shd_list_finance_documents","listArgs":{"limit":100},"paths":["data"],"view":"dashboard","sort":"desc"},"proposal-approvals":{"listTool":"shd_list_proposals","listArgs":{"limit":100},"readTool":"shd_get_proposal_approval","detailKey":"proposal_id","detailSourceArgs":[],"paths":["data"],"view":"approval","sort":"desc"},"documents-completeness":{"listTool":"shd_list_pdf_scheme_editor_documents","readTool":"shd_get_pdf_scheme_editor_document_completeness","detailKey":"document_id","detailSourceArgs":["project_code"],"paths":["data"],"view":"completeness","contextRequired":true,"contextKeys":["project_code"],"sort":"desc"},"agents-health":{"listTool":"shd_agents_overview","paths":["data.agents","data.user_agents","data"],"view":"health","sort":"asc"},"schedule-calendar":{"listTool":"shd_get_scheduling_overview","listArgs":{"limit":100},"readTool":"shd_list_scheduling_bookings","detailKey":"booking_id","detailArgs":{"limit":1},"paths":["data.bookings","data.upcoming_bookings","data"],"view":"calendar","sort":"asc"},"acl-matrix":{"listTool":"shd_list_organization_members","listArgs":{"limit":100},"paths":["data"],"view":"matrix","contextRequired":true,"contextKeys":["organization_id"],"contextAll":true,"sort":"asc"},"inventory-warnings":{"listTool":"shd_list_inventory_items","listArgs":{"limit":100},"readTool":"shd_get_inventory_item","detailKey":"item_id","detailSourceArgs":[],"paths":["data"],"view":"warnings","sort":"asc"},"gitea-board":{"listTool":"shd_list_gitea_issues","listArgs":{"target":"site","limit":100},"paths":["data"],"view":"kanban","groupBy":"state","sort":"asc"},"schemes-progress":{"listTool":"shd_list_pdf_scheme_editor_documents","readTool":"shd_get_pdf_scheme_editor_document","detailKey":"document","detailSourceArgs":["project"],"paths":["data"],"view":"progress","contextRequired":true,"contextKeys":["project"],"sort":"desc"},"notes-tree":{"listTool":"shd_list_note_spaces","listArgs":{"limit":100},"readTool":"shd_get_note_space_tree","detailKey":"space_id","detailSourceArgs":[],"paths":["data"],"view":"tree","sort":"asc"},"airbase-preview":{"listTool":"shd_airbase_records","listArgs":{"limit":100,"include_fields":true,"include_view_meta":true},"paths":["data.records","data"],"view":"preview","contextRequired":true,"contextSets":[["base","project_code"],["table"]],"sort":"asc"},"documents":{"listTool":"shd_list_contracts","listArgs":{"archived":false,"limit":100},"readTool":"shd_get_contract","detailKey":"contract_id","paths":["data"],"sort":"desc"},"tasks":{"listTool":"shd_list_tasks","listArgs":{"archived":false,"limit":100},"readTool":"shd_get_task","detailKey":"task_id","paths":["data"],"sort":"asc"},"finance":{"listTool":"shd_list_finance_documents","listArgs":{"archived":false,"limit":100},"readTool":"shd_get_finance_document","detailKey":"document_id","paths":["data"],"sort":"desc"},"crm":{"listTool":"shd_list_crm","listArgs":{"limit":100},"readTool":"shd_get_crm_entity","detailKey":"entity_id","detailSourceArgs":["section"],"paths":["data"],"sort":"desc"},"pdf-scheme-editor":{"listTool":"shd_list_pdf_scheme_editor_documents","readTool":"shd_get_pdf_scheme_editor_document","detailKey":"document","detailSourceArgs":["project"],"paths":["data"],"contextRequired":true,"sort":"desc"}}}; + var M=MODULE_CONFIG.copy; + var S=MODULE_CONFIG.defaults; var pending=new Map(),nextId=1,rows=[],state={module:DEFAULT_MODULE,config:Object.assign({},S[DEFAULT_MODULE]),lang:'ru',busy:false}; var e={title:document.getElementById('title'),desc:document.getElementById('desc'),search:document.getElementById('search'),refresh:document.getElementById('refresh'),status:document.getElementById('status'),summary:document.getElementById('summary'),tableWrap:document.querySelector('.table-wrap'),visual:document.getElementById('visual'),rows:document.getElementById('rows'),empty:document.getElementById('empty'),details:document.getElementById('details'),detailTitle:document.getElementById('detail-title'),detailSub:document.getElementById('detail-sub'),grid:document.getElementById('grid'),close:document.getElementById('close'),ht:document.getElementById('head-title'),hs:document.getElementById('head-status'),hd:document.getElementById('head-date'),hv:document.getElementById('head-value')}; function lang(){var x=typeof window!=='undefined'&&window.openai&&window.openai.locale;x=String(x||document.documentElement.lang||'ru').toLowerCase();return x.indexOf('en')===0?'en':'ru'} @@ -150,7 +87,7 @@ function field(x,keys){for(var i=0;i @@ -37,58 +38,25 @@ -
+
SHD MCP

SHD

-
+