@cleocode/contracts 2026.3.73 → 2026.3.76

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.
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Central WASM SDK for CLEO Core Contracts
3
+ *
4
+ * Provides unified access to all Rust crate WASM modules:
5
+ * - lafs-core: LAFS envelope types and validation
6
+ * - conduit-core: Conduit wire types and CANT metadata
7
+ * - cant-core: CANT grammar parser (via @cleocode/cant)
8
+ *
9
+ * Usage:
10
+ * ```typescript
11
+ * import { initWasm, lafs, conduit } from '@cleocode/contracts/wasm';
12
+ *
13
+ * await initWasm();
14
+ *
15
+ * // LAFS
16
+ * const meta = new lafs.WasmLafsMeta('tasks.list', 'http');
17
+ * const envelope = lafs.WasmLafsEnvelope.createSuccess('{"tasks":[]}', meta);
18
+ *
19
+ * // Conduit
20
+ * const msg = new conduit.WasmConduitMessage('msg-1', 'agent-a', 'Hello', '2026-03-25T00:00:00Z');
21
+ * const cant = new conduit.WasmCantMetadata('actionable', '["@agent"]', '["T123"]', '["#tag"]');
22
+ * ```
23
+ */
24
+ /**
25
+ * Initialize all WASM modules
26
+ * Must be called before using any WASM classes/functions
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * import { initWasm, lafs, conduit } from '@cleocode/contracts/wasm';
31
+ *
32
+ * await initWasm();
33
+ *
34
+ * // Now you can use WASM classes
35
+ * const meta = new lafs.WasmLafsMeta('tasks.list', 'http');
36
+ * ```
37
+ */
38
+ export declare function initWasm(): Promise<void>;
39
+ /**
40
+ * Check if WASM is initialized and ready to use
41
+ *
42
+ * @returns true if WASM modules are loaded and initialized
43
+ */
44
+ export declare function isWasmReady(): boolean;
45
+ /**
46
+ * LAFS Core WASM exports
47
+ *
48
+ * Available after calling initWasm():
49
+ * - WasmLafsTransport - Transport type (Cli, Http, Grpc, Sdk)
50
+ * - WasmLafsMeta - Metadata for LAFS envelopes
51
+ * - WasmLafsEnvelope - The main LAFS response envelope
52
+ * - createTransport() - Helper to create transport from string
53
+ */
54
+ export declare const lafs: {
55
+ /**
56
+ * LAFS Transport enum
57
+ * Use WasmLafsTransport.cli(), .http(), .grpc(), or .sdk()
58
+ */
59
+ readonly WasmLafsTransport: typeof import("./lafs-core/lafs_core.js").WasmLafsTransport;
60
+ /**
61
+ * LAFS Metadata constructor
62
+ * new WasmLafsMeta(operation: string, transport: string)
63
+ */
64
+ readonly WasmLafsMeta: typeof import("./lafs-core/lafs_core.js").WasmLafsMeta;
65
+ /**
66
+ * LAFS Envelope class
67
+ * Use WasmLafsEnvelope.createSuccess() or .createError()
68
+ */
69
+ readonly WasmLafsEnvelope: typeof import("./lafs-core/lafs_core.js").WasmLafsEnvelope;
70
+ /**
71
+ * Helper function to create transport from string
72
+ * @param transport - "cli", "http", "grpc", or "sdk"
73
+ */
74
+ readonly createTransport: typeof import("./lafs-core/lafs_core.js").create_transport;
75
+ };
76
+ /**
77
+ * Conduit Core WASM exports
78
+ *
79
+ * Available after calling initWasm():
80
+ * - WasmConduitMessage - Agent-to-agent messages
81
+ * - WasmConduitState - Connection states (Disconnected, Connecting, Connected, etc.)
82
+ * - WasmCantMetadata - CANT parsing results
83
+ * - parseConduitMessage() - Parse message from JSON
84
+ * - createConduitState() - Create state from string
85
+ */
86
+ export declare const conduit: {
87
+ /**
88
+ * Conduit Message constructor
89
+ * new WasmConduitMessage(id, from, content, timestamp)
90
+ */
91
+ readonly WasmConduitMessage: typeof import("./conduit-core/conduit_core.js").WasmConduitMessage;
92
+ /**
93
+ * Conduit State enum
94
+ * Use WasmConduitState.disconnected(), .connecting(), .connected(), etc.
95
+ */
96
+ readonly WasmConduitState: typeof import("./conduit-core/conduit_core.js").WasmConduitState;
97
+ /**
98
+ * CANT Metadata constructor
99
+ * new WasmCantMetadata(directiveType, addressesJson, taskRefsJson, tagsJson)
100
+ */
101
+ readonly WasmCantMetadata: typeof import("./conduit-core/conduit_core.js").WasmCantMetadata;
102
+ /**
103
+ * Parse a ConduitMessage from JSON string
104
+ * @param json - JSON string
105
+ * @returns WasmConduitMessage or undefined
106
+ */
107
+ readonly parseConduitMessage: typeof import("./conduit-core/conduit_core.js").parse_conduit_message;
108
+ /**
109
+ * Create a ConduitState from string
110
+ * @param state - "disconnected", "connecting", "connected", "reconnecting", "error"
111
+ */
112
+ readonly createConduitState: typeof import("./conduit-core/conduit_core.js").create_conduit_state;
113
+ };
114
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wasm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAcH;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI;IACf;;;OAGG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAMH;;;OAGG;;CAKJ,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO;IAClB;;;OAGG;;IAMH;;;OAGG;;IAMH;;;OAGG;;IAMH;;;;OAIG;;IAMH;;;OAGG;;CAKJ,CAAC"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Central WASM SDK for CLEO Core Contracts
3
+ *
4
+ * Provides unified access to all Rust crate WASM modules:
5
+ * - lafs-core: LAFS envelope types and validation
6
+ * - conduit-core: Conduit wire types and CANT metadata
7
+ * - cant-core: CANT grammar parser (via @cleocode/cant)
8
+ *
9
+ * Usage:
10
+ * ```typescript
11
+ * import { initWasm, lafs, conduit } from '@cleocode/contracts/wasm';
12
+ *
13
+ * await initWasm();
14
+ *
15
+ * // LAFS
16
+ * const meta = new lafs.WasmLafsMeta('tasks.list', 'http');
17
+ * const envelope = lafs.WasmLafsEnvelope.createSuccess('{"tasks":[]}', meta);
18
+ *
19
+ * // Conduit
20
+ * const msg = new conduit.WasmConduitMessage('msg-1', 'agent-a', 'Hello', '2026-03-25T00:00:00Z');
21
+ * const cant = new conduit.WasmCantMetadata('actionable', '["@agent"]', '["T123"]', '["#tag"]');
22
+ * ```
23
+ */
24
+ // WASM module instances
25
+ let lafsModule = null;
26
+ let conduitModule = null;
27
+ let isInitialized = false;
28
+ let isInitializing = false;
29
+ let initPromise = null;
30
+ /**
31
+ * Initialize all WASM modules
32
+ * Must be called before using any WASM classes/functions
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * import { initWasm, lafs, conduit } from '@cleocode/contracts/wasm';
37
+ *
38
+ * await initWasm();
39
+ *
40
+ * // Now you can use WASM classes
41
+ * const meta = new lafs.WasmLafsMeta('tasks.list', 'http');
42
+ * ```
43
+ */
44
+ export async function initWasm() {
45
+ if (isInitialized)
46
+ return;
47
+ if (isInitializing) {
48
+ return initPromise;
49
+ }
50
+ isInitializing = true;
51
+ initPromise = (async () => {
52
+ try {
53
+ // Dynamic imports to avoid loading if not needed
54
+ const [lafs, conduit] = await Promise.all([
55
+ import('./lafs-core/lafs_core.js'),
56
+ import('./conduit-core/conduit_core.js'),
57
+ ]);
58
+ // Initialize modules
59
+ await Promise.all([lafs.default(), conduit.default()]);
60
+ lafsModule = lafs;
61
+ conduitModule = conduit;
62
+ isInitialized = true;
63
+ }
64
+ catch (_error) {
65
+ throw new Error('WASM initialization failed. Ensure WASM files are present.');
66
+ }
67
+ })();
68
+ await initPromise;
69
+ isInitializing = false;
70
+ }
71
+ /**
72
+ * Check if WASM is initialized and ready to use
73
+ *
74
+ * @returns true if WASM modules are loaded and initialized
75
+ */
76
+ export function isWasmReady() {
77
+ return isInitialized;
78
+ }
79
+ /**
80
+ * LAFS Core WASM exports
81
+ *
82
+ * Available after calling initWasm():
83
+ * - WasmLafsTransport - Transport type (Cli, Http, Grpc, Sdk)
84
+ * - WasmLafsMeta - Metadata for LAFS envelopes
85
+ * - WasmLafsEnvelope - The main LAFS response envelope
86
+ * - createTransport() - Helper to create transport from string
87
+ */
88
+ export const lafs = {
89
+ /**
90
+ * LAFS Transport enum
91
+ * Use WasmLafsTransport.cli(), .http(), .grpc(), or .sdk()
92
+ */
93
+ get WasmLafsTransport() {
94
+ if (!lafsModule)
95
+ throw new Error('WASM not initialized. Call initWasm() first.');
96
+ return lafsModule.WasmLafsTransport;
97
+ },
98
+ /**
99
+ * LAFS Metadata constructor
100
+ * new WasmLafsMeta(operation: string, transport: string)
101
+ */
102
+ get WasmLafsMeta() {
103
+ if (!lafsModule)
104
+ throw new Error('WASM not initialized. Call initWasm() first.');
105
+ return lafsModule.WasmLafsMeta;
106
+ },
107
+ /**
108
+ * LAFS Envelope class
109
+ * Use WasmLafsEnvelope.createSuccess() or .createError()
110
+ */
111
+ get WasmLafsEnvelope() {
112
+ if (!lafsModule)
113
+ throw new Error('WASM not initialized. Call initWasm() first.');
114
+ return lafsModule.WasmLafsEnvelope;
115
+ },
116
+ /**
117
+ * Helper function to create transport from string
118
+ * @param transport - "cli", "http", "grpc", or "sdk"
119
+ */
120
+ get createTransport() {
121
+ if (!lafsModule)
122
+ throw new Error('WASM not initialized. Call initWasm() first.');
123
+ return lafsModule.create_transport;
124
+ },
125
+ };
126
+ /**
127
+ * Conduit Core WASM exports
128
+ *
129
+ * Available after calling initWasm():
130
+ * - WasmConduitMessage - Agent-to-agent messages
131
+ * - WasmConduitState - Connection states (Disconnected, Connecting, Connected, etc.)
132
+ * - WasmCantMetadata - CANT parsing results
133
+ * - parseConduitMessage() - Parse message from JSON
134
+ * - createConduitState() - Create state from string
135
+ */
136
+ export const conduit = {
137
+ /**
138
+ * Conduit Message constructor
139
+ * new WasmConduitMessage(id, from, content, timestamp)
140
+ */
141
+ get WasmConduitMessage() {
142
+ if (!conduitModule)
143
+ throw new Error('WASM not initialized. Call initWasm() first.');
144
+ return conduitModule.WasmConduitMessage;
145
+ },
146
+ /**
147
+ * Conduit State enum
148
+ * Use WasmConduitState.disconnected(), .connecting(), .connected(), etc.
149
+ */
150
+ get WasmConduitState() {
151
+ if (!conduitModule)
152
+ throw new Error('WASM not initialized. Call initWasm() first.');
153
+ return conduitModule.WasmConduitState;
154
+ },
155
+ /**
156
+ * CANT Metadata constructor
157
+ * new WasmCantMetadata(directiveType, addressesJson, taskRefsJson, tagsJson)
158
+ */
159
+ get WasmCantMetadata() {
160
+ if (!conduitModule)
161
+ throw new Error('WASM not initialized. Call initWasm() first.');
162
+ return conduitModule.WasmCantMetadata;
163
+ },
164
+ /**
165
+ * Parse a ConduitMessage from JSON string
166
+ * @param json - JSON string
167
+ * @returns WasmConduitMessage or undefined
168
+ */
169
+ get parseConduitMessage() {
170
+ if (!conduitModule)
171
+ throw new Error('WASM not initialized. Call initWasm() first.');
172
+ return conduitModule.parse_conduit_message;
173
+ },
174
+ /**
175
+ * Create a ConduitState from string
176
+ * @param state - "disconnected", "connecting", "connected", "reconnecting", "error"
177
+ */
178
+ get createConduitState() {
179
+ if (!conduitModule)
180
+ throw new Error('WASM not initialized. Call initWasm() first.');
181
+ return conduitModule.create_conduit_state;
182
+ },
183
+ };
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wasm/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/contracts",
3
- "version": "2026.3.73",
3
+ "version": "2026.3.76",
4
4
  "description": "Domain types, interfaces, and contracts for the CLEO ecosystem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Agent Registry — Credential management and lifecycle for registered agents.
3
+ *
4
+ * Provides typed CRUD operations for agent credentials stored in the
5
+ * local project database (`.cleo/tasks.db`). API keys are encrypted at
6
+ * rest using AES-256-GCM with a machine-bound key.
7
+ *
8
+ * @see docs/specs/SIGNALDOCK-UNIFIED-AGENT-REGISTRY.md Section 3
9
+ * @module agent-registry
10
+ */
11
+
12
+ // ============================================================================
13
+ // Transport configuration
14
+ // ============================================================================
15
+
16
+ /** Transport-specific configuration stored per agent credential. */
17
+ export interface TransportConfig {
18
+ /** Polling interval in milliseconds (for HTTP polling transport). */
19
+ pollIntervalMs?: number;
20
+ /** SSE endpoint URL (for Server-Sent Events transport). */
21
+ sseEndpoint?: string;
22
+ /** WebSocket URL (for WebSocket transport). */
23
+ wsUrl?: string;
24
+ /** HTTP polling endpoint path (for HTTP polling transport). */
25
+ pollEndpoint?: string;
26
+ }
27
+
28
+ // ============================================================================
29
+ // Agent credential
30
+ // ============================================================================
31
+
32
+ /** A registered agent's credentials and profile. */
33
+ export interface AgentCredential {
34
+ /** Unique agent identifier (e.g. 'cleo-core', 'forge-ts-opus'). */
35
+ agentId: string;
36
+ /** Human-readable display name. */
37
+ displayName: string;
38
+ /** API key for authentication (`sk_live_*`). Stored encrypted at rest. */
39
+ apiKey: string;
40
+ /** Base URL of the messaging API (default: api.signaldock.io, legacy: api.clawmsgr.com). */
41
+ apiBaseUrl: string;
42
+ /** Agent classification from the registry (e.g. 'code_dev', 'orchestrator'). */
43
+ classification?: string;
44
+ /** Privacy tier controlling discoverability. */
45
+ privacyTier: 'public' | 'discoverable' | 'private';
46
+ /** Agent capabilities (e.g. ['chat', 'tools', 'code-execution']). */
47
+ capabilities: string[];
48
+ /** Agent skills (e.g. ['coding', 'review', 'testing']). */
49
+ skills: string[];
50
+ /** Transport-specific configuration. */
51
+ transportConfig: TransportConfig;
52
+ /** Whether this agent is currently active. */
53
+ isActive: boolean;
54
+ /** ISO 8601 timestamp of last use (polling, sending, etc.). */
55
+ lastUsedAt?: string;
56
+ /** ISO 8601 creation timestamp. */
57
+ createdAt: string;
58
+ /** ISO 8601 last update timestamp. */
59
+ updatedAt: string;
60
+ }
61
+
62
+ // ============================================================================
63
+ // Registry API
64
+ // ============================================================================
65
+
66
+ /** Filter options for listing agent credentials. */
67
+ export interface AgentListFilter {
68
+ /** Filter by active/inactive status. */
69
+ active?: boolean;
70
+ }
71
+
72
+ /** CRUD and lifecycle operations for agent credentials. */
73
+ export interface AgentRegistryAPI {
74
+ /** Register a new agent credential. */
75
+ register(credential: Omit<AgentCredential, 'createdAt' | 'updatedAt'>): Promise<AgentCredential>;
76
+
77
+ /** Get a single agent credential by ID. Returns null if not found. */
78
+ get(agentId: string): Promise<AgentCredential | null>;
79
+
80
+ /** List agent credentials with optional filtering. */
81
+ list(filter?: AgentListFilter): Promise<AgentCredential[]>;
82
+
83
+ /** Update fields on an existing agent credential. */
84
+ update(
85
+ agentId: string,
86
+ updates: Partial<Omit<AgentCredential, 'agentId' | 'createdAt'>>,
87
+ ): Promise<AgentCredential>;
88
+
89
+ /** Remove an agent credential permanently. */
90
+ remove(agentId: string): Promise<void>;
91
+
92
+ /** Rotate an agent's API key (generates new key on cloud, re-encrypts locally). */
93
+ rotateKey(agentId: string): Promise<{ agentId: string; newApiKey: string }>;
94
+
95
+ /** Get the most recently used active agent credential. Returns null if none. */
96
+ getActive(): Promise<AgentCredential | null>;
97
+
98
+ /** Mark an agent as recently used (updates `lastUsedAt`). */
99
+ markUsed(agentId: string): Promise<void>;
100
+ }
package/src/conduit.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Conduit Protocol — Agent-to-agent communication interface.
3
3
  *
4
- * SignalDock implements this interface. CleoOS consumes it.
4
+ * This is a CLIENT-SIDE interface. Implementations call a messaging
5
+ * backend (SignalDock REST API, local napi-rs, etc.). SignalDock is
6
+ * the canonical backend; it does NOT implement this TypeScript interface.
7
+ *
5
8
  * CLEO Core defines the contract in @cleocode/contracts.
6
9
  *
7
10
  * This is the canonical TypeScript interface for the Conduit Protocol
@@ -81,16 +84,20 @@ export interface ConduitStateChange {
81
84
  // ============================================================================
82
85
 
83
86
  /**
84
- * The Conduit Protocol interface.
87
+ * The Conduit Protocol interface — high-level agent messaging.
88
+ *
89
+ * Conduit wraps a Transport adapter, adding messaging semantics.
85
90
  *
86
91
  * Implementations:
87
- * - ClawMsgrPollingService (CleoOS Electron main process polls cloud API)
88
- * - LocalSignalDock (napi-rs binding — WebSocket to local SignalDock runtime)
89
- * - ClawMsgrWorker (CLI polling script clawmsgr-worker.py wrapper)
92
+ * - `ConduitClient` (`@cleocode/core`wraps any Transport)
93
+ * - `HttpTransport` (HTTP polling to cloud SignalDock API)
94
+ * - `LocalTransport` (napi-rs in-processembedded SignalDock, future)
95
+ * - `SseTransport` (Server-Sent Events — real-time cloud, future)
90
96
  *
91
97
  * Consumers:
92
- * - CleoOS tRPC routers (wire into orchestration, session management)
93
- * - @cleocode/core facade (sessions.serialize/restore, orchestration commands)
98
+ * - `@cleocode/cleo` CLI (`cleo agent watch/poll/send`)
99
+ * - `@cleocode/runtime` (background polling, SSE connections)
100
+ * - CleoOS Electron (embedded SignalDock via LocalTransport)
94
101
  * - Agent spawners (deliver task assignments, collect results)
95
102
  */
96
103
  export interface Conduit {
@@ -17,6 +17,26 @@ import type { ArchivedTask } from './archive.js';
17
17
  import type { Session } from './session.js';
18
18
  import type { Task, TaskPriority, TaskSize, TaskStatus, TaskType } from './task.js';
19
19
 
20
+ /**
21
+ * Agent instance row shape for DataAccessor methods.
22
+ * Mirrors the agent_instances Drizzle table in core but avoids Drizzle dependency.
23
+ */
24
+ export interface DataAccessorAgentInstance {
25
+ id: string;
26
+ agentType: string;
27
+ status: string;
28
+ sessionId: string | null;
29
+ taskId: string | null;
30
+ startedAt: string;
31
+ lastHeartbeat: string;
32
+ stoppedAt: string | null;
33
+ errorCount: number;
34
+ totalTasksCompleted: number;
35
+ capacity: string;
36
+ metadataJson: string | null;
37
+ parentAgentId: string | null;
38
+ }
39
+
20
40
  /** Archive-specific fields for task upsert. */
21
41
  export interface ArchiveFields {
22
42
  archivedAt?: string;
@@ -83,6 +103,7 @@ export interface TaskFieldUpdates {
83
103
  modifiedBy?: string | null;
84
104
  sessionId?: string | null;
85
105
  updatedAt?: string | null;
106
+ assignee?: string | null;
86
107
  }
87
108
 
88
109
  /**
@@ -227,6 +248,41 @@ export interface DataAccessor {
227
248
 
228
249
  /** Remove a single session by ID. */
229
250
  removeSingleSession(sessionId: string): Promise<void>;
251
+
252
+ // ---- Agent instances ----
253
+
254
+ /** List agent instances with optional filters. Returns rows from agent_instances table. */
255
+ listAgentInstances(filters?: {
256
+ status?: string | string[];
257
+ agentType?: string | string[];
258
+ }): Promise<DataAccessorAgentInstance[]>;
259
+
260
+ /** Get a single agent instance by ID. Returns null if not found. */
261
+ getAgentInstance(agentId: string): Promise<DataAccessorAgentInstance | null>;
262
+
263
+ // ---- Agent task claiming ----
264
+
265
+ /**
266
+ * Atomically claim a task for an agent.
267
+ *
268
+ * Uses `UPDATE ... WHERE assignee IS NULL OR assignee = agentId` to prevent
269
+ * race conditions. Throws if the task is already claimed by a different agent.
270
+ *
271
+ * @param taskId - ID of the task to claim.
272
+ * @param agentId - Agent identifier claiming the task.
273
+ * @throws {Error} When the task is not found or is already claimed by another agent.
274
+ */
275
+ claimTask(taskId: string, agentId: string): Promise<void>;
276
+
277
+ /**
278
+ * Release a claimed task, clearing its assignee.
279
+ *
280
+ * No-op if the task is not currently claimed.
281
+ *
282
+ * @param taskId - ID of the task to unclaim.
283
+ * @throws {Error} When the task is not found.
284
+ */
285
+ unclaimTask(taskId: string): Promise<void>;
230
286
  }
231
287
 
232
288
  // Factory functions (createDataAccessor, getAccessor) live in @cleocode/core,
package/src/facade.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  * @module facade
10
10
  */
11
11
 
12
+ import type { ConduitMessage } from './conduit.js';
12
13
  import type {
13
14
  DataAccessor,
14
15
  ExternalTask,
@@ -519,6 +520,12 @@ export interface NexusAPI {
519
520
  setPermission(params: { name: string; level: 'read' | 'write' | 'execute' }): Promise<unknown>;
520
521
  /** Get sharing status. */
521
522
  sharingStatus(): Promise<unknown>;
523
+ /** Route a Conduit directive message to the correct project (ORCH-PLAN B.2). */
524
+ route(message: ConduitMessage): Promise<unknown>;
525
+ /** Get aggregated task status across all registered projects (ORCH-PLAN B.3). */
526
+ workspaceStatus(): Promise<unknown>;
527
+ /** Get all agents registered across all projects (ORCH-PLAN B.4). */
528
+ workspaceAgents(): Promise<unknown>;
522
529
  }
523
530
 
524
531
  /** Task reconciliation / sync domain API. */
package/src/index.ts CHANGED
@@ -8,6 +8,13 @@
8
8
 
9
9
  // === Provider Adapter Contracts ===
10
10
  export type { AdapterHealthStatus, CLEOProviderAdapter } from './adapter.js';
11
+ // === Agent Registry (credential management) ===
12
+ export type {
13
+ AgentCredential,
14
+ AgentListFilter,
15
+ AgentRegistryAPI,
16
+ TransportConfig,
17
+ } from './agent-registry.js';
11
18
  // === Archive Types ===
12
19
  export type {
13
20
  ArchiveCycleTimesReport,
@@ -76,6 +83,7 @@ export type {
76
83
  ArchiveFields,
77
84
  ArchiveFile,
78
85
  DataAccessor,
86
+ DataAccessorAgentInstance,
79
87
  QueryTasksResult,
80
88
  TaskFieldUpdates,
81
89
  TaskQueryFilters,
@@ -313,7 +321,12 @@ export type {
313
321
  TesseraTemplate,
314
322
  TesseraVariable,
315
323
  } from './tessera.js';
316
- export type { AdapterTransportProvider } from './transport.js';
324
+ // === Transport (low-level wire protocol) ===
325
+ export type {
326
+ AdapterTransportProvider,
327
+ Transport,
328
+ TransportConnectConfig,
329
+ } from './transport.js';
317
330
  // === WarpChain Types ===
318
331
  export type {
319
332
  ChainShape,
@@ -329,3 +342,6 @@ export type {
329
342
  WarpLink,
330
343
  WarpStage,
331
344
  } from './warp-chain.js';
345
+
346
+ // === WASM SDK (Rust crate bindings) ===
347
+ export * as wasm from './wasm/index.js';
package/src/lafs.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * LAFS (LLM-Agent-First Schema) unified envelope types.
3
3
  *
4
4
  * Defines canonical LAFS types inline (contracts has ZERO external dependencies).
5
- * In the main CLEO codebase these are re-exported from @cleocode/lafs-protocol;
5
+ * In the main CLEO codebase these are re-exported from @cleocode/lafs;
6
6
  * here they are defined as plain interfaces for maximum portability.
7
7
  *
8
8
  * @epic T4654
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  // ---------------------------------------------------------------------------
13
- // Canonical LAFS types (inlined from @cleocode/lafs-protocol)
13
+ // Canonical LAFS types (inlined from @cleocode/lafs)
14
14
  // ---------------------------------------------------------------------------
15
15
 
16
16
  /** LAFS error category. */
package/src/task.ts CHANGED
@@ -214,6 +214,9 @@ export interface Task {
214
214
  * @task T060
215
215
  */
216
216
  pipelineStage?: string | null;
217
+
218
+ /** Agent ID that has claimed/is assigned to this task. Null when unclaimed. */
219
+ assignee?: string | null;
217
220
  }
218
221
 
219
222
  // ---------------------------------------------------------------------------