aimeat 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/locales/en.json +212 -6
  2. package/dist/locales/fi.json +212 -6
  3. package/dist/public/css/views/agents-detail.css +563 -0
  4. package/dist/public/css/views/foundry.css +1 -0
  5. package/dist/public/css/views/marketplace.css +1 -0
  6. package/dist/public/css/views/profile.css +2 -0
  7. package/dist/public/js/services/admin.js +13 -0
  8. package/dist/public/js/services/agent-activity.js +20 -0
  9. package/dist/public/js/services/agent-capabilities.js +15 -0
  10. package/dist/public/js/services/agent-directives.js +28 -0
  11. package/dist/public/js/services/agent-messages.js +34 -0
  12. package/dist/public/js/services/agent-services.js +17 -0
  13. package/dist/public/js/services/agent-tasks.js +46 -0
  14. package/dist/public/js/services/memory.js +6 -3
  15. package/dist/public/js/services/sharing-groups.js +51 -0
  16. package/dist/public/spa.html +21 -2
  17. package/dist/public/views/admin/agent-tasks-tab.js +156 -0
  18. package/dist/public/views/admin/federation-tab.js +2 -2
  19. package/dist/public/views/admin/memory-tab.js +1 -0
  20. package/dist/public/views/admin/overview-tab.js +25 -0
  21. package/dist/public/views/admin/sharing-groups-tab.js +86 -0
  22. package/dist/public/views/admin.js +4 -0
  23. package/dist/public/views/profile/access-tab.js +510 -5
  24. package/dist/public/views/profile/agents-activity-subtab.js +242 -0
  25. package/dist/public/views/profile/agents-capabilities-subtab.js +165 -0
  26. package/dist/public/views/profile/agents-directives-subtab.js +292 -0
  27. package/dist/public/views/profile/agents-messages-subtab.js +222 -0
  28. package/dist/public/views/profile/agents-services-subtab.js +111 -0
  29. package/dist/public/views/profile/agents-tab.js +94 -47
  30. package/dist/public/views/profile/agents-tasks-subtab.js +254 -0
  31. package/dist/public/views/profile/knowledge-tab.js +5 -5
  32. package/dist/public/views/profile/memory-tab.js +90 -25
  33. package/dist/src/config.d.ts +5 -0
  34. package/dist/src/config.d.ts.map +1 -1
  35. package/dist/src/config.js +9 -2
  36. package/dist/src/config.js.map +1 -1
  37. package/dist/src/mcp/agent-capabilities.d.ts +18 -0
  38. package/dist/src/mcp/agent-capabilities.d.ts.map +1 -0
  39. package/dist/src/mcp/agent-capabilities.js +85 -0
  40. package/dist/src/mcp/agent-capabilities.js.map +1 -0
  41. package/dist/src/mcp/agent-messages.d.ts +15 -0
  42. package/dist/src/mcp/agent-messages.d.ts.map +1 -0
  43. package/dist/src/mcp/agent-messages.js +81 -0
  44. package/dist/src/mcp/agent-messages.js.map +1 -0
  45. package/dist/src/mcp/agent-tasks.d.ts +16 -0
  46. package/dist/src/mcp/agent-tasks.d.ts.map +1 -0
  47. package/dist/src/mcp/agent-tasks.js +350 -0
  48. package/dist/src/mcp/agent-tasks.js.map +1 -0
  49. package/dist/src/mcp/core.d.ts.map +1 -1
  50. package/dist/src/mcp/core.js +8 -4
  51. package/dist/src/mcp/core.js.map +1 -1
  52. package/dist/src/mcp/index.d.ts.map +1 -1
  53. package/dist/src/mcp/index.js +8 -0
  54. package/dist/src/mcp/index.js.map +1 -1
  55. package/dist/src/mcp/memory-extended.js +1 -1
  56. package/dist/src/mcp/memory-extended.js.map +1 -1
  57. package/dist/src/mcp/sharing-groups.d.ts +16 -0
  58. package/dist/src/mcp/sharing-groups.d.ts.map +1 -0
  59. package/dist/src/mcp/sharing-groups.js +240 -0
  60. package/dist/src/mcp/sharing-groups.js.map +1 -0
  61. package/dist/src/models/agent-capabilities-schemas.d.ts +20 -0
  62. package/dist/src/models/agent-capabilities-schemas.d.ts.map +1 -0
  63. package/dist/src/models/agent-capabilities-schemas.js +16 -0
  64. package/dist/src/models/agent-capabilities-schemas.js.map +1 -0
  65. package/dist/src/models/agent-directives-schemas.d.ts +44 -0
  66. package/dist/src/models/agent-directives-schemas.d.ts.map +1 -0
  67. package/dist/src/models/agent-directives-schemas.js +41 -0
  68. package/dist/src/models/agent-directives-schemas.js.map +1 -0
  69. package/dist/src/models/agent-message-schemas.d.ts +32 -0
  70. package/dist/src/models/agent-message-schemas.d.ts.map +1 -0
  71. package/dist/src/models/agent-message-schemas.js +25 -0
  72. package/dist/src/models/agent-message-schemas.js.map +1 -0
  73. package/dist/src/models/agent-task-schemas.d.ts +133 -0
  74. package/dist/src/models/agent-task-schemas.d.ts.map +1 -0
  75. package/dist/src/models/agent-task-schemas.js +84 -0
  76. package/dist/src/models/agent-task-schemas.js.map +1 -0
  77. package/dist/src/models/schemas.d.ts +5 -0
  78. package/dist/src/models/schemas.d.ts.map +1 -1
  79. package/dist/src/models/schemas.js +5 -3
  80. package/dist/src/models/schemas.js.map +1 -1
  81. package/dist/src/models/sharing-group-schemas.d.ts +52 -0
  82. package/dist/src/models/sharing-group-schemas.d.ts.map +1 -0
  83. package/dist/src/models/sharing-group-schemas.js +46 -0
  84. package/dist/src/models/sharing-group-schemas.js.map +1 -0
  85. package/dist/src/routes/admin-agent-tasks.d.ts +12 -0
  86. package/dist/src/routes/admin-agent-tasks.d.ts.map +1 -0
  87. package/dist/src/routes/admin-agent-tasks.js +62 -0
  88. package/dist/src/routes/admin-agent-tasks.js.map +1 -0
  89. package/dist/src/routes/admin-monitoring.d.ts +2 -1
  90. package/dist/src/routes/admin-monitoring.d.ts.map +1 -1
  91. package/dist/src/routes/admin-monitoring.js +75 -2
  92. package/dist/src/routes/admin-monitoring.js.map +1 -1
  93. package/dist/src/routes/admin-sharing-groups.d.ts +12 -0
  94. package/dist/src/routes/admin-sharing-groups.d.ts.map +1 -0
  95. package/dist/src/routes/admin-sharing-groups.js +37 -0
  96. package/dist/src/routes/admin-sharing-groups.js.map +1 -0
  97. package/dist/src/routes/admin.d.ts +1 -1
  98. package/dist/src/routes/admin.d.ts.map +1 -1
  99. package/dist/src/routes/admin.js +2 -2
  100. package/dist/src/routes/admin.js.map +1 -1
  101. package/dist/src/routes/agent-activity.d.ts +17 -0
  102. package/dist/src/routes/agent-activity.d.ts.map +1 -0
  103. package/dist/src/routes/agent-activity.js +130 -0
  104. package/dist/src/routes/agent-activity.js.map +1 -0
  105. package/dist/src/routes/agent-capabilities.d.ts +17 -0
  106. package/dist/src/routes/agent-capabilities.d.ts.map +1 -0
  107. package/dist/src/routes/agent-capabilities.js +106 -0
  108. package/dist/src/routes/agent-capabilities.js.map +1 -0
  109. package/dist/src/routes/agent-directives.d.ts +17 -0
  110. package/dist/src/routes/agent-directives.d.ts.map +1 -0
  111. package/dist/src/routes/agent-directives.js +206 -0
  112. package/dist/src/routes/agent-directives.js.map +1 -0
  113. package/dist/src/routes/agent-integration.d.ts +17 -0
  114. package/dist/src/routes/agent-integration.d.ts.map +1 -0
  115. package/dist/src/routes/agent-integration.js +169 -0
  116. package/dist/src/routes/agent-integration.js.map +1 -0
  117. package/dist/src/routes/agent-messages.d.ts +17 -0
  118. package/dist/src/routes/agent-messages.d.ts.map +1 -0
  119. package/dist/src/routes/agent-messages.js +168 -0
  120. package/dist/src/routes/agent-messages.js.map +1 -0
  121. package/dist/src/routes/agent-tasks.d.ts +24 -0
  122. package/dist/src/routes/agent-tasks.d.ts.map +1 -0
  123. package/dist/src/routes/agent-tasks.js +425 -0
  124. package/dist/src/routes/agent-tasks.js.map +1 -0
  125. package/dist/src/routes/capabilities.js +4 -4
  126. package/dist/src/routes/capabilities.js.map +1 -1
  127. package/dist/src/routes/cortex.d.ts.map +1 -1
  128. package/dist/src/routes/cortex.js +1 -2
  129. package/dist/src/routes/cortex.js.map +1 -1
  130. package/dist/src/routes/extensions.d.ts.map +1 -1
  131. package/dist/src/routes/extensions.js +1 -2
  132. package/dist/src/routes/extensions.js.map +1 -1
  133. package/dist/src/routes/generator.d.ts.map +1 -1
  134. package/dist/src/routes/generator.js +33 -5
  135. package/dist/src/routes/generator.js.map +1 -1
  136. package/dist/src/routes/knowledge.d.ts.map +1 -1
  137. package/dist/src/routes/knowledge.js +4 -3
  138. package/dist/src/routes/knowledge.js.map +1 -1
  139. package/dist/src/routes/memory.d.ts.map +1 -1
  140. package/dist/src/routes/memory.js +8 -4
  141. package/dist/src/routes/memory.js.map +1 -1
  142. package/dist/src/routes/permissions.js +1 -1
  143. package/dist/src/routes/permissions.js.map +1 -1
  144. package/dist/src/routes/prompts.d.ts +9 -0
  145. package/dist/src/routes/prompts.d.ts.map +1 -1
  146. package/dist/src/routes/prompts.js +57 -1
  147. package/dist/src/routes/prompts.js.map +1 -1
  148. package/dist/src/routes/sharing-groups.d.ts +20 -0
  149. package/dist/src/routes/sharing-groups.d.ts.map +1 -0
  150. package/dist/src/routes/sharing-groups.js +297 -0
  151. package/dist/src/routes/sharing-groups.js.map +1 -0
  152. package/dist/src/routes/stats.d.ts +1 -0
  153. package/dist/src/routes/stats.d.ts.map +1 -1
  154. package/dist/src/routes/stats.js +26 -1
  155. package/dist/src/routes/stats.js.map +1 -1
  156. package/dist/src/routes/storage-files.d.ts.map +1 -1
  157. package/dist/src/routes/storage-files.js +4 -1
  158. package/dist/src/routes/storage-files.js.map +1 -1
  159. package/dist/src/routes/work.d.ts.map +1 -1
  160. package/dist/src/routes/work.js +3 -0
  161. package/dist/src/routes/work.js.map +1 -1
  162. package/dist/src/schemas/knowledge-package.js +1 -1
  163. package/dist/src/schemas/knowledge-package.js.map +1 -1
  164. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  165. package/dist/src/server-bootstrap/routes-loader.js +21 -1
  166. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  167. package/dist/src/services/activity-recorder.d.ts +16 -0
  168. package/dist/src/services/activity-recorder.d.ts.map +1 -0
  169. package/dist/src/services/activity-recorder.js +59 -0
  170. package/dist/src/services/activity-recorder.js.map +1 -0
  171. package/dist/src/services/config-schema.d.ts.map +1 -1
  172. package/dist/src/services/config-schema.js +5 -0
  173. package/dist/src/services/config-schema.js.map +1 -1
  174. package/dist/src/services/consent.d.ts +1 -1
  175. package/dist/src/services/consent.d.ts.map +1 -1
  176. package/dist/src/services/consent.js +28 -1
  177. package/dist/src/services/consent.js.map +1 -1
  178. package/dist/src/services/core-jobs.d.ts.map +1 -1
  179. package/dist/src/services/core-jobs.js +5 -0
  180. package/dist/src/services/core-jobs.js.map +1 -1
  181. package/dist/src/services/job-seeding.d.ts.map +1 -1
  182. package/dist/src/services/job-seeding.js +2 -0
  183. package/dist/src/services/job-seeding.js.map +1 -1
  184. package/dist/src/services/stats.d.ts +1 -0
  185. package/dist/src/services/stats.d.ts.map +1 -1
  186. package/dist/src/services/stats.js +2 -1
  187. package/dist/src/services/stats.js.map +1 -1
  188. package/dist/src/services/task-stall-detector.d.ts +10 -0
  189. package/dist/src/services/task-stall-detector.d.ts.map +1 -0
  190. package/dist/src/services/task-stall-detector.js +38 -0
  191. package/dist/src/services/task-stall-detector.js.map +1 -0
  192. package/dist/src/services/work-task-bridge.d.ts +10 -0
  193. package/dist/src/services/work-task-bridge.d.ts.map +1 -0
  194. package/dist/src/services/work-task-bridge.js +53 -0
  195. package/dist/src/services/work-task-bridge.js.map +1 -0
  196. package/dist/src/storage/interface.d.ts +170 -5
  197. package/dist/src/storage/interface.d.ts.map +1 -1
  198. package/dist/src/storage/providers/mongodb/index.d.ts +95 -2
  199. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  200. package/dist/src/storage/providers/mongodb/index.js +657 -6
  201. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  202. package/dist/src/storage/providers/sqlite/index.d.ts +73 -1
  203. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  204. package/dist/src/storage/providers/sqlite/index.js +131 -3
  205. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  206. package/dist/src/storage/providers/sqlite/repos/agent-activity.d.ts +14 -0
  207. package/dist/src/storage/providers/sqlite/repos/agent-activity.d.ts.map +1 -0
  208. package/dist/src/storage/providers/sqlite/repos/agent-activity.js +44 -0
  209. package/dist/src/storage/providers/sqlite/repos/agent-activity.js.map +1 -0
  210. package/dist/src/storage/providers/sqlite/repos/agent-directives.d.ts +14 -0
  211. package/dist/src/storage/providers/sqlite/repos/agent-directives.d.ts.map +1 -0
  212. package/dist/src/storage/providers/sqlite/repos/agent-directives.js +65 -0
  213. package/dist/src/storage/providers/sqlite/repos/agent-directives.js.map +1 -0
  214. package/dist/src/storage/providers/sqlite/repos/agent-message.d.ts +28 -0
  215. package/dist/src/storage/providers/sqlite/repos/agent-message.d.ts.map +1 -0
  216. package/dist/src/storage/providers/sqlite/repos/agent-message.js +93 -0
  217. package/dist/src/storage/providers/sqlite/repos/agent-message.js.map +1 -0
  218. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts +45 -0
  219. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -0
  220. package/dist/src/storage/providers/sqlite/repos/agent-task.js +155 -0
  221. package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -0
  222. package/dist/src/storage/providers/sqlite/repos/sharing-group.d.ts +16 -0
  223. package/dist/src/storage/providers/sqlite/repos/sharing-group.d.ts.map +1 -0
  224. package/dist/src/storage/providers/sqlite/repos/sharing-group.js +68 -0
  225. package/dist/src/storage/providers/sqlite/repos/sharing-group.js.map +1 -0
  226. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  227. package/dist/src/storage/providers/sqlite/schema.js +102 -0
  228. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  229. package/dist/src/storage/repositories/agent-activity.repository.d.ts +15 -0
  230. package/dist/src/storage/repositories/agent-activity.repository.d.ts.map +1 -0
  231. package/dist/src/storage/repositories/agent-activity.repository.js +8 -0
  232. package/dist/src/storage/repositories/agent-activity.repository.js.map +1 -0
  233. package/dist/src/storage/repositories/agent-directives.repository.d.ts +15 -0
  234. package/dist/src/storage/repositories/agent-directives.repository.d.ts.map +1 -0
  235. package/dist/src/storage/repositories/agent-directives.repository.js +8 -0
  236. package/dist/src/storage/repositories/agent-directives.repository.js.map +1 -0
  237. package/dist/src/storage/repositories/agent-message.repository.d.ts +29 -0
  238. package/dist/src/storage/repositories/agent-message.repository.d.ts.map +1 -0
  239. package/dist/src/storage/repositories/agent-message.repository.js +8 -0
  240. package/dist/src/storage/repositories/agent-message.repository.js.map +1 -0
  241. package/dist/src/storage/repositories/agent-task.repository.d.ts +46 -0
  242. package/dist/src/storage/repositories/agent-task.repository.d.ts.map +1 -0
  243. package/dist/src/storage/repositories/agent-task.repository.js +8 -0
  244. package/dist/src/storage/repositories/agent-task.repository.js.map +1 -0
  245. package/dist/src/storage/repositories/index.d.ts +5 -0
  246. package/dist/src/storage/repositories/index.d.ts.map +1 -1
  247. package/dist/src/storage/repositories/sharing-group.repository.d.ts +17 -0
  248. package/dist/src/storage/repositories/sharing-group.repository.d.ts.map +1 -0
  249. package/dist/src/storage/repositories/sharing-group.repository.js +8 -0
  250. package/dist/src/storage/repositories/sharing-group.repository.js.map +1 -0
  251. package/package.json +1 -1
  252. package/prisma/schema.prisma +102 -0
@@ -0,0 +1,254 @@
1
+ /**
2
+ * @file agents-tasks-subtab.js
3
+ * @description Task queue sub-tab for agent detail view.
4
+ * Shows queued, active, and completed tasks with inline creation form.
5
+ * Listens for live updates to refresh task data automatically.
6
+ * @structure
7
+ * - AgentTasksSubtab (default export) -- main component
8
+ * - TaskItem -- individual task row with expand/collapse
9
+ * - TaskCreateForm -- inline task creation form
10
+ * @version-history
11
+ * v1.0.0 -- 2026-05-21 -- Initial creation for Agent Dashboard Phase 1
12
+ */
13
+ import { h } from 'preact';
14
+ import { useState, useEffect, useRef } from 'preact/hooks';
15
+ import htm from 'htm';
16
+ const html = htm.bind(h);
17
+ import { t } from '/js/i18n.js';
18
+ import { timeAgo } from '/js/utils.js';
19
+ import { listTasks, createTask, deleteTask, listEvents } from '/js/services/agent-tasks.js';
20
+
21
+ function statusLabel(status) {
22
+ const key = `profile.agents.tasks.status.${status}`;
23
+ const val = t(key);
24
+ // Fallback to capitalized status if translation key not found
25
+ return val !== key ? val : status.charAt(0).toUpperCase() + status.slice(1);
26
+ }
27
+
28
+ function TaskItem({ task, agentName, showToast }) {
29
+ const [expanded, setExpanded] = useState(false);
30
+ const [events, setEvents] = useState(null);
31
+ const [loadingEvents, setLoadingEvents] = useState(false);
32
+
33
+ async function handleExpand(e) {
34
+ e.stopPropagation();
35
+ if (expanded) {
36
+ setExpanded(false);
37
+ return;
38
+ }
39
+ setExpanded(true);
40
+ if (!events) {
41
+ setLoadingEvents(true);
42
+ try {
43
+ const resp = await listEvents(agentName, task.id);
44
+ setEvents(resp?.data?.events || []);
45
+ } catch {
46
+ setEvents([]);
47
+ }
48
+ setLoadingEvents(false);
49
+ }
50
+ }
51
+
52
+ async function handleDelete(e) {
53
+ e.stopPropagation();
54
+ try {
55
+ await deleteTask(agentName, task.id);
56
+ const msg = t('profile.agents.tasks.deleted');
57
+ showToast(msg !== 'profile.agents.tasks.deleted' ? msg : 'Task deleted');
58
+ } catch (err) {
59
+ showToast(err.message || 'Failed to delete task', true);
60
+ }
61
+ }
62
+
63
+ return html`
64
+ <div>
65
+ <div class="agd-task-item" onClick=${handleExpand}>
66
+ <span class="agd-task-title">${task.title || task.id}</span>
67
+ <div class="agd-task-meta">
68
+ ${task.created_at && html`<span class="agd-task-time">${timeAgo(task.created_at)}</span>`}
69
+ <span class="agd-status agd-status-${task.status || 'draft'}">${statusLabel(task.status || 'draft')}</span>
70
+ </div>
71
+ </div>
72
+ ${expanded && html`
73
+ <div class="agd-task-expanded">
74
+ ${task.description && html`<div class="agd-task-desc">${task.description}</div>`}
75
+ ${task.scope && html`
76
+ <div class="agd-task-desc">
77
+ <strong>${t('profile.agents.tasks.scope') !== 'profile.agents.tasks.scope' ? t('profile.agents.tasks.scope') : 'Scope'}:</strong> ${Array.isArray(task.scope) ? task.scope.join(', ') : task.scope}
78
+ </div>
79
+ `}
80
+ ${loadingEvents && html`<div class="agd-empty">${t('profile.loading')}</div>`}
81
+ ${events && events.length > 0 && html`
82
+ <div class="agd-event-log">
83
+ ${events.map(ev => html`
84
+ <div class="agd-event-item" key=${ev.id || ev.timestamp}>
85
+ <span class="agd-event-time">${ev.timestamp ? timeAgo(ev.timestamp) : ''}</span>
86
+ <span class="agd-event-type">${ev.type || ev.event || ''}</span>
87
+ <span>${ev.message || ev.data || ''}</span>
88
+ </div>
89
+ `)}
90
+ </div>
91
+ `}
92
+ ${events && events.length === 0 && html`
93
+ <div class="agd-empty">${t('profile.agents.tasks.noEvents') !== 'profile.agents.tasks.noEvents' ? t('profile.agents.tasks.noEvents') : 'No events recorded'}</div>
94
+ `}
95
+ <div class="agd-task-actions">
96
+ <button class="btn-danger btn-sm" onClick=${handleDelete}>
97
+ ${t('profile.agents.tasks.delete') !== 'profile.agents.tasks.delete' ? t('profile.agents.tasks.delete') : 'Delete'}
98
+ </button>
99
+ </div>
100
+ </div>
101
+ `}
102
+ </div>
103
+ `;
104
+ }
105
+
106
+ function TaskCreateForm({ agentName, showToast, onCreated, onCancel }) {
107
+ const [title, setTitle] = useState('');
108
+ const [description, setDescription] = useState('');
109
+ const [status, setStatus] = useState('queued');
110
+ const [saving, setSaving] = useState(false);
111
+
112
+ async function handleSubmit(e) {
113
+ e.preventDefault();
114
+ if (!title.trim()) return;
115
+ setSaving(true);
116
+ try {
117
+ await createTask(agentName, {
118
+ title: title.trim(),
119
+ description: description.trim() || undefined,
120
+ status,
121
+ });
122
+ const msg = t('profile.agents.tasks.created');
123
+ showToast(msg !== 'profile.agents.tasks.created' ? msg : 'Task created');
124
+ onCreated();
125
+ } catch (err) {
126
+ showToast(err.message || 'Failed to create task', true);
127
+ }
128
+ setSaving(false);
129
+ }
130
+
131
+ return html`
132
+ <form class="agd-create-form" onSubmit=${handleSubmit}>
133
+ <div class="agd-form-field">
134
+ <label>${t('profile.agents.tasks.titleLabel') !== 'profile.agents.tasks.titleLabel' ? t('profile.agents.tasks.titleLabel') : 'Title'}</label>
135
+ <input type="text" value=${title} onInput=${(e) => setTitle(e.target.value)}
136
+ placeholder=${t('profile.agents.tasks.titlePlaceholder') !== 'profile.agents.tasks.titlePlaceholder' ? t('profile.agents.tasks.titlePlaceholder') : 'What should the agent do?'}
137
+ required />
138
+ </div>
139
+ <div class="agd-form-field">
140
+ <label>${t('profile.agents.tasks.descriptionLabel') !== 'profile.agents.tasks.descriptionLabel' ? t('profile.agents.tasks.descriptionLabel') : 'Description'}</label>
141
+ <textarea value=${description} onInput=${(e) => setDescription(e.target.value)}
142
+ placeholder=${t('profile.agents.tasks.descriptionPlaceholder') !== 'profile.agents.tasks.descriptionPlaceholder' ? t('profile.agents.tasks.descriptionPlaceholder') : 'Detailed instructions (optional)'}></textarea>
143
+ </div>
144
+ <div class="agd-form-field">
145
+ <label>${t('profile.agents.tasks.initialStatus') !== 'profile.agents.tasks.initialStatus' ? t('profile.agents.tasks.initialStatus') : 'Initial status'}</label>
146
+ <select value=${status} onChange=${(e) => setStatus(e.target.value)}>
147
+ <option value="draft">${statusLabel('draft')}</option>
148
+ <option value="queued">${statusLabel('queued')}</option>
149
+ </select>
150
+ </div>
151
+ <div class="agd-form-actions">
152
+ <button type="submit" class="btn-primary btn-sm" disabled=${saving || !title.trim()}>
153
+ ${saving
154
+ ? (t('profile.agents.tasks.creating') !== 'profile.agents.tasks.creating' ? t('profile.agents.tasks.creating') : 'Creating...')
155
+ : (t('profile.agents.tasks.createBtn') !== 'profile.agents.tasks.createBtn' ? t('profile.agents.tasks.createBtn') : 'Create Task')}
156
+ </button>
157
+ <button type="button" class="btn-outline btn-sm" onClick=${onCancel}>
158
+ ${t('profile.agents.scopeUi.cancel')}
159
+ </button>
160
+ </div>
161
+ </form>
162
+ `;
163
+ }
164
+
165
+ export default function AgentTasksSubtab({ agentName, session, showToast }) {
166
+ const [tasks, setTasks] = useState(null);
167
+ const [showCreate, setShowCreate] = useState(false);
168
+ const [error, setError] = useState(null);
169
+
170
+ async function loadTasks() {
171
+ try {
172
+ const resp = await listTasks(agentName);
173
+ setTasks(resp?.data?.tasks || []);
174
+ setError(null);
175
+ } catch (err) {
176
+ setError(err.message);
177
+ setTasks([]);
178
+ }
179
+ }
180
+
181
+ useEffect(() => {
182
+ loadTasks();
183
+ }, [agentName]);
184
+
185
+ // Live update listener
186
+ const loadRef = useRef(loadTasks);
187
+ loadRef.current = loadTasks;
188
+ useEffect(() => {
189
+ const handler = () => loadRef.current();
190
+ window.addEventListener('aimeat-live-update', handler);
191
+ return () => window.removeEventListener('aimeat-live-update', handler);
192
+ }, []);
193
+
194
+ function handleCreated() {
195
+ setShowCreate(false);
196
+ loadTasks();
197
+ }
198
+
199
+ if (tasks === null) {
200
+ return html`<div class="agd-empty">${t('profile.loading')}</div>`;
201
+ }
202
+
203
+ // Group tasks by status category
204
+ const active = tasks.filter(t => t.status === 'active');
205
+ const queued = tasks.filter(t => t.status === 'queued' || t.status === 'draft');
206
+ const completed = tasks.filter(t => t.status === 'done' || t.status === 'failed' || t.status === 'stalled');
207
+
208
+ return html`
209
+ <div>
210
+ <div class="agd-section-header">
211
+ <span class="agd-section-title">
212
+ ${t('profile.agents.tasks.title') !== 'profile.agents.tasks.title' ? t('profile.agents.tasks.title') : 'Tasks'}
213
+ ${tasks.length > 0 && html` (${tasks.length})`}
214
+ </span>
215
+ <button class="btn-outline btn-sm" onClick=${(e) => { e.stopPropagation(); setShowCreate(!showCreate); }}>
216
+ ${showCreate ? '-' : '+'} ${t('profile.agents.tasks.newTask') !== 'profile.agents.tasks.newTask' ? t('profile.agents.tasks.newTask') : 'New Task'}
217
+ </button>
218
+ </div>
219
+
220
+ ${showCreate && html`
221
+ <${TaskCreateForm} agentName=${agentName} showToast=${showToast} onCreated=${handleCreated} onCancel=${() => setShowCreate(false)} />
222
+ `}
223
+
224
+ ${error && html`<div class="agd-empty">${error}</div>`}
225
+
226
+ ${active.length > 0 && html`
227
+ <div class="agd-section-title" style="margin-top:0.5rem;margin-bottom:0.25rem">
228
+ ${t('profile.agents.tasks.activeSection') !== 'profile.agents.tasks.activeSection' ? t('profile.agents.tasks.activeSection') : 'Active'}
229
+ </div>
230
+ ${active.map(task => html`<${TaskItem} key=${task.id} task=${task} agentName=${agentName} showToast=${showToast} />`)}
231
+ `}
232
+
233
+ ${queued.length > 0 && html`
234
+ <div class="agd-section-title" style="margin-top:0.5rem;margin-bottom:0.25rem">
235
+ ${t('profile.agents.tasks.queuedSection') !== 'profile.agents.tasks.queuedSection' ? t('profile.agents.tasks.queuedSection') : 'Queued'}
236
+ </div>
237
+ ${queued.map(task => html`<${TaskItem} key=${task.id} task=${task} agentName=${agentName} showToast=${showToast} />`)}
238
+ `}
239
+
240
+ ${completed.length > 0 && html`
241
+ <div class="agd-section-title" style="margin-top:0.5rem;margin-bottom:0.25rem">
242
+ ${t('profile.agents.tasks.completedSection') !== 'profile.agents.tasks.completedSection' ? t('profile.agents.tasks.completedSection') : 'Completed'}
243
+ </div>
244
+ ${completed.map(task => html`<${TaskItem} key=${task.id} task=${task} agentName=${agentName} showToast=${showToast} />`)}
245
+ `}
246
+
247
+ ${tasks.length === 0 && !showCreate && html`
248
+ <div class="agd-empty">
249
+ ${t('profile.agents.tasks.empty') !== 'profile.agents.tasks.empty' ? t('profile.agents.tasks.empty') : 'No tasks yet. Create one to get started.'}
250
+ </div>
251
+ `}
252
+ </div>
253
+ `;
254
+ }
@@ -381,10 +381,10 @@ export default function KnowledgeTab({ session, showToast, onStats }) {
381
381
  finally { setLoadingEntries(null); }
382
382
  }, [expandedPkg, packages, entryData]);
383
383
 
384
- /* ── Cycle visibility: private → owner → public → private ── */
385
- const cycleVis = ['private', 'owner', 'public'];
386
- const visColor = { private: '#c084fc', owner: '#60a5fa', public: '#4ade80' };
387
- const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', public: 'rgba(0,200,100,.2)' };
384
+ /* ── Cycle visibility: private → owner → group → public → private ── */
385
+ const cycleVis = ['private', 'owner', 'group', 'public'];
386
+ const visColor = { private: '#c084fc', owner: '#60a5fa', group: '#10b981', public: '#4ade80' };
387
+ const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', group: 'rgba(16,185,129,.2)', public: 'rgba(0,200,100,.2)' };
388
388
 
389
389
  /* ── Scroll to entry by key (matches full or short key) ── */
390
390
  const scrollToEntry = useCallback((entryKey) => {
@@ -468,7 +468,7 @@ export default function KnowledgeTab({ session, showToast, onStats }) {
468
468
  const rawData = entryData[entry.key] ?? entry.value;
469
469
  const val = formatEntryValue(rawData);
470
470
  const vis = entry.visibility || 'private';
471
- const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % 3];
471
+ const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % cycleVis.length];
472
472
  const entryKey = entry.key || '';
473
473
  return html`
474
474
  <div class="kpkg-detail-entry" key=${i} data-entry-key=${entryKey}>
@@ -18,6 +18,7 @@ import AuthImage from '/js/components/auth-image.js';
18
18
  import { listAgents } from '/js/services/agents.js';
19
19
  import { getKeyPermissions, listConsents, grantConsent, revokeConsent } from '/js/services/consent.js';
20
20
  import { getNodeUrl } from '/js/services/auth.js';
21
+ import { listGroups } from '/js/services/sharing-groups.js';
21
22
  import TagCloud from '/js/components/tag-cloud.js';
22
23
  import TagEditor from '/js/components/tag-editor.js';
23
24
  import { useConfirm } from '/components/Modal.js';
@@ -40,9 +41,11 @@ export default function MemoryTab({ session, showToast, onStats }) {
40
41
  const [selectedAgent, setSelectedAgent] = useState('');
41
42
  const [fedConsents, setFedConsents] = useState({}); // { memoryKey: consentId }
42
43
  const [togglingFed, setTogglingFed] = useState(null);
44
+ const [groups, setGroups] = useState([]);
45
+ const [groupPickerFor, setGroupPickerFor] = useState(null); // key of the memory entry showing group picker
43
46
 
44
47
  useEffect(() => {
45
- if (session) { loadAgents(); loadMemories(); loadFiles(); loadFedConsents(); }
48
+ if (session) { loadAgents(); loadMemories(); loadFiles(); loadFedConsents(); loadGroups(); }
46
49
  }, [session]);
47
50
 
48
51
  useEffect(() => {
@@ -111,6 +114,14 @@ export default function MemoryTab({ session, showToast, onStats }) {
111
114
  } catch { setAgents([]); }
112
115
  }
113
116
 
117
+ async function loadGroups() {
118
+ try {
119
+ const resp = await listGroups();
120
+ if (resp?.data?.groups) setGroups(resp.data.groups);
121
+ else if (Array.isArray(resp?.data)) setGroups(resp.data);
122
+ } catch { /* ignore */ }
123
+ }
124
+
114
125
  async function loadMemories() {
115
126
  try {
116
127
  const agentGaii = selectedAgent || undefined;
@@ -128,9 +139,9 @@ export default function MemoryTab({ session, showToast, onStats }) {
128
139
  } catch { setFiles([]); }
129
140
  }
130
141
 
131
- async function handleCreateMemory(key, value, visibility, tags) {
142
+ async function handleCreateMemory(key, value, visibility, tags, groupId) {
132
143
  try {
133
- await memoryService.createMemory(key, value, visibility, tags);
144
+ await memoryService.createMemory(key, value, visibility, tags, groupId);
134
145
  showToast(t('profile.memory.saved'));
135
146
  setShowMemForm(false);
136
147
  await loadMemories();
@@ -149,8 +160,10 @@ export default function MemoryTab({ session, showToast, onStats }) {
149
160
  }, { danger: true });
150
161
  }
151
162
 
152
- async function handleSaveEdit(key, value, visibility, version) {
153
- const resp = await memoryService.updateMemoryFull(key, { value, visibility, version });
163
+ async function handleSaveEdit(key, value, visibility, version, groupId) {
164
+ const body = { value, visibility, version };
165
+ if (visibility === 'group' && groupId) body.group_id = groupId;
166
+ const resp = await memoryService.updateMemoryFull(key, body);
154
167
  if (resp.ok === false) { showToast(resp.error?.message || t('profile.error'), true); return; }
155
168
  showToast(t('profile.memory.updated'));
156
169
  setEditModal(null);
@@ -229,15 +242,15 @@ export default function MemoryTab({ session, showToast, onStats }) {
229
242
  } catch { setKeyRulesPopover(null); }
230
243
  }
231
244
 
232
- /* ── Cycle visibility: private → owner → public → private ── */
233
- const cycleVis = ['private', 'owner', 'public'];
234
- const visColor = { private: '#c084fc', owner: '#60a5fa', public: '#4ade80' };
235
- const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', public: 'rgba(0,200,100,.2)' };
245
+ /* ── Cycle visibility: private → owner → group → public → private ── */
246
+ const cycleVis = ['private', 'owner', 'group', 'public'];
247
+ const visColor = { private: '#c084fc', owner: '#60a5fa', group: '#10b981', public: '#4ade80' };
248
+ const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', group: 'rgba(16,185,129,.2)', public: 'rgba(0,200,100,.2)' };
236
249
 
237
- async function handleUpdateVisibility(key, newVis, version) {
250
+ async function handleUpdateVisibility(key, newVis, version, groupId) {
238
251
  // Optimistic update — change locally first, then persist
239
252
  setMemories(prev => prev.map(m => m.key === key ? { ...m, visibility: newVis, version: (m.version || 1) + 1 } : m));
240
- const resp = await memoryService.updateMemoryVisibility(key, newVis, version);
253
+ const resp = await memoryService.updateMemoryVisibility(key, newVis, version, groupId);
241
254
  if (resp.ok === false) {
242
255
  showToast(resp.error?.message || t('profile.error'), true);
243
256
  loadMemories(); // Revert on error
@@ -299,7 +312,7 @@ export default function MemoryTab({ session, showToast, onStats }) {
299
312
  <button class="btn-primary" onClick=${() => setShowMemForm(!showMemForm)}>${t('profile.memory.newBtn')}</button>
300
313
  </div>
301
314
  <${TagCloud} tags=${[...allMemTags]} selected=${memTagFilter} onToggle=${toggleMemTag} onClear=${() => setMemTagFilter(new Set())} />
302
- ${showMemForm && html`<${MemoryForm} onSave=${handleCreateMemory} onCancel=${() => setShowMemForm(false)} />`}
315
+ ${showMemForm && html`<${MemoryForm} onSave=${handleCreateMemory} onCancel=${() => setShowMemForm(false)} groups=${groups} />`}
303
316
  ${filtered.length === 0
304
317
  ? html`<div class="empty">${memories.length > 0 ? (t('tags.noMatch') || 'No items match selected tags') : t('profile.memory.empty')}</div>`
305
318
  : filtered.map(m => html`
@@ -308,9 +321,9 @@ export default function MemoryTab({ session, showToast, onStats }) {
308
321
  <span class="mem-key">${escHtml(m.key)}</span>
309
322
  ${(() => {
310
323
  const vis = m.visibility || 'private';
311
- const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % 3];
324
+ const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % cycleVis.length];
312
325
  return html`<button class="kpkg-vis-pill"
313
- onClick=${(e) => { e.stopPropagation(); handleUpdateVisibility(m.key, nextVis, m.version); }}
326
+ onClick=${(e) => { e.stopPropagation(); if (nextVis === 'group') { setGroupPickerFor(m.key); } else { handleUpdateVisibility(m.key, nextVis, m.version); } }}
314
327
  title="${t('knowledge.visibility.' + vis)} → ${t('knowledge.visibility.' + nextVis)}"
315
328
  style="background:${visBg[vis]};color:${visColor[vis]};border-color:${visColor[vis]}"
316
329
  >${t('knowledge.visibility.' + vis)} ▾</button>`;
@@ -318,6 +331,21 @@ export default function MemoryTab({ session, showToast, onStats }) {
318
331
  <span class="shield-icon" title=${t('permissions.sharingRules')} onClick=${(e) => { e.stopPropagation(); loadKeyPerms(m.key); }}>\u{1F6E1}\uFE0F</span>
319
332
  ${fedConsents[m.key] && html`<span class="badge badge-success pf-fed-badge">${t('profile.memory.syncedToFederation')}</span>`}
320
333
  </div>
334
+ ${groupPickerFor === m.key && html`
335
+ <div class="agd-group-picker" onClick=${(e) => e.stopPropagation()}>
336
+ <div class="text-caption mb-xs">${t('profile.memory.selectGroup')}</div>
337
+ ${groups.length === 0
338
+ ? html`<div class="text-meta-sm">${t('profile.memory.noGroups')}</div>`
339
+ : groups.map(g => html`
340
+ <button class="btn-ghost agd-group-option" onClick=${() => {
341
+ handleUpdateVisibility(m.key, 'group', m.version, g.id);
342
+ setGroupPickerFor(null);
343
+ }}>${g.name} (${g.members?.length || 0} ${t('profile.access.sharingGroups.members')})</button>
344
+ `)
345
+ }
346
+ <button class="btn-outline btn-sm mt-xs" onClick=${() => { setGroupPickerFor(null); }}>${t('profile.memory.cancelBtn')}</button>
347
+ </div>
348
+ `}
321
349
  ${expandedMem === m.key && html`
322
350
  <div class="mem-detail">
323
351
  <pre>${typeof m.value === 'object' ? JSON.stringify(m.value, null, 2) : String(m.value || '')}</pre>
@@ -423,7 +451,7 @@ export default function MemoryTab({ session, showToast, onStats }) {
423
451
  const fKey = f.key || f.name;
424
452
  const isImage = f.mime_type?.startsWith('image');
425
453
  const vis = f.visibility || 'private';
426
- const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % 3];
454
+ const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % cycleVis.length];
427
455
  return html`
428
456
  <div class="file-card">
429
457
  ${isImage
@@ -506,17 +534,19 @@ export default function MemoryTab({ session, showToast, onStats }) {
506
534
  initialValue=${editModal.value}
507
535
  initialVisibility=${editModal.visibility}
508
536
  initialVersion=${editModal.version}
509
- onSave=${(v, vis, ver) => handleSaveEdit(editModal.key, v, vis, ver)}
537
+ groups=${groups}
538
+ onSave=${(v, vis, ver, gId) => handleSaveEdit(editModal.key, v, vis, ver, gId)}
510
539
  onCancel=${() => setEditModal(null)} />`}
511
540
  <${ConfirmUI} />
512
541
  `;
513
542
  }
514
543
 
515
- function MemoryForm({ onSave, onCancel }) {
544
+ function MemoryForm({ onSave, onCancel, groups }) {
516
545
  const [key, setKey] = useState('');
517
546
  const [value, setValue] = useState('');
518
547
  const [vis, setVis] = useState('private');
519
548
  const [tags, setTags] = useState('');
549
+ const [groupId, setGroupId] = useState('');
520
550
  return html`
521
551
  <div class="create-form">
522
552
  <div class="form-row"><label>${t('profile.memory.keyLabel')}</label><input class="input-field" placeholder=${t('profile.memory.keyPlaceholder')} value=${key} onInput=${e => setKey(e.target.value)} /></div>
@@ -525,12 +555,21 @@ function MemoryForm({ onSave, onCancel }) {
525
555
  <select class="input-field" value=${vis} onChange=${e => setVis(e.target.value)}>
526
556
  <option value="private">${t('profile.memory.visPrivate')}</option>
527
557
  <option value="shared">${t('profile.memory.visShared')}</option>
558
+ <option value="group">Group</option>
528
559
  <option value="public">${t('profile.memory.visPublic')}</option>
529
560
  </select>
530
561
  </div>
562
+ ${vis === 'group' && html`
563
+ <div class="form-row"><label>${t('profile.memory.selectGroup')}</label>
564
+ <select class="input-field" value=${groupId} onChange=${e => setGroupId(e.target.value)}>
565
+ <option value="">-- ${t('profile.memory.selectGroup')} --</option>
566
+ ${(groups || []).map(g => html`<option value=${g.id}>${g.name}</option>`)}
567
+ </select>
568
+ </div>
569
+ `}
531
570
  <div class="form-row"><label>${t('profile.memory.tagsLabel')}</label><input class="input-field" placeholder=${t('profile.memory.tagsPlaceholder')} value=${tags} onInput=${e => setTags(e.target.value)} /></div>
532
571
  <div class="form-actions">
533
- <button class="btn-primary" onClick=${() => { if (!key || !value) return; onSave(key, value, vis, tags); }}>${t('profile.memory.saveBtn')}</button>
572
+ <button class="btn-primary" onClick=${() => { if (!key || !value) return; onSave(key, value, vis, tags, vis === 'group' ? groupId : undefined); }}>${t('profile.memory.saveBtn')}</button>
534
573
  <button class="btn-outline" onClick=${onCancel}>${t('profile.memory.cancelBtn')}</button>
535
574
  </div>
536
575
  </div>`;
@@ -628,6 +667,7 @@ function FileUploadForm({ onUpload, onCancel }) {
628
667
  <select class="input-field" value=${vis} onChange=${e => setVis(e.target.value)}>
629
668
  <option value="private">${t('profile.files.visPrivate')}</option>
630
669
  <option value="owner">${t('profile.files.visOwner')}</option>
670
+ <option value="group">Group</option>
631
671
  <option value="public">${t('profile.files.visPublic')}</option>
632
672
  </select>
633
673
  </div>
@@ -658,13 +698,24 @@ function FileUploadForm({ onUpload, onCancel }) {
658
698
  </div>`;
659
699
  }
660
700
 
661
- function EditMemoryModal({ memKey, initialValue, initialVisibility, initialVersion, onSave, onCancel }) {
701
+ function EditMemoryModal({ memKey, initialValue, initialVisibility, initialVersion, onSave, onCancel, groups }) {
662
702
  const [value, setValue] = useState(initialValue);
663
703
  const [vis, setVis] = useState(initialVisibility || 'private');
664
- const cycleVis = ['private', 'owner', 'public'];
665
- const visColor = { private: '#c084fc', owner: '#60a5fa', public: '#4ade80' };
666
- const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', public: 'rgba(0,200,100,.2)' };
667
- const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % 3];
704
+ const [groupId, setGroupId] = useState('');
705
+ const [showGroupSelect, setShowGroupSelect] = useState(false);
706
+ const cycleVis = ['private', 'owner', 'group', 'public'];
707
+ const visColor = { private: '#c084fc', owner: '#60a5fa', group: '#10b981', public: '#4ade80' };
708
+ const visBg = { private: 'rgba(150,100,200,.2)', owner: 'rgba(100,150,255,.2)', group: 'rgba(16,185,129,.2)', public: 'rgba(0,200,100,.2)' };
709
+ const nextVis = cycleVis[(cycleVis.indexOf(vis) + 1) % cycleVis.length];
710
+ const handleVisCycle = () => {
711
+ if (nextVis === 'group') {
712
+ setShowGroupSelect(true);
713
+ } else {
714
+ setVis(nextVis);
715
+ setShowGroupSelect(false);
716
+ setGroupId('');
717
+ }
718
+ };
668
719
  return html`
669
720
  <div class="modal-overlay" onClick=${e => { if (e.target.className.includes('modal-overlay')) onCancel(); }}>
670
721
  <div class="modal">
@@ -672,14 +723,28 @@ function EditMemoryModal({ memKey, initialValue, initialVisibility, initialVersi
672
723
  <div class="form-row flex-row mb-half">
673
724
  <label class="pf-label-inline">${t('profile.memory.visLabel')}</label>
674
725
  <button class="kpkg-vis-pill"
675
- onClick=${() => setVis(nextVis)}
726
+ onClick=${handleVisCycle}
676
727
  title="${t('knowledge.visibility.' + vis)} → ${t('knowledge.visibility.' + nextVis)}"
677
728
  style="background:${visBg[vis]};color:${visColor[vis]};border-color:${visColor[vis]}"
678
729
  >${t('knowledge.visibility.' + vis)} ▾</button>
679
730
  </div>
731
+ ${showGroupSelect && html`
732
+ <div class="form-row mb-half">
733
+ <label>${t('profile.memory.selectGroup')}</label>
734
+ <select class="input-field" value=${groupId} onChange=${e => {
735
+ setGroupId(e.target.value);
736
+ if (e.target.value) { setVis('group'); setShowGroupSelect(false); }
737
+ }}>
738
+ <option value="">-- ${t('profile.memory.selectGroup')} --</option>
739
+ ${(groups || []).map(g => html`<option value=${g.id}>${g.name}</option>`)}
740
+ </select>
741
+ ${(groups || []).length === 0 && html`<div class="text-meta-sm">${t('profile.memory.noGroups')}</div>`}
742
+ <button class="btn-outline btn-sm mt-xs" onClick=${() => setShowGroupSelect(false)}>${t('profile.memory.cancelBtn')}</button>
743
+ </div>
744
+ `}
680
745
  <textarea class="input-field" rows="6" value=${value} onInput=${e => setValue(e.target.value)}></textarea>
681
746
  <div class="form-actions mt-1">
682
- <button class="btn-primary" onClick=${() => onSave(value, vis, initialVersion)}>${t('profile.save')}</button>
747
+ <button class="btn-primary" onClick=${() => onSave(value, vis, initialVersion, vis === 'group' ? groupId : undefined)}>${t('profile.save')}</button>
683
748
  <button class="btn-outline" onClick=${onCancel}>${t('profile.cancel')}</button>
684
749
  </div>
685
750
  </div>
@@ -257,6 +257,11 @@ export interface AimeatConfig {
257
257
  capabilityWebhooks: 'disabled' | 'allowlist_only' | 'open';
258
258
  capabilityWebhookDomainAllowlist: string[];
259
259
  capabilityLogRetentionDays: number;
260
+ taskStallThresholdMinutes: number;
261
+ agentSystemPrinciples: string[];
262
+ agentMaxTokensPerTask: number;
263
+ agentMandatoryLogging: boolean;
264
+ agentAimeatFirstEnabled: boolean;
260
265
  corsAllowedOrigins: string[];
261
266
  consulEnabled: boolean;
262
267
  consulUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -152,7 +152,7 @@ export function loadConfig(options) {
152
152
  personalNodeHeartbeatIntervalMs: parseInt(process.env.AIMEAT_PERSONAL_HEARTBEAT_MS ?? '30000', 10),
153
153
  personalNodeOfflineThresholdMs: parseInt(process.env.AIMEAT_PERSONAL_OFFLINE_MS ?? '300000', 10),
154
154
  personalNodeRequestTimeoutMs: parseInt(process.env.AIMEAT_PERSONAL_REQUEST_TIMEOUT_MS ?? '60000', 10),
155
- smtpHost: process.env.AIMEAT_SMTP_HOST ?? null,
155
+ smtpHost: process.env.AIMEAT_SMTP_HOST || null,
156
156
  smtpPort: parseInt(process.env.AIMEAT_SMTP_PORT ?? '587', 10),
157
157
  smtpUser: process.env.AIMEAT_SMTP_USER ?? null,
158
158
  smtpPass: process.env.AIMEAT_SMTP_PASS ?? null,
@@ -160,7 +160,7 @@ export function loadConfig(options) {
160
160
  smtpSecure: process.env.AIMEAT_SMTP_SECURE === 'true',
161
161
  smtpRejectUnauthorized: process.env.AIMEAT_SMTP_REJECT_UNAUTHORIZED !== 'false',
162
162
  emailConfirmationRequired: process.env.AIMEAT_EMAIL_CONFIRMATION_REQUIRED === 'true',
163
- emailEnabled: (process.env.AIMEAT_SMTP_HOST ?? null) !== null,
163
+ emailEnabled: !!(process.env.AIMEAT_SMTP_HOST),
164
164
  matchNotificationIntervalHours: parseInt(process.env.AIMEAT_MATCH_NOTIFICATION_INTERVAL_HOURS ?? '24', 10),
165
165
  matchNotificationEnabled: process.env.AIMEAT_MATCH_NOTIFICATION_ENABLED !== 'false',
166
166
  matchingEnabled: process.env.AIMEAT_MATCHING_ENABLED !== 'false',
@@ -282,6 +282,13 @@ export function loadConfig(options) {
282
282
  capabilityWebhooks: (process.env.AIMEAT_CAPABILITY_WEBHOOKS ?? 'disabled'),
283
283
  capabilityWebhookDomainAllowlist: (process.env.AIMEAT_CAPABILITY_WEBHOOK_DOMAIN_ALLOWLIST ?? '').split(',').map(s => s.trim()).filter(Boolean),
284
284
  capabilityLogRetentionDays: parseInt(process.env.AIMEAT_CAPABILITY_LOG_RETENTION_DAYS ?? '30', 10),
285
+ // Agent Tasks (Phase 1)
286
+ taskStallThresholdMinutes: parseInt(process.env.AIMEAT_TASK_STALL_THRESHOLD_MINUTES ?? '30', 10),
287
+ // Agent Directives (Phase 1)
288
+ agentSystemPrinciples: JSON.parse(process.env.AIMEAT_AGENT_SYSTEM_PRINCIPLES || '["AIMEAT-first: prefer native systems", "Log all significant actions"]'),
289
+ agentMaxTokensPerTask: parseInt(process.env.AIMEAT_AGENT_MAX_TOKENS_PER_TASK || '100000', 10),
290
+ agentMandatoryLogging: process.env.AIMEAT_AGENT_MANDATORY_LOGGING !== 'false',
291
+ agentAimeatFirstEnabled: process.env.AIMEAT_AGENT_AIMEAT_FIRST !== 'false',
285
292
  corsAllowedOrigins: (process.env.AIMEAT_CORS_ALLOWED_ORIGINS ?? '*').split(',').map(s => s.trim()).filter(Boolean),
286
293
  // Consul
287
294
  consulEnabled: process.env.AIMEAT_CONSUL_ENABLED === 'true',