pi-radar 0.1.0 → 0.3.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.
- package/README.md +14 -6
- package/dist/extension/baseline.js +2740 -0
- package/dist/extension/radar-client.js +97 -2
- package/dist/extension/radar-communication.js +39 -0
- package/dist/extension/radar-execution.js +148 -16
- package/dist/extension/radar-launch.js +5 -0
- package/dist/extension/radar-location.js +2 -2
- package/dist/extension/radar-publication.js +67 -15
- package/dist/extension/radar-runtime.js +42 -0
- package/dist/extension/radar-session-marker.js +82 -0
- package/dist/index.js +340 -21
- package/extension/baseline.ts +39 -0
- package/extension/generated-contracts.ts +85 -0
- package/extension/radar-client.ts +140 -1
- package/extension/radar-communication.ts +66 -0
- package/extension/radar-execution.ts +56 -3
- package/extension/radar-launch.ts +8 -1
- package/extension/radar-location.ts +2 -2
- package/extension/radar-publication.ts +73 -12
- package/extension/radar-runtime.ts +97 -0
- package/extension/radar-session-marker.ts +146 -0
- package/index.ts +2 -0
- package/package.json +24 -5
- package/schema/public/v1/handoff-inbox.deserialize.schema.json +18 -0
- package/schema/public/v1/handoff-inbox.serialize.schema.json +18 -0
- package/schema/public/v1/handoff-publish-params.deserialize.schema.json +33 -0
- package/schema/public/v1/handoff-publish-params.serialize.schema.json +33 -0
- package/schema/public/v1/handoff-receipt.deserialize.schema.json +66 -0
- package/schema/public/v1/handoff-receipt.serialize.schema.json +66 -0
- package/schema/public/v1/handoff.deserialize.schema.json +84 -0
- package/schema/public/v1/handoff.serialize.schema.json +84 -0
- package/schema/public/v1/launch-identity-marker.deserialize.schema.json +32 -0
- package/schema/public/v1/launch-identity-marker.serialize.schema.json +32 -0
- package/schema/public/v1/managed-launch-metadata.deserialize.schema.json +39 -0
- package/schema/public/v1/managed-launch-metadata.serialize.schema.json +39 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// extension/radar-runtime.ts
|
|
2
|
+
var RADAR_RUNTIME_REQUEST = "pi-radar/runtime-request";
|
|
3
|
+
var RADAR_RUNTIME_VERSION = 2;
|
|
4
|
+
function lazyRadarRuntime(start) {
|
|
5
|
+
let pending;
|
|
6
|
+
return {
|
|
7
|
+
version: RADAR_RUNTIME_VERSION,
|
|
8
|
+
start: () => pending ??= Promise.resolve().then(start)
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function provideRadarRuntime(events, handle) {
|
|
12
|
+
return events.on(RADAR_RUNTIME_REQUEST, (value) => {
|
|
13
|
+
if (!isRuntimeRequest(value)) return;
|
|
14
|
+
value.provide(handle);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function requestRadarRuntime(events) {
|
|
18
|
+
const handles = [];
|
|
19
|
+
events.emit(RADAR_RUNTIME_REQUEST, {
|
|
20
|
+
version: RADAR_RUNTIME_VERSION,
|
|
21
|
+
provide: (candidate) => {
|
|
22
|
+
if (isRadarRuntimeHandle(candidate)) handles.push(candidate);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
if (handles.length === 1) return { ok: true, handle: handles[0] };
|
|
26
|
+
return { ok: false, reason: handles.length === 0 ? "missing" : "duplicate" };
|
|
27
|
+
}
|
|
28
|
+
function isRuntimeRequest(value) {
|
|
29
|
+
return typeof value === "object" && value !== null && value.version === RADAR_RUNTIME_VERSION && typeof value.provide === "function";
|
|
30
|
+
}
|
|
31
|
+
function isRadarRuntimeHandle(value) {
|
|
32
|
+
if (typeof value !== "object" || value === null) return false;
|
|
33
|
+
const handle = value;
|
|
34
|
+
return handle.version === RADAR_RUNTIME_VERSION && typeof handle.start === "function";
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
RADAR_RUNTIME_REQUEST,
|
|
38
|
+
RADAR_RUNTIME_VERSION,
|
|
39
|
+
lazyRadarRuntime,
|
|
40
|
+
provideRadarRuntime,
|
|
41
|
+
requestRadarRuntime
|
|
42
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// extension/radar-session-marker.ts
|
|
2
|
+
var RADAR_LAUNCH_MARKER_TYPE = "pi-radar.launch-identity";
|
|
3
|
+
var RADAR_LAUNCH_MARKER_VERSION = 1;
|
|
4
|
+
var RADAR_MAX_EXECUTION_GENERATION = 4294967295;
|
|
5
|
+
var RADAR_MANAGED_SUBJECT_ENV = "PI_RADAR_MANAGED_SUBJECT_ID";
|
|
6
|
+
var RADAR_MANAGED_LAUNCH_ENV = "PI_RADAR_MANAGED_LAUNCH_ID";
|
|
7
|
+
var RADAR_MANAGED_GENERATION_ENV = "PI_RADAR_MANAGED_EXECUTION_GENERATION";
|
|
8
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
9
|
+
function decodeRadarLaunchMarker(value) {
|
|
10
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
11
|
+
const record = value;
|
|
12
|
+
if (Object.keys(record).sort().join(",") !== "execution_generation,launch_id,subject_id,version") {
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
if (record.version !== RADAR_LAUNCH_MARKER_VERSION || typeof record.subject_id !== "string" || !UUID.test(record.subject_id) || typeof record.launch_id !== "string" || !UUID.test(record.launch_id) || !Number.isSafeInteger(record.execution_generation) || record.execution_generation < 1 || record.execution_generation > RADAR_MAX_EXECUTION_GENERATION) {
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
version: RADAR_LAUNCH_MARKER_VERSION,
|
|
20
|
+
subject_id: record.subject_id,
|
|
21
|
+
launch_id: record.launch_id,
|
|
22
|
+
execution_generation: record.execution_generation
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function appendRadarLaunchMarker(appendEntry, marker) {
|
|
26
|
+
const validated = decodeRadarLaunchMarker(marker);
|
|
27
|
+
if (!validated) throw new Error("invalid Radar launch identity marker");
|
|
28
|
+
appendEntry(RADAR_LAUNCH_MARKER_TYPE, validated);
|
|
29
|
+
}
|
|
30
|
+
function latestRadarLaunchMarker(branch) {
|
|
31
|
+
let latest;
|
|
32
|
+
for (const entry of branch) {
|
|
33
|
+
if (entry.type === "custom" && entry.customType === RADAR_LAUNCH_MARKER_TYPE) {
|
|
34
|
+
latest = entry;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!latest) return { status: "absent" };
|
|
38
|
+
const marker = decodeRadarLaunchMarker(latest.data);
|
|
39
|
+
return marker ? { status: "valid", marker } : { status: "invalid" };
|
|
40
|
+
}
|
|
41
|
+
function radarLaunchMarkerFromEnvironment(env = process.env) {
|
|
42
|
+
const rawGeneration = env[RADAR_MANAGED_GENERATION_ENV];
|
|
43
|
+
if (env[RADAR_MANAGED_SUBJECT_ENV] === void 0 || env[RADAR_MANAGED_LAUNCH_ENV] === void 0 || rawGeneration === void 0 || !/^[1-9][0-9]*$/.test(rawGeneration)) {
|
|
44
|
+
return void 0;
|
|
45
|
+
}
|
|
46
|
+
return decodeRadarLaunchMarker({
|
|
47
|
+
version: RADAR_LAUNCH_MARKER_VERSION,
|
|
48
|
+
subject_id: env[RADAR_MANAGED_SUBJECT_ENV],
|
|
49
|
+
launch_id: env[RADAR_MANAGED_LAUNCH_ENV],
|
|
50
|
+
execution_generation: Number(rawGeneration)
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function activeRadarLaunchMarker(host) {
|
|
54
|
+
if (!host.sessionManager) return { status: "absent" };
|
|
55
|
+
return latestRadarLaunchMarker(host.sessionManager.getBranch());
|
|
56
|
+
}
|
|
57
|
+
function persistRadarLaunchMarker(host, env = process.env) {
|
|
58
|
+
const marker = radarLaunchMarkerFromEnvironment(env);
|
|
59
|
+
if (!marker) return "absent";
|
|
60
|
+
if (!host.appendEntry || !host.sessionManager) return "unsupported";
|
|
61
|
+
const current = latestRadarLaunchMarker(host.sessionManager.getBranch());
|
|
62
|
+
if (current.status === "valid" && sameMarker(current.marker, marker)) return "unchanged";
|
|
63
|
+
appendRadarLaunchMarker(host.appendEntry, marker);
|
|
64
|
+
return "written";
|
|
65
|
+
}
|
|
66
|
+
function sameMarker(a, b) {
|
|
67
|
+
return a.version === b.version && a.subject_id === b.subject_id && a.launch_id === b.launch_id && a.execution_generation === b.execution_generation;
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
RADAR_LAUNCH_MARKER_TYPE,
|
|
71
|
+
RADAR_LAUNCH_MARKER_VERSION,
|
|
72
|
+
RADAR_MANAGED_GENERATION_ENV,
|
|
73
|
+
RADAR_MANAGED_LAUNCH_ENV,
|
|
74
|
+
RADAR_MANAGED_SUBJECT_ENV,
|
|
75
|
+
RADAR_MAX_EXECUTION_GENERATION,
|
|
76
|
+
activeRadarLaunchMarker,
|
|
77
|
+
appendRadarLaunchMarker,
|
|
78
|
+
decodeRadarLaunchMarker,
|
|
79
|
+
latestRadarLaunchMarker,
|
|
80
|
+
persistRadarLaunchMarker,
|
|
81
|
+
radarLaunchMarkerFromEnvironment
|
|
82
|
+
};
|