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.
- package/README.md +2 -2
- package/dist/agent-admin.d.ts +82 -0
- package/dist/agent-admin.js +938 -0
- package/dist/agent-admin.js.map +1 -0
- package/dist/ai/index.d.ts +6 -5
- package/dist/ai/index.js +407 -188
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/trigger.d.ts +4 -3
- package/dist/ai/trigger.js +407 -188
- package/dist/ai/trigger.js.map +1 -1
- package/dist/ai/workflow.d.ts +4 -3
- package/dist/ai/workflow.js +404 -185
- package/dist/ai/workflow.js.map +1 -1
- package/dist/auth-headers-qL-ZeEtd.d.ts +13 -0
- package/dist/{client-XTnFHGFE.d.ts → client-YO9Y1rkH.d.ts} +29 -17
- package/dist/eve/agent/index.d.ts +11 -35
- package/dist/eve/agent/index.js +678 -146
- package/dist/eve/agent/index.js.map +1 -1
- package/dist/eve/index.d.ts +5 -2
- package/dist/eve/index.js +195 -2
- package/dist/eve/index.js.map +1 -1
- package/dist/eve/tools/admin/assign-tasks.d.ts +39 -0
- package/dist/eve/tools/admin/assign-tasks.js +1060 -0
- package/dist/eve/tools/admin/assign-tasks.js.map +1 -0
- package/dist/eve/tools/admin/manage-groups.d.ts +53 -0
- package/dist/eve/tools/admin/manage-groups.js +1218 -0
- package/dist/eve/tools/admin/manage-groups.js.map +1 -0
- package/dist/eve/tools/admin/manage-team-members.d.ts +45 -0
- package/dist/eve/tools/admin/manage-team-members.js +1160 -0
- package/dist/eve/tools/admin/manage-team-members.js.map +1 -0
- package/dist/eve/tools/admin/query-tasks.d.ts +71 -0
- package/dist/eve/tools/admin/query-tasks.js +1161 -0
- package/dist/eve/tools/admin/query-tasks.js.map +1 -0
- package/dist/eve/tools/catalog/search-products.d.ts +57 -0
- package/dist/eve/tools/catalog/search-products.js +94 -0
- package/dist/eve/tools/catalog/search-products.js.map +1 -0
- package/dist/eve/tools/identity/index.d.ts +2 -0
- package/dist/eve/tools/identity/index.js +117 -27
- package/dist/eve/tools/identity/index.js.map +1 -1
- package/dist/eve/tools/identity/my-access.d.ts +6 -46
- package/dist/eve/tools/identity/my-access.js +91 -10
- package/dist/eve/tools/identity/my-access.js.map +1 -1
- package/dist/eve/tools/identity/whoami.d.ts +7 -8
- package/dist/eve/tools/identity/whoami.js +33 -17
- package/dist/eve/tools/identity/whoami.js.map +1 -1
- package/dist/eve/tools/inbox/create-task.d.ts +5 -4
- package/dist/eve/tools/inbox/create-task.js +365 -137
- package/dist/eve/tools/inbox/create-task.js.map +1 -1
- package/dist/eve/tools/inbox/index.d.ts +1 -0
- package/dist/eve/tools/inbox/index.js +365 -137
- package/dist/eve/tools/inbox/index.js.map +1 -1
- package/dist/eve/tools/index.d.ts +7 -0
- package/dist/eve/tools/index.js +1362 -168
- package/dist/eve/tools/index.js.map +1 -1
- package/dist/{index-BL9qKHA8.d.ts → index-DoQN48Bm.d.ts} +61 -2
- package/dist/index.d.ts +6 -3
- package/dist/index.js +325 -119
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.d.ts +6 -1
- package/dist/schemas/index.js +177 -48
- package/dist/schemas/index.js.map +1 -1
- package/dist/{tool-approval-bridge-C4bTm8vu.d.ts → tool-approval-bridge-aMA79Z1B.d.ts} +1 -1
- package/dist/tool-reply-guidance-C3qrT1In.d.ts +25 -0
- package/dist/trigger/index.d.ts +2 -1
- package/dist/trigger/index.js +310 -108
- package/dist/trigger/index.js.map +1 -1
- package/dist/{trigger-Dn0DFiyU.d.ts → trigger-CXrbKVCL.d.ts} +2 -2
- package/dist/workflow/index.d.ts +2 -1
- package/dist/workflow/index.js +310 -108
- package/dist/workflow/index.js.map +1 -1
- package/package.json +30 -6
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { CREATE_INBOX_TASK_TOOL_NAME, CreateInboxTaskToolInput, DefineCreateInboxTaskToolOptions, createInboxTaskInputSchema, createInboxTaskTool, defineCreateInboxTaskTool } from './create-task.js';
|
|
2
2
|
import 'eve/tools';
|
|
3
|
+
import '../../../tool-reply-guidance-C3qrT1In.js';
|
|
3
4
|
import 'zod';
|
|
4
5
|
import '../../../tenant-5YKDrdC-.js';
|
|
5
6
|
import 'eve/context';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/eve/tools/inbox/create-task.ts
|
|
2
2
|
import { defineTool } from "eve/tools";
|
|
3
|
-
import { z as
|
|
3
|
+
import { z as z6 } from "zod";
|
|
4
4
|
|
|
5
5
|
// src/schemas/index.ts
|
|
6
|
-
import { z as
|
|
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
|
-
|
|
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 =
|
|
567
|
+
var handlerUrlSchema2 = z4.string().refine((url) => isAllowedHandlerUrl(url), {
|
|
441
568
|
message: HANDLER_URL_ERROR
|
|
442
569
|
});
|
|
443
|
-
var jsonSchema7Schema2 =
|
|
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 =
|
|
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 =
|
|
451
|
-
type:
|
|
577
|
+
var webhookHandlerSchema2 = z4.object({
|
|
578
|
+
type: z4.literal("webhook"),
|
|
452
579
|
url: handlerUrlSchema2,
|
|
453
|
-
headers:
|
|
580
|
+
headers: z4.record(z4.string(), z4.string())
|
|
454
581
|
});
|
|
455
582
|
var triggerHandlerSchema2 = webhookHandlerSchema2.extend({
|
|
456
|
-
type:
|
|
457
|
-
tokenId:
|
|
583
|
+
type: z4.literal("trigger"),
|
|
584
|
+
tokenId: z4.string().min(1)
|
|
458
585
|
});
|
|
459
|
-
var handlerSchema2 =
|
|
460
|
-
var taskActionInputSchema2 =
|
|
461
|
-
id:
|
|
462
|
-
title:
|
|
463
|
-
description:
|
|
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:
|
|
593
|
+
data: z4.record(z4.string(), z4.unknown()).optional()
|
|
467
594
|
});
|
|
468
595
|
var taskActionSchema2 = taskActionInputSchema2.extend({
|
|
469
|
-
handlers:
|
|
596
|
+
handlers: z4.array(handlerSchema2).min(1).optional()
|
|
470
597
|
});
|
|
471
|
-
var uiFieldSchemaSchema2 =
|
|
472
|
-
"ui:widget":
|
|
473
|
-
"ui:title":
|
|
474
|
-
"ui:description":
|
|
475
|
-
"ui:options":
|
|
476
|
-
items:
|
|
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 =
|
|
479
|
-
var contextDataSchema2 =
|
|
480
|
-
data:
|
|
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 =
|
|
485
|
-
app:
|
|
486
|
-
type:
|
|
487
|
-
name:
|
|
488
|
-
description:
|
|
489
|
-
validUntil:
|
|
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:
|
|
618
|
+
contextVersion: z4.literal(2).optional(),
|
|
492
619
|
/** @deprecated Use `contextVersion`. Accepted on ingest only. */
|
|
493
|
-
version:
|
|
494
|
-
actions:
|
|
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:
|
|
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 =
|
|
520
|
-
users:
|
|
521
|
-
groups:
|
|
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 =
|
|
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 =
|
|
543
|
-
var threadUpdateInputSchema2 =
|
|
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 =
|
|
549
|
-
var agentTelemetrySchema2 =
|
|
550
|
-
version:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
1482
|
-
id:
|
|
1483
|
-
title:
|
|
1484
|
-
description:
|
|
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 =
|
|
1487
|
-
users:
|
|
1488
|
-
groups:
|
|
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 =
|
|
1494
|
-
data:
|
|
1495
|
-
ui:
|
|
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 =
|
|
1498
|
-
type:
|
|
1499
|
-
name:
|
|
1500
|
-
description:
|
|
1501
|
-
actions:
|
|
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:
|
|
1507
|
-
priority:
|
|
1508
|
-
updateMessage:
|
|
1509
|
-
delegationReason:
|
|
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
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
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
|
}
|