@xenosystem/agent-sdk 0.8.12

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 (175) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +511 -0
  3. package/dist/agents/index.cjs +17 -0
  4. package/dist/agents/index.d.cts +244 -0
  5. package/dist/agents/index.d.ts +244 -0
  6. package/dist/agents/index.js +17 -0
  7. package/dist/agents/metafile-cjs.json +1 -0
  8. package/dist/agents/metafile-esm.json +1 -0
  9. package/dist/artifacts/browser.cjs +1 -0
  10. package/dist/artifacts/browser.d.cts +8 -0
  11. package/dist/artifacts/browser.d.ts +8 -0
  12. package/dist/artifacts/browser.js +1 -0
  13. package/dist/artifacts/diff-artifact-C2tQZWcs.d.cts +354 -0
  14. package/dist/artifacts/diff-artifact-C2tQZWcs.d.ts +354 -0
  15. package/dist/artifacts/index.cjs +10 -0
  16. package/dist/artifacts/index.d.cts +588 -0
  17. package/dist/artifacts/index.d.ts +588 -0
  18. package/dist/artifacts/index.js +10 -0
  19. package/dist/artifacts/metafile-cjs.json +1 -0
  20. package/dist/artifacts/metafile-esm.json +1 -0
  21. package/dist/automation/index.cjs +438 -0
  22. package/dist/automation/index.d.cts +878 -0
  23. package/dist/automation/index.d.ts +878 -0
  24. package/dist/automation/index.js +438 -0
  25. package/dist/automation/metafile-cjs.json +1 -0
  26. package/dist/automation/metafile-esm.json +1 -0
  27. package/dist/control-plane/index.cjs +7 -0
  28. package/dist/control-plane/index.d.cts +403 -0
  29. package/dist/control-plane/index.d.ts +403 -0
  30. package/dist/control-plane/index.js +7 -0
  31. package/dist/control-plane/metafile-cjs.json +1 -0
  32. package/dist/control-plane/metafile-esm.json +1 -0
  33. package/dist/control-room/index.cjs +1 -0
  34. package/dist/control-room/index.d.cts +216 -0
  35. package/dist/control-room/index.d.ts +216 -0
  36. package/dist/control-room/index.js +1 -0
  37. package/dist/control-room/metafile-cjs.json +1 -0
  38. package/dist/control-room/metafile-esm.json +1 -0
  39. package/dist/electron/index.cjs +1476 -0
  40. package/dist/electron/index.d.cts +1583 -0
  41. package/dist/electron/index.d.ts +1583 -0
  42. package/dist/electron/index.js +1476 -0
  43. package/dist/electron/metafile-cjs.json +1 -0
  44. package/dist/electron/metafile-esm.json +1 -0
  45. package/dist/governance/index.cjs +33 -0
  46. package/dist/governance/index.d.cts +397 -0
  47. package/dist/governance/index.d.ts +397 -0
  48. package/dist/governance/index.js +33 -0
  49. package/dist/governance/metafile-cjs.json +1 -0
  50. package/dist/governance/metafile-esm.json +1 -0
  51. package/dist/hooks/index.cjs +9 -0
  52. package/dist/hooks/index.d.cts +198 -0
  53. package/dist/hooks/index.d.ts +198 -0
  54. package/dist/hooks/index.js +9 -0
  55. package/dist/hooks/metafile-cjs.json +1 -0
  56. package/dist/hooks/metafile-esm.json +1 -0
  57. package/dist/hosted/index.cjs +1 -0
  58. package/dist/hosted/index.d.cts +490 -0
  59. package/dist/hosted/index.d.ts +490 -0
  60. package/dist/hosted/index.js +1 -0
  61. package/dist/hosted/metafile-cjs.json +1 -0
  62. package/dist/hosted/metafile-esm.json +1 -0
  63. package/dist/index.cjs +2161 -0
  64. package/dist/index.d.cts +12259 -0
  65. package/dist/index.d.ts +12259 -0
  66. package/dist/index.js +2161 -0
  67. package/dist/intelligence/index.cjs +10 -0
  68. package/dist/intelligence/index.d.cts +220 -0
  69. package/dist/intelligence/index.d.ts +220 -0
  70. package/dist/intelligence/index.js +10 -0
  71. package/dist/intelligence/metafile-cjs.json +1 -0
  72. package/dist/intelligence/metafile-esm.json +1 -0
  73. package/dist/mcp/index.cjs +28 -0
  74. package/dist/mcp/index.d.cts +960 -0
  75. package/dist/mcp/index.d.ts +960 -0
  76. package/dist/mcp/index.js +28 -0
  77. package/dist/mcp/metafile-cjs.json +1 -0
  78. package/dist/mcp/metafile-esm.json +1 -0
  79. package/dist/metafile-cjs.json +1 -0
  80. package/dist/metafile-esm.json +1 -0
  81. package/dist/oracle/index.cjs +1 -0
  82. package/dist/oracle/index.d.cts +310 -0
  83. package/dist/oracle/index.d.ts +310 -0
  84. package/dist/oracle/index.js +1 -0
  85. package/dist/oracle/metafile-cjs.json +1 -0
  86. package/dist/oracle/metafile-esm.json +1 -0
  87. package/dist/providers/index.cjs +11 -0
  88. package/dist/providers/index.d.cts +462 -0
  89. package/dist/providers/index.d.ts +462 -0
  90. package/dist/providers/index.js +11 -0
  91. package/dist/providers/metafile-cjs.json +1 -0
  92. package/dist/providers/metafile-esm.json +1 -0
  93. package/dist/recipes/index.cjs +2 -0
  94. package/dist/recipes/index.d.cts +86 -0
  95. package/dist/recipes/index.d.ts +86 -0
  96. package/dist/recipes/index.js +2 -0
  97. package/dist/recipes/metafile-cjs.json +1 -0
  98. package/dist/recipes/metafile-esm.json +1 -0
  99. package/dist/research/index.cjs +3 -0
  100. package/dist/research/index.d.cts +285 -0
  101. package/dist/research/index.d.ts +285 -0
  102. package/dist/research/index.js +3 -0
  103. package/dist/research/metafile-cjs.json +1 -0
  104. package/dist/research/metafile-esm.json +1 -0
  105. package/dist/session/index.cjs +56 -0
  106. package/dist/session/index.d.cts +523 -0
  107. package/dist/session/index.d.ts +523 -0
  108. package/dist/session/index.js +56 -0
  109. package/dist/session/metafile-cjs.json +1 -0
  110. package/dist/session/metafile-esm.json +1 -0
  111. package/dist/sharing/index.cjs +4 -0
  112. package/dist/sharing/index.d.cts +272 -0
  113. package/dist/sharing/index.d.ts +272 -0
  114. package/dist/sharing/index.js +4 -0
  115. package/dist/sharing/metafile-cjs.json +1 -0
  116. package/dist/sharing/metafile-esm.json +1 -0
  117. package/dist/skills/index.cjs +6 -0
  118. package/dist/skills/index.d.cts +277 -0
  119. package/dist/skills/index.d.ts +277 -0
  120. package/dist/skills/index.js +6 -0
  121. package/dist/skills/metafile-cjs.json +1 -0
  122. package/dist/skills/metafile-esm.json +1 -0
  123. package/dist/soul/index.cjs +32 -0
  124. package/dist/soul/index.d.cts +138 -0
  125. package/dist/soul/index.d.ts +138 -0
  126. package/dist/soul/index.js +32 -0
  127. package/dist/soul/metafile-cjs.json +1 -0
  128. package/dist/soul/metafile-esm.json +1 -0
  129. package/dist/terminal/index.cjs +4 -0
  130. package/dist/terminal/index.d.cts +55 -0
  131. package/dist/terminal/index.d.ts +55 -0
  132. package/dist/terminal/index.js +4 -0
  133. package/dist/terminal/metafile-cjs.json +1 -0
  134. package/dist/terminal/metafile-esm.json +1 -0
  135. package/dist/ui/index.cjs +35 -0
  136. package/dist/ui/index.d.cts +298 -0
  137. package/dist/ui/index.d.ts +298 -0
  138. package/dist/ui/index.js +35 -0
  139. package/dist/ui/metafile-cjs.json +1 -0
  140. package/dist/ui/metafile-esm.json +1 -0
  141. package/dist/utils/index.cjs +23 -0
  142. package/dist/utils/index.d.cts +245 -0
  143. package/dist/utils/index.d.ts +245 -0
  144. package/dist/utils/index.js +23 -0
  145. package/dist/utils/metafile-cjs.json +1 -0
  146. package/dist/utils/metafile-esm.json +1 -0
  147. package/native/mxc/LICENSE.microsoft-mxc-sdk.md +21 -0
  148. package/native/mxc/README.md +25 -0
  149. package/native/mxc/bin/arm64/lxc-exec +0 -0
  150. package/native/mxc/bin/arm64/mxc-exec-mac +0 -0
  151. package/native/mxc/bin/arm64/wxc-exec.exe +0 -0
  152. package/native/mxc/bin/arm64/wxc-host-prep.exe +0 -0
  153. package/native/mxc/bin/x64/lxc-exec +0 -0
  154. package/native/mxc/bin/x64/wxc-exec.exe +0 -0
  155. package/native/mxc/bin/x64/wxc-host-prep.exe +0 -0
  156. package/native/mxc/package.json +58 -0
  157. package/ownership/CLEAN_ROOM_CONTRIBUTOR_GUIDE.md +63 -0
  158. package/ownership/audit.mjs +727 -0
  159. package/ownership/evidence/PROPRIETARY-COMMAND-1/implementation-record.md +77 -0
  160. package/ownership/evidence/PROPRIETARY-COMMAND-1/provenance-review.md +51 -0
  161. package/ownership/evidence/PROPRIETARY-MEDIA-1/implementation-record.md +131 -0
  162. package/ownership/evidence/PROPRIETARY-MEDIA-1/provenance-review.md +50 -0
  163. package/ownership/evidence/PROPRIETARY-PTY-1/implementation-record.md +86 -0
  164. package/ownership/evidence/PROPRIETARY-PTY-1/provenance-review.md +52 -0
  165. package/ownership/evidence/PROPRIETARY-RUNTIME-1/implementation-record.md +68 -0
  166. package/ownership/evidence/PROPRIETARY-RUNTIME-1/provenance-review.md +32 -0
  167. package/ownership/evidence/PROPRIETARY-TOOLCHAIN-1/implementation-record.md +53 -0
  168. package/ownership/evidence/PROPRIETARY-TOOLCHAIN-1/provenance-review.md +32 -0
  169. package/ownership/evidence/PROPRIETARY-UI-1/implementation-record.md +96 -0
  170. package/ownership/evidence/PROPRIETARY-UI-1/provenance-review.md +46 -0
  171. package/ownership/ownership-policy.json +232 -0
  172. package/ownership/ownership-policy.schema.json +192 -0
  173. package/ownership/templates/clean-room-implementation-record.md +70 -0
  174. package/ownership/templates/provenance-review.md +51 -0
  175. package/package.json +209 -0
@@ -0,0 +1,403 @@
1
+ type AgentRunStatus = "queued" | "starting" | "running" | "blocked" | "waiting_for_user" | "waiting_for_tool" | "waiting_for_hook" | "waiting_for_permission" | "paused" | "completed" | "failed" | "cancelled" | "interrupted" | "detached";
2
+ interface AgentRunUsage {
3
+ input: number;
4
+ output: number;
5
+ total: number;
6
+ estimatedCostUsd?: number;
7
+ }
8
+ interface AgentRunAgentDefinitionRef {
9
+ name: string;
10
+ scope: "project" | "user" | "plugin" | "built-in";
11
+ path: string;
12
+ description?: string;
13
+ model?: string;
14
+ }
15
+ interface AgentRunRecord {
16
+ schemaVersion: 1;
17
+ runId: string;
18
+ sessionId: string;
19
+ rootRunId: string;
20
+ parentRunId?: string;
21
+ cwd: string;
22
+ workspaceId: string;
23
+ prompt: string;
24
+ title?: string;
25
+ status: AgentRunStatus;
26
+ statusReason?: string;
27
+ blockedReason?: string;
28
+ model: string;
29
+ effort?: "low" | "medium" | "high" | "xhigh" | "max";
30
+ agent?: AgentRunAgentDefinitionRef;
31
+ permissionMode: "default" | "plan" | "acceptEdits" | "auto" | "dontAsk" | "bypassPermissions";
32
+ createdByCliVersion?: string;
33
+ createdBySdkVersion?: string;
34
+ createdAt: string;
35
+ updatedAt: string;
36
+ startedAt?: string;
37
+ endedAt?: string;
38
+ lastActivityAt?: string;
39
+ pinned: boolean;
40
+ attachedClients: number;
41
+ workerPid?: number;
42
+ workerVersion?: string;
43
+ cliVersion?: string;
44
+ sdkVersion?: string;
45
+ stdoutPath: string;
46
+ stderrPath: string;
47
+ eventsPath: string;
48
+ exitCode?: number | null;
49
+ git?: {
50
+ root?: string;
51
+ originBranch?: string;
52
+ originCommit?: string;
53
+ branch?: string;
54
+ baseRef?: string;
55
+ commit?: string;
56
+ worktree?: string;
57
+ };
58
+ usage: AgentRunUsage;
59
+ children: string[];
60
+ tags: string[];
61
+ }
62
+ interface AgentRunEvent {
63
+ schemaVersion: 1;
64
+ eventId?: string;
65
+ sequence?: number;
66
+ runId: string;
67
+ type: string;
68
+ timestamp: string;
69
+ payload: Record<string, unknown>;
70
+ }
71
+ interface AgentRunListOptions {
72
+ cwd?: string;
73
+ all?: boolean;
74
+ status?: AgentRunStatus[];
75
+ limit?: number;
76
+ }
77
+ interface AgentRunCreateInput {
78
+ prompt: string;
79
+ cwd: string;
80
+ model: string;
81
+ effort?: AgentRunRecord["effort"];
82
+ agent?: AgentRunAgentDefinitionRef;
83
+ permissionMode: AgentRunRecord["permissionMode"];
84
+ title?: string;
85
+ pinned?: boolean;
86
+ git?: AgentRunRecord["git"];
87
+ cliVersion?: string;
88
+ sdkVersion?: string;
89
+ }
90
+ declare function getAgentRunStoreDir(): string;
91
+ declare function getAgentRunDir(runId: string): string;
92
+ declare function createAgentRunId(date?: Date): string;
93
+ declare class AgentRunStore {
94
+ private readonly runsDir;
95
+ private readonly eventStore;
96
+ constructor(runsDir?: string);
97
+ create(input: AgentRunCreateInput): AgentRunRecord;
98
+ get(runId: string): AgentRunRecord | null;
99
+ list(options?: AgentRunListOptions): AgentRunRecord[];
100
+ markSpawned(runId: string, pid: number, workerVersion?: string): AgentRunRecord | null;
101
+ markStarted(runId: string, input: {
102
+ pid: number;
103
+ workerVersion?: string;
104
+ model?: string;
105
+ effort?: AgentRunRecord["effort"];
106
+ }): AgentRunRecord | null;
107
+ markCompleted(runId: string, input: {
108
+ status: AgentRunStatus;
109
+ statusReason?: string;
110
+ exitCode?: number | null;
111
+ usage?: AgentRunUsage;
112
+ }): AgentRunRecord | null;
113
+ markCancelled(runId: string, reason: string): AgentRunRecord | null;
114
+ markPaused(runId: string, reason?: string): AgentRunRecord | null;
115
+ markResumed(runId: string, reason?: string): AgentRunRecord | null;
116
+ setPinned(runId: string, pinned: boolean): AgentRunRecord | null;
117
+ appendEvent(runId: string, type: string, payload?: Record<string, unknown>): void;
118
+ readEvents(runId: string): AgentRunEvent[];
119
+ delete(runId: string): void;
120
+ refreshRecordStatus(record: AgentRunRecord): AgentRunRecord;
121
+ private update;
122
+ private write;
123
+ private recordPath;
124
+ private runDir;
125
+ }
126
+ declare class AgentEventStore {
127
+ private readonly runsDir;
128
+ constructor(runsDir: string);
129
+ pathFor(runId: string): string;
130
+ append(runId: string, type: string, payload?: Record<string, unknown>, timestamp?: string): AgentRunEvent;
131
+ read(runId: string): AgentRunEvent[];
132
+ tail(runId: string, limit?: number): AgentRunEvent[];
133
+ }
134
+ interface AgentRunSpawnResult {
135
+ pid: number;
136
+ workerVersion?: string;
137
+ }
138
+ interface AgentRunControllerOptions {
139
+ store?: AgentRunStore;
140
+ spawn?: (record: AgentRunRecord) => AgentRunSpawnResult | Promise<AgentRunSpawnResult>;
141
+ stop?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
142
+ pause?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
143
+ resume?: (record: AgentRunRecord, reason: string) => void | Promise<void>;
144
+ }
145
+ declare class AgentRunController {
146
+ private readonly options;
147
+ readonly store: AgentRunStore;
148
+ constructor(options?: AgentRunControllerOptions);
149
+ create(input: AgentRunCreateInput): AgentRunRecord;
150
+ start(input: AgentRunCreateInput): Promise<AgentRunRecord>;
151
+ get(runId: string): AgentRunRecord | null;
152
+ list(options?: AgentRunListOptions): AgentRunRecord[];
153
+ events(runId: string, limit?: number): AgentRunEvent[];
154
+ stop(runId: string, reason?: string): Promise<AgentRunRecord | null>;
155
+ pause(runId: string, reason?: string): Promise<AgentRunRecord | null>;
156
+ resume(runId: string, reason?: string): Promise<AgentRunRecord | null>;
157
+ complete(runId: string, status: Extract<AgentRunStatus, "completed" | "failed" | "interrupted">, options?: {
158
+ reason?: string;
159
+ exitCode?: number | null;
160
+ usage?: AgentRunUsage;
161
+ }): AgentRunRecord | null;
162
+ }
163
+ declare const AGENT_DAEMON_PROTOCOL_VERSION: 1;
164
+ interface AgentDaemonRequest<T = unknown> {
165
+ protocolVersion: typeof AGENT_DAEMON_PROTOCOL_VERSION;
166
+ id: string;
167
+ method: string;
168
+ params: T;
169
+ authToken?: string;
170
+ }
171
+ interface AgentDaemonError {
172
+ code: string;
173
+ message: string;
174
+ }
175
+ type AgentDaemonResponse<T = unknown> = {
176
+ protocolVersion: 1;
177
+ id: string;
178
+ result: T;
179
+ } | {
180
+ protocolVersion: 1;
181
+ id: string;
182
+ error: AgentDaemonError;
183
+ };
184
+ type AgentDaemonHandler = (params: unknown, request: AgentDaemonRequest) => unknown | Promise<unknown>;
185
+ type AgentDaemonTransport = (request: AgentDaemonRequest) => AgentDaemonResponse | Promise<AgentDaemonResponse>;
186
+ declare class AgentDaemonServer {
187
+ private readonly options;
188
+ private readonly handlers;
189
+ constructor(options?: {
190
+ authToken?: string;
191
+ });
192
+ register(method: string, handler: AgentDaemonHandler): this;
193
+ registerController(controller: AgentRunController): this;
194
+ handle(request: AgentDaemonRequest): Promise<AgentDaemonResponse>;
195
+ private error;
196
+ }
197
+ declare class AgentDaemonClient {
198
+ private readonly transport;
199
+ private readonly options;
200
+ constructor(transport: AgentDaemonTransport, options?: {
201
+ authToken?: string;
202
+ });
203
+ request<TResult = unknown, TParams = unknown>(method: string, params: TParams): Promise<TResult>;
204
+ }
205
+ interface WorkflowNodeDefinition {
206
+ id: string;
207
+ dependsOn?: string[];
208
+ input?: unknown;
209
+ }
210
+ interface WorkflowDefinition {
211
+ schemaVersion: 1;
212
+ id: string;
213
+ name: string;
214
+ nodes: WorkflowNodeDefinition[];
215
+ maxConcurrency?: number;
216
+ failFast?: boolean;
217
+ }
218
+ type WorkflowNodeStatus = "pending" | "running" | "completed" | "failed" | "skipped";
219
+ type WorkflowRunStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
220
+ interface WorkflowRunNodeRecord {
221
+ status: WorkflowNodeStatus;
222
+ startedAt?: string;
223
+ completedAt?: string;
224
+ output?: unknown;
225
+ error?: string;
226
+ }
227
+ interface WorkflowRunRecord {
228
+ schemaVersion: 1;
229
+ runId: string;
230
+ workflowId: string;
231
+ status: WorkflowRunStatus;
232
+ createdAt: string;
233
+ updatedAt: string;
234
+ completedAt?: string;
235
+ nodes: Record<string, WorkflowRunNodeRecord>;
236
+ }
237
+ interface WorkflowEvent {
238
+ schemaVersion: 1;
239
+ eventId: string;
240
+ runId: string;
241
+ type: string;
242
+ timestamp: string;
243
+ nodeId?: string;
244
+ payload: Record<string, unknown>;
245
+ }
246
+ interface WorkflowPlan {
247
+ workflowId: string;
248
+ waves: string[][];
249
+ }
250
+ declare class WorkflowPlanner {
251
+ plan(definition: WorkflowDefinition): WorkflowPlan;
252
+ }
253
+ declare class WorkflowStore {
254
+ private readonly rootDir;
255
+ constructor(rootDir?: string);
256
+ saveDefinition(definition: WorkflowDefinition): WorkflowDefinition;
257
+ getDefinition(id: string): WorkflowDefinition | null;
258
+ listDefinitions(): WorkflowDefinition[];
259
+ createRun(definition: WorkflowDefinition): WorkflowRunRecord;
260
+ getRun(runId: string): WorkflowRunRecord | null;
261
+ updateRun(runId: string, updater: (record: WorkflowRunRecord) => WorkflowRunRecord): WorkflowRunRecord;
262
+ appendEvent(runId: string, type: string, payload: Record<string, unknown>, nodeId?: string): WorkflowEvent;
263
+ readEvents(runId: string): WorkflowEvent[];
264
+ private writeRun;
265
+ private definitionsDir;
266
+ private runsDir;
267
+ private runPath;
268
+ private eventsPath;
269
+ }
270
+ type WorkflowNodeExecutor = (node: WorkflowNodeDefinition, context: {
271
+ run: WorkflowRunRecord;
272
+ definition: WorkflowDefinition;
273
+ }) => unknown | Promise<unknown>;
274
+ declare class WorkflowRuntime {
275
+ private readonly store;
276
+ private readonly planner;
277
+ constructor(store?: WorkflowStore, planner?: WorkflowPlanner);
278
+ run(definition: WorkflowDefinition, executor: WorkflowNodeExecutor): Promise<WorkflowRunRecord>;
279
+ }
280
+ interface MonitorEvent {
281
+ schemaVersion: 1;
282
+ eventId: string;
283
+ sourceId: string;
284
+ type: string;
285
+ timestamp: string;
286
+ payload: Record<string, unknown>;
287
+ }
288
+ interface MonitorSource {
289
+ id: string;
290
+ start?(): void | Promise<void>;
291
+ poll(): Array<Omit<MonitorEvent, "schemaVersion" | "eventId" | "sourceId" | "timestamp"> & {
292
+ timestamp?: string;
293
+ }> | Promise<Array<Omit<MonitorEvent, "schemaVersion" | "eventId" | "sourceId" | "timestamp"> & {
294
+ timestamp?: string;
295
+ }>>;
296
+ stop?(): void | Promise<void>;
297
+ }
298
+ interface MonitorSnapshot {
299
+ sourceId: string;
300
+ running: boolean;
301
+ events: MonitorEvent[];
302
+ }
303
+ declare class MonitorManager {
304
+ private readonly maxEvents;
305
+ private readonly sources;
306
+ private readonly events;
307
+ constructor(maxEvents?: number);
308
+ register(source: MonitorSource): this;
309
+ start(sourceId: string, intervalMs?: number): Promise<MonitorSnapshot>;
310
+ poll(sourceId: string): Promise<MonitorEvent[]>;
311
+ stop(sourceId: string): Promise<MonitorSnapshot>;
312
+ stopAll(): Promise<void>;
313
+ snapshot(sourceId: string, limit?: number): MonitorSnapshot;
314
+ list(): Array<{
315
+ sourceId: string;
316
+ running: boolean;
317
+ }>;
318
+ private require;
319
+ }
320
+ declare class MonitorTool {
321
+ private readonly manager;
322
+ constructor(manager: MonitorManager);
323
+ execute(input: {
324
+ sourceId: string;
325
+ intervalMs?: number;
326
+ }): Promise<MonitorSnapshot>;
327
+ }
328
+ declare class MonitorStopTool {
329
+ private readonly manager;
330
+ constructor(manager: MonitorManager);
331
+ execute(input: {
332
+ sourceId: string;
333
+ }): Promise<MonitorSnapshot>;
334
+ }
335
+ interface UsageAttribution {
336
+ runId?: string;
337
+ sessionId?: string;
338
+ workflowRunId?: string;
339
+ agentId?: string;
340
+ provider?: string;
341
+ model?: string;
342
+ }
343
+ interface UsageEvent extends UsageAttribution {
344
+ schemaVersion: 1;
345
+ eventId: string;
346
+ timestamp: string;
347
+ inputTokens: number;
348
+ outputTokens: number;
349
+ cachedInputTokens?: number;
350
+ estimatedCostUsd?: number;
351
+ metadata?: Record<string, string | number | boolean>;
352
+ }
353
+ interface UsageQuery extends UsageAttribution {
354
+ from?: string;
355
+ to?: string;
356
+ }
357
+ interface UsageTotals {
358
+ inputTokens: number;
359
+ outputTokens: number;
360
+ totalTokens: number;
361
+ cachedInputTokens: number;
362
+ estimatedCostUsd: number;
363
+ events: number;
364
+ }
365
+ declare class UsageAccumulator {
366
+ private totalsValue;
367
+ add(event: Pick<UsageEvent, "inputTokens" | "outputTokens" | "cachedInputTokens" | "estimatedCostUsd">): this;
368
+ snapshot(): UsageTotals;
369
+ }
370
+ declare class UsageLedger {
371
+ private readonly path;
372
+ constructor(path?: string);
373
+ append(input: Omit<UsageEvent, "schemaVersion" | "eventId" | "timestamp"> & {
374
+ timestamp?: string;
375
+ }): UsageEvent;
376
+ query(query?: UsageQuery): UsageEvent[];
377
+ summarize(query?: UsageQuery): UsageTotals;
378
+ }
379
+ interface OtelUsageAdapter {
380
+ addCounter(name: string, value: number, attributes: Readonly<Record<string, string>>): void;
381
+ recordEvent?(name: string, attributes: Readonly<Record<string, string>>): void;
382
+ }
383
+ declare class OtelExporter {
384
+ private readonly adapter;
385
+ constructor(adapter: OtelUsageAdapter);
386
+ export(events: readonly UsageEvent[]): void;
387
+ }
388
+ interface ControlPlaneLockRecord {
389
+ schemaVersion: 1;
390
+ name: string;
391
+ pid: number;
392
+ hostname: string;
393
+ processStartedAt: string;
394
+ version: string;
395
+ acquiredAt: string;
396
+ updatedAt: string;
397
+ }
398
+ interface ControlPlaneLockHandle {
399
+ record: ControlPlaneLockRecord;
400
+ release: () => void;
401
+ }
402
+ declare function acquireControlPlaneLock(path: string, name: string, version: string): ControlPlaneLockHandle;
403
+ export { AGENT_DAEMON_PROTOCOL_VERSION, AgentDaemonClient, type AgentDaemonError, type AgentDaemonHandler, type AgentDaemonRequest, type AgentDaemonResponse, AgentDaemonServer, type AgentDaemonTransport, AgentEventStore, type AgentRunAgentDefinitionRef, AgentRunController, type AgentRunControllerOptions, type AgentRunCreateInput, type AgentRunEvent, type AgentRunListOptions, type AgentRunRecord, type AgentRunSpawnResult, type AgentRunStatus, AgentRunStore, type AgentRunUsage, type ControlPlaneLockHandle, type ControlPlaneLockRecord, type MonitorEvent, MonitorManager, type MonitorSnapshot, type MonitorSource, MonitorStopTool, MonitorTool, OtelExporter, type OtelUsageAdapter, UsageAccumulator, type UsageAttribution, type UsageEvent, UsageLedger, type UsageQuery, type UsageTotals, type WorkflowDefinition, type WorkflowEvent, type WorkflowNodeDefinition, type WorkflowNodeExecutor, type WorkflowNodeStatus, type WorkflowPlan, WorkflowPlanner, type WorkflowRunNodeRecord, type WorkflowRunRecord, type WorkflowRunStatus, WorkflowRuntime, WorkflowStore, acquireControlPlaneLock, createAgentRunId, getAgentRunDir, getAgentRunStoreDir };
@@ -0,0 +1,7 @@
1
+ import{randomUUID as Ee}from"node:crypto";import{existsSync as De,mkdirSync as b,readFileSync as xe,readdirSync as Ie,renameSync as Te,rmSync as Pe,writeFileSync as S}from"node:fs";import{homedir as be}from"node:os";import{basename as H,dirname as Oe,join as c,resolve as _e}from"node:path";var h="0.8.11";import{mkdirSync as ue,readFileSync as de,rmSync as $,writeFileSync as ce}from"node:fs";import{hostname as L}from"node:os";import{dirname as le}from"node:path";function pe(){return new Date().toISOString()}function ge(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function F(n){try{return JSON.parse(de(n,"utf8"))}catch{return null}}function me(n){if(!n||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}function fe(n){return n.hostname!==L()?!0:me(n.pid)}function W(n,e){ue(le(n),{recursive:!0}),ce(n,JSON.stringify(e,null,2)+`
2
+ `,{encoding:"utf8",flag:"wx"})}function he(n,e){let t=F(n);t?.pid!==e.pid||t.hostname!==e.hostname||$(n,{force:!0})}function k(n,e,t){let r=pe(),o={schemaVersion:1,name:e,pid:process.pid,hostname:L(),processStartedAt:ge(),version:t,acquiredAt:r,updatedAt:r};try{W(n,o)}catch(i){if(i.code!=="EEXIST")throw i;let a=F(n);if(a&&fe(a))throw new Error(`${e} is already locked by PID ${a.pid} on ${a.hostname}.`);$(n,{force:!0}),W(n,o)}return{record:o,release:()=>{he(n,o)}}}import{randomUUID as Re}from"node:crypto";import{appendFileSync as we,existsSync as ve,mkdirSync as j,readFileSync as ke}from"node:fs";import{basename as Ae,dirname as ye,join as Se}from"node:path";function J(n){return Ae(n).replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,96)}function q(n){return ve(n)?ke(n,"utf8").split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>e!==null):[]}var A=class{constructor(e){this.runsDir=e;j(this.runsDir,{recursive:!0})}runsDir;pathFor(e){return Se(this.runsDir,J(e),"events.jsonl")}append(e,t,r={},o=new Date().toISOString()){let i=this.pathFor(e);j(ye(i),{recursive:!0});let s=k(`${i}.lock`,`events:${J(e)}`,h);try{let a=q(i).reduce((T,l,v)=>Math.max(T,l.sequence??v),-1)+1,p={schemaVersion:1,eventId:`event_${Re()}`,sequence:a,runId:e,type:t,timestamp:o,payload:r};return we(i,`${JSON.stringify(p)}
3
+ `,"utf8"),p}finally{s.release()}}read(e){return q(this.pathFor(e))}tail(e,t=100){let r=Math.max(0,Math.min(1e4,Math.trunc(t)));return r===0?[]:this.read(e).slice(-r)}};var Ce=1,Ue=c(be(),".xeno-agent"),Me=c(process.env.XENO_AGENT_HOME??Ue,"daemon"),_=c(Me,"runs");function d(){return new Date().toISOString()}function Ne(n=new Date){return n.toISOString().replace(/[^0-9]/g,"").slice(0,14)}function O(n){return n.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)}function C(n){return _e(n)}function E(n){return C(n).toLowerCase()}function z(n,e){let t=E(n),r=E(e);return t===r||t.startsWith(`${r}\\`)||t.startsWith(`${r}/`)}function Ve(n,e){return!!(E(n.cwd)===E(e)||n.git?.root&&z(e,n.git.root)||n.git?.worktree&&z(e,n.git.worktree))}function We(n){return O(Buffer.from(C(n)).toString("base64url"))}function $e(){return{input:0,output:0,total:0}}function y(n){try{return JSON.parse(xe(n,"utf8"))}catch{return null}}function Le(n){return n instanceof Error&&/\balready locked by PID\b/.test(n.message)}function Fe(n,e){b(Oe(n),{recursive:!0});let t=`${n}.${process.pid}.${Date.now()}.tmp`;S(t,JSON.stringify(e,null,2)+`
4
+ `,"utf8"),Te(t,n)}function je(n){if(!n||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}function Je(n){return n==="completed"||n==="failed"||n==="cancelled"||n==="interrupted"}function qe(n,e){return n.pinned!==e.pinned?n.pinned?-1:1:Date.parse(e.updatedAt)-Date.parse(n.updatedAt)}function bt(){return _}function Ot(n){return c(_,n)}function He(n=new Date){return`run_${Ne(n)}_${Ee().slice(0,8)}`}var D=class{constructor(e=_){this.runsDir=e;b(this.runsDir,{recursive:!0}),this.eventStore=new A(this.runsDir)}runsDir;eventStore;create(e){let t=He(),r=c(this.runsDir,t);b(r,{recursive:!0});let o=d(),i=c(r,"events.jsonl"),s={schemaVersion:Ce,runId:t,sessionId:t,rootRunId:t,cwd:C(e.cwd),workspaceId:We(e.cwd),prompt:e.prompt,...e.title?{title:e.title}:{},status:"starting",model:e.model,...e.effort?{effort:e.effort}:{},...e.agent?{agent:e.agent}:{},...e.git?{git:e.git}:{},permissionMode:e.permissionMode,...e.cliVersion?{createdByCliVersion:e.cliVersion}:{},createdBySdkVersion:e.sdkVersion??h,createdAt:o,updatedAt:o,lastActivityAt:o,pinned:!!e.pinned,attachedClients:0,...e.cliVersion?{cliVersion:e.cliVersion}:{},...e.sdkVersion?{sdkVersion:e.sdkVersion}:{},stdoutPath:c(r,"stdout.log"),stderrPath:c(r,"stderr.log"),eventsPath:i,usage:$e(),children:[],tags:[]};return S(s.stdoutPath,"","utf8"),S(s.stderrPath,"","utf8"),S(s.eventsPath,"","utf8"),this.write(s),this.appendEvent(t,"run_created",{cwd:s.cwd,model:s.model,...s.agent?{agent:s.agent}:{},...s.git?{git:s.git}:{},permissionMode:s.permissionMode,pinned:s.pinned}),s}get(e){let t=y(this.recordPath(e));return t?this.refreshRecordStatus(t):null}list(e={}){if(!De(this.runsDir))return[];let t=Ie(this.runsDir,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>{try{return this.get(r.name)}catch(o){if(Le(o))return y(this.recordPath(r.name));throw o}}).filter(r=>r!==null).filter(r=>e.all||!e.cwd||Ve(r,e.cwd)).filter(r=>!e.status||e.status.includes(r.status)).sort(qe);return typeof e.limit=="number"&&e.limit>0?t.slice(0,e.limit):t}markSpawned(e,t,r){return this.update(e,o=>({...o,status:"running",workerPid:t,...r?{workerVersion:r}:{},startedAt:o.startedAt??d(),lastActivityAt:d()}))}markStarted(e,t){return this.update(e,r=>({...r,status:"running",workerPid:t.pid,...t.workerVersion?{workerVersion:t.workerVersion}:{},...t.model?{model:t.model}:{},...t.effort?{effort:t.effort}:{},startedAt:r.startedAt??d(),lastActivityAt:d()}))}markCompleted(e,t){return this.update(e,r=>({...r,status:t.status,...t.statusReason?{statusReason:t.statusReason}:{},exitCode:t.exitCode??null,usage:t.usage??r.usage,endedAt:d(),lastActivityAt:d()}))}markCancelled(e,t){return this.update(e,r=>({...r,status:"cancelled",statusReason:t,endedAt:d(),lastActivityAt:d()}))}markPaused(e,t="Paused by user."){let r=this.update(e,o=>({...o,status:"paused",statusReason:t,lastActivityAt:d()}));return r&&this.appendEvent(e,"run_paused",{reason:t}),r}markResumed(e,t="Resumed by user."){let r=this.update(e,o=>{let i={...o,status:"running",statusReason:t,lastActivityAt:d()};return delete i.endedAt,delete i.exitCode,i});return r&&this.appendEvent(e,"run_resumed",{reason:t}),r}setPinned(e,t){let r=this.update(e,o=>({...o,pinned:t,lastActivityAt:d()}));return r&&this.appendEvent(e,t?"run_pinned":"run_unpinned",{pinned:t}),r}appendEvent(e,t,r={}){let o=y(this.recordPath(e)),i=this.eventStore.append(e,t,r);o&&this.update(e,s=>({...s,lastActivityAt:i.timestamp}))}readEvents(e){return this.get(e)?this.eventStore.read(e):[]}delete(e){Pe(c(this.runsDir,e),{recursive:!0,force:!0})}refreshRecordStatus(e){if(Je(e.status))return e;if(e.workerPid&&!je(e.workerPid)){let t={...e,status:"failed",statusReason:"Worker process is no longer running and did not record a terminal status.",endedAt:e.endedAt??d(),updatedAt:d()};return this.write(t),t}return e}update(e,t){let r=y(this.recordPath(e));if(!r)return null;let o=t(r);return o.updatedAt=d(),this.write(o),o}write(e){let t=k(c(this.runDir(e.runId),"run.lock"),`run:${e.runId}`,h);try{Fe(this.recordPath(e.runId),e)}finally{t.release()}}recordPath(e){return c(this.runsDir,O(H(e)),"run.json")}runDir(e){return c(this.runsDir,O(H(e)))}};function B(n){return n==="completed"||n==="failed"||n==="cancelled"||n==="interrupted"}var G=class{constructor(e={}){this.options=e;this.store=e.store??new D}options;store;create(e){return this.store.create(e)}async start(e){let t=this.create(e);if(!this.options.spawn)return t;try{let r=await this.options.spawn(t),o=this.store.markSpawned(t.runId,r.pid,r.workerVersion);if(!o)throw new Error(`Run disappeared during spawn: ${t.runId}`);return this.store.appendEvent(t.runId,"run_started",{pid:r.pid}),o}catch(r){let o=r instanceof Error?r.message:String(r);throw this.store.markCompleted(t.runId,{status:"failed",statusReason:o,exitCode:null}),this.store.appendEvent(t.runId,"run_start_failed",{reason:o}),r}}get(e){return this.store.get(e)}list(e={}){return this.store.list(e)}events(e,t){let r=this.store.readEvents(e);return t===void 0?r:r.slice(-Math.max(0,Math.trunc(t)))}async stop(e,t="Stopped by user."){let r=this.store.get(e);if(!r||B(r.status))return r;await this.options.stop?.(r,t);let o=this.store.markCancelled(e,t);return o&&this.store.appendEvent(e,"run_cancelled",{reason:t}),o}async pause(e,t="Paused by user."){let r=this.store.get(e);return!r||B(r.status)||r.status==="paused"?r:(await this.options.pause?.(r,t),this.store.markPaused(e,t))}async resume(e,t="Resumed by user."){let r=this.store.get(e);return!r||r.status!=="paused"?r:(await this.options.resume?.(r,t),this.store.markResumed(e,t))}complete(e,t,r={}){let o=this.store.markCompleted(e,{status:t,...r.reason?{statusReason:r.reason}:{},...r.exitCode!==void 0?{exitCode:r.exitCode}:{},...r.usage?{usage:r.usage}:{}});return o&&this.store.appendEvent(e,`run_${t}`,{...r.reason?{reason:r.reason}:{}}),o}};import{randomUUID as ze,timingSafeEqual as Be}from"node:crypto";var R=1;function Ge(n,e){if(!n)return!1;let t=Buffer.from(n),r=Buffer.from(e);return t.length===r.length&&Be(t,r)}var Q=class{constructor(e={}){this.options=e}options;handlers=new Map;register(e,t){let r=e.trim();if(!r)throw new Error("Daemon method name cannot be empty.");if(this.handlers.has(r))throw new Error(`Daemon method already registered: ${r}`);return this.handlers.set(r,t),this}registerController(e){return this.register("runs.start",t=>e.start(t)).register("runs.get",t=>e.get(t.runId)).register("runs.list",t=>e.list(t??{})).register("runs.events",t=>{let r=t;return e.events(r.runId,r.limit)}).register("runs.stop",t=>{let r=t;return e.stop(r.runId,r.reason)}).register("runs.pause",t=>{let r=t;return e.pause(r.runId,r.reason)}).register("runs.resume",t=>{let r=t;return e.resume(r.runId,r.reason)})}async handle(e){if(e.protocolVersion!==R)return this.error(e.id,"PROTOCOL_MISMATCH",`Unsupported protocol version: ${e.protocolVersion}`);if(this.options.authToken&&!Ge(e.authToken,this.options.authToken))return this.error(e.id,"UNAUTHORIZED","Daemon authentication failed.");let t=this.handlers.get(e.method);if(!t)return this.error(e.id,"METHOD_NOT_FOUND",`Unknown daemon method: ${e.method}`);try{return{protocolVersion:R,id:e.id,result:await t(e.params,e)}}catch(r){return this.error(e.id,"INTERNAL_ERROR",r instanceof Error?r.message:String(r))}}error(e,t,r){return{protocolVersion:R,id:e,error:{code:t,message:r}}}},X=class{constructor(e,t={}){this.transport=e;this.options=t}transport;options;async request(e,t){let r={protocolVersion:R,id:`request_${ze()}`,method:e,params:t,...this.options.authToken?{authToken:this.options.authToken}:{}},o=await this.transport(r);if(o.protocolVersion!==R||o.id!==r.id)throw new Error("Invalid daemon response identity.");if("error"in o){let i=new Error(o.error.message);throw i.code=o.error.code,i}return o.result}};import{randomUUID as Z}from"node:crypto";import{appendFileSync as Qe,existsSync as Xe,mkdirSync as I,readFileSync as ee,readdirSync as Ze,renameSync as Ke,writeFileSync as Ye}from"node:fs";import{homedir as et}from"node:os";import{basename as tt,dirname as te,join as g}from"node:path";function x(n){return tt(n).replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,96)}function U(n){try{return JSON.parse(ee(n,"utf8"))}catch{return null}}function K(n,e){I(te(n),{recursive:!0});let t=`${n}.${process.pid}.${Date.now()}.tmp`;Ye(t,`${JSON.stringify(e,null,2)}
5
+ `,"utf8"),Ke(t,n)}var w=class{plan(e){if(e.schemaVersion!==1)throw new Error("Unsupported workflow schema version.");if(!e.id.trim()||!e.name.trim())throw new Error("Workflow id and name are required.");let t=new Map;for(let s of e.nodes){if(!s.id.trim())throw new Error("Workflow node id cannot be empty.");if(t.has(s.id))throw new Error(`Duplicate workflow node: ${s.id}`);t.set(s.id,s)}for(let s of e.nodes)for(let a of s.dependsOn??[]){if(!t.has(a))throw new Error(`Workflow node ${s.id} depends on unknown node ${a}.`);if(a===s.id)throw new Error(`Workflow node ${s.id} cannot depend on itself.`)}let r=new Set(t.keys()),o=new Set,i=[];for(;r.size>0;){let s=[...r].filter(a=>(t.get(a)?.dependsOn??[]).every(p=>o.has(p))).sort();if(s.length===0)throw new Error("Workflow dependency graph contains a cycle.");i.push(s);for(let a of s)r.delete(a),o.add(a)}return{workflowId:e.id,waves:i}}},M=class{constructor(e=g(process.env.XENO_AGENT_HOME??g(et(),".xeno-agent"),"workflows")){this.rootDir=e;I(this.definitionsDir(),{recursive:!0}),I(this.runsDir(),{recursive:!0})}rootDir;saveDefinition(e){return new w().plan(e),K(g(this.definitionsDir(),`${x(e.id)}.json`),e),e}getDefinition(e){return U(g(this.definitionsDir(),`${x(e)}.json`))}listDefinitions(){return Ze(this.definitionsDir(),{withFileTypes:!0}).filter(e=>e.isFile()&&e.name.endsWith(".json")).map(e=>U(g(this.definitionsDir(),e.name))).filter(e=>e!==null)}createRun(e){new w().plan(e);let t=new Date().toISOString(),r={schemaVersion:1,runId:`workflow_run_${Z()}`,workflowId:e.id,status:"queued",createdAt:t,updatedAt:t,nodes:Object.fromEntries(e.nodes.map(o=>[o.id,{status:"pending"}]))};return this.writeRun(r),this.appendEvent(r.runId,"workflow_created",{}),r}getRun(e){return U(this.runPath(e))}updateRun(e,t){let r=this.getRun(e);if(!r)throw new Error(`Workflow run not found: ${e}`);let o=t(r);return o.updatedAt=new Date().toISOString(),this.writeRun(o),o}appendEvent(e,t,r,o){let i={schemaVersion:1,eventId:`workflow_event_${Z()}`,runId:e,type:t,timestamp:new Date().toISOString(),...o?{nodeId:o}:{},payload:r},s=this.eventsPath(e);return I(te(s),{recursive:!0}),Qe(s,`${JSON.stringify(i)}
6
+ `,"utf8"),i}readEvents(e){let t=this.eventsPath(e);return Xe(t)?ee(t,"utf8").split(/\r?\n/).filter(Boolean).flatMap(r=>{try{return[JSON.parse(r)]}catch{return[]}}):[]}writeRun(e){K(this.runPath(e.runId),e)}definitionsDir(){return g(this.rootDir,"definitions")}runsDir(){return g(this.rootDir,"runs")}runPath(e){return g(this.runsDir(),x(e),"run.json")}eventsPath(e){return g(this.runsDir(),x(e),"events.jsonl")}},Y=class{constructor(e=new M,t=new w){this.store=e;this.planner=t}store;planner;async run(e,t){let r=this.planner.plan(e),o=this.store.createRun(e);o=this.store.updateRun(o.runId,a=>({...a,status:"running"})),this.store.appendEvent(o.runId,"workflow_started",{waves:r.waves.length});let i=Math.max(1,Math.trunc(e.maxConcurrency??4)),s=!1;for(let a of r.waves)for(let p=0;p<a.length;p+=i){let T=a.slice(p,p+i);await Promise.all(T.map(async l=>{let v=e.nodes.find(u=>u.id===l);if((v.dependsOn??[]).some(u=>this.store.getRun(o.runId)?.nodes[u]?.status!=="completed")||s&&e.failFast!==!1){this.store.updateRun(o.runId,u=>({...u,nodes:{...u.nodes,[l]:{status:"skipped",completedAt:new Date().toISOString()}}})),this.store.appendEvent(o.runId,"node_skipped",{},l);return}let P=new Date().toISOString();o=this.store.updateRun(o.runId,u=>({...u,nodes:{...u.nodes,[l]:{status:"running",startedAt:P}}})),this.store.appendEvent(o.runId,"node_started",{},l);try{let u=await t(v,{run:o,definition:e});this.store.updateRun(o.runId,f=>({...f,nodes:{...f.nodes,[l]:{status:"completed",startedAt:P,completedAt:new Date().toISOString(),output:u}}})),this.store.appendEvent(o.runId,"node_completed",{},l)}catch(u){s=!0;let f=u instanceof Error?u.message:String(u);this.store.updateRun(o.runId,V=>({...V,nodes:{...V.nodes,[l]:{status:"failed",startedAt:P,completedAt:new Date().toISOString(),error:f}}})),this.store.appendEvent(o.runId,"node_failed",{error:f},l)}}))}return o=this.store.updateRun(o.runId,a=>({...a,status:s?"failed":"completed",completedAt:new Date().toISOString()})),this.store.appendEvent(o.runId,s?"workflow_failed":"workflow_completed",{}),o}};import{randomUUID as rt}from"node:crypto";var re=class{constructor(e=1e4){this.maxEvents=e;if(!Number.isInteger(e)||e<1)throw new Error("maxEvents must be a positive integer.")}maxEvents;sources=new Map;events=[];register(e){if(!e.id.trim())throw new Error("Monitor source id cannot be empty.");if(this.sources.has(e.id))throw new Error(`Monitor source already registered: ${e.id}`);return this.sources.set(e.id,{source:e,running:!1}),this}async start(e,t=1e3){let r=this.require(e);if(r.running)return this.snapshot(e);await r.source.start?.(),r.running=!0,await this.poll(e);let o=Math.max(25,Math.trunc(t));return r.timer=setInterval(()=>{this.poll(e).catch(()=>{})},o),r.timer.unref?.(),this.snapshot(e)}async poll(e){let o=(await this.require(e).source.poll()).map(i=>({schemaVersion:1,eventId:`monitor_event_${rt()}`,sourceId:e,type:i.type,timestamp:i.timestamp??new Date().toISOString(),payload:i.payload}));return this.events.push(...o),this.events.length>this.maxEvents&&this.events.splice(0,this.events.length-this.maxEvents),o}async stop(e){let t=this.require(e);return t.timer&&clearInterval(t.timer),t.timer=void 0,t.running&&await t.source.stop?.(),t.running=!1,this.snapshot(e)}async stopAll(){await Promise.all([...this.sources.keys()].map(e=>this.stop(e)))}snapshot(e,t=100){let r=this.require(e);return{sourceId:e,running:r.running,events:this.events.filter(o=>o.sourceId===e).slice(-Math.max(0,Math.trunc(t)))}}list(){return[...this.sources].map(([e,t])=>({sourceId:e,running:t.running}))}require(e){let t=this.sources.get(e);if(!t)throw new Error(`Monitor source not found: ${e}`);return t}},ne=class{constructor(e){this.manager=e}manager;execute(e){return this.manager.start(e.sourceId,e.intervalMs)}},oe=class{constructor(e){this.manager=e}manager;execute(e){return this.manager.stop(e.sourceId)}};import{randomUUID as nt}from"node:crypto";import{appendFileSync as ot,existsSync as st,mkdirSync as it,readFileSync as at}from"node:fs";import{homedir as ut}from"node:os";import{dirname as dt,join as se}from"node:path";function m(n){return Number.isFinite(n)?Math.max(0,n??0):0}var N=class{totalsValue={inputTokens:0,outputTokens:0,totalTokens:0,cachedInputTokens:0,estimatedCostUsd:0,events:0};add(e){let t=m(e.inputTokens),r=m(e.outputTokens);return this.totalsValue.inputTokens+=t,this.totalsValue.outputTokens+=r,this.totalsValue.totalTokens+=t+r,this.totalsValue.cachedInputTokens+=m(e.cachedInputTokens),this.totalsValue.estimatedCostUsd+=m(e.estimatedCostUsd),this.totalsValue.events+=1,this}snapshot(){return{...this.totalsValue}}};function ct(n,e){if(["runId","sessionId","workflowRunId","agentId","provider","model"].some(o=>e[o]!==void 0&&n[o]!==e[o]))return!1;let r=Date.parse(n.timestamp);return!(e.from&&r<Date.parse(e.from)||e.to&&r>Date.parse(e.to))}var ie=class{path;constructor(e=se(process.env.XENO_AGENT_HOME??se(ut(),".xeno-agent"),"usage","events.jsonl")){this.path=e,it(dt(e),{recursive:!0})}append(e){let t={...e,schemaVersion:1,eventId:`usage_${nt()}`,timestamp:e.timestamp??new Date().toISOString(),inputTokens:m(e.inputTokens),outputTokens:m(e.outputTokens),...e.cachedInputTokens!==void 0?{cachedInputTokens:m(e.cachedInputTokens)}:{},...e.estimatedCostUsd!==void 0?{estimatedCostUsd:m(e.estimatedCostUsd)}:{}};return ot(this.path,`${JSON.stringify(t)}
7
+ `,"utf8"),t}query(e={}){return st(this.path)?at(this.path,"utf8").split(/\r?\n/).filter(Boolean).flatMap(t=>{try{let r=JSON.parse(t);return ct(r,e)?[r]:[]}catch{return[]}}):[]}summarize(e={}){let t=new N;for(let r of this.query(e))t.add(r);return t.snapshot()}},ae=class{constructor(e){this.adapter=e}adapter;export(e){for(let t of e){let r={...t.provider?{provider:t.provider}:{},...t.model?{model:t.model}:{}};this.adapter.addCounter("xeno.usage.input_tokens",t.inputTokens,r),this.adapter.addCounter("xeno.usage.output_tokens",t.outputTokens,r),t.cachedInputTokens&&this.adapter.addCounter("xeno.usage.cached_input_tokens",t.cachedInputTokens,r),t.estimatedCostUsd&&this.adapter.addCounter("xeno.usage.estimated_cost_usd",t.estimatedCostUsd,r),this.adapter.recordEvent?.("xeno.usage.recorded",r)}}};export{R as AGENT_DAEMON_PROTOCOL_VERSION,X as AgentDaemonClient,Q as AgentDaemonServer,A as AgentEventStore,G as AgentRunController,D as AgentRunStore,re as MonitorManager,oe as MonitorStopTool,ne as MonitorTool,ae as OtelExporter,N as UsageAccumulator,ie as UsageLedger,w as WorkflowPlanner,Y as WorkflowRuntime,M as WorkflowStore,k as acquireControlPlaneLock,He as createAgentRunId,Ot as getAgentRunDir,bt as getAgentRunStoreDir};
@@ -0,0 +1 @@
1
+ {"inputs":{"src/control-plane/types.ts":{"bytes":2467,"imports":[],"format":"esm"},"src/version.ts":{"bytes":38,"imports":[],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/event-store.ts":{"bytes":2379,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"}],"format":"esm"},"src/control-plane/run-store.ts":{"bytes":12025,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/control-plane/event-store.ts","kind":"import-statement","original":"./event-store.js"}],"format":"esm"},"src/control-plane/controller.ts":{"bytes":4220,"imports":[{"path":"src/control-plane/run-store.ts","kind":"import-statement","original":"./run-store.js"}],"format":"esm"},"src/control-plane/daemon.ts":{"bytes":5047,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/workflow.ts":{"bytes":10410,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/monitor.ts":{"bytes":4128,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/usage.ts":{"bytes":5185,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/index.ts":{"bytes":281,"imports":[{"path":"src/control-plane/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/control-plane/run-store.ts","kind":"import-statement","original":"./run-store.js"},{"path":"src/control-plane/event-store.ts","kind":"import-statement","original":"./event-store.js"},{"path":"src/control-plane/controller.ts","kind":"import-statement","original":"./controller.js"},{"path":"src/control-plane/daemon.ts","kind":"import-statement","original":"./daemon.js"},{"path":"src/control-plane/workflow.ts","kind":"import-statement","original":"./workflow.js"},{"path":"src/control-plane/monitor.ts","kind":"import-statement","original":"./monitor.js"},{"path":"src/control-plane/usage.ts","kind":"import-statement","original":"./usage.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"}],"format":"esm"}},"outputs":{"dist/control-plane/index.cjs":{"imports":[{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:crypto","kind":"require-call","external":true},{"path":"node:fs","kind":"require-call","external":true},{"path":"node:os","kind":"require-call","external":true},{"path":"node:path","kind":"require-call","external":true}],"exports":[],"entryPoint":"src/control-plane/index.ts","inputs":{"src/control-plane/index.ts":{"bytesInOutput":480},"src/control-plane/run-store.ts":{"bytesInOutput":5542},"src/version.ts":{"bytesInOutput":15},"src/control-plane/lock.ts":{"bytesInOutput":1063},"src/control-plane/event-store.ts":{"bytesInOutput":1057},"src/control-plane/controller.ts":{"bytesInOutput":1689},"src/control-plane/daemon.ts":{"bytesInOutput":1935},"src/control-plane/workflow.ts":{"bytesInOutput":4890},"src/control-plane/monitor.ts":{"bytesInOutput":1816},"src/control-plane/usage.ts":{"bytesInOutput":2271}},"bytes":21538}}}
@@ -0,0 +1 @@
1
+ {"inputs":{"src/control-plane/types.ts":{"bytes":2467,"imports":[],"format":"esm"},"src/version.ts":{"bytes":38,"imports":[],"format":"esm"},"src/control-plane/lock.ts":{"bytes":2591,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/event-store.ts":{"bytes":2379,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"}],"format":"esm"},"src/control-plane/run-store.ts":{"bytes":12025,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"src/version.ts","kind":"import-statement","original":"../version.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"},{"path":"src/control-plane/event-store.ts","kind":"import-statement","original":"./event-store.js"}],"format":"esm"},"src/control-plane/controller.ts":{"bytes":4220,"imports":[{"path":"src/control-plane/run-store.ts","kind":"import-statement","original":"./run-store.js"}],"format":"esm"},"src/control-plane/daemon.ts":{"bytes":5047,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/workflow.ts":{"bytes":10410,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/monitor.ts":{"bytes":4128,"imports":[{"path":"node:crypto","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/usage.ts":{"bytes":5185,"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"format":"esm"},"src/control-plane/index.ts":{"bytes":281,"imports":[{"path":"src/control-plane/types.ts","kind":"import-statement","original":"./types.js"},{"path":"src/control-plane/run-store.ts","kind":"import-statement","original":"./run-store.js"},{"path":"src/control-plane/event-store.ts","kind":"import-statement","original":"./event-store.js"},{"path":"src/control-plane/controller.ts","kind":"import-statement","original":"./controller.js"},{"path":"src/control-plane/daemon.ts","kind":"import-statement","original":"./daemon.js"},{"path":"src/control-plane/workflow.ts","kind":"import-statement","original":"./workflow.js"},{"path":"src/control-plane/monitor.ts","kind":"import-statement","original":"./monitor.js"},{"path":"src/control-plane/usage.ts","kind":"import-statement","original":"./usage.js"},{"path":"src/control-plane/lock.ts","kind":"import-statement","original":"./lock.js"}],"format":"esm"}},"outputs":{"dist/control-plane/index.js":{"imports":[{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:crypto","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:os","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true}],"exports":["AGENT_DAEMON_PROTOCOL_VERSION","AgentDaemonClient","AgentDaemonServer","AgentEventStore","AgentRunController","AgentRunStore","MonitorManager","MonitorStopTool","MonitorTool","OtelExporter","UsageAccumulator","UsageLedger","WorkflowPlanner","WorkflowRuntime","WorkflowStore","acquireControlPlaneLock","createAgentRunId","getAgentRunDir","getAgentRunStoreDir"],"entryPoint":"src/control-plane/index.ts","inputs":{"src/control-plane/index.ts":{"bytesInOutput":0},"src/control-plane/run-store.ts":{"bytesInOutput":5373},"src/version.ts":{"bytesInOutput":15},"src/control-plane/lock.ts":{"bytesInOutput":1041},"src/control-plane/event-store.ts":{"bytesInOutput":1057},"src/control-plane/controller.ts":{"bytesInOutput":1686},"src/control-plane/daemon.ts":{"bytesInOutput":1941},"src/control-plane/workflow.ts":{"bytesInOutput":4760},"src/control-plane/monitor.ts":{"bytesInOutput":1820},"src/control-plane/usage.ts":{"bytesInOutput":2283}},"bytes":20410}}}
@@ -0,0 +1 @@
1
+ "use strict";var _=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var V=(t,n)=>{for(var r in n)_(t,r,{get:n[r],enumerable:!0})},z=(t,n,r,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let d of F(n))!P.call(t,d)&&d!==r&&_(t,d,{get:()=>n[d],enumerable:!(a=B(n,d))||a.enumerable});return t};var L=t=>z(_({},"__esModule",{value:!0}),t);var lt={};V(lt,{XENO_CONTROL_ROOM_SCHEMA_VERSION:()=>A,XenoControlRoomValidationError:()=>s,planXenoControlRoomAction:()=>Z,projectXenoControlRoom:()=>J,validateXenoControlRoomSnapshot:()=>M});module.exports=L(lt);var A="xeno.control-room.v1";var w=require("node:crypto");var G=6e4,s=class extends Error{constructor(n){super(n),this.name="XenoControlRoomValidationError"}};function J(t,n={}){let r=C(n.generatedAt??new Date().toISOString(),"generatedAt"),a=Date.parse(r),d=dt(n.staleAfterMs??G,1e3,864e5,"staleAfterMs");h(t.agents.map(o=>o.agentId),"agent"),h((t.tasks??[]).map(o=>o.taskId),"task"),h((t.approvals??[]).map(o=>o.approvalId),"approval"),h((t.artifacts??[]).map(o=>`${o.artifactId}:${o.revision}`),"artifact revision");let i=new Map(t.agents.map(o=>[o.agentId,Q(o)]));W(i);let g=new Map;for(let o of i.values())!o.parentAgentId||!i.has(o.parentAgentId)||g.set(o.parentAgentId,[...g.get(o.parentAgentId)??[],o.agentId]);let p=Y(i),e=[...i.values()].map(o=>{let c=tt(o.status),u=Date.parse(o.heartbeatAt??o.lastActivityAt??o.updatedAt),v=(c==="active"||c==="waiting"||c==="queued")&&Number.isFinite(u)&&a-u>d,U=Date.parse(o.createdAt);return{...o,statusCategory:c,depth:p(o.agentId),childAgentIds:(g.get(o.agentId)??[]).sort(),orphaned:!!(o.parentAgentId&&!i.has(o.parentAgentId)),stale:v,elapsedMs:Number.isFinite(U)?Math.max(0,a-U):0,allowedActions:ot(o,c),usage:at(o.usage)}}).sort(rt),l=new Set(e.map(o=>o.agentId)),m=(t.tasks??[]).map(o=>({...o,dependencyIds:[...new Set(o.dependencyIds??[])].sort(),artifactIds:[...new Set(o.artifactIds??[])].sort(),evidenceCount:ct(o.evidenceCount??0,"task evidenceCount"),orphanedOwner:!!(o.ownerAgentId&&!l.has(o.ownerAgentId)),blockedByTaskIds:(o.dependencyIds??[]).filter(c=>{let u=t.tasks?.find(v=>v.taskId===c);return!u||u.status!=="completed"}).sort()})).sort((o,c)=>o.taskId.localeCompare(c.taskId));q(m);let X=[...t.approvals??[]].sort((o,c)=>Date.parse(o.requestedAt)-Date.parse(c.requestedAt)),j=[...t.artifacts??[]].sort((o,c)=>o.artifactId.localeCompare(c.artifactId)||o.revision-c.revision),$=[...t.monitors??[]].sort((o,c)=>o.monitorId.localeCompare(c.monitorId)),b=[...t.goals??[]].sort((o,c)=>o.goalId.localeCompare(c.goalId)),y=[...t.notifications??[]].sort((o,c)=>Date.parse(o.createdAt)-Date.parse(c.createdAt)),D=et(e,m,X,b,y),H=e.reduce((o,c)=>st(o,c.usage),it()),K={agents:e.length,activeAgents:e.filter(o=>o.statusCategory==="active").length,waitingAgents:e.filter(o=>o.statusCategory==="waiting").length,blockedAgents:e.filter(o=>o.statusCategory==="blocked").length,terminalAgents:e.filter(o=>o.statusCategory==="terminal").length,staleAgents:e.filter(o=>o.stale).length,orphanedAgents:e.filter(o=>o.orphaned).length,tasks:m.length,completedTasks:m.filter(o=>o.status==="completed").length,blockedTasks:m.filter(o=>o.status==="blocked"||o.blockedByTaskIds.length>0).length,pendingApprovals:X.filter(o=>o.state==="pending").length,activeMonitors:$.filter(o=>o.status==="running").length,activeGoals:b.filter(o=>o.status==="active"||o.status==="blocked").length,unacknowledgedNotifications:y.filter(o=>!o.acknowledgedAt).length,usage:H},N={agents:e,rootAgentIds:e.filter(o=>!o.parentAgentId||!l.has(o.parentAgentId)).map(o=>o.agentId),tasks:m,approvals:X,artifacts:j,monitors:$,goals:b,notifications:y,attention:D,summary:K},E=R(x(N)),O={schemaVersion:A,snapshotId:n.snapshotId?.trim()||`control_room_${(0,w.randomUUID)()}`,generatedAt:r,staleAfterMs:d,sourceFingerprint:E,...N};return{...O,snapshotHash:R(x(O))}}function Z(t,n){if(M(t),n.snapshotHash!==t.snapshotHash)throw new s("Control-room action targets a stale snapshot");k(n.actionId,"actionId"),k(n.actorId,"actorId"),C(n.requestedAt,"requestedAt");let r=t.agents.find(l=>l.agentId===n.targetId||l.runId===n.targetId||l.sessionId===n.targetId),a=t.approvals.find(l=>l.approvalId===n.targetId),d=t.notifications.find(l=>l.notificationId===n.targetId),i,g=!1,p=n.scope?.trim()||"target",e={};if(n.kind==="jump"){if(!r&&!a&&!d)throw new s("Jump target is not present in the snapshot");i="read"}else if(n.kind==="steer"||n.kind==="follow_up"){if(!r||!r.allowedActions.includes(n.kind))throw new s(`${n.kind} is not available for this agent`);e.message=T(n.message,"message"),i="agent_message"}else if(n.kind==="stop"||n.kind==="retry"){if(!r||!r.allowedActions.includes(n.kind))throw new s(`${n.kind} is not available for this agent`);n.reason?.trim()&&(e.reason=n.reason.trim()),i="process_control",g=n.kind==="stop"}else if(n.kind==="approve"||n.kind==="reject"){if(!a||a.state!=="pending")throw new s("Approval target is not pending in this snapshot");if(n.reason?.trim()&&(e.reason=n.reason.trim()),n.kind==="reject"&&!e.reason)throw new s("A rejection reason is required");i="approval_decision",g=!0,p=n.scope?.trim()||a.scope}else if(n.kind==="acknowledge"){if(!d||d.acknowledgedAt)throw new s("Notification target is not awaiting acknowledgement");i="notification_ack"}else throw new s(`Unsupported control-room action: ${String(n.kind)}`);return{schemaVersion:"xeno.control-room-action.v1",actionId:n.actionId,kind:n.kind,targetId:n.targetId,actorId:n.actorId,requestedAt:n.requestedAt,expectedSnapshotHash:t.snapshotHash,idempotencyKey:R(`${t.snapshotHash}:${n.actionId}:${n.kind}:${n.targetId}`),authority:i,confirmationRequired:g,scope:p,payload:e}}function M(t){if(t.schemaVersion!==A)throw new s("Unsupported control-room schema");let{snapshotHash:n,...r}=t;if(R(x(r))!==t.snapshotHash)throw new s("Control-room snapshot hash mismatch");return t}function Q(t){if(k(t.agentId,"agentId"),T(t.workspaceId,"workspaceId"),T(t.name,"agent name"),C(t.createdAt,"agent createdAt"),C(t.updatedAt,"agent updatedAt"),t.parentAgentId===t.agentId)throw new s(`Agent ${t.agentId} cannot parent itself`);return{...t,taskIds:[...new Set(t.taskIds??[])].sort(),artifactIds:[...new Set(t.artifactIds??[])].sort()}}function W(t){for(let n of t.values()){let r=new Set,a=n;for(;a?.parentAgentId&&t.has(a.parentAgentId);){if(r.has(a.agentId))throw new s(`Agent hierarchy contains a cycle at ${a.agentId}`);r.add(a.agentId),a=t.get(a.parentAgentId)}}}function Y(t){let n=new Map;return function r(a){let d=n.get(a);if(d!==void 0)return d;let i=t.get(a)?.parentAgentId,g=i&&t.has(i)?r(i)+1:0;return n.set(a,g),g}}function q(t){let n=new Set(t.map(r=>r.taskId));for(let r of t){if(r.dependencyIds.includes(r.taskId))throw new s(`Task ${r.taskId} depends on itself`);for(let a of r.dependencyIds)if(!n.has(a))throw new s(`Task ${r.taskId} has unknown dependency ${a}`)}}function tt(t){return t==="queued"||t==="starting"?"queued":t==="running"||t==="working"||t==="idle"||t==="detached"?"active":t==="waiting_for_user"||t==="waiting_for_tool"||t==="waiting_for_hook"||t==="waiting_for_permission"||t==="paused"?"waiting":t==="blocked"?"blocked":"terminal"}function nt(t){return t==="active"||t==="waiting"||t==="blocked"||t==="queued"?["jump","steer","follow_up","stop"]:["jump","retry"]}function ot(t,n){let r=nt(n);if(t.allowedActions===void 0)return r;let a=[...new Set(t.allowedActions)];for(let d of a)if(!r.includes(d))throw new s(`Agent ${t.agentId} cannot advertise ${d} while ${n}`);return r.filter(d=>a.includes(d))}function et(t,n,r,a,d){let i=[],g=new Set(t.map(e=>e.agentId));for(let e of r.filter(l=>l.state==="pending"))i.push({attentionId:`attention:approval:${e.approvalId}`,kind:"approval",priority:"critical",targetId:e.approvalId,title:e.title,summary:e.summary??`${e.kind} approval requested for ${e.scope}`,createdAt:e.requestedAt,actions:["jump","approve","reject"]});for(let e of t)e.statusCategory==="blocked"?i.push(I(e,"blocked_agent","high",e.statusReason??"Agent is blocked")):e.statusCategory==="waiting"?i.push(I(e,"waiting_agent","high",e.statusReason??"Agent is waiting")):e.status==="failed"&&i.push(I(e,"failed_agent","high",e.statusReason??"Agent failed")),e.stale&&i.push(I(e,"stale_agent","high","Agent heartbeat is stale")),e.orphaned&&i.push(I(e,"orphaned_agent","normal",`Parent agent ${e.parentAgentId} is missing`));for(let e of n)(e.status==="blocked"||e.blockedByTaskIds.length)&&i.push({attentionId:`attention:task:${e.taskId}`,kind:"blocked_task",priority:"high",targetId:e.taskId,title:e.title,summary:e.blockedByTaskIds.length?`Blocked by ${e.blockedByTaskIds.join(", ")}`:"Task is blocked",createdAt:e.updatedAt,actions:["jump"]}),e.orphanedOwner&&i.push({attentionId:`attention:task-owner:${e.taskId}`,kind:"orphaned_task",priority:"normal",targetId:e.taskId,title:e.title,summary:`Assigned agent ${e.ownerAgentId} is missing`,createdAt:e.updatedAt,actions:["jump"]});for(let e of a.filter(l=>l.status==="blocked"))i.push({attentionId:`attention:goal:${e.goalId}`,kind:"blocked_goal",priority:"high",targetId:e.goalId,title:"Blocked goal",summary:e.nextAction??e.condition,createdAt:e.updatedAt,actions:["jump"]});for(let e of d.filter(l=>!l.acknowledgedAt&&l.targetAgentId&&!g.has(l.targetAgentId)))i.push({attentionId:`attention:notification:${e.notificationId}`,kind:"orphaned_notification",priority:"normal",targetId:e.notificationId,title:"Orphaned notification",summary:e.summary,createdAt:e.createdAt,actions:["jump","acknowledge"]});let p={critical:0,high:1,normal:2};return i.sort((e,l)=>p[e.priority]-p[l.priority]||Date.parse(e.createdAt)-Date.parse(l.createdAt))}function I(t,n,r,a){return{attentionId:`attention:${n}:${t.agentId}`,kind:n,priority:r,targetId:t.agentId,title:t.title??t.name,summary:a,createdAt:t.lastActivityAt??t.updatedAt,actions:t.allowedActions}}function rt(t,n){return t.depth-n.depth||t.agentId.localeCompare(n.agentId)}function at(t){let n=f(t?.inputTokens),r=f(t?.outputTokens);return{inputTokens:n,outputTokens:r,totalTokens:f(t?.totalTokens??n+r),...t?.cachedInputTokens!==void 0?{cachedInputTokens:f(t.cachedInputTokens)}:{},...t?.estimatedCostUsd!==void 0?{estimatedCostUsd:f(t.estimatedCostUsd)}:{}}}function it(){return{inputTokens:0,outputTokens:0,totalTokens:0,cachedInputTokens:0,estimatedCostUsd:0}}function st(t,n){return{inputTokens:t.inputTokens+n.inputTokens,outputTokens:t.outputTokens+n.outputTokens,totalTokens:t.totalTokens+n.totalTokens,cachedInputTokens:(t.cachedInputTokens??0)+(n.cachedInputTokens??0),estimatedCostUsd:(t.estimatedCostUsd??0)+(n.estimatedCostUsd??0)}}function h(t,n){let r=new Set;for(let a of t){if(k(a,`${n} ID`),r.has(a))throw new s(`Duplicate ${n} ID: ${a}`);r.add(a)}}function k(t,n){let r=t?.trim()??"";if(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/u.test(r))throw new s(`${n} is invalid`);return r}function T(t,n){let r=t?.trim()??"";if(!r||r.length>64*1024)throw new s(`${n} is required`);return r}function C(t,n){if(!Number.isFinite(Date.parse(t)))throw new s(`${n} must be a valid timestamp`);return t}function dt(t,n,r,a){if(!Number.isInteger(t)||t<n||t>r)throw new s(`${a} must be between ${n} and ${r}`);return t}function ct(t,n){if(!Number.isInteger(t)||t<0)throw new s(`${n} must be a non-negative integer`);return t}function f(t){return Number.isFinite(t)?Math.max(0,t??0):0}function R(t){return(0,w.createHash)("sha256").update(t,"utf8").digest("hex")}function x(t){return JSON.stringify(S(t))}function S(t){return Array.isArray(t)?t.map(S):!t||typeof t!="object"?t:Object.fromEntries(Object.entries(t).filter(([,n])=>n!==void 0).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>[n,S(r)]))}0&&(module.exports={XENO_CONTROL_ROOM_SCHEMA_VERSION,XenoControlRoomValidationError,planXenoControlRoomAction,projectXenoControlRoom,validateXenoControlRoomSnapshot});