@lumenflow/host 5.0.2
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/LICENSE +661 -0
- package/README.md +19 -0
- package/dist/enrollment/index.d.ts +10 -0
- package/dist/enrollment/index.d.ts.map +1 -0
- package/dist/enrollment/index.js +11 -0
- package/dist/enrollment/index.js.map +1 -0
- package/dist/enrollment/phone-device.d.ts +73 -0
- package/dist/enrollment/phone-device.d.ts.map +1 -0
- package/dist/enrollment/phone-device.js +198 -0
- package/dist/enrollment/phone-device.js.map +1 -0
- package/dist/git/git-adapter.d.ts +452 -0
- package/dist/git/git-adapter.d.ts.map +1 -0
- package/dist/git/git-adapter.js +778 -0
- package/dist/git/git-adapter.js.map +1 -0
- package/dist/git/git-context-constants.d.ts +43 -0
- package/dist/git/git-context-constants.d.ts.map +1 -0
- package/dist/git/git-context-constants.js +45 -0
- package/dist/git/git-context-constants.js.map +1 -0
- package/dist/git/git-context-extractor.d.ts +102 -0
- package/dist/git/git-context-extractor.d.ts.map +1 -0
- package/dist/git/git-context-extractor.js +568 -0
- package/dist/git/git-context-extractor.js.map +1 -0
- package/dist/git/git-staged-validator.d.ts +33 -0
- package/dist/git/git-staged-validator.d.ts.map +1 -0
- package/dist/git/git-staged-validator.js +52 -0
- package/dist/git/git-staged-validator.js.map +1 -0
- package/dist/git/git-validator.ports.d.ts +114 -0
- package/dist/git/git-validator.ports.d.ts.map +1 -0
- package/dist/git/git-validator.ports.js +4 -0
- package/dist/git/git-validator.ports.js.map +1 -0
- package/dist/git/index.d.ts +12 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +14 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/workspace-config/index.d.ts +10 -0
- package/dist/workspace-config/index.d.ts.map +1 -0
- package/dist/workspace-config/index.js +12 -0
- package/dist/workspace-config/index.js.map +1 -0
- package/dist/workspace-config/lumenflow-config.d.ts +75 -0
- package/dist/workspace-config/lumenflow-config.d.ts.map +1 -0
- package/dist/workspace-config/lumenflow-config.js +212 -0
- package/dist/workspace-config/lumenflow-config.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host enrollment barrel.
|
|
3
|
+
*
|
|
4
|
+
* WU-2731 (INIT-060 phase 3, ADR-013 §5): phone-device enrollment + token
|
|
5
|
+
* subject + per-device registration record. Future enrollments (workspace,
|
|
6
|
+
* browser, etc.) re-export from here.
|
|
7
|
+
*/
|
|
8
|
+
export { buildPhoneDeviceSubject, enrollPhoneDevice, listPhoneDevices, parsePhoneDeviceSubject, resolvePhoneDeviceName, } from './phone-device.js';
|
|
9
|
+
export type { ParsedPhoneDeviceSubject, PhoneDeviceEnrollmentInput, PhoneDeviceEnrollmentOptions, PhoneDeviceEnrollmentResult, PhoneDeviceRegistrationRecord, } from './phone-device.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Host enrollment barrel.
|
|
5
|
+
*
|
|
6
|
+
* WU-2731 (INIT-060 phase 3, ADR-013 §5): phone-device enrollment + token
|
|
7
|
+
* subject + per-device registration record. Future enrollments (workspace,
|
|
8
|
+
* browser, etc.) re-export from here.
|
|
9
|
+
*/
|
|
10
|
+
export { buildPhoneDeviceSubject, enrollPhoneDevice, listPhoneDevices, parsePhoneDeviceSubject, resolvePhoneDeviceName, } from './phone-device.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type ControlPlaneAuthProfileConfig, type ScopedControlPlaneIdentity } from '@lumenflow/control-plane-sdk';
|
|
2
|
+
export interface PhoneDeviceEnrollmentInput {
|
|
3
|
+
workspace_id: string;
|
|
4
|
+
org_id: string;
|
|
5
|
+
agent_id: string;
|
|
6
|
+
device_id: string;
|
|
7
|
+
device_name: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PhoneDeviceEnrollmentOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Absolute path of the workspace root. Defaults to `process.cwd()`. The
|
|
12
|
+
* registry is written to `<workspaceRoot>/.lumenflow/state/phone-devices.json`.
|
|
13
|
+
*/
|
|
14
|
+
workspaceRoot?: string;
|
|
15
|
+
/** Profile config used to mint the token. Defaults to the `phone` profile. */
|
|
16
|
+
profile?: ControlPlaneAuthProfileConfig;
|
|
17
|
+
/** Explicit profile name written into the token (default `phone`). */
|
|
18
|
+
profileName?: string;
|
|
19
|
+
now?: Date | string;
|
|
20
|
+
}
|
|
21
|
+
export interface PhoneDeviceRegistrationRecord {
|
|
22
|
+
device_id: string;
|
|
23
|
+
device_name: string;
|
|
24
|
+
workspace_id: string;
|
|
25
|
+
enrolled_at: string;
|
|
26
|
+
}
|
|
27
|
+
export interface PhoneDeviceEnrollmentResult {
|
|
28
|
+
identity: ScopedControlPlaneIdentity;
|
|
29
|
+
record: PhoneDeviceRegistrationRecord;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build the canonical phone-scoped token subject: `{workspace_id}:phone:{device_id}`.
|
|
33
|
+
*
|
|
34
|
+
* Exported so callers that need to verify a parsed token subject outside
|
|
35
|
+
* enrollment (e.g. sidekick channel-ingress) can pattern-match without
|
|
36
|
+
* re-implementing the grammar.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildPhoneDeviceSubject(workspaceId: string, deviceId: string): string;
|
|
39
|
+
export interface ParsedPhoneDeviceSubject {
|
|
40
|
+
workspace_id: string;
|
|
41
|
+
device_id: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse a subject string and return its components if it matches the
|
|
45
|
+
* phone-device shape. Returns `undefined` for workspace-only or malformed
|
|
46
|
+
* subjects.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parsePhoneDeviceSubject(subject: string): ParsedPhoneDeviceSubject | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Issue a phone-device identity (sibling of the workspace enrollment token)
|
|
51
|
+
* and persist the device registration record. On re-enrollment of a known
|
|
52
|
+
* `device_id` the record is updated with the new `device_name` but the
|
|
53
|
+
* `enrolled_at` timestamp is preserved so audit trails retain the original
|
|
54
|
+
* first-enrollment time.
|
|
55
|
+
*/
|
|
56
|
+
export declare function enrollPhoneDevice(input: PhoneDeviceEnrollmentInput, options?: PhoneDeviceEnrollmentOptions): PhoneDeviceEnrollmentResult;
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the human-readable device name for a given `device_id`. Returns
|
|
59
|
+
* `undefined` when no record exists — callers (e.g. audit log renderers)
|
|
60
|
+
* should fall back to the raw `device_id` in that case so attribution is
|
|
61
|
+
* preserved even when the registry is absent.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolvePhoneDeviceName(deviceId: string, options?: {
|
|
64
|
+
workspaceRoot?: string;
|
|
65
|
+
}): string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Return every phone-device record in the registry. Exposed for cloud audit
|
|
68
|
+
* rendering (INIT-060 WU-10) and CLI introspection commands.
|
|
69
|
+
*/
|
|
70
|
+
export declare function listPhoneDevices(options?: {
|
|
71
|
+
workspaceRoot?: string;
|
|
72
|
+
}): PhoneDeviceRegistrationRecord[];
|
|
73
|
+
//# sourceMappingURL=phone-device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-device.d.ts","sourceRoot":"","sources":["../../src/enrollment/phone-device.ts"],"names":[],"mappings":"AA8BA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAChC,MAAM,8BAA8B,CAAC;AAWtC,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,6BAA6B,CAAC;IACxC,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,0BAA0B,CAAC;IACrC,MAAM,EAAE,6BAA6B,CAAC;CACvC;AAcD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIrF;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAU7F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,0BAA0B,EACjC,OAAO,GAAE,4BAAiC,GACzC,2BAA2B,CA2C7B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,MAAM,GAAG,SAAS,CAMpB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,6BAA6B,EAAE,CAIjC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* WU-2731 (INIT-060 phase 3, ADR-013 §5): Phone-device enrollment.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
*
|
|
8
|
+
* 1. Issue a phone-scoped enrollment token whose `subject` claim is
|
|
9
|
+
* `{workspace_id}:phone:{device_id}`. Cloud treats this subject as the
|
|
10
|
+
* authoritative `from` for inbound phone POSTs (audit per-device
|
|
11
|
+
* attribution).
|
|
12
|
+
*
|
|
13
|
+
* 2. Persist a device registration record mapping `device_id` to a
|
|
14
|
+
* human-readable `device_name` on workspace-local disk. The record is
|
|
15
|
+
* written atomically (temp file + rename) so concurrent enrollments do
|
|
16
|
+
* not corrupt the registry.
|
|
17
|
+
*
|
|
18
|
+
* 3. Resolve `device_id` to `device_name` for audit-log rendering.
|
|
19
|
+
*
|
|
20
|
+
* The module deliberately has no knowledge of the HTTP surface: the tool-api
|
|
21
|
+
* and sidekick channel-ingress consumers import the resolver and the `from`
|
|
22
|
+
* helper from `@lumenflow/surfaces/http/auth`; this module only issues tokens
|
|
23
|
+
* and maintains the registry.
|
|
24
|
+
*/
|
|
25
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
26
|
+
import { existsSync } from 'node:fs';
|
|
27
|
+
import path from 'node:path';
|
|
28
|
+
import { issueControlPlaneIdentity, } from '@lumenflow/control-plane-sdk';
|
|
29
|
+
const DEFAULT_REGISTRY_RELATIVE_PATH = '.lumenflow/state/phone-devices.json';
|
|
30
|
+
const SUBJECT_SEPARATOR = ':';
|
|
31
|
+
const SUBJECT_KIND_PHONE = 'phone';
|
|
32
|
+
const REGISTRY_FILE_MODE = 0o600;
|
|
33
|
+
const REGISTRY_DIR_MODE = 0o700;
|
|
34
|
+
const REGISTRY_VERSION = 1;
|
|
35
|
+
const UTF8 = 'utf8';
|
|
36
|
+
const TEMP_SUFFIX = '.tmp';
|
|
37
|
+
const DEFAULT_PHONE_PROFILE = {
|
|
38
|
+
ttl_seconds: 60 * 60 * 24 * 30,
|
|
39
|
+
scopes: ['tool:orchestrate:initiative', 'tool:delegation:list', 'tool:sidekick:channel:send'],
|
|
40
|
+
};
|
|
41
|
+
const DEFAULT_PHONE_PROFILE_NAME = 'phone';
|
|
42
|
+
/**
|
|
43
|
+
* Build the canonical phone-scoped token subject: `{workspace_id}:phone:{device_id}`.
|
|
44
|
+
*
|
|
45
|
+
* Exported so callers that need to verify a parsed token subject outside
|
|
46
|
+
* enrollment (e.g. sidekick channel-ingress) can pattern-match without
|
|
47
|
+
* re-implementing the grammar.
|
|
48
|
+
*/
|
|
49
|
+
export function buildPhoneDeviceSubject(workspaceId, deviceId) {
|
|
50
|
+
assertNonEmpty(workspaceId, 'workspace_id');
|
|
51
|
+
assertNonEmpty(deviceId, 'device_id');
|
|
52
|
+
return `${workspaceId}${SUBJECT_SEPARATOR}${SUBJECT_KIND_PHONE}${SUBJECT_SEPARATOR}${deviceId}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse a subject string and return its components if it matches the
|
|
56
|
+
* phone-device shape. Returns `undefined` for workspace-only or malformed
|
|
57
|
+
* subjects.
|
|
58
|
+
*/
|
|
59
|
+
export function parsePhoneDeviceSubject(subject) {
|
|
60
|
+
const parts = subject.split(SUBJECT_SEPARATOR);
|
|
61
|
+
if (parts.length !== 3 || parts[1] !== SUBJECT_KIND_PHONE) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const [workspace_id, , device_id] = parts;
|
|
65
|
+
if (!workspace_id || !device_id) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return { workspace_id, device_id };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Issue a phone-device identity (sibling of the workspace enrollment token)
|
|
72
|
+
* and persist the device registration record. On re-enrollment of a known
|
|
73
|
+
* `device_id` the record is updated with the new `device_name` but the
|
|
74
|
+
* `enrolled_at` timestamp is preserved so audit trails retain the original
|
|
75
|
+
* first-enrollment time.
|
|
76
|
+
*/
|
|
77
|
+
export function enrollPhoneDevice(input, options = {}) {
|
|
78
|
+
assertNonEmpty(input.workspace_id, 'workspace_id');
|
|
79
|
+
assertNonEmpty(input.org_id, 'org_id');
|
|
80
|
+
assertNonEmpty(input.agent_id, 'agent_id');
|
|
81
|
+
assertNonEmpty(input.device_id, 'device_id');
|
|
82
|
+
assertNonEmpty(input.device_name, 'device_name');
|
|
83
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
84
|
+
const profile = options.profile ?? DEFAULT_PHONE_PROFILE;
|
|
85
|
+
const profileName = options.profileName ?? DEFAULT_PHONE_PROFILE_NAME;
|
|
86
|
+
const subject = buildPhoneDeviceSubject(input.workspace_id, input.device_id);
|
|
87
|
+
const identity = issueControlPlaneIdentity({
|
|
88
|
+
workspace_id: input.workspace_id,
|
|
89
|
+
org_id: input.org_id,
|
|
90
|
+
agent_id: input.agent_id,
|
|
91
|
+
}, {
|
|
92
|
+
profile: profileName,
|
|
93
|
+
profiles: { [profileName]: profile },
|
|
94
|
+
now: options.now,
|
|
95
|
+
subject,
|
|
96
|
+
});
|
|
97
|
+
const registryPath = resolveRegistryPath(workspaceRoot);
|
|
98
|
+
const previous = readRegistryDocument(registryPath);
|
|
99
|
+
const existing = previous.devices.find((entry) => entry.device_id === input.device_id);
|
|
100
|
+
const enrolledAt = existing?.enrolled_at ?? resolveEnrolledAt(options.now);
|
|
101
|
+
const record = {
|
|
102
|
+
device_id: input.device_id,
|
|
103
|
+
device_name: input.device_name,
|
|
104
|
+
workspace_id: input.workspace_id,
|
|
105
|
+
enrolled_at: enrolledAt,
|
|
106
|
+
};
|
|
107
|
+
const nextDevices = previous.devices
|
|
108
|
+
.filter((entry) => entry.device_id !== input.device_id)
|
|
109
|
+
.concat(record);
|
|
110
|
+
writeRegistryDocument(registryPath, { version: REGISTRY_VERSION, devices: nextDevices });
|
|
111
|
+
return { identity, record };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Resolve the human-readable device name for a given `device_id`. Returns
|
|
115
|
+
* `undefined` when no record exists — callers (e.g. audit log renderers)
|
|
116
|
+
* should fall back to the raw `device_id` in that case so attribution is
|
|
117
|
+
* preserved even when the registry is absent.
|
|
118
|
+
*/
|
|
119
|
+
export function resolvePhoneDeviceName(deviceId, options = {}) {
|
|
120
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
121
|
+
const registryPath = resolveRegistryPath(workspaceRoot);
|
|
122
|
+
const document = readRegistryDocument(registryPath);
|
|
123
|
+
const record = document.devices.find((entry) => entry.device_id === deviceId);
|
|
124
|
+
return record?.device_name;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Return every phone-device record in the registry. Exposed for cloud audit
|
|
128
|
+
* rendering (INIT-060 WU-10) and CLI introspection commands.
|
|
129
|
+
*/
|
|
130
|
+
export function listPhoneDevices(options = {}) {
|
|
131
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
132
|
+
const registryPath = resolveRegistryPath(workspaceRoot);
|
|
133
|
+
return readRegistryDocument(registryPath).devices;
|
|
134
|
+
}
|
|
135
|
+
function resolveRegistryPath(workspaceRoot) {
|
|
136
|
+
return path.join(workspaceRoot, DEFAULT_REGISTRY_RELATIVE_PATH);
|
|
137
|
+
}
|
|
138
|
+
function resolveEnrolledAt(now) {
|
|
139
|
+
if (now instanceof Date) {
|
|
140
|
+
return now.toISOString();
|
|
141
|
+
}
|
|
142
|
+
if (typeof now === 'string') {
|
|
143
|
+
return new Date(now).toISOString();
|
|
144
|
+
}
|
|
145
|
+
return new Date().toISOString();
|
|
146
|
+
}
|
|
147
|
+
function readRegistryDocument(registryPath) {
|
|
148
|
+
if (!existsSync(registryPath)) {
|
|
149
|
+
return { version: REGISTRY_VERSION, devices: [] };
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const raw = readFileSync(registryPath, UTF8);
|
|
153
|
+
const parsed = JSON.parse(raw);
|
|
154
|
+
if (!isRegistryDocument(parsed)) {
|
|
155
|
+
return { version: REGISTRY_VERSION, devices: [] };
|
|
156
|
+
}
|
|
157
|
+
return parsed;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return { version: REGISTRY_VERSION, devices: [] };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function writeRegistryDocument(registryPath, document) {
|
|
164
|
+
const dir = path.dirname(registryPath);
|
|
165
|
+
mkdirSync(dir, { recursive: true, mode: REGISTRY_DIR_MODE });
|
|
166
|
+
const tempPath = `${registryPath}${TEMP_SUFFIX}`;
|
|
167
|
+
writeFileSync(tempPath, JSON.stringify(document, null, 2), {
|
|
168
|
+
encoding: UTF8,
|
|
169
|
+
mode: REGISTRY_FILE_MODE,
|
|
170
|
+
});
|
|
171
|
+
renameSync(tempPath, registryPath);
|
|
172
|
+
}
|
|
173
|
+
function isRegistryDocument(value) {
|
|
174
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
const candidate = value;
|
|
178
|
+
if (typeof candidate.version !== 'number' || !Array.isArray(candidate.devices)) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
return candidate.devices.every(isRegistrationRecord);
|
|
182
|
+
}
|
|
183
|
+
function isRegistrationRecord(value) {
|
|
184
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
const candidate = value;
|
|
188
|
+
return (typeof candidate.device_id === 'string' &&
|
|
189
|
+
typeof candidate.device_name === 'string' &&
|
|
190
|
+
typeof candidate.workspace_id === 'string' &&
|
|
191
|
+
typeof candidate.enrolled_at === 'string');
|
|
192
|
+
}
|
|
193
|
+
function assertNonEmpty(value, field) {
|
|
194
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
195
|
+
throw new Error(`Phone-device enrollment rejected: "${field}" must be a non-empty string.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=phone-device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-device.js","sourceRoot":"","sources":["../../src/enrollment/phone-device.ts"],"names":[],"mappings":"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"}
|