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,7 +1,7 @@
1
1
  import { Tool } from 'ai';
2
2
  import { z } from 'zod';
3
- import { R as RobotRock, S as SendToHumanActionInput } from './client-XTnFHGFE.js';
4
- import { A as ApproveByHumanToolDurableOptions, a as ApproveByHumanToolOptions, N as approveByHumanInputSchema, H as HumanToolResult, i as CreateSendToHumanToolDurableOptions, C as CreateSendToHumanToolOptions, a7 as sendToHumanToolInputSchema, j as CreateSendUpdateToolDurableOptions, c as CreateSendUpdateToolOptions, a9 as sendUpdateToolInputSchema, L as SendUpdateToolResult, e as RequestActionInputToolOptions, a4 as requestActionInputToolInputSchema, E as RequestActionInputToolOutput, g as ReportStatusToolOptions, a2 as reportStatusToolInputSchema, B as ReportStatusToolOutput, k as RobotRockAiContext } from './tool-approval-bridge-C4bTm8vu.js';
3
+ import { R as RobotRock, S as SendToHumanActionInput } from './client-YO9Y1rkH.js';
4
+ import { A as ApproveByHumanToolDurableOptions, a as ApproveByHumanToolOptions, N as approveByHumanInputSchema, H as HumanToolResult, i as CreateSendToHumanToolDurableOptions, C as CreateSendToHumanToolOptions, a7 as sendToHumanToolInputSchema, j as CreateSendUpdateToolDurableOptions, c as CreateSendUpdateToolOptions, a9 as sendUpdateToolInputSchema, L as SendUpdateToolResult, e as RequestActionInputToolOptions, a4 as requestActionInputToolInputSchema, E as RequestActionInputToolOutput, g as ReportStatusToolOptions, a2 as reportStatusToolInputSchema, B as ReportStatusToolOutput, k as RobotRockAiContext } from './tool-approval-bridge-aMA79Z1B.js';
5
5
 
6
6
  /**
7
7
  * AI SDK tool with fixed approve/decline actions; blocks until a human decides.
@@ -1,10 +1,11 @@
1
1
  import { ThreadUpdateStatus, DiscriminatedApprovalResult, ThreadUpdate } from '../schemas/index.js';
2
2
  export { ApprovalResult, TaskContextInput, TaskResult } from '../schemas/index.js';
3
- import { S as SendToHumanActionInput, a as SendToHumanInput } from '../client-XTnFHGFE.js';
3
+ import { S as SendToHumanActionInput, a as SendToHumanInput } from '../client-YO9Y1rkH.js';
4
4
  import { R as RobotRockPlatformOtelFields } from '../otel-platform-DzHyHkGk.js';
5
5
  export { a as RobotRockHandlerWebhookPayload } from '../otel-platform-DzHyHkGk.js';
6
6
  import 'zod';
7
7
  import '@robotrock/core';
8
+ import '../auth-headers-qL-ZeEtd.js';
8
9
  import '@opentelemetry/api';
9
10
 
10
11
  type SendToHumanWorkflowPayload<A extends readonly SendToHumanActionInput[] = readonly SendToHumanActionInput[]> = SendToHumanInput<A> & RobotRockPlatformOtelFields & {
@@ -48,7 +48,7 @@ var __callDispose = (stack, error, hasError) => {
48
48
  import { createWebhook, sleep as sleep2 } from "workflow";
49
49
 
50
50
  // src/schemas/index.ts
51
- import { z as z2 } from "zod";
51
+ import { z as z4 } from "zod";
52
52
 
53
53
  // ../core/src/utils/safe-url.ts
54
54
  var BLOCKED_HOSTNAMES = /* @__PURE__ */ new Set([
@@ -435,13 +435,27 @@ var createAgentChatBodySchema = z.object({
435
435
  eveConnectionId: z.string().min(1).optional(),
436
436
  /** Source application id; groups the chat under an inbox section. */
437
437
  app: z.string().min(1).optional(),
438
- assignTo: assignToSchema.optional(),
438
+ /** Email of the user who owns the chat. Required unless `parentChatId` is set. */
439
+ ownerEmail: z.string().email().optional(),
439
440
  title: z.string().min(1),
440
441
  messages: z.array(agentChatSeedMessageSchema).default([]),
441
442
  /** Provenance label stored on the session ("cron" | "agent" | ...). */
442
443
  source: z.string().min(1).optional()
443
444
  }).refine((data) => Boolean(data.agentIdentifier || data.parentChatId), {
444
445
  message: "Provide either agentIdentifier or parentChatId"
446
+ }).refine((data) => Boolean(data.ownerEmail || data.parentChatId), {
447
+ message: "Provide ownerEmail unless parentChatId is set"
448
+ });
449
+ var agentChatAuditToolBodySchema = z.object({
450
+ eveSessionId: z.string().min(1),
451
+ userId: z.string().min(1),
452
+ toolCallId: z.string().min(1),
453
+ toolName: z.string().min(1),
454
+ input: z.record(z.string(), z.unknown()).default({}),
455
+ success: z.boolean(),
456
+ status: z.enum(["completed", "failed", "rejected"]),
457
+ error: z.string().optional(),
458
+ idempotencyKey: z.string().optional()
445
459
  });
446
460
  var agentChatAuditInputBodySchema = z.object({
447
461
  eveSessionId: z.string().min(1),
@@ -481,62 +495,175 @@ var agentChatLinkTaskBodySchema = z.object({
481
495
  toolCallId: z.string().min(1)
482
496
  });
483
497
 
498
+ // ../core/src/schemas/tool-result-display.ts
499
+ import { z as z2 } from "zod";
500
+ var toolDisplayMetadataSchema = z2.object({
501
+ widget: z2.string().optional(),
502
+ title: z2.string().optional(),
503
+ description: z2.string().optional()
504
+ });
505
+ var toolDisplayEnvelopeSchema = z2.object({
506
+ display: toolDisplayMetadataSchema.optional(),
507
+ data: z2.record(z2.string(), z2.unknown()),
508
+ ui: z2.record(
509
+ z2.string(),
510
+ z2.object({
511
+ "ui:widget": z2.string().optional(),
512
+ "ui:title": z2.string().optional(),
513
+ "ui:description": z2.string().optional(),
514
+ "ui:options": z2.record(z2.string(), z2.unknown()).optional()
515
+ }).passthrough()
516
+ ).optional()
517
+ });
518
+
519
+ // ../core/src/schemas/agent-admin.ts
520
+ import { z as z3 } from "zod";
521
+ var tenantRoleSchema = z3.enum(["admin", "member"]);
522
+ var agentAdminUserSchema = z3.object({
523
+ id: z3.string(),
524
+ email: z3.string().email(),
525
+ name: z3.string()
526
+ });
527
+ var agentAdminMemberSchema = z3.object({
528
+ userId: z3.string(),
529
+ role: z3.string(),
530
+ membershipKind: z3.enum(["team", "assignee"]),
531
+ hasLoggedIn: z3.boolean(),
532
+ user: agentAdminUserSchema
533
+ });
534
+ var agentAdminGroupSchema = z3.object({
535
+ id: z3.string(),
536
+ name: z3.string(),
537
+ slug: z3.string(),
538
+ description: z3.string().nullable(),
539
+ memberCount: z3.number().optional()
540
+ });
541
+ var agentAdminGroupDetailSchema = agentAdminGroupSchema.extend({
542
+ members: z3.array(
543
+ z3.object({
544
+ userId: z3.string(),
545
+ user: agentAdminUserSchema
546
+ })
547
+ )
548
+ });
549
+ var agentAdminTaskSummarySchema = z3.object({
550
+ id: z3.string(),
551
+ convexId: z3.string(),
552
+ status: z3.string(),
553
+ type: z3.string().nullable(),
554
+ name: z3.string().nullable(),
555
+ description: z3.string().nullable(),
556
+ validUntil: z3.number(),
557
+ createdAt: z3.number(),
558
+ threadPriority: z3.string().nullable(),
559
+ handledByUserId: z3.string().nullable()
560
+ });
561
+ var inviteMemberBodySchema = z3.object({
562
+ email: z3.string().email(),
563
+ role: tenantRoleSchema.optional()
564
+ });
565
+ var updateMemberRoleBodySchema = z3.object({
566
+ role: tenantRoleSchema
567
+ });
568
+ var createGroupBodySchema = z3.object({
569
+ name: z3.string().min(1),
570
+ description: z3.string().optional()
571
+ });
572
+ var updateGroupBodySchema = z3.object({
573
+ name: z3.string().min(1).optional(),
574
+ description: z3.string().optional()
575
+ });
576
+ var addGroupMemberBodySchema = z3.object({
577
+ userId: z3.string().min(1).describe("Convex user id or member email.")
578
+ });
579
+ var listTasksQuerySchema = z3.object({
580
+ statusFilter: z3.enum(["all", "open", "handled", "expired"]).optional(),
581
+ typeFilter: z3.string().optional(),
582
+ appFilter: z3.string().optional(),
583
+ sortField: z3.enum(["type", "date", "status", "validUntil"]).optional(),
584
+ sortDirection: z3.enum(["asc", "desc"]).optional(),
585
+ limit: z3.coerce.number().int().positive().max(100).optional(),
586
+ cursor: z3.string().optional()
587
+ });
588
+ var searchTasksQuerySchema = z3.object({
589
+ q: z3.string().min(1),
590
+ limit: z3.coerce.number().int().positive().max(100).optional()
591
+ });
592
+ var assignTasksResultSchema = z3.object({
593
+ taskId: z3.string(),
594
+ success: z3.boolean(),
595
+ message: z3.string().optional(),
596
+ name: z3.string().nullable().optional(),
597
+ description: z3.string().nullable().optional(),
598
+ type: z3.string().nullable().optional()
599
+ });
600
+ var assignTasksResponseSchema = z3.object({
601
+ results: z3.array(assignTasksResultSchema)
602
+ });
603
+ var assignTasksBodySchema = z3.object({
604
+ taskIds: z3.array(z3.string().min(1)).min(1).max(100),
605
+ assignTo: assignToSchema.refine(
606
+ (value) => (value.users?.length ?? 0) > 0 || (value.groups?.length ?? 0) > 0,
607
+ { message: "assignTo needs at least one user email or group slug." }
608
+ )
609
+ });
610
+
484
611
  // src/schemas/index.ts
485
- var handlerUrlSchema2 = z2.string().refine((url) => isAllowedHandlerUrl(url), {
612
+ var handlerUrlSchema2 = z4.string().refine((url) => isAllowedHandlerUrl(url), {
486
613
  message: HANDLER_URL_ERROR
487
614
  });
488
- var jsonSchema7Schema2 = z2.custom(
615
+ var jsonSchema7Schema2 = z4.custom(
489
616
  (val) => typeof val === "object" && val !== null,
490
617
  { message: "Must be a valid JSON Schema object" }
491
618
  );
492
- var uiSchemaSchema2 = z2.custom((val) => typeof val === "object" && val !== null, {
619
+ var uiSchemaSchema2 = z4.custom((val) => typeof val === "object" && val !== null, {
493
620
  message: "Must be a valid UiSchema object"
494
621
  });
495
- var webhookHandlerSchema2 = z2.object({
496
- type: z2.literal("webhook"),
622
+ var webhookHandlerSchema2 = z4.object({
623
+ type: z4.literal("webhook"),
497
624
  url: handlerUrlSchema2,
498
- headers: z2.record(z2.string(), z2.string())
625
+ headers: z4.record(z4.string(), z4.string())
499
626
  });
500
627
  var triggerHandlerSchema2 = webhookHandlerSchema2.extend({
501
- type: z2.literal("trigger"),
502
- tokenId: z2.string().min(1)
628
+ type: z4.literal("trigger"),
629
+ tokenId: z4.string().min(1)
503
630
  });
504
- var handlerSchema2 = z2.discriminatedUnion("type", [webhookHandlerSchema2, triggerHandlerSchema2]);
505
- var taskActionInputSchema2 = z2.object({
506
- id: z2.string().min(1),
507
- title: z2.string().min(1),
508
- description: z2.string().optional(),
631
+ var handlerSchema2 = z4.discriminatedUnion("type", [webhookHandlerSchema2, triggerHandlerSchema2]);
632
+ var taskActionInputSchema2 = z4.object({
633
+ id: z4.string().min(1),
634
+ title: z4.string().min(1),
635
+ description: z4.string().optional(),
509
636
  schema: jsonSchema7Schema2.optional(),
510
637
  ui: uiSchemaSchema2.optional(),
511
- data: z2.record(z2.string(), z2.unknown()).optional()
638
+ data: z4.record(z4.string(), z4.unknown()).optional()
512
639
  });
513
640
  var taskActionSchema2 = taskActionInputSchema2.extend({
514
- handlers: z2.array(handlerSchema2).min(1).optional()
641
+ handlers: z4.array(handlerSchema2).min(1).optional()
515
642
  });
516
- var uiFieldSchemaSchema2 = z2.object({
517
- "ui:widget": z2.string().optional(),
518
- "ui:title": z2.string().optional(),
519
- "ui:description": z2.string().optional(),
520
- "ui:options": z2.record(z2.string(), z2.unknown()).optional(),
521
- items: z2.lazy(() => z2.record(z2.string(), uiFieldSchemaSchema2)).optional()
643
+ var uiFieldSchemaSchema2 = z4.object({
644
+ "ui:widget": z4.string().optional(),
645
+ "ui:title": z4.string().optional(),
646
+ "ui:description": z4.string().optional(),
647
+ "ui:options": z4.record(z4.string(), z4.unknown()).optional(),
648
+ items: z4.lazy(() => z4.record(z4.string(), uiFieldSchemaSchema2)).optional()
522
649
  }).passthrough();
523
- var contextUiSchema2 = z2.record(z2.string(), uiFieldSchemaSchema2).optional();
524
- var contextDataSchema2 = z2.object({
525
- data: z2.record(z2.string(), z2.unknown()),
650
+ var contextUiSchema2 = z4.record(z4.string(), uiFieldSchemaSchema2).optional();
651
+ var contextDataSchema2 = z4.object({
652
+ data: z4.record(z4.string(), z4.unknown()),
526
653
  ui: contextUiSchema2
527
654
  }).optional();
528
655
  var TASK_CONTEXT_FORMAT_VERSION2 = 2;
529
- var taskContextObjectBaseSchema2 = z2.object({
530
- app: z2.string().min(1).optional(),
531
- type: z2.string().min(1),
532
- name: z2.string().min(1),
533
- description: z2.string().optional(),
534
- validUntil: z2.string().optional(),
656
+ var taskContextObjectBaseSchema2 = z4.object({
657
+ app: z4.string().min(1).optional(),
658
+ type: z4.string().min(1),
659
+ name: z4.string().min(1),
660
+ description: z4.string().optional(),
661
+ validUntil: z4.string().optional(),
535
662
  context: contextDataSchema2,
536
- contextVersion: z2.literal(2).optional(),
663
+ contextVersion: z4.literal(2).optional(),
537
664
  /** @deprecated Use `contextVersion`. Accepted on ingest only. */
538
- version: z2.literal(2).optional(),
539
- actions: z2.array(taskActionSchema2).min(1, "At least one action is required")
665
+ version: z4.literal(2).optional(),
666
+ actions: z4.array(taskActionSchema2).min(1, "At least one action is required")
540
667
  });
541
668
  function normalizeTaskContextVersion2(data) {
542
669
  const { version: legacyVersion, contextVersion, ...rest } = data;
@@ -552,7 +679,7 @@ function refineContextPublicUrls2(data, ctx) {
552
679
  const error = validateContextPublicUrls(data.context);
553
680
  if (error) {
554
681
  ctx.addIssue({
555
- code: z2.ZodIssueCode.custom,
682
+ code: z4.ZodIssueCode.custom,
556
683
  message: error,
557
684
  path: ["context"]
558
685
  });
@@ -561,9 +688,9 @@ function refineContextPublicUrls2(data, ctx) {
561
688
  var taskContextSchema2 = taskContextObjectSchema2.superRefine(
562
689
  refineContextPublicUrls2
563
690
  );
564
- var assignToSchema2 = z2.object({
565
- users: z2.array(z2.string().email()).optional(),
566
- groups: z2.array(z2.string().min(1)).optional()
691
+ var assignToSchema2 = z4.object({
692
+ users: z4.array(z4.string().email()).optional(),
693
+ groups: z4.array(z4.string().min(1)).optional()
567
694
  }).refine(
568
695
  (data) => {
569
696
  const groups = data.groups ?? [];
@@ -574,7 +701,7 @@ var assignToSchema2 = z2.object({
574
701
  },
575
702
  { message: 'Cannot combine "all" with other group slugs' }
576
703
  );
577
- var threadUpdateMessageSchema2 = z2.string().min(1).max(500);
704
+ var threadUpdateMessageSchema2 = z4.string().min(1).max(500);
578
705
  var threadUpdateStatuses2 = [
579
706
  "info",
580
707
  "queued",
@@ -584,15 +711,15 @@ var threadUpdateStatuses2 = [
584
711
  "failed",
585
712
  "cancelled"
586
713
  ];
587
- var threadUpdateStatusSchema2 = z2.enum(threadUpdateStatuses2);
588
- var threadUpdateInputSchema2 = z2.object({
714
+ var threadUpdateStatusSchema2 = z4.enum(threadUpdateStatuses2);
715
+ var threadUpdateInputSchema2 = z4.object({
589
716
  message: threadUpdateMessageSchema2,
590
717
  status: threadUpdateStatusSchema2.optional()
591
718
  });
592
719
  var taskPriorities2 = ["low", "normal", "high", "urgent"];
593
- var taskPrioritySchema2 = z2.enum(taskPriorities2);
594
- var agentTelemetrySchema2 = z2.object({
595
- version: z2.string().min(1)
720
+ var taskPrioritySchema2 = z4.enum(taskPriorities2);
721
+ var agentTelemetrySchema2 = z4.object({
722
+ version: z4.string().min(1)
596
723
  });
597
724
  var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
598
725
  assignTo: assignToSchema2.optional(),
@@ -600,7 +727,7 @@ var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
600
727
  * Groups related tasks together. When omitted, the server generates one and
601
728
  * returns it so the caller can reuse it on later tasks in the same thread.
602
729
  */
603
- threadId: z2.string().min(1).optional(),
730
+ threadId: z4.string().min(1).optional(),
604
731
  /**
605
732
  * Optional thread priority. When set, applies to the whole thread and
606
733
  * overwrites any previous priority. Omit on later tasks to leave unchanged.
@@ -615,6 +742,65 @@ var createTaskBodySchema2 = taskContextObjectBaseSchema2.extend({
615
742
  }).transform(normalizeTaskContextVersion2).superRefine(refineContextPublicUrls2);
616
743
  var threadUpdateBodySchema = threadUpdateInputSchema2;
617
744
 
745
+ // ../core/src/handler-retry.ts
746
+ var HANDLER_RETRY_DELAYS_MS = [
747
+ 6e4,
748
+ // 1m
749
+ 3e5,
750
+ // 5m
751
+ 18e5,
752
+ // 30m
753
+ 36e5,
754
+ // 1h
755
+ 216e5,
756
+ // 6h
757
+ 864e5,
758
+ // 24h
759
+ 1728e5
760
+ // 48h
761
+ ];
762
+ var HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;
763
+
764
+ // ../core/src/attribution/index.ts
765
+ import { z as z5 } from "zod";
766
+
767
+ // ../core/src/app-url.ts
768
+ var PRODUCTION_APP_URL = "https://app.robotrock.io";
769
+ var PRODUCTION_API_URL = "https://api.robotrock.io/v1";
770
+ var DEV_API_URL = "http://localhost:4001/v1";
771
+ var APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;
772
+ function normalizeRobotRockApiBaseUrl(baseUrl) {
773
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
774
+ if (trimmed.endsWith("/v1")) {
775
+ return trimmed;
776
+ }
777
+ return `${trimmed}/v1`;
778
+ }
779
+ function getRobotRockApiBaseUrl() {
780
+ const explicit = process.env.ROBOTROCK_BASE_URL?.trim() || process.env.ROBOTROCK_API_URL?.trim();
781
+ if (explicit) {
782
+ return normalizeRobotRockApiBaseUrl(explicit);
783
+ }
784
+ if (process.env.NODE_ENV === "production") {
785
+ return PRODUCTION_API_URL;
786
+ }
787
+ return DEV_API_URL;
788
+ }
789
+
790
+ // ../core/src/attribution/index.ts
791
+ var ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90;
792
+ var attributionSchema = z5.object({
793
+ utmSource: z5.string().optional(),
794
+ utmMedium: z5.string().optional(),
795
+ utmCampaign: z5.string().optional(),
796
+ utmContent: z5.string().optional(),
797
+ utmTerm: z5.string().optional(),
798
+ gclid: z5.string().optional(),
799
+ landingUrl: z5.string().optional(),
800
+ referrer: z5.string().optional(),
801
+ capturedAt: z5.number()
802
+ });
803
+
618
804
  // src/approval-result.ts
619
805
  var TaskTimeoutError = class extends Error {
620
806
  constructor(message) {
@@ -689,77 +875,27 @@ function getErrorMessage(data, fallback) {
689
875
  return fallback;
690
876
  }
691
877
 
692
- // ../core/src/handler-retry.ts
693
- var HANDLER_RETRY_DELAYS_MS = [
694
- 6e4,
695
- // 1m
696
- 3e5,
697
- // 5m
698
- 18e5,
699
- // 30m
700
- 36e5,
701
- // 1h
702
- 216e5,
703
- // 6h
704
- 864e5,
705
- // 24h
706
- 1728e5
707
- // 48h
708
- ];
709
- var HANDLER_MAX_ATTEMPTS = HANDLER_RETRY_DELAYS_MS.length + 1;
710
-
711
- // ../core/src/attribution/index.ts
712
- import { z as z3 } from "zod";
713
-
714
- // ../core/src/app-url.ts
715
- var PRODUCTION_APP_URL = "https://app.robotrock.io";
716
- var PRODUCTION_API_URL = "https://api.robotrock.io/v1";
717
- var DEV_API_URL = "http://localhost:4001/v1";
718
- var APP_SIGNUP_URL = `${PRODUCTION_APP_URL}/sign-up`;
719
- function normalizeRobotRockApiBaseUrl(baseUrl) {
720
- const trimmed = baseUrl.trim().replace(/\/+$/, "");
721
- if (trimmed.endsWith("/v1")) {
722
- return trimmed;
723
- }
724
- return `${trimmed}/v1`;
725
- }
726
- function getRobotRockApiBaseUrl() {
727
- const explicit = process.env.ROBOTROCK_BASE_URL?.trim() || process.env.ROBOTROCK_API_URL?.trim();
728
- if (explicit) {
729
- return normalizeRobotRockApiBaseUrl(explicit);
730
- }
731
- if (process.env.NODE_ENV === "production") {
732
- return PRODUCTION_API_URL;
733
- }
734
- return DEV_API_URL;
735
- }
736
-
737
- // ../core/src/attribution/index.ts
738
- var ATTRIBUTION_COOKIE_MAX_AGE = 60 * 60 * 24 * 90;
739
- var attributionSchema = z3.object({
740
- utmSource: z3.string().optional(),
741
- utmMedium: z3.string().optional(),
742
- utmCampaign: z3.string().optional(),
743
- utmContent: z3.string().optional(),
744
- utmTerm: z3.string().optional(),
745
- gclid: z3.string().optional(),
746
- landingUrl: z3.string().optional(),
747
- referrer: z3.string().optional(),
748
- capturedAt: z3.number()
749
- });
750
-
751
878
  // src/auth-headers.ts
879
+ var ROBOTROCK_ACTING_USER_ID_HEADER = "x-robotrock-acting-user-id";
752
880
  function buildRobotRockAuthHeaders(auth) {
753
881
  if (auth.kind === "apiKey") {
754
- return {
882
+ const headers2 = {
755
883
  "X-Api-Key": auth.apiKey
756
884
  };
885
+ if (auth.actingUserId?.trim()) {
886
+ headers2[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();
887
+ }
888
+ return headers2;
757
889
  }
758
- return {
890
+ const headers = {
759
891
  Authorization: `Bearer ${auth.token}`,
760
892
  "X-RobotRock-Tenant-Slug": auth.tenantSlug,
761
893
  "X-RobotRock-Connection-Id": auth.connectionId
762
894
  };
895
+ if (auth.actingUserId?.trim()) {
896
+ headers[ROBOTROCK_ACTING_USER_ID_HEADER] = auth.actingUserId.trim();
897
+ }
898
+ return headers;
763
899
  }
764
900
  function resolveRobotRockAuthConfig(overrides) {
765
901
  if (overrides?.agentService) {
@@ -903,6 +1039,29 @@ function createChatsApi(config) {
903
1039
  );
904
1040
  }
905
1041
  },
1042
+ async logToolExecution(input) {
1043
+ const validation = agentChatAuditToolBodySchema.safeParse(input);
1044
+ if (!validation.success) {
1045
+ throw new RobotRockError(
1046
+ `Invalid audit tool input: ${validation.error.issues[0]?.message}`,
1047
+ 400,
1048
+ validation.error.issues
1049
+ );
1050
+ }
1051
+ const response = await fetch(`${config.baseUrl}/agent-chats/audit-tool`, {
1052
+ method: "POST",
1053
+ headers: headers(),
1054
+ body: JSON.stringify(validation.data)
1055
+ });
1056
+ if (!response.ok) {
1057
+ const data = await parseResponseBody(response);
1058
+ throw new RobotRockError(
1059
+ getErrorMessage(data, "Failed to log chat tool execution"),
1060
+ response.status,
1061
+ data
1062
+ );
1063
+ }
1064
+ },
906
1065
  async linkTask(input) {
907
1066
  const validation = agentChatLinkTaskBodySchema.safeParse(input);
908
1067
  if (!validation.success) {
@@ -1005,7 +1164,9 @@ var RobotRock = class {
1005
1164
  create: (task) => this.createTaskRequest(task),
1006
1165
  get: (taskId) => this.getTaskById(taskId),
1007
1166
  cancel: (taskId) => this.cancelTaskRequest(taskId),
1008
- sendUpdate: (input) => this.sendThreadUpdate(input)
1167
+ sendUpdate: (input) => this.sendThreadUpdate(input),
1168
+ list: (input) => this.listTasksRequest(input),
1169
+ search: (input) => this.searchTasksRequest(input)
1009
1170
  };
1010
1171
  this.chats = createChatsApi({
1011
1172
  baseUrl: this.baseUrl,
@@ -1202,6 +1363,47 @@ var RobotRock = class {
1202
1363
  );
1203
1364
  }
1204
1365
  }
1366
+ async listTasksRequest(input) {
1367
+ const params = new URLSearchParams();
1368
+ for (const [key, value] of Object.entries(input ?? {})) {
1369
+ if (value !== void 0 && value !== "") {
1370
+ params.set(key, String(value));
1371
+ }
1372
+ }
1373
+ const suffix = params.size > 0 ? `?${params.toString()}` : "";
1374
+ const response = await fetch(`${this.baseUrl}/tasks${suffix}`, {
1375
+ method: "GET",
1376
+ headers: this.authHeaders()
1377
+ });
1378
+ const data = await parseResponseBody(response);
1379
+ if (!response.ok) {
1380
+ throw new RobotRockError(
1381
+ getErrorMessage(data, "Failed to list tasks"),
1382
+ response.status,
1383
+ data
1384
+ );
1385
+ }
1386
+ return data;
1387
+ }
1388
+ async searchTasksRequest(input) {
1389
+ const params = new URLSearchParams({ q: input.q });
1390
+ if (input.limit !== void 0) {
1391
+ params.set("limit", String(input.limit));
1392
+ }
1393
+ const response = await fetch(`${this.baseUrl}/tasks/search?${params.toString()}`, {
1394
+ method: "GET",
1395
+ headers: this.authHeaders()
1396
+ });
1397
+ const data = await parseResponseBody(response);
1398
+ if (!response.ok) {
1399
+ throw new RobotRockError(
1400
+ getErrorMessage(data, "Failed to search tasks"),
1401
+ response.status,
1402
+ data
1403
+ );
1404
+ }
1405
+ return data;
1406
+ }
1205
1407
  };
1206
1408
  function createClient(config) {
1207
1409
  return new RobotRock(config);