robotrock 1.0.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/agent-admin.d.ts +82 -0
  2. package/dist/agent-admin.js +938 -0
  3. package/dist/agent-admin.js.map +1 -0
  4. package/dist/ai/index.d.ts +6 -5
  5. package/dist/ai/index.js +682 -225
  6. package/dist/ai/index.js.map +1 -1
  7. package/dist/ai/trigger.d.ts +4 -3
  8. package/dist/ai/trigger.js +682 -225
  9. package/dist/ai/trigger.js.map +1 -1
  10. package/dist/ai/workflow.d.ts +4 -3
  11. package/dist/ai/workflow.js +679 -222
  12. package/dist/ai/workflow.js.map +1 -1
  13. package/dist/auth-headers-qL-ZeEtd.d.ts +13 -0
  14. package/dist/{client-CzVmjXpz.d.ts → client-YO9Y1rkH.d.ts} +51 -10
  15. package/dist/eve/agent/index.d.ts +164 -0
  16. package/dist/eve/agent/index.js +2854 -0
  17. package/dist/eve/agent/index.js.map +1 -0
  18. package/dist/eve/index.d.ts +8 -0
  19. package/dist/eve/index.js +639 -0
  20. package/dist/eve/index.js.map +1 -0
  21. package/dist/eve/tools/admin/assign-tasks.d.ts +39 -0
  22. package/dist/eve/tools/admin/assign-tasks.js +1060 -0
  23. package/dist/eve/tools/admin/assign-tasks.js.map +1 -0
  24. package/dist/eve/tools/admin/manage-groups.d.ts +53 -0
  25. package/dist/eve/tools/admin/manage-groups.js +1218 -0
  26. package/dist/eve/tools/admin/manage-groups.js.map +1 -0
  27. package/dist/eve/tools/admin/manage-team-members.d.ts +45 -0
  28. package/dist/eve/tools/admin/manage-team-members.js +1160 -0
  29. package/dist/eve/tools/admin/manage-team-members.js.map +1 -0
  30. package/dist/eve/tools/admin/query-tasks.d.ts +71 -0
  31. package/dist/eve/tools/admin/query-tasks.js +1161 -0
  32. package/dist/eve/tools/admin/query-tasks.js.map +1 -0
  33. package/dist/eve/tools/catalog/search-products.d.ts +57 -0
  34. package/dist/eve/tools/catalog/search-products.js +94 -0
  35. package/dist/eve/tools/catalog/search-products.js.map +1 -0
  36. package/dist/eve/tools/identity/index.d.ts +8 -0
  37. package/dist/eve/tools/identity/index.js +234 -0
  38. package/dist/eve/tools/identity/index.js.map +1 -0
  39. package/dist/eve/tools/identity/my-access.d.ts +18 -0
  40. package/dist/eve/tools/identity/my-access.js +187 -0
  41. package/dist/eve/tools/identity/my-access.js.map +1 -0
  42. package/dist/eve/tools/identity/whoami.d.ts +44 -0
  43. package/dist/eve/tools/identity/whoami.js +117 -0
  44. package/dist/eve/tools/identity/whoami.js.map +1 -0
  45. package/dist/eve/tools/inbox/create-task.d.ts +114 -0
  46. package/dist/eve/tools/inbox/create-task.js +1785 -0
  47. package/dist/eve/tools/inbox/create-task.js.map +1 -0
  48. package/dist/eve/tools/inbox/index.d.ts +6 -0
  49. package/dist/eve/tools/inbox/index.js +1785 -0
  50. package/dist/eve/tools/inbox/index.js.map +1 -0
  51. package/dist/eve/tools/index.d.ts +24 -0
  52. package/dist/eve/tools/index.js +2848 -0
  53. package/dist/eve/tools/index.js.map +1 -0
  54. package/dist/index-DoQN48Bm.d.ts +200 -0
  55. package/dist/index.d.ts +8 -44
  56. package/dist/index.js +842 -137
  57. package/dist/index.js.map +1 -1
  58. package/dist/schemas/index.d.ts +6 -1
  59. package/dist/schemas/index.js +251 -59
  60. package/dist/schemas/index.js.map +1 -1
  61. package/dist/tenant-5YKDrdC-.d.ts +23 -0
  62. package/dist/{tool-approval-bridge-DbwUEBHv.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 +543 -127
  66. package/dist/trigger/index.js.map +1 -1
  67. package/dist/{trigger-BCKBbAV7.d.ts → trigger-CXrbKVCL.d.ts} +2 -2
  68. package/dist/workflow/index.d.ts +2 -1
  69. package/dist/workflow/index.js +543 -127
  70. package/dist/workflow/index.js.map +1 -1
  71. package/package.json +69 -8
@@ -0,0 +1,13 @@
1
+ type RobotRockAuthConfig = {
2
+ kind: "apiKey";
3
+ apiKey: string;
4
+ actingUserId?: string;
5
+ } | {
6
+ kind: "agentService";
7
+ token: string;
8
+ tenantSlug: string;
9
+ connectionId: string;
10
+ actingUserId?: string;
11
+ };
12
+
13
+ export type { RobotRockAuthConfig as R };
@@ -1,5 +1,7 @@
1
- import { TaskContextInput, AssignToInput as AssignToInput$1, TaskPriority, ThreadUpdateStatus, TaskResponse, Task, ThreadUpdate, TaskContextFormatVersion, DiscriminatedApprovalResult } from './schemas/index.js';
2
- import { AssignToInput, AgentChatSeedMessage } from '@robotrock/core';
1
+ import { TaskContextInput, AssignToInput, TaskPriority, ThreadUpdateStatus, TaskResponse, Task, ThreadUpdate, TaskContextFormatVersion, DiscriminatedApprovalResult } from './schemas/index.js';
2
+ import { AgentChatSeedMessage, AgentChatStageHitlBody, AgentChatAuditInputBody, AgentChatAuditToolBody, AgentChatLinkTaskBody, listTasksQuerySchema, AgentAdminTaskSummary } from '@robotrock/core';
3
+ import { z } from 'zod';
4
+ import { R as RobotRockAuthConfig } from './auth-headers-qL-ZeEtd.js';
3
5
 
4
6
  /** A chat created via {@link ChatsApi.create}. */
5
7
  type CreatedChat = {
@@ -22,8 +24,8 @@ type CreateChatInput = {
22
24
  connectionId?: string;
23
25
  /** Inbox app bucket. Overrides the client `app` when set. */
24
26
  app?: string;
25
- /** Assign to tenant users (email) and/or groups (slug). Narrows inbox visibility. */
26
- assignTo?: AssignToInput;
27
+ /** Email of the user who owns the chat. Required unless `parentChatId` is set. */
28
+ ownerEmail?: string;
27
29
  /** Chat title shown in the inbox. */
28
30
  title: string;
29
31
  /** Seed messages to preload the conversation. Defaults to a welcome message. */
@@ -35,11 +37,26 @@ type CloseChatOptions = {
35
37
  /** Optional human-readable reason recorded on the audit trail. */
36
38
  reason?: string;
37
39
  };
40
+ type LogChatToolExecutionInput = AgentChatAuditToolBody;
41
+ type LogChatInputSubmissionInput = AgentChatAuditInputBody;
42
+ type StageChatHitlRequestsInput = AgentChatStageHitlBody;
43
+ type LinkChatTaskInput = AgentChatLinkTaskBody;
44
+ type StagedChatHitlRequest = StageChatHitlRequestsInput["requests"][number];
38
45
  interface ChatsApi {
39
- /** Create one or more agent chats and assign them (task-style). */
46
+ /** Create an agent chat owned by a single user. */
40
47
  create(input: CreateChatInput): Promise<CreateChatResult>;
41
48
  /** Close (archive) a chat by its public chatId — e.g. when an agent is done. */
42
49
  close(chatId: string, options?: CloseChatOptions): Promise<void>;
50
+ /** Persist pending Eve HITL requests on the chat for durable audit logging. */
51
+ stageHitlRequests(input: StageChatHitlRequestsInput): Promise<void>;
52
+ /** Read pending Eve HITL requests staged on the chat. */
53
+ getStagedHitlRequests(eveSessionId: string): Promise<StagedChatHitlRequest[]>;
54
+ /** Log an Eve HITL choice to the RobotRock chat audit trail. */
55
+ logInputSubmission(input: LogChatInputSubmissionInput): Promise<void>;
56
+ /** Log a mutating Eve tool execution to the RobotRock chat audit trail. */
57
+ logToolExecution(input: LogChatToolExecutionInput): Promise<void>;
58
+ /** Link an inbox task to the originating Eve chat session. */
59
+ linkTask(input: LinkChatTaskInput): Promise<void>;
43
60
  }
44
61
  /**
45
62
  * Build the `client.chats` namespace. Mirrors the `client.tasks` surface for the
@@ -47,7 +64,7 @@ interface ChatsApi {
47
64
  */
48
65
  declare function createChatsApi(config: {
49
66
  baseUrl: string;
50
- apiKey: string;
67
+ auth: RobotRockAuthConfig;
51
68
  app?: string;
52
69
  }): ChatsApi;
53
70
 
@@ -71,8 +88,14 @@ type RobotRockAdvancedConfig = {
71
88
  contextVersion?: TaskContextFormatVersion;
72
89
  };
73
90
  type RobotRockClientBaseConfig = {
74
- /** Optional override for API key. Falls back to ROBOTROCK_API_KEY. */
91
+ /** Optional override for API key. Falls back to ROBOTROCK_API_KEY when agentService is unset. */
75
92
  apiKey?: string;
93
+ /** Hosted-agent service auth (mutually exclusive with apiKey). */
94
+ agentService?: {
95
+ token: string;
96
+ tenantSlug: string;
97
+ connectionId: string;
98
+ };
76
99
  /**
77
100
  * Base URL for the RobotRock API
78
101
  * @default "https://api.robotrock.io/v1"
@@ -111,7 +134,7 @@ type SendToHumanInput<A extends readonly SendToHumanActionInput[] = readonly Sen
111
134
  /** Optional idempotency key to prevent duplicate tasks */
112
135
  idempotencyKey?: string;
113
136
  /** Assign to tenant users (email) and/or groups (slug). Narrows inbox visibility. */
114
- assignTo?: AssignToInput$1;
137
+ assignTo?: AssignToInput;
115
138
  /**
116
139
  * Groups related tasks together in the inbox. Omit to let the server generate
117
140
  * one (returned as `task.threadId`) and reuse it on later tasks in the thread.
@@ -158,6 +181,11 @@ type SendToHumanResult<A extends readonly SendToHumanActionInput[] = readonly Se
158
181
  task: TaskResponse["task"];
159
182
  } & DiscriminatedApprovalResult<A>);
160
183
 
184
+ type ListTasksInput = z.infer<typeof listTasksQuerySchema>;
185
+ type SearchTasksInput = {
186
+ q: string;
187
+ limit?: number;
188
+ };
161
189
  /** Task CRUD surface, exposed as `client.tasks`. */
162
190
  interface TasksApi {
163
191
  /** Create a task via POST /v1 without waiting for a human response. */
@@ -168,6 +196,16 @@ interface TasksApi {
168
196
  cancel(taskId: string): Promise<void>;
169
197
  /** Log a status update against a thread. */
170
198
  sendUpdate(input: SendUpdateInput): Promise<ThreadUpdate>;
199
+ /** List tasks in the workspace for this API key. */
200
+ list(input?: ListTasksInput): Promise<{
201
+ items: AgentAdminTaskSummary[];
202
+ nextCursor: string | null;
203
+ }>;
204
+ /** Search tasks by type, name, description, or id. */
205
+ search(input: SearchTasksInput): Promise<{
206
+ items: AgentAdminTaskSummary[];
207
+ total: number;
208
+ }>;
171
209
  }
172
210
  /**
173
211
  * RobotRock API client for creating and querying human-in-the-loop tasks and
@@ -175,7 +213,7 @@ interface TasksApi {
175
213
  * `sendToHuman` verb stays top-level.
176
214
  */
177
215
  declare class RobotRock {
178
- private readonly apiKey;
216
+ private readonly auth;
179
217
  private readonly baseUrl;
180
218
  private readonly app?;
181
219
  private readonly agentVersion?;
@@ -187,6 +225,7 @@ declare class RobotRock {
187
225
  /** Chat CRUD: `create`, `close`. */
188
226
  readonly chats: ChatsApi;
189
227
  constructor(config: RobotRockConfig);
228
+ private authHeaders;
190
229
  private createTaskRequest;
191
230
  sendToHuman<const A extends readonly SendToHumanActionInput[]>(task: SendToHumanWithAppInput<A>): Promise<SendToHumanResult<A>>;
192
231
  /**
@@ -212,8 +251,10 @@ declare class RobotRock {
212
251
  private getTaskById;
213
252
  private sendThreadUpdate;
214
253
  private cancelTaskRequest;
254
+ private listTasksRequest;
255
+ private searchTasksRequest;
215
256
  }
216
257
  declare function createClient(config: RobotRockConfig): RobotRock;
217
258
  declare function attachWebhookToActions(actions: readonly SendToHumanActionInput[], webhook: RobotRockWebhookConfig): TaskContextInput["actions"];
218
259
 
219
- export { type ChatsApi as C, RobotRock as R, type SendToHumanActionInput as S, type TasksApi as T, type SendToHumanInput as a, type RobotRockConfig as b, type CloseChatOptions as c, type CreateChatInput as d, type CreateChatResult as e, type CreatedChat as f, type RobotRockAdvancedConfig as g, type RobotRockPollingClientConfig as h, type RobotRockPollingOptions as i, type RobotRockWebhookClientConfig as j, type RobotRockWebhookConfig as k, type SendToHumanResult as l, type SendToHumanValidUntil as m, type SendUpdateInput as n, attachWebhookToActions as o, createChatsApi as p, createClient as q };
260
+ export { type ChatsApi as C, type ListTasksInput as L, RobotRock as R, type SendToHumanActionInput as S, type TasksApi as T, type SendToHumanInput as a, type RobotRockConfig as b, type CloseChatOptions as c, type CreateChatInput as d, type CreateChatResult as e, type CreatedChat as f, type RobotRockAdvancedConfig as g, type RobotRockPollingClientConfig as h, type RobotRockPollingOptions as i, type RobotRockWebhookClientConfig as j, type RobotRockWebhookConfig as k, type SearchTasksInput as l, type SendToHumanResult as m, type SendToHumanValidUntil as n, type SendUpdateInput as o, type StageChatHitlRequestsInput as p, type StagedChatHitlRequest as q, attachWebhookToActions as r, createChatsApi as s, createClient as t };
@@ -0,0 +1,164 @@
1
+ export { a as TenantCaller, T as TenantRole, i as isAdminCaller, r as requireAdminCaller, b as requireTenantCaller, t as tryResolveTenantCaller } from '../../tenant-5YKDrdC-.js';
2
+ import { AuthFn, vercelOidc } from 'eve/channels/auth';
3
+ import * as eve_channels_eve from 'eve/channels/eve';
4
+ import { R as RobotRock, q as StagedChatHitlRequest, a as SendToHumanInput, S as SendToHumanActionInput, e as CreateChatResult } from '../../client-YO9Y1rkH.js';
5
+ import { SessionContext } from 'eve/context';
6
+ import { TaskPriority } from '../../schemas/index.js';
7
+ import { HookDefinition } from 'eve/hooks';
8
+ export { AgentAdminApi, createAgentAdminApi, createBoundAgentAdminClient, requireBoundAgentAdminClient } from '../../agent-admin.js';
9
+ export { ROBOTROCK_PLATFORM_USER_CONTEXT_PUBLIC_KEY_URL } from '@robotrock/core/eve/platform-user-context-public-key';
10
+ export { R as ROBOTROCK_READY_HOOK_SLUG } from '../../index-DoQN48Bm.js';
11
+ export { ROBOTROCK_USER_CONTEXT_AUDIENCE, ROBOTROCK_USER_CONTEXT_ISSUER } from '@robotrock/core/eve/user-context-jwt';
12
+ import '@robotrock/core';
13
+ import 'zod';
14
+ import '../../auth-headers-qL-ZeEtd.js';
15
+ import '@robotrock/core/schemas';
16
+ import '../../tool-reply-guidance-C3qrT1In.js';
17
+
18
+ /** Header carrying the dashboard user-context JWT on proxied Eve requests. */
19
+ declare const ROBOTROCK_USER_CONTEXT_HEADER = "x-robotrock-user-token";
20
+
21
+ type RobotrockUserContextAuthOptions = {
22
+ publicKeyPem?: string | (() => Promise<string | null>);
23
+ hmacSecret?: string;
24
+ };
25
+ /**
26
+ * Verifies the short-lived user-context JWT minted by the RobotRock dashboard
27
+ * Eve proxy (`X-RobotRock-User-Token`). Hosted tenants use RS256 platform JWTs;
28
+ * self-hosted deployments use per-connection HMAC secrets.
29
+ */
30
+ declare function robotrockUserContextAuth(options?: RobotrockUserContextAuthOptions): AuthFn<Request>;
31
+ /**
32
+ * Bearer `ras_*` service token for RobotRock platform reachability probes
33
+ * (`GET /eve/v1/info` during verify and tenant connect).
34
+ */
35
+ declare function robotrockAgentServiceAuth(): AuthFn<Request>;
36
+ /** Bearer token used by the RobotRock webhook resume self-call. */
37
+ declare function eveSelfServiceAuth(): AuthFn<Request>;
38
+
39
+ /** Resolve the platform RS256 public key used to verify dashboard user-context JWTs. */
40
+ declare function resolvePlatformUserContextPublicKeyPem(): Promise<string | null>;
41
+
42
+ type RobotrockEveChannelOptions = {
43
+ /** Your existing webapp auth — stacked after RobotRock user-context auth. */
44
+ auth?: AuthFn<Request>[];
45
+ /** Include RobotRock user-context + service auth. @default true */
46
+ robotrock?: boolean;
47
+ /** Include localDev() fallback. @default true when NODE_ENV !== "production" */
48
+ localDev?: boolean;
49
+ /** Optional Vercel OIDC allowlist (dashboard ↔ agent on Vercel). */
50
+ vercelOidc?: Parameters<typeof vercelOidc>[0] | false;
51
+ /** Options passed to robotrockUserContextAuth when robotrock is enabled. */
52
+ userContextAuth?: RobotrockUserContextAuthOptions;
53
+ };
54
+ /**
55
+ * Compose the default Eve HTTP channel with RobotRock dashboard auth stacked
56
+ * alongside optional existing webapp authenticators.
57
+ */
58
+ declare function robotrockEveChannel(options?: RobotrockEveChannelOptions): eve_channels_eve.EveChannel;
59
+
60
+ /** Create a RobotRock client bound to the current Eve session tenant context. */
61
+ declare function tryCreateBoundRobotRockClient(ctx: SessionContext): RobotRock | null;
62
+ /** Reset missing-auth warning (tests only). */
63
+ declare function resetBoundClientAuthWarning(): void;
64
+
65
+ type RobotRockChatAuditPayload = {
66
+ eveSessionId: string;
67
+ userId: string;
68
+ actionId: string;
69
+ actionTitle?: string;
70
+ prompt?: string;
71
+ data?: Record<string, unknown>;
72
+ idempotencyKey?: string;
73
+ requestId?: string;
74
+ toolCallId?: string;
75
+ };
76
+ /** Observe-only audit POST — never throws. */
77
+ declare function postRobotRockChatInputAudit(ctx: SessionContext, payload: RobotRockChatAuditPayload): Promise<void>;
78
+ /** Persist pending HITL requests across Eve durable waits — never throws. */
79
+ declare function postRobotRockStageHitl(ctx: SessionContext, input: {
80
+ eveSessionId: string;
81
+ requests: StagedChatHitlRequest[];
82
+ }): Promise<void>;
83
+ /** Load staged HITL requests from Convex — returns [] on failure. */
84
+ declare function fetchRobotRockStagedHitl(ctx: SessionContext, eveSessionId: string): Promise<StagedChatHitlRequest[]>;
85
+ /** Register an inbox task with its originating Eve chat session — never throws. */
86
+ declare function postRobotRockLinkChatTask(ctx: SessionContext, input: {
87
+ eveSessionId: string;
88
+ publicTaskId: string;
89
+ toolCallId: string;
90
+ }): Promise<void>;
91
+ /** Reset audit warning flags (tests only). */
92
+ declare function resetChatAuditWarnings(): void;
93
+
94
+ type CreateRobotRockTaskInput = SendToHumanInput<readonly SendToHumanActionInput[]> & {
95
+ app?: string;
96
+ };
97
+ /** Resolve the webhook URL RobotRock calls when a delegated inbox task is handled. */
98
+ declare function resolveTaskHandledWebhookUrl(baseUrl: string): string;
99
+ /** Create an inbox task via POST /v1 without waiting for a human response. */
100
+ declare function createRobotRockTask(input: CreateRobotRockTaskInput, ctx: SessionContext): Promise<{
101
+ taskId: string;
102
+ threadId: string;
103
+ status: "open" | "pending";
104
+ validUntil: string;
105
+ submittedAt: string;
106
+ }>;
107
+ type RobotRockTaskActionInput = {
108
+ id: string;
109
+ title: string;
110
+ description?: string;
111
+ };
112
+ type RobotRockTaskAssignToInput = {
113
+ users?: string[];
114
+ groups?: string[];
115
+ };
116
+ type RobotRockTaskContextInput = {
117
+ data?: Record<string, unknown>;
118
+ ui?: Record<string, unknown>;
119
+ };
120
+ type RobotRockTaskToolInput = {
121
+ type: string;
122
+ name: string;
123
+ description?: string;
124
+ actions: RobotRockTaskActionInput[];
125
+ assignTo?: RobotRockTaskAssignToInput;
126
+ context?: RobotRockTaskContextInput;
127
+ validUntilHours?: number;
128
+ priority?: TaskPriority;
129
+ updateMessage?: string;
130
+ app?: string;
131
+ };
132
+ declare function buildRobotRockTaskPayload(input: RobotRockTaskToolInput, options?: {
133
+ requestedByEmail?: string;
134
+ }): CreateRobotRockTaskInput;
135
+
136
+ type CreateRobotRockCronChatInput = {
137
+ title: string;
138
+ messages: {
139
+ role: "user" | "assistant";
140
+ text: string;
141
+ }[];
142
+ agentIdentifier?: string;
143
+ ownerEmail: string;
144
+ };
145
+ /** Create an inbox chat from an Eve schedule via the RobotRock API. */
146
+ declare function createRobotRockCronChat(input: CreateRobotRockCronChatInput): Promise<CreateChatResult>;
147
+
148
+ /**
149
+ * Marker hook for RobotRock dashboard auto-detection.
150
+ *
151
+ * RobotRock reads `GET /eve/v1/info` on connect and treats deployments with a
152
+ * hook slug `robotrock-ready` as RobotRock-ready.
153
+ */
154
+ declare const robotrockReadyHook: {};
155
+ /** Alias for agents that prefer a factory name. */
156
+ declare function defineRobotRockReadyHook(): {};
157
+
158
+ /** Reset logged idempotency keys (tests only). */
159
+ declare function resetRobotrockChatAuditIdempotencyKeys(): void;
160
+ declare const robotrockChatAuditHook: HookDefinition;
161
+ /** Alias for agents that prefer a factory name. */
162
+ declare function defineRobotRockChatAuditHook(): HookDefinition;
163
+
164
+ export { type CreateRobotRockCronChatInput, type CreateRobotRockTaskInput, ROBOTROCK_USER_CONTEXT_HEADER, type RobotRockChatAuditPayload, type RobotRockTaskActionInput, type RobotRockTaskAssignToInput, type RobotRockTaskContextInput, type RobotRockTaskToolInput, type RobotrockEveChannelOptions, type RobotrockUserContextAuthOptions, buildRobotRockTaskPayload, createRobotRockCronChat, createRobotRockTask, defineRobotRockChatAuditHook, defineRobotRockReadyHook, eveSelfServiceAuth, fetchRobotRockStagedHitl, postRobotRockChatInputAudit, postRobotRockLinkChatTask, postRobotRockStageHitl, resetBoundClientAuthWarning, resetChatAuditWarnings, resetRobotrockChatAuditIdempotencyKeys, resolvePlatformUserContextPublicKeyPem, resolveTaskHandledWebhookUrl, robotrockAgentServiceAuth, robotrockChatAuditHook, robotrockEveChannel, robotrockReadyHook, robotrockUserContextAuth, tryCreateBoundRobotRockClient };