robotrock 1.1.0 → 1.3.1

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 (71) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-admin.d.ts +82 -0
  3. package/dist/agent-admin.js +938 -0
  4. package/dist/agent-admin.js.map +1 -0
  5. package/dist/ai/index.d.ts +6 -5
  6. package/dist/ai/index.js +407 -188
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/trigger.d.ts +4 -3
  9. package/dist/ai/trigger.js +407 -188
  10. package/dist/ai/trigger.js.map +1 -1
  11. package/dist/ai/workflow.d.ts +4 -3
  12. package/dist/ai/workflow.js +404 -185
  13. package/dist/ai/workflow.js.map +1 -1
  14. package/dist/auth-headers-qL-ZeEtd.d.ts +13 -0
  15. package/dist/{client-XTnFHGFE.d.ts → client-YO9Y1rkH.d.ts} +29 -17
  16. package/dist/eve/agent/index.d.ts +11 -35
  17. package/dist/eve/agent/index.js +678 -146
  18. package/dist/eve/agent/index.js.map +1 -1
  19. package/dist/eve/index.d.ts +5 -2
  20. package/dist/eve/index.js +195 -2
  21. package/dist/eve/index.js.map +1 -1
  22. package/dist/eve/tools/admin/assign-tasks.d.ts +39 -0
  23. package/dist/eve/tools/admin/assign-tasks.js +1060 -0
  24. package/dist/eve/tools/admin/assign-tasks.js.map +1 -0
  25. package/dist/eve/tools/admin/manage-groups.d.ts +53 -0
  26. package/dist/eve/tools/admin/manage-groups.js +1218 -0
  27. package/dist/eve/tools/admin/manage-groups.js.map +1 -0
  28. package/dist/eve/tools/admin/manage-team-members.d.ts +45 -0
  29. package/dist/eve/tools/admin/manage-team-members.js +1160 -0
  30. package/dist/eve/tools/admin/manage-team-members.js.map +1 -0
  31. package/dist/eve/tools/admin/query-tasks.d.ts +71 -0
  32. package/dist/eve/tools/admin/query-tasks.js +1161 -0
  33. package/dist/eve/tools/admin/query-tasks.js.map +1 -0
  34. package/dist/eve/tools/catalog/search-products.d.ts +57 -0
  35. package/dist/eve/tools/catalog/search-products.js +94 -0
  36. package/dist/eve/tools/catalog/search-products.js.map +1 -0
  37. package/dist/eve/tools/identity/index.d.ts +2 -0
  38. package/dist/eve/tools/identity/index.js +117 -27
  39. package/dist/eve/tools/identity/index.js.map +1 -1
  40. package/dist/eve/tools/identity/my-access.d.ts +6 -46
  41. package/dist/eve/tools/identity/my-access.js +91 -10
  42. package/dist/eve/tools/identity/my-access.js.map +1 -1
  43. package/dist/eve/tools/identity/whoami.d.ts +7 -8
  44. package/dist/eve/tools/identity/whoami.js +33 -17
  45. package/dist/eve/tools/identity/whoami.js.map +1 -1
  46. package/dist/eve/tools/inbox/create-task.d.ts +5 -4
  47. package/dist/eve/tools/inbox/create-task.js +365 -137
  48. package/dist/eve/tools/inbox/create-task.js.map +1 -1
  49. package/dist/eve/tools/inbox/index.d.ts +1 -0
  50. package/dist/eve/tools/inbox/index.js +365 -137
  51. package/dist/eve/tools/inbox/index.js.map +1 -1
  52. package/dist/eve/tools/index.d.ts +7 -0
  53. package/dist/eve/tools/index.js +1362 -168
  54. package/dist/eve/tools/index.js.map +1 -1
  55. package/dist/{index-BL9qKHA8.d.ts → index-DoQN48Bm.d.ts} +61 -2
  56. package/dist/index.d.ts +6 -3
  57. package/dist/index.js +325 -119
  58. package/dist/index.js.map +1 -1
  59. package/dist/schemas/index.d.ts +6 -1
  60. package/dist/schemas/index.js +177 -48
  61. package/dist/schemas/index.js.map +1 -1
  62. package/dist/{tool-approval-bridge-C4bTm8vu.d.ts → tool-approval-bridge-aMA79Z1B.d.ts} +1 -1
  63. package/dist/tool-reply-guidance-C3qrT1In.d.ts +25 -0
  64. package/dist/trigger/index.d.ts +2 -1
  65. package/dist/trigger/index.js +310 -108
  66. package/dist/trigger/index.js.map +1 -1
  67. package/dist/{trigger-Dn0DFiyU.d.ts → trigger-CXrbKVCL.d.ts} +2 -2
  68. package/dist/workflow/index.d.ts +2 -1
  69. package/dist/workflow/index.js +310 -108
  70. package/dist/workflow/index.js.map +1 -1
  71. package/package.json +30 -6
@@ -1,9 +1,9 @@
1
1
  // src/eve/tools/inbox/create-task.ts
2
2
  import { defineTool } from "eve/tools";
3
- import { z as z4 } from "zod";
3
+ import { z as z6 } from "zod";
4
4
 
5
5
  // src/schemas/index.ts
6
- import { z as z2 } from "zod";
6
+ import { z as z4 } from "zod";
7
7
 
8
8
  // ../core/src/utils/safe-url.ts
9
9
  var BLOCKED_HOSTNAMES = /* @__PURE__ */ new Set([
@@ -390,13 +390,27 @@ var createAgentChatBodySchema = z.object({
390
390
  eveConnectionId: z.string().min(1).optional(),
391
391
  /** Source application id; groups the chat under an inbox section. */
392
392
  app: z.string().min(1).optional(),
393
- assignTo: assignToSchema.optional(),
393
+ /** Email of the user who owns the chat. Required unless `parentChatId` is set. */
394
+ ownerEmail: z.string().email().optional(),
394
395
  title: z.string().min(1),
395
396
  messages: z.array(agentChatSeedMessageSchema).default([]),
396
397
  /** Provenance label stored on the session ("cron" | "agent" | ...). */
397
398
  source: z.string().min(1).optional()
398
399
  }).refine((data) => Boolean(data.agentIdentifier || data.parentChatId), {
399
400
  message: "Provide either agentIdentifier or parentChatId"
401
+ }).refine((data) => Boolean(data.ownerEmail || data.parentChatId), {
402
+ message: "Provide ownerEmail unless parentChatId is set"
403
+ });
404
+ var agentChatAuditToolBodySchema = z.object({
405
+ eveSessionId: z.string().min(1),
406
+ userId: z.string().min(1),
407
+ toolCallId: z.string().min(1),
408
+ toolName: z.string().min(1),
409
+ input: z.record(z.string(), z.unknown()).default({}),
410
+ success: z.boolean(),
411
+ status: z.enum(["completed", "failed", "rejected"]),
412
+ error: z.string().optional(),
413
+ idempotencyKey: z.string().optional()
400
414
  });
401
415
  var agentChatAuditInputBodySchema = z.object({
402
416
  eveSessionId: z.string().min(1),
@@ -436,62 +450,175 @@ var agentChatLinkTaskBodySchema = z.object({
436
450
  toolCallId: z.string().min(1)
437
451
  });
438
452
 
453
+ // ../core/src/schemas/tool-result-display.ts
454
+ import { z as z2 } from "zod";
455
+ var toolDisplayMetadataSchema = z2.object({
456
+ widget: z2.string().optional(),
457
+ title: z2.string().optional(),
458
+ description: z2.string().optional()
459
+ });
460
+ var toolDisplayEnvelopeSchema = z2.object({
461
+ display: toolDisplayMetadataSchema.optional(),
462
+ data: z2.record(z2.string(), z2.unknown()),
463
+ ui: z2.record(
464
+ z2.string(),
465
+ z2.object({
466
+ "ui:widget": z2.string().optional(),
467
+ "ui:title": z2.string().optional(),
468
+ "ui:description": z2.string().optional(),
469
+ "ui:options": z2.record(z2.string(), z2.unknown()).optional()
470
+ }).passthrough()
471
+ ).optional()
472
+ });
473
+
474
+ // ../core/src/schemas/agent-admin.ts
475
+ import { z as z3 } from "zod";
476
+ var tenantRoleSchema = z3.enum(["admin", "member"]);
477
+ var agentAdminUserSchema = z3.object({
478
+ id: z3.string(),
479
+ email: z3.string().email(),
480
+ name: z3.string()
481
+ });
482
+ var agentAdminMemberSchema = z3.object({
483
+ userId: z3.string(),
484
+ role: z3.string(),
485
+ membershipKind: z3.enum(["team", "assignee"]),
486
+ hasLoggedIn: z3.boolean(),
487
+ user: agentAdminUserSchema
488
+ });
489
+ var agentAdminGroupSchema = z3.object({
490
+ id: z3.string(),
491
+ name: z3.string(),
492
+ slug: z3.string(),
493
+ description: z3.string().nullable(),
494
+ memberCount: z3.number().optional()
495
+ });
496
+ var agentAdminGroupDetailSchema = agentAdminGroupSchema.extend({
497
+ members: z3.array(
498
+ z3.object({
499
+ userId: z3.string(),
500
+ user: agentAdminUserSchema
501
+ })
502
+ )
503
+ });
504
+ var agentAdminTaskSummarySchema = z3.object({
505
+ id: z3.string(),
506
+ convexId: z3.string(),
507
+ status: z3.string(),
508
+ type: z3.string().nullable(),
509
+ name: z3.string().nullable(),
510
+ description: z3.string().nullable(),
511
+ validUntil: z3.number(),
512
+ createdAt: z3.number(),
513
+ threadPriority: z3.string().nullable(),
514
+ handledByUserId: z3.string().nullable()
515
+ });
516
+ var inviteMemberBodySchema = z3.object({
517
+ email: z3.string().email(),
518
+ role: tenantRoleSchema.optional()
519
+ });
520
+ var updateMemberRoleBodySchema = z3.object({
521
+ role: tenantRoleSchema
522
+ });
523
+ var createGroupBodySchema = z3.object({
524
+ name: z3.string().min(1),
525
+ description: z3.string().optional()
526
+ });
527
+ var updateGroupBodySchema = z3.object({
528
+ name: z3.string().min(1).optional(),
529
+ description: z3.string().optional()
530
+ });
531
+ var addGroupMemberBodySchema = z3.object({
532
+ userId: z3.string().min(1).describe("Convex user id or member email.")
533
+ });
534
+ var listTasksQuerySchema = z3.object({
535
+ statusFilter: z3.enum(["all", "open", "handled", "expired"]).optional(),
536
+ typeFilter: z3.string().optional(),
537
+ appFilter: z3.string().optional(),
538
+ sortField: z3.enum(["type", "date", "status", "validUntil"]).optional(),
539
+ sortDirection: z3.enum(["asc", "desc"]).optional(),
540
+ limit: z3.coerce.number().int().positive().max(100).optional(),
541
+ cursor: z3.string().optional()
542
+ });
543
+ var searchTasksQuerySchema = z3.object({
544
+ q: z3.string().min(1),
545
+ limit: z3.coerce.number().int().positive().max(100).optional()
546
+ });
547
+ var assignTasksResultSchema = z3.object({
548
+ taskId: z3.string(),
549
+ success: z3.boolean(),
550
+ message: z3.string().optional(),
551
+ name: z3.string().nullable().optional(),
552
+ description: z3.string().nullable().optional(),
553
+ type: z3.string().nullable().optional()
554
+ });
555
+ var assignTasksResponseSchema = z3.object({
556
+ results: z3.array(assignTasksResultSchema)
557
+ });
558
+ var assignTasksBodySchema = z3.object({
559
+ taskIds: z3.array(z3.string().min(1)).min(1).max(100),
560
+ assignTo: assignToSchema.refine(
561
+ (value) => (value.users?.length ?? 0) > 0 || (value.groups?.length ?? 0) > 0,
562
+ { message: "assignTo needs at least one user email or group slug." }
563
+ )
564
+ });
565
+
439
566
  // src/schemas/index.ts
440
- var handlerUrlSchema2 = z2.string().refine((url) => isAllowedHandlerUrl(url), {
567
+ var handlerUrlSchema2 = z4.string().refine((url) => isAllowedHandlerUrl(url), {
441
568
  message: HANDLER_URL_ERROR
442
569
  });
443
- var jsonSchema7Schema2 = z2.custom(
570
+ var jsonSchema7Schema2 = z4.custom(
444
571
  (val) => typeof val === "object" && val !== null,
445
572
  { message: "Must be a valid JSON Schema object" }
446
573
  );
447
- var uiSchemaSchema2 = z2.custom((val) => typeof val === "object" && val !== null, {
574
+ var uiSchemaSchema2 = z4.custom((val) => typeof val === "object" && val !== null, {
448
575
  message: "Must be a valid UiSchema object"
449
576
  });
450
- var webhookHandlerSchema2 = z2.object({
451
- type: z2.literal("webhook"),
577
+ var webhookHandlerSchema2 = z4.object({
578
+ type: z4.literal("webhook"),
452
579
  url: handlerUrlSchema2,
453
- headers: z2.record(z2.string(), z2.string())
580
+ headers: z4.record(z4.string(), z4.string())
454
581
  });
455
582
  var triggerHandlerSchema2 = webhookHandlerSchema2.extend({
456
- type: z2.literal("trigger"),
457
- tokenId: z2.string().min(1)
583
+ type: z4.literal("trigger"),
584
+ tokenId: z4.string().min(1)
458
585
  });
459
- var handlerSchema2 = z2.discriminatedUnion("type", [webhookHandlerSchema2, triggerHandlerSchema2]);
460
- var taskActionInputSchema2 = z2.object({
461
- id: z2.string().min(1),
462
- title: z2.string().min(1),
463
- description: z2.string().optional(),
586
+ var handlerSchema2 = z4.discriminatedUnion("type", [webhookHandlerSchema2, triggerHandlerSchema2]);
587
+ var taskActionInputSchema2 = z4.object({
588
+ id: z4.string().min(1),
589
+ title: z4.string().min(1),
590
+ description: z4.string().optional(),
464
591
  schema: jsonSchema7Schema2.optional(),
465
592
  ui: uiSchemaSchema2.optional(),
466
- data: z2.record(z2.string(), z2.unknown()).optional()
593
+ data: z4.record(z4.string(), z4.unknown()).optional()
467
594
  });
468
595
  var taskActionSchema2 = taskActionInputSchema2.extend({
469
- handlers: z2.array(handlerSchema2).min(1).optional()
596
+ handlers: z4.array(handlerSchema2).min(1).optional()
470
597
  });
471
- var uiFieldSchemaSchema2 = z2.object({
472
- "ui:widget": z2.string().optional(),
473
- "ui:title": z2.string().optional(),
474
- "ui:description": z2.string().optional(),
475
- "ui:options": z2.record(z2.string(), z2.unknown()).optional(),
476
- items: z2.lazy(() => z2.record(z2.string(), uiFieldSchemaSchema2)).optional()
598
+ var uiFieldSchemaSchema2 = z4.object({
599
+ "ui:widget": z4.string().optional(),
600
+ "ui:title": z4.string().optional(),
601
+ "ui:description": z4.string().optional(),
602
+ "ui:options": z4.record(z4.string(), z4.unknown()).optional(),
603
+ items: z4.lazy(() => z4.record(z4.string(), uiFieldSchemaSchema2)).optional()
477
604
  }).passthrough();
478
- var contextUiSchema2 = z2.record(z2.string(), uiFieldSchemaSchema2).optional();
479
- var contextDataSchema2 = z2.object({
480
- data: z2.record(z2.string(), z2.unknown()),
605
+ var contextUiSchema2 = z4.record(z4.string(), uiFieldSchemaSchema2).optional();
606
+ var contextDataSchema2 = z4.object({
607
+ data: z4.record(z4.string(), z4.unknown()),
481
608
  ui: contextUiSchema2
482
609
  }).optional();
483
610
  var TASK_CONTEXT_FORMAT_VERSION2 = 2;
484
- var taskContextObjectBaseSchema2 = z2.object({
485
- app: z2.string().min(1).optional(),
486
- type: z2.string().min(1),
487
- name: z2.string().min(1),
488
- description: z2.string().optional(),
489
- validUntil: z2.string().optional(),
611
+ var taskContextObjectBaseSchema2 = z4.object({
612
+ app: z4.string().min(1).optional(),
613
+ type: z4.string().min(1),
614
+ name: z4.string().min(1),
615
+ description: z4.string().optional(),
616
+ validUntil: z4.string().optional(),
490
617
  context: contextDataSchema2,
491
- contextVersion: z2.literal(2).optional(),
618
+ contextVersion: z4.literal(2).optional(),
492
619
  /** @deprecated Use `contextVersion`. Accepted on ingest only. */
493
- version: z2.literal(2).optional(),
494
- actions: z2.array(taskActionSchema2).min(1, "At least one action is required")
620
+ version: z4.literal(2).optional(),
621
+ actions: z4.array(taskActionSchema2).min(1, "At least one action is required")
495
622
  });
496
623
  function normalizeTaskContextVersion2(data) {
497
624
  const { version: legacyVersion, contextVersion, ...rest } = data;
@@ -507,7 +634,7 @@ function refineContextPublicUrls2(data, ctx) {
507
634
  const error = validateContextPublicUrls(data.context);
508
635
  if (error) {
509
636
  ctx.addIssue({
510
- code: z2.ZodIssueCode.custom,
637
+ code: z4.ZodIssueCode.custom,
511
638
  message: error,
512
639
  path: ["context"]
513
640
  });
@@ -516,9 +643,9 @@ function refineContextPublicUrls2(data, ctx) {
516
643
  var taskContextSchema2 = taskContextObjectSchema2.superRefine(
517
644
  refineContextPublicUrls2
518
645
  );
519
- var assignToSchema2 = z2.object({
520
- users: z2.array(z2.string().email()).optional(),
521
- groups: z2.array(z2.string().min(1)).optional()
646
+ var assignToSchema2 = z4.object({
647
+ users: z4.array(z4.string().email()).optional(),
648
+ groups: z4.array(z4.string().min(1)).optional()
522
649
  }).refine(
523
650
  (data) => {
524
651
  const groups = data.groups ?? [];
@@ -529,7 +656,7 @@ var assignToSchema2 = z2.object({
529
656
  },
530
657
  { message: 'Cannot combine "all" with other group slugs' }
531
658
  );
532
- var threadUpdateMessageSchema2 = z2.string().min(1).max(500);
659
+ var threadUpdateMessageSchema2 = z4.string().min(1).max(500);
533
660
  var threadUpdateStatuses2 = [
534
661
  "info",
535
662
  "queued",
@@ -539,15 +666,15 @@ var threadUpdateStatuses2 = [
539
666
  "failed",
540
667
  "cancelled"
541
668
  ];
542
- var threadUpdateStatusSchema2 = z2.enum(threadUpdateStatuses2);
543
- var threadUpdateInputSchema2 = z2.object({
669
+ var threadUpdateStatusSchema2 = z4.enum(threadUpdateStatuses2);
670
+ var threadUpdateInputSchema2 = z4.object({
544
671
  message: threadUpdateMessageSchema2,
545
672
  status: threadUpdateStatusSchema2.optional()
546
673
  });
547
674
  var taskPriorities2 = ["low", "normal", "high", "urgent"];
548
- var taskPrioritySchema2 = z2.enum(taskPriorities2);
549
- var agentTelemetrySchema2 = z2.object({
550
- version: z2.string().min(1)
675
+ var taskPrioritySchema2 = z4.enum(taskPriorities2);
676
+ var agentTelemetrySchema2 = z4.object({
677
+ version: z4.string().min(1)
551
678
  });
552
679
  var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
553
680
  assignTo: assignToSchema2.optional(),
@@ -555,7 +682,7 @@ var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
555
682
  * Groups related tasks together. When omitted, the server generates one and
556
683
  * returns it so the caller can reuse it on later tasks in the same thread.
557
684
  */
558
- threadId: z2.string().min(1).optional(),
685
+ threadId: z4.string().min(1).optional(),
559
686
  /**
560
687
  * Optional thread priority. When set, applies to the whole thread and
561
688
  * overwrites any previous priority. Omit on later tasks to leave unchanged.
@@ -570,6 +697,65 @@ var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
570
697
  }).transform(normalizeTaskContextVersion2).superRefine(refineContextPublicUrls2);
571
698
  var threadUpdateBodySchema = threadUpdateInputSchema2;
572
699
 
700
+ // ../core/src/handler-retry.ts
701
+ var HANDLER_RETRY_DELAYS_MS = [
702
+ 6e4,
703
+ // 1m
704
+ 3e5,
705
+ // 5m
706
+ 18e5,
707
+ // 30m
708
+ 36e5,
709
+ // 1h
710
+ 216e5,
711
+ // 6h
712
+ 864e5,
713
+ // 24h
714
+ 1728e5
715
+ // 48h
716
+ ];
717
+ var HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;
718
+
719
+ // ../core/src/attribution/index.ts
720
+ import { z as z5 } from "zod";
721
+
722
+ // ../core/src/app-url.ts
723
+ var PRODUCTION_APP_URL = "https://app.robotrock.io";
724
+ var PRODUCTION_API_URL = "https://api.robotrock.io/v1";
725
+ var DEV_API_URL = "http://localhost:4001/v1";
726
+ var APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;
727
+ function normalizeRobotRockApiBaseUrl(baseUrl) {
728
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
729
+ if (trimmed.endsWith("/v1")) {
730
+ return trimmed;
731
+ }
732
+ return `${trimmed}/v1`;
733
+ }
734
+ function getRobotRockApiBaseUrl() {
735
+ const explicit = process.env.ROBOTROCK_BASE_URL?.trim() || process.env.ROBOTROCK_API_URL?.trim();
736
+ if (explicit) {
737
+ return normalizeRobotRockApiBaseUrl(explicit);
738
+ }
739
+ if (process.env.NODE_ENV === "production") {
740
+ return PRODUCTION_API_URL;
741
+ }
742
+ return DEV_API_URL;
743
+ }
744
+
745
+ // ../core/src/attribution/index.ts
746
+ var ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90;
747
+ var attributionSchema = z5.object({
748
+ utmSource: z5.string().optional(),
749
+ utmMedium: z5.string().optional(),
750
+ utmCampaign: z5.string().optional(),
751
+ utmContent: z5.string().optional(),
752
+ utmTerm: z5.string().optional(),
753
+ gclid: z5.string().optional(),
754
+ landingUrl: z5.string().optional(),
755
+ referrer: z5.string().optional(),
756
+ capturedAt: z5.number()
757
+ });
758
+
573
759
  // src/approval-result.ts
574
760
  var TaskTimeoutError = class extends Error {
575
761
  constructor(message) {
@@ -644,77 +830,27 @@ function getErrorMessage(data, fallback) {
644
830
  return fallback;
645
831
  }
646
832
 
647
- // ../core/src/handler-retry.ts
648
- var HANDLER_RETRY_DELAYS_MS = [
649
- 6e4,
650
- // 1m
651
- 3e5,
652
- // 5m
653
- 18e5,
654
- // 30m
655
- 36e5,
656
- // 1h
657
- 216e5,
658
- // 6h
659
- 864e5,
660
- // 24h
661
- 1728e5
662
- // 48h
663
- ];
664
- var HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;
665
-
666
- // ../core/src/attribution/index.ts
667
- import { z as z3 } from "zod";
668
-
669
- // ../core/src/app-url.ts
670
- var PRODUCTION_APP_URL = "https://app.robotrock.io";
671
- var PRODUCTION_API_URL = "https://api.robotrock.io/v1";
672
- var DEV_API_URL = "http://localhost:4001/v1";
673
- var APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;
674
- function normalizeRobotRockApiBaseUrl(baseUrl) {
675
- const trimmed = baseUrl.trim().replace(/\/+$/, "");
676
- if (trimmed.endsWith("/v1")) {
677
- return trimmed;
678
- }
679
- return `${trimmed}/v1`;
680
- }
681
- function getRobotRockApiBaseUrl() {
682
- const explicit = process.env.ROBOTROCK_BASE_URL?.trim() || process.env.ROBOTROCK_API_URL?.trim();
683
- if (explicit) {
684
- return normalizeRobotRockApiBaseUrl(explicit);
685
- }
686
- if (process.env.NODE_ENV === "production") {
687
- return PRODUCTION_API_URL;
688
- }
689
- return DEV_API_URL;
690
- }
691
-
692
- // ../core/src/attribution/index.ts
693
- var ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90;
694
- var attributionSchema = z3.object({
695
- utmSource: z3.string().optional(),
696
- utmMedium: z3.string().optional(),
697
- utmCampaign: z3.string().optional(),
698
- utmContent: z3.string().optional(),
699
- utmTerm: z3.string().optional(),
700
- gclid: z3.string().optional(),
701
- landingUrl: z3.string().optional(),
702
- referrer: z3.string().optional(),
703
- capturedAt: z3.number()
704
- });
705
-
706
833
  // src/auth-headers.ts
834
+ var ROBOTROCK_ACTING_USER_ID_HEADER = "x-robotrock-acting-user-id";
707
835
  function buildRobotRockAuthHeaders(auth) {
708
836
  if (auth.kind === "apiKey") {
709
- return {
837
+ const headers2 = {
710
838
  "X-Api-Key": auth.apiKey
711
839
  };
840
+ if (auth.actingUserId?.trim()) {
841
+ headers2[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();
842
+ }
843
+ return headers2;
712
844
  }
713
- return {
845
+ const headers = {
714
846
  Authorization: `Bearer ${auth.token}`,
715
847
  "X-RobotRock-Tenant-Slug": auth.tenantSlug,
716
848
  "X-RobotRock-Connection-Id": auth.connectionId
717
849
  };
850
+ if (auth.actingUserId?.trim()) {
851
+ headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();
852
+ }
853
+ return headers;
718
854
  }
719
855
  function resolveRobotRockAuthConfig(overrides) {
720
856
  if (overrides?.agentService) {
@@ -858,6 +994,29 @@ function createChatsApi(config) {
858
994
  );
859
995
  }
860
996
  },
997
+ async logToolExecution(input) {
998
+ const validation = agentChatAuditToolBodySchema.safeParse(input);
999
+ if (!validation.success) {
1000
+ throw new RobotRockError(
1001
+ `Invalid audit tool input: ${validation.error.issues[0]?.message}`,
1002
+ 400,
1003
+ validation.error.issues
1004
+ );
1005
+ }
1006
+ const response = await fetch(`${config.baseUrl}/agent-chats/audit-tool`, {
1007
+ method: "POST",
1008
+ headers: headers(),
1009
+ body: JSON.stringify(validation.data)
1010
+ });
1011
+ if (!response.ok) {
1012
+ const data = await parseResponseBody(response);
1013
+ throw new RobotRockError(
1014
+ getErrorMessage(data, "Failed to log chat tool execution"),
1015
+ response.status,
1016
+ data
1017
+ );
1018
+ }
1019
+ },
861
1020
  async linkTask(input) {
862
1021
  const validation = agentChatLinkTaskBodySchema.safeParse(input);
863
1022
  if (!validation.success) {
@@ -960,7 +1119,9 @@ var RobotRock = class {
960
1119
  create: (task) => this.createTaskRequest(task),
961
1120
  get: (taskId) => this.getTaskById(taskId),
962
1121
  cancel: (taskId) => this.cancelTaskRequest(taskId),
963
- sendUpdate: (input) => this.sendThreadUpdate(input)
1122
+ sendUpdate: (input) => this.sendThreadUpdate(input),
1123
+ list: (input) => this.listTasksRequest(input),
1124
+ search: (input) => this.searchTasksRequest(input)
964
1125
  };
965
1126
  this.chats = createChatsApi({
966
1127
  baseUrl: this.baseUrl,
@@ -1157,6 +1318,47 @@ var RobotRock = class {
1157
1318
  );
1158
1319
  }
1159
1320
  }
1321
+ async listTasksRequest(input) {
1322
+ const params = new URLSearchParams();
1323
+ for (const [key, value] of Object.entries(input ?? {})) {
1324
+ if (value !== void 0 && value !== "") {
1325
+ params.set(key, String(value));
1326
+ }
1327
+ }
1328
+ const suffix = params.size > 0 ? `?${params.toString()}` : "";
1329
+ const response = await fetch(`${this.baseUrl}/tasks${suffix}`, {
1330
+ method: "GET",
1331
+ headers: this.authHeaders()
1332
+ });
1333
+ const data = await parseResponseBody(response);
1334
+ if (!response.ok) {
1335
+ throw new RobotRockError(
1336
+ getErrorMessage(data, "Failed to list tasks"),
1337
+ response.status,
1338
+ data
1339
+ );
1340
+ }
1341
+ return data;
1342
+ }
1343
+ async searchTasksRequest(input) {
1344
+ const params = new URLSearchParams({ q: input.q });
1345
+ if (input.limit !== void 0) {
1346
+ params.set("limit", String(input.limit));
1347
+ }
1348
+ const response = await fetch(`${this.baseUrl}/tasks/search?${params.toString()}`, {
1349
+ method: "GET",
1350
+ headers: this.authHeaders()
1351
+ });
1352
+ const data = await parseResponseBody(response);
1353
+ if (!response.ok) {
1354
+ throw new RobotRockError(
1355
+ getErrorMessage(data, "Failed to search tasks"),
1356
+ response.status,
1357
+ data
1358
+ );
1359
+ }
1360
+ return data;
1361
+ }
1160
1362
  };
1161
1363
  function createClient(config) {
1162
1364
  return new RobotRock(config);
@@ -1476,37 +1678,60 @@ async function postRobotRockLinkChatTask(ctx, input) {
1476
1678
  }
1477
1679
  }
1478
1680
 
1681
+ // src/eve/tool-reply-guidance.ts
1682
+ var TOOL_REPLY_GUIDANCE_FIELD = "replyGuidance";
1683
+ var CREATE_INBOX_TASK_REPLY_GUIDANCE = "A task card shows title, assignee, and inbox status in chat. Do not restate task ID, assignee, or delegation details from the card. Only mention next steps or answer the user's question.";
1684
+ function withReplyGuidance(result, guidance) {
1685
+ return {
1686
+ ...result,
1687
+ [TOOL_REPLY_GUIDANCE_FIELD]: guidance
1688
+ };
1689
+ }
1690
+
1479
1691
  // src/eve/tools/inbox/create-task.ts
1480
1692
  var CREATE_INBOX_TASK_TOOL_NAME = "create_robotrock_task";
1481
- var actionSchema = z4.object({
1482
- id: z4.string().min(1).describe("Stable action id, e.g. approve or reject."),
1483
- title: z4.string().min(1).describe("Button label shown in the inbox."),
1484
- description: z4.string().min(1).optional()
1693
+ var actionSchema = z6.object({
1694
+ id: z6.string().min(1).describe("Stable action id, e.g. approve or reject."),
1695
+ title: z6.string().min(1).describe("Button label shown in the inbox."),
1696
+ description: z6.string().min(1).optional()
1485
1697
  });
1486
- var assignToSchema3 = z4.object({
1487
- users: z4.array(z4.string().email()).optional().describe("Assignee emails \u2014 only these users (plus group members) see the task."),
1488
- groups: z4.array(z4.string().min(1)).optional().describe('Group slugs, e.g. "finance". Only members of these groups see the task.')
1698
+ var assignToSchema3 = z6.object({
1699
+ users: z6.array(z6.string().email()).optional().describe("Assignee emails \u2014 only these users (plus group members) see the task."),
1700
+ groups: z6.array(z6.string().min(1)).optional().describe(
1701
+ 'Group slugs, e.g. "finance" or virtual "admins". Virtual "all" means everyone; omit assignTo for the same effect.'
1702
+ )
1489
1703
  }).optional().refine(
1490
1704
  (value) => value === void 0 || (value.users?.length ?? 0) > 0 || (value.groups?.length ?? 0) > 0,
1491
1705
  { message: "assignTo needs at least one user email or group slug." }
1706
+ ).refine(
1707
+ (value) => {
1708
+ const groups = value?.groups ?? [];
1709
+ if (groups.includes("all") && groups.length > 1) {
1710
+ return false;
1711
+ }
1712
+ return true;
1713
+ },
1714
+ { message: 'Cannot combine "all" with other group slugs' }
1492
1715
  );
1493
- var contextSchema = z4.object({
1494
- data: z4.record(z4.string(), z4.unknown()).optional().describe("Structured fields shown in the inbox task detail."),
1495
- ui: z4.record(z4.string(), z4.unknown()).optional().describe("Optional ui:* hints keyed by context.data field name.")
1716
+ var contextSchema = z6.object({
1717
+ data: z6.record(z6.string(), z6.unknown()).optional().describe("Structured fields shown in the inbox task detail."),
1718
+ ui: z6.record(z6.string(), z6.unknown()).optional().describe(
1719
+ "Optional ui:* hints keyed by context.data field name (ui:widget, ui:title, ui:options). Use currency for amounts, date for ISO timestamps, link/image for URLs. Load the robotrock skill \u2192 context-widgets reference for the full widget catalog."
1720
+ )
1496
1721
  }).optional();
1497
- var createInboxTaskInputSchema = z4.object({
1498
- type: z4.string().min(1).describe("Task category slug, e.g. refund-approval or budget-approval."),
1499
- name: z4.string().min(1).describe("Short title shown in the inbox list."),
1500
- description: z4.string().min(1).optional(),
1501
- actions: z4.array(actionSchema).min(1).describe("At least one reviewer action (approve, reject, etc.)."),
1722
+ var createInboxTaskInputSchema = z6.object({
1723
+ type: z6.string().min(1).describe("Task category slug, e.g. refund-approval or budget-approval."),
1724
+ name: z6.string().min(1).describe("Short title shown in the inbox list."),
1725
+ description: z6.string().min(1).optional(),
1726
+ actions: z6.array(actionSchema).min(1).describe("At least one reviewer action (approve, reject, etc.)."),
1502
1727
  assignTo: assignToSchema3.describe(
1503
1728
  "Limit visibility to specific users and/or groups. Omit to show the task to everyone in the tenant."
1504
1729
  ),
1505
1730
  context: contextSchema,
1506
- validUntilHours: z4.number().positive().optional().describe("Optional deadline in hours from now. Defaults to the tenant task TTL."),
1507
- priority: z4.enum(["low", "normal", "high", "urgent"]).optional(),
1508
- updateMessage: z4.string().min(1).optional().describe("Optional thread status update logged when the task is created."),
1509
- delegationReason: z4.string().min(1).optional().describe(
1731
+ validUntilHours: z6.number().positive().optional().describe("Optional deadline in hours from now. Defaults to the tenant task TTL."),
1732
+ priority: z6.enum(["low", "normal", "high", "urgent"]).optional(),
1733
+ updateMessage: z6.string().min(1).optional().describe("Optional thread status update logged when the task is created."),
1734
+ delegationReason: z6.string().min(1).optional().describe(
1510
1735
  "User-facing explanation of why the requester cannot self-approve and the task was routed elsewhere. Required when assignTo excludes the caller."
1511
1736
  )
1512
1737
  });
@@ -1519,7 +1744,7 @@ function defaultResolveDelegationReason(input) {
1519
1744
  }
1520
1745
  function defineCreateInboxTaskTool(options) {
1521
1746
  return defineTool({
1522
- description: "Create a RobotRock inbox task and assign it to users or groups. Does not wait for a response. Only call this after the user explicitly asked to create/send/delegate an inbox task, or after they confirmed via ask_question. Never create a task silently when the user only asked for a preview, dummy example, or explanation. Always set delegationReason when assignTo excludes the caller. For refund approvals include chargeId, amount, currency, and reason in context.data.",
1747
+ description: "Create a RobotRock inbox task and assign it to users or groups. Does not wait for a response. Only call this after the user explicitly asked to create/send/delegate an inbox task, or after they confirmed via ask_question. Never create a task silently when the user only asked for a preview, dummy example, or explanation. Always set delegationReason when assignTo excludes the caller. For refund approvals include chargeId, amount, currency, and reason in context.data. The dashboard renders a task card \u2014 do not restate task ID, assignee, or delegation details in your reply.",
1523
1748
  inputSchema: createInboxTaskInputSchema,
1524
1749
  async execute(input, ctx) {
1525
1750
  const caller = requireTenantCaller(ctx);
@@ -1536,14 +1761,17 @@ function defineCreateInboxTaskTool(options) {
1536
1761
  publicTaskId: task.taskId,
1537
1762
  toolCallId: ctx.callId
1538
1763
  });
1539
- return {
1540
- ...task,
1541
- name: input.name,
1542
- assignedTo: input.assignTo ?? null,
1543
- requestedBy: caller.email,
1544
- delegationReason: delegationReason ?? null,
1545
- message: delegationReason ? `${delegationReason} This chat updates when the assignee decides.` : "Task created in RobotRock. Assignees can handle it from their inbox; this chat will update when they decide."
1546
- };
1764
+ return withReplyGuidance(
1765
+ {
1766
+ ...task,
1767
+ name: input.name,
1768
+ assignedTo: input.assignTo ?? null,
1769
+ requestedBy: caller.email,
1770
+ delegationReason: delegationReason ?? null,
1771
+ message: delegationReason ? `${delegationReason} This chat updates when the assignee decides.` : "Task created in RobotRock. Assignees can handle it from their inbox; this chat will update when they decide."
1772
+ },
1773
+ CREATE_INBOX_TASK_REPLY_GUIDANCE
1774
+ );
1547
1775
  }
1548
1776
  });
1549
1777
  }