@cleocode/contracts 2026.9.22 → 2026.9.24

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 (102) hide show
  1. package/dist/__tests__/evidence-atom-schema.test.js +3 -2
  2. package/dist/__tests__/evidence-atom-schema.test.js.map +1 -1
  3. package/dist/acceptance-gate-schema.d.ts.map +1 -1
  4. package/dist/acceptance-gate-schema.js +4 -1
  5. package/dist/acceptance-gate-schema.js.map +1 -1
  6. package/dist/branch-lock.d.ts +9 -0
  7. package/dist/branch-lock.d.ts.map +1 -1
  8. package/dist/branch-lock.js +25 -3
  9. package/dist/branch-lock.js.map +1 -1
  10. package/dist/cloud/api.d.ts +1 -1
  11. package/dist/data-accessor.d.ts +209 -16
  12. package/dist/data-accessor.d.ts.map +1 -1
  13. package/dist/data-accessor.js.map +1 -1
  14. package/dist/decide-sites.d.ts +157 -0
  15. package/dist/decide-sites.d.ts.map +1 -0
  16. package/dist/decide-sites.js +28 -0
  17. package/dist/decide-sites.js.map +1 -0
  18. package/dist/decide.d.ts +214 -0
  19. package/dist/decide.d.ts.map +1 -1
  20. package/dist/decide.js +54 -0
  21. package/dist/decide.js.map +1 -1
  22. package/dist/dispatch/operations-registry.d.ts.map +1 -1
  23. package/dist/dispatch/operations-registry.js +174 -8
  24. package/dist/dispatch/operations-registry.js.map +1 -1
  25. package/dist/doctor.d.ts +9 -0
  26. package/dist/doctor.d.ts.map +1 -1
  27. package/dist/evidence-atom-schema.d.ts.map +1 -1
  28. package/dist/evidence-atom-schema.js +3 -0
  29. package/dist/evidence-atom-schema.js.map +1 -1
  30. package/dist/exit-codes.d.ts +7 -0
  31. package/dist/exit-codes.d.ts.map +1 -1
  32. package/dist/exit-codes.js +7 -0
  33. package/dist/exit-codes.js.map +1 -1
  34. package/dist/index.d.ts +12 -7
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/knowledge-health.d.ts +21 -0
  39. package/dist/knowledge-health.d.ts.map +1 -1
  40. package/dist/nexus-account.d.ts +160 -0
  41. package/dist/nexus-account.d.ts.map +1 -0
  42. package/dist/nexus-account.js +68 -0
  43. package/dist/nexus-account.js.map +1 -0
  44. package/dist/operations/admin.d.ts +5 -0
  45. package/dist/operations/admin.d.ts.map +1 -1
  46. package/dist/operations/focus.d.ts +7 -3
  47. package/dist/operations/focus.d.ts.map +1 -1
  48. package/dist/operations/nexus-scope-map.d.ts +8 -0
  49. package/dist/operations/nexus-scope-map.d.ts.map +1 -1
  50. package/dist/operations/nexus-scope-map.js +8 -0
  51. package/dist/operations/nexus-scope-map.js.map +1 -1
  52. package/dist/operations/nexus.d.ts +265 -0
  53. package/dist/operations/nexus.d.ts.map +1 -1
  54. package/dist/operations/nexus.js +9 -1
  55. package/dist/operations/nexus.js.map +1 -1
  56. package/dist/operations/orchestrate.d.ts +6 -1
  57. package/dist/operations/orchestrate.d.ts.map +1 -1
  58. package/dist/operations/output-contracts-data.d.ts.map +1 -1
  59. package/dist/operations/output-contracts-data.js +115 -1
  60. package/dist/operations/output-contracts-data.js.map +1 -1
  61. package/dist/operations/tasks.d.ts +97 -9
  62. package/dist/operations/tasks.d.ts.map +1 -1
  63. package/dist/operations/tasks.js.map +1 -1
  64. package/dist/project-lifecycle.d.ts +6 -2
  65. package/dist/project-lifecycle.d.ts.map +1 -1
  66. package/dist/session.d.ts +19 -1
  67. package/dist/session.d.ts.map +1 -1
  68. package/dist/session.js +9 -2
  69. package/dist/session.js.map +1 -1
  70. package/dist/task.d.ts +49 -1
  71. package/dist/task.d.ts.map +1 -1
  72. package/dist/tools/index.d.ts +1 -1
  73. package/dist/tools/index.d.ts.map +1 -1
  74. package/dist/tools/score-task-priority.d.ts +28 -3
  75. package/dist/tools/score-task-priority.d.ts.map +1 -1
  76. package/package.json +2 -2
  77. package/src/__tests__/__snapshots__/operations-registry.test.ts.snap +1 -1
  78. package/src/__tests__/evidence-atom-schema.test.ts +3 -2
  79. package/src/acceptance-gate-schema.ts +4 -1
  80. package/src/branch-lock.ts +38 -3
  81. package/src/data-accessor.ts +215 -16
  82. package/src/decide-sites.ts +179 -0
  83. package/src/decide.ts +235 -0
  84. package/src/dispatch/operations-registry.ts +183 -8
  85. package/src/doctor.ts +9 -0
  86. package/src/evidence-atom-schema.ts +3 -0
  87. package/src/exit-codes.ts +7 -0
  88. package/src/index.ts +72 -0
  89. package/src/knowledge-health.ts +22 -0
  90. package/src/nexus-account.ts +181 -0
  91. package/src/operations/admin.ts +5 -0
  92. package/src/operations/focus.ts +7 -3
  93. package/src/operations/nexus-scope-map.ts +9 -0
  94. package/src/operations/nexus.ts +281 -0
  95. package/src/operations/orchestrate.ts +6 -2
  96. package/src/operations/output-contracts-data.ts +125 -1
  97. package/src/operations/tasks.ts +104 -12
  98. package/src/project-lifecycle.ts +6 -2
  99. package/src/session.ts +20 -2
  100. package/src/task.ts +51 -1
  101. package/src/tools/index.ts +1 -0
  102. package/src/tools/score-task-priority.ts +29 -3
package/src/index.ts CHANGED
@@ -362,6 +362,12 @@ export type {
362
362
  QueryTasksResult,
363
363
  TaskAuditLogQuery,
364
364
  TaskAuditLogRow,
365
+ TaskClaimedDetails,
366
+ TaskClaimGuard,
367
+ TaskClaimMode,
368
+ TaskClaimRequest,
369
+ TaskConflictChange,
370
+ TaskConflictDetails,
365
371
  TaskFieldUpdates,
366
372
  TaskPopulation,
367
373
  TaskQueryFilters,
@@ -808,6 +814,7 @@ export type {
808
814
  KnowledgeEvidenceRef,
809
815
  KnowledgeFileEvidence,
810
816
  KnowledgeHealth,
817
+ KnowledgeHealthSummary,
811
818
  KnowledgeRepairAction,
812
819
  KnowledgeRepairClass,
813
820
  KnowledgeRepairFinding,
@@ -1492,6 +1499,12 @@ export type {
1492
1499
  NexusDiscoverHit,
1493
1500
  NexusDiscoverParams,
1494
1501
  NexusDiscoverResult,
1502
+ NexusFleetDevice,
1503
+ NexusFleetDeviceSummary,
1504
+ NexusFleetFlag,
1505
+ NexusFleetGitSummary,
1506
+ NexusFleetLocation,
1507
+ NexusFleetProject,
1495
1508
  NexusFlowEntry,
1496
1509
  NexusFlowsParams,
1497
1510
  NexusFlowsResult,
@@ -1541,6 +1554,8 @@ export type {
1541
1554
  NexusProjectsCleanRemoval,
1542
1555
  NexusProjectsCleanResult,
1543
1556
  NexusProjectsCleanUnreadable,
1557
+ NexusProjectsFleetParams,
1558
+ NexusProjectsFleetResult,
1544
1559
  NexusProjectsListParams,
1545
1560
  NexusProjectsListResult,
1546
1561
  NexusProjectsRegisterParams,
@@ -1621,6 +1636,7 @@ export type {
1621
1636
  NexusWhyResult,
1622
1637
  NexusWikiParams,
1623
1638
  } from './operations/nexus.js';
1639
+ export { NEXUS_FLEET_SCHEMA_VERSION } from './operations/nexus.js';
1624
1640
  // === Nexus Scope Contracts (T9145 + T9146) ===
1625
1641
  export type {
1626
1642
  MetaWithNexusScope,
@@ -2500,6 +2516,7 @@ export type {
2500
2516
  SeverityAttestation,
2501
2517
  SignedSeverityAttestation,
2502
2518
  Task,
2519
+ TaskClaim,
2503
2520
  TaskCreate,
2504
2521
  // T944 new axes (T9072: renamed TaskRole → TaskKind)
2505
2522
  TaskKind,
@@ -2703,6 +2720,7 @@ export type {
2703
2720
  ScoreFactor,
2704
2721
  ScoreTaskContext,
2705
2722
  ScoreTaskInput,
2723
+ ScoreTaskKey,
2706
2724
  ScoreTaskResult,
2707
2725
  } from './tools/score-task-priority.js';
2708
2726
  // === Transport (low-level wire protocol) ===
@@ -2889,12 +2907,22 @@ export {
2889
2907
  export type {
2890
2908
  ChoiceDecisionAnswer,
2891
2909
  ChoiceDecisionQuestion,
2910
+ DecideProfileConnection,
2911
+ DecideProfileListResult,
2912
+ DecideProfileProbe,
2913
+ DecideProfileSummary,
2914
+ DecideProfileUrlSource,
2915
+ DecideProviderState,
2892
2916
  DecisionAnswer,
2917
+ DecisionBatchItem,
2893
2918
  DecisionInstructions,
2894
2919
  DecisionJsonValue,
2895
2920
  DecisionOutcome,
2896
2921
  DecisionOutcomeSource,
2922
+ DecisionProviderCapabilities,
2897
2923
  DecisionProviderConfig,
2924
+ DecisionProviderKind,
2925
+ DecisionProviderUsage,
2898
2926
  DecisionQuestion,
2899
2927
  DecisionQuestionType,
2900
2928
  DecisionRequest,
@@ -2907,7 +2935,11 @@ export type {
2907
2935
  export {
2908
2936
  choiceDecisionAnswerSchema,
2909
2937
  choiceDecisionQuestionSchema,
2938
+ DECIDE_DEFAULT_PROFILE_NAME,
2939
+ DECIDE_PROFILE_DEFAULT_URL,
2940
+ DECIDE_PROFILE_NAME_PATTERN,
2910
2941
  DECISION_OUTCOME_SOURCES,
2942
+ DECISION_PROVIDER_KINDS,
2911
2943
  DECISION_QUESTION_TYPES,
2912
2944
  DECISION_REQUEST_LIMITS,
2913
2945
  decisionAnswerSchema,
@@ -2915,14 +2947,54 @@ export {
2915
2947
  decisionOutcomeSchema,
2916
2948
  decisionOutcomeSourceSchema,
2917
2949
  decisionProviderConfigSchema,
2950
+ decisionProviderKindSchema,
2918
2951
  decisionQuestionSchema,
2919
2952
  decisionQuestionTypeSchema,
2920
2953
  decisionRequestSchema,
2921
2954
  decisionStateSchema,
2955
+ JEV_DEFAULT_BASE_URL,
2956
+ JEV_MINIMUM_CAPABILITIES,
2957
+ LAYAHOST_BASE_URL,
2958
+ LAYAHOST_DEFAULT_MODEL,
2922
2959
  noulDecisionAnswerSchema,
2923
2960
  noulDecisionQuestionSchema,
2924
2961
  scoreDecisionAnswerSchema,
2925
2962
  scoreDecisionQuestionSchema,
2926
2963
  } from './decide.js';
2964
+ // T12662: decision-site registry (the decision ladder as code).
2965
+ export type {
2966
+ DecisionRung,
2967
+ DecisionSiteActivity,
2968
+ DecisionSiteDefinition,
2969
+ DecisionSiteGoLive,
2970
+ DecisionSiteModeValue,
2971
+ DecisionSiteOwnerEscalation,
2972
+ DecisionSiteQuestionType,
2973
+ DecisionSiteSummary,
2974
+ DecisionSitesListResult,
2975
+ DecisionSiteTextClass,
2976
+ } from './decide-sites.js';
2977
+ export { DECISION_RUNGS, DECISION_SITE_MODES } from './decide-sites.js';
2927
2978
 
2979
+ export type {
2980
+ NexusAccountErrorCode,
2981
+ NexusAccountMe,
2982
+ NexusAccountOrganization,
2983
+ NexusAccountStatus,
2984
+ NexusAccountUser,
2985
+ NexusLoginResult,
2986
+ NexusLogoutResult,
2987
+ NexusProjectLink,
2988
+ NexusProjectLinkResult,
2989
+ NexusSessionState,
2990
+ } from './nexus-account.js';
2991
+ export {
2992
+ NEXUS_ACCOUNT_ERROR_CODES,
2993
+ NEXUS_CLI_CLIENT_ID,
2994
+ NEXUS_DEFAULT_API_URL,
2995
+ NEXUS_LOGIN_TARGET,
2996
+ nexusAccountMeSchema,
2997
+ nexusAccountOrganizationSchema,
2998
+ nexusAccountUserSchema,
2999
+ } from './nexus-account.js';
2928
3000
  export { isStorableTaskId, isTaskId, TASK_ID_REGEX, type TaskId } from './task-id.js';
@@ -258,6 +258,28 @@ export interface KnowledgeHealth {
258
258
  findings: KnowledgeRepairFinding[];
259
259
  }
260
260
 
261
+ /**
262
+ * Orientation summary of {@link KnowledgeHealth} for envelopes that already
263
+ * carry the coverage object at their top level (`briefing.show`'s
264
+ * `knowledgeCoverage`, `focus.show`'s `coverage`).
265
+ *
266
+ * The coverage object is emitted once per envelope; this summary points at it
267
+ * through {@link KnowledgeHealthSummary.coverageRef} instead of repeating it
268
+ * (T12522). Every other field keeps the {@link KnowledgeHealth} meaning. The
269
+ * full assessment, coverage included, remains available from
270
+ * `cleo doctor knowledge`.
271
+ *
272
+ * @task T12522
273
+ */
274
+ export interface KnowledgeHealthSummary extends Omit<KnowledgeHealth, 'coverage'> {
275
+ /**
276
+ * JSON Pointer, relative to the envelope's `data`, of the coverage object
277
+ * this summary describes — e.g. `/knowledgeCoverage` (briefing) or
278
+ * `/coverage` (focus). Prefix `/data` for `cleo ... --field`.
279
+ */
280
+ coverageRef: string;
281
+ }
282
+
261
283
  /** Responsibility for resolving a knowledge defect. */
262
284
  export type KnowledgeRepairClass = 'automatic' | 'agent-resolvable' | 'owner-decision';
263
285
 
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Cleo Nexus account contracts: the CLI's signed-in session with the Cleo
3
+ * Nexus API (device-code login, logout, status, project link).
4
+ *
5
+ * The API is a better-auth app: the device-code grant (RFC 8628) issues a
6
+ * session token that the bearer plugin accepts on every `/v1` route. These
7
+ * types describe what CLEO emits and persists about that session. None of
8
+ * them carries the token: results and status rows are secret-free by
9
+ * construction, so they are safe in LAFS envelopes and logs.
10
+ *
11
+ * Not part of `./cloud`: that directory mirrors the server's
12
+ * `@cleo-nexus/shared` contract one-to-one. The `/v1/account/me` subset
13
+ * below is read-only and client-side.
14
+ *
15
+ * This file is types + zod schemas + const data only (arch gate 10).
16
+ *
17
+ * @task T12712
18
+ * @epic T12322
19
+ */
20
+
21
+ import { z } from 'zod';
22
+
23
+ /** Production Cleo Nexus API origin. */
24
+ export const NEXUS_DEFAULT_API_URL = 'https://api.cleocode.dev';
25
+
26
+ /** The OAuth client id the Nexus API accepts for the device-code grant. */
27
+ export const NEXUS_CLI_CLIENT_ID = 'cleo-cli';
28
+
29
+ /**
30
+ * The reserved `cleo login` target for a Cleo Nexus account. It is checked
31
+ * before the LLM provider registry, so no provider can shadow it.
32
+ */
33
+ export const NEXUS_LOGIN_TARGET = 'nexus';
34
+
35
+ /** Stable error codes of the Nexus account flows. */
36
+ export const NEXUS_ACCOUNT_ERROR_CODES = [
37
+ 'E_NEXUS_INVALID_API_URL',
38
+ 'E_NEXUS_NOT_SIGNED_IN',
39
+ 'E_NEXUS_SESSION_EXPIRED',
40
+ 'E_NEXUS_DEVICE_CODE_START_FAILED',
41
+ 'E_NEXUS_UNTRUSTED_VERIFICATION_URI',
42
+ 'E_NEXUS_DEVICE_CODE_EXPIRED',
43
+ 'E_NEXUS_ACCESS_DENIED',
44
+ 'E_NEXUS_DEVICE_CODE_FAILED',
45
+ 'E_NEXUS_REVOKE_FAILED',
46
+ 'E_NEXUS_REQUEST_FAILED',
47
+ 'E_NEXUS_NOT_A_PROJECT',
48
+ 'E_NEXUS_INVALID_LABEL',
49
+ ] as const;
50
+
51
+ /** One of {@link NEXUS_ACCOUNT_ERROR_CODES}. */
52
+ export type NexusAccountErrorCode = (typeof NEXUS_ACCOUNT_ERROR_CODES)[number];
53
+
54
+ /** The signed-in user, as `/v1/account/me` reports it. */
55
+ export const nexusAccountUserSchema = z.object({
56
+ id: z.string(),
57
+ email: z.string(),
58
+ name: z.string().nullable().optional(),
59
+ });
60
+
61
+ /** A user's organization membership, as `/v1/account/me` reports it. */
62
+ export const nexusAccountOrganizationSchema = z.object({
63
+ id: z.string(),
64
+ name: z.string(),
65
+ slug: z.string().nullable().optional(),
66
+ role: z.string().optional(),
67
+ /** `true` for the personal organization created at sign-up. */
68
+ personal: z.boolean().optional(),
69
+ });
70
+
71
+ /**
72
+ * The subset of `GET /v1/account/me` the CLI reads. Unknown fields are
73
+ * ignored (zod strips them), so the server can grow the payload freely.
74
+ */
75
+ export const nexusAccountMeSchema = z.object({
76
+ user: nexusAccountUserSchema,
77
+ organizations: z.array(nexusAccountOrganizationSchema).default([]),
78
+ });
79
+
80
+ /** Parsed `GET /v1/account/me` subset. */
81
+ export type NexusAccountMe = z.infer<typeof nexusAccountMeSchema>;
82
+
83
+ /** A signed-in user (no secrets). */
84
+ export type NexusAccountUser = z.infer<typeof nexusAccountUserSchema>;
85
+
86
+ /** An organization reference (no secrets). */
87
+ export type NexusAccountOrganization = z.infer<typeof nexusAccountOrganizationSchema>;
88
+
89
+ /**
90
+ * Session state for one API origin.
91
+ *
92
+ * - `signed-in` — a token is stored and, when checked live, the API accepted it.
93
+ * - `unverified` — a token is stored but the API could not be reached.
94
+ * - `expired` — the API answered 401: the session expired or was revoked.
95
+ * - `not-signed-in` — no token is stored for the origin.
96
+ */
97
+ export type NexusSessionState = 'signed-in' | 'unverified' | 'expired' | 'not-signed-in';
98
+
99
+ /** Secret-free status row for `cleo status` and `cleo auth list`. */
100
+ export interface NexusAccountStatus {
101
+ /** API origin the row describes, e.g. `https://api.cleocode.dev`. */
102
+ apiUrl: string;
103
+ /** Session state. */
104
+ state: NexusSessionState;
105
+ /** Signed-in user's email, when known. */
106
+ email: string | null;
107
+ /** Primary organization (the personal one, else the first), when known. */
108
+ organization: string | null;
109
+ /** ISO time the stored token expires, when the server said so. */
110
+ expiresAt: string | null;
111
+ /** One human line: "signed in as a@b.c (Org)", "session expired", "not signed in". */
112
+ summary: string;
113
+ }
114
+
115
+ /** Result of `cleo login nexus` (never carries the token). */
116
+ export interface NexusLoginResult {
117
+ /** API origin the session belongs to. */
118
+ apiUrl: string;
119
+ /** The signed-in user, when `/v1/account/me` answered. */
120
+ user: NexusAccountUser | null;
121
+ /** Primary organization, when known. */
122
+ organization: NexusAccountOrganization | null;
123
+ /** ISO time the token expires, when the server said so. */
124
+ expiresAt: string | null;
125
+ /** Absolute path of the credential store the token was written to. */
126
+ credentialsPath: string;
127
+ /** Non-fatal problems, e.g. the account lookup failed after a good login. */
128
+ warnings: string[];
129
+ }
130
+
131
+ /** Result of `cleo logout nexus`. */
132
+ export interface NexusLogoutResult {
133
+ /** API origin the session belonged to. */
134
+ apiUrl: string;
135
+ /** `true` when a stored token existed and was deleted locally. */
136
+ removedLocally: boolean;
137
+ /**
138
+ * Server-side revocation outcome: `revoked` (the API ended the session),
139
+ * `already-invalid` (the API reported it was already gone), `failed`
140
+ * (network or server error: the local token is deleted anyway), or
141
+ * `skipped` (nothing was stored).
142
+ */
143
+ revocation: 'revoked' | 'already-invalid' | 'failed' | 'skipped';
144
+ /** Non-fatal problems. */
145
+ warnings: string[];
146
+ }
147
+
148
+ /**
149
+ * The binding of a local CLEO project to its Nexus registration, persisted in
150
+ * the project's machine-local `.cleo/nexus-link.json`, keyed by API origin.
151
+ */
152
+ export interface NexusProjectLink {
153
+ /** API origin the project is registered with. */
154
+ apiUrl: string;
155
+ /** The local CLEO project id (the tracked `.cleo/project-id`). */
156
+ localProjectId: string;
157
+ /** The project id the server returned (the server keys projects by the CLEO id). */
158
+ remoteProjectId: string;
159
+ /** Owning organization id. */
160
+ organizationId: string;
161
+ /** Plaintext display-name label the server holds, or `null` when it has none. */
162
+ label: string | null;
163
+ /** Journal stream id for the project. */
164
+ streamId: string;
165
+ /** ISO time of the last successful link. */
166
+ linkedAt: string;
167
+ }
168
+
169
+ /** Result of `cleo project link`. */
170
+ export interface NexusProjectLinkResult {
171
+ /** The persisted binding. */
172
+ link: NexusProjectLink;
173
+ /**
174
+ * `true` when the server already had this project id (HTTP 200; its label
175
+ * was updated to the one sent), `false` when this call registered it (201).
176
+ * Linking is idempotent either way.
177
+ */
178
+ alreadyLinked: boolean;
179
+ /** Absolute path of the local binding file. */
180
+ linkPath: string;
181
+ }
@@ -1648,6 +1648,11 @@ export interface AdminBackupMutateParams {
1648
1648
  file?: string;
1649
1649
  /** Preview the restore without writing (restore.file only). */
1650
1650
  dryRun?: boolean;
1651
+ /**
1652
+ * Allow a restore run from inside a git worktree to overwrite the owning
1653
+ * project's live store (T12680). Without it such a restore is refused.
1654
+ */
1655
+ confirmOwnerStore?: boolean;
1651
1656
  }
1652
1657
 
1653
1658
  /** Result of `admin.backup` mutate (create action). */
@@ -15,7 +15,7 @@
15
15
  import type {
16
16
  KnowledgeCoverage,
17
17
  KnowledgeDiagnostic,
18
- KnowledgeHealth,
18
+ KnowledgeHealthSummary,
19
19
  } from '../knowledge-health.js';
20
20
  import type { MviDigest } from '../mvi.js';
21
21
  import type { AttentionScopeKind } from './attention.js';
@@ -195,8 +195,12 @@ export interface FocusBrainContext {
195
195
  export interface FocusShowResult {
196
196
  /** Assessed graph coverage; absence on legacy responses is not healthy coverage. */
197
197
  coverage?: KnowledgeCoverage;
198
- /** Bounded deterministic maintenance and sourced repair findings for the foreground caller. */
199
- knowledgeHealth?: KnowledgeHealth;
198
+ /**
199
+ * Bounded deterministic maintenance and sourced repair findings for the
200
+ * foreground caller. Its coverage is not repeated: `coverageRef` is
201
+ * `/coverage`, the single coverage object of this result (T12522).
202
+ */
203
+ knowledgeHealth?: KnowledgeHealthSummary;
200
204
  /** Failed auxiliary reads are distinct from successfully empty sources. */
201
205
  sourceDiagnostics?: Record<string, KnowledgeDiagnostic>;
202
206
  /** Core identity of the focused entity. */
@@ -473,6 +473,15 @@ export const NEXUS_SCOPE_MAP = {
473
473
  stores: ['nexus-registry'],
474
474
  requiresProject: false,
475
475
  },
476
+ 'projects.fleet': {
477
+ op: 'projects.fleet',
478
+ description:
479
+ 'Fleet view: every project, where it lives on each device, and its last recorded git state (read-only).',
480
+ scope: 'global',
481
+ effect: 'read',
482
+ stores: ['nexus-registry'],
483
+ requiresProject: false,
484
+ },
476
485
  'projects.register': {
477
486
  op: 'projects.register',
478
487
  description: 'Register a project (alias: register).',