robotrock 1.3.3 → 1.4.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 (79) hide show
  1. package/README.md +32 -0
  2. package/dist/agent-admin.d.ts +5 -0
  3. package/dist/agent-admin.js +75 -2
  4. package/dist/agent-admin.js.map +1 -1
  5. package/dist/ai/index.d.ts +5 -5
  6. package/dist/ai/index.js +128 -4
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/trigger.d.ts +3 -3
  9. package/dist/ai/trigger.js +128 -4
  10. package/dist/ai/trigger.js.map +1 -1
  11. package/dist/ai/workflow.d.ts +3 -3
  12. package/dist/ai/workflow.js +128 -4
  13. package/dist/ai/workflow.js.map +1 -1
  14. package/dist/{client-CZ5eWH5v.d.ts → client-BxbxttFH.d.ts} +19 -1
  15. package/dist/eve/agent/index.d.ts +4 -3
  16. package/dist/eve/agent/index.js +736 -414
  17. package/dist/eve/agent/index.js.map +1 -1
  18. package/dist/eve/index.d.ts +4 -3
  19. package/dist/eve/index.js +437 -45
  20. package/dist/eve/index.js.map +1 -1
  21. package/dist/eve/tools/admin/assign-tasks.d.ts +40 -8
  22. package/dist/eve/tools/admin/assign-tasks.js +328 -66
  23. package/dist/eve/tools/admin/assign-tasks.js.map +1 -1
  24. package/dist/eve/tools/admin/get-workspace-usage.d.ts +71 -0
  25. package/dist/eve/tools/admin/get-workspace-usage.js +1353 -0
  26. package/dist/eve/tools/admin/get-workspace-usage.js.map +1 -0
  27. package/dist/eve/tools/admin/manage-groups.d.ts +122 -8
  28. package/dist/eve/tools/admin/manage-groups.js +348 -94
  29. package/dist/eve/tools/admin/manage-groups.js.map +1 -1
  30. package/dist/eve/tools/admin/manage-team-members.d.ts +86 -8
  31. package/dist/eve/tools/admin/manage-team-members.js +318 -72
  32. package/dist/eve/tools/admin/manage-team-members.js.map +1 -1
  33. package/dist/eve/tools/admin/query-tasks.d.ts +82 -8
  34. package/dist/eve/tools/admin/query-tasks.js +360 -113
  35. package/dist/eve/tools/admin/query-tasks.js.map +1 -1
  36. package/dist/eve/tools/catalog/generate-image.d.ts +64 -0
  37. package/dist/eve/tools/catalog/generate-image.js +2065 -0
  38. package/dist/eve/tools/catalog/generate-image.js.map +1 -0
  39. package/dist/eve/tools/catalog/generate-random-chart.d.ts +71 -0
  40. package/dist/eve/tools/catalog/generate-random-chart.js +372 -0
  41. package/dist/eve/tools/catalog/generate-random-chart.js.map +1 -0
  42. package/dist/eve/tools/catalog/search-products.d.ts +36 -44
  43. package/dist/eve/tools/catalog/search-products.js +237 -33
  44. package/dist/eve/tools/catalog/search-products.js.map +1 -1
  45. package/dist/eve/tools/identity/index.d.ts +2 -2
  46. package/dist/eve/tools/identity/index.js +35 -44
  47. package/dist/eve/tools/identity/index.js.map +1 -1
  48. package/dist/eve/tools/identity/my-access.d.ts +90 -6
  49. package/dist/eve/tools/identity/my-access.js +35 -44
  50. package/dist/eve/tools/identity/my-access.js.map +1 -1
  51. package/dist/eve/tools/identity/whoami.d.ts +1 -1
  52. package/dist/eve/tools/identity/whoami.js.map +1 -1
  53. package/dist/eve/tools/inbox/create-task.d.ts +1 -1
  54. package/dist/eve/tools/inbox/create-task.js +119 -2
  55. package/dist/eve/tools/inbox/create-task.js.map +1 -1
  56. package/dist/eve/tools/inbox/index.d.ts +1 -1
  57. package/dist/eve/tools/inbox/index.js +119 -2
  58. package/dist/eve/tools/inbox/index.js.map +1 -1
  59. package/dist/eve/tools/index.d.ts +5 -2
  60. package/dist/eve/tools/index.js +932 -288
  61. package/dist/eve/tools/index.js.map +1 -1
  62. package/dist/index-Drj0Rzf_.d.ts +905 -0
  63. package/dist/index.d.ts +5 -4
  64. package/dist/index.js +335 -20
  65. package/dist/index.js.map +1 -1
  66. package/dist/schemas/index.js +67 -1
  67. package/dist/schemas/index.js.map +1 -1
  68. package/dist/{tool-approval-bridge-DnGaRES4.d.ts → tool-approval-bridge-Cz7qQUpw.d.ts} +1 -1
  69. package/dist/{tool-reply-guidance-C3qrT1In.d.ts → tool-reply-guidance-CJko9liH.d.ts} +5 -2
  70. package/dist/tool-result-ui-meta-KT0VafEO.d.ts +52 -0
  71. package/dist/trigger/index.d.ts +1 -1
  72. package/dist/trigger/index.js +118 -2
  73. package/dist/trigger/index.js.map +1 -1
  74. package/dist/{trigger--qTIK0s6.d.ts → trigger-C1ooSegc.d.ts} +2 -2
  75. package/dist/workflow/index.d.ts +1 -1
  76. package/dist/workflow/index.js +118 -2
  77. package/dist/workflow/index.js.map +1 -1
  78. package/package.json +21 -4
  79. package/dist/index-DePyAbTI.d.ts +0 -203
@@ -1,6 +1,6 @@
1
1
  // src/eve/tools/admin/manage-groups.ts
2
2
  import { defineTool } from "eve/tools";
3
- import { z as z5 } from "zod";
3
+ import { z as z6 } from "zod";
4
4
 
5
5
  // src/http.ts
6
6
  var RobotRockError = class extends Error {
@@ -493,6 +493,40 @@ var agentChatLinkTaskBodySchema = z.object({
493
493
  publicTaskId: z.string().min(1),
494
494
  toolCallId: z.string().min(1)
495
495
  });
496
+ var AGENT_FILE_TAGS_MAX = 20;
497
+ var AGENT_FILE_TAG_MAX_LENGTH = 64;
498
+ function normalizeAgentFileTags(tags) {
499
+ if (!tags?.length) return void 0;
500
+ const seen = /* @__PURE__ */ new Set();
501
+ const out = [];
502
+ for (const raw of tags) {
503
+ const tag = raw.trim().toLowerCase().slice(0, AGENT_FILE_TAG_MAX_LENGTH);
504
+ if (!tag || seen.has(tag)) continue;
505
+ seen.add(tag);
506
+ out.push(tag);
507
+ if (out.length >= AGENT_FILE_TAGS_MAX) break;
508
+ }
509
+ return out.length > 0 ? out : void 0;
510
+ }
511
+ var agentChatUploadImageBodySchema = z.object({
512
+ mediaType: z.string().min(1),
513
+ /** Raw base64 (no data: URL prefix). */
514
+ base64: z.string().min(1),
515
+ chatId: z.string().min(1).optional(),
516
+ publicTaskId: z.string().min(1).optional(),
517
+ source: z.string().min(1).optional(),
518
+ /** Display / search name (e.g. `sunset-robot.png`). */
519
+ filename: z.string().min(1).max(255).optional(),
520
+ /** Human-readable description (e.g. generation prompt). */
521
+ description: z.string().min(1).max(2e3).optional(),
522
+ /**
523
+ * Optional labels for later grouping/filtering.
524
+ * Normalized to lowercase trimmed unique strings (max 20, 64 chars each).
525
+ */
526
+ tags: z.array(z.string().min(1).max(AGENT_FILE_TAG_MAX_LENGTH)).max(AGENT_FILE_TAGS_MAX).optional().transform((tags) => normalizeAgentFileTags(tags))
527
+ }).refine((data) => Boolean(data.chatId || data.publicTaskId), {
528
+ message: "Provide chatId and/or publicTaskId"
529
+ });
496
530
 
497
531
  // ../core/src/schemas/tool-result-display.ts
498
532
  import { z as z2 } from "zod";
@@ -521,7 +555,8 @@ var tenantRoleSchema = z3.enum(["admin", "member"]);
521
555
  var agentAdminUserSchema = z3.object({
522
556
  id: z3.string(),
523
557
  email: z3.string().email(),
524
- name: z3.string()
558
+ name: z3.string(),
559
+ profilePictureUrl: z3.string().nullable().optional()
525
560
  });
526
561
  var agentAdminMemberSchema = z3.object({
527
562
  userId: z3.string(),
@@ -606,6 +641,37 @@ var assignTasksBodySchema = z3.object({
606
641
  { message: "assignTo needs at least one user email or group slug." }
607
642
  )
608
643
  });
644
+ var agentAdminPlanLimitsSchema = z3.object({
645
+ tasksPerDay: z3.number(),
646
+ members: z3.number(),
647
+ apiKeys: z3.number(),
648
+ groups: z3.number(),
649
+ auditLogRetention: z3.number(),
650
+ rateLimitPerSecond: z3.number(),
651
+ taskRetentionDays: z3.number()
652
+ });
653
+ var agentAdminUsageSchema = z3.object({
654
+ workspace: z3.string(),
655
+ planName: z3.string(),
656
+ planType: z3.string(),
657
+ trialState: z3.enum(["none", "active", "expired"]),
658
+ daysRemaining: z3.number().nullable(),
659
+ isPaidPro: z3.boolean(),
660
+ subscriptionStatus: z3.string().nullable(),
661
+ tasksToday: z3.number(),
662
+ maxTasksPerDay: z3.number().nullable(),
663
+ tasksResetAt: z3.number(),
664
+ openTasks: z3.number(),
665
+ totalTasks: z3.number(),
666
+ seatsCurrent: z3.number(),
667
+ seatsMax: z3.number().nullable(),
668
+ groupsCurrent: z3.number(),
669
+ groupsMax: z3.number().nullable(),
670
+ apiKeysCurrent: z3.number(),
671
+ apiKeysMax: z3.number().nullable(),
672
+ rateLimitPerSecond: z3.number(),
673
+ limits: agentAdminPlanLimitsSchema
674
+ });
609
675
 
610
676
  // ../core/src/handler-retry.ts
611
677
  var HANDLER_RETRY_DELAYS_MS = [
@@ -701,7 +767,11 @@ function resolveRobotRockAuthConfig(overrides) {
701
767
  "RobotRock auth is required. Set ROBOTROCK_API_KEY, ROBOTROCK_AGENT_SERVICE_TOKEN with tenant context, or pass auth when creating the client."
702
768
  );
703
769
  }
704
- return { kind: "apiKey", apiKey };
770
+ return {
771
+ kind: "apiKey",
772
+ apiKey,
773
+ ...overrides?.actingUserId?.trim() ? { actingUserId: overrides.actingUserId.trim() } : {}
774
+ };
705
775
  }
706
776
 
707
777
  // src/eve/agent/attributes.ts
@@ -837,6 +907,9 @@ async function agentAdminFetch(config, path, init) {
837
907
  }
838
908
  function createAgentAdminApi(config) {
839
909
  return {
910
+ usage: {
911
+ get: () => agentAdminFetch(config, "/usage")
912
+ },
840
913
  members: {
841
914
  list: () => agentAdminFetch(config, "/members"),
842
915
  get: (memberRef) => agentAdminFetch(config, `/members/${encodeURIComponent(memberRef)}`),
@@ -979,20 +1052,215 @@ function requireBoundAgentAdminClient(ctx) {
979
1052
  return createBoundAgentAdminClient(ctx);
980
1053
  }
981
1054
 
982
- // src/eve/tool-result-display.ts
983
- function toolDisplayResult(data, options) {
984
- const display = options?.widget || options?.title || options?.description ? {
985
- ...options.widget ? { widget: options.widget } : {},
986
- ...options.title ? { title: options.title } : {},
987
- ...options.description ? { description: options.description } : {}
988
- } : void 0;
1055
+ // src/eve/entity-schemas.ts
1056
+ import { z as z5 } from "zod";
1057
+
1058
+ // src/eve/tool-ui-hint.ts
1059
+ var TOOL_UI_HINT_FIELD = "uiHint";
1060
+ function withUiHint(result, hint) {
989
1061
  return {
990
- ...display ? { display } : {},
991
- data,
992
- ...options?.ui ? { ui: options.ui } : {}
1062
+ ...result,
1063
+ [TOOL_UI_HINT_FIELD]: hint
993
1064
  };
994
1065
  }
995
1066
 
1067
+ // src/eve/tool-result-ui-meta.ts
1068
+ var TOOL_UI_FIELD = "ui";
1069
+ var TOOL_RESULT_UI_ENTITY_ID_RE = /^[a-z][a-z0-9_]{0,63}$/;
1070
+ function withToolUi(result, ui) {
1071
+ const existing = typeof result[TOOL_UI_FIELD] === "object" && result[TOOL_UI_FIELD] !== null && !Array.isArray(result[TOOL_UI_FIELD]) ? result[TOOL_UI_FIELD] : {};
1072
+ return {
1073
+ ...result,
1074
+ [TOOL_UI_FIELD]: {
1075
+ ...existing,
1076
+ ...ui
1077
+ }
1078
+ };
1079
+ }
1080
+
1081
+ // src/eve/entity-schemas.ts
1082
+ function buildTenantGroupUrl(tenantSlug, slug) {
1083
+ return `/${tenantSlug}/team/groups/${slug}`;
1084
+ }
1085
+ var toolResultUiMetaSchema = z5.object({
1086
+ present: z5.boolean().optional(),
1087
+ entity: z5.string().regex(TOOL_RESULT_UI_ENTITY_ID_RE).optional(),
1088
+ rowsPath: z5.string().min(1).optional(),
1089
+ layout: z5.enum(["list", "chart", "table"]).optional()
1090
+ }).strict();
1091
+ var agentOnlyFields = {
1092
+ replyGuidance: z5.string().optional(),
1093
+ ui: toolResultUiMetaSchema.optional(),
1094
+ uiHint: z5.enum(["list", "chart", "table"]).optional()
1095
+ };
1096
+ function withAgentOnlyFields(shape) {
1097
+ return z5.object({
1098
+ ...shape,
1099
+ ...agentOnlyFields
1100
+ });
1101
+ }
1102
+ var productEntityRowSchema = z5.object({
1103
+ id: z5.string().min(1),
1104
+ name: z5.string().min(1),
1105
+ price: z5.number(),
1106
+ currency: z5.string().min(1),
1107
+ inStock: z5.boolean(),
1108
+ url: z5.string().min(1)
1109
+ });
1110
+ var metricPointEntityRowSchema = z5.object({
1111
+ date: z5.string().optional(),
1112
+ category: z5.string().optional(),
1113
+ label: z5.string().optional()
1114
+ }).catchall(z5.union([z5.string(), z5.number()]));
1115
+ var memberEntityRowSchema = z5.object({
1116
+ name: z5.string(),
1117
+ email: z5.string(),
1118
+ role: z5.string(),
1119
+ membershipKind: z5.string(),
1120
+ profilePictureUrl: z5.string().nullable()
1121
+ });
1122
+ var taskEntityRowSchema = z5.object({
1123
+ id: z5.string().min(1),
1124
+ name: z5.string().min(1),
1125
+ status: z5.string().min(1),
1126
+ type: z5.string().nullable(),
1127
+ description: z5.string().nullable(),
1128
+ validUntil: z5.number(),
1129
+ createdAt: z5.number(),
1130
+ url: z5.string().min(1),
1131
+ threadPriority: z5.string().nullable().optional()
1132
+ });
1133
+ var groupEntityRowSchema = z5.object({
1134
+ name: z5.string().min(1),
1135
+ slug: z5.string().min(1),
1136
+ description: z5.string().nullable(),
1137
+ memberCount: z5.number().nullable(),
1138
+ url: z5.string().min(1)
1139
+ });
1140
+ var groupDetailEntitySchema = z5.object({
1141
+ name: z5.string().min(1),
1142
+ slug: z5.string().min(1),
1143
+ description: z5.string().nullable(),
1144
+ url: z5.string().min(1),
1145
+ members: z5.array(
1146
+ z5.object({
1147
+ name: z5.string(),
1148
+ email: z5.string(),
1149
+ profilePictureUrl: z5.string().nullable()
1150
+ })
1151
+ )
1152
+ });
1153
+ var statusEntityRowSchema = z5.object({
1154
+ id: z5.string().min(1),
1155
+ name: z5.string().min(1),
1156
+ status: z5.string().min(1),
1157
+ url: z5.string().min(1),
1158
+ type: z5.string().nullable().optional(),
1159
+ description: z5.string().nullable().optional()
1160
+ });
1161
+ var agentAdminErrorResultSchema = z5.object({
1162
+ ok: z5.literal(false),
1163
+ status: z5.number().optional(),
1164
+ message: z5.string(),
1165
+ response: z5.unknown().optional()
1166
+ });
1167
+ var agentAdminMutationResultSchema = z5.object({
1168
+ ...agentOnlyFields
1169
+ }).passthrough();
1170
+ var searchProductsOutputSchema = withAgentOnlyFields({
1171
+ items: z5.array(productEntityRowSchema)
1172
+ });
1173
+ var generateRandomChartOutputSchema = withAgentOnlyFields({
1174
+ title: z5.string().min(1),
1175
+ axis: z5.enum(["time", "category"]),
1176
+ series: z5.array(metricPointEntityRowSchema)
1177
+ });
1178
+ var generateImageOutputSchema = withAgentOnlyFields({
1179
+ prompt: z5.string().min(1),
1180
+ mediaType: z5.string().min(1),
1181
+ model: z5.string().min(1),
1182
+ storageId: z5.string().min(1),
1183
+ url: z5.string().min(1),
1184
+ /** @deprecated Legacy sessions only — prefer storageId/url. */
1185
+ base64: z5.string().min(1).optional()
1186
+ });
1187
+ var manageTeamMembersListOutputSchema = withAgentOnlyFields({
1188
+ members: z5.array(memberEntityRowSchema)
1189
+ });
1190
+ var manageTeamMembersDetailOutputSchema = withAgentOnlyFields(
1191
+ memberEntityRowSchema.shape
1192
+ );
1193
+ var manageTeamMembersOutputSchema = z5.union([
1194
+ manageTeamMembersListOutputSchema,
1195
+ manageTeamMembersDetailOutputSchema,
1196
+ agentAdminMutationResultSchema,
1197
+ agentAdminErrorResultSchema
1198
+ ]);
1199
+ var manageGroupsListOutputSchema = withAgentOnlyFields({
1200
+ groups: z5.array(groupEntityRowSchema)
1201
+ });
1202
+ var manageGroupsDetailOutputSchema = withAgentOnlyFields(
1203
+ groupDetailEntitySchema.shape
1204
+ );
1205
+ var manageGroupsSummaryOutputSchema = withAgentOnlyFields(
1206
+ groupEntityRowSchema.shape
1207
+ );
1208
+ var manageGroupsOutputSchema = z5.union([
1209
+ manageGroupsListOutputSchema,
1210
+ manageGroupsDetailOutputSchema,
1211
+ manageGroupsSummaryOutputSchema,
1212
+ agentAdminMutationResultSchema,
1213
+ agentAdminErrorResultSchema
1214
+ ]);
1215
+ var queryTasksListOutputSchema = withAgentOnlyFields({
1216
+ items: z5.array(taskEntityRowSchema),
1217
+ nextCursor: z5.string().nullable().optional()
1218
+ });
1219
+ var queryTasksDetailOutputSchema = withAgentOnlyFields({
1220
+ id: z5.string().nullable(),
1221
+ status: z5.string().nullable(),
1222
+ type: z5.string().nullable(),
1223
+ name: z5.string().nullable(),
1224
+ description: z5.string().nullable(),
1225
+ validUntil: z5.number().nullable(),
1226
+ createdAt: z5.number().nullable(),
1227
+ url: z5.string().min(1).nullable()
1228
+ });
1229
+ var queryTasksOutputSchema = z5.union([
1230
+ queryTasksListOutputSchema,
1231
+ queryTasksDetailOutputSchema,
1232
+ agentAdminErrorResultSchema
1233
+ ]);
1234
+ var assignTasksOutputSchema = z5.union([
1235
+ withAgentOnlyFields({
1236
+ results: z5.array(statusEntityRowSchema)
1237
+ }),
1238
+ agentAdminErrorResultSchema
1239
+ ]);
1240
+ var workspaceUsageEntitySchema = z5.object({
1241
+ workspace: z5.string(),
1242
+ plan: z5.string(),
1243
+ planType: z5.string(),
1244
+ trialState: z5.string(),
1245
+ daysRemaining: z5.number().nullable(),
1246
+ isPaidPro: z5.boolean(),
1247
+ subscriptionStatus: z5.string(),
1248
+ tasksToday: z5.string(),
1249
+ tasksResetAt: z5.string(),
1250
+ openTasks: z5.number(),
1251
+ totalTasks: z5.number(),
1252
+ seats: z5.string(),
1253
+ groups: z5.string(),
1254
+ apiKeys: z5.string(),
1255
+ rateLimitPerSecond: z5.number()
1256
+ });
1257
+ var getWorkspaceUsageOutputSchema = z5.union([
1258
+ withAgentOnlyFields({
1259
+ usage: workspaceUsageEntitySchema
1260
+ }),
1261
+ agentAdminErrorResultSchema
1262
+ ]);
1263
+
996
1264
  // src/eve/tool-reply-guidance.ts
997
1265
  var TOOL_REPLY_GUIDANCE_FIELD = "replyGuidance";
998
1266
  var MANAGE_GROUPS_LIST_REPLY_GUIDANCE = "Groups render as a list card in chat. Do not restate group names, slugs, or descriptions from the list. Use slug (not internal id) for get, update, delete, and membership actions. Only add context not shown.";
@@ -1007,107 +1275,85 @@ function withReplyGuidance(result, guidance) {
1007
1275
 
1008
1276
  // src/eve/tool-display-format.ts
1009
1277
  function formatToolObjectResult(data, options) {
1010
- return withReplyGuidance(
1011
- toolDisplayResult(data, {
1012
- title: options.title,
1013
- description: options.description,
1014
- ui: options.ui
1015
- }),
1278
+ let result = withReplyGuidance(
1279
+ data,
1016
1280
  options.replyGuidance
1017
1281
  );
1282
+ if (options.ui) {
1283
+ result = withToolUi(result, options.ui);
1284
+ }
1285
+ if (options.uiHint) {
1286
+ result = withUiHint(result, options.uiHint);
1287
+ }
1288
+ return result;
1018
1289
  }
1019
1290
  function formatToolListResult(listKey, items, options) {
1020
- const listFieldUi = options.itemWidget ? {
1021
- "ui:widget": "list",
1022
- items: {
1023
- "ui:widget": options.itemWidget,
1024
- ...options.itemUi ?? {}
1025
- }
1026
- } : {
1027
- "ui:widget": "table",
1028
- ...options.itemUi ? { items: options.itemUi } : {}
1291
+ const ui = {
1292
+ ...options.ui,
1293
+ layout: "list",
1294
+ rowsPath: listKey,
1295
+ ...options.entity ? { entity: options.entity } : {},
1296
+ ...options.present !== void 0 ? { present: options.present } : {}
1029
1297
  };
1030
- return formatToolObjectResult(
1031
- { [listKey]: items },
1032
- {
1033
- title: options.title,
1034
- ui: {
1035
- [listKey]: listFieldUi
1036
- },
1037
- replyGuidance: options.replyGuidance
1038
- }
1298
+ return withUiHint(
1299
+ withToolUi(
1300
+ withReplyGuidance({ [listKey]: items }, options.replyGuidance),
1301
+ ui
1302
+ ),
1303
+ "list"
1039
1304
  );
1040
1305
  }
1041
1306
 
1042
1307
  // src/eve/tools/admin/format-groups-list.ts
1043
- var GROUP_ITEM_UI = {
1044
- name: { "ui:title": "Name" },
1045
- slug: { "ui:title": "Slug" },
1046
- description: { "ui:title": "Description" },
1047
- memberCount: { "ui:title": "Members", "ui:widget": "number" }
1048
- };
1049
- function serializeGroupRow(group) {
1308
+ function serializeGroupRow(group, tenantSlug) {
1050
1309
  return {
1051
1310
  name: group.name,
1052
1311
  slug: group.slug,
1053
1312
  description: group.description,
1054
- memberCount: group.memberCount ?? null
1313
+ memberCount: group.memberCount ?? null,
1314
+ url: buildTenantGroupUrl(tenantSlug, group.slug)
1055
1315
  };
1056
1316
  }
1057
- function formatGroupsListResult(groups) {
1058
- const countLabel = groups.length === 1 ? "1 group" : `${groups.length} groups`;
1317
+ function formatGroupsListResult(groups, options) {
1059
1318
  return formatToolListResult(
1060
1319
  "groups",
1061
- groups.map(serializeGroupRow),
1320
+ groups.map((group) => serializeGroupRow(group, options.tenantSlug)),
1062
1321
  {
1063
- title: countLabel,
1064
- itemWidget: "tenantGroup",
1065
- replyGuidance: MANAGE_GROUPS_LIST_REPLY_GUIDANCE
1322
+ replyGuidance: MANAGE_GROUPS_LIST_REPLY_GUIDANCE,
1323
+ entity: "group"
1066
1324
  }
1067
1325
  );
1068
1326
  }
1069
- function formatGroupDetailResult(group) {
1327
+ function formatGroupDetailResult(group, options) {
1070
1328
  return formatToolObjectResult(
1071
1329
  {
1072
1330
  name: group.name,
1073
1331
  slug: group.slug,
1074
1332
  description: group.description,
1333
+ url: buildTenantGroupUrl(options.tenantSlug, group.slug),
1075
1334
  members: group.members.map((member) => ({
1076
1335
  name: member.user.name,
1077
- email: member.user.email
1336
+ email: member.user.email,
1337
+ profilePictureUrl: member.user.profilePictureUrl ?? null
1078
1338
  }))
1079
1339
  },
1080
1340
  {
1081
- title: group.name,
1082
- ui: {
1083
- name: { "ui:title": "Name" },
1084
- slug: { "ui:title": "Slug" },
1085
- description: { "ui:title": "Description" },
1086
- members: {
1087
- "ui:widget": "list",
1088
- "ui:title": "Members",
1089
- items: {
1090
- name: { "ui:title": "Name" },
1091
- email: { "ui:title": "Email" }
1092
- }
1093
- }
1094
- },
1095
- replyGuidance: MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE
1341
+ replyGuidance: MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE,
1342
+ ui: { entity: "group" }
1096
1343
  }
1097
1344
  );
1098
1345
  }
1099
- function formatGroupSummaryResult(group) {
1100
- return formatToolObjectResult(serializeGroupRow(group), {
1101
- title: group.name,
1102
- ui: GROUP_ITEM_UI,
1103
- replyGuidance: MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE
1346
+ function formatGroupSummaryResult(group, options) {
1347
+ return formatToolObjectResult(serializeGroupRow(group, options.tenantSlug), {
1348
+ replyGuidance: MANAGE_GROUPS_DETAIL_REPLY_GUIDANCE,
1349
+ ui: { entity: "group" }
1104
1350
  });
1105
1351
  }
1106
1352
 
1107
1353
  // src/eve/tools/admin/manage-groups.ts
1108
1354
  var MANAGE_GROUPS_TOOL_NAME = "manage_groups";
1109
- var manageGroupsInputSchema = z5.object({
1110
- action: z5.enum([
1355
+ var manageGroupsInputSchema = z6.object({
1356
+ action: z6.enum([
1111
1357
  "list",
1112
1358
  "get",
1113
1359
  "create",
@@ -1116,18 +1362,18 @@ var manageGroupsInputSchema = z5.object({
1116
1362
  "add_member",
1117
1363
  "remove_member"
1118
1364
  ]),
1119
- groupId: z5.string().min(1).optional().describe(
1365
+ groupId: z6.string().min(1).optional().describe(
1120
1366
  "Convex group id for get, update, delete, and membership actions. Prefer slug when the group list only shows slug."
1121
1367
  ),
1122
- slug: z5.string().min(1).optional().describe(
1368
+ slug: z6.string().min(1).optional().describe(
1123
1369
  "Group slug (e.g. finance) for get, update, delete, and membership actions."
1124
1370
  ),
1125
- userId: z5.string().min(1).optional().describe(
1371
+ userId: z6.string().min(1).optional().describe(
1126
1372
  "User id for add_member and remove_member. Prefer email when the member list only shows email."
1127
1373
  ),
1128
- email: z5.string().email().optional().describe("Member email for add_member and remove_member."),
1129
- name: z5.string().min(1).optional().describe("Group name for create and update."),
1130
- description: z5.string().optional().describe("Group description for create and update.")
1374
+ email: z6.string().email().optional().describe("Member email for add_member and remove_member."),
1375
+ name: z6.string().min(1).optional().describe("Group name for create and update."),
1376
+ description: z6.string().optional().describe("Group description for create and update.")
1131
1377
  }).superRefine((input, ctx) => {
1132
1378
  const requireField = (field, message) => {
1133
1379
  if (!input[field]) {
@@ -1168,9 +1414,8 @@ var manageGroupsInputSchema = z5.object({
1168
1414
  break;
1169
1415
  }
1170
1416
  });
1171
- function formatGroupMutationResult(payload, title) {
1417
+ function formatGroupMutationResult(payload) {
1172
1418
  return formatToolObjectResult(payload, {
1173
- title,
1174
1419
  replyGuidance: ADMIN_MUTATION_REPLY_GUIDANCE
1175
1420
  });
1176
1421
  }
@@ -1182,39 +1427,50 @@ function resolveMemberRef(input) {
1182
1427
  }
1183
1428
  function defineManageGroupsTool() {
1184
1429
  return defineTool({
1185
- description: "Tenant-admin tool for workspace groups: list, get, create, update, delete, and manage group membership. Requires tenant admin access. Use group slug (e.g. finance) from list results for get and membership actions \u2014 internal ids are optional. Use member email for add_member and remove_member when user ids are unknown. Results render as chat UI cards \u2014 do not restate group or member fields in your reply.",
1430
+ description: "Tenant-admin tool for workspace groups: list, get, create, update, delete, and manage group membership. Requires tenant admin access. Call get_my_access in the same turn before this tool to verify admin access (the check stays a compact success marker unless it is the only presentable result). Use group slug (e.g. finance) from list results for get and membership actions \u2014 internal ids are optional. Use member email for add_member and remove_member when user ids are unknown. Results render as chat UI cards \u2014 do not restate group or member fields in your reply.",
1186
1431
  inputSchema: manageGroupsInputSchema,
1432
+ outputSchema: manageGroupsOutputSchema,
1187
1433
  async execute(input, ctx) {
1434
+ const caller = requireAdminCaller(ctx);
1188
1435
  const api = requireBoundAgentAdminClient(ctx);
1436
+ const tenantSlug = caller.tenantSlug;
1189
1437
  try {
1190
1438
  switch (input.action) {
1191
1439
  case "list": {
1192
1440
  const result = await api.groups.list();
1193
- return formatGroupsListResult(result.groups);
1441
+ return formatGroupsListResult(result.groups, {
1442
+ tenantSlug
1443
+ });
1194
1444
  }
1195
1445
  case "get": {
1196
1446
  const result = await api.groups.get(resolveGroupRef(input));
1197
- return formatGroupDetailResult(result.group);
1447
+ return formatGroupDetailResult(
1448
+ result.group,
1449
+ { tenantSlug }
1450
+ );
1198
1451
  }
1199
1452
  case "create": {
1200
1453
  const result = await api.groups.create({
1201
1454
  name: input.name,
1202
1455
  description: input.description
1203
1456
  });
1204
- return formatGroupSummaryResult(result.group);
1457
+ return formatGroupSummaryResult(result.group, {
1458
+ tenantSlug
1459
+ });
1205
1460
  }
1206
1461
  case "update": {
1207
1462
  const result = await api.groups.update(resolveGroupRef(input), {
1208
1463
  name: input.name,
1209
1464
  description: input.description
1210
1465
  });
1211
- return formatGroupSummaryResult(result.group);
1466
+ return formatGroupSummaryResult(result.group, {
1467
+ tenantSlug
1468
+ });
1212
1469
  }
1213
1470
  case "delete": {
1214
1471
  const result = await api.groups.delete(resolveGroupRef(input));
1215
1472
  return formatGroupMutationResult(
1216
- result,
1217
- "Group deleted"
1473
+ result
1218
1474
  );
1219
1475
  }
1220
1476
  case "add_member": {
@@ -1223,8 +1479,7 @@ function defineManageGroupsTool() {
1223
1479
  resolveMemberRef(input)
1224
1480
  );
1225
1481
  return formatGroupMutationResult(
1226
- result,
1227
- "Group member added"
1482
+ result
1228
1483
  );
1229
1484
  }
1230
1485
  case "remove_member": {
@@ -1233,8 +1488,7 @@ function defineManageGroupsTool() {
1233
1488
  resolveMemberRef(input)
1234
1489
  );
1235
1490
  return formatGroupMutationResult(
1236
- result,
1237
- "Group member removed"
1491
+ result
1238
1492
  );
1239
1493
  }
1240
1494
  }