@neat.is/types 0.9.8-dev.20260829 → 0.9.8

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.
package/dist/index.cjs CHANGED
@@ -76,6 +76,15 @@ __export(index_exports, {
76
76
  HealthResponseSchema: () => HealthResponseSchema,
77
77
  HostMismatchDivergenceSchema: () => HostMismatchDivergenceSchema,
78
78
  HypotheticalActionSchema: () => HypotheticalActionSchema,
79
+ IncidentBlastRadiusSchema: () => IncidentBlastRadiusSchema,
80
+ IncidentCardSchema: () => IncidentCardSchema,
81
+ IncidentChainHopSchema: () => IncidentChainHopSchema,
82
+ IncidentDivergenceSchema: () => IncidentDivergenceSchema,
83
+ IncidentEventPayloadSchema: () => IncidentEventPayloadSchema,
84
+ IncidentKindSchema: () => IncidentKindSchema,
85
+ IncidentLocusSchema: () => IncidentLocusSchema,
86
+ IncidentPolicySchema: () => IncidentPolicySchema,
87
+ IncidentRootCauseSchema: () => IncidentRootCauseSchema,
79
88
  IncidentsResponseSchema: () => IncidentsResponseSchema,
80
89
  InfraNodeSchema: () => InfraNodeSchema,
81
90
  LatencyMsSchema: () => LatencyMsSchema,
@@ -144,6 +153,7 @@ __export(index_exports, {
144
153
  frontierId: () => frontierId,
145
154
  graphqlOperationId: () => graphqlOperationId,
146
155
  grpcMethodId: () => grpcMethodId,
156
+ incidentKindOf: () => incidentKindOf,
147
157
  inferredEdgeId: () => inferredEdgeId,
148
158
  infraId: () => infraId,
149
159
  localDatabaseId: () => localDatabaseId,
@@ -950,6 +960,101 @@ var AskResultSchema = import_zod5.z.object({
950
960
  provenance: import_zod5.z.array(ProvenanceSchema)
951
961
  });
952
962
 
963
+ // src/incident-card.ts
964
+ var import_zod6 = require("zod");
965
+ var IncidentKindSchema = import_zod6.z.enum([
966
+ "exception",
967
+ "5xx",
968
+ "4xx-burst",
969
+ "status-error",
970
+ "connector"
971
+ ]);
972
+ var IncidentChainHopSchema = import_zod6.z.object({
973
+ node: import_zod6.z.string(),
974
+ // 'service' | 'file' | 'symbol' | 'table' | 'column' | … — the node's own grain.
975
+ grain: import_zod6.z.string(),
976
+ // The edge INTO this hop from the previous one, when cheaply known.
977
+ edgeType: import_zod6.z.string().optional(),
978
+ provenance: ProvenanceSchema,
979
+ carriesSignal: import_zod6.z.boolean().optional()
980
+ });
981
+ var IncidentLocusSchema = import_zod6.z.object({
982
+ file: import_zod6.z.string(),
983
+ lineStart: import_zod6.z.number().int().optional(),
984
+ lineEnd: import_zod6.z.number().int().optional(),
985
+ symbol: import_zod6.z.string().optional(),
986
+ service: import_zod6.z.string().optional(),
987
+ provenance: ProvenanceSchema
988
+ });
989
+ var IncidentRootCauseSchema = import_zod6.z.object({
990
+ node: import_zod6.z.string(),
991
+ classification: import_zod6.z.string().optional(),
992
+ reason: import_zod6.z.string(),
993
+ confidence: import_zod6.z.number().min(0).max(1),
994
+ fix: import_zod6.z.string().nullable().optional(),
995
+ chain: import_zod6.z.array(IncidentChainHopSchema)
996
+ });
997
+ var IncidentBlastRadiusSchema = import_zod6.z.object({
998
+ totalAffected: import_zod6.z.number().int().nonnegative(),
999
+ nearest: import_zod6.z.array(
1000
+ import_zod6.z.object({
1001
+ node: import_zod6.z.string(),
1002
+ distance: import_zod6.z.number().int().nonnegative(),
1003
+ provenance: ProvenanceSchema
1004
+ })
1005
+ )
1006
+ });
1007
+ var IncidentPolicySchema = import_zod6.z.object({
1008
+ policyName: import_zod6.z.string(),
1009
+ severity: import_zod6.z.string(),
1010
+ message: import_zod6.z.string().optional()
1011
+ });
1012
+ var IncidentDivergenceSchema = import_zod6.z.object({
1013
+ type: import_zod6.z.string(),
1014
+ summary: import_zod6.z.string()
1015
+ });
1016
+ var IncidentCardSchema = import_zod6.z.object({
1017
+ kind: import_zod6.z.literal("incident"),
1018
+ id: import_zod6.z.string(),
1019
+ // ISO8601 — the incident's own time.
1020
+ at: import_zod6.z.string(),
1021
+ incidentKind: IncidentKindSchema,
1022
+ service: import_zod6.z.string(),
1023
+ affectedNode: import_zod6.z.string(),
1024
+ message: import_zod6.z.string(),
1025
+ exceptionType: import_zod6.z.string().optional(),
1026
+ httpStatusCode: import_zod6.z.number().int().optional(),
1027
+ // Coalesced burst size (ErrorEvent.incidentCount).
1028
+ count: import_zod6.z.number().int().positive().optional(),
1029
+ window: import_zod6.z.object({ first: import_zod6.z.string(), last: import_zod6.z.string() }).optional(),
1030
+ traceId: import_zod6.z.string().optional(),
1031
+ spanId: import_zod6.z.string().optional(),
1032
+ locus: IncidentLocusSchema.nullable(),
1033
+ rootCause: IncidentRootCauseSchema.nullable(),
1034
+ blastRadius: IncidentBlastRadiusSchema.optional(),
1035
+ policies: import_zod6.z.array(IncidentPolicySchema).optional(),
1036
+ divergence: import_zod6.z.array(IncidentDivergenceSchema).optional(),
1037
+ // The rendered one-line sentence — a human/loose-LLM read over the structured
1038
+ // body, never the wire format.
1039
+ headline: import_zod6.z.string()
1040
+ });
1041
+ var IncidentEventPayloadSchema = import_zod6.z.object({
1042
+ incidentId: import_zod6.z.string(),
1043
+ affectedNode: import_zod6.z.string(),
1044
+ service: import_zod6.z.string(),
1045
+ incidentKind: IncidentKindSchema,
1046
+ at: import_zod6.z.string()
1047
+ });
1048
+ function incidentKindOf(ev) {
1049
+ const et = ev.errorType;
1050
+ if (et === "grpc-failure") return "status-error";
1051
+ if (et === "http-failure") {
1052
+ return ev.incidentCount && ev.incidentCount > 1 ? "4xx-burst" : "5xx";
1053
+ }
1054
+ if (et) return "connector";
1055
+ return "exception";
1056
+ }
1057
+
953
1058
  // src/identity.ts
954
1059
  var SERVICE_PREFIX = "service:";
955
1060
  var DATABASE_PREFIX = "database:";
@@ -1162,11 +1267,11 @@ var PROV_RANK = Object.freeze({
1162
1267
  });
1163
1268
 
1164
1269
  // src/policy.ts
1165
- var import_zod6 = require("zod");
1166
- var PolicySeveritySchema = import_zod6.z.enum(["info", "warning", "error", "critical"]);
1167
- var PolicyActionSchema = import_zod6.z.enum(["log", "alert", "block"]);
1168
- var StructuralRuleSchema = import_zod6.z.object({
1169
- type: import_zod6.z.literal("structural"),
1270
+ var import_zod7 = require("zod");
1271
+ var PolicySeveritySchema = import_zod7.z.enum(["info", "warning", "error", "critical"]);
1272
+ var PolicyActionSchema = import_zod7.z.enum(["log", "alert", "block"]);
1273
+ var StructuralRuleSchema = import_zod7.z.object({
1274
+ type: import_zod7.z.literal("structural"),
1170
1275
  // Node type the rule applies to. Every node of this type must satisfy the
1171
1276
  // edge requirement below.
1172
1277
  fromNodeType: NodeTypeSchema,
@@ -1175,61 +1280,61 @@ var StructuralRuleSchema = import_zod6.z.object({
1175
1280
  // Required target node type at the other end of the edge.
1176
1281
  toNodeType: NodeTypeSchema
1177
1282
  });
1178
- var CompatibilityRuleSchema = import_zod6.z.object({
1179
- type: import_zod6.z.literal("compatibility"),
1283
+ var CompatibilityRuleSchema = import_zod7.z.object({
1284
+ type: import_zod7.z.literal("compatibility"),
1180
1285
  // Optional kind narrowing. When omitted, all four compat shapes
1181
1286
  // (driver-engine, node-engine, package-conflict, deprecated-api) run.
1182
- kind: import_zod6.z.enum(["driver-engine", "node-engine", "package-conflict", "deprecated-api"]).optional()
1287
+ kind: import_zod7.z.enum(["driver-engine", "node-engine", "package-conflict", "deprecated-api"]).optional()
1183
1288
  });
1184
- var ProvenanceRuleSchema = import_zod6.z.object({
1185
- type: import_zod6.z.literal("provenance"),
1289
+ var ProvenanceRuleSchema = import_zod7.z.object({
1290
+ type: import_zod7.z.literal("provenance"),
1186
1291
  // Edge type the rule applies to.
1187
1292
  edgeType: EdgeTypeSchema,
1188
1293
  // Target node id (e.g. 'service:payments') that incoming edges of edgeType
1189
1294
  // must satisfy. Optional — when omitted, the rule runs against every edge
1190
1295
  // of edgeType regardless of target.
1191
- targetNodeId: import_zod6.z.string().optional(),
1296
+ targetNodeId: import_zod7.z.string().optional(),
1192
1297
  // Required provenance (single value or one-of). The audit fails if the
1193
1298
  // observed edge's provenance is not in this set.
1194
- required: import_zod6.z.union([ProvenanceSchema, import_zod6.z.array(ProvenanceSchema).min(1)])
1299
+ required: import_zod7.z.union([ProvenanceSchema, import_zod7.z.array(ProvenanceSchema).min(1)])
1195
1300
  });
1196
- var OwnershipRuleSchema = import_zod6.z.object({
1197
- type: import_zod6.z.literal("ownership"),
1301
+ var OwnershipRuleSchema = import_zod7.z.object({
1302
+ type: import_zod7.z.literal("ownership"),
1198
1303
  // Node type the rule applies to. ServiceNode is the common case; the
1199
1304
  // discriminator stays generic so future node types can opt in.
1200
1305
  nodeType: NodeTypeSchema,
1201
1306
  // Field name on the node attributes that must be non-empty. Defaults to
1202
1307
  // 'owner' if omitted.
1203
- field: import_zod6.z.string().default("owner")
1308
+ field: import_zod7.z.string().default("owner")
1204
1309
  });
1205
- var BlastRadiusRuleSchema = import_zod6.z.object({
1206
- type: import_zod6.z.literal("blast-radius"),
1310
+ var BlastRadiusRuleSchema = import_zod7.z.object({
1311
+ type: import_zod7.z.literal("blast-radius"),
1207
1312
  // Node type the rule applies to (ServiceNode is the common case).
1208
1313
  nodeType: NodeTypeSchema,
1209
1314
  // Cap on `totalAffected` from getBlastRadius. Inclusive — a node hitting
1210
1315
  // exactly this number passes; > maxAffected fails.
1211
- maxAffected: import_zod6.z.number().int().positive(),
1316
+ maxAffected: import_zod7.z.number().int().positive(),
1212
1317
  // Depth to evaluate against. Defaults to the contract's blast-radius
1213
1318
  // default (10) when omitted.
1214
- depth: import_zod6.z.number().int().positive().optional()
1319
+ depth: import_zod7.z.number().int().positive().optional()
1215
1320
  });
1216
- var FieldGuardRuleSchema = import_zod6.z.object({
1217
- type: import_zod6.z.literal("field-guard"),
1321
+ var FieldGuardRuleSchema = import_zod7.z.object({
1322
+ type: import_zod7.z.literal("field-guard"),
1218
1323
  // Node type the rule governs. InfraNode for the Firestore instance.
1219
1324
  nodeType: NodeTypeSchema,
1220
1325
  // Optional narrowing on InfraNode's free-string `kind` sub-type, so the rule
1221
1326
  // applies to `firestore-collection` nodes without governing every InfraNode.
1222
- nodeKind: import_zod6.z.string().optional(),
1327
+ nodeKind: import_zod7.z.string().optional(),
1223
1328
  // Set A — the named selector the evaluator resolves into the "must be covered"
1224
1329
  // set. 'client-written-columns' reads ColumnAttr whose sdkWrites includes
1225
1330
  // 'client'. A new instance adds a value here plus a resolver branch.
1226
- subjectSet: import_zod6.z.enum(["client-written-columns"]),
1331
+ subjectSet: import_zod7.z.enum(["client-written-columns"]),
1227
1332
  // Set B — the covering set: the node attribute (a string[]) whose members must
1228
1333
  // include all of set A. 'guardedFields' for Firestore. Absent ⇒ indeterminate
1229
1334
  // ⇒ silent.
1230
- guardSet: import_zod6.z.string()
1335
+ guardSet: import_zod7.z.string()
1231
1336
  });
1232
- var PolicyRuleSchema = import_zod6.z.discriminatedUnion("type", [
1337
+ var PolicyRuleSchema = import_zod7.z.discriminatedUnion("type", [
1233
1338
  StructuralRuleSchema,
1234
1339
  CompatibilityRuleSchema,
1235
1340
  ProvenanceRuleSchema,
@@ -1237,26 +1342,26 @@ var PolicyRuleSchema = import_zod6.z.discriminatedUnion("type", [
1237
1342
  BlastRadiusRuleSchema,
1238
1343
  FieldGuardRuleSchema
1239
1344
  ]);
1240
- var PolicySchema = import_zod6.z.object({
1345
+ var PolicySchema = import_zod7.z.object({
1241
1346
  // Unique within the file. Duplicates fail PolicyFileSchema.parse.
1242
- id: import_zod6.z.string().min(1),
1243
- name: import_zod6.z.string().min(1),
1244
- description: import_zod6.z.string().optional(),
1347
+ id: import_zod7.z.string().min(1),
1348
+ name: import_zod7.z.string().min(1),
1349
+ description: import_zod7.z.string().optional(),
1245
1350
  severity: PolicySeveritySchema,
1246
1351
  // When omitted, the engine derives a default from severity per ADR-044
1247
1352
  // (info→log, warning→alert, error→alert, critical→block).
1248
1353
  onViolation: PolicyActionSchema.optional(),
1249
1354
  rule: PolicyRuleSchema
1250
1355
  });
1251
- var PolicyFileSchema = import_zod6.z.object({
1252
- version: import_zod6.z.literal(1),
1253
- policies: import_zod6.z.array(PolicySchema)
1356
+ var PolicyFileSchema = import_zod7.z.object({
1357
+ version: import_zod7.z.literal(1),
1358
+ policies: import_zod7.z.array(PolicySchema)
1254
1359
  }).superRefine((file, ctx) => {
1255
1360
  const seen = /* @__PURE__ */ new Set();
1256
1361
  for (const [i, p] of file.policies.entries()) {
1257
1362
  if (seen.has(p.id)) {
1258
1363
  ctx.addIssue({
1259
- code: import_zod6.z.ZodIssueCode.custom,
1364
+ code: import_zod7.z.ZodIssueCode.custom,
1260
1365
  path: ["policies", i, "id"],
1261
1366
  message: `duplicate policy id "${p.id}"`
1262
1367
  });
@@ -1264,173 +1369,173 @@ var PolicyFileSchema = import_zod6.z.object({
1264
1369
  seen.add(p.id);
1265
1370
  }
1266
1371
  });
1267
- var HypotheticalActionSchema = import_zod6.z.discriminatedUnion("kind", [
1268
- import_zod6.z.object({
1269
- kind: import_zod6.z.literal("promote-frontier"),
1372
+ var HypotheticalActionSchema = import_zod7.z.discriminatedUnion("kind", [
1373
+ import_zod7.z.object({
1374
+ kind: import_zod7.z.literal("promote-frontier"),
1270
1375
  // The FrontierNode id that would be promoted.
1271
- frontierId: import_zod6.z.string().min(1)
1376
+ frontierId: import_zod7.z.string().min(1)
1272
1377
  }),
1273
- import_zod6.z.object({
1274
- kind: import_zod6.z.literal("add-edge"),
1275
- source: import_zod6.z.string().min(1),
1276
- target: import_zod6.z.string().min(1),
1378
+ import_zod7.z.object({
1379
+ kind: import_zod7.z.literal("add-edge"),
1380
+ source: import_zod7.z.string().min(1),
1381
+ target: import_zod7.z.string().min(1),
1277
1382
  edgeType: EdgeTypeSchema,
1278
1383
  provenance: ProvenanceSchema
1279
1384
  })
1280
1385
  ]);
1281
- var PoliciesCheckBodySchema = import_zod6.z.object({
1386
+ var PoliciesCheckBodySchema = import_zod7.z.object({
1282
1387
  hypotheticalAction: HypotheticalActionSchema.optional()
1283
1388
  });
1284
- var CheckPoliciesScopeSchema = import_zod6.z.union([
1285
- import_zod6.z.enum(["all", "unresolved"]),
1286
- import_zod6.z.object({ policyId: import_zod6.z.string().min(1) })
1389
+ var CheckPoliciesScopeSchema = import_zod7.z.union([
1390
+ import_zod7.z.enum(["all", "unresolved"]),
1391
+ import_zod7.z.object({ policyId: import_zod7.z.string().min(1) })
1287
1392
  ]);
1288
- var ApplicablePolicySchema = import_zod6.z.object({
1289
- policyId: import_zod6.z.string().min(1),
1290
- policyName: import_zod6.z.string().min(1),
1291
- description: import_zod6.z.string().optional(),
1393
+ var ApplicablePolicySchema = import_zod7.z.object({
1394
+ policyId: import_zod7.z.string().min(1),
1395
+ policyName: import_zod7.z.string().min(1),
1396
+ description: import_zod7.z.string().optional(),
1292
1397
  severity: PolicySeveritySchema,
1293
1398
  // The action the post-launch kernel gate WOULD take (ADR-093) — resolved
1294
1399
  // from policy.onViolation or the severity default. Shown for awareness only;
1295
1400
  // the soft guardrail never acts on it.
1296
1401
  onViolation: PolicyActionSchema,
1297
- ruleType: import_zod6.z.enum(["structural", "compatibility", "provenance", "ownership", "blast-radius", "field-guard"]),
1298
- match: import_zod6.z.enum(["subject", "region"]),
1402
+ ruleType: import_zod7.z.enum(["structural", "compatibility", "provenance", "ownership", "blast-radius", "field-guard"]),
1403
+ match: import_zod7.z.enum(["subject", "region"]),
1299
1404
  // Human-readable reason the policy applies here — rides into agent context.
1300
- reason: import_zod6.z.string().min(1)
1405
+ reason: import_zod7.z.string().min(1)
1301
1406
  });
1302
- var ApplicablePoliciesResponseSchema = import_zod6.z.object({
1303
- node: import_zod6.z.string().min(1),
1304
- applicable: import_zod6.z.array(ApplicablePolicySchema)
1407
+ var ApplicablePoliciesResponseSchema = import_zod7.z.object({
1408
+ node: import_zod7.z.string().min(1),
1409
+ applicable: import_zod7.z.array(ApplicablePolicySchema)
1305
1410
  });
1306
- var PolicyViolationSchema = import_zod6.z.object({
1411
+ var PolicyViolationSchema = import_zod7.z.object({
1307
1412
  // ${policy.id}:${violation-context}. The violation-context is shape-
1308
1413
  // specific (e.g. nodeId for structural; edgeId for provenance).
1309
- id: import_zod6.z.string().min(1),
1310
- policyId: import_zod6.z.string().min(1),
1311
- policyName: import_zod6.z.string().min(1),
1414
+ id: import_zod7.z.string().min(1),
1415
+ policyId: import_zod7.z.string().min(1),
1416
+ policyName: import_zod7.z.string().min(1),
1312
1417
  severity: PolicySeveritySchema,
1313
1418
  // Resolved at evaluation time — either the explicit policy.onViolation or
1314
1419
  // the severity-derived default per ADR-044.
1315
1420
  onViolation: PolicyActionSchema,
1316
- ruleType: import_zod6.z.enum(["structural", "compatibility", "provenance", "ownership", "blast-radius", "field-guard"]),
1317
- subject: import_zod6.z.object({
1318
- nodeId: import_zod6.z.string().optional(),
1319
- edgeId: import_zod6.z.string().optional(),
1320
- path: import_zod6.z.array(import_zod6.z.string()).optional()
1421
+ ruleType: import_zod7.z.enum(["structural", "compatibility", "provenance", "ownership", "blast-radius", "field-guard"]),
1422
+ subject: import_zod7.z.object({
1423
+ nodeId: import_zod7.z.string().optional(),
1424
+ edgeId: import_zod7.z.string().optional(),
1425
+ path: import_zod7.z.array(import_zod7.z.string()).optional()
1321
1426
  }).refine(
1322
1427
  (s) => s.nodeId !== void 0 || s.edgeId !== void 0 || s.path !== void 0,
1323
1428
  { message: "subject must carry at least one of nodeId, edgeId, path" }
1324
1429
  ),
1325
- message: import_zod6.z.string().min(1),
1326
- observedAt: import_zod6.z.string().datetime()
1430
+ message: import_zod7.z.string().min(1),
1431
+ observedAt: import_zod7.z.string().datetime()
1327
1432
  });
1328
1433
 
1329
1434
  // src/registry.ts
1330
- var import_zod7 = require("zod");
1331
- var RegistryStatusSchema = import_zod7.z.enum(["active", "paused", "broken"]);
1332
- var RegistryEntrySchema = import_zod7.z.object({
1435
+ var import_zod8 = require("zod");
1436
+ var RegistryStatusSchema = import_zod8.z.enum(["active", "paused", "broken"]);
1437
+ var RegistryEntrySchema = import_zod8.z.object({
1333
1438
  // Unique within the registry. Project-scoped operations (`neat watch
1334
1439
  // --project <name>`, `neatd reload <name>`) key on this. Collisions are a
1335
1440
  // hard error at registration time.
1336
- name: import_zod7.z.string().min(1),
1441
+ name: import_zod8.z.string().min(1),
1337
1442
  // Resolved absolute path on disk. Path normalisation is what keeps two
1338
1443
  // `neat init` calls from different relative paths from creating two entries
1339
1444
  // for the same directory.
1340
- path: import_zod7.z.string().min(1),
1445
+ path: import_zod8.z.string().min(1),
1341
1446
  // ISO8601, set at first registration.
1342
- registeredAt: import_zod7.z.string(),
1447
+ registeredAt: import_zod8.z.string(),
1343
1448
  // ISO8601, updated whenever the daemon successfully sees the project.
1344
1449
  // Optional because a freshly-registered project hasn't been seen yet.
1345
- lastSeenAt: import_zod7.z.string().optional(),
1450
+ lastSeenAt: import_zod8.z.string().optional(),
1346
1451
  // Languages detected at `init` time. Free-form strings keyed off the
1347
1452
  // installer modules — `'javascript'`, `'python'`, …
1348
- languages: import_zod7.z.array(import_zod7.z.string()),
1453
+ languages: import_zod8.z.array(import_zod8.z.string()),
1349
1454
  status: RegistryStatusSchema
1350
1455
  });
1351
- var RegistryFileSchema = import_zod7.z.object({
1352
- version: import_zod7.z.literal(1),
1353
- projects: import_zod7.z.array(RegistryEntrySchema)
1456
+ var RegistryFileSchema = import_zod8.z.object({
1457
+ version: import_zod8.z.literal(1),
1458
+ projects: import_zod8.z.array(RegistryEntrySchema)
1354
1459
  });
1355
1460
  var EMPTY_REGISTRY = { version: 1, projects: [] };
1356
1461
 
1357
1462
  // src/divergence.ts
1358
- var import_zod8 = require("zod");
1463
+ var import_zod9 = require("zod");
1359
1464
  var commonFields = {
1360
- source: import_zod8.z.string(),
1361
- target: import_zod8.z.string(),
1362
- confidence: import_zod8.z.number().min(0).max(1),
1363
- reason: import_zod8.z.string(),
1364
- recommendation: import_zod8.z.string()
1465
+ source: import_zod9.z.string(),
1466
+ target: import_zod9.z.string(),
1467
+ confidence: import_zod9.z.number().min(0).max(1),
1468
+ reason: import_zod9.z.string(),
1469
+ recommendation: import_zod9.z.string()
1365
1470
  };
1366
- var MissingObservedDivergenceSchema = import_zod8.z.object({
1367
- type: import_zod8.z.literal("missing-observed"),
1471
+ var MissingObservedDivergenceSchema = import_zod9.z.object({
1472
+ type: import_zod9.z.literal("missing-observed"),
1368
1473
  ...commonFields,
1369
1474
  edgeType: EdgeTypeSchema.optional(),
1370
1475
  extracted: GraphEdgeSchema.optional(),
1371
1476
  // Column locus (ADR-157 §4): the `sql-table` node id and the declared-only column.
1372
- table: import_zod8.z.string().optional(),
1373
- column: import_zod8.z.string().optional()
1477
+ table: import_zod9.z.string().optional(),
1478
+ column: import_zod9.z.string().optional()
1374
1479
  });
1375
- var MissingExtractedDivergenceSchema = import_zod8.z.object({
1376
- type: import_zod8.z.literal("missing-extracted"),
1480
+ var MissingExtractedDivergenceSchema = import_zod9.z.object({
1481
+ type: import_zod9.z.literal("missing-extracted"),
1377
1482
  ...commonFields,
1378
1483
  edgeType: EdgeTypeSchema.optional(),
1379
1484
  observed: GraphEdgeSchema.optional(),
1380
1485
  // Column locus (ADR-157 §4): the `sql-table` node id and the observed-only column.
1381
- table: import_zod8.z.string().optional(),
1382
- column: import_zod8.z.string().optional()
1486
+ table: import_zod9.z.string().optional(),
1487
+ column: import_zod9.z.string().optional()
1383
1488
  });
1384
- var CompatibilityVerdictSchema = import_zod8.z.enum(["incompatible", "deprecated", "unknown"]);
1385
- var VersionMismatchDivergenceSchema = import_zod8.z.object({
1386
- type: import_zod8.z.literal("version-mismatch"),
1489
+ var CompatibilityVerdictSchema = import_zod9.z.enum(["incompatible", "deprecated", "unknown"]);
1490
+ var VersionMismatchDivergenceSchema = import_zod9.z.object({
1491
+ type: import_zod9.z.literal("version-mismatch"),
1387
1492
  ...commonFields,
1388
- extractedVersion: import_zod8.z.string(),
1389
- observedVersion: import_zod8.z.string(),
1493
+ extractedVersion: import_zod9.z.string(),
1494
+ observedVersion: import_zod9.z.string(),
1390
1495
  compatibility: CompatibilityVerdictSchema
1391
1496
  });
1392
- var HostMismatchDivergenceSchema = import_zod8.z.object({
1393
- type: import_zod8.z.literal("host-mismatch"),
1497
+ var HostMismatchDivergenceSchema = import_zod9.z.object({
1498
+ type: import_zod9.z.literal("host-mismatch"),
1394
1499
  ...commonFields,
1395
- extractedHost: import_zod8.z.string(),
1396
- observedHost: import_zod8.z.string()
1397
- });
1398
- var CompatRuleRefSchema = import_zod8.z.object({
1399
- kind: import_zod8.z.string(),
1400
- reason: import_zod8.z.string(),
1401
- package: import_zod8.z.string().optional(),
1402
- driver: import_zod8.z.string().optional(),
1403
- engine: import_zod8.z.string().optional()
1404
- });
1405
- var CompatViolationDivergenceSchema = import_zod8.z.object({
1406
- type: import_zod8.z.literal("compat-violation"),
1500
+ extractedHost: import_zod9.z.string(),
1501
+ observedHost: import_zod9.z.string()
1502
+ });
1503
+ var CompatRuleRefSchema = import_zod9.z.object({
1504
+ kind: import_zod9.z.string(),
1505
+ reason: import_zod9.z.string(),
1506
+ package: import_zod9.z.string().optional(),
1507
+ driver: import_zod9.z.string().optional(),
1508
+ engine: import_zod9.z.string().optional()
1509
+ });
1510
+ var CompatViolationDivergenceSchema = import_zod9.z.object({
1511
+ type: import_zod9.z.literal("compat-violation"),
1407
1512
  ...commonFields,
1408
1513
  rule: CompatRuleRefSchema,
1409
1514
  observed: GraphEdgeSchema
1410
1515
  });
1411
- var SymbolMismatchKindSchema = import_zod8.z.enum([
1516
+ var SymbolMismatchKindSchema = import_zod9.z.enum([
1412
1517
  "missing-attribute",
1413
1518
  "missing-field",
1414
1519
  "missing-property",
1415
1520
  "missing-column",
1416
1521
  "undefined-method"
1417
1522
  ]);
1418
- var ObservedSymbolMismatchDivergenceSchema = import_zod8.z.object({
1419
- type: import_zod8.z.literal("observed-symbol-mismatch"),
1523
+ var ObservedSymbolMismatchDivergenceSchema = import_zod9.z.object({
1524
+ type: import_zod9.z.literal("observed-symbol-mismatch"),
1420
1525
  ...commonFields,
1421
1526
  mismatchKind: SymbolMismatchKindSchema,
1422
- symbol: import_zod8.z.string().optional(),
1423
- location: import_zod8.z.string().optional(),
1527
+ symbol: import_zod9.z.string().optional(),
1528
+ location: import_zod9.z.string().optional(),
1424
1529
  provenance: ProvenanceSchema,
1425
1530
  // The OBSERVED incident this fuses — its id and the raw error text — so a
1426
1531
  // consumer can trace the finding back to the recorded failure.
1427
- incidentId: import_zod8.z.string().optional(),
1428
- errorMessage: import_zod8.z.string(),
1532
+ incidentId: import_zod9.z.string().optional(),
1533
+ errorMessage: import_zod9.z.string(),
1429
1534
  // How many recorded incidents share this (node, member, mismatch) — the
1430
1535
  // failure has usually fired more than once.
1431
- incidentCount: import_zod8.z.number().int().positive().optional()
1536
+ incidentCount: import_zod9.z.number().int().positive().optional()
1432
1537
  });
1433
- var ObservedFailureKindSchema = import_zod8.z.enum([
1538
+ var ObservedFailureKindSchema = import_zod9.z.enum([
1434
1539
  "error-rate",
1435
1540
  "connection-refused",
1436
1541
  "deadline-exceeded",
@@ -1438,25 +1543,25 @@ var ObservedFailureKindSchema = import_zod8.z.enum([
1438
1543
  "unavailable",
1439
1544
  "server-error"
1440
1545
  ]);
1441
- var ObservedFailingDivergenceSchema = import_zod8.z.object({
1442
- type: import_zod8.z.literal("observed-failing"),
1546
+ var ObservedFailingDivergenceSchema = import_zod9.z.object({
1547
+ type: import_zod9.z.literal("observed-failing"),
1443
1548
  ...commonFields,
1444
1549
  failureKind: ObservedFailureKindSchema,
1445
1550
  provenance: ProvenanceSchema,
1446
1551
  // Edge locus (the observed dependency edge whose calls predominantly fail).
1447
1552
  edgeType: EdgeTypeSchema.optional(),
1448
1553
  observed: GraphEdgeSchema.optional(),
1449
- spanCount: import_zod8.z.number().int().nonnegative().optional(),
1450
- errorCount: import_zod8.z.number().int().nonnegative().optional(),
1451
- errorRate: import_zod8.z.number().min(0).max(1).optional(),
1554
+ spanCount: import_zod9.z.number().int().nonnegative().optional(),
1555
+ errorCount: import_zod9.z.number().int().nonnegative().optional(),
1556
+ errorRate: import_zod9.z.number().min(0).max(1).optional(),
1452
1557
  // Incident locus (the declared external call whose incident shows a failure).
1453
- location: import_zod8.z.string().optional(),
1454
- incidentId: import_zod8.z.string().optional(),
1455
- errorMessage: import_zod8.z.string().optional(),
1456
- incidentCount: import_zod8.z.number().int().positive().optional(),
1457
- httpStatusCode: import_zod8.z.number().int().optional()
1558
+ location: import_zod9.z.string().optional(),
1559
+ incidentId: import_zod9.z.string().optional(),
1560
+ errorMessage: import_zod9.z.string().optional(),
1561
+ incidentCount: import_zod9.z.number().int().positive().optional(),
1562
+ httpStatusCode: import_zod9.z.number().int().optional()
1458
1563
  });
1459
- var DivergenceSchema = import_zod8.z.discriminatedUnion("type", [
1564
+ var DivergenceSchema = import_zod9.z.discriminatedUnion("type", [
1460
1565
  MissingObservedDivergenceSchema,
1461
1566
  MissingExtractedDivergenceSchema,
1462
1567
  VersionMismatchDivergenceSchema,
@@ -1465,14 +1570,14 @@ var DivergenceSchema = import_zod8.z.discriminatedUnion("type", [
1465
1570
  ObservedSymbolMismatchDivergenceSchema,
1466
1571
  ObservedFailingDivergenceSchema
1467
1572
  ]);
1468
- var DivergenceResultSchema = import_zod8.z.object({
1469
- divergences: import_zod8.z.array(DivergenceSchema),
1470
- totalAffected: import_zod8.z.number().int().nonnegative(),
1573
+ var DivergenceResultSchema = import_zod9.z.object({
1574
+ divergences: import_zod9.z.array(DivergenceSchema),
1575
+ totalAffected: import_zod9.z.number().int().nonnegative(),
1471
1576
  // ISO8601 timestamp the result was computed at. Each call re-derives from
1472
1577
  // the live graph — there is no persisted divergence history.
1473
- computedAt: import_zod8.z.string().datetime()
1578
+ computedAt: import_zod9.z.string().datetime()
1474
1579
  });
1475
- var DivergenceTypeSchema = import_zod8.z.enum([
1580
+ var DivergenceTypeSchema = import_zod9.z.enum([
1476
1581
  "missing-observed",
1477
1582
  "missing-extracted",
1478
1583
  "version-mismatch",
@@ -1489,6 +1594,10 @@ var MCP_TOOL_NAMES = [
1489
1594
  "get_dependencies",
1490
1595
  "get_observed_dependencies",
1491
1596
  "get_incident_history",
1597
+ // One self-sufficient work order per incident (ADR-221): the incident fused
1598
+ // with its root-cause chain, blast radius, governing policies, and node
1599
+ // divergence, each claim provenance-stamped.
1600
+ "get_incident_card",
1492
1601
  "semantic_search",
1493
1602
  "get_graph_diff",
1494
1603
  "get_recent_stale_edges",
@@ -1510,117 +1619,117 @@ var MCP_TOOL_NAMES = [
1510
1619
  ];
1511
1620
 
1512
1621
  // src/responses.ts
1513
- var import_zod9 = require("zod");
1514
- var listEnvelope = (itemSchema) => import_zod9.z.object({
1515
- count: import_zod9.z.number().int().nonnegative(),
1516
- total: import_zod9.z.number().int().nonnegative(),
1517
- events: import_zod9.z.array(itemSchema)
1622
+ var import_zod10 = require("zod");
1623
+ var listEnvelope = (itemSchema) => import_zod10.z.object({
1624
+ count: import_zod10.z.number().int().nonnegative(),
1625
+ total: import_zod10.z.number().int().nonnegative(),
1626
+ events: import_zod10.z.array(itemSchema)
1518
1627
  });
1519
1628
  var IncidentsResponseSchema = listEnvelope(ErrorEventSchema);
1520
1629
  var StaleEventsResponseSchema = listEnvelope(StaleEventSchema);
1521
- var LogsResponseSchema = import_zod9.z.object({
1522
- count: import_zod9.z.number().int().nonnegative(),
1523
- total: import_zod9.z.number().int().nonnegative(),
1524
- logs: import_zod9.z.array(LogEntrySchema)
1630
+ var LogsResponseSchema = import_zod10.z.object({
1631
+ count: import_zod10.z.number().int().nonnegative(),
1632
+ total: import_zod10.z.number().int().nonnegative(),
1633
+ logs: import_zod10.z.array(LogEntrySchema)
1525
1634
  });
1526
- var PoliciesViolationsResponseSchema = import_zod9.z.object({
1527
- violations: import_zod9.z.array(PolicyViolationSchema)
1635
+ var PoliciesViolationsResponseSchema = import_zod10.z.object({
1636
+ violations: import_zod10.z.array(PolicyViolationSchema)
1528
1637
  });
1529
- var GraphNodeResponseSchema = import_zod9.z.object({
1638
+ var GraphNodeResponseSchema = import_zod10.z.object({
1530
1639
  node: GraphNodeSchema
1531
1640
  });
1532
- var GraphEdgesResponseSchema = import_zod9.z.object({
1533
- inbound: import_zod9.z.array(GraphEdgeSchema),
1534
- outbound: import_zod9.z.array(GraphEdgeSchema)
1641
+ var GraphEdgesResponseSchema = import_zod10.z.object({
1642
+ inbound: import_zod10.z.array(GraphEdgeSchema),
1643
+ outbound: import_zod10.z.array(GraphEdgeSchema)
1535
1644
  });
1536
- var ExtractionCoverageSchema = import_zod9.z.object({
1537
- skippedFiles: import_zod9.z.number().int().nonnegative(),
1538
- byProducer: import_zod9.z.record(import_zod9.z.number().int().nonnegative()),
1645
+ var ExtractionCoverageSchema = import_zod10.z.object({
1646
+ skippedFiles: import_zod10.z.number().int().nonnegative(),
1647
+ byProducer: import_zod10.z.record(import_zod10.z.number().int().nonnegative()),
1539
1648
  // Up to a bounded sample of the files that failed to parse this pass.
1540
- files: import_zod9.z.array(import_zod9.z.string()),
1541
- updatedAt: import_zod9.z.string()
1649
+ files: import_zod10.z.array(import_zod10.z.string()),
1650
+ updatedAt: import_zod10.z.string()
1542
1651
  });
1543
- var HealthResponseSchema = import_zod9.z.object({
1544
- ok: import_zod9.z.boolean(),
1545
- project: import_zod9.z.string(),
1546
- uptimeMs: import_zod9.z.number().int().nonnegative(),
1652
+ var HealthResponseSchema = import_zod10.z.object({
1653
+ ok: import_zod10.z.boolean(),
1654
+ project: import_zod10.z.string(),
1655
+ uptimeMs: import_zod10.z.number().int().nonnegative(),
1547
1656
  // Present when the most recent extraction pass recorded its coverage (#883).
1548
1657
  coverage: ExtractionCoverageSchema.optional()
1549
1658
  }).passthrough();
1550
- var DaemonHealthResponseSchema = import_zod9.z.object({
1551
- ok: import_zod9.z.boolean(),
1552
- uptimeMs: import_zod9.z.number().int().nonnegative(),
1553
- projects: import_zod9.z.array(
1554
- import_zod9.z.object({
1555
- name: import_zod9.z.string(),
1556
- nodeCount: import_zod9.z.number().int().nonnegative(),
1557
- edgeCount: import_zod9.z.number().int().nonnegative()
1659
+ var DaemonHealthResponseSchema = import_zod10.z.object({
1660
+ ok: import_zod10.z.boolean(),
1661
+ uptimeMs: import_zod10.z.number().int().nonnegative(),
1662
+ projects: import_zod10.z.array(
1663
+ import_zod10.z.object({
1664
+ name: import_zod10.z.string(),
1665
+ nodeCount: import_zod10.z.number().int().nonnegative(),
1666
+ edgeCount: import_zod10.z.number().int().nonnegative()
1558
1667
  }).passthrough()
1559
1668
  )
1560
1669
  }).passthrough();
1561
1670
  var ProjectListEntrySchema = RegistryEntrySchema.extend({
1562
- hostedHere: import_zod9.z.boolean()
1671
+ hostedHere: import_zod10.z.boolean()
1563
1672
  });
1564
- var ProjectServedBySchema = import_zod9.z.object({
1565
- path: import_zod9.z.string(),
1566
- restPort: import_zod9.z.number().int(),
1567
- live: import_zod9.z.boolean()
1673
+ var ProjectServedBySchema = import_zod10.z.object({
1674
+ path: import_zod10.z.string(),
1675
+ restPort: import_zod10.z.number().int(),
1676
+ live: import_zod10.z.boolean()
1568
1677
  });
1569
- var SingleProjectResponseSchema = import_zod9.z.object({
1678
+ var SingleProjectResponseSchema = import_zod10.z.object({
1570
1679
  project: ProjectListEntrySchema,
1571
1680
  // Present only when this daemon does not host the project but another daemon
1572
1681
  // on the machine does — names where it actually lives (#884).
1573
1682
  servedBy: ProjectServedBySchema.optional()
1574
1683
  });
1575
- var ConnectorPollStateSchema = import_zod9.z.enum(["idle", "healthy", "error", "stale"]);
1576
- var ConnectorStatusSchema = import_zod9.z.object({
1684
+ var ConnectorPollStateSchema = import_zod10.z.enum(["idle", "healthy", "error", "stale"]);
1685
+ var ConnectorStatusSchema = import_zod10.z.object({
1577
1686
  state: ConnectorPollStateSchema,
1578
- lastPollAt: import_zod9.z.string().nullable(),
1579
- lastOutcome: import_zod9.z.enum(["ok", "error"]).nullable(),
1580
- lastError: import_zod9.z.string().nullable(),
1581
- signalsLastPoll: import_zod9.z.number().int().nonnegative()
1582
- });
1583
- var ConnectorStatusEntrySchema = import_zod9.z.object({
1584
- id: import_zod9.z.string(),
1585
- provider: import_zod9.z.string(),
1586
- credentialRef: import_zod9.z.union([import_zod9.z.string(), import_zod9.z.record(import_zod9.z.string(), import_zod9.z.string())]),
1687
+ lastPollAt: import_zod10.z.string().nullable(),
1688
+ lastOutcome: import_zod10.z.enum(["ok", "error"]).nullable(),
1689
+ lastError: import_zod10.z.string().nullable(),
1690
+ signalsLastPoll: import_zod10.z.number().int().nonnegative()
1691
+ });
1692
+ var ConnectorStatusEntrySchema = import_zod10.z.object({
1693
+ id: import_zod10.z.string(),
1694
+ provider: import_zod10.z.string(),
1695
+ credentialRef: import_zod10.z.union([import_zod10.z.string(), import_zod10.z.record(import_zod10.z.string(), import_zod10.z.string())]),
1587
1696
  status: ConnectorStatusSchema
1588
1697
  });
1589
- var ConnectorsStatusResponseSchema = import_zod9.z.object({
1590
- connectors: import_zod9.z.array(ConnectorStatusEntrySchema)
1591
- });
1592
- var SearchMatchSchema = import_zod9.z.object({ score: import_zod9.z.number() }).passthrough();
1593
- var SearchResponseSchema = import_zod9.z.object({
1594
- query: import_zod9.z.string(),
1595
- provider: import_zod9.z.string(),
1596
- matches: import_zod9.z.array(SearchMatchSchema)
1597
- });
1598
- var SerializedGraphSchema = import_zod9.z.object({
1599
- nodes: import_zod9.z.array(GraphNodeSchema),
1600
- edges: import_zod9.z.array(GraphEdgeSchema)
1601
- });
1602
- var GraphDiffResultSchema = import_zod9.z.object({
1603
- base: import_zod9.z.object({ exportedAt: import_zod9.z.string().optional() }),
1604
- current: import_zod9.z.object({ exportedAt: import_zod9.z.string() }),
1605
- added: import_zod9.z.object({
1606
- nodes: import_zod9.z.array(GraphNodeSchema),
1607
- edges: import_zod9.z.array(GraphEdgeSchema)
1698
+ var ConnectorsStatusResponseSchema = import_zod10.z.object({
1699
+ connectors: import_zod10.z.array(ConnectorStatusEntrySchema)
1700
+ });
1701
+ var SearchMatchSchema = import_zod10.z.object({ score: import_zod10.z.number() }).passthrough();
1702
+ var SearchResponseSchema = import_zod10.z.object({
1703
+ query: import_zod10.z.string(),
1704
+ provider: import_zod10.z.string(),
1705
+ matches: import_zod10.z.array(SearchMatchSchema)
1706
+ });
1707
+ var SerializedGraphSchema = import_zod10.z.object({
1708
+ nodes: import_zod10.z.array(GraphNodeSchema),
1709
+ edges: import_zod10.z.array(GraphEdgeSchema)
1710
+ });
1711
+ var GraphDiffResultSchema = import_zod10.z.object({
1712
+ base: import_zod10.z.object({ exportedAt: import_zod10.z.string().optional() }),
1713
+ current: import_zod10.z.object({ exportedAt: import_zod10.z.string() }),
1714
+ added: import_zod10.z.object({
1715
+ nodes: import_zod10.z.array(GraphNodeSchema),
1716
+ edges: import_zod10.z.array(GraphEdgeSchema)
1608
1717
  }),
1609
- removed: import_zod9.z.object({
1610
- nodes: import_zod9.z.array(GraphNodeSchema),
1611
- edges: import_zod9.z.array(GraphEdgeSchema)
1718
+ removed: import_zod10.z.object({
1719
+ nodes: import_zod10.z.array(GraphNodeSchema),
1720
+ edges: import_zod10.z.array(GraphEdgeSchema)
1612
1721
  }),
1613
- changed: import_zod9.z.object({
1614
- nodes: import_zod9.z.array(
1615
- import_zod9.z.object({
1616
- id: import_zod9.z.string(),
1722
+ changed: import_zod10.z.object({
1723
+ nodes: import_zod10.z.array(
1724
+ import_zod10.z.object({
1725
+ id: import_zod10.z.string(),
1617
1726
  before: GraphNodeSchema,
1618
1727
  after: GraphNodeSchema
1619
1728
  })
1620
1729
  ),
1621
- edges: import_zod9.z.array(
1622
- import_zod9.z.object({
1623
- id: import_zod9.z.string(),
1730
+ edges: import_zod10.z.array(
1731
+ import_zod10.z.object({
1732
+ id: import_zod10.z.string(),
1624
1733
  before: GraphEdgeSchema,
1625
1734
  after: GraphEdgeSchema
1626
1735
  })
@@ -1742,6 +1851,15 @@ function passesExtractedFloor(confidence) {
1742
1851
  HealthResponseSchema,
1743
1852
  HostMismatchDivergenceSchema,
1744
1853
  HypotheticalActionSchema,
1854
+ IncidentBlastRadiusSchema,
1855
+ IncidentCardSchema,
1856
+ IncidentChainHopSchema,
1857
+ IncidentDivergenceSchema,
1858
+ IncidentEventPayloadSchema,
1859
+ IncidentKindSchema,
1860
+ IncidentLocusSchema,
1861
+ IncidentPolicySchema,
1862
+ IncidentRootCauseSchema,
1745
1863
  IncidentsResponseSchema,
1746
1864
  InfraNodeSchema,
1747
1865
  LatencyMsSchema,
@@ -1810,6 +1928,7 @@ function passesExtractedFloor(confidence) {
1810
1928
  frontierId,
1811
1929
  graphqlOperationId,
1812
1930
  grpcMethodId,
1931
+ incidentKindOf,
1813
1932
  inferredEdgeId,
1814
1933
  infraId,
1815
1934
  localDatabaseId,