@cleocode/contracts 2026.4.141 → 2026.4.143

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.
@@ -1,8 +1,16 @@
1
1
  /**
2
- * Conduit Domain Operations (5 operations)
2
+ * Conduit Domain Operations (8 operations: 3 query, 5 mutate)
3
3
  *
4
- * Query operations: 2
5
- * Mutate operations: 3
4
+ * Query operations: 3
5
+ * - conduit.status — connection status + unread count
6
+ * - conduit.peek — one-shot poll for messages
7
+ * - conduit.listen — one-shot poll for topic messages (A2A, T1252)
8
+ * Mutate operations: 5
9
+ * - conduit.start — start continuous polling
10
+ * - conduit.stop — stop polling
11
+ * - conduit.send — send a message
12
+ * - conduit.subscribe — subscribe agent to a topic (A2A, T1252)
13
+ * - conduit.publish — publish message to a topic (A2A, T1252)
6
14
  *
7
15
  * CONDUIT is the agent-to-agent messaging subsystem. The protocol wraps a
8
16
  * pluggable Transport (HTTP to cloud SignalDock, LocalTransport over
@@ -16,12 +24,14 @@
16
24
  *
17
25
  * Registry note (T964 — supersedes ADR-042 Decision 1): the dispatcher
18
26
  * registers these operations under `domain: 'conduit'` with short operation
19
- * names (`status`, `peek`, `start`, `stop`, `send`). The public/HTTP identifier
20
- * `conduit.<op>` remains the stable wire-format surface and what these
21
- * contracts describe; CLI and HTTP adapters map between the two forms.
27
+ * names (`status`, `peek`, `start`, `stop`, `send`, `subscribe`, `publish`,
28
+ * `listen`). The public/HTTP identifier `conduit.<op>` remains the stable
29
+ * wire-format surface and what these contracts describe; CLI and HTTP adapters
30
+ * map between the two forms.
22
31
  *
23
32
  * @task T910 — Orchestration Coherence v4 (contract surface completion)
24
33
  * @task T964 — CONDUIT promotion to canonical domain #15
34
+ * @task T1422 — Typed-dispatch migration (Wave D, T975 follow-on)
25
35
  * @see packages/cleo/src/dispatch/domains/conduit.ts
26
36
  * @see packages/contracts/src/conduit.ts
27
37
  */
@@ -297,3 +307,29 @@ export interface ConduitListenResult {
297
307
  /** Duration of the listen call in milliseconds. */
298
308
  listenedForMs: number;
299
309
  }
310
+
311
+ // ============================================================================
312
+ // Typed Operation Record (T1422 — Wave D typed-dispatch)
313
+ // ============================================================================
314
+
315
+ /**
316
+ * Typed operation record for the conduit domain.
317
+ *
318
+ * Each key is an operation name, and each value is a tuple of
319
+ * `[Params, Result]` types. Used by the typed dispatch adapter
320
+ * (`packages/cleo/src/dispatch/adapters/typed.ts`) to provide
321
+ * compile-time narrowing on all conduit handler params.
322
+ *
323
+ * @task T1422 — Typed-dispatch migration (T975 follow-on)
324
+ * @see packages/cleo/src/dispatch/domains/conduit.ts (ConduitHandler)
325
+ */
326
+ export type ConduitOps = {
327
+ status: [ConduitStatusParams, ConduitStatusResult];
328
+ peek: [ConduitPeekParams, ConduitPeekResult];
329
+ listen: [ConduitListenParams, ConduitListenResult];
330
+ start: [ConduitStartParams, ConduitStartResult];
331
+ stop: [ConduitStopParams, ConduitStopResult];
332
+ send: [ConduitSendParams, ConduitSendResult];
333
+ subscribe: [ConduitSubscribeParams, ConduitSubscribeResult];
334
+ publish: [ConduitPublishParams, ConduitPublishResult];
335
+ };
@@ -17,6 +17,7 @@ export * from './orchestrate.js';
17
17
  export * from './params.js';
18
18
  export * from './release.js';
19
19
  export * from './research.js';
20
+ export * from './sentient.js';
20
21
  export * from './session.js';
21
22
  export * from './skills.js';
22
23
  export * from './system.js';
@@ -19,7 +19,23 @@
19
19
  * @see packages/cleo/src/dispatch/domains/nexus.ts
20
20
  */
21
21
 
22
- import type { LAFSPage } from '../lafs.js';
22
+ // Profile types are now canonical in nexus-user-profile.ts (T1424 dedup)
23
+ import type {
24
+ NexusProfileExportParams,
25
+ NexusProfileExportResult,
26
+ NexusProfileGetParams,
27
+ NexusProfileGetResult,
28
+ NexusProfileImportParams,
29
+ NexusProfileImportResult,
30
+ NexusProfileReinforceParams,
31
+ NexusProfileReinforceResult,
32
+ NexusProfileSupersedeParams,
33
+ NexusProfileSupersedeResult,
34
+ NexusProfileUpsertParams,
35
+ NexusProfileUpsertResult,
36
+ NexusProfileViewParams,
37
+ NexusProfileViewResult,
38
+ } from './nexus-user-profile.js';
23
39
 
24
40
  // ============================================================================
25
41
  // Shared Nexus wire-format types
@@ -272,8 +288,6 @@ export interface NexusListResult {
272
288
  total: number;
273
289
  /** Filtered count (post-limit). */
274
290
  filtered: number;
275
- /** Pagination descriptor. */
276
- page: LAFSPage;
277
291
  }
278
292
 
279
293
  // --------------------------------------------------------------------------
@@ -416,8 +430,6 @@ export interface NexusOrphansListResult {
416
430
  total: number;
417
431
  /** Filtered count. */
418
432
  filtered: number;
419
- /** Pagination descriptor. */
420
- page: LAFSPage;
421
433
  }
422
434
 
423
435
  // --------------------------------------------------------------------------
@@ -709,3 +721,287 @@ export interface NexusTransferResult {
709
721
  /** Manifest describing what was moved. */
710
722
  manifest: NexusTransferManifest;
711
723
  }
724
+
725
+ // ============================================================================
726
+ // Additional operations (T1424 — typed narrowing stub types)
727
+ // ============================================================================
728
+
729
+ /** Parameters for `nexus.augment`. */
730
+ export interface NexusAugmentParams {
731
+ /** Search pattern (required). */
732
+ pattern: string;
733
+ /** Max results (default 5). */
734
+ limit?: number;
735
+ }
736
+ /** Result of `nexus.augment`. */
737
+ export type NexusAugmentResult = unknown;
738
+
739
+ /** Parameters for `nexus.top-entries`. */
740
+ export interface NexusTopEntriesParams {
741
+ /** Max results (default 20). */
742
+ limit?: number;
743
+ /** Optional kind filter (nexus.db sources). */
744
+ kind?: string;
745
+ /** Optional nodeType filter (brain.db page_nodes). */
746
+ nodeType?: string;
747
+ }
748
+ /** Entry from brain.db. */
749
+ export interface BrainPageNodeEntry {
750
+ id: string;
751
+ node_type: string;
752
+ label: string;
753
+ quality_score: number;
754
+ last_activity_at: string;
755
+ metadata_json: string | null;
756
+ }
757
+ /** Entry from nexus.db. */
758
+ export interface NexusTopEntry {
759
+ nodeId: string;
760
+ label: string;
761
+ kind: string;
762
+ filePath: string | null;
763
+ totalWeight: number;
764
+ edgeCount: number;
765
+ }
766
+ /** Result of `nexus.top-entries`. */
767
+ export interface NexusTopEntriesResult {
768
+ entries: BrainPageNodeEntry[] | NexusTopEntry[];
769
+ count: number;
770
+ limit: number;
771
+ kind?: string | null;
772
+ nodeType?: string | null;
773
+ note?: string;
774
+ }
775
+
776
+ /** Parameters for `nexus.impact`. */
777
+ export interface NexusImpactParams {
778
+ /** Symbol name (required). */
779
+ symbol: string;
780
+ /** Project ID (optional, defaults to current). */
781
+ projectId?: string;
782
+ /** Include "why" reasons (optional). */
783
+ why?: boolean;
784
+ }
785
+ /** Affected symbol in impact result. */
786
+ export interface NexusImpactAffectedNode {
787
+ nodeId: string;
788
+ label: string;
789
+ kind: string;
790
+ reasons: string[];
791
+ }
792
+ /** Result of `nexus.impact`. */
793
+ export interface NexusImpactResult {
794
+ targetNodeId: string | null;
795
+ why: boolean;
796
+ riskLevel: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
797
+ affected: NexusImpactAffectedNode[];
798
+ }
799
+
800
+ /** Parameters for `nexus.full-context`. */
801
+ export interface NexusFullContextParams {
802
+ /** Symbol name (required). */
803
+ symbol: string;
804
+ }
805
+ /** Result of `nexus.full-context`. */
806
+ export type NexusFullContextResult = unknown;
807
+
808
+ /** Parameters for `nexus.task-footprint`. */
809
+ export interface NexusTaskFootprintParams {
810
+ /** Task ID (required). */
811
+ taskId: string;
812
+ }
813
+ /** Result of `nexus.task-footprint`. */
814
+ export type NexusTaskFootprintResult = unknown;
815
+
816
+ /** Parameters for `nexus.brain-anchors`. */
817
+ export interface NexusBrainAnchorsParams {
818
+ /** Entry ID (required). */
819
+ entryId: string;
820
+ }
821
+ /** Result of `nexus.brain-anchors`. */
822
+ export type NexusBrainAnchorsResult = unknown;
823
+
824
+ /** Parameters for `nexus.why`. */
825
+ export interface NexusWhyParams {
826
+ /** Symbol name (required). */
827
+ symbol: string;
828
+ }
829
+ /** Result of `nexus.why`. */
830
+ export type NexusWhyResult = unknown;
831
+
832
+ /** Parameters for `nexus.impact-full`. */
833
+ export interface NexusImpactFullParams {
834
+ /** Symbol name (required). */
835
+ symbol: string;
836
+ }
837
+ /** Result of `nexus.impact-full`. */
838
+ export type NexusImpactFullResult = unknown;
839
+
840
+ /** Parameters for `nexus.route-map`. */
841
+ export interface NexusRouteMapParams {
842
+ /** Project ID (optional, auto-generated from projectRoot). */
843
+ projectId?: string;
844
+ }
845
+ /** Result of `nexus.route-map`. */
846
+ export type NexusRouteMapResult = unknown;
847
+
848
+ /** Parameters for `nexus.shape-check`. */
849
+ export interface NexusShapeCheckParams {
850
+ /** Route symbol (required). */
851
+ routeSymbol: string;
852
+ /** Project ID (optional, auto-generated from projectRoot). */
853
+ projectId?: string;
854
+ }
855
+ /** Result of `nexus.shape-check`. */
856
+ export type NexusShapeCheckResult = unknown;
857
+
858
+ /** Parameters for `nexus.search-code`. */
859
+ export interface NexusSearchCodeParams {
860
+ /** Search pattern (required). */
861
+ pattern: string;
862
+ /** Max results (default 10). */
863
+ limit?: number;
864
+ }
865
+ /** Result of `nexus.search-code`. */
866
+ export type NexusSearchCodeResult = unknown;
867
+
868
+ /** Parameters for `nexus.wiki`. */
869
+ export interface NexusWikiParams {
870
+ /** Output directory (optional). */
871
+ outputDir?: string;
872
+ /** Community filter (optional). */
873
+ communityFilter?: string;
874
+ /** Incremental mode (optional). */
875
+ incremental?: boolean;
876
+ }
877
+ /** Result of `nexus.wiki`. */
878
+ export type NexusWikiResult = unknown;
879
+
880
+ /** Parameters for `nexus.contracts-show`. */
881
+ export interface NexusContractsShowParams {
882
+ /** Project A identifier (required). */
883
+ projectA: string;
884
+ /** Project B identifier (required). */
885
+ projectB: string;
886
+ }
887
+ /** Result of `nexus.contracts-show`. */
888
+ export type NexusContractsShowResult = unknown;
889
+
890
+ /** Parameters for `nexus.task-symbols`. */
891
+ export interface NexusTaskSymbolsParams {
892
+ /** Task ID (required). */
893
+ taskId: string;
894
+ }
895
+ /** Result of `nexus.task-symbols`. */
896
+ export type NexusTaskSymbolsResult = unknown;
897
+
898
+ /** Parameters for `nexus.sigil.list`. */
899
+ export interface NexusSigilListParams {
900
+ /** Role filter (optional). */
901
+ role?: string;
902
+ }
903
+ /** Result of `nexus.sigil.list`. */
904
+ export type NexusSigilListResult = unknown;
905
+
906
+ /** Parameters for `nexus.sigil.sync` — none. */
907
+ export type NexusSigilSyncParams = Record<string, never>;
908
+ /** Result of `nexus.sigil.sync`. */
909
+ export type NexusSigilSyncResult = unknown;
910
+
911
+ /** Parameters for `nexus.conduit-scan`. */
912
+ export type NexusConduitScanParams = Record<string, never>;
913
+ /** Result of `nexus.conduit-scan`. */
914
+ export type NexusConduitScanResult = unknown;
915
+
916
+ /** Parameters for `nexus.contracts-sync`. */
917
+ export interface NexusContractsSyncParams {
918
+ /** Repository path (optional). */
919
+ repoPath?: string;
920
+ /** Project ID (optional). */
921
+ projectId?: string;
922
+ }
923
+ /** Result of `nexus.contracts-sync`. */
924
+ export type NexusContractsSyncResult = unknown;
925
+
926
+ /** Parameters for `nexus.contracts-link-tasks`. */
927
+ export interface NexusContractsLinkTasksParams {
928
+ /** Repository path (optional). */
929
+ repoPath?: string;
930
+ /** Project ID (optional). */
931
+ projectId?: string;
932
+ }
933
+ /** Result of `nexus.contracts-link-tasks`. */
934
+ export type NexusContractsLinkTasksResult = unknown;
935
+
936
+ // ============================================================================
937
+ // Typed Operations Union (T1424 — Wave D typed-dispatch migration)
938
+ // ============================================================================
939
+
940
+ /**
941
+ * All Nexus domain operations mapped to their [Params, Result] tuples.
942
+ *
943
+ * This type enables {@link TypedDomainHandler} to provide compile-time safety
944
+ * for every nexus operation, eliminating the ~76 type casts in the legacy
945
+ * handler pattern (T988 audit follow-on).
946
+ *
947
+ * @task T1424 — Nexus domain typed narrowing
948
+ */
949
+ export type NexusOps = {
950
+ readonly status: readonly [NexusStatusParams, NexusStatusResult];
951
+ readonly list: readonly [NexusListParams, NexusListResult];
952
+ readonly show: readonly [NexusShowParams, NexusShowResult];
953
+ readonly resolve: readonly [NexusResolveParams, NexusResolveResult];
954
+ readonly deps: readonly [NexusDepsParams, NexusDepsResult];
955
+ readonly graph: readonly [NexusGraphParams, NexusGraphResult];
956
+ readonly 'path.show': readonly [NexusPathShowParams, NexusPathShowResult];
957
+ readonly 'blockers.show': readonly [NexusBlockersShowParams, NexusBlockersShowResult];
958
+ readonly 'orphans.list': readonly [NexusOrphansListParams, NexusOrphansListResult];
959
+ readonly discover: readonly [NexusDiscoverParams, NexusDiscoverResult];
960
+ readonly search: readonly [NexusSearchParams, NexusSearchResult];
961
+ readonly augment: readonly [NexusAugmentParams, NexusAugmentResult];
962
+ readonly 'share.status': readonly [NexusShareStatusParams, NexusShareStatusResult];
963
+ readonly 'transfer.preview': readonly [NexusTransferPreviewParams, NexusTransferPreviewResult];
964
+ readonly 'top-entries': readonly [NexusTopEntriesParams, NexusTopEntriesResult];
965
+ readonly impact: readonly [NexusImpactParams, NexusImpactResult];
966
+ readonly 'full-context': readonly [NexusFullContextParams, NexusFullContextResult];
967
+ readonly 'task-footprint': readonly [NexusTaskFootprintParams, NexusTaskFootprintResult];
968
+ readonly 'brain-anchors': readonly [NexusBrainAnchorsParams, NexusBrainAnchorsResult];
969
+ readonly why: readonly [NexusWhyParams, NexusWhyResult];
970
+ readonly 'impact-full': readonly [NexusImpactFullParams, NexusImpactFullResult];
971
+ readonly 'route-map': readonly [NexusRouteMapParams, NexusRouteMapResult];
972
+ readonly 'shape-check': readonly [NexusShapeCheckParams, NexusShapeCheckResult];
973
+ readonly 'search-code': readonly [NexusSearchCodeParams, NexusSearchCodeResult];
974
+ readonly wiki: readonly [NexusWikiParams, NexusWikiResult];
975
+ readonly 'contracts-show': readonly [NexusContractsShowParams, NexusContractsShowResult];
976
+ readonly 'task-symbols': readonly [NexusTaskSymbolsParams, NexusTaskSymbolsResult];
977
+ readonly 'profile.view': readonly [NexusProfileViewParams, NexusProfileViewResult];
978
+ readonly 'profile.get': readonly [NexusProfileGetParams, NexusProfileGetResult];
979
+ readonly 'profile.import': readonly [NexusProfileImportParams, NexusProfileImportResult];
980
+ readonly 'profile.export': readonly [NexusProfileExportParams, NexusProfileExportResult];
981
+ readonly 'profile.reinforce': readonly [NexusProfileReinforceParams, NexusProfileReinforceResult];
982
+ readonly 'profile.upsert': readonly [NexusProfileUpsertParams, NexusProfileUpsertResult];
983
+ readonly 'profile.supersede': readonly [NexusProfileSupersedeParams, NexusProfileSupersedeResult];
984
+ readonly 'sigil.list': readonly [NexusSigilListParams, NexusSigilListResult];
985
+ readonly 'sigil.sync': readonly [NexusSigilSyncParams, NexusSigilSyncResult];
986
+ readonly init: readonly [NexusInitParams, NexusInitResult];
987
+ readonly register: readonly [NexusRegisterParams, NexusRegisterResult];
988
+ readonly unregister: readonly [NexusUnregisterParams, NexusUnregisterResult];
989
+ readonly sync: readonly [NexusSyncParams, NexusSyncResult];
990
+ readonly 'permission.set': readonly [NexusPermissionSetParams, NexusPermissionSetResult];
991
+ readonly reconcile: readonly [NexusReconcileParams, NexusReconcileResult];
992
+ readonly 'share.snapshot.export': readonly [
993
+ NexusShareSnapshotExportParams,
994
+ NexusShareSnapshotExportResult,
995
+ ];
996
+ readonly 'share.snapshot.import': readonly [
997
+ NexusShareSnapshotImportParams,
998
+ NexusShareSnapshotImportResult,
999
+ ];
1000
+ readonly transfer: readonly [NexusTransferParams, NexusTransferResult];
1001
+ readonly 'contracts-sync': readonly [NexusContractsSyncParams, NexusContractsSyncResult];
1002
+ readonly 'contracts-link-tasks': readonly [
1003
+ NexusContractsLinkTasksParams,
1004
+ NexusContractsLinkTasksResult,
1005
+ ];
1006
+ readonly 'conduit-scan': readonly [NexusConduitScanParams, NexusConduitScanResult];
1007
+ };
@@ -182,3 +182,90 @@ export interface ReleaseRollbackResult {
182
182
  /** Rollback reason. @task T963 */
183
183
  reason: string;
184
184
  }
185
+
186
+ // ── RELEASE-03: IVTR gate check ──────────────────────────────────────────────
187
+
188
+ /**
189
+ * Parameters for `release.gate` — checks all IVTR loops in a release epic
190
+ * have reached the `released` phase before allowing `release.ship`.
191
+ *
192
+ * @task T820 RELEASE-03
193
+ * @task T1416
194
+ */
195
+ export interface ReleaseGateCheckParams {
196
+ /** Epic ID whose child tasks should be inspected. */
197
+ epicId: string;
198
+ /**
199
+ * Bypass the IVTR gate — requires explicit owner confirmation.
200
+ * When true, the gate check is skipped and a loud warning is emitted.
201
+ */
202
+ force?: boolean;
203
+ }
204
+
205
+ /** A single task's IVTR phase status as reported by `release.gate`. */
206
+ export interface IvtrTaskStatus {
207
+ /** Task ID. */
208
+ taskId: string;
209
+ /**
210
+ * Current IVTR phase, or `null` when no IVTR loop has been started for
211
+ * this task (task is "unchecked").
212
+ */
213
+ currentPhase: 'implement' | 'validate' | 'test' | 'released' | null;
214
+ /** Whether the task blocks release (`true` = blocking). */
215
+ blocking: boolean;
216
+ }
217
+
218
+ /**
219
+ * Result of `release.gate`.
220
+ *
221
+ * @task T820 RELEASE-03
222
+ * @task T1416
223
+ */
224
+ export interface ReleaseGateCheckResult {
225
+ /** Epic ID that was inspected. */
226
+ epicId: string;
227
+ /** Whether the gate passed — all tasks are released or unchecked. */
228
+ passed: boolean;
229
+ /** Whether the gate was bypassed via `--force`. */
230
+ forcedBypass: boolean;
231
+ /** Task IDs whose IVTR state is not `released` (blocking). */
232
+ blocked: string[];
233
+ /**
234
+ * Task IDs with no IVTR state (non-blocking; docs / chore tasks often
235
+ * have no IVTR loop).
236
+ */
237
+ unchecked: string[];
238
+ /** Full per-task status breakdown. */
239
+ tasks: IvtrTaskStatus[];
240
+ /**
241
+ * Human-readable summary suitable for CLI output and operator review.
242
+ * Present on both pass and fail.
243
+ */
244
+ summary: string;
245
+ }
246
+
247
+ // ── RELEASE-07: IVTR → release auto-suggest ──────────────────────────────────
248
+
249
+ /**
250
+ * Result emitted by `release.ivtr-suggest` — the hint produced when an IVTR
251
+ * loop transitions to `released` and all tasks in the parent epic are now
252
+ * in the `released` phase.
253
+ *
254
+ * @task T820 RELEASE-07
255
+ * @task T1416
256
+ */
257
+ export interface IvtrAutoSuggestResult {
258
+ /** Task ID that just reached the `released` phase. */
259
+ taskId: string;
260
+ /** Parent epic ID, if the task belongs to one. */
261
+ epicId: string | null;
262
+ /** Whether every task in the epic has reached `released`. */
263
+ epicFullyReleased: boolean;
264
+ /**
265
+ * Suggested next CLI command. Non-null only when `epicFullyReleased` is
266
+ * true. Points the operator toward `cleo release ship`.
267
+ */
268
+ suggestedCommand: string | null;
269
+ /** Human-readable message for operator guidance. */
270
+ message: string;
271
+ }