@elizaos/ui 2.0.0-alpha.396 → 2.0.0-alpha.398

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 (25) hide show
  1. package/apps/app-steward/src/services/steward-credentials.d.ts.map +1 -1
  2. package/apps/app-steward/src/services/steward-credentials.js +11 -1
  3. package/package.json +1 -1
  4. package/packages/agent/src/triggers/action.d.ts.map +1 -1
  5. package/packages/agent/src/triggers/action.js +14 -2
  6. package/packages/app-core/src/api/client-n8n.js +7 -1
  7. package/packages/app-core/src/components/pages/AutomationsView.d.ts.map +1 -1
  8. package/packages/app-core/src/components/pages/AutomationsView.js +117 -4
  9. package/packages/app-core/src/components/pages/WorkflowGraphViewer.d.ts.map +1 -1
  10. package/packages/app-core/src/components/pages/WorkflowGraphViewer.js +73 -5
  11. package/packages/app-core/src/components/pages/page-scoped-conversations.js +1 -1
  12. package/packages/app-core/src/components/workspace/AppWorkspaceChrome.d.ts.map +1 -1
  13. package/packages/app-core/src/components/workspace/AppWorkspaceChrome.js +17 -4
  14. package/packages/app-core/src/i18n/locales/en.json +2 -0
  15. package/packages/shared/src/index.d.ts +0 -2
  16. package/packages/shared/src/index.d.ts.map +1 -1
  17. package/packages/shared/src/index.js +6 -5
  18. package/packages/typescript/src/prompts.d.ts +2 -2
  19. package/packages/typescript/src/prompts.d.ts.map +1 -1
  20. package/packages/typescript/src/prompts.js +1 -0
  21. package/packages/typescript/src/services/message.d.ts.map +1 -1
  22. package/packages/typescript/src/services/message.js +22 -1
  23. package/packages/shared/src/eliza-core-roles.d.ts +0 -70
  24. package/packages/shared/src/eliza-core-roles.d.ts.map +0 -1
  25. package/packages/shared/src/eliza-core-roles.js +0 -541
@@ -429,6 +429,7 @@ rules[21]:
429
429
  - for live status questions or remaining-work queries, do not answer from recent conversation alone; call the relevant action/provider to refresh state, and do not pair it with a speculative REPLY that guesses the result
430
430
  - when an action will fetch the state and produce the final grounded answer, do not add REPLY just to say "checking", "let me look", or similar filler; use the action alone and leave text empty
431
431
  - when the user asks you to create, store, remember, schedule, remind, upload, follow up, route, escalate, or set a standing policy, choose the matching action instead of handling it in prose only
432
+ - when the request names an external integration (Gmail, Discord, Slack, Telegram, GitHub, Google Sheets, Google Calendar, Google Drive, Notion, etc.) AND describes data movement between services or scheduled invocation of an external API, prefer CREATE_N8N_WORKFLOW; reserve CREATE_TRIGGER_TASK for self-driven scheduled prompts to the agent itself with no external API calls
432
433
  - for standing or future-condition requests like "if/when X, do Y", still choose the action that records, queues, or routes that behavior on the first turn
433
434
  - if a matching action can own the task and ask the missing follow-up itself, still select that action and put the clarification in text; do not reply in prose alone
434
435
  - when the user defines a durable preference, recurring block, escalation policy, upload policy, approval-gated workflow, or multi-device reminder rule, select the owning action even if some implementation details are still missing
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../../../typescript/src/services/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../../../typescript/src/services/message.ts"],"names":[],"mappings":"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"}
@@ -823,7 +823,28 @@ const ACTION_REPAIR_PASSIVE_ACTIONS = new Set(["REPLY", "RESPOND", "NONE", "IGNO
823
823
  // (e.g. "build me an app" does not contain "spawn" or "agent"), so the
824
824
  // metadata-based corrector must not override them with a keyword-matched
825
825
  // alternative like a cross-channel send action.
826
- const EXPLICIT_INTENT_ACTIONS = new Set(["SPAWN_AGENT"].map(normalizeActionIdentifier));
826
+ //
827
+ // CREATE_TRIGGER_TASK + its schedule similes are included because the phrase
828
+ // structure the planner matches on ("every N minutes", "at 7am daily",
829
+ // "schedule a cron task") does not keyword-overlap with the action's
830
+ // description the way LIFE's multi-paragraph reminder/alarm prose does.
831
+ // Without these entries, the correction layer (findOwnedActionCorrectionFromMetadata)
832
+ // routinely overrides a correct CREATE_CRON/CREATE_TRIGGER_TASK pick on
833
+ // page-automations with LIFE based on fuzzy description overlap — breaking
834
+ // the scope-gated routing on the page-automations surface.
835
+ const EXPLICIT_INTENT_ACTIONS = new Set([
836
+ "SPAWN_AGENT",
837
+ "CREATE_TRIGGER_TASK",
838
+ "CREATE_TRIGGER",
839
+ "SCHEDULE_TRIGGER",
840
+ "SCHEDULE_TASK",
841
+ "CREATE_HEARTBEAT",
842
+ "SCHEDULE_HEARTBEAT",
843
+ "CREATE_AUTOMATION",
844
+ "SCHEDULE_AUTOMATION",
845
+ "CREATE_CRON",
846
+ "CREATE_RECURRING",
847
+ ].map(normalizeActionIdentifier));
827
848
  function shouldAttemptCanonicalActionRepair(rawPlannerActions, normalizedActions) {
828
849
  const hasUnknownOperationalAction = rawPlannerActions.some((actionName) => {
829
850
  const normalized = normalizeActionIdentifier(actionName);
@@ -1,70 +0,0 @@
1
- import { type IAgentRuntime, type Memory, type Role, type UUID, type World } from "@elizaos/core";
2
- export type RoleName = "OWNER" | "ADMIN" | "USER" | "GUEST";
3
- export type RoleGrantSource = "owner" | "manual" | "connector_admin";
4
- export declare const ROLE_RANK: Record<RoleName, number>;
5
- export type RolesWorldMetadata = {
6
- ownership?: {
7
- ownerId?: string;
8
- };
9
- roles?: Record<string, RoleName>;
10
- roleSources?: Record<string, RoleGrantSource>;
11
- };
12
- export type ConnectorAdminWhitelist = Record<string, string[]>;
13
- export type RolesConfig = {
14
- connectorAdmins?: ConnectorAdminWhitelist;
15
- };
16
- export type RoleCheckResult = {
17
- entityId: UUID;
18
- role: RoleName;
19
- isOwner: boolean;
20
- isAdmin: boolean;
21
- canManageRoles: boolean;
22
- };
23
- export interface ServerOwnershipState {
24
- servers: {
25
- [serverId: string]: World;
26
- };
27
- }
28
- declare const CONNECTOR_ID_FIELDS: readonly ["userId", "id", "username", "userName"];
29
- type ConnectorIdField = (typeof CONNECTOR_ID_FIELDS)[number];
30
- type ConnectorAdminMatch = {
31
- connector: string;
32
- matchedValue: string;
33
- matchedField: ConnectorIdField;
34
- };
35
- type ResolveEntityRoleOptions = {
36
- liveEntityMetadata?: Record<string, unknown> | null;
37
- liveEntityId?: string;
38
- };
39
- export declare function getUserServerRole(runtime: IAgentRuntime, entityId: string, serverId: string): Promise<Role>;
40
- export declare function findWorldsForOwner(runtime: IAgentRuntime, entityId: string): Promise<World[] | null>;
41
- export declare function getConfiguredOwnerEntityIds(runtime: IAgentRuntime): string[];
42
- export declare function hasConfiguredCanonicalOwner(runtime: IAgentRuntime): boolean;
43
- export declare function resolveCanonicalOwnerId(runtime: IAgentRuntime, metadata?: RolesWorldMetadata): string | null;
44
- export declare function setConnectorAdminWhitelist(runtime: IAgentRuntime, whitelist: ConnectorAdminWhitelist | Record<string, unknown> | undefined): void;
45
- export declare function getConnectorAdminWhitelist(runtime: IAgentRuntime): ConnectorAdminWhitelist;
46
- export declare function matchEntityToConnectorAdminWhitelist(entityMetadata: Record<string, unknown> | null | undefined, whitelist: ConnectorAdminWhitelist | Record<string, unknown> | undefined): ConnectorAdminMatch | null;
47
- export declare function normalizeRole(raw: string | undefined | null): RoleName;
48
- export declare function getEntityRole(metadata: RolesWorldMetadata | undefined, entityId: string): RoleName;
49
- export declare function getLiveEntityMetadataFromMessage(message: Memory): Record<string, unknown> | undefined;
50
- export declare function resolveEntityRole(runtime: IAgentRuntime, _world: Awaited<ReturnType<IAgentRuntime["getWorld"]>>, metadata: RolesWorldMetadata | undefined, entityId: string, options?: ResolveEntityRoleOptions): Promise<RoleName>;
51
- export declare function checkSenderPrivateAccess(runtime: IAgentRuntime, message: Memory): Promise<{
52
- entityId: UUID;
53
- role: RoleName;
54
- isOwner: boolean;
55
- isAdmin: boolean;
56
- canManageRoles: boolean;
57
- hasPrivateAccess: boolean;
58
- accessRole: RoleName | null;
59
- accessSource: "owner" | "manual" | "linked_manual" | null;
60
- } | null>;
61
- export declare function canModifyRole(actorRole: RoleName, targetCurrentRole: RoleName, newRole: RoleName): boolean;
62
- export declare function resolveWorldForMessage(runtime: IAgentRuntime, message: Memory): Promise<{
63
- world: Awaited<ReturnType<IAgentRuntime["getWorld"]>>;
64
- metadata: RolesWorldMetadata;
65
- } | null>;
66
- export declare function resolveCanonicalOwnerIdForMessage(runtime: IAgentRuntime, message: Memory): Promise<string | null>;
67
- export declare function checkSenderRole(runtime: IAgentRuntime, message: Memory): Promise<RoleCheckResult | null>;
68
- export declare function setEntityRole(runtime: IAgentRuntime, message: Memory, targetEntityId: string, newRole: RoleName, source?: RoleGrantSource): Promise<Record<string, RoleName>>;
69
- export {};
70
- //# sourceMappingURL=eliza-core-roles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eliza-core-roles.d.ts","sourceRoot":"","sources":["../../../../../shared/src/eliza-core-roles.ts"],"names":[],"mappings":"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"}
@@ -1,541 +0,0 @@
1
- import { createUniqueUuid, logger, } from "@elizaos/core";
2
- import { asRecordOrUndefined } from "./type-guards";
3
- // Vendored elizaOS roles helpers for published core builds that do not expose
4
- // the @elizaos/shared/eliza-core-roles subpath yet.
5
- const DEFAULT_SERVER_ROLE = "NONE";
6
- export const ROLE_RANK = {
7
- GUEST: 0,
8
- USER: 1,
9
- ADMIN: 2,
10
- OWNER: 3,
11
- };
12
- const CONNECTOR_ADMINS_SETTING_KEY = "ELIZA_ROLES_CONNECTOR_ADMINS_JSON";
13
- const CANONICAL_OWNER_SETTING_KEY = "ELIZA_ADMIN_ENTITY_ID";
14
- const OWNER_CONTACTS_SETTING_KEY = "ELIZA_OWNER_CONTACTS_JSON";
15
- const CONNECTOR_ID_FIELDS = ["userId", "id", "username", "userName"];
16
- const CONNECTOR_STABLE_ID_FIELDS = ["userId", "id"];
17
- function asStringArray(value) {
18
- if (!Array.isArray(value))
19
- return [];
20
- return value
21
- .filter((entry) => typeof entry === "string")
22
- .map((entry) => entry.trim())
23
- .filter(Boolean);
24
- }
25
- function normalizeConnectorAdminWhitelist(whitelist) {
26
- if (!whitelist || typeof whitelist !== "object")
27
- return {};
28
- return Object.fromEntries(Object.entries(whitelist)
29
- .map(([connector, values]) => [connector, asStringArray(values)])
30
- .filter(([, values]) => values.length > 0));
31
- }
32
- function normalizeRoleGrantSource(raw) {
33
- if (raw === "owner" || raw === "manual" || raw === "connector_admin") {
34
- return raw;
35
- }
36
- return null;
37
- }
38
- const asRecord = asRecordOrUndefined;
39
- function formatError(error) {
40
- return error instanceof Error ? error.message : String(error);
41
- }
42
- function getRuntimeSettingString(runtime, key) {
43
- if (typeof runtime.getSetting !== "function") {
44
- return undefined;
45
- }
46
- const value = runtime.getSetting(key);
47
- if (typeof value !== "string") {
48
- return undefined;
49
- }
50
- const trimmed = value.trim();
51
- return trimmed.length > 0 ? trimmed : undefined;
52
- }
53
- function parseOwnerContactEntityIds(raw) {
54
- if (!raw) {
55
- return [];
56
- }
57
- try {
58
- const parsed = JSON.parse(raw);
59
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
60
- return [];
61
- }
62
- return Object.values(parsed)
63
- .map((entry) => entry && typeof entry.entityId === "string"
64
- ? entry.entityId.trim()
65
- : "")
66
- .filter((entityId) => entityId.length > 0);
67
- }
68
- catch (error) {
69
- logger.warn(`[roles] Failed to parse owner contacts from runtime settings: ${formatError(error)}`);
70
- return [];
71
- }
72
- }
73
- function getMemoryMetadata(message) {
74
- return asRecord(message.metadata);
75
- }
76
- function getMessageSource(message) {
77
- return typeof message.content?.source === "string"
78
- ? message.content.source
79
- : undefined;
80
- }
81
- function getConnectorMetadataFromMemory(message) {
82
- const memoryMetadata = getMemoryMetadata(message);
83
- const source = getMessageSource(message);
84
- if (!source) {
85
- return undefined;
86
- }
87
- const sourceMetadata = asRecord(memoryMetadata?.[source]);
88
- if (sourceMetadata) {
89
- return { [source]: sourceMetadata };
90
- }
91
- if (source === "discord") {
92
- const fromId = memoryMetadata?.fromId;
93
- if (typeof fromId !== "string" || fromId.trim().length === 0) {
94
- return undefined;
95
- }
96
- const entityName = typeof memoryMetadata?.entityName === "string"
97
- ? memoryMetadata.entityName
98
- : undefined;
99
- return {
100
- discord: {
101
- userId: fromId,
102
- id: fromId,
103
- ...(entityName ? { name: entityName, username: entityName } : {}),
104
- },
105
- };
106
- }
107
- return undefined;
108
- }
109
- async function getEntityMetadata(runtime, entityId) {
110
- if (typeof runtime.getEntityById !== "function") {
111
- return undefined;
112
- }
113
- try {
114
- const entity = await runtime.getEntityById(entityId);
115
- return asRecord(entity?.metadata);
116
- }
117
- catch (error) {
118
- logger.warn(`[roles] Failed to look up entity ${entityId}: ${formatError(error)}`);
119
- return undefined;
120
- }
121
- }
122
- export async function getUserServerRole(runtime, entityId, serverId) {
123
- const worldId = createUniqueUuid(runtime, serverId);
124
- const world = await runtime.getWorld(worldId);
125
- const worldMetadata = world?.metadata;
126
- const roles = worldMetadata?.roles;
127
- if (!roles) {
128
- return DEFAULT_SERVER_ROLE;
129
- }
130
- const role = roles[entityId];
131
- if (role) {
132
- return role;
133
- }
134
- return DEFAULT_SERVER_ROLE;
135
- }
136
- export async function findWorldsForOwner(runtime, entityId) {
137
- if (!entityId) {
138
- logger.error({ src: "core:roles", agentId: runtime.agentId }, "User ID is required to find server");
139
- return null;
140
- }
141
- const worlds = await runtime.getAllWorlds();
142
- if (!worlds || worlds.length === 0) {
143
- logger.debug({ src: "core:roles", agentId: runtime.agentId }, "No worlds found for agent");
144
- return null;
145
- }
146
- const ownerWorlds = [];
147
- for (const world of worlds) {
148
- const worldMetadata = world.metadata;
149
- const worldMetadataOwnership = worldMetadata?.ownership;
150
- if (worldMetadataOwnership && worldMetadataOwnership.ownerId === entityId) {
151
- ownerWorlds.push(world);
152
- }
153
- }
154
- return ownerWorlds.length ? ownerWorlds : null;
155
- }
156
- export function getConfiguredOwnerEntityIds(runtime) {
157
- const configuredAdminEntityId = getRuntimeSettingString(runtime, CANONICAL_OWNER_SETTING_KEY);
158
- const ownerContactsRaw = getRuntimeSettingString(runtime, OWNER_CONTACTS_SETTING_KEY);
159
- const ownerContactEntityIds = parseOwnerContactEntityIds(ownerContactsRaw);
160
- const deduped = new Set();
161
- if (configuredAdminEntityId) {
162
- deduped.add(configuredAdminEntityId);
163
- }
164
- for (const entityId of ownerContactEntityIds) {
165
- deduped.add(entityId);
166
- }
167
- return [...deduped];
168
- }
169
- export function hasConfiguredCanonicalOwner(runtime) {
170
- return getConfiguredOwnerEntityIds(runtime).length > 0;
171
- }
172
- export function resolveCanonicalOwnerId(runtime, metadata) {
173
- const configuredOwnerIds = getConfiguredOwnerEntityIds(runtime);
174
- if (configuredOwnerIds.length > 0) {
175
- return configuredOwnerIds[0] ?? null;
176
- }
177
- const worldOwnerId = metadata?.ownership?.ownerId;
178
- return typeof worldOwnerId === "string" && worldOwnerId.length > 0
179
- ? worldOwnerId
180
- : null;
181
- }
182
- function resolveOwnershipCandidateIds(runtime, metadata) {
183
- const configuredOwnerIds = getConfiguredOwnerEntityIds(runtime);
184
- if (configuredOwnerIds.length > 0) {
185
- return configuredOwnerIds;
186
- }
187
- const ownerId = resolveCanonicalOwnerId(runtime, metadata);
188
- return ownerId ? [ownerId] : [];
189
- }
190
- function connectorIdentityMatches(left, right) {
191
- if (!left || !right)
192
- return false;
193
- for (const [connector, leftRaw] of Object.entries(left)) {
194
- const leftConnector = asRecord(leftRaw);
195
- const rightConnector = asRecord(right[connector]);
196
- if (!leftConnector || !rightConnector) {
197
- continue;
198
- }
199
- for (const field of CONNECTOR_STABLE_ID_FIELDS) {
200
- const leftValue = leftConnector[field];
201
- const rightValue = rightConnector[field];
202
- if (typeof leftValue === "string" &&
203
- leftValue.length > 0 &&
204
- leftValue === rightValue) {
205
- return true;
206
- }
207
- }
208
- }
209
- return false;
210
- }
211
- async function hasConfirmedIdentityLink(runtime, entityId, ownerId) {
212
- const linkedIds = await getConfirmedLinkedEntityIds(runtime, entityId);
213
- return linkedIds.includes(ownerId);
214
- }
215
- async function getConfirmedLinkedEntityIds(runtime, entityId) {
216
- if (typeof runtime.getRelationships !== "function") {
217
- return [];
218
- }
219
- try {
220
- const relationships = await runtime.getRelationships({
221
- entityIds: [entityId],
222
- tags: ["identity_link"],
223
- });
224
- const linkedIds = new Set();
225
- for (const relationship of relationships) {
226
- const metadata = asRecord(relationship.metadata);
227
- if (metadata?.status !== "confirmed") {
228
- continue;
229
- }
230
- if (relationship.sourceEntityId === entityId &&
231
- typeof relationship.targetEntityId === "string") {
232
- linkedIds.add(relationship.targetEntityId);
233
- }
234
- if (relationship.targetEntityId === entityId &&
235
- typeof relationship.sourceEntityId === "string") {
236
- linkedIds.add(relationship.sourceEntityId);
237
- }
238
- }
239
- return [...linkedIds];
240
- }
241
- catch (error) {
242
- logger.warn(`[roles] Failed to load identity links for ${entityId}: ${formatError(error)}`);
243
- return [];
244
- }
245
- }
246
- async function resolveOwnershipRole(runtime, metadata, entityId, options) {
247
- const ownerIds = resolveOwnershipCandidateIds(runtime, metadata);
248
- if (ownerIds.length === 0) {
249
- return null;
250
- }
251
- const senderMetadata = options?.liveEntityMetadata ?? (await getEntityMetadata(runtime, entityId));
252
- for (const ownerId of ownerIds) {
253
- if (ownerId === entityId) {
254
- return "OWNER";
255
- }
256
- if (await hasConfirmedIdentityLink(runtime, entityId, ownerId)) {
257
- return "OWNER";
258
- }
259
- const ownerMetadata = await getEntityMetadata(runtime, ownerId);
260
- if (!ownerMetadata) {
261
- continue;
262
- }
263
- if (connectorIdentityMatches(senderMetadata, ownerMetadata)) {
264
- return "OWNER";
265
- }
266
- }
267
- return null;
268
- }
269
- function resolveWorldIdFromMessageMetadata(runtime, message) {
270
- const source = getMessageSource(message);
271
- const metadata = getMemoryMetadata(message);
272
- if (source === "discord") {
273
- const serverId = typeof metadata?.discordServerId === "string"
274
- ? metadata.discordServerId
275
- : typeof metadata?.discordChannelId === "string"
276
- ? metadata.discordChannelId
277
- : null;
278
- if (!serverId) {
279
- return null;
280
- }
281
- return createUniqueUuid(runtime, serverId);
282
- }
283
- return null;
284
- }
285
- export function setConnectorAdminWhitelist(runtime, whitelist) {
286
- if (typeof runtime.setSetting !== "function") {
287
- return;
288
- }
289
- const normalized = normalizeConnectorAdminWhitelist(whitelist);
290
- if (Object.keys(normalized).length === 0) {
291
- runtime.setSetting(CONNECTOR_ADMINS_SETTING_KEY, null);
292
- return;
293
- }
294
- runtime.setSetting(CONNECTOR_ADMINS_SETTING_KEY, JSON.stringify(normalized));
295
- }
296
- export function getConnectorAdminWhitelist(runtime) {
297
- const raw = getRuntimeSettingString(runtime, CONNECTOR_ADMINS_SETTING_KEY);
298
- if (!raw) {
299
- return {};
300
- }
301
- try {
302
- const parsed = JSON.parse(raw);
303
- return normalizeConnectorAdminWhitelist(parsed);
304
- }
305
- catch (error) {
306
- logger.warn(`[roles] Failed to parse ${CONNECTOR_ADMINS_SETTING_KEY}: ${formatError(error)}`);
307
- return {};
308
- }
309
- }
310
- export function matchEntityToConnectorAdminWhitelist(entityMetadata, whitelist) {
311
- if (!entityMetadata || typeof entityMetadata !== "object")
312
- return null;
313
- const normalizedWhitelist = normalizeConnectorAdminWhitelist(whitelist);
314
- for (const [connector, platformIds] of Object.entries(normalizedWhitelist)) {
315
- const connectorMeta = asRecord(entityMetadata[connector]);
316
- if (!connectorMeta) {
317
- continue;
318
- }
319
- for (const field of CONNECTOR_ID_FIELDS) {
320
- const value = connectorMeta[field];
321
- if (typeof value === "string" && platformIds.includes(value)) {
322
- return { connector, matchedValue: value, matchedField: field };
323
- }
324
- }
325
- }
326
- return null;
327
- }
328
- export function normalizeRole(raw) {
329
- const upper = (raw ?? "").toUpperCase();
330
- if (upper === "OWNER" || upper === "ADMIN" || upper === "USER")
331
- return upper;
332
- return "GUEST";
333
- }
334
- export function getEntityRole(metadata, entityId) {
335
- if (!metadata?.roles)
336
- return "GUEST";
337
- return normalizeRole(metadata.roles[entityId]);
338
- }
339
- function getStoredRoleSource(metadata, entityId) {
340
- return normalizeRoleGrantSource(metadata?.roleSources?.[entityId]);
341
- }
342
- async function resolveStoredRoleSource(runtime, metadata, entityId, options) {
343
- const storedSource = getStoredRoleSource(metadata, entityId);
344
- if (storedSource) {
345
- return storedSource;
346
- }
347
- const storedRole = getEntityRole(metadata, entityId);
348
- if (storedRole === "GUEST") {
349
- return null;
350
- }
351
- if (storedRole === "OWNER") {
352
- return "owner";
353
- }
354
- const entityMetadata = options?.liveEntityId === entityId
355
- ? (options.liveEntityMetadata ?? undefined)
356
- : undefined;
357
- const matchedWhitelist = matchEntityToConnectorAdminWhitelist(entityMetadata ?? (await getEntityMetadata(runtime, entityId)), getConnectorAdminWhitelist(runtime));
358
- if (storedRole === "ADMIN" && matchedWhitelist) {
359
- return "connector_admin";
360
- }
361
- return "manual";
362
- }
363
- async function resolveExplicitGrantedRole(runtime, metadata, entityId, options) {
364
- const directRole = getEntityRole(metadata, entityId);
365
- const directSource = await resolveStoredRoleSource(runtime, metadata, entityId, options);
366
- if (directRole !== "GUEST" && directSource === "manual") {
367
- return { role: directRole, source: "manual" };
368
- }
369
- const linkedIds = await getConfirmedLinkedEntityIds(runtime, entityId);
370
- let bestRole = null;
371
- for (const linkedEntityId of linkedIds) {
372
- const linkedRole = getEntityRole(metadata, linkedEntityId);
373
- if (linkedRole === "GUEST") {
374
- continue;
375
- }
376
- const linkedSource = await resolveStoredRoleSource(runtime, metadata, linkedEntityId);
377
- if (linkedSource !== "manual") {
378
- continue;
379
- }
380
- if (!bestRole || ROLE_RANK[linkedRole] > ROLE_RANK[bestRole]) {
381
- bestRole = linkedRole;
382
- }
383
- }
384
- return bestRole ? { role: bestRole, source: "linked_manual" } : null;
385
- }
386
- export function getLiveEntityMetadataFromMessage(message) {
387
- // Only trust connector identity stamped into the Memory itself.
388
- // content.metadata can come from untrusted chat clients, so it must not
389
- // participate in role resolution.
390
- return getConnectorMetadataFromMemory(message);
391
- }
392
- export async function resolveEntityRole(runtime, _world, metadata, entityId, options) {
393
- const explicitRole = getEntityRole(metadata, entityId);
394
- const explicitSource = await resolveStoredRoleSource(runtime, metadata, entityId, options);
395
- const ownershipRole = await resolveOwnershipRole(runtime, metadata, entityId, options);
396
- if (ownershipRole === "OWNER") {
397
- return "OWNER";
398
- }
399
- const whitelist = getConnectorAdminWhitelist(runtime);
400
- const liveMatched = matchEntityToConnectorAdminWhitelist(options?.liveEntityMetadata ?? undefined, whitelist);
401
- if (explicitRole !== "GUEST") {
402
- if (explicitRole === "OWNER") {
403
- return hasConfiguredCanonicalOwner(runtime) ? "GUEST" : "OWNER";
404
- }
405
- if (explicitSource === "connector_admin") {
406
- if (Object.keys(whitelist).length === 0) {
407
- return "GUEST";
408
- }
409
- if (liveMatched) {
410
- return "ADMIN";
411
- }
412
- const entityMetadata = await getEntityMetadata(runtime, entityId);
413
- const matched = matchEntityToConnectorAdminWhitelist(entityMetadata, whitelist);
414
- if (matched) {
415
- return "ADMIN";
416
- }
417
- return "GUEST";
418
- }
419
- return explicitRole;
420
- }
421
- if (Object.keys(whitelist).length === 0) {
422
- return explicitRole;
423
- }
424
- if (liveMatched) {
425
- return "ADMIN";
426
- }
427
- const entityMetadata = await getEntityMetadata(runtime, entityId);
428
- const matched = matchEntityToConnectorAdminWhitelist(entityMetadata, whitelist);
429
- if (!matched) {
430
- return explicitRole;
431
- }
432
- return "ADMIN";
433
- }
434
- export async function checkSenderPrivateAccess(runtime, message) {
435
- const resolved = await resolveWorldForMessage(runtime, message);
436
- if (!resolved)
437
- return null;
438
- const { world, metadata } = resolved;
439
- const entityId = message.entityId;
440
- const options = {
441
- liveEntityMetadata: getLiveEntityMetadataFromMessage(message),
442
- liveEntityId: entityId,
443
- };
444
- const role = await resolveEntityRole(runtime, world, metadata, entityId, options);
445
- const ownershipRole = await resolveOwnershipRole(runtime, metadata, entityId, options);
446
- if (ownershipRole === "OWNER") {
447
- return {
448
- entityId,
449
- role,
450
- isOwner: true,
451
- isAdmin: true,
452
- canManageRoles: true,
453
- hasPrivateAccess: true,
454
- accessRole: "OWNER",
455
- accessSource: "owner",
456
- };
457
- }
458
- const explicitAccess = await resolveExplicitGrantedRole(runtime, metadata, entityId, options);
459
- return {
460
- entityId,
461
- role,
462
- isOwner: false,
463
- isAdmin: role === "OWNER" || role === "ADMIN",
464
- canManageRoles: role === "OWNER" || role === "ADMIN",
465
- hasPrivateAccess: explicitAccess !== null,
466
- accessRole: explicitAccess?.role ?? null,
467
- accessSource: explicitAccess?.source ?? null,
468
- };
469
- }
470
- export function canModifyRole(actorRole, targetCurrentRole, newRole) {
471
- if (targetCurrentRole === newRole)
472
- return false;
473
- const actorRank = ROLE_RANK[actorRole];
474
- const targetRank = ROLE_RANK[targetCurrentRole];
475
- if (actorRole === "OWNER")
476
- return true;
477
- if (actorRole === "ADMIN") {
478
- if (targetRank >= actorRank)
479
- return false;
480
- if (newRole === "OWNER")
481
- return false;
482
- return true;
483
- }
484
- return false;
485
- }
486
- export async function resolveWorldForMessage(runtime, message) {
487
- const room = await runtime.getRoom(message.roomId);
488
- const worldId = room?.worldId ?? resolveWorldIdFromMessageMetadata(runtime, message);
489
- if (!worldId)
490
- return null;
491
- const world = await runtime.getWorld(worldId);
492
- if (!world)
493
- return null;
494
- const metadata = (world.metadata ?? {});
495
- return { world, metadata };
496
- }
497
- export async function resolveCanonicalOwnerIdForMessage(runtime, message) {
498
- const configuredOwnerId = resolveCanonicalOwnerId(runtime);
499
- if (configuredOwnerId) {
500
- return configuredOwnerId;
501
- }
502
- const resolved = await resolveWorldForMessage(runtime, message);
503
- return resolveCanonicalOwnerId(runtime, resolved?.metadata);
504
- }
505
- export async function checkSenderRole(runtime, message) {
506
- const resolved = await resolveWorldForMessage(runtime, message);
507
- if (!resolved)
508
- return null;
509
- const { world, metadata } = resolved;
510
- const entityId = message.entityId;
511
- const role = await resolveEntityRole(runtime, world, metadata, entityId, {
512
- liveEntityMetadata: getLiveEntityMetadataFromMessage(message),
513
- liveEntityId: entityId,
514
- });
515
- return {
516
- entityId,
517
- role,
518
- isOwner: role === "OWNER",
519
- isAdmin: role === "OWNER" || role === "ADMIN",
520
- canManageRoles: role === "OWNER" || role === "ADMIN",
521
- };
522
- }
523
- export async function setEntityRole(runtime, message, targetEntityId, newRole, source = "manual") {
524
- const resolved = await resolveWorldForMessage(runtime, message);
525
- if (!resolved)
526
- throw new Error("Cannot resolve world for role assignment");
527
- const { world, metadata } = resolved;
528
- if (!metadata.roles)
529
- metadata.roles = {};
530
- metadata.roleSources ??= {};
531
- metadata.roles[targetEntityId] = newRole;
532
- if (newRole === "GUEST") {
533
- delete metadata.roleSources[targetEntityId];
534
- }
535
- else {
536
- metadata.roleSources[targetEntityId] = source;
537
- }
538
- world.metadata = metadata;
539
- await runtime.updateWorld(world);
540
- return { ...metadata.roles };
541
- }