@agents-uni/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/DESIGN.md +283 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +589 -0
  4. package/README.md +589 -0
  5. package/dist/bridge/config-sync.d.ts +24 -0
  6. package/dist/bridge/config-sync.d.ts.map +1 -0
  7. package/dist/bridge/config-sync.js +39 -0
  8. package/dist/bridge/config-sync.js.map +1 -0
  9. package/dist/bridge/index.d.ts +7 -0
  10. package/dist/bridge/index.d.ts.map +1 -0
  11. package/dist/bridge/index.js +7 -0
  12. package/dist/bridge/index.js.map +1 -0
  13. package/dist/bridge/openclaw-adapter.d.ts +49 -0
  14. package/dist/bridge/openclaw-adapter.d.ts.map +1 -0
  15. package/dist/bridge/openclaw-adapter.js +151 -0
  16. package/dist/bridge/openclaw-adapter.js.map +1 -0
  17. package/dist/bridge/soul-generator.d.ts +34 -0
  18. package/dist/bridge/soul-generator.d.ts.map +1 -0
  19. package/dist/bridge/soul-generator.js +149 -0
  20. package/dist/bridge/soul-generator.js.map +1 -0
  21. package/dist/bridge/task-dispatcher.d.ts +107 -0
  22. package/dist/bridge/task-dispatcher.d.ts.map +1 -0
  23. package/dist/bridge/task-dispatcher.js +217 -0
  24. package/dist/bridge/task-dispatcher.js.map +1 -0
  25. package/dist/bridge/uni-registry.d.ts +82 -0
  26. package/dist/bridge/uni-registry.d.ts.map +1 -0
  27. package/dist/bridge/uni-registry.js +261 -0
  28. package/dist/bridge/uni-registry.js.map +1 -0
  29. package/dist/bridge/workspace-io.d.ts +64 -0
  30. package/dist/bridge/workspace-io.d.ts.map +1 -0
  31. package/dist/bridge/workspace-io.js +99 -0
  32. package/dist/bridge/workspace-io.js.map +1 -0
  33. package/dist/cli/commands/deploy.d.ts +6 -0
  34. package/dist/cli/commands/deploy.d.ts.map +1 -0
  35. package/dist/cli/commands/deploy.js +48 -0
  36. package/dist/cli/commands/deploy.js.map +1 -0
  37. package/dist/cli/commands/init.d.ts +2 -0
  38. package/dist/cli/commands/init.d.ts.map +1 -0
  39. package/dist/cli/commands/init.js +137 -0
  40. package/dist/cli/commands/init.js.map +1 -0
  41. package/dist/cli/commands/inspect.d.ts +4 -0
  42. package/dist/cli/commands/inspect.d.ts.map +1 -0
  43. package/dist/cli/commands/inspect.js +77 -0
  44. package/dist/cli/commands/inspect.js.map +1 -0
  45. package/dist/cli/commands/validate.d.ts +2 -0
  46. package/dist/cli/commands/validate.d.ts.map +1 -0
  47. package/dist/cli/commands/validate.js +30 -0
  48. package/dist/cli/commands/validate.js.map +1 -0
  49. package/dist/cli/commands/visualize.d.ts +2 -0
  50. package/dist/cli/commands/visualize.d.ts.map +1 -0
  51. package/dist/cli/commands/visualize.js +69 -0
  52. package/dist/cli/commands/visualize.js.map +1 -0
  53. package/dist/cli/index.d.ts +6 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +132 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/core/agent-registry.d.ts +37 -0
  58. package/dist/core/agent-registry.d.ts.map +1 -0
  59. package/dist/core/agent-registry.js +97 -0
  60. package/dist/core/agent-registry.js.map +1 -0
  61. package/dist/core/event-bus.d.ts +34 -0
  62. package/dist/core/event-bus.d.ts.map +1 -0
  63. package/dist/core/event-bus.js +96 -0
  64. package/dist/core/event-bus.js.map +1 -0
  65. package/dist/core/index.d.ts +8 -0
  66. package/dist/core/index.d.ts.map +1 -0
  67. package/dist/core/index.js +8 -0
  68. package/dist/core/index.js.map +1 -0
  69. package/dist/core/permission-matrix.d.ts +35 -0
  70. package/dist/core/permission-matrix.d.ts.map +1 -0
  71. package/dist/core/permission-matrix.js +95 -0
  72. package/dist/core/permission-matrix.js.map +1 -0
  73. package/dist/core/relationship-graph.d.ts +50 -0
  74. package/dist/core/relationship-graph.d.ts.map +1 -0
  75. package/dist/core/relationship-graph.js +150 -0
  76. package/dist/core/relationship-graph.js.map +1 -0
  77. package/dist/core/resource-pool.d.ts +48 -0
  78. package/dist/core/resource-pool.d.ts.map +1 -0
  79. package/dist/core/resource-pool.js +205 -0
  80. package/dist/core/resource-pool.js.map +1 -0
  81. package/dist/core/state-machine.d.ts +47 -0
  82. package/dist/core/state-machine.d.ts.map +1 -0
  83. package/dist/core/state-machine.js +110 -0
  84. package/dist/core/state-machine.js.map +1 -0
  85. package/dist/core/universe.d.ts +38 -0
  86. package/dist/core/universe.d.ts.map +1 -0
  87. package/dist/core/universe.js +101 -0
  88. package/dist/core/universe.js.map +1 -0
  89. package/dist/dashboard/api.d.ts +10 -0
  90. package/dist/dashboard/api.d.ts.map +1 -0
  91. package/dist/dashboard/api.js +237 -0
  92. package/dist/dashboard/api.js.map +1 -0
  93. package/dist/dashboard/index.d.ts +3 -0
  94. package/dist/dashboard/index.d.ts.map +1 -0
  95. package/dist/dashboard/index.js +3 -0
  96. package/dist/dashboard/index.js.map +1 -0
  97. package/dist/dashboard/server.d.ts +31 -0
  98. package/dist/dashboard/server.d.ts.map +1 -0
  99. package/dist/dashboard/server.js +44 -0
  100. package/dist/dashboard/server.js.map +1 -0
  101. package/dist/dashboard/templates.d.ts +47 -0
  102. package/dist/dashboard/templates.d.ts.map +1 -0
  103. package/dist/dashboard/templates.js +1481 -0
  104. package/dist/dashboard/templates.js.map +1 -0
  105. package/dist/evolution/index.d.ts +5 -0
  106. package/dist/evolution/index.d.ts.map +1 -0
  107. package/dist/evolution/index.js +5 -0
  108. package/dist/evolution/index.js.map +1 -0
  109. package/dist/evolution/memory-consolidator.d.ts +28 -0
  110. package/dist/evolution/memory-consolidator.d.ts.map +1 -0
  111. package/dist/evolution/memory-consolidator.js +84 -0
  112. package/dist/evolution/memory-consolidator.js.map +1 -0
  113. package/dist/evolution/performance-tracker.d.ts +29 -0
  114. package/dist/evolution/performance-tracker.d.ts.map +1 -0
  115. package/dist/evolution/performance-tracker.js +90 -0
  116. package/dist/evolution/performance-tracker.js.map +1 -0
  117. package/dist/evolution/promotion-engine.d.ts +32 -0
  118. package/dist/evolution/promotion-engine.d.ts.map +1 -0
  119. package/dist/evolution/promotion-engine.js +117 -0
  120. package/dist/evolution/promotion-engine.js.map +1 -0
  121. package/dist/evolution/relationship-evolver.d.ts +40 -0
  122. package/dist/evolution/relationship-evolver.d.ts.map +1 -0
  123. package/dist/evolution/relationship-evolver.js +105 -0
  124. package/dist/evolution/relationship-evolver.js.map +1 -0
  125. package/dist/index.d.ts +20 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +23 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/schema/index.d.ts +13 -0
  130. package/dist/schema/index.d.ts.map +1 -0
  131. package/dist/schema/index.js +18 -0
  132. package/dist/schema/index.js.map +1 -0
  133. package/dist/schema/universe.schema.json +214 -0
  134. package/dist/spec/compiler.d.ts +16 -0
  135. package/dist/spec/compiler.d.ts.map +1 -0
  136. package/dist/spec/compiler.js +26 -0
  137. package/dist/spec/compiler.js.map +1 -0
  138. package/dist/spec/index.d.ts +4 -0
  139. package/dist/spec/index.d.ts.map +1 -0
  140. package/dist/spec/index.js +4 -0
  141. package/dist/spec/index.js.map +1 -0
  142. package/dist/spec/parser.d.ts +11 -0
  143. package/dist/spec/parser.d.ts.map +1 -0
  144. package/dist/spec/parser.js +89 -0
  145. package/dist/spec/parser.js.map +1 -0
  146. package/dist/spec/validator.d.ts +9 -0
  147. package/dist/spec/validator.d.ts.map +1 -0
  148. package/dist/spec/validator.js +105 -0
  149. package/dist/spec/validator.js.map +1 -0
  150. package/dist/types/agent.d.ts +56 -0
  151. package/dist/types/agent.d.ts.map +1 -0
  152. package/dist/types/agent.js +8 -0
  153. package/dist/types/agent.js.map +1 -0
  154. package/dist/types/event.d.ts +34 -0
  155. package/dist/types/event.d.ts.map +1 -0
  156. package/dist/types/event.js +11 -0
  157. package/dist/types/event.js.map +1 -0
  158. package/dist/types/governance.d.ts +48 -0
  159. package/dist/types/governance.d.ts.map +1 -0
  160. package/dist/types/governance.js +9 -0
  161. package/dist/types/governance.js.map +1 -0
  162. package/dist/types/index.d.ts +9 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +9 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/types/memory.d.ts +73 -0
  167. package/dist/types/memory.d.ts.map +1 -0
  168. package/dist/types/memory.js +9 -0
  169. package/dist/types/memory.js.map +1 -0
  170. package/dist/types/protocol.d.ts +48 -0
  171. package/dist/types/protocol.d.ts.map +1 -0
  172. package/dist/types/protocol.js +9 -0
  173. package/dist/types/protocol.js.map +1 -0
  174. package/dist/types/relationship.d.ts +40 -0
  175. package/dist/types/relationship.d.ts.map +1 -0
  176. package/dist/types/relationship.js +9 -0
  177. package/dist/types/relationship.js.map +1 -0
  178. package/dist/types/resource.d.ts +52 -0
  179. package/dist/types/resource.d.ts.map +1 -0
  180. package/dist/types/resource.js +9 -0
  181. package/dist/types/resource.js.map +1 -0
  182. package/dist/types/universe.d.ts +71 -0
  183. package/dist/types/universe.d.ts.map +1 -0
  184. package/dist/types/universe.js +9 -0
  185. package/dist/types/universe.js.map +1 -0
  186. package/package.json +68 -0
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Task Dispatcher — the missing link between OpenClaw agents and competition engines.
3
+ *
4
+ * Completes the race loop:
5
+ * deploy SOUL.md → dispatch TASK.md → agent executes → collect SUBMISSION.md → judge
6
+ *
7
+ * Design principles:
8
+ * 1. File protocol: no HTTP required from agents, just file read/write
9
+ * 2. Pluggable I/O: swap FileWorkspaceIO for remote/memory backends
10
+ * 3. Event-driven: all lifecycle stages emit events via the org EventBus
11
+ * 4. Timeout-aware: agents that fail to submit within timeLimit are marked as timed out
12
+ * 5. Fault-tolerant: partial dispatch failures don't crash the whole pipeline
13
+ */
14
+ // ─── Task Markdown Generator ────────────────────
15
+ function generateTaskMarkdown(task, agentId) {
16
+ const lines = [
17
+ `# 📋 Task: ${task.title}`,
18
+ '',
19
+ `> **Task ID**: \`${task.id}\``,
20
+ `> **Participant**: \`${agentId}\``,
21
+ `> **Time Limit**: ${Math.round(task.timeoutMs / 1000)}s`,
22
+ '',
23
+ '---',
24
+ '',
25
+ '## Description',
26
+ '',
27
+ task.description,
28
+ '',
29
+ ];
30
+ if (task.criteria.length > 0) {
31
+ lines.push('## Evaluation Criteria', '');
32
+ lines.push('| Criterion | Weight | Description |');
33
+ lines.push('|-----------|--------|-------------|');
34
+ for (const c of task.criteria) {
35
+ lines.push(`| ${c.name} | ${c.weight} | ${c.description} |`);
36
+ }
37
+ lines.push('');
38
+ }
39
+ lines.push('## How to Submit', '', 'Write your response to a file named `SUBMISSION.md` in this workspace directory.', 'The dispatcher will automatically collect your submission.', '', '---', `*Dispatched at: ${new Date().toISOString()}*`);
40
+ return lines.join('\n');
41
+ }
42
+ // ─── Submission Parser ──────────────────────────
43
+ function parseSubmission(raw) {
44
+ // For now, the entire SUBMISSION.md content is the output.
45
+ // Future: support structured frontmatter (confidence, reasoning, etc.)
46
+ return raw.trim();
47
+ }
48
+ // ─── TaskDispatcher ─────────────────────────────
49
+ /**
50
+ * Dispatches tasks to agent workspaces and collects their submissions.
51
+ *
52
+ * Usage:
53
+ * ```typescript
54
+ * const io = new FileWorkspaceIO();
55
+ * const dispatcher = new TaskDispatcher(io, { eventBus: universe.events });
56
+ *
57
+ * const result = await dispatcher.run({
58
+ * id: 'race-001',
59
+ * title: '撰写一篇策论',
60
+ * description: '就"如何提升协作效率"撰写500字策论',
61
+ * criteria: [{ name: '质量', weight: 0.6, description: '...' }],
62
+ * timeoutMs: 60000,
63
+ * participants: ['zhenhuan', 'huafei', 'anlingrong'],
64
+ * });
65
+ * ```
66
+ */
67
+ export class TaskDispatcher {
68
+ io;
69
+ pollIntervalMs;
70
+ cleanup;
71
+ eventBus;
72
+ constructor(io, options = {}) {
73
+ this.io = io;
74
+ this.pollIntervalMs = options.pollIntervalMs ?? 2000;
75
+ this.cleanup = options.cleanup ?? true;
76
+ this.eventBus = options.eventBus;
77
+ }
78
+ /**
79
+ * Dispatch a task to all participants' workspaces.
80
+ * Writes TASK.md to each agent's workspace directory.
81
+ * Returns the list of agent IDs that failed to receive the task.
82
+ */
83
+ async dispatch(task) {
84
+ const failed = [];
85
+ // Clear any stale submissions first (best effort)
86
+ for (const agentId of task.participants) {
87
+ try {
88
+ await this.io.clearSubmission(agentId);
89
+ await this.io.clearTask(agentId);
90
+ }
91
+ catch {
92
+ // Stale cleanup is best-effort; if it fails, continue
93
+ }
94
+ }
95
+ // Write task to each workspace
96
+ for (const agentId of task.participants) {
97
+ try {
98
+ const markdown = generateTaskMarkdown(task, agentId);
99
+ await this.io.writeTask(agentId, markdown);
100
+ }
101
+ catch (err) {
102
+ failed.push(agentId);
103
+ console.warn(`[TaskDispatcher] Failed to dispatch TASK.md to ${agentId}:`, err instanceof Error ? err.message : err);
104
+ }
105
+ }
106
+ // Emit event
107
+ if (this.eventBus) {
108
+ const dispatched = task.participants.filter(id => !failed.includes(id));
109
+ await this.eventBus.emitSimple('race.dispatched', dispatched, `任务「${task.title}」已下发给 ${dispatched.length} 名参赛者` +
110
+ (failed.length > 0 ? `(${failed.length} 名下发失败)` : ''), { taskId: task.id, participants: dispatched, failed });
111
+ }
112
+ return failed;
113
+ }
114
+ /**
115
+ * Collect submissions from participants, polling until timeout.
116
+ * Returns all collected submissions and which agents timed out.
117
+ */
118
+ async collect(task, dispatchedAt, excludeAgents = []) {
119
+ const startTime = Date.now();
120
+ // Only wait for agents that actually received the task
121
+ const activeParticipants = task.participants.filter(id => !excludeAgents.includes(id));
122
+ const remaining = new Set(activeParticipants);
123
+ const submissions = [];
124
+ // Poll for submissions
125
+ while (remaining.size > 0) {
126
+ const elapsed = Date.now() - startTime;
127
+ if (elapsed >= task.timeoutMs)
128
+ break;
129
+ for (const agentId of [...remaining]) {
130
+ try {
131
+ const raw = await this.io.readSubmission(agentId);
132
+ if (raw !== null) {
133
+ const output = parseSubmission(raw);
134
+ submissions.push({
135
+ agentId,
136
+ output,
137
+ submittedAt: new Date().toISOString(),
138
+ duration: Date.now() - startTime,
139
+ });
140
+ remaining.delete(agentId);
141
+ // Emit per-agent submission event
142
+ if (this.eventBus) {
143
+ await this.eventBus.emitSimple('race.submitted', [agentId], `${agentId} 已提交赛马结果`, { taskId: task.id, agentId, duration: Date.now() - startTime });
144
+ }
145
+ }
146
+ }
147
+ catch {
148
+ // Read failure is transient (file being written); retry on next poll
149
+ }
150
+ }
151
+ if (remaining.size === 0)
152
+ break;
153
+ // Wait before next poll (but don't exceed timeout)
154
+ const remainingMs = task.timeoutMs - (Date.now() - startTime);
155
+ if (remainingMs <= 0)
156
+ break;
157
+ await sleep(Math.min(this.pollIntervalMs, remainingMs));
158
+ }
159
+ const timedOut = [...remaining];
160
+ const collectedAt = new Date().toISOString();
161
+ // Cleanup files (best effort)
162
+ if (this.cleanup) {
163
+ for (const agentId of task.participants) {
164
+ try {
165
+ await this.io.clearTask(agentId);
166
+ await this.io.clearSubmission(agentId);
167
+ }
168
+ catch {
169
+ // Cleanup is best-effort
170
+ }
171
+ }
172
+ }
173
+ // Emit collection complete event
174
+ if (this.eventBus) {
175
+ await this.eventBus.emitSimple('race.collected', task.participants, `任务「${task.title}」收集完成: ${submissions.length} 份提交, ${timedOut.length} 超时`, { taskId: task.id, submitted: submissions.length, timedOut });
176
+ }
177
+ return {
178
+ taskId: task.id,
179
+ taskTitle: task.title,
180
+ dispatchedAt,
181
+ collectedAt,
182
+ submissions,
183
+ timedOut,
184
+ dispatchFailed: excludeAgents,
185
+ };
186
+ }
187
+ /**
188
+ * Run a complete dispatch-collect cycle: dispatch task, wait for submissions, return results.
189
+ * This is the primary high-level API.
190
+ *
191
+ * Agents that fail to receive the task are excluded from collection
192
+ * and reported in `dispatchFailed`.
193
+ */
194
+ async run(task) {
195
+ if (task.participants.length === 0) {
196
+ return {
197
+ taskId: task.id,
198
+ taskTitle: task.title,
199
+ dispatchedAt: new Date().toISOString(),
200
+ collectedAt: new Date().toISOString(),
201
+ submissions: [],
202
+ timedOut: [],
203
+ dispatchFailed: [],
204
+ };
205
+ }
206
+ const dispatchedAt = new Date().toISOString();
207
+ const failed = await this.dispatch(task);
208
+ return this.collect(task, dispatchedAt, failed);
209
+ }
210
+ }
211
+ // ─── Helpers ────────────────────────────────────
212
+ function sleep(ms) {
213
+ if (ms <= 0)
214
+ return Promise.resolve();
215
+ return new Promise((resolve) => setTimeout(resolve, ms));
216
+ }
217
+ //# sourceMappingURL=task-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-dispatcher.js","sourceRoot":"","sources":["../../src/bridge/task-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Uni Registry — manages multiple universe deployments.
3
+ *
4
+ * Tracks which universes are deployed to OpenClaw, their agents,
5
+ * and provides lifecycle operations (register, update, reset, cleanup).
6
+ *
7
+ * Storage: ~/.openclaw/uni-registry.json
8
+ */
9
+ import type { UniverseConfig, UniverseType } from '../types/index.js';
10
+ import { type SoulGeneratorOptions } from './soul-generator.js';
11
+ export interface UniRegistryEntry {
12
+ /** Universe identifier (from config.name) */
13
+ id: string;
14
+ /** Human-readable name */
15
+ name: string;
16
+ /** Absolute path to the universe.yaml spec file */
17
+ specPath: string;
18
+ /** Organization type */
19
+ type: UniverseType;
20
+ /** Agent IDs belonging to this uni */
21
+ agentIds: string[];
22
+ /** First deployment timestamp */
23
+ deployedAt: string;
24
+ /** Last update timestamp */
25
+ updatedAt: string;
26
+ /** Spec version */
27
+ version: string;
28
+ /** Description */
29
+ description: string;
30
+ }
31
+ export interface UniRegistry {
32
+ version: string;
33
+ unis: UniRegistryEntry[];
34
+ }
35
+ /**
36
+ * Register a universe in the registry.
37
+ * If already registered, updates the existing entry.
38
+ */
39
+ export declare function registerUni(config: UniverseConfig, specPath: string, openclawDir?: string): UniRegistryEntry;
40
+ /**
41
+ * List all registered universes.
42
+ */
43
+ export declare function listUnis(openclawDir?: string): UniRegistryEntry[];
44
+ /**
45
+ * Get a specific universe by ID.
46
+ */
47
+ export declare function getUni(id: string, openclawDir?: string): UniRegistryEntry | null;
48
+ /**
49
+ * Remove a universe from the registry (does NOT delete files).
50
+ */
51
+ export declare function unregisterUni(id: string, openclawDir?: string): boolean;
52
+ /**
53
+ * Fully clean up a universe:
54
+ * 1. Delete all workspace-{agentId}/ directories
55
+ * 2. Delete all agents/{agentId}/ directories
56
+ * 3. Remove agents from openclaw.json
57
+ * 4. Delete the {uni}-permissions.md file
58
+ * 5. Remove from uni-registry.json
59
+ */
60
+ export declare function cleanupUni(id: string, openclawDir?: string): {
61
+ removedWorkspaces: string[];
62
+ removedAgentDirs: string[];
63
+ removedFromConfig: string[];
64
+ };
65
+ /**
66
+ * Update a universe: regenerate SOUL.md files for all agents,
67
+ * handle added/removed agents, update registry.
68
+ */
69
+ export declare function updateUni(id: string, config: UniverseConfig, specPath: string, soulOptions?: SoulGeneratorOptions, openclawDir?: string): {
70
+ added: string[];
71
+ removed: string[];
72
+ updated: string[];
73
+ };
74
+ /**
75
+ * Reset a universe: clear runtime data (sessions, TASK.md, SUBMISSION.md)
76
+ * but preserve SOUL.md and configuration.
77
+ */
78
+ export declare function resetUni(id: string, openclawDir?: string): {
79
+ clearedSessions: string[];
80
+ clearedTasks: string[];
81
+ };
82
+ //# sourceMappingURL=uni-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uni-registry.d.ts","sourceRoot":"","sources":["../../src/bridge/uni-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAoB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAKlF,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAoCD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,gBAAgB,CAkClB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAEjE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAGhF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAOvE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;IAC5D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAsCA;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,oBAAoB,EAClC,WAAW,CAAC,EAAE,MAAM,GACnB;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAoDA;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;IAC1D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAyCA"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Uni Registry — manages multiple universe deployments.
3
+ *
4
+ * Tracks which universes are deployed to OpenClaw, their agents,
5
+ * and provides lifecycle operations (register, update, reset, cleanup).
6
+ *
7
+ * Storage: ~/.openclaw/uni-registry.json
8
+ */
9
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, rmSync, readdirSync, } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { generateAllSouls } from './soul-generator.js';
12
+ // ─── Helpers ──────────────────────────────────────
13
+ function getOpenClawDir(openclawDir) {
14
+ return openclawDir ?? join(process.env.HOME ?? process.env.USERPROFILE ?? '.', '.openclaw');
15
+ }
16
+ function getRegistryPath(openclawDir) {
17
+ return join(getOpenClawDir(openclawDir), 'uni-registry.json');
18
+ }
19
+ function readRegistry(openclawDir) {
20
+ const path = getRegistryPath(openclawDir);
21
+ if (!existsSync(path)) {
22
+ return { version: '1.0.0', unis: [] };
23
+ }
24
+ try {
25
+ return JSON.parse(readFileSync(path, 'utf-8'));
26
+ }
27
+ catch {
28
+ return { version: '1.0.0', unis: [] };
29
+ }
30
+ }
31
+ function writeRegistry(registry, openclawDir) {
32
+ const dir = getOpenClawDir(openclawDir);
33
+ mkdirSync(dir, { recursive: true });
34
+ const path = getRegistryPath(openclawDir);
35
+ writeFileSync(path, JSON.stringify(registry, null, 2) + '\n', 'utf-8');
36
+ }
37
+ // ─── Public API ───────────────────────────────────
38
+ /**
39
+ * Register a universe in the registry.
40
+ * If already registered, updates the existing entry.
41
+ */
42
+ export function registerUni(config, specPath, openclawDir) {
43
+ const registry = readRegistry(openclawDir);
44
+ const now = new Date().toISOString();
45
+ const existing = registry.unis.find(u => u.id === config.name);
46
+ if (existing) {
47
+ // Update existing entry
48
+ existing.name = config.description || config.name;
49
+ existing.specPath = specPath;
50
+ existing.type = config.type;
51
+ existing.agentIds = config.agents.map(a => a.id);
52
+ existing.updatedAt = now;
53
+ existing.version = config.version;
54
+ existing.description = config.description;
55
+ writeRegistry(registry, openclawDir);
56
+ return existing;
57
+ }
58
+ // New entry
59
+ const entry = {
60
+ id: config.name,
61
+ name: config.description || config.name,
62
+ specPath,
63
+ type: config.type,
64
+ agentIds: config.agents.map(a => a.id),
65
+ deployedAt: now,
66
+ updatedAt: now,
67
+ version: config.version,
68
+ description: config.description,
69
+ };
70
+ registry.unis.push(entry);
71
+ writeRegistry(registry, openclawDir);
72
+ return entry;
73
+ }
74
+ /**
75
+ * List all registered universes.
76
+ */
77
+ export function listUnis(openclawDir) {
78
+ return readRegistry(openclawDir).unis;
79
+ }
80
+ /**
81
+ * Get a specific universe by ID.
82
+ */
83
+ export function getUni(id, openclawDir) {
84
+ const registry = readRegistry(openclawDir);
85
+ return registry.unis.find(u => u.id === id) ?? null;
86
+ }
87
+ /**
88
+ * Remove a universe from the registry (does NOT delete files).
89
+ */
90
+ export function unregisterUni(id, openclawDir) {
91
+ const registry = readRegistry(openclawDir);
92
+ const idx = registry.unis.findIndex(u => u.id === id);
93
+ if (idx === -1)
94
+ return false;
95
+ registry.unis.splice(idx, 1);
96
+ writeRegistry(registry, openclawDir);
97
+ return true;
98
+ }
99
+ /**
100
+ * Fully clean up a universe:
101
+ * 1. Delete all workspace-{agentId}/ directories
102
+ * 2. Delete all agents/{agentId}/ directories
103
+ * 3. Remove agents from openclaw.json
104
+ * 4. Delete the {uni}-permissions.md file
105
+ * 5. Remove from uni-registry.json
106
+ */
107
+ export function cleanupUni(id, openclawDir) {
108
+ const dir = getOpenClawDir(openclawDir);
109
+ const entry = getUni(id, openclawDir);
110
+ if (!entry) {
111
+ return { removedWorkspaces: [], removedAgentDirs: [], removedFromConfig: [] };
112
+ }
113
+ const removedWorkspaces = [];
114
+ const removedAgentDirs = [];
115
+ // Delete workspace and agent directories
116
+ for (const agentId of entry.agentIds) {
117
+ const workspacePath = join(dir, `workspace-${agentId}`);
118
+ if (existsSync(workspacePath)) {
119
+ rmSync(workspacePath, { recursive: true, force: true });
120
+ removedWorkspaces.push(workspacePath);
121
+ }
122
+ const agentPath = join(dir, 'agents', agentId);
123
+ if (existsSync(agentPath)) {
124
+ rmSync(agentPath, { recursive: true, force: true });
125
+ removedAgentDirs.push(agentPath);
126
+ }
127
+ }
128
+ // Remove agents from openclaw.json
129
+ const removedFromConfig = removeAgentsFromOpenClawConfig(entry.agentIds, openclawDir);
130
+ // Delete permissions file
131
+ const permPath = join(dir, `${id}-permissions.md`);
132
+ if (existsSync(permPath)) {
133
+ rmSync(permPath, { force: true });
134
+ }
135
+ // Remove from registry
136
+ unregisterUni(id, openclawDir);
137
+ return { removedWorkspaces, removedAgentDirs, removedFromConfig };
138
+ }
139
+ /**
140
+ * Update a universe: regenerate SOUL.md files for all agents,
141
+ * handle added/removed agents, update registry.
142
+ */
143
+ export function updateUni(id, config, specPath, soulOptions, openclawDir) {
144
+ const dir = getOpenClawDir(openclawDir);
145
+ const entry = getUni(id, openclawDir);
146
+ const oldAgentIds = entry ? new Set(entry.agentIds) : new Set();
147
+ const newAgentIds = new Set(config.agents.map(a => a.id));
148
+ const added = [];
149
+ const removed = [];
150
+ const updated = [];
151
+ // Generate new SOUL.md files
152
+ const souls = generateAllSouls(config, soulOptions);
153
+ for (const agent of config.agents) {
154
+ const workspacePath = join(dir, `workspace-${agent.id}`);
155
+ const agentDir = join(dir, 'agents', agent.id, 'agent');
156
+ const sessionsDir = join(dir, 'agents', agent.id, 'sessions');
157
+ mkdirSync(workspacePath, { recursive: true });
158
+ mkdirSync(agentDir, { recursive: true });
159
+ mkdirSync(sessionsDir, { recursive: true });
160
+ const soulContent = souls.get(agent.id) ?? '';
161
+ writeFileSync(join(workspacePath, 'SOUL.md'), soulContent, 'utf-8');
162
+ if (oldAgentIds.has(agent.id)) {
163
+ updated.push(agent.id);
164
+ }
165
+ else {
166
+ added.push(agent.id);
167
+ }
168
+ }
169
+ // Clean up removed agents
170
+ for (const oldId of oldAgentIds) {
171
+ if (!newAgentIds.has(oldId)) {
172
+ const workspacePath = join(dir, `workspace-${oldId}`);
173
+ const agentPath = join(dir, 'agents', oldId);
174
+ if (existsSync(workspacePath))
175
+ rmSync(workspacePath, { recursive: true, force: true });
176
+ if (existsSync(agentPath))
177
+ rmSync(agentPath, { recursive: true, force: true });
178
+ removed.push(oldId);
179
+ }
180
+ }
181
+ // Update openclaw.json (remove old, add new)
182
+ if (removed.length > 0) {
183
+ removeAgentsFromOpenClawConfig(removed, openclawDir);
184
+ }
185
+ // Update registry entry
186
+ registerUni(config, specPath, openclawDir);
187
+ return { added, removed, updated };
188
+ }
189
+ /**
190
+ * Reset a universe: clear runtime data (sessions, TASK.md, SUBMISSION.md)
191
+ * but preserve SOUL.md and configuration.
192
+ */
193
+ export function resetUni(id, openclawDir) {
194
+ const dir = getOpenClawDir(openclawDir);
195
+ const entry = getUni(id, openclawDir);
196
+ if (!entry) {
197
+ return { clearedSessions: [], clearedTasks: [] };
198
+ }
199
+ const clearedSessions = [];
200
+ const clearedTasks = [];
201
+ for (const agentId of entry.agentIds) {
202
+ // Clear sessions
203
+ const sessionsDir = join(dir, 'agents', agentId, 'sessions');
204
+ if (existsSync(sessionsDir)) {
205
+ const files = readdirSync(sessionsDir);
206
+ for (const file of files) {
207
+ rmSync(join(sessionsDir, file), { force: true });
208
+ }
209
+ if (files.length > 0)
210
+ clearedSessions.push(agentId);
211
+ }
212
+ // Clear TASK.md and SUBMISSION.md from workspace
213
+ const workspacePath = join(dir, `workspace-${agentId}`);
214
+ for (const runtimeFile of ['TASK.md', 'SUBMISSION.md']) {
215
+ const filePath = join(workspacePath, runtimeFile);
216
+ if (existsSync(filePath)) {
217
+ rmSync(filePath, { force: true });
218
+ clearedTasks.push(`${agentId}/${runtimeFile}`);
219
+ }
220
+ }
221
+ }
222
+ // Update registry timestamp
223
+ const registry = readRegistry(openclawDir);
224
+ const entryRef = registry.unis.find(u => u.id === id);
225
+ if (entryRef) {
226
+ entryRef.updatedAt = new Date().toISOString();
227
+ writeRegistry(registry, openclawDir);
228
+ }
229
+ return { clearedSessions, clearedTasks };
230
+ }
231
+ // ─── Internal Helpers ─────────────────────────────
232
+ function removeAgentsFromOpenClawConfig(agentIds, openclawDir) {
233
+ const dir = getOpenClawDir(openclawDir);
234
+ const configPath = join(dir, 'openclaw.json');
235
+ if (!existsSync(configPath))
236
+ return [];
237
+ try {
238
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
239
+ const agents = config.agents;
240
+ if (!agents)
241
+ return [];
242
+ const list = (agents.list ?? []);
243
+ const idsToRemove = new Set(agentIds);
244
+ const removed = [];
245
+ agents.list = list.filter(a => {
246
+ const id = a.id;
247
+ if (idsToRemove.has(id)) {
248
+ removed.push(id);
249
+ return false;
250
+ }
251
+ return true;
252
+ });
253
+ config.agents = agents;
254
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
255
+ return removed;
256
+ }
257
+ catch {
258
+ return [];
259
+ }
260
+ }
261
+ //# sourceMappingURL=uni-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uni-registry.js","sourceRoot":"","sources":["../../src/bridge/uni-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Workspace I/O — file-based communication protocol between dispatcher and agents.
3
+ *
4
+ * Design principle: agents communicate through files, not HTTP.
5
+ * This aligns with OpenClaw's file-driven model where each agent has a workspace
6
+ * directory. The dispatcher writes TASK.md, the agent reads it, executes, and
7
+ * writes SUBMISSION.md. Simple, debuggable, zero infrastructure.
8
+ *
9
+ * File protocol:
10
+ * TASK.md — written by dispatcher, read by agent
11
+ * SUBMISSION.md — written by agent, read by dispatcher
12
+ */
13
+ /**
14
+ * Abstract workspace I/O — can be swapped for remote, in-memory, or custom backends.
15
+ */
16
+ export interface WorkspaceIO {
17
+ /** Write a task file to an agent's workspace */
18
+ writeTask(agentId: string, content: string): Promise<void>;
19
+ /** Read the submission from an agent's workspace. Returns null if not yet submitted. */
20
+ readSubmission(agentId: string): Promise<string | null>;
21
+ /** Remove the task file after collection */
22
+ clearTask(agentId: string): Promise<void>;
23
+ /** Remove the submission file after collection */
24
+ clearSubmission(agentId: string): Promise<void>;
25
+ /** Check if a submission exists without reading its content */
26
+ hasSubmission(agentId: string): Promise<boolean>;
27
+ }
28
+ export interface FileWorkspaceIOOptions {
29
+ /** Base directory for OpenClaw workspaces (default: ~/.openclaw) */
30
+ openclawDir?: string;
31
+ /** Workspace directory name pattern (default: workspace-{agentId}) */
32
+ workspacePattern?: string;
33
+ }
34
+ /**
35
+ * Default file-system implementation of WorkspaceIO.
36
+ *
37
+ * Reads and writes to ~/.openclaw/workspace-{agentId}/ by default.
38
+ */
39
+ export declare class FileWorkspaceIO implements WorkspaceIO {
40
+ private readonly baseDir;
41
+ private readonly pattern;
42
+ constructor(options?: FileWorkspaceIOOptions);
43
+ private workspacePath;
44
+ writeTask(agentId: string, content: string): Promise<void>;
45
+ readSubmission(agentId: string): Promise<string | null>;
46
+ clearTask(agentId: string): Promise<void>;
47
+ clearSubmission(agentId: string): Promise<void>;
48
+ hasSubmission(agentId: string): Promise<boolean>;
49
+ }
50
+ /**
51
+ * In-memory WorkspaceIO for unit tests — no file system needed.
52
+ */
53
+ export declare class MemoryWorkspaceIO implements WorkspaceIO {
54
+ readonly tasks: Map<string, string>;
55
+ readonly submissions: Map<string, string>;
56
+ writeTask(agentId: string, content: string): Promise<void>;
57
+ readSubmission(agentId: string): Promise<string | null>;
58
+ clearTask(agentId: string): Promise<void>;
59
+ clearSubmission(agentId: string): Promise<void>;
60
+ hasSubmission(agentId: string): Promise<boolean>;
61
+ /** Test helper: simulate an agent submitting work */
62
+ simulateSubmission(agentId: string, output: string): void;
63
+ }
64
+ //# sourceMappingURL=workspace-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-io.d.ts","sourceRoot":"","sources":["../../src/bridge/workspace-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D,wFAAwF;IACxF,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAExD,4CAA4C;IAC5C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,kDAAkD;IAClD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,+DAA+D;IAC/D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD;AAOD,MAAM,WAAW,sBAAsB;IACrC,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,sBAA2B;IAQhD,OAAO,CAAC,aAAa;IAKf,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUvD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGvD;AAID;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,KAAK,sBAA6B;IAC3C,QAAQ,CAAC,WAAW,sBAA6B;IAE3C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIvD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,qDAAqD;IACrD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAG1D"}