pi-radar 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +8 -10
  2. package/dist/extension/baseline.js +343 -361
  3. package/dist/extension/radar-children.js +108 -218
  4. package/dist/extension/radar-client.js +103 -15
  5. package/dist/extension/radar-execution.js +26 -17
  6. package/dist/extension/radar-inspection.js +0 -45
  7. package/dist/extension/radar-launch.js +24 -185
  8. package/dist/extension/radar-publication.js +26 -17
  9. package/dist/extension/radar-runtime.js +1 -1
  10. package/dist/index.js +317 -488
  11. package/extension/generated-contracts.ts +362 -13
  12. package/extension/radar-children.ts +60 -155
  13. package/extension/radar-client.ts +130 -19
  14. package/extension/radar-inspection.ts +2 -77
  15. package/extension/radar-launch.ts +52 -391
  16. package/extension/radar-publication.ts +36 -53
  17. package/extension/radar-runtime.ts +1 -1
  18. package/package.json +1 -1
  19. package/schema/public/v1/observation-get-response.deserialize.schema.json +5 -25
  20. package/schema/public/v1/observation-get-response.serialize.schema.json +7 -29
  21. package/schema/public/v1/observation-snapshot.deserialize.schema.json +5 -25
  22. package/schema/public/v1/observation-snapshot.serialize.schema.json +7 -29
  23. package/schema/public/v1/spawn-list-page.deserialize.schema.json +40 -17
  24. package/schema/public/v1/spawn-list-page.serialize.schema.json +40 -17
  25. package/schema/public/v1/subject-assignment-acquire.deserialize.schema.json +78 -0
  26. package/schema/public/v1/subject-assignment-acquire.serialize.schema.json +79 -0
  27. package/schema/public/v1/subject-assignment-publish.deserialize.schema.json +310 -0
  28. package/schema/public/v1/subject-assignment-publish.serialize.schema.json +310 -0
  29. package/schema/public/v1/subject-assignment-retire.deserialize.schema.json +22 -0
  30. package/schema/public/v1/subject-assignment-retire.serialize.schema.json +22 -0
  31. package/schema/public/v1/subject-child-get-params.deserialize.schema.json +18 -0
  32. package/schema/public/v1/subject-child-get-params.serialize.schema.json +18 -0
  33. package/schema/public/v1/subject-children-params.deserialize.schema.json +51 -0
  34. package/schema/public/v1/subject-children-params.serialize.schema.json +54 -0
  35. package/schema/public/v1/subject-get-params.deserialize.schema.json +14 -0
  36. package/schema/public/v1/subject-get-params.serialize.schema.json +14 -0
  37. package/schema/public/v1/subject-get-result.deserialize.schema.json +566 -0
  38. package/schema/public/v1/subject-get-result.serialize.schema.json +573 -0
  39. package/schema/public/v1/subject-list-params.deserialize.schema.json +38 -0
  40. package/schema/public/v1/subject-list-params.serialize.schema.json +43 -0
  41. package/schema/public/v1/subject-list-result.deserialize.schema.json +575 -0
  42. package/schema/public/v1/subject-list-result.serialize.schema.json +583 -0
@@ -318,7 +318,7 @@ type PendingPublish = {
318
318
 
319
319
  type ChannelRecord = {
320
320
  version: typeof RADAR_PUBLICATION_VERSION;
321
- registration_id: string;
321
+ target_id: string;
322
322
  channel: RadarChannel;
323
323
  publisher: RadarPublisherIdentity;
324
324
  writer?: { handle: string; generation: number };
@@ -353,10 +353,11 @@ type ContextRecord = {
353
353
  diagnostic?: string;
354
354
  };
355
355
 
356
- /** What a managed child tells its owner: which exact subject to publish about. */
356
+ /** What a managed child tells its owner: which subject to address, once granted. */
357
357
  export type RadarChildBinding = {
358
358
  version: typeof RADAR_PUBLICATION_VERSION;
359
359
  registration_id: string;
360
+ subject_id?: string;
360
361
  incarnation: string;
361
362
  run: string;
362
363
  owner: string;
@@ -571,36 +572,6 @@ function pendingAt(
571
572
  return { sequence, snapshot, lease_ms: lease, observed_at: observed };
572
573
  }
573
574
 
574
- const CONTEXT_PENDING_KEYS = "lease_ms,observed_at,sequence,session";
575
- const CONTEXT_ACCEPTED_KEYS = "lease_ms,observed_at,sent_at,sequence,session";
576
- // Records written before session-bound management also carry a launch-identity
577
- // marker. It is read past and never used: the attached subject is the identity.
578
- const CONTEXT_PENDING_LEGACY_KEYS = "launch_identity,lease_ms,observed_at,sequence,session";
579
- const CONTEXT_ACCEPTED_LEGACY_KEYS = "launch_identity,lease_ms,observed_at,sent_at,sequence,session";
580
-
581
- /** The reported session, or `undefined` when the field is not one of the two. */
582
- function sessionAt(value: unknown): string | null | undefined {
583
- if (typeof value !== "object" || value === null) return undefined;
584
- const found = (value as Record<string, unknown>).session;
585
- if (found === null) return null;
586
- return typeof found === "string" ? found : undefined;
587
- }
588
-
589
- function contextReportAt(
590
- value: unknown,
591
- keys: string,
592
- legacyKeys: string,
593
- ): ContextReport | undefined {
594
- if (!exactKeys(value, keys) && !exactKeys(value, legacyKeys)) return undefined;
595
- const sequence = numberAt(value, "sequence");
596
- const lease = numberAt(value, "lease_ms");
597
- const observed = textAt(value, "observed_at");
598
- const session = sessionAt(value);
599
- if (sequence === undefined || sequence < 1) return undefined;
600
- if (lease === undefined || observed === undefined || session === undefined)
601
- return undefined;
602
- return { sequence, session, lease_ms: lease, observed_at: observed };
603
- }
604
575
 
605
576
  export type RadarFactsWriter = Omit<RadarChannelWriter, "update"> & {
606
577
  update(snapshot: RadarFactsSnapshot): void;
@@ -652,16 +623,21 @@ function createChannelWriter(input: ChannelWriterInput): RadarChannelWriter {
652
623
  function blank(agentId: string): ChannelRecord {
653
624
  return {
654
625
  version: RADAR_PUBLICATION_VERSION,
655
- registration_id: agentId,
626
+ target_id: agentId,
656
627
  channel,
657
628
  publisher,
658
629
  sequence: 0,
659
630
  };
660
631
  }
661
632
 
633
+ /** An assignment names a child subject; every other channel names a process. */
634
+ function addressed(target: string): { registration_id: string } | { subject_id: string } {
635
+ return channel === "assignment" ? { subject_id: target } : { registration_id: target };
636
+ }
637
+
662
638
  function loadRecord(): ChannelRecord {
663
639
  const value = store.read(recordName);
664
- const agentId = textAt(value, "registration_id");
640
+ const agentId = textAt(value, "target_id");
665
641
  const storedPublisher = recordAt(value, "publisher");
666
642
  // A record written for another channel or publisher is not this writer's
667
643
  // binding: adopting it would publish under someone else's identity.
@@ -689,7 +665,7 @@ function createChannelWriter(input: ChannelWriterInput): RadarChannelWriter {
689
665
  const sentAt = numberAt(acceptedValue, "sent_at");
690
666
  return {
691
667
  version: RADAR_PUBLICATION_VERSION,
692
- registration_id: agentId,
668
+ target_id: agentId,
693
669
  channel,
694
670
  publisher,
695
671
  ...(handle !== undefined && generation !== undefined
@@ -757,18 +733,14 @@ function createChannelWriter(input: ChannelWriterInput): RadarChannelWriter {
757
733
  // identical immutable content that was persisted with it.
758
734
  const agentId = await input.subject(recovering);
759
735
  if (agentId === undefined) return false;
760
- if (record.registration_id !== agentId) {
736
+ if (record.target_id !== agentId) {
761
737
  // A different subject incarnation is a different channel: the previous
762
738
  // binding, sequence and unresolved request do not apply to it, so the
763
739
  // next drain publishes a complete snapshot instead of replaying one.
764
740
  record = blank(agentId);
765
741
  save();
766
742
  }
767
- const answer = await client.acquire({
768
- registration_id: agentId,
769
- channel,
770
- publisher,
771
- });
743
+ const answer = await client.acquire({...addressed(agentId), channel, publisher});
772
744
  if (answer.ok === false) {
773
745
  if (answer.code === "not_found") {
774
746
  // The daemon has lost this subject. The identical immutable content is
@@ -805,15 +777,12 @@ function createChannelWriter(input: ChannelWriterInput): RadarChannelWriter {
805
777
  async function send(pending: PendingPublish): Promise<void> {
806
778
  const writer = record.writer;
807
779
  if (writer === undefined) return;
808
- const answer = await client.publish({
809
- registration_id: record.registration_id,
810
- channel,
780
+ const answer = await client.publish({...addressed(record.target_id), channel,
811
781
  writer_handle: writer.handle,
812
782
  sequence: pending.sequence,
813
783
  lease_ms: pending.lease_ms,
814
784
  observed_at: pending.observed_at,
815
- snapshot: pending.snapshot,
816
- });
785
+ snapshot: pending.snapshot,});
817
786
  if (answer.ok === true) {
818
787
  recovering = false;
819
788
  record.sequence = Math.max(record.sequence, answer.value.sequence);
@@ -919,10 +888,9 @@ function createChannelWriter(input: ChannelWriterInput): RadarChannelWriter {
919
888
  stopPump();
920
889
  const writer = record.writer;
921
890
  if (writer === undefined) return;
922
- const agentId = record.registration_id;
891
+ const agentId = record.target_id;
923
892
  try {
924
- void client
925
- .retire({ registration_id: agentId, channel, writer_handle: writer.handle })
893
+ void client.retire({...addressed(agentId), channel, writer_handle: writer.handle})
926
894
  .then((answer) => {
927
895
  if (answer.ok === true) {
928
896
  try {
@@ -970,6 +938,8 @@ type PresenceReporterInput = {
970
938
  scheduler: RadarScheduler;
971
939
  recordName: string;
972
940
  registration(): Promise<RadarRegistration | undefined>;
941
+ /** The subject Radar granted this process's session, when it granted one. */
942
+ granted?(subjectId: string): void;
973
943
  heartbeatMs: number;
974
944
  };
975
945
 
@@ -1052,6 +1022,7 @@ function createPresenceReporter(input: PresenceReporterInput): RadarPresenceRepo
1052
1022
  }
1053
1023
  claim.registration_id = answer.value.registration_id;
1054
1024
  claim.subject_id = answer.value.standing === "granted" ? answer.value.subject_id ?? undefined : undefined;
1025
+ if (claim.subject_id !== undefined) input.granted?.(claim.subject_id);
1055
1026
  standing = answer.value.standing === "granted"
1056
1027
  ? { state: "managed", subject_id: claim.subject_id! }
1057
1028
  : answer.value.standing === "duplicate"
@@ -1365,7 +1336,7 @@ function createRadarPublicationInner(
1365
1336
  agentId = registered;
1366
1337
  processRecord = { ...record, registration_id: agentId };
1367
1338
  store.write(registrationName, processRecord);
1368
- if (options.binding !== undefined) writeBinding(options.binding);
1339
+ if (options.binding !== undefined) writeBinding(options.binding, grantedSubject());
1369
1340
  return agentId;
1370
1341
  })();
1371
1342
  try {
@@ -1375,16 +1346,23 @@ function createRadarPublicationInner(
1375
1346
  }
1376
1347
  }
1377
1348
 
1349
+ /** The subject Radar granted this process, once presence has been answered. */
1350
+ function grantedSubject(): string | undefined {
1351
+ const standing = presence.management();
1352
+ return standing?.state === "managed" ? standing.subject_id : undefined;
1353
+ }
1354
+
1378
1355
  function writeBinding(binding: {
1379
1356
  key: string;
1380
1357
  run: string;
1381
1358
  owner: string;
1382
1359
  label: string;
1383
- }): void {
1360
+ }, subjectId?: string): void {
1384
1361
  if (agentId === undefined) return;
1385
1362
  store.write(`bindings/${binding.key}.json`, {
1386
1363
  version: RADAR_PUBLICATION_VERSION,
1387
1364
  registration_id: agentId,
1365
+ ...(subjectId !== undefined ? { subject_id: subjectId } : {}),
1388
1366
  incarnation,
1389
1367
  run: binding.run,
1390
1368
  owner: binding.owner,
@@ -1426,6 +1404,9 @@ function createRadarPublicationInner(
1426
1404
  ...(launchRegistrationId ? { registration_id: launchRegistrationId } : {}),
1427
1405
  };
1428
1406
  },
1407
+ granted: (subjectId) => {
1408
+ if (options.binding !== undefined) writeBinding(options.binding, subjectId);
1409
+ },
1429
1410
  heartbeatMs: options.heartbeatMs ?? RADAR_HEARTBEAT_MS,
1430
1411
  });
1431
1412
 
@@ -1460,8 +1441,7 @@ function createRadarPublicationInner(
1460
1441
  channel: "assignment",
1461
1442
  publisher: publisher("herdsman-owner", reportingOwner),
1462
1443
  codec: assignmentCodec,
1463
- // The owner publishes about a subject it did not register: the exact
1464
- // registration_id from the child's sidecar is the whole correlation.
1444
+ // Radar owns this assignment across the child's process replacements.
1465
1445
  subject: async () => target,
1466
1446
  leaseMs: options.leaseMs ?? RADAR_LEASE_MS,
1467
1447
  heartbeatMs: options.heartbeatMs ?? RADAR_HEARTBEAT_MS,
@@ -1482,6 +1462,7 @@ function createRadarPublicationInner(
1482
1462
  return undefined;
1483
1463
  }
1484
1464
  const bound = textAt(value, "registration_id");
1465
+ const subjectId = textAt(value, "subject_id");
1485
1466
  const boundIncarnation = textAt(value, "incarnation");
1486
1467
  const run = textAt(value, "run");
1487
1468
  const owner = textAt(value, "owner");
@@ -1491,6 +1472,7 @@ function createRadarPublicationInner(
1491
1472
  // identity is ever used as a channel target.
1492
1473
  if (
1493
1474
  !isUuid(bound) ||
1475
+ (subjectId !== undefined && !isUuid(subjectId)) ||
1494
1476
  !isUuid(boundIncarnation) ||
1495
1477
  run === undefined ||
1496
1478
  owner === undefined ||
@@ -1501,6 +1483,7 @@ function createRadarPublicationInner(
1501
1483
  return {
1502
1484
  version: RADAR_PUBLICATION_VERSION,
1503
1485
  registration_id: bound,
1486
+ ...(subjectId !== undefined ? { subject_id: subjectId } : {}),
1504
1487
  incarnation: boundIncarnation,
1505
1488
  run,
1506
1489
  owner,
@@ -5,7 +5,7 @@ import type { RadarPublication } from "./radar-publication.ts";
5
5
 
6
6
  /** The event channel through which Pi extensions obtain the baseline runtime. */
7
7
  export const RADAR_RUNTIME_REQUEST = "pi-radar/runtime-request";
8
- export const RADAR_RUNTIME_VERSION = 3 as const;
8
+ export const RADAR_RUNTIME_VERSION = 5 as const;
9
9
 
10
10
  /** The sole baseline publisher's session-scoped runtime, shared with consumers. */
11
11
  export type RadarRuntimeServices = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-radar",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "description": "Radar daemon client, communication, publication, execution, location, launch and inspection surface for Pi extensions.",
6
6
  "license": "Apache-2.0",
@@ -732,7 +732,7 @@
732
732
  "type": "array"
733
733
  },
734
734
  "context_usage": {
735
- "description": "The percentage a Herdr token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
735
+ "description": "The percentage a background-task token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
736
736
  "type": [
737
737
  "string",
738
738
  "null"
@@ -757,7 +757,7 @@
757
757
  ]
758
758
  },
759
759
  "label": {
760
- "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. Herdr's\nown agent name truncates it and its title welds it to the task.",
760
+ "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. The backend's\nown agent name truncates it and its title welds it to the task.",
761
761
  "type": [
762
762
  "string",
763
763
  "null"
@@ -893,12 +893,6 @@
893
893
  },
894
894
  "subject_id": {
895
895
  "type": "string"
896
- },
897
- "successor": {
898
- "type": [
899
- "string",
900
- "null"
901
- ]
902
896
  }
903
897
  },
904
898
  "required": [
@@ -968,7 +962,7 @@
968
962
  "type": "object"
969
963
  },
970
964
  "Location": {
971
- "description": "Connector-scoped runtime location: Herdr workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
965
+ "description": "Backend-scoped runtime location: workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
972
966
  "properties": {
973
967
  "pane_id": {
974
968
  "type": "string"
@@ -1040,9 +1034,6 @@
1040
1034
  "claim_id": {
1041
1035
  "type": "string"
1042
1036
  },
1043
- "identity_unresolved": {
1044
- "type": "boolean"
1045
- },
1046
1037
  "metadata": {
1047
1038
  "$ref": "#/$defs/ManagedMetadata"
1048
1039
  },
@@ -1060,19 +1051,12 @@
1060
1051
  },
1061
1052
  "subject_id": {
1062
1053
  "type": "string"
1063
- },
1064
- "successor": {
1065
- "type": [
1066
- "string",
1067
- "null"
1068
- ]
1069
1054
  }
1070
1055
  },
1071
1056
  "required": [
1072
1057
  "subject_id",
1073
1058
  "claim_id",
1074
1059
  "process",
1075
- "identity_unresolved",
1076
1060
  "metadata",
1077
1061
  "state"
1078
1062
  ],
@@ -1631,9 +1615,6 @@
1631
1615
  "channel": {
1632
1616
  "$ref": "#/$defs/Channel"
1633
1617
  },
1634
- "registration_id": {
1635
- "type": "string"
1636
- },
1637
1618
  "snapshot": {
1638
1619
  "anyOf": [
1639
1620
  {
@@ -1655,7 +1636,6 @@
1655
1636
  },
1656
1637
  "required": [
1657
1638
  "version",
1658
- "registration_id",
1659
1639
  "channel",
1660
1640
  "writer"
1661
1641
  ],
@@ -2464,7 +2444,7 @@
2464
2444
  ]
2465
2445
  },
2466
2446
  "Tab": {
2467
- "description": "A Herdr tab within a workspace; shown as location detail, not a tree level.",
2447
+ "description": "A tab within a workspace; shown as location detail, not a tree level.",
2468
2448
  "properties": {
2469
2449
  "label": {
2470
2450
  "type": [
@@ -2690,7 +2670,7 @@
2690
2670
  ]
2691
2671
  },
2692
2672
  "Workspace": {
2693
- "description": "A Herdr workspace: the first display grouping for the fleet tree.",
2673
+ "description": "A workspace: the first display grouping for the fleet tree.",
2694
2674
  "properties": {
2695
2675
  "label": {
2696
2676
  "type": [
@@ -758,7 +758,7 @@
758
758
  "type": "array"
759
759
  },
760
760
  "context_usage": {
761
- "description": "The percentage a Herdr token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
761
+ "description": "The percentage a background-task token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
762
762
  "type": [
763
763
  "string",
764
764
  "null"
@@ -783,7 +783,7 @@
783
783
  ]
784
784
  },
785
785
  "label": {
786
- "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. Herdr's\nown agent name truncates it and its title welds it to the task.",
786
+ "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. The backend's\nown agent name truncates it and its title welds it to the task.",
787
787
  "type": [
788
788
  "string",
789
789
  "null"
@@ -941,12 +941,6 @@
941
941
  },
942
942
  "subject_id": {
943
943
  "type": "string"
944
- },
945
- "successor": {
946
- "type": [
947
- "string",
948
- "null"
949
- ]
950
944
  }
951
945
  },
952
946
  "required": [
@@ -954,8 +948,7 @@
954
948
  "bound_registration_id",
955
949
  "process",
956
950
  "state",
957
- "session",
958
- "successor"
951
+ "session"
959
952
  ],
960
953
  "type": "object"
961
954
  },
@@ -1026,7 +1019,7 @@
1026
1019
  },
1027
1020
  "Location": {
1028
1021
  "additionalProperties": false,
1029
- "description": "Connector-scoped runtime location: Herdr workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
1022
+ "description": "Backend-scoped runtime location: workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
1030
1023
  "properties": {
1031
1024
  "pane_id": {
1032
1025
  "type": "string"
@@ -1099,9 +1092,6 @@
1099
1092
  "claim_id": {
1100
1093
  "type": "string"
1101
1094
  },
1102
- "identity_unresolved": {
1103
- "type": "boolean"
1104
- },
1105
1095
  "metadata": {
1106
1096
  "$ref": "#/$defs/ManagedMetadata"
1107
1097
  },
@@ -1119,24 +1109,16 @@
1119
1109
  },
1120
1110
  "subject_id": {
1121
1111
  "type": "string"
1122
- },
1123
- "successor": {
1124
- "type": [
1125
- "string",
1126
- "null"
1127
- ]
1128
1112
  }
1129
1113
  },
1130
1114
  "required": [
1131
1115
  "subject_id",
1132
1116
  "claim_id",
1133
1117
  "process",
1134
- "identity_unresolved",
1135
1118
  "metadata",
1136
1119
  "child_close",
1137
1120
  "state",
1138
- "session",
1139
- "successor"
1121
+ "session"
1140
1122
  ],
1141
1123
  "type": "object"
1142
1124
  },
@@ -1729,9 +1711,6 @@
1729
1711
  "channel": {
1730
1712
  "$ref": "#/$defs/Channel"
1731
1713
  },
1732
- "registration_id": {
1733
- "type": "string"
1734
- },
1735
1714
  "snapshot": {
1736
1715
  "anyOf": [
1737
1716
  {
@@ -1753,7 +1732,6 @@
1753
1732
  },
1754
1733
  "required": [
1755
1734
  "version",
1756
- "registration_id",
1757
1735
  "channel",
1758
1736
  "writer"
1759
1737
  ],
@@ -2584,7 +2562,7 @@
2584
2562
  },
2585
2563
  "Tab": {
2586
2564
  "additionalProperties": false,
2587
- "description": "A Herdr tab within a workspace; shown as location detail, not a tree level.",
2565
+ "description": "A tab within a workspace; shown as location detail, not a tree level.",
2588
2566
  "properties": {
2589
2567
  "label": {
2590
2568
  "type": [
@@ -2819,7 +2797,7 @@
2819
2797
  },
2820
2798
  "Workspace": {
2821
2799
  "additionalProperties": false,
2822
- "description": "A Herdr workspace: the first display grouping for the fleet tree.",
2800
+ "description": "A workspace: the first display grouping for the fleet tree.",
2823
2801
  "properties": {
2824
2802
  "label": {
2825
2803
  "type": [
@@ -732,7 +732,7 @@
732
732
  "type": "array"
733
733
  },
734
734
  "context_usage": {
735
- "description": "The percentage a Herdr token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
735
+ "description": "The percentage a background-task token states, percent sign included. It carries no\ncounts, so it is never presented as a typed window.",
736
736
  "type": [
737
737
  "string",
738
738
  "null"
@@ -757,7 +757,7 @@
757
757
  ]
758
758
  },
759
759
  "label": {
760
- "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. Herdr's\nown agent name truncates it and its title welds it to the task.",
760
+ "description": "A managed worker's runtime label: the name its owner and its siblings\nuse for it, and the only faithful source for a worker's name. The backend's\nown agent name truncates it and its title welds it to the task.",
761
761
  "type": [
762
762
  "string",
763
763
  "null"
@@ -893,12 +893,6 @@
893
893
  },
894
894
  "subject_id": {
895
895
  "type": "string"
896
- },
897
- "successor": {
898
- "type": [
899
- "string",
900
- "null"
901
- ]
902
896
  }
903
897
  },
904
898
  "required": [
@@ -968,7 +962,7 @@
968
962
  "type": "object"
969
963
  },
970
964
  "Location": {
971
- "description": "Connector-scoped runtime location: Herdr workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
965
+ "description": "Backend-scoped runtime location: workspace, tab and pane identifiers.\n\nPane identity is a runtime location detail; it is never an agent identity.",
972
966
  "properties": {
973
967
  "pane_id": {
974
968
  "type": "string"
@@ -1040,9 +1034,6 @@
1040
1034
  "claim_id": {
1041
1035
  "type": "string"
1042
1036
  },
1043
- "identity_unresolved": {
1044
- "type": "boolean"
1045
- },
1046
1037
  "metadata": {
1047
1038
  "$ref": "#/$defs/ManagedMetadata"
1048
1039
  },
@@ -1060,19 +1051,12 @@
1060
1051
  },
1061
1052
  "subject_id": {
1062
1053
  "type": "string"
1063
- },
1064
- "successor": {
1065
- "type": [
1066
- "string",
1067
- "null"
1068
- ]
1069
1054
  }
1070
1055
  },
1071
1056
  "required": [
1072
1057
  "subject_id",
1073
1058
  "claim_id",
1074
1059
  "process",
1075
- "identity_unresolved",
1076
1060
  "metadata",
1077
1061
  "state"
1078
1062
  ],
@@ -1496,9 +1480,6 @@
1496
1480
  "channel": {
1497
1481
  "$ref": "#/$defs/Channel"
1498
1482
  },
1499
- "registration_id": {
1500
- "type": "string"
1501
- },
1502
1483
  "snapshot": {
1503
1484
  "anyOf": [
1504
1485
  {
@@ -1520,7 +1501,6 @@
1520
1501
  },
1521
1502
  "required": [
1522
1503
  "version",
1523
- "registration_id",
1524
1504
  "channel",
1525
1505
  "writer"
1526
1506
  ],
@@ -2329,7 +2309,7 @@
2329
2309
  ]
2330
2310
  },
2331
2311
  "Tab": {
2332
- "description": "A Herdr tab within a workspace; shown as location detail, not a tree level.",
2312
+ "description": "A tab within a workspace; shown as location detail, not a tree level.",
2333
2313
  "properties": {
2334
2314
  "label": {
2335
2315
  "type": [
@@ -2555,7 +2535,7 @@
2555
2535
  ]
2556
2536
  },
2557
2537
  "Workspace": {
2558
- "description": "A Herdr workspace: the first display grouping for the fleet tree.",
2538
+ "description": "A workspace: the first display grouping for the fleet tree.",
2559
2539
  "properties": {
2560
2540
  "label": {
2561
2541
  "type": [