enigma-memory 0.1.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/LICENSE +55 -0
- package/README.md +379 -0
- package/apps/cli/bin/enigma.mjs +1117 -0
- package/apps/desktop/src/app.js +1327 -0
- package/apps/desktop/src/index.html +1373 -0
- package/apps/desktop/src/styles.css +386 -0
- package/apps/gateway/bin/enigma-gateway.mjs +52 -0
- package/apps/gateway/src/server.mjs +1403 -0
- package/apps/native-host/README.md +265 -0
- package/apps/native-host/bin/enigma-native-host.mjs +499 -0
- package/apps/native-host/manifests/com.enigma.native_host.chrome.json +9 -0
- package/apps/native-host/manifests/com.enigma.native_host.edge.json +9 -0
- package/apps/native-host/manifests/com.enigma.native_host.firefox.json +9 -0
- package/apps/relay/bin/enigma-relay.mjs +52 -0
- package/apps/relay/src/server.mjs +1571 -0
- package/apps/verifier/bin/enigma-verify.mjs +240 -0
- package/deploy/docker-compose.production.example.yml +150 -0
- package/deploy/kubernetes/enigma-backend.example.yaml +580 -0
- package/package.json +196 -0
- package/packages/adapters/PACKAGE_CONTRACT.md +47 -0
- package/packages/adapters/src/index.js +183 -0
- package/packages/boundary/src/index.js +468 -0
- package/packages/connectors/src/index.js +533 -0
- package/packages/core/src/index.js +766 -0
- package/packages/enterprise/src/index.js +505 -0
- package/packages/importers/src/index.js +1083 -0
- package/packages/mcp-server/bin/enigma-mcp.mjs +19 -0
- package/packages/mcp-server/src/index.js +1185 -0
- package/packages/mesh/src/index.js +531 -0
- package/packages/metering/PACKAGE_CONTRACT.md +20 -0
- package/packages/metering/src/index.js +246 -0
- package/packages/optimizer/src/index.js +707 -0
- package/packages/passport/src/index.js +651 -0
- package/packages/settlement/PACKAGE_CONTRACT.md +28 -0
- package/packages/settlement/src/index.js +369 -0
- package/packages/storage/PACKAGE_CONTRACT.md +23 -0
- package/packages/storage/src/index.js +392 -0
- package/packages/vault/src/index.js +904 -0
- package/scripts/build-ai-orchestration-plan.mjs +248 -0
- package/scripts/build-cloudflare-pages-release-packet.mjs +287 -0
- package/scripts/build-cloudflare-token-policy.mjs +239 -0
- package/scripts/build-cloudflare-token-request.mjs +314 -0
- package/scripts/build-demo-assets.mjs +263 -0
- package/scripts/build-edge-backend-workers.mjs +353 -0
- package/scripts/build-goal-completion-audit.mjs +398 -0
- package/scripts/build-hosted-probe-worker.mjs +191 -0
- package/scripts/build-operator-acceptance-packet.mjs +254 -0
- package/scripts/build-operator-evidence-starter.mjs +525 -0
- package/scripts/build-production-backend-env-kit.mjs +384 -0
- package/scripts/build-production-dependency-report.mjs +369 -0
- package/scripts/build-production-handoff-packet.mjs +475 -0
- package/scripts/build-production-readiness-manifest.mjs +209 -0
- package/scripts/build-production-status-board.mjs +297 -0
- package/scripts/build-production-storage-migration.mjs +86 -0
- package/scripts/build-production-workplan.mjs +371 -0
- package/scripts/build-review-packet.mjs +594 -0
- package/scripts/check.mjs +419 -0
- package/scripts/cloudflare-ops.mjs +1672 -0
- package/scripts/cloudflare-secret-env.mjs +128 -0
- package/scripts/collect-hosted-backend-live-evidence.mjs +263 -0
- package/scripts/infrastructure-readiness.mjs +944 -0
- package/scripts/install-enigma-local.mjs +270 -0
- package/scripts/memory-optimization-benchmark.mjs +242 -0
- package/scripts/monitor-live-endpoints.mjs +358 -0
- package/scripts/release-audit.mjs +5588 -0
- package/scripts/release-provenance.mjs +250 -0
- package/scripts/run-backend-readiness-smoke.mjs +220 -0
- package/scripts/validate-backup-restore-drill.mjs +166 -0
- package/scripts/validate-cloudflare-credentials.mjs +112 -0
- package/scripts/validate-cloudflare-worker-inspect.mjs +179 -0
- package/scripts/validate-domain-tls.mjs +248 -0
- package/scripts/validate-hosted-backend-live.mjs +319 -0
- package/scripts/validate-incident-drill.mjs +221 -0
- package/scripts/validate-kms-custody.mjs +235 -0
- package/scripts/validate-legal-compliance-approval.mjs +274 -0
- package/scripts/validate-monitoring-alerting.mjs +263 -0
- package/scripts/validate-network-access-policy.mjs +285 -0
- package/scripts/validate-operator-acceptance.mjs +298 -0
- package/scripts/validate-production-manifests.mjs +325 -0
- package/scripts/validate-public-site-security.mjs +252 -0
- package/scripts/validate-security-threat-model.mjs +285 -0
- package/scripts/validate-service-settlement.mjs +256 -0
- package/scripts/validate-support-sla.mjs +190 -0
- package/scripts/validate-tenant-policy-approval.mjs +228 -0
- package/scripts/validate-usage-metering.mjs +224 -0
- package/scripts/validate-whitepaper-claims.mjs +166 -0
- package/specs/boundary-manifest-v1.schema.json +35 -0
- package/specs/capsule-v1.schema.json +55 -0
- package/specs/claim-boundary-manifest-v1.schema.json +22 -0
- package/specs/connector-profile-v1.schema.json +62 -0
- package/specs/deletion-tombstone-v1.schema.json +26 -0
- package/specs/enterprise-policy-v1.schema.json +59 -0
- package/specs/gateway-request-v1.schema.json +32 -0
- package/specs/goal-completion-audit-v1.schema.json +70 -0
- package/specs/hosted-backend-live-evidence-v1.schema.json +147 -0
- package/specs/import-report-v1.schema.json +214 -0
- package/specs/infrastructure-readiness-manifest-v1.schema.json +130 -0
- package/specs/memory-event-v1.schema.json +42 -0
- package/specs/mesh-node-v1.schema.json +126 -0
- package/specs/passport-v1.schema.json +50 -0
- package/specs/production-handoff-packet-v1.schema.json +149 -0
- package/specs/receipt-v1.schema.json +61 -0
- package/specs/relay-record-v1.schema.json +43 -0
- package/specs/state-checkpoint-v1.schema.json +37 -0
- package/specs/trust-bundle-v1.schema.json +56 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { buildProductionReadinessManifest } from './build-production-readiness-manifest.mjs';
|
|
6
|
+
import { buildProductionStorageMigrationArtifact } from './build-production-storage-migration.mjs';
|
|
7
|
+
import { validateProductionManifestFiles } from './validate-production-manifests.mjs';
|
|
8
|
+
import {
|
|
9
|
+
OPERATOR_ACCEPTANCE_PACKET_SCHEMA,
|
|
10
|
+
REQUIRED_EVIDENCE_ITEMS,
|
|
11
|
+
REQUIRED_OWNER_ROLES,
|
|
12
|
+
validateOperatorAcceptancePacket,
|
|
13
|
+
} from './validate-operator-acceptance.mjs';
|
|
14
|
+
|
|
15
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
16
|
+
const flags = new Map();
|
|
17
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
18
|
+
const arg = argv[index];
|
|
19
|
+
if (!arg.startsWith('--')) continue;
|
|
20
|
+
const eq = arg.indexOf('=');
|
|
21
|
+
if (eq !== -1) flags.set(arg.slice(2, eq), arg.slice(eq + 1));
|
|
22
|
+
else if (!argv[index + 1] || argv[index + 1].startsWith('--')) flags.set(arg.slice(2), true);
|
|
23
|
+
else {
|
|
24
|
+
flags.set(arg.slice(2), argv[index + 1]);
|
|
25
|
+
index += 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return flags;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getFlag(flags, names, fallback = undefined) {
|
|
32
|
+
for (const name of names) if (flags.has(name)) return flags.get(name);
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function isPlainObject(value) {
|
|
37
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function completeStatus(complete) {
|
|
41
|
+
return complete ? 'verified' : 'pending';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function owner(role, complete, override = null) {
|
|
45
|
+
if (isPlainObject(override)) {
|
|
46
|
+
return {
|
|
47
|
+
name: String(override.name ?? (complete ? `${role} owner` : '')),
|
|
48
|
+
organization: String(override.organization ?? (complete ? 'Enigma operator fixture' : '')),
|
|
49
|
+
approval_status: String(override.approval_status ?? override.status ?? (complete ? 'approved' : 'pending')),
|
|
50
|
+
approval_ref: String(override.approval_ref ?? override.ref ?? (complete ? `ticket://${role}/approval` : '')),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (typeof override === 'string' && override.trim().length > 0) {
|
|
54
|
+
return {
|
|
55
|
+
name: `${role} owner`,
|
|
56
|
+
organization: 'operator-provided',
|
|
57
|
+
approval_status: 'approved',
|
|
58
|
+
approval_ref: override.trim(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
name: complete ? `${role} owner` : '',
|
|
63
|
+
organization: complete ? 'Enigma operator fixture' : '',
|
|
64
|
+
approval_status: complete ? 'approved' : 'pending',
|
|
65
|
+
approval_ref: complete ? `ticket://${role}/approval` : '',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function evidenceItem(key, complete, override = null) {
|
|
70
|
+
if (isPlainObject(override)) {
|
|
71
|
+
return {
|
|
72
|
+
status: String(override.status ?? (complete ? 'verified' : 'pending')),
|
|
73
|
+
ref: String(override.ref ?? ''),
|
|
74
|
+
owner: String(override.owner ?? (complete ? `${key} owner` : '')),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (typeof override === 'string' && override.trim().length > 0) {
|
|
78
|
+
return {
|
|
79
|
+
status: 'verified',
|
|
80
|
+
ref: override.trim(),
|
|
81
|
+
owner: `${key} owner`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
status: completeStatus(complete),
|
|
86
|
+
ref: complete ? `evidence://${key}/verified` : '',
|
|
87
|
+
owner: complete ? `${key} owner` : '',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function ownersFromOverrides(overrides, complete) {
|
|
92
|
+
const source = isPlainObject(overrides) ? overrides : {};
|
|
93
|
+
return Object.fromEntries(REQUIRED_OWNER_ROLES.map((role) => [role, owner(role, complete, source[role])]));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function evidenceFromOverrides(overrides, complete) {
|
|
97
|
+
const source = isPlainObject(overrides) ? overrides : {};
|
|
98
|
+
return Object.fromEntries(REQUIRED_EVIDENCE_ITEMS.map((key) => [key, evidenceItem(key, complete, source[key])]));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function readJsonFile(path) {
|
|
102
|
+
if (!path || path === true) return undefined;
|
|
103
|
+
return JSON.parse(await readFile(resolve(String(path)), 'utf8'));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function fixtureReadiness(complete) {
|
|
107
|
+
return {
|
|
108
|
+
schema: 'enigma.infrastructure_readiness.v1',
|
|
109
|
+
ok: complete,
|
|
110
|
+
mode: complete ? 'live' : 'contract',
|
|
111
|
+
readiness: {
|
|
112
|
+
contract_ready: complete,
|
|
113
|
+
public_live_ready: complete,
|
|
114
|
+
cloudflare_observed: complete,
|
|
115
|
+
hosted_live_ready: complete,
|
|
116
|
+
},
|
|
117
|
+
checks: complete ? [
|
|
118
|
+
{ name: 'manifest.secret_scan', ok: true },
|
|
119
|
+
{ name: 'manifest.schema', ok: true, manifest_schema: 'enigma.infrastructure_readiness_manifest.v1' },
|
|
120
|
+
{ name: 'readiness.contract', ok: true, missing: [] },
|
|
121
|
+
{ name: 'hosted.required_refs', ok: true, missing: [], required_count: 25, missing_count: 0 },
|
|
122
|
+
{ name: 'operator_acceptance.decision', ok: true, decision: 'go' },
|
|
123
|
+
{ name: 'external_blockers.manifest', ok: true, count: 0 },
|
|
124
|
+
{ name: 'hosted.allow_localhost_boundary', ok: true, allow_localhost: false, hosted_live_ready: false, reason: null },
|
|
125
|
+
{ name: 'public_site.live', ok: true, status: 200, expected_status: 200, expected_text_matched: true },
|
|
126
|
+
{ name: 'relay.live', ok: true, status: 200, has_refs: true, local_demo: false, internal: false },
|
|
127
|
+
{ name: 'gateway.live', ok: true, status: 200, has_refs: true, local_demo: false, internal: false },
|
|
128
|
+
{ name: 'cloudflare.observation', ok: true, mode: 'required', observed: true, skipped: false, required: true, hosted_readiness_required: true },
|
|
129
|
+
] : [
|
|
130
|
+
{ name: 'hosted.required_refs', ok: false, missing: ['backend_host'], required_count: 25, missing_count: 25 },
|
|
131
|
+
],
|
|
132
|
+
external_blockers: complete ? [] : ['operator acceptance packet is a generated template'],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function defaultManifest(complete) {
|
|
137
|
+
if (!complete) {
|
|
138
|
+
return buildProductionReadinessManifest({
|
|
139
|
+
env: {
|
|
140
|
+
ENIGMA_OPERATOR_DECISION: 'pending',
|
|
141
|
+
},
|
|
142
|
+
argv: ['--external-blocker', 'operator acceptance packet is a generated template'],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return buildProductionReadinessManifest({
|
|
146
|
+
env: {
|
|
147
|
+
ENIGMA_PUBLIC_SITE_URL: 'https://enigmamemory.com/',
|
|
148
|
+
CLOUDFLARE_ACCOUNT_ID: 'account-fixture',
|
|
149
|
+
ENIGMA_RELAY_READY_URL: 'https://relay.enigmamemory.com/readyz',
|
|
150
|
+
ENIGMA_GATEWAY_READY_URL: 'https://gateway.enigmamemory.com/readyz',
|
|
151
|
+
ENIGMA_RELAY_DEPLOYMENT_REF: 'relay-deploy#acceptance-builder',
|
|
152
|
+
ENIGMA_GATEWAY_DEPLOYMENT_REF: 'gateway-deploy#acceptance-builder',
|
|
153
|
+
ENIGMA_BACKEND_HOST_REF: 'backend-host#acceptance-builder',
|
|
154
|
+
ENIGMA_DNS_TLS_REF: 'dns-tls#acceptance-builder',
|
|
155
|
+
ENIGMA_DURABLE_STORAGE_REF: 'storage#acceptance-builder',
|
|
156
|
+
ENIGMA_KMS_KEY_REF: 'kms#acceptance-builder',
|
|
157
|
+
ENIGMA_BACKUP_TARGET_REF: 'backup#acceptance-builder',
|
|
158
|
+
ENIGMA_MONITORING_REF: 'monitoring#acceptance-builder',
|
|
159
|
+
ENIGMA_SIEM_REF: 'siem#acceptance-builder',
|
|
160
|
+
ENIGMA_RUNTIME_AUTH_REF: 'runtime-auth#acceptance-builder',
|
|
161
|
+
ENIGMA_ADMIN_AUTH_REF: 'admin-auth#acceptance-builder',
|
|
162
|
+
ENIGMA_DATA_PLANE_AUTH_REF: 'data-plane-auth#acceptance-builder',
|
|
163
|
+
ENIGMA_OPERATOR_ACCEPTANCE_REF: 'operator-acceptance#acceptance-builder',
|
|
164
|
+
ENIGMA_NETWORK_ACCESS_POLICY_REF: 'network-policy#acceptance-builder',
|
|
165
|
+
ENIGMA_KMS_CUSTODY_REF: 'kms-custody#acceptance-builder',
|
|
166
|
+
ENIGMA_TENANT_POLICY_APPROVAL_REF: 'tenant-policy#acceptance-builder',
|
|
167
|
+
ENIGMA_USAGE_METERING_REF: 'usage-metering#acceptance-builder',
|
|
168
|
+
ENIGMA_SERVICE_SETTLEMENT_REF: 'service-settlement#acceptance-builder',
|
|
169
|
+
ENIGMA_MONITORING_ALERTING_REF: 'monitoring-alerting#acceptance-builder',
|
|
170
|
+
ENIGMA_PUBLIC_SITE_SECURITY_REF: 'public-site-security#acceptance-builder',
|
|
171
|
+
ENIGMA_SECURITY_THREAT_MODEL_REF: 'security-threat-model#acceptance-builder',
|
|
172
|
+
ENIGMA_LEGAL_COMPLIANCE_REF: 'legal-compliance#acceptance-builder',
|
|
173
|
+
ENIGMA_SUPPORT_SLA_REF: 'support-sla#acceptance-builder',
|
|
174
|
+
ENIGMA_INCIDENT_DRILL_REF: 'incident-drill#acceptance-builder',
|
|
175
|
+
ENIGMA_BACKUP_RESTORE_DRILL_REF: 'backup-restore-drill#acceptance-builder',
|
|
176
|
+
ENIGMA_OPERATOR_DECISION: 'go',
|
|
177
|
+
},
|
|
178
|
+
argv: [],
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function defaultReleaseAudit(complete) {
|
|
183
|
+
return {
|
|
184
|
+
schema: 'enigma.release_audit.v1',
|
|
185
|
+
ok: complete,
|
|
186
|
+
required_failed: complete ? [] : ['generated acceptance packet template has not run release audit'],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export async function buildOperatorAcceptancePacket(options = {}) {
|
|
191
|
+
const flags = options.flags instanceof Map ? options.flags : parseArgs(options.argv ?? []);
|
|
192
|
+
const complete = options.complete === true || getFlag(flags, ['complete-fixture', 'completeFixture']) === true;
|
|
193
|
+
const decision = String(getFlag(flags, ['decision'], options.decision ?? (complete ? 'go' : 'blocked')));
|
|
194
|
+
const ownerOverrides = await readJsonFile(getFlag(flags, ['owners', 'owners-json', 'ownersJson'])) ?? options.owners ?? options.ownerOverrides;
|
|
195
|
+
const evidenceOverrides = await readJsonFile(getFlag(flags, ['evidence', 'evidence-json', 'evidenceJson', 'evidence-refs', 'evidenceRefs'])) ?? options.evidence ?? options.evidenceRefs ?? options.evidenceOverrides;
|
|
196
|
+
const owners = ownersFromOverrides(ownerOverrides, complete);
|
|
197
|
+
const evidence = evidenceFromOverrides(evidenceOverrides, complete);
|
|
198
|
+
const readiness = await readJsonFile(getFlag(flags, ['readiness'])) ?? options.readiness ?? fixtureReadiness(complete);
|
|
199
|
+
const manifest = await readJsonFile(getFlag(flags, ['manifest'])) ?? options.manifest ?? await defaultManifest(complete);
|
|
200
|
+
const storage = await readJsonFile(getFlag(flags, ['storage'])) ?? options.storage ?? buildProductionStorageMigrationArtifact({ argv: [] });
|
|
201
|
+
const releaseAudit = await readJsonFile(getFlag(flags, ['release-audit', 'releaseAudit'])) ?? options.release_audit ?? options.releaseAudit ?? defaultReleaseAudit(complete);
|
|
202
|
+
const productionManifests = await readJsonFile(getFlag(flags, ['production-manifests', 'productionManifests'])) ?? options.production_manifests ?? options.productionManifests ?? await validateProductionManifestFiles();
|
|
203
|
+
return {
|
|
204
|
+
schema: OPERATOR_ACCEPTANCE_PACKET_SCHEMA,
|
|
205
|
+
metadata: {
|
|
206
|
+
packet_id: String(getFlag(flags, ['packet-id', 'packetId'], options.packet_id ?? options.packetId ?? `packet-${complete ? 'fixture' : 'template'}`)),
|
|
207
|
+
customer_or_tenant: String(getFlag(flags, ['tenant', 'customer'], options.customer_or_tenant ?? options.customerOrTenant ?? (complete ? 'enigma-fixture-tenant' : ''))),
|
|
208
|
+
deployment_mode: String(getFlag(flags, ['deployment-mode', 'deploymentMode'], options.deployment_mode ?? options.deploymentMode ?? 'hosted')),
|
|
209
|
+
environment: String(getFlag(flags, ['environment'], options.environment ?? 'production')),
|
|
210
|
+
target_regions: String(getFlag(flags, ['target-regions', 'targetRegions'], options.target_regions ?? options.targetRegions ?? (complete ? 'us-east-1' : ''))),
|
|
211
|
+
requested_go_live_date: String(getFlag(flags, ['requested-go-live-date', 'requestedGoLiveDate'], options.requested_go_live_date ?? options.requestedGoLiveDate ?? (complete ? '2026-06-23' : ''))),
|
|
212
|
+
evidence_repository: String(getFlag(flags, ['evidence-repository', 'evidenceRepository'], options.evidence_repository ?? options.evidenceRepository ?? (complete ? 'ticket://operator-acceptance/fixture' : ''))),
|
|
213
|
+
packet_owner: String(getFlag(flags, ['packet-owner', 'packetOwner'], options.packet_owner ?? options.packetOwner ?? (complete ? 'operator owner' : ''))),
|
|
214
|
+
last_updated: String(getFlag(flags, ['last-updated', 'lastUpdated'], options.last_updated ?? options.lastUpdated ?? new Date(0).toISOString())),
|
|
215
|
+
decision,
|
|
216
|
+
},
|
|
217
|
+
owners,
|
|
218
|
+
evidence,
|
|
219
|
+
readiness,
|
|
220
|
+
manifest,
|
|
221
|
+
storage,
|
|
222
|
+
release_audit: releaseAudit,
|
|
223
|
+
production_manifests: productionManifests,
|
|
224
|
+
claim_boundary: [
|
|
225
|
+
'Generated packets are templates unless every owner/evidence item is complete and validator output is go.',
|
|
226
|
+
'This builder does not create cloud resources, run production probes, approve go-live, or verify secrets.',
|
|
227
|
+
'Do not paste raw memory, bearer tokens, private keys, DSNs with credentials, prompts, transcripts, or decrypted content into packet fields.',
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function main() {
|
|
233
|
+
const flags = parseArgs();
|
|
234
|
+
const packet = await buildOperatorAcceptancePacket({ flags });
|
|
235
|
+
const result = getFlag(flags, ['validate']) === true ? validateOperatorAcceptancePacket(packet) : null;
|
|
236
|
+
const out = getFlag(flags, ['out']);
|
|
237
|
+
const packetText = `${JSON.stringify(packet, null, 2)}\n`;
|
|
238
|
+
if (out && out !== true) {
|
|
239
|
+
const outPath = resolve(String(out));
|
|
240
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
241
|
+
await writeFile(outPath, packetText, 'utf8');
|
|
242
|
+
process.stdout.write(`${JSON.stringify({ ok: true, out: '<operator-acceptance-packet-output>', schema: packet.schema, decision: packet.metadata.decision, validation: result?.decision ?? null, blocker_count: result?.blockers?.length ?? null }, null, 2)}\n`);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
process.stdout.write(result === null ? packetText : `${JSON.stringify({ packet, validation: result }, null, 2)}\n`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const invokedPath = process.argv[1] ? resolve(process.argv[1]) : '';
|
|
249
|
+
if (invokedPath === fileURLToPath(import.meta.url)) {
|
|
250
|
+
main().catch((error) => {
|
|
251
|
+
process.stderr.write(`${error.name ?? 'Error'}: ${error.message}\n`);
|
|
252
|
+
process.exitCode = 1;
|
|
253
|
+
});
|
|
254
|
+
}
|