agent-relay-sdk 0.1.0 → 0.2.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 (43) hide show
  1. package/dist/bus-client.d.ts +45 -2
  2. package/dist/bus-client.d.ts.map +1 -1
  3. package/dist/bus-client.js +157 -3
  4. package/dist/bus-client.js.map +1 -1
  5. package/dist/claim-tracker.d.ts +19 -0
  6. package/dist/claim-tracker.d.ts.map +1 -0
  7. package/dist/claim-tracker.js +26 -0
  8. package/dist/claim-tracker.js.map +1 -0
  9. package/dist/context-probe.d.ts +43 -0
  10. package/dist/context-probe.d.ts.map +1 -0
  11. package/dist/context-probe.js +210 -0
  12. package/dist/context-probe.js.map +1 -0
  13. package/dist/contracts.d.ts +27 -0
  14. package/dist/contracts.d.ts.map +1 -0
  15. package/dist/contracts.js +34 -0
  16. package/dist/contracts.js.map +1 -0
  17. package/dist/http-client.d.ts +66 -5
  18. package/dist/http-client.d.ts.map +1 -1
  19. package/dist/http-client.js +148 -9
  20. package/dist/http-client.js.map +1 -1
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/protocol.d.ts +9 -1
  26. package/dist/protocol.d.ts.map +1 -1
  27. package/dist/protocol.js.map +1 -1
  28. package/dist/provider-catalog.d.ts +80 -0
  29. package/dist/provider-catalog.d.ts.map +1 -0
  30. package/dist/provider-catalog.js +84 -0
  31. package/dist/provider-catalog.js.map +1 -0
  32. package/dist/types.d.ts +921 -4
  33. package/dist/types.d.ts.map +1 -1
  34. package/package.json +17 -1
  35. package/src/bus-client.ts +176 -4
  36. package/src/claim-tracker.ts +40 -0
  37. package/src/context-probe.ts +257 -0
  38. package/src/contracts.ts +47 -0
  39. package/src/http-client.ts +166 -11
  40. package/src/index.ts +4 -0
  41. package/src/protocol.ts +10 -0
  42. package/src/provider-catalog.ts +174 -0
  43. package/src/types.ts +1035 -8
package/src/types.ts CHANGED
@@ -13,6 +13,8 @@ export interface AgentCard {
13
13
  status: AgentStatus;
14
14
  instanceId?: string;
15
15
  epoch: number;
16
+ providerCapabilities?: ProviderCapabilities;
17
+ context?: ContextState;
16
18
  meta?: Record<string, unknown>;
17
19
  lastSeen: number;
18
20
  createdAt: number;
@@ -20,6 +22,291 @@ export interface AgentCard {
20
22
 
21
23
  export type AgentStatus = "online" | "idle" | "busy" | "stale" | "offline";
22
24
 
25
+ export type CapabilitySource = "catalog" | "provider" | "runtime" | "override" | "estimate";
26
+ export type CapabilityConfidence = "declared" | "reported" | "verified" | "estimated" | "unknown";
27
+
28
+ export interface ProviderCapabilities {
29
+ lifecycle: {
30
+ managed: boolean;
31
+ shutdownHard: boolean;
32
+ restartHard: boolean;
33
+ semanticStatus?: boolean;
34
+ reconnect?: boolean;
35
+ hibernate?: boolean;
36
+ resume?: boolean;
37
+ };
38
+ model?: {
39
+ provider?: SpawnProvider | string;
40
+ id?: string;
41
+ alias?: string;
42
+ providerModel?: string;
43
+ effort?: SpawnEffort | string;
44
+ source: CapabilitySource;
45
+ confidence: CapabilityConfidence;
46
+ lastUpdatedAt?: number;
47
+ };
48
+ session?: {
49
+ approvalMode?: SpawnApprovalMode | string;
50
+ fileRead?: boolean;
51
+ fileWrite?: boolean;
52
+ shell?: boolean;
53
+ source: CapabilitySource;
54
+ confidence: CapabilityConfidence;
55
+ lastUpdatedAt?: number;
56
+ };
57
+ context?: {
58
+ stats?: {
59
+ source: "api" | "statusline" | "hook" | "estimate";
60
+ confidence: "exact" | "reported" | "estimated";
61
+ };
62
+ compact?: boolean;
63
+ clear?: boolean;
64
+ inject?: boolean;
65
+ fork?: boolean;
66
+ rollback?: boolean;
67
+ archive?: boolean;
68
+ };
69
+ terminal?: {
70
+ live?: {
71
+ read?: boolean;
72
+ write?: boolean;
73
+ };
74
+ attach?: {
75
+ create?: boolean;
76
+ read?: boolean;
77
+ write?: boolean;
78
+ detach?: boolean;
79
+ };
80
+ };
81
+ source: CapabilitySource;
82
+ confidence: CapabilityConfidence;
83
+ lastUpdatedAt: number;
84
+ }
85
+
86
+ export type ContextLifecycleState =
87
+ | "fresh"
88
+ | "primed"
89
+ | "working"
90
+ | "cooling"
91
+ | "compacting"
92
+ | "hibernating";
93
+
94
+ export interface ContextProbeMetrics {
95
+ agentId: string;
96
+ contextPercent: number;
97
+ tokensUsed?: number;
98
+ tokensMax?: number;
99
+ quotaUsed?: number;
100
+ quotaLimit?: number;
101
+ quotaResetIn?: number;
102
+ model?: string;
103
+ effort?: string;
104
+ source: "statusline" | "hook" | "api" | "estimate";
105
+ confidence: "exact" | "reported" | "estimated";
106
+ timestamp: number;
107
+ }
108
+
109
+ export interface ContextState {
110
+ utilization: number;
111
+ tokensUsed?: number;
112
+ tokensMax?: number;
113
+ lifecycleState: ContextLifecycleState;
114
+ warmTopics: string[];
115
+ activeMemories: string[];
116
+ tasksSinceCompact: number;
117
+ lastCompactedAt?: number;
118
+ lastUpdatedAt: number;
119
+ source: "statusline" | "hook" | "api" | "estimate";
120
+ confidence: "exact" | "reported" | "estimated";
121
+ }
122
+
123
+ export interface ContextSnapshot {
124
+ id: number;
125
+ agentId: string;
126
+ context: ContextState;
127
+ utilization: number;
128
+ lifecycleState: ContextLifecycleState;
129
+ tokensUsed?: number;
130
+ tokensMax?: number;
131
+ source: ContextState["source"];
132
+ confidence: ContextState["confidence"];
133
+ capturedAt: number;
134
+ }
135
+
136
+ export type MemoryType = "organization" | "role" | "project" | "task" | "interaction" | "agent";
137
+ export type MemoryVisibility = "private" | "project" | "org" | "public";
138
+ export type MemorySensitivity = "public" | "normal" | "sensitive" | "secret";
139
+ export type MemoryConfidence = "reported" | "inferred" | "verified";
140
+ export type MemoryRedactionState = "raw" | "redacted" | "rejected";
141
+
142
+ export interface Memory {
143
+ id: string;
144
+ type: MemoryType;
145
+ scope: string;
146
+ title: string;
147
+ content: string;
148
+ tags: string[];
149
+ visibility: MemoryVisibility;
150
+ sensitivity: MemorySensitivity;
151
+ confidence: MemoryConfidence;
152
+ redactionState: MemoryRedactionState;
153
+ relevanceScore: number;
154
+ sourceAgent?: string;
155
+ sourceTask?: number;
156
+ createdBy?: string;
157
+ contentHash?: string;
158
+ metadata: Record<string, unknown>;
159
+ accessCount: number;
160
+ lastAccessedAt?: number;
161
+ createdAt: number;
162
+ updatedAt: number;
163
+ expiresAt?: number;
164
+ }
165
+
166
+ export interface CreateMemoryInput {
167
+ type: MemoryType;
168
+ scope: string;
169
+ title: string;
170
+ content: string;
171
+ tags?: string[];
172
+ visibility?: MemoryVisibility;
173
+ sensitivity?: MemorySensitivity;
174
+ confidence?: MemoryConfidence;
175
+ redactionState?: MemoryRedactionState;
176
+ relevanceScore?: number;
177
+ sourceAgent?: string;
178
+ sourceTask?: number;
179
+ createdBy?: string;
180
+ metadata?: Record<string, unknown>;
181
+ ttlMs?: number;
182
+ }
183
+
184
+ export interface UpdateMemoryInput {
185
+ title?: string;
186
+ content?: string;
187
+ tags?: string[];
188
+ visibility?: MemoryVisibility;
189
+ sensitivity?: MemorySensitivity;
190
+ confidence?: MemoryConfidence;
191
+ redactionState?: MemoryRedactionState;
192
+ relevanceScore?: number;
193
+ metadata?: Record<string, unknown>;
194
+ expiresAt?: number | null;
195
+ }
196
+
197
+ export interface MemoryQuery {
198
+ type?: MemoryType;
199
+ scope?: string;
200
+ tags?: string[];
201
+ minRelevance?: number;
202
+ limit?: number;
203
+ includeExpired?: boolean;
204
+ visibility?: MemoryVisibility;
205
+ includeSensitive?: boolean;
206
+ }
207
+
208
+ export interface MemorySearchResult {
209
+ memories: Memory[];
210
+ total: number;
211
+ }
212
+
213
+ export interface PackagedMemory {
214
+ memory: Memory;
215
+ reason: string;
216
+ priority: 1 | 2 | 3;
217
+ score?: number;
218
+ }
219
+
220
+ export interface TaskRoutingHints {
221
+ id?: number;
222
+ title?: string;
223
+ text?: string;
224
+ scope?: string;
225
+ tags?: string[];
226
+ capabilities?: string[];
227
+ target?: string;
228
+ }
229
+
230
+ export interface ContextBudget {
231
+ maxTokens: number;
232
+ maxMemories: number;
233
+ priorityCutoff: 1 | 2 | 3;
234
+ }
235
+
236
+ export interface TaskHistorySummary {
237
+ taskId: number;
238
+ agentId: string;
239
+ status: string;
240
+ summary?: string;
241
+ completedAt?: number;
242
+ }
243
+
244
+ export interface ContextPackage {
245
+ memories: PackagedMemory[];
246
+ rolePrompt?: string;
247
+ recentContext?: string;
248
+ taskHistory?: TaskHistorySummary[];
249
+ estimatedTokens: number;
250
+ }
251
+
252
+ export interface ContextPackageRequest {
253
+ task: TaskRoutingHints;
254
+ agent: AgentCard;
255
+ budget: ContextBudget;
256
+ memories?: Memory[];
257
+ }
258
+
259
+ export interface MemoryStats {
260
+ total: number;
261
+ byType: Partial<Record<MemoryType, number>>;
262
+ byScope: Record<string, number>;
263
+ bySensitivity: Partial<Record<MemorySensitivity, number>>;
264
+ }
265
+
266
+ export type ActiveMemoryClearReason = "compact" | "clearContext" | "restart" | "shutdown" | "manual";
267
+
268
+ export interface MemoryBrokerCapabilities {
269
+ search: true;
270
+ create: boolean;
271
+ update: boolean;
272
+ delete: boolean;
273
+ stats: boolean;
274
+ assemble: boolean;
275
+ activeTracking: boolean;
276
+ activeList: boolean;
277
+ external: boolean;
278
+ }
279
+
280
+ export interface MemoryBrokerContext {
281
+ now: number;
282
+ actor: string;
283
+ scopes: string[];
284
+ relayUrl?: string;
285
+ requestId?: string;
286
+ }
287
+
288
+ export type MemoryBrokerKind = "sqlite" | "http" | "command";
289
+
290
+ export interface SqliteMemoryBrokerConfig {
291
+ type: "sqlite";
292
+ }
293
+
294
+ export interface HttpMemoryBrokerConfig {
295
+ type: "http";
296
+ url: string;
297
+ tokenEnv?: string;
298
+ timeoutMs?: number;
299
+ }
300
+
301
+ export interface CommandMemoryBrokerConfig {
302
+ type: "command";
303
+ command: string;
304
+ args?: string[];
305
+ timeoutMs?: number;
306
+ }
307
+
308
+ export type MemoryBrokerConfig = SqliteMemoryBrokerConfig | HttpMemoryBrokerConfig | CommandMemoryBrokerConfig;
309
+
23
310
  export type MessageKind =
24
311
  | "chat"
25
312
  | "channel.event"
@@ -28,6 +315,71 @@ export type MessageKind =
28
315
  | "control"
29
316
  | "system";
30
317
 
318
+ export type ArtifactKind = "image" | "audio" | "video" | "document" | "archive" | "other";
319
+ export type ArtifactSensitivity = "public" | "normal" | "sensitive" | "secret";
320
+ export type ArtifactVisibility = "private" | "project" | "org";
321
+ export type ArtifactRole = "media" | "patch" | "report" | "log" | "output" | "input";
322
+
323
+ export interface ArtifactBlob {
324
+ digest: string;
325
+ storageUri: string;
326
+ mediaType: string;
327
+ size: number;
328
+ createdAt: number;
329
+ }
330
+
331
+ export interface ArtifactLink {
332
+ id: string;
333
+ artifactId: string;
334
+ entityType: "message" | "task" | "recipeRun" | "recipeStep" | "channelEvent";
335
+ entityId: string;
336
+ role?: ArtifactRole;
337
+ title?: string;
338
+ createdBy: string;
339
+ createdAt: number;
340
+ }
341
+
342
+ export interface Artifact {
343
+ id: string;
344
+ blobDigest: string;
345
+ mediaType: string;
346
+ kind: ArtifactKind;
347
+ filename?: string;
348
+ size: number;
349
+ digest: string;
350
+ visibility: ArtifactVisibility;
351
+ sensitivity: ArtifactSensitivity;
352
+ createdBy: string;
353
+ createdAt: number;
354
+ expiresAt?: number;
355
+ metadata: Record<string, unknown>;
356
+ links?: ArtifactLink[];
357
+ url?: string;
358
+ }
359
+
360
+ export interface AttachmentRef {
361
+ artifactId: string;
362
+ kind?: ArtifactKind;
363
+ role?: ArtifactRole;
364
+ title?: string;
365
+ ref?: AttachmentSourceRef;
366
+ metadata?: Record<string, unknown>;
367
+ }
368
+
369
+ export interface ChannelAttachmentRef {
370
+ artifactId?: string;
371
+ kind?: ArtifactKind;
372
+ role?: ArtifactRole;
373
+ title?: string;
374
+ ref?: AttachmentSourceRef;
375
+ metadata?: Record<string, unknown>;
376
+ }
377
+
378
+ export type AttachmentSourceRef =
379
+ | { type: "relay-blob"; id: string; [key: string]: unknown }
380
+ | { type: "external-url"; url: string; [key: string]: unknown }
381
+ | { type: "channel-file"; id: string; provider?: string; uniqueId?: string; [key: string]: unknown };
382
+
31
383
  export interface Message {
32
384
  id: number;
33
385
  from: string;
@@ -43,12 +395,93 @@ export interface Message {
43
395
  claimedAt?: number;
44
396
  claimExpiresAt?: number;
45
397
  idempotencyKey?: string;
398
+ deliveryStatus?: MessageDeliveryStatus;
399
+ deliveryAttempts?: number;
400
+ deliveryLastError?: string;
401
+ deliveryNextRetryAt?: number;
402
+ deliveryPoisonReason?: string;
403
+ deliveryUpdatedAt?: number;
404
+ queuedAt?: number;
405
+ maxAgeSeconds?: number;
406
+ resolvedToAgent?: string;
46
407
  payload: Record<string, unknown>;
47
408
  meta?: Record<string, unknown>;
409
+ reactions?: MessageReaction[];
48
410
  readBy: string[];
49
411
  createdAt: number;
50
412
  }
51
413
 
414
+ export interface ReplyObligation {
415
+ messageId: number;
416
+ agentId: string;
417
+ from: string;
418
+ kind: MessageKind;
419
+ subject?: string;
420
+ channel?: string;
421
+ bodyPreview: string;
422
+ createdAt: number;
423
+ replyCommand: string;
424
+ }
425
+
426
+ export interface MessageReaction {
427
+ messageId: number;
428
+ actorId: string;
429
+ emoji: string;
430
+ createdAt: number;
431
+ updatedAt: number;
432
+ }
433
+
434
+ export type RelayNotificationKind =
435
+ | "message"
436
+ | "reply"
437
+ | "error"
438
+ | "agent.blocked";
439
+
440
+ export type RelayNotificationSeverity = "info" | "warning" | "error";
441
+
442
+ export interface RelayNotification {
443
+ id: string;
444
+ kind: RelayNotificationKind;
445
+ severity: RelayNotificationSeverity;
446
+ title: string;
447
+ body: string;
448
+ messageId?: number;
449
+ agentId?: string;
450
+ threadPeer?: string;
451
+ view?: "chat" | "messages" | "agents" | "work" | "tasks" | "channels" | "overview";
452
+ createdAt: number;
453
+ }
454
+
455
+ export type MessageDeliveryStatus = "pending" | "delivered" | "queued" | "failed" | "dead";
456
+
457
+ export interface MessageDeliveryAttempt {
458
+ id: number;
459
+ messageId: number;
460
+ agentId?: string;
461
+ action: "attempt" | "retry-now" | "mark-dead" | "clear";
462
+ status: MessageDeliveryStatus;
463
+ error?: string;
464
+ nextRetryAt?: number;
465
+ poisonReason?: string;
466
+ createdAt: number;
467
+ }
468
+
469
+ export interface MessageDeliveryState extends Pick<Message,
470
+ | "id"
471
+ | "to"
472
+ | "deliveryStatus"
473
+ | "deliveryAttempts"
474
+ | "deliveryLastError"
475
+ | "deliveryNextRetryAt"
476
+ | "deliveryPoisonReason"
477
+ | "deliveryUpdatedAt"
478
+ | "queuedAt"
479
+ | "maxAgeSeconds"
480
+ | "resolvedToAgent"
481
+ > {
482
+ attempts: MessageDeliveryAttempt[];
483
+ }
484
+
52
485
  export interface SendMessageInput {
53
486
  from: string;
54
487
  to: string;
@@ -59,6 +492,8 @@ export interface SendMessageInput {
59
492
  replyTo?: number;
60
493
  claimable?: boolean;
61
494
  idempotencyKey?: string;
495
+ maxAgeSeconds?: number;
496
+ attachments?: AttachmentRef[];
62
497
  payload?: Record<string, unknown>;
63
498
  meta?: Record<string, unknown>;
64
499
  }
@@ -175,6 +610,8 @@ export interface RegisterAgentInput {
175
610
  ready?: boolean;
176
611
  status?: AgentCard["status"];
177
612
  instanceId?: string;
613
+ providerCapabilities?: ProviderCapabilities;
614
+ context?: ContextState;
178
615
  meta?: Record<string, unknown>;
179
616
  }
180
617
 
@@ -280,6 +717,7 @@ export interface IntegrationEventInput {
280
717
  channel?: string;
281
718
  dedupeKey?: string;
282
719
  externalUrl?: string;
720
+ attachments?: AttachmentRef[];
283
721
  metadata?: Record<string, unknown>;
284
722
  }
285
723
 
@@ -295,8 +733,19 @@ export interface IntegrationTaskStats {
295
733
 
296
734
  export interface IntegrationSummary {
297
735
  name: string;
736
+ displayName?: string;
737
+ description?: string;
738
+ enabled: boolean;
298
739
  configured: boolean;
299
740
  observed: boolean;
741
+ type?: string;
742
+ icon?: string;
743
+ accentColor?: string;
744
+ tags: string[];
745
+ homepageUrl?: string;
746
+ repositoryUrl?: string;
747
+ docsUrl?: string;
748
+ manifest?: Record<string, unknown>;
300
749
  scopes: string[];
301
750
  targets: string[];
302
751
  channels: string[];
@@ -310,6 +759,32 @@ export interface IntegrationSummary {
310
759
  taskStats: IntegrationTaskStats;
311
760
  }
312
761
 
762
+ export type RuntimeContractName =
763
+ | "relayApi"
764
+ | "orchestratorProtocol"
765
+ | "runnerProtocol"
766
+ | "providerPluginProtocol";
767
+
768
+ export type RuntimeContracts = Partial<Record<RuntimeContractName, number>>;
769
+ export type RuntimeCapabilities = Record<string, boolean>;
770
+
771
+ export interface RuntimePackageMetadata {
772
+ name: string;
773
+ version: string;
774
+ }
775
+
776
+ export interface ContractCompatibilityIssue {
777
+ contract: string;
778
+ expected: string;
779
+ actual?: number;
780
+ }
781
+
782
+ export interface ContractCompatibility {
783
+ status: "compatible" | "incompatible" | "unknown";
784
+ compatible: boolean;
785
+ issues: ContractCompatibilityIssue[];
786
+ }
787
+
313
788
  export type AutomationKind = "scheduled_task";
314
789
  export type AutomationCatchUpPolicy = "skip" | "run_once" | "run_all";
315
790
  export type AutomationConcurrencyPolicy = "skip" | "queue" | "replace";
@@ -337,15 +812,25 @@ export interface AutomationExistingAgentPolicy {
337
812
  export interface AutomationOnDemandAgentPolicy {
338
813
  mode: "on_demand_agent";
339
814
  provider: SpawnProvider;
815
+ model?: string;
816
+ effort?: SpawnEffort;
340
817
  cwd?: string;
818
+ workspaceMode?: WorkspaceMode;
341
819
  profile?: string;
342
820
  approvalMode?: SpawnApprovalMode;
343
821
  keepAlive?: boolean;
822
+ runtimeBudget?: AutomationRuntimeBudget;
344
823
  shutdownAfterMs?: number;
345
824
  }
346
825
 
347
826
  export type AutomationTargetPolicy = AutomationExistingAgentPolicy | AutomationOnDemandAgentPolicy;
348
827
 
828
+ export interface AutomationRuntimeBudget {
829
+ maxRuntimeMs: number;
830
+ warnAtMs?: number;
831
+ warningMessage?: string;
832
+ }
833
+
349
834
  export interface AutomationTaskTemplate {
350
835
  title: string;
351
836
  body: string;
@@ -385,7 +870,6 @@ export interface AutomationRun {
385
870
  spawnedAgentId?: string;
386
871
  taskId?: number;
387
872
  messageId?: number;
388
- controlMessageId?: number;
389
873
  error?: string;
390
874
  result?: Record<string, unknown>;
391
875
  meta: Record<string, unknown>;
@@ -430,7 +914,8 @@ export type ChannelRouteTarget =
430
914
  | { type: "capability"; id: string }
431
915
  | { type: "broadcast" }
432
916
  | { type: "orchestrator"; id: string }
433
- | { type: "pool"; id: string };
917
+ | { type: "pool"; id: string }
918
+ | { type: "policy"; id: string };
434
919
 
435
920
  export type ChannelBindingMode = "exclusive" | "broadcast";
436
921
 
@@ -485,6 +970,22 @@ export interface ChannelSummary {
485
970
  meta?: Record<string, unknown>;
486
971
  }
487
972
 
973
+ export interface ChannelEventInput {
974
+ body?: string;
975
+ payload: Record<string, unknown>;
976
+ attachments?: ChannelAttachmentRef[];
977
+ conversationId?: string;
978
+ idempotencyKey?: string;
979
+ instanceId?: string;
980
+ epoch?: number;
981
+ }
982
+
983
+ export interface ChannelEventResult {
984
+ messages: Message[];
985
+ bindings: ChannelBinding[];
986
+ created: boolean;
987
+ }
988
+
488
989
  export interface TaskStatusInput {
489
990
  status: TaskStatus;
490
991
  agentId?: string;
@@ -518,6 +1019,28 @@ export interface InboxState {
518
1019
  drafts: InboxDraft[];
519
1020
  }
520
1021
 
1022
+ export interface ChatHistoryImportEntry {
1023
+ position: number;
1024
+ originalMessageId: number;
1025
+ originalFrom: string;
1026
+ originalTo: string;
1027
+ originalCreatedAt: number;
1028
+ message: Message;
1029
+ }
1030
+
1031
+ export interface ChatHistoryImport {
1032
+ id: string;
1033
+ targetAgentId?: string;
1034
+ targetSpawnRequestId?: string;
1035
+ sourcePeerId: string;
1036
+ sourceAgentId?: string;
1037
+ sourceThreadId?: string;
1038
+ sourceAgentLabel?: string;
1039
+ importedBy: string;
1040
+ importedAt: number;
1041
+ entries: ChatHistoryImportEntry[];
1042
+ }
1043
+
521
1044
  export type ActivityKind = "message" | "reply" | "question" | "operator" | "pair" | "task" | "state";
522
1045
 
523
1046
  export interface ActivityEvent {
@@ -561,6 +1084,218 @@ export interface ActivityEventInput {
561
1084
  export type OrchestratorStatus = "online" | "offline";
562
1085
  export type SpawnProvider = "claude" | "codex";
563
1086
  export type SpawnApprovalMode = "open" | "guarded" | "read-only";
1087
+ export type SpawnEffort = "low" | "medium" | "high" | "xhigh" | "max";
1088
+ export type WorkspaceMode = "isolated" | "shared" | "inherit";
1089
+ export type WorkspaceStatus = "active" | "ready" | "conflict" | "review_requested" | "merge_planned" | "abandoned" | "cleanup_requested" | "cleaned";
1090
+
1091
+ export interface WorkspaceProbeWorktree {
1092
+ path: string;
1093
+ branch?: string;
1094
+ headSha?: string;
1095
+ bare?: boolean;
1096
+ detached?: boolean;
1097
+ prunable?: boolean;
1098
+ locked?: boolean;
1099
+ reason?: string;
1100
+ }
1101
+
1102
+ export interface WorkspaceProbe {
1103
+ path: string;
1104
+ isGitRepo: boolean;
1105
+ repoRoot?: string;
1106
+ branch?: string;
1107
+ headSha?: string;
1108
+ dirty?: boolean;
1109
+ detached?: boolean;
1110
+ worktrees?: WorkspaceProbeWorktree[];
1111
+ error?: string;
1112
+ }
1113
+
1114
+ export interface WorkspaceMetadata {
1115
+ id?: string;
1116
+ mode: WorkspaceMode;
1117
+ requestedMode?: WorkspaceMode;
1118
+ repoRoot?: string;
1119
+ sourceCwd?: string;
1120
+ worktreePath?: string;
1121
+ branch?: string;
1122
+ baseRef?: string;
1123
+ baseSha?: string;
1124
+ status?: WorkspaceStatus;
1125
+ stewardAgentId?: string;
1126
+ probe?: WorkspaceProbe;
1127
+ }
1128
+
1129
+ export interface WorkspaceRecord {
1130
+ id: string;
1131
+ repoRoot: string;
1132
+ sourceCwd: string;
1133
+ worktreePath: string;
1134
+ branch?: string;
1135
+ baseRef?: string;
1136
+ baseSha?: string;
1137
+ mode: WorkspaceMode;
1138
+ requestedMode?: WorkspaceMode;
1139
+ status: WorkspaceStatus;
1140
+ ownerAgentId?: string;
1141
+ ownerPolicyName?: string;
1142
+ ownerAutomationRunId?: string;
1143
+ stewardAgentId?: string;
1144
+ metadata: Record<string, unknown>;
1145
+ createdAt: number;
1146
+ updatedAt: number;
1147
+ readyAt?: number;
1148
+ cleanedAt?: number;
1149
+ }
1150
+
1151
+ export interface ConfigEntry<T = unknown> {
1152
+ namespace: string;
1153
+ key: string;
1154
+ value: T;
1155
+ version: number;
1156
+ updatedAt: string;
1157
+ updatedBy?: string;
1158
+ }
1159
+
1160
+ export interface ConfigHistoryEntry<T = unknown> {
1161
+ id: number;
1162
+ namespace: string;
1163
+ key: string;
1164
+ value: T;
1165
+ version: number;
1166
+ changedAt: string;
1167
+ changedBy?: string;
1168
+ }
1169
+
1170
+ export type ManagedAgentStatus = "stopped" | "starting" | "running" | "stopping" | "backoff";
1171
+
1172
+ export interface ManagedAgentState {
1173
+ policyName: string;
1174
+ status: ManagedAgentStatus;
1175
+ agentId?: string;
1176
+ orchestratorId: string;
1177
+ provider: SpawnProvider;
1178
+ tmuxSession?: string;
1179
+ spawnRequestId?: string;
1180
+ workspaceId?: string;
1181
+ workspacePath?: string;
1182
+ workspaceBranch?: string;
1183
+ lastSpawnAt?: number;
1184
+ lastStopAt?: number;
1185
+ healthySince?: number;
1186
+ restartCount: number;
1187
+ consecutiveFailures: number;
1188
+ backoffUntil?: number;
1189
+ lastError?: string;
1190
+ updatedAt: number;
1191
+ }
1192
+
1193
+ export type SpawnPolicyMode = "always-on" | "on-demand";
1194
+
1195
+ export type AgentProfileProvider = SpawnProvider | "any";
1196
+ export type AgentProfileBase = "host" | "minimal" | "isolated";
1197
+ export type AgentProfileInstructionPolicy = "allow" | "ignore";
1198
+ export type AgentProfileCategoryMode = "host" | "profile" | "repo" | "none";
1199
+ export type AgentProfileFilesystemScope = "repo" | "workspace" | "host";
1200
+
1201
+ export interface AgentProfileAssetRef {
1202
+ source: "relay" | "repo" | "inline" | "provider";
1203
+ ref: string;
1204
+ enabled: boolean;
1205
+ provider?: AgentProfileProvider;
1206
+ meta?: Record<string, unknown>;
1207
+ }
1208
+
1209
+ export interface AgentProfile {
1210
+ name: string;
1211
+ description?: string;
1212
+ provider?: AgentProfileProvider;
1213
+ base: AgentProfileBase;
1214
+ builtIn?: boolean;
1215
+ instructions: {
1216
+ system?: string;
1217
+ append: string[];
1218
+ repoInstructions: AgentProfileInstructionPolicy;
1219
+ globalInstructions: AgentProfileInstructionPolicy;
1220
+ };
1221
+ relay: {
1222
+ context: boolean;
1223
+ skills: boolean;
1224
+ plugins: boolean;
1225
+ statusLine: boolean;
1226
+ };
1227
+ skills: AgentProfileAssetRef[];
1228
+ plugins: AgentProfileAssetRef[];
1229
+ mcp: {
1230
+ mode: AgentProfileCategoryMode;
1231
+ servers?: Record<string, unknown>;
1232
+ };
1233
+ hooks: {
1234
+ mode: AgentProfileCategoryMode;
1235
+ };
1236
+ permissions: {
1237
+ mode?: SpawnApprovalMode;
1238
+ filesystem: AgentProfileFilesystemScope;
1239
+ };
1240
+ env: Record<string, string>;
1241
+ providerOptions: Record<string, unknown>;
1242
+ }
1243
+
1244
+ export type AgentProfileProjectionResult = "applied" | "partial" | "unsupported" | "not-applicable";
1245
+
1246
+ export interface AgentProfileProjectionEntry {
1247
+ capability: string;
1248
+ requested: string;
1249
+ result: AgentProfileProjectionResult;
1250
+ detail: string;
1251
+ }
1252
+
1253
+ export interface AgentProfileProjectionReport {
1254
+ profileName: string;
1255
+ provider: SpawnProvider;
1256
+ base: AgentProfileBase;
1257
+ generatedAt: number;
1258
+ entries: AgentProfileProjectionEntry[];
1259
+ warnings: string[];
1260
+ unsupported: string[];
1261
+ }
1262
+
1263
+ export interface SpawnPolicy {
1264
+ name: string;
1265
+ description?: string;
1266
+ // Desired on/off switch. `false` keeps the policy from (re)spawning even for
1267
+ // always-on mode, so a manual stop survives reconcile ticks. Defaults to true.
1268
+ enabled?: boolean;
1269
+ orchestratorId: string;
1270
+ cwd: string;
1271
+ provider: SpawnProvider;
1272
+ workspaceMode?: WorkspaceMode;
1273
+ rig?: string;
1274
+ model?: string;
1275
+ effort?: SpawnEffort;
1276
+ profile?: string;
1277
+ providerArgs: string[];
1278
+ prompt?: string;
1279
+ tags: string[];
1280
+ capabilities: string[];
1281
+ label?: string;
1282
+ mode: SpawnPolicyMode;
1283
+ permissionMode: SpawnApprovalMode;
1284
+ restartOnUpdate: boolean;
1285
+ scheduledDailyRestart: boolean;
1286
+ onDemand?: {
1287
+ keepaliveSeconds: number;
1288
+ idleDefinition: "no-activity";
1289
+ };
1290
+ backoff: {
1291
+ schedule: number[];
1292
+ resetAfterSeconds: number;
1293
+ };
1294
+ binding?: {
1295
+ type: "channel";
1296
+ channelId: string;
1297
+ };
1298
+ }
564
1299
 
565
1300
  export interface Orchestrator {
566
1301
  id: string;
@@ -568,9 +1303,15 @@ export interface Orchestrator {
568
1303
  status: OrchestratorStatus;
569
1304
  agentId: string; // relay agent id for messaging
570
1305
  providers: SpawnProvider[];
1306
+ providerStatus?: ProviderStatusReport[];
1307
+ providerCatalog?: ProviderCatalogSummary[];
571
1308
  baseDir: string;
572
1309
  apiUrl?: string;
573
1310
  envKeys: string[]; // names only, never values
1311
+ package?: RuntimePackageMetadata;
1312
+ contracts?: RuntimeContracts;
1313
+ capabilities?: RuntimeCapabilities;
1314
+ contractCompatibility?: ContractCompatibility;
574
1315
  version?: string;
575
1316
  protocolVersion?: number;
576
1317
  gitSha?: string;
@@ -582,10 +1323,11 @@ export interface Orchestrator {
582
1323
  }
583
1324
 
584
1325
  export interface OrchestratorHealth {
585
- status: "ok" | "warn" | "error";
1326
+ status: "ok" | "warn" | "restart-required" | "upgrade-required" | "unknown";
586
1327
  restartRequired: boolean;
1328
+ upgradeRequired?: boolean;
587
1329
  issues: Array<{
588
- code: "missing-version" | "outdated" | "protocol-mismatch" | "restart-required";
1330
+ code: "missing-version" | "package-drift" | "missing-contract" | "protocol-mismatch" | "restart-required" | "upgrade-required";
589
1331
  detail: string;
590
1332
  }>;
591
1333
  }
@@ -593,21 +1335,80 @@ export interface OrchestratorHealth {
593
1335
  export interface ManagedAgent {
594
1336
  agentId: string;
595
1337
  provider: SpawnProvider;
1338
+ model?: string;
1339
+ effort?: SpawnEffort;
1340
+ profile?: string;
1341
+ workspaceMode?: WorkspaceMode;
1342
+ workspace?: WorkspaceMetadata;
1343
+ sessionName?: string;
1344
+ supervisor?: "process" | "systemd" | "unknown";
1345
+ systemdUnit?: string;
1346
+ terminalSession?: string;
1347
+ terminalAvailable?: boolean;
596
1348
  tmuxSession: string;
597
1349
  cwd: string;
598
1350
  label?: string;
599
1351
  approvalMode: SpawnApprovalMode;
1352
+ policyName?: string;
1353
+ spawnRequestId?: string;
1354
+ automationRunId?: string;
600
1355
  pid?: number;
601
1356
  startedAt: number;
602
1357
  }
603
1358
 
1359
+ export interface ManagedSessionExitDiagnostics {
1360
+ agentId: string;
1361
+ provider: SpawnProvider;
1362
+ workspaceMode?: WorkspaceMode;
1363
+ workspace?: WorkspaceMetadata;
1364
+ sessionName?: string;
1365
+ tmuxSession: string;
1366
+ cwd: string;
1367
+ label?: string;
1368
+ policyName?: string;
1369
+ spawnRequestId?: string;
1370
+ automationRunId?: string;
1371
+ supervisor: "process" | "systemd" | "unknown";
1372
+ systemdUnit?: string;
1373
+ terminalSession?: string;
1374
+ terminalAvailable?: boolean;
1375
+ pid?: number;
1376
+ currentPid?: number;
1377
+ startedAt: number;
1378
+ detectedAt: number;
1379
+ runtimeMs: number;
1380
+ logFile?: string;
1381
+ logBytes?: number;
1382
+ logEmpty?: boolean;
1383
+ logTail?: string[];
1384
+ runnerInfoFile?: string;
1385
+ runnerInfoPresent?: boolean;
1386
+ systemd?: {
1387
+ unit: string;
1388
+ activeState?: string;
1389
+ subState?: string;
1390
+ result?: string;
1391
+ execMainCode?: string;
1392
+ execMainStatus?: string;
1393
+ mainPid?: number;
1394
+ unavailable?: string;
1395
+ };
1396
+ unavailable?: string[];
1397
+ lastError: string;
1398
+ }
1399
+
604
1400
  export interface RegisterOrchestratorInput {
605
1401
  id: string;
606
1402
  hostname: string;
607
1403
  providers: SpawnProvider[];
1404
+ providerStatus?: ProviderStatusReport[];
1405
+ providerCatalog?: ProviderCatalogSummary[];
608
1406
  baseDir: string;
609
1407
  apiUrl?: string;
610
1408
  envKeys?: string[];
1409
+ package?: RuntimePackageMetadata;
1410
+ contracts?: RuntimeContracts;
1411
+ capabilities?: RuntimeCapabilities;
611
1412
  version?: string;
612
1413
  protocolVersion?: number;
613
1414
  gitSha?: string;
@@ -615,23 +1416,120 @@ export interface RegisterOrchestratorInput {
615
1416
  }
616
1417
 
617
1418
  export interface OrchestratorRuntimeInput {
1419
+ package?: RuntimePackageMetadata;
1420
+ contracts?: RuntimeContracts;
1421
+ capabilities?: RuntimeCapabilities;
618
1422
  version?: string;
619
1423
  protocolVersion?: number;
620
1424
  gitSha?: string;
1425
+ providers?: SpawnProvider[];
1426
+ providerStatus?: ProviderStatusReport[];
1427
+ providerCatalog?: ProviderCatalogSummary[];
621
1428
  }
622
1429
 
623
1430
  export interface OrchestratorSpawnInput {
624
1431
  provider: SpawnProvider;
1432
+ model?: string;
1433
+ effort?: SpawnEffort;
625
1434
  cwd?: string;
1435
+ workspaceMode?: WorkspaceMode;
626
1436
  label?: string;
627
1437
  approvalMode?: SpawnApprovalMode;
628
1438
  prompt?: string;
1439
+ systemPromptAppend?: string;
629
1440
  env?: Record<string, string>;
630
1441
  }
631
1442
 
1443
+ export interface ProviderStatusReport {
1444
+ name: SpawnProvider;
1445
+ available: boolean;
1446
+ checkedAt: number;
1447
+ reason?: string;
1448
+ version?: string;
1449
+ features?: Record<string, boolean>;
1450
+ cli?: {
1451
+ command: string;
1452
+ path?: string;
1453
+ ok: boolean;
1454
+ version?: string;
1455
+ error?: string;
1456
+ };
1457
+ runner?: {
1458
+ command: string;
1459
+ path?: string;
1460
+ ok: boolean;
1461
+ version?: string;
1462
+ error?: string;
1463
+ };
1464
+ }
1465
+
1466
+ export interface ProviderCatalogSummary {
1467
+ provider: SpawnProvider;
1468
+ label: string;
1469
+ defaultModel?: string;
1470
+ models: Array<{
1471
+ alias: string;
1472
+ label: string;
1473
+ providerModel: string;
1474
+ efforts: SpawnEffort[];
1475
+ defaultEffort?: SpawnEffort;
1476
+ limits?: {
1477
+ contextWindowTokens?: {
1478
+ value: number;
1479
+ source: "catalog" | "provider" | "runtime" | "override";
1480
+ confidence: "declared" | "verified" | "estimated" | "unknown";
1481
+ lastUpdatedAt?: number;
1482
+ };
1483
+ maxOutputTokens?: {
1484
+ value: number;
1485
+ source: "catalog" | "provider" | "runtime" | "override";
1486
+ confidence: "declared" | "verified" | "estimated" | "unknown";
1487
+ lastUpdatedAt?: number;
1488
+ };
1489
+ };
1490
+ capabilities?: {
1491
+ modalities: {
1492
+ input: {
1493
+ text: boolean;
1494
+ image?: boolean;
1495
+ audio?: boolean;
1496
+ video?: boolean;
1497
+ pdf?: boolean;
1498
+ };
1499
+ output: {
1500
+ text: boolean;
1501
+ image?: boolean;
1502
+ audio?: boolean;
1503
+ video?: boolean;
1504
+ };
1505
+ };
1506
+ tools?: {
1507
+ code?: boolean;
1508
+ review?: boolean;
1509
+ debug?: boolean;
1510
+ refactor?: boolean;
1511
+ shell?: boolean;
1512
+ fileRead?: boolean;
1513
+ fileWrite?: boolean;
1514
+ webSearch?: boolean;
1515
+ imageGeneration?: boolean;
1516
+ imageEditing?: boolean;
1517
+ };
1518
+ source: "catalog" | "provider" | "runtime" | "override";
1519
+ confidence: "declared" | "verified" | "estimated" | "unknown";
1520
+ lastUpdatedAt?: number;
1521
+ };
1522
+ }>;
1523
+ }
1524
+
632
1525
  export interface OrchestratorSpawnResult {
633
1526
  orchestratorId: string;
634
1527
  provider: SpawnProvider;
1528
+ sessionName?: string;
1529
+ supervisor?: "process" | "systemd" | "unknown";
1530
+ systemdUnit?: string;
1531
+ terminalSession?: string;
1532
+ terminalAvailable?: boolean;
635
1533
  tmuxSession: string;
636
1534
  cwd: string;
637
1535
  label?: string;
@@ -657,9 +1555,11 @@ export interface RecipeAgent {
657
1555
  capabilities: string[];
658
1556
  label?: string;
659
1557
  tags?: string[];
1558
+ memoryTags?: string[];
660
1559
  approvalMode?: "open" | "guarded" | "read-only";
661
1560
  prompt?: string;
662
1561
  model?: string;
1562
+ effort?: SpawnEffort;
663
1563
  env?: Record<string, string>;
664
1564
  }
665
1565
 
@@ -678,6 +1578,20 @@ export interface RecipeRoute {
678
1578
  export interface RecipeLifecycle {
679
1579
  mode?: "persistent" | "ephemeral";
680
1580
  idleTimeoutMs?: number;
1581
+ memory?: RecipeMemoryPolicy;
1582
+ }
1583
+
1584
+ export interface RecipeMemoryPolicy {
1585
+ injectOnAssign?: boolean;
1586
+ autoCapture?: boolean;
1587
+ captureTypes?: MemoryType[];
1588
+ memoryTags?: string[];
1589
+ alwaysReload?: string[];
1590
+ scope?: string;
1591
+ maxTokens?: number;
1592
+ maxMemories?: number;
1593
+ priorityCutoff?: 1 | 2 | 3;
1594
+ ttlMs?: number;
681
1595
  }
682
1596
 
683
1597
  export interface RecipeInstance {
@@ -688,6 +1602,7 @@ export interface RecipeInstance {
688
1602
  orchestratorId: string;
689
1603
  status: "starting" | "running" | "stopping" | "stopped" | "failed";
690
1604
  agents: RecipeAgentInstance[];
1605
+ artifacts?: Artifact[];
691
1606
  startedAt: number;
692
1607
  stoppedAt?: number;
693
1608
  startedBy: string;
@@ -706,30 +1621,142 @@ export interface ComponentToken {
706
1621
  sub: string;
707
1622
  role: "provider" | "channel" | "orchestrator" | "admin" | "dashboard" | string;
708
1623
  scope: string[];
1624
+ constraints?: TokenConstraints;
709
1625
  iat: number;
710
1626
  exp?: number;
711
1627
  jti?: string;
712
1628
  }
713
1629
 
1630
+ export interface TokenRecord {
1631
+ jti: string;
1632
+ sub: string;
1633
+ role: string;
1634
+ scope: string[];
1635
+ constraints?: TokenConstraints;
1636
+ profileId?: string;
1637
+ issuedAt: number;
1638
+ expiresAt?: number;
1639
+ revokedAt?: number;
1640
+ createdBy?: string;
1641
+ }
1642
+
1643
+ export interface TokenProfile {
1644
+ id: string;
1645
+ name: string;
1646
+ description?: string;
1647
+ role: string;
1648
+ scope: string[];
1649
+ constraints?: TokenConstraints;
1650
+ ttlSeconds?: number;
1651
+ builtIn: boolean;
1652
+ createdAt: number;
1653
+ updatedAt: number;
1654
+ createdBy?: string;
1655
+ }
1656
+
1657
+ export interface CreateTokenProfileInput {
1658
+ id?: string;
1659
+ name: string;
1660
+ description?: string;
1661
+ role: string;
1662
+ scope: string[];
1663
+ constraints?: TokenConstraints;
1664
+ ttlSeconds?: number;
1665
+ createdBy?: string;
1666
+ }
1667
+
1668
+ export type UpdateTokenProfileInput = Partial<Omit<CreateTokenProfileInput, "id">>;
1669
+
1670
+ export interface TokenConstraints {
1671
+ agents?: string[];
1672
+ policies?: string[];
1673
+ parentAgents?: string[];
1674
+ targets?: string[];
1675
+ channels?: string[];
1676
+ orchestrators?: string[];
1677
+ hosts?: string[];
1678
+ cwd?: string;
1679
+ cwdPrefixes?: string[];
1680
+ taskIds?: string[];
1681
+ memoryScopes?: string[];
1682
+ integrationNames?: string[];
1683
+ spawnRequestIds?: string[];
1684
+ terminalAttach?: boolean;
1685
+ logsRead?: boolean;
1686
+ canDelegate?: boolean;
1687
+ }
1688
+
714
1689
  export type TokenScope =
1690
+ | "system:admin"
1691
+ | "token:read"
1692
+ | "token:write"
715
1693
  | "agent:read"
716
1694
  | "agent:write"
717
- | "message:send"
718
1695
  | "message:read"
719
- | "command:spawn"
720
- | "command:shutdown"
721
- | "command:*"
1696
+ | "message:send"
722
1697
  | "task:read"
723
1698
  | "task:write"
1699
+ | "command:read"
1700
+ | "command:write"
1701
+ | "command:*"
1702
+ | "artifact:read"
1703
+ | "artifact:write"
1704
+ | "artifact:admin"
1705
+ | "memory:read"
1706
+ | "memory:write"
1707
+ | "memory:admin"
1708
+ | "mcp:use"
1709
+ | "terminal:attach"
1710
+ | "logs:read"
1711
+ | "integration:read"
1712
+ | "integration:write"
1713
+ | "channel:read"
1714
+ | "channel:write"
1715
+ | "stats:read"
1716
+ | "health:read"
1717
+ | "events:read"
1718
+ | "command:spawn"
1719
+ | "command:shutdown"
724
1720
  | "recipe:start"
725
1721
  | "recipe:stop"
726
1722
  | "admin:*";
727
1723
 
1724
+ export interface MaintenanceJob {
1725
+ id: string;
1726
+ title: string;
1727
+ description?: string;
1728
+ intervalMs: number;
1729
+ timeoutMs: number;
1730
+ enabled: boolean;
1731
+ runOnStart: boolean;
1732
+ lastRunAt?: number;
1733
+ nextRunAt?: number;
1734
+ lastDurationMs?: number;
1735
+ lastStatus: "idle" | "running" | "succeeded" | "failed" | "disabled";
1736
+ lastError?: string;
1737
+ lastResult?: Record<string, unknown>;
1738
+ consecutiveFailures: number;
1739
+ running: boolean;
1740
+ leaseUntil?: number;
1741
+ updatedAt: number;
1742
+ }
1743
+
1744
+ export interface MaintenanceJobRun {
1745
+ id: string;
1746
+ status: "succeeded" | "failed" | "skipped";
1747
+ startedAt: number;
1748
+ finishedAt: number;
1749
+ durationMs: number;
1750
+ result?: Record<string, unknown>;
1751
+ error?: string;
1752
+ }
1753
+
728
1754
  export interface HealthCheck {
729
1755
  name: string;
730
1756
  status: "ok" | "warn" | "error";
731
1757
  detail?: string;
732
1758
  count?: number;
1759
+ subjects?: Array<{ id: string; label?: string; status?: string; detail?: string }>;
733
1760
  }
734
1761
 
735
1762
  export interface HealthReport {