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
package/package.json
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "enigma-memory",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Provider-agnostic AI memory passport and offline-verifiable proof layer.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Enigma-Memory/enigma-memory.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"ai-memory",
|
|
16
|
+
"memory-optimization",
|
|
17
|
+
"memory-passport",
|
|
18
|
+
"mcp",
|
|
19
|
+
"offline-verification",
|
|
20
|
+
"provenance",
|
|
21
|
+
"receipts",
|
|
22
|
+
"zero-trust"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"files": [
|
|
26
|
+
"apps/cli/bin/",
|
|
27
|
+
"apps/native-host/bin/",
|
|
28
|
+
"apps/native-host/README.md",
|
|
29
|
+
"apps/native-host/manifests/",
|
|
30
|
+
"apps/desktop/src/",
|
|
31
|
+
"apps/gateway/bin/",
|
|
32
|
+
"apps/gateway/src/",
|
|
33
|
+
"apps/relay/src/",
|
|
34
|
+
"apps/relay/bin/",
|
|
35
|
+
"apps/verifier/bin/",
|
|
36
|
+
"packages/adapters/src/",
|
|
37
|
+
"packages/adapters/PACKAGE_CONTRACT.md",
|
|
38
|
+
"packages/boundary/src/",
|
|
39
|
+
"packages/connectors/src/",
|
|
40
|
+
"packages/core/src/",
|
|
41
|
+
"packages/enterprise/src/",
|
|
42
|
+
"packages/importers/src/",
|
|
43
|
+
"packages/optimizer/src/",
|
|
44
|
+
"packages/mcp-server/bin/",
|
|
45
|
+
"packages/mcp-server/src/",
|
|
46
|
+
"packages/mesh/src/",
|
|
47
|
+
"packages/metering/src/",
|
|
48
|
+
"packages/metering/PACKAGE_CONTRACT.md",
|
|
49
|
+
"packages/settlement/src/",
|
|
50
|
+
"packages/settlement/PACKAGE_CONTRACT.md",
|
|
51
|
+
"packages/passport/src/",
|
|
52
|
+
"packages/storage/src/",
|
|
53
|
+
"packages/storage/PACKAGE_CONTRACT.md",
|
|
54
|
+
"packages/vault/src/",
|
|
55
|
+
"deploy/docker-compose.production.example.yml",
|
|
56
|
+
"deploy/kubernetes/enigma-backend.example.yaml",
|
|
57
|
+
"scripts/check.mjs",
|
|
58
|
+
"scripts/install-enigma-local.mjs",
|
|
59
|
+
"scripts/build-production-readiness-manifest.mjs",
|
|
60
|
+
"scripts/build-production-backend-env-kit.mjs",
|
|
61
|
+
"scripts/cloudflare-secret-env.mjs",
|
|
62
|
+
"scripts/cloudflare-ops.mjs",
|
|
63
|
+
"scripts/build-cloudflare-pages-release-packet.mjs",
|
|
64
|
+
"scripts/build-cloudflare-token-policy.mjs",
|
|
65
|
+
"scripts/build-cloudflare-token-request.mjs",
|
|
66
|
+
"scripts/build-production-handoff-packet.mjs",
|
|
67
|
+
"scripts/build-goal-completion-audit.mjs",
|
|
68
|
+
"scripts/build-production-dependency-report.mjs",
|
|
69
|
+
"scripts/build-production-workplan.mjs",
|
|
70
|
+
"scripts/build-production-status-board.mjs",
|
|
71
|
+
"scripts/build-ai-orchestration-plan.mjs",
|
|
72
|
+
"scripts/validate-cloudflare-credentials.mjs",
|
|
73
|
+
"scripts/run-backend-readiness-smoke.mjs",
|
|
74
|
+
"scripts/validate-hosted-backend-live.mjs",
|
|
75
|
+
"scripts/monitor-live-endpoints.mjs",
|
|
76
|
+
"scripts/collect-hosted-backend-live-evidence.mjs",
|
|
77
|
+
"scripts/build-hosted-probe-worker.mjs",
|
|
78
|
+
"scripts/build-edge-backend-workers.mjs",
|
|
79
|
+
"scripts/validate-cloudflare-worker-inspect.mjs",
|
|
80
|
+
"scripts/validate-production-manifests.mjs",
|
|
81
|
+
"scripts/build-production-storage-migration.mjs",
|
|
82
|
+
"scripts/validate-operator-acceptance.mjs",
|
|
83
|
+
"scripts/build-operator-acceptance-packet.mjs",
|
|
84
|
+
"scripts/build-operator-evidence-starter.mjs",
|
|
85
|
+
"scripts/validate-backup-restore-drill.mjs",
|
|
86
|
+
"scripts/validate-incident-drill.mjs",
|
|
87
|
+
"scripts/validate-support-sla.mjs",
|
|
88
|
+
"scripts/validate-legal-compliance-approval.mjs",
|
|
89
|
+
"scripts/validate-monitoring-alerting.mjs",
|
|
90
|
+
"scripts/validate-network-access-policy.mjs",
|
|
91
|
+
"scripts/validate-kms-custody.mjs",
|
|
92
|
+
"scripts/validate-tenant-policy-approval.mjs",
|
|
93
|
+
"scripts/validate-usage-metering.mjs",
|
|
94
|
+
"scripts/validate-service-settlement.mjs",
|
|
95
|
+
"scripts/validate-public-site-security.mjs",
|
|
96
|
+
"scripts/validate-domain-tls.mjs",
|
|
97
|
+
"scripts/validate-whitepaper-claims.mjs",
|
|
98
|
+
"scripts/validate-security-threat-model.mjs",
|
|
99
|
+
"scripts/infrastructure-readiness.mjs",
|
|
100
|
+
"scripts/memory-optimization-benchmark.mjs",
|
|
101
|
+
"scripts/release-audit.mjs",
|
|
102
|
+
"scripts/release-provenance.mjs",
|
|
103
|
+
"scripts/build-review-packet.mjs",
|
|
104
|
+
"scripts/build-demo-assets.mjs",
|
|
105
|
+
"specs/"
|
|
106
|
+
],
|
|
107
|
+
"bin": {
|
|
108
|
+
"enigma": "apps/cli/bin/enigma.mjs",
|
|
109
|
+
"enigma-verify": "apps/verifier/bin/enigma-verify.mjs",
|
|
110
|
+
"enigma-mcp": "packages/mcp-server/bin/enigma-mcp.mjs",
|
|
111
|
+
"enigma-relay": "apps/relay/bin/enigma-relay.mjs",
|
|
112
|
+
"enigma-gateway": "apps/gateway/bin/enigma-gateway.mjs",
|
|
113
|
+
"enigma-native-host": "apps/native-host/bin/enigma-native-host.mjs"
|
|
114
|
+
},
|
|
115
|
+
"scripts": {
|
|
116
|
+
"check": "node scripts/check.mjs",
|
|
117
|
+
"test": "node --test test/*.test.mjs",
|
|
118
|
+
"install:local": "node scripts/install-enigma-local.mjs",
|
|
119
|
+
"boundary": "node harnesses/boundary-sim/boundary_harness.mjs",
|
|
120
|
+
"release:audit": "node scripts/release-audit.mjs",
|
|
121
|
+
"provenance:local": "node scripts/release-provenance.mjs",
|
|
122
|
+
"review:packet": "node scripts/build-review-packet.mjs",
|
|
123
|
+
"demo:assets": "node scripts/build-demo-assets.mjs",
|
|
124
|
+
"cloudflare:ops": "node scripts/cloudflare-ops.mjs",
|
|
125
|
+
"cloudflare:pages:packet": "node scripts/build-cloudflare-pages-release-packet.mjs",
|
|
126
|
+
"cloudflare:token-policy": "node scripts/build-cloudflare-token-policy.mjs",
|
|
127
|
+
"cloudflare:token-request": "node scripts/build-cloudflare-token-request.mjs",
|
|
128
|
+
"infrastructure:readiness": "node scripts/infrastructure-readiness.mjs",
|
|
129
|
+
"memory:benchmark": "node scripts/memory-optimization-benchmark.mjs",
|
|
130
|
+
"production:manifest": "node scripts/build-production-readiness-manifest.mjs",
|
|
131
|
+
"production:backend-env": "node scripts/build-production-backend-env-kit.mjs",
|
|
132
|
+
"production:storage": "node scripts/build-production-storage-migration.mjs",
|
|
133
|
+
"production:acceptance": "node scripts/validate-operator-acceptance.mjs",
|
|
134
|
+
"production:acceptance:packet": "node scripts/build-operator-acceptance-packet.mjs",
|
|
135
|
+
"production:evidence-starter": "node scripts/build-operator-evidence-starter.mjs",
|
|
136
|
+
"production:handoff": "node scripts/build-production-handoff-packet.mjs",
|
|
137
|
+
"production:goal-audit": "node scripts/build-goal-completion-audit.mjs",
|
|
138
|
+
"production:dependencies": "node scripts/build-production-dependency-report.mjs",
|
|
139
|
+
"production:workplan": "node scripts/build-production-workplan.mjs",
|
|
140
|
+
"production:status": "node scripts/build-production-status-board.mjs",
|
|
141
|
+
"production:orchestration": "node scripts/build-ai-orchestration-plan.mjs",
|
|
142
|
+
"production:manifests": "node scripts/validate-production-manifests.mjs",
|
|
143
|
+
"production:backend-smoke": "node scripts/run-backend-readiness-smoke.mjs",
|
|
144
|
+
"production:hosted-live": "node scripts/validate-hosted-backend-live.mjs",
|
|
145
|
+
"production:live-monitor": "node scripts/monitor-live-endpoints.mjs",
|
|
146
|
+
"production:live-monitor:dry-run": "node scripts/monitor-live-endpoints.mjs --dry-run",
|
|
147
|
+
"production:live-monitor:help": "node scripts/monitor-live-endpoints.mjs --help",
|
|
148
|
+
"production:hosted-collect": "node scripts/collect-hosted-backend-live-evidence.mjs",
|
|
149
|
+
"production:hosted-probe": "node scripts/build-hosted-probe-worker.mjs",
|
|
150
|
+
"production:edge-backend": "node scripts/build-edge-backend-workers.mjs",
|
|
151
|
+
"production:edge-deploy": "node scripts/deploy-edge-backend-workers.mjs",
|
|
152
|
+
"production:edge-live": "node scripts/collect-edge-backend-bootstrap-evidence.mjs",
|
|
153
|
+
"production:ref-draft": "node scripts/build-hosted-ref-draft.mjs",
|
|
154
|
+
"production:storage-bootstrap": "node scripts/cloudflare-storage-bootstrap.mjs",
|
|
155
|
+
"production:worker-inspect": "node scripts/validate-cloudflare-worker-inspect.mjs",
|
|
156
|
+
"production:cloudflare-credentials": "node scripts/validate-cloudflare-credentials.mjs",
|
|
157
|
+
"production:backup-drill": "node scripts/validate-backup-restore-drill.mjs",
|
|
158
|
+
"production:incident-drill": "node scripts/validate-incident-drill.mjs",
|
|
159
|
+
"production:whitepaper": "node scripts/validate-whitepaper-claims.mjs",
|
|
160
|
+
"production:sla": "node scripts/validate-support-sla.mjs",
|
|
161
|
+
"production:legal": "node scripts/validate-legal-compliance-approval.mjs",
|
|
162
|
+
"production:monitoring": "node scripts/validate-monitoring-alerting.mjs",
|
|
163
|
+
"production:network": "node scripts/validate-network-access-policy.mjs",
|
|
164
|
+
"production:kms": "node scripts/validate-kms-custody.mjs",
|
|
165
|
+
"production:tenant-policy": "node scripts/validate-tenant-policy-approval.mjs",
|
|
166
|
+
"production:usage": "node scripts/validate-usage-metering.mjs",
|
|
167
|
+
"production:settlement": "node scripts/validate-service-settlement.mjs",
|
|
168
|
+
"production:site": "node scripts/validate-public-site-security.mjs",
|
|
169
|
+
"production:domain": "node scripts/validate-domain-tls.mjs",
|
|
170
|
+
"production:threat-model": "node scripts/validate-security-threat-model.mjs"
|
|
171
|
+
},
|
|
172
|
+
"engines": {
|
|
173
|
+
"node": ">=24"
|
|
174
|
+
},
|
|
175
|
+
"exports": {
|
|
176
|
+
"./adapters": "./packages/adapters/src/index.js",
|
|
177
|
+
".": "./packages/core/src/index.js",
|
|
178
|
+
"./boundary": "./packages/boundary/src/index.js",
|
|
179
|
+
"./connectors": "./packages/connectors/src/index.js",
|
|
180
|
+
"./core": "./packages/core/src/index.js",
|
|
181
|
+
"./desktop": "./apps/desktop/src/app.js",
|
|
182
|
+
"./enterprise": "./packages/enterprise/src/index.js",
|
|
183
|
+
"./gateway": "./apps/gateway/src/server.mjs",
|
|
184
|
+
"./importers": "./packages/importers/src/index.js",
|
|
185
|
+
"./mcp-server": "./packages/mcp-server/src/index.js",
|
|
186
|
+
"./mesh": "./packages/mesh/src/index.js",
|
|
187
|
+
"./metering": "./packages/metering/src/index.js",
|
|
188
|
+
"./optimizer": "./packages/optimizer/src/index.js",
|
|
189
|
+
"./settlement": "./packages/settlement/src/index.js",
|
|
190
|
+
"./storage": "./packages/storage/src/index.js",
|
|
191
|
+
"./package.json": "./package.json",
|
|
192
|
+
"./passport": "./packages/passport/src/index.js",
|
|
193
|
+
"./relay": "./apps/relay/src/server.mjs",
|
|
194
|
+
"./vault": "./packages/vault/src/index.js"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Production dependency adapters contract
|
|
2
|
+
|
|
3
|
+
`@enigma-ai/enigma/adapters` is a pure local evidence-normalization package. It does not provision cloud resources, open sockets, read environment variables, or load secrets.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The package turns operator/provider references into public-safe readiness evidence for:
|
|
8
|
+
|
|
9
|
+
- `backend_host`
|
|
10
|
+
- `dns_tls`
|
|
11
|
+
- `durable_storage`
|
|
12
|
+
- `kms_or_secret_custody`
|
|
13
|
+
- `backup_restore`
|
|
14
|
+
- `monitoring`
|
|
15
|
+
- `siem_or_log_sink`
|
|
16
|
+
- `operator_acceptance`
|
|
17
|
+
- `runtime_auth`
|
|
18
|
+
- `admin_auth`
|
|
19
|
+
- `data_plane_auth`
|
|
20
|
+
- `network_access_policy`
|
|
21
|
+
- `kms_custody`
|
|
22
|
+
- `tenant_policy_approval`
|
|
23
|
+
- `usage_metering`
|
|
24
|
+
- `service_settlement`
|
|
25
|
+
- `monitoring_alerting`
|
|
26
|
+
- `public_site_security`
|
|
27
|
+
- `security_threat_model`
|
|
28
|
+
- `legal_compliance_approval`
|
|
29
|
+
- `support_sla`
|
|
30
|
+
- `incident_drill`
|
|
31
|
+
- `backup_restore_drill`
|
|
32
|
+
|
|
33
|
+
## Hard boundary
|
|
34
|
+
|
|
35
|
+
Evidence refs are pointers only: ARNs, dashboard IDs, deployment IDs, URLs without credentials, runbook refs, or restore-test refs. They are not proof by themselves that hosted infrastructure is live.
|
|
36
|
+
|
|
37
|
+
The package rejects:
|
|
38
|
+
- bearer/basic credentials,
|
|
39
|
+
- API keys or token-looking strings,
|
|
40
|
+
- private-key PEM blocks,
|
|
41
|
+
- URLs with embedded username/password,
|
|
42
|
+
- password/token/private-key/plaintext/raw-memory/prompt/transcript/completion fields,
|
|
43
|
+
- raw-memory-looking values.
|
|
44
|
+
|
|
45
|
+
## Hosted readiness
|
|
46
|
+
|
|
47
|
+
`normalizeDependencyEvidence(...)` can show which dependency categories have safe references and which are still missing. `hosted_live_ready` must remain false until runtime `/readyz` probes, dependency-specific checks, operator acceptance, and external-blocker checks also pass.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
export const PRODUCTION_DEPENDENCY_EVIDENCE_SCHEMA = 'enigma.production_dependency_evidence.v1';
|
|
2
|
+
|
|
3
|
+
export const PRODUCTION_DEPENDENCY_KEYS = Object.freeze([
|
|
4
|
+
'backend_host',
|
|
5
|
+
'dns_tls',
|
|
6
|
+
'durable_storage',
|
|
7
|
+
'kms_or_secret_custody',
|
|
8
|
+
'backup_restore',
|
|
9
|
+
'monitoring',
|
|
10
|
+
'siem_or_log_sink',
|
|
11
|
+
'operator_acceptance',
|
|
12
|
+
'runtime_auth',
|
|
13
|
+
'admin_auth',
|
|
14
|
+
'data_plane_auth',
|
|
15
|
+
'network_access_policy',
|
|
16
|
+
'kms_custody',
|
|
17
|
+
'tenant_policy_approval',
|
|
18
|
+
'usage_metering',
|
|
19
|
+
'service_settlement',
|
|
20
|
+
'monitoring_alerting',
|
|
21
|
+
'public_site_security',
|
|
22
|
+
'security_threat_model',
|
|
23
|
+
'legal_compliance_approval',
|
|
24
|
+
'support_sla',
|
|
25
|
+
'incident_drill',
|
|
26
|
+
'backup_restore_drill',
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
export const HOSTED_READINESS_REQUIRED_DEPENDENCIES = Object.freeze([
|
|
30
|
+
'backend_host',
|
|
31
|
+
'dns_tls',
|
|
32
|
+
'durable_storage',
|
|
33
|
+
'kms_or_secret_custody',
|
|
34
|
+
'backup_restore',
|
|
35
|
+
'monitoring',
|
|
36
|
+
'siem_or_log_sink',
|
|
37
|
+
'operator_acceptance',
|
|
38
|
+
'runtime_auth',
|
|
39
|
+
'network_access_policy',
|
|
40
|
+
'kms_custody',
|
|
41
|
+
'tenant_policy_approval',
|
|
42
|
+
'usage_metering',
|
|
43
|
+
'service_settlement',
|
|
44
|
+
'monitoring_alerting',
|
|
45
|
+
'public_site_security',
|
|
46
|
+
'security_threat_model',
|
|
47
|
+
'legal_compliance_approval',
|
|
48
|
+
'support_sla',
|
|
49
|
+
'incident_drill',
|
|
50
|
+
'backup_restore_drill',
|
|
51
|
+
]);
|
|
52
|
+
const KEY_SET = new Set(PRODUCTION_DEPENDENCY_KEYS);
|
|
53
|
+
const SAFE_STATUS = new Set(['declared', 'observed', 'verified', 'go']);
|
|
54
|
+
const SECRET_FIELD_RE = /(?:password|passwd|pwd|token|api[_-]?key|private[_-]?key|client[_-]?secret|raw[_-]?memory|plaintext|plain[_-]?text|prompt|completion|transcript|cookie|session)/iu;
|
|
55
|
+
const SECRET_VALUE_RE = /(?:Bearer\s+[A-Za-z0-9._~+/=-]{12,}|Basic\s+[A-Za-z0-9+/=-]{12,}|-----BEGIN [A-Z ]*PRIVATE KEY-----|sk-[A-Za-z0-9_-]{16,}|AKIA[0-9A-Z]{16}|xox[baprs]-[A-Za-z0-9-]{16,})/u;
|
|
56
|
+
const URL_WITH_CREDENTIALS_RE = /^[a-z][a-z0-9+.-]*:\/\/[^\s/@]+:[^\s/@]+@/iu;
|
|
57
|
+
const RAW_MEMORY_VALUE_RE = /(?:raw memory|private prompt|full transcript|decrypted capsule|customer note|launch-code phrase)/iu;
|
|
58
|
+
|
|
59
|
+
function isPlainObject(value) {
|
|
60
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function assertDependencyKey(key) {
|
|
64
|
+
if (!KEY_SET.has(key)) throw new Error(`Unknown production dependency key: ${key}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function assertSafeString(value, path) {
|
|
68
|
+
if (typeof value !== 'string') return;
|
|
69
|
+
if (SECRET_VALUE_RE.test(value)) throw new Error(`Production evidence ${path} appears to contain a secret.`);
|
|
70
|
+
if (URL_WITH_CREDENTIALS_RE.test(value)) throw new Error(`Production evidence ${path} must not contain URL credentials.`);
|
|
71
|
+
if (RAW_MEMORY_VALUE_RE.test(value)) throw new Error(`Production evidence ${path} appears to contain raw memory.`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function assertNoSecretEvidence(value, path = 'evidence') {
|
|
75
|
+
if (typeof value === 'string') {
|
|
76
|
+
assertSafeString(value, path);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(value)) {
|
|
80
|
+
value.forEach((item, index) => assertNoSecretEvidence(item, `${path}[${index}]`));
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (!isPlainObject(value)) return true;
|
|
84
|
+
for (const [key, child] of Object.entries(value)) {
|
|
85
|
+
const childPath = `${path}.${key}`;
|
|
86
|
+
if (SECRET_FIELD_RE.test(key)) throw new Error(`Production evidence ${childPath} uses a forbidden secret/plaintext field name.`);
|
|
87
|
+
assertNoSecretEvidence(child, childPath);
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function safeString(value, field, maxLength = 512) {
|
|
93
|
+
if (value === undefined || value === null) return undefined;
|
|
94
|
+
if (typeof value !== 'string') throw new Error(`${field} must be a string.`);
|
|
95
|
+
const trimmed = value.trim();
|
|
96
|
+
if (trimmed.length === 0) throw new Error(`${field} must be non-empty.`);
|
|
97
|
+
if (trimmed.length > maxLength) throw new Error(`${field} is too long for public readiness evidence.`);
|
|
98
|
+
assertSafeString(trimmed, field);
|
|
99
|
+
return trimmed;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function safeMetadata(metadata) {
|
|
103
|
+
if (metadata === undefined || metadata === null) return {};
|
|
104
|
+
if (!isPlainObject(metadata)) throw new Error('metadata must be an object when provided.');
|
|
105
|
+
assertNoSecretEvidence(metadata, 'metadata');
|
|
106
|
+
const out = {};
|
|
107
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
108
|
+
if (!/^[a-z][a-z0-9_.-]{0,63}$/iu.test(key)) throw new Error(`metadata key ${key} is not safe for public evidence.`);
|
|
109
|
+
if (typeof value === 'string') out[key] = safeString(value, `metadata.${key}`, 256);
|
|
110
|
+
else if (typeof value === 'number' && Number.isFinite(value)) out[key] = value;
|
|
111
|
+
else if (typeof value === 'boolean') out[key] = value;
|
|
112
|
+
else if (Array.isArray(value) && value.every((item) => typeof item === 'string')) out[key] = value.map((item, index) => safeString(item, `metadata.${key}[${index}]`, 128));
|
|
113
|
+
else throw new Error(`metadata.${key} must be a primitive public value.`);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function normalizeEvidenceRef(input, options = {}) {
|
|
119
|
+
const key = options.key ?? input?.key;
|
|
120
|
+
assertDependencyKey(key);
|
|
121
|
+
const source = typeof input === 'string' ? { ref: input } : input;
|
|
122
|
+
if (!isPlainObject(source)) throw new Error(`Production dependency ${key} evidence must be a string or object.`);
|
|
123
|
+
assertNoSecretEvidence(source, key);
|
|
124
|
+
const status = source.status ?? options.status ?? 'declared';
|
|
125
|
+
if (!SAFE_STATUS.has(status)) throw new Error(`Production dependency ${key} status is unsupported.`);
|
|
126
|
+
const ref = safeString(source.ref ?? source.arn ?? source.url ?? source.id, `${key}.ref`);
|
|
127
|
+
const provider = safeString(source.provider ?? options.provider ?? 'operator', `${key}.provider`, 80);
|
|
128
|
+
const observedAt = safeString(source.observed_at ?? source.observedAt ?? options.observed_at ?? options.observedAt ?? new Date(0).toISOString(), `${key}.observed_at`, 64);
|
|
129
|
+
if (Number.isNaN(Date.parse(observedAt))) throw new Error(`Production dependency ${key} observed_at must be an ISO timestamp.`);
|
|
130
|
+
return Object.freeze({
|
|
131
|
+
key,
|
|
132
|
+
status,
|
|
133
|
+
provider,
|
|
134
|
+
ref,
|
|
135
|
+
observed_at: observedAt,
|
|
136
|
+
metadata: safeMetadata(source.metadata),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function normalizeDependencyEvidence(evidence = {}, options = {}) {
|
|
141
|
+
if (!isPlainObject(evidence)) throw new Error('Production dependency evidence must be an object.');
|
|
142
|
+
const normalized = {};
|
|
143
|
+
for (const key of Object.keys(evidence).sort()) {
|
|
144
|
+
assertDependencyKey(key);
|
|
145
|
+
normalized[key] = normalizeEvidenceRef(evidence[key], { key, observed_at: options.observed_at ?? options.observedAt });
|
|
146
|
+
}
|
|
147
|
+
const requiredKeys = options.required_keys ?? options.requiredKeys ?? HOSTED_READINESS_REQUIRED_DEPENDENCIES;
|
|
148
|
+
const missing_keys = missingProductionDependencies(normalized, requiredKeys);
|
|
149
|
+
return Object.freeze({
|
|
150
|
+
schema: PRODUCTION_DEPENDENCY_EVIDENCE_SCHEMA,
|
|
151
|
+
generated_at: safeString(options.generated_at ?? options.generatedAt ?? new Date(0).toISOString(), 'generated_at', 64),
|
|
152
|
+
ok: missing_keys.length === 0,
|
|
153
|
+
evidence: Object.freeze(normalized),
|
|
154
|
+
missing_keys: Object.freeze(missing_keys),
|
|
155
|
+
claim_boundary: Object.freeze([
|
|
156
|
+
'Production dependency evidence is public-safe reference material only.',
|
|
157
|
+
'It is not secret custody, backup restore, monitoring delivery, operator acceptance, or hosted readiness by itself.',
|
|
158
|
+
'hosted_live_ready remains false until runtime probes and operator acceptance also pass.',
|
|
159
|
+
]),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function missingProductionDependencies(evidence = {}, requiredKeys = HOSTED_READINESS_REQUIRED_DEPENDENCIES) {
|
|
164
|
+
if (!isPlainObject(evidence)) throw new Error('evidence must be an object.');
|
|
165
|
+
const missing = [];
|
|
166
|
+
for (const key of requiredKeys) {
|
|
167
|
+
assertDependencyKey(key);
|
|
168
|
+
const item = evidence[key];
|
|
169
|
+
if (!item || item.status === 'declared') missing.push(key);
|
|
170
|
+
}
|
|
171
|
+
return missing;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function readinessEvidenceRefs(evidence = {}) {
|
|
175
|
+
if (!isPlainObject(evidence)) throw new Error('evidence must be an object.');
|
|
176
|
+
const refs = {};
|
|
177
|
+
for (const key of Object.keys(evidence).sort()) {
|
|
178
|
+
const normalized = normalizeEvidenceRef(evidence[key], { key });
|
|
179
|
+
refs[key] = normalized.ref;
|
|
180
|
+
}
|
|
181
|
+
assertNoSecretEvidence(refs, 'readiness_refs');
|
|
182
|
+
return Object.freeze(refs);
|
|
183
|
+
}
|