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 @@
-
+