@aopslabs/aops 0.3.12 → 0.3.13

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.
@@ -117,6 +117,6 @@
117
117
  },
118
118
  "schemaVersion": 1,
119
119
  "standard": "aops-community-core-v1",
120
- "version": "0.3.12",
121
- "versionId": "community-core-0.3.12"
120
+ "version": "0.3.13",
121
+ "versionId": "community-core-0.3.13"
122
122
  }
@@ -10,8 +10,8 @@
10
10
  "name": "aops",
11
11
  "optional": false,
12
12
  "packageSha256": "ec1a663c171f7b847980a06dc84ce045493880f8a71d9d2e992d9bcaa31407ff",
13
- "version": "0.3.12",
14
- "versionId": "community-core-0.3.12"
13
+ "version": "0.3.13",
14
+ "versionId": "community-core-0.3.13"
15
15
  },
16
16
  "gateway": {
17
17
  "byteLength": 621,
@@ -22,7 +22,7 @@
22
22
  "kind": "aops-community-agent-assets-inventory-v1",
23
23
  "schemaVersion": 1,
24
24
  "source": {
25
- "commit": "4c0de59827ef0b3ff1494d4626eac56736da88ee",
25
+ "commit": "a5b7b4eb0d4d5ea665fbc1f05522d97a1935f99b",
26
26
  "repository": "git+https://github.com/eeemzs/aops-platform",
27
27
  "root": "apps/aops-cli/assets/agent-assets"
28
28
  }
@@ -11,8 +11,8 @@
11
11
  "name": "aops",
12
12
  "optional": false,
13
13
  "packageSha256": "ec1a663c171f7b847980a06dc84ce045493880f8a71d9d2e992d9bcaa31407ff",
14
- "version": "0.3.12",
15
- "versionId": "community-core-0.3.12"
14
+ "version": "0.3.13",
15
+ "versionId": "community-core-0.3.13"
16
16
  },
17
17
  "files": [
18
18
  {
@@ -123,7 +123,7 @@
123
123
  {
124
124
  "byteLength": 3978,
125
125
  "ref": "agent-assets/core/ec1a663c171f7b847980a06dc84ce045493880f8a71d9d2e992d9bcaa31407ff/manifest.json",
126
- "sha256": "6a328805ad7d840594f6f171e94071b0f931404ab86dfb9fc37f93815dfb6675"
126
+ "sha256": "dcedec023b2e427994d3a5b523de2f4718c4f3114978e2eb374fe445e80dd69b"
127
127
  },
128
128
  {
129
129
  "byteLength": 621,
@@ -133,7 +133,7 @@
133
133
  {
134
134
  "byteLength": 926,
135
135
  "ref": "agent-assets/inventory.json",
136
- "sha256": "b6ce24a65a42831fa037617838762688a11a7c01efcb86470e1ade2d0672a260"
136
+ "sha256": "3b672add77d82c6b6f958b5c6246e5f4e2a92b98439c989b2210608cd4cf7a11"
137
137
  },
138
138
  {
139
139
  "byteLength": 281,
@@ -149,7 +149,7 @@
149
149
  },
150
150
  "inventory": {
151
151
  "ref": "agent-assets/inventory.json",
152
- "sha256": "b6ce24a65a42831fa037617838762688a11a7c01efcb86470e1ade2d0672a260"
152
+ "sha256": "3b672add77d82c6b6f958b5c6246e5f4e2a92b98439c989b2210608cd4cf7a11"
153
153
  },
154
154
  "kind": "aops-community-agent-assets-release-v1",
155
155
  "projection": {
@@ -158,7 +158,7 @@
158
158
  },
159
159
  "root": "agent-assets",
160
160
  "schemaVersion": 1,
161
- "setSha256": "0c165103307fece47df0776bc1bdd45898317769904cc46d4bd809afe0737027"
161
+ "setSha256": "ea0107d7dd8a809fdab71c009a843f3fa35a2d7c915851e45ae5147e8ddfbb93"
162
162
  },
163
163
  "evidence": {
164
164
  "signature": {
@@ -166,10 +166,10 @@
166
166
  }
167
167
  },
168
168
  "kind": "aops-community-agent-assets-bundle-v1",
169
- "releaseVersion": "0.3.12",
169
+ "releaseVersion": "0.3.13",
170
170
  "schemaVersion": 1,
171
171
  "source": {
172
- "commit": "4c0de59827ef0b3ff1494d4626eac56736da88ee",
172
+ "commit": "a5b7b4eb0d4d5ea665fbc1f05522d97a1935f99b",
173
173
  "repository": "git+https://github.com/eeemzs/aops-platform",
174
174
  "root": "apps/aops-cli/assets/agent-assets"
175
175
  }
@@ -4,13 +4,13 @@
4
4
  "x509CertificateChain": {
5
5
  "certificates": [
6
6
  {
7
- "rawBytes": "MIIHdDCCBvmgAwIBAgIUXrQzPMVetpkdZSixwh5umfdJXEAwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODEyMTM0MzQyWhcNMjYwODEyMTM1MzQyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDvyc5UC0pXGyRRA3kbmGpjHBb+cy6R69q/yhZiWrDTarTXZOyPb+ql6bAUL8OS7Wr83TPaW4giyFMq3AqjAZ+qOCBhgwggYUMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU19WlvqpVfo2MigdIwOHoNHSAnF4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdAYDVR0RAQH/BGowaIZmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoNGMwZGU1OTgyN2VmMGIzZmYxNDk0ZDQ2MjZlYWM1NjczNmRhODhlZTAxBgorBgEEAYO/MAEEBCNTaWduIGV4YWN0IHB1YmxpYyBBT1BTIGFnZW50IGFzc2V0czAiBgorBgEEAYO/MAEFBBRlZWVtenMvYW9wcy1wbGF0Zm9ybTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHYGCisGAQQBg78wAQkEaAxmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoNGMwZGU1OTgyN2VmMGIzZmYxNDk0ZDQ2MjZlYWM1NjczNmRhODhlZTAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwNwYKKwYBBAGDvzABDAQpDCdodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0wOAYKKwYBBAGDvzABDQQqDCg0YzBkZTU5ODI3ZWYwYjNmZjE0OTRkNDYyNmVhYzU2NzM2ZGE4OGVlMB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTMxNjI1NTAyNjApBgorBgEEAYO/MAEQBBsMGWh0dHBzOi8vZ2l0aHViLmNvbS9lZWVtenMwGQYKKwYBBAGDvzABEQQLDAkxMDkzMTA3NzQwdgYKKwYBBAGDvzABEgRoDGZodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1wdWJsaWMtYWdlbnQtYXNzZXRzLnltbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg0YzBkZTU5ODI3ZWYwYjNmZjE0OTRkNDYyNmVhYzU2NzM2ZGE4OGVlMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwWwYKKwYBBAGDvzABFQRNDEtodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vYWN0aW9ucy9ydW5zLzMxNjAyODIwNzY3L2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMFIGCisGAQQBg78wARgERAxCcmVwbzplZWVtenNAMTA5MzEwNzc0L2FvcHMtcGxhdGZvcm1AMTMxNjI1NTAyNjpyZWY6cmVmcy9oZWFkcy9tYWluMIGJBgorBgEEAdZ5AgQCBHsEeQB3AHUA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGf9jbrxgAABAMARjBEAiAyBaAFHC+j1WTHQguv4bjVTu7npctL3HMaGSX+cte86gIgHz0hdhVgGIdBbxo5if2XKqJp3JPz0QP53VqxWYyXnrYwCgYIKoZIzj0EAwMDaQAwZgIxAKOxcj0bOrUbdyXtTCOMz9+Ma5bHFeIu628CTA2aIt+qwSGCZ0TN3/S/xZB1CPQcIgIxALgr1YU6w2Kboae38nJTi6h8qfXzFBhzVqWO8LZ7zZ0NOEmaHgXHFpm5EDGR730s1w=="
7
+ "rawBytes": "MIIHczCCBvqgAwIBAgIUX8ATdNZ6Vt3wdEbzWBZwQTuhPK8wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODEyMjEwMzExWhcNMjYwODEyMjExMzExWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECDW8aHV8fWgwzw6fByX8HL7uKLXe4yydKaDZbFLwwdx1Mc2EJszg40hE2rk8J/1K9iYOb6WumDhMoAq+n8vlO6OCBhkwggYVMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUuLaxYry9c+LPu4dbtRlMhOth2TMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdAYDVR0RAQH/BGowaIZmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoYTViN2I0ZWIwZDRkNWVhNjY1ZmJjMWYwNTUyMmQ5N2ExOTM1Zjk5YjAxBgorBgEEAYO/MAEEBCNTaWduIGV4YWN0IHB1YmxpYyBBT1BTIGFnZW50IGFzc2V0czAiBgorBgEEAYO/MAEFBBRlZWVtenMvYW9wcy1wbGF0Zm9ybTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHYGCisGAQQBg78wAQkEaAxmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYTViN2I0ZWIwZDRkNWVhNjY1ZmJjMWYwNTUyMmQ5N2ExOTM1Zjk5YjAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwNwYKKwYBBAGDvzABDAQpDCdodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0wOAYKKwYBBAGDvzABDQQqDChhNWI3YjRlYjBkNGQ1ZWE2NjVmYmMxZjA1NTIyZDk3YTE5MzVmOTliMB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTMxNjI1NTAyNjApBgorBgEEAYO/MAEQBBsMGWh0dHBzOi8vZ2l0aHViLmNvbS9lZWVtenMwGQYKKwYBBAGDvzABEQQLDAkxMDkzMTA3NzQwdgYKKwYBBAGDvzABEgRoDGZodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1wdWJsaWMtYWdlbnQtYXNzZXRzLnltbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDChhNWI3YjRlYjBkNGQ1ZWE2NjVmYmMxZjA1NTIyZDk3YTE5MzVmOTliMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwWwYKKwYBBAGDvzABFQRNDEtodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vYWN0aW9ucy9ydW5zLzMxNjQwNjA4MzMyL2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMFIGCisGAQQBg78wARgERAxCcmVwbzplZWVtenNAMTA5MzEwNzc0L2FvcHMtcGxhdGZvcm1AMTMxNjI1NTAyNjpyZWY6cmVmcy9oZWFkcy9tYWluMIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGf98lJzwAABAMARzBFAiB9MbiieLNmxU75QIhn+Mj4E9RJBDVhb5k0zleN444eRAIhALK7VSGmemtcFWhTOa+DXYD8dn+iHldkdcu/SDXpotNnMAoGCCqGSM49BAMDA2cAMGQCMD2Mlby8HIqcwxOW20p6MT/i6CnS0xjNKE7hJ0W0EB39YmUr06hO7U75msr2IiYfxQIwZhv12LiWykAeCM+YNQa2jdsEQtBlfAWafG0f+jqfETuncrIMVgODub+b5gLMJ7w8"
8
8
  }
9
9
  ]
10
10
  },
11
11
  "tlogEntries": [
12
12
  {
13
- "logIndex": "2437161535",
13
+ "logIndex": "2440657287",
14
14
  "logId": {
15
15
  "keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
16
16
  },
@@ -18,34 +18,38 @@
18
18
  "kind": "hashedrekord",
19
19
  "version": "0.0.1"
20
20
  },
21
- "integratedTime": "1786542222",
21
+ "integratedTime": "1786568592",
22
22
  "inclusionPromise": {
23
- "signedEntryTimestamp": "MEUCIAUh1+bAxa2z3KpO0PjffzVqgXNWeHFhpwInuAshs5NJAiEA7ambQloRTz91/zDrBOZ+eSOM4q0Jjcx6a3gdS/fTELM="
23
+ "signedEntryTimestamp": "MEQCIBc6e8IsZVPvbROjqGlFIVzk89+8GZqjA1/Z/tIzTMnLAiA2gJUh1JaHfnMxl7PCJ5bGKG2WvSl6X4XB9ty4TnibvA=="
24
24
  },
25
25
  "inclusionProof": {
26
- "logIndex": "2315257273",
27
- "rootHash": "TySTIZXLwpzt56M+HaQ6fuYSHmk2b60wYUyV1dC9fPY=",
28
- "treeSize": "2315257285",
26
+ "logIndex": "2318753025",
27
+ "rootHash": "eYVDrjt0/wmG2ESxOBi7wAmCEd+ldyBwfP+rWbblC40=",
28
+ "treeSize": "2318753041",
29
29
  "hashes": [
30
- "dap5Q3G17cwuYYNbO/lr+KHJEiaHu+VR7L4SQhI6tvk=",
31
- "enwl+fW0tgxGVBGbcl/Z4oiEXqJh8+FrWlA6tFIHE5E=",
32
- "RgApDIxYR2JY9sHxgYWTJ2gVutXxwZg7EVFsdzN4Ixo=",
33
- "rB1BZe/ngGTXwgW2Nbnn6OgZG59IN9MPS8E1/KRCOwE=",
34
- "kRcGHzUM4n7JaKREC83bbHMFIxBEJ0ZehUv9SCVGRuQ=",
35
- "b0G4bcQSZU/RXBYHCLVH7n5zj2UZFXIFSo1mrRnqYlI=",
36
- "QTgGZta3nzIdiXPbilI4PLXwDV0X2GER6RT5yMjaLlo=",
37
- "4iVgO4rYG8sWYuspC/I2iRqQShQKCauJhOf+GKtDfjk=",
38
- "TnE3vPpNKxk7NgyiNeQoCnyPdaT3giToGhtKIxQ2uGY=",
39
- "4UN/euia0P9HWMFaSCc4aYjC932x4o5XJww44WN3CGM=",
30
+ "reJIK1v633rTyY8FeBzFTV0jVhIwwsA4sYdcRpu5GHc=",
31
+ "Tuuxa6ljSS++SZYZpg9S/sva7B2adjnZMz3+bPM6rtE=",
32
+ "aodUSn/f8D323RJ2X9n4p/x5M/qIIby9TC7+LNzMMM0=",
33
+ "g0mJ15+k2Ch24D4+hcLMSaxDNXZ9obOoSpj/0JJDvSQ=",
34
+ "/8bhQyURFAqINe12u/JEeAoYKNtYX54sRrRZNG/Z75Q=",
35
+ "mmlvzlwK2cB/cHCaQtk0sjek5csfoznzZ8Ex9ZIMLXM=",
36
+ "RFW6wIyrMs+T7i3g+efWPUkDyirq0uoe57hmh066i0w=",
37
+ "lLSKjO06Q4vbysMliIv+EVZjP/JL5UcUXOvdqv9NYwo=",
38
+ "GBj0UtAa/gO6Y1LwIAIBwZoqaAJvwwvMjSg4heumn3o=",
39
+ "T4DwPMvCdY2D1maAwUdGPTRvt3pvopW8wyWjJXp1rIo=",
40
+ "l+wcD3axZYTIKZJhUL4aHwaKNTuiBaMd8TRP8At2xXs=",
41
+ "NWTCEkdkY4mmIzciQAsPsU/n+9Uk6kWG+k6LO6Z9ifE=",
42
+ "t0mkaxQ4fw9aKmIfYOnoyfYFOplQHNdkgJcfamLv1ys=",
43
+ "XSxOwG3OOcLZKmz63eZsCs2meyCMl1YtmU2DNsxBM5Q=",
40
44
  "mYkFdqU5C9m3w88wTn9l6UpYo+PI93c232s+vBiBEpM=",
41
45
  "ygTG08vB2EEmJQPXRvF5H06Tlac72AkODENK7PhCPkw=",
42
46
  "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="
43
47
  ],
44
48
  "checkpoint": {
45
- "envelope": "rekor.sigstore.dev - 1193050959916656506\n2315257285\nTySTIZXLwpzt56M+HaQ6fuYSHmk2b60wYUyV1dC9fPY=\n\n— rekor.sigstore.dev wNI9ajBFAiEAloapWt3Dttq/SNB8Zp3ODHlGB25PfuBgAED2Lu83IoUCIFdzRP3Bb8KdFi4JxlCrYnJFTWZQlsWBd734x3lJAQ7s\n"
49
+ "envelope": "rekor.sigstore.dev - 1193050959916656506\n2318753041\neYVDrjt0/wmG2ESxOBi7wAmCEd+ldyBwfP+rWbblC40=\n\n— rekor.sigstore.dev wNI9ajBGAiEA6658y45P2hBQQuAlwL+MuAFpqqz53ZjGoxemRxq7qMECIQDwxmZrgALy3anfxIvrnR2ci4JcxttF058opd/mepkUZA==\n"
46
50
  }
47
51
  },
48
- "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5MmM3MzdhZjVkYmI0NzUxOWYzYzFlNjljNDJiNTgzMDBlMDc0YWQ0NjY5YmQyZmM1NDEyNTA5Y2Y4OWVkMGIwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRlAxREFQQlJwTUNvZnBmeC9CSmRlcC96WWRqVG5ncWgzRmc1K3lEWWZUcEFpRUEyaTlpNERvYUxnU1dPY0FTRUZkVnJ5THorUktJVEFtY205Y1VQSHFJUmdvPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGtSRU5EUW5adFowRjNTVUpCWjBsVldISlJlbEJOVm1WMGNHdGtXbE5wZUhkb05YVnRabVJLV0VWQmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFUlhsTlZFMHdUWHBSZVZkb1kwNU5hbGwzVDBSRmVVMVVUVEZOZWxGNVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZFZG5sak5WVkRNSEJZUjNsU1VrRXphMkp0UjNCcVNFSmlLMk41TmxJMk9YRXZlV2dLV21sWGNrUlVZWEpVV0ZwUGVWQmlLM0ZzTm1KQlZVdzRUMU0zVjNJNE0xUlFZVmMwWjJsNVJrMXhNMEZ4YWtGYUszRlBRMEpvWjNkbloxbFZUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlV4T1Zkc0NuWnhjRlptYnpKTmFXZGtTWGRQU0c5T1NGTkJia1kwZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSQldVUldVakJTUVZGSUwwSkhiM2RoU1ZwdFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKV2JGcFhNVFpqZVRsb1lqTkNlZ3BNV0VKeldWaFNiV0l6U25STWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTA1d1dqSTBkR05JVm1saVIyeHFURmRHYmxwWE5UQk1WMFo2Q21NeVZqQmplVFUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJyUjBOcGMwZEJVVkZDWnpjNGQwRlJSVVZMTW1nd1pFaENlazlwT0hZS1pFYzVjbHBYTkhWWlYwNHdZVmM1ZFdONU5XNWhXRkp2WkZkS01XTXlWbmxaTWpsMVpFZFdkV1JETldwaU1qQjNTSGRaUzB0M1dVSkNRVWRFZG5wQlFncEJaMUZTWkRJNWVXRXlXbk5pTTJSbVdrZHNlbU5IUmpCWk1tZDNUbWRaUzB0M1dVSkNRVWRFZG5wQlFrRjNVVzlPUjAxM1drZFZNVTlVWjNsT01sWnRDazFIU1hwYWJWbDRUa1JyTUZwRVVUSk5hbHBzV1ZkTk1VNXFZM3BPYlZKb1QwUm9iRnBVUVhoQ1oyOXlRbWRGUlVGWlR5OU5RVVZGUWtOT1ZHRlhaSFVLU1VkV05GbFhUakJKU0VJeFdXMTRjRmw1UWtKVU1VSlVTVWRHYmxwWE5UQkpSMFo2WXpKV01HTjZRV2xDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0pTYkFwYVYxWjBaVzVOZGxsWE9YZGplVEYzWWtkR01GcHRPWGxpVkVGa1FtZHZja0puUlVWQldVOHZUVUZGUjBKQk9YbGFWMXA2VERKb2JGbFhVbnBNTWpGb0NtRlhOSGRQZDFsTFMzZFpRa0pCUjBSMmVrRkNRMEZSZEVSRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZta0taRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOU0ZsSFEybHpSMEZSVVVKbk56aDNRVkZyUldGQmVHMWhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESldiRnBYTVRaamVUbG9Zak5DZWt4WVFuTlpXRkp0WWpOS2RFeDVOVzVoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3elRuQmFNalIwQ21OSVZtbGlSMnhxVEZkR2JscFhOVEJNVjBaNll6SldNR041TlRWaVYzaEJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOUkdkSFEybHpSMEZSVVVJS1p6YzRkMEZSYjBWTFozZHZUa2ROZDFwSFZURlBWR2Q1VGpKV2JVMUhTWHBhYlZsNFRrUnJNRnBFVVRKTmFscHNXVmROTVU1cVkzcE9iVkpvVDBSb2JBcGFWRUZrUW1kdmNrSm5SVVZCV1U4dlRVRkZURUpCT0UxRVYyUndaRWRvTVZscE1XOWlNMDR3V2xkUmQwNTNXVXRMZDFsQ1FrRkhSSFo2UVVKRVFWRndDa1JEWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIzVDBGWlMwdDNXVUlLUWtGSFJIWjZRVUpFVVZGeFJFTm5NRmw2UW10YVZGVTFUMFJKTTFwWFdYZFphazV0V21wRk1FOVVVbXRPUkZsNVRtMVdhRmw2VlRKT2VrMHlXa2RGTkFwUFIxWnNUVUk0UjBOcGMwZEJVVkZDWnpjNGQwRlJORVZGVVhkUVkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5RbTlIUTJselIwRlJVVUpuTnpoM0NrRlJPRVZFUVhkTFRWUk5lRTVxU1RGT1ZFRjVUbXBCY0VKbmIzSkNaMFZGUVZsUEwwMUJSVkZDUW5OTlIxZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZta0tURzFPZG1KVE9XeGFWMVowWlc1TmQwZFJXVXRMZDFsQ1FrRkhSSFo2UVVKRlVWRk1SRUZyZUUxRWEzcE5WRUV6VG5wUmQyUm5XVXRMZDFsQ1FrRkhSQXAyZWtGQ1JXZFNiMFJIV205a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIyQ2t4dFpIQmtSMmd4V1drNU0ySXpTbkphYlhoMlpETk5kbU15Ykc1aWFURjNaRmRLYzJGWFRYUlpWMlJzWW01UmRGbFlUbnBhV0ZKNlRHNXNkR0pGUW5rS1dsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjVVJEWnpCWmVrSnJXbFJWTlU5RVNUTmFWMWwzV1dwT2JRcGFha1V3VDFSU2EwNUVXWGxPYlZab1dYcFZNazU2VFRKYVIwVTBUMGRXYkUxRFJVZERhWE5IUVZGUlFtYzNPSGRCVWxGRlJYZDNVbVF5T1hsaE1scHpDbUl6WkdaYVIyeDZZMGRHTUZreVozZFhkMWxMUzNkWlFrSkJSMFIyZWtGQ1JsRlNUa1JGZEc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFlLV2xkV2JHSlljSHBNTWtaMlkwaE5kR05IZUdoa1IxcDJZMjB3ZGxsWFRqQmhWemwxWTNrNWVXUlhOWHBNZWsxNFRtcEJlVTlFU1hkT2Vsa3pUREpHTUFwa1IxWjBZMGhTZWt4NlJYZEdkMWxMUzNkWlFrSkJSMFIyZWtGQ1JtZFJTa1JCWkhkamJXd3lXVmhTYkUxR1NVZERhWE5IUVZGUlFtYzNPSGRCVW1kRkNsSkJlRU5qYlZaM1lucHdiRnBYVm5SbGJrNUJUVlJCTlUxNlJYZE9lbU13VERKR2RtTklUWFJqUjNob1pFZGFkbU50TVVGTlZFMTRUbXBKTVU1VVFYa0tUbXB3ZVZwWFdUWmpiVlp0WTNrNWIxcFhSbXRqZVRsMFdWZHNkVTFKUjBwQ1oyOXlRbWRGUlVGa1dqVkJaMUZEUWtoelJXVlJRak5CU0ZWQk0xUXdkd3BoYzJKSVJWUktha2RTTkdOdFYyTXpRWEZLUzFoeWFtVlFTek12YURSd2VXZERPSEEzYnpSQlFVRkhaamxxWW5KNFowRkJRa0ZOUVZKcVFrVkJhVUY1Q2tKaFFVWklReXRxTVZkVVNGRm5kWFkwWW1wV1ZIVTNibkJqZEV3elNFMWhSMU5ZSzJOMFpUZzJaMGxuU0hvd2FHUm9WbWRIU1dSQ1luaHZOV2xtTWxnS1MzRktjRE5LVUhvd1VWQTFNMVp4ZUZkWmVWaHVjbGwzUTJkWlNVdHZXa2w2YWpCRlFYZE5SR0ZSUVhkYVowbDRRVXRQZUdOcU1HSlBjbFZpWkhsWWRBcFVRMDlOZWprclRXRTFZa2hHWlVsMU5qSTRRMVJCTW1GSmRDdHhkMU5IUTFvd1ZFNHpMMU12ZUZwQ01VTlFVV05KWjBsNFFVeG5jakZaVlRaM01rdGlDbTloWlRNNGJrcFVhVFpvT0hGbVdIcEdRbWg2Vm5GWFR6aE1XamQ2V2pCT1QwVnRZVWhuV0VoR2NHMDFSVVJIVWpjek1ITXhkejA5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn19fX0="
52
+ "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5YTk2NmE2MWRkNDJiNjYxODY0Mjg3YTBlOTNmYzQ2YmUxZDVhOTI5Y2M3Y2RiY2Y0MmIzYTZmMjkwNmZmMzExIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJRVJiR0FGR3RJMXFIdklhNHhDRGc1RXNidmtXTUluS01wMU84Yks5MVMzdUFpRUE3MHJHcnBuZ3Q4ZjhMUFVTOU4yenIzSjZjZmxkMjFzM0FCOW1FOVFVbFFzPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpla05EUW5aeFowRjNTVUpCWjBsVldEaEJWR1JPV2paV2RETjNaRVZpZWxkQ1duZFJWSFZvVUVzNGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFUlhsTmFrVjNUWHBGZUZkb1kwNU5hbGwzVDBSRmVVMXFSWGhOZWtWNFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZEUkZjNFlVaFdPR1pYWjNkNmR6Wm1RbmxZT0VoTU4zVkxURmhsTkhsNVpFdGhSRm9LWWtaTWQzZGtlREZOWXpKRlNuTjZaelF3YUVVeWNtczRTaTh4U3pscFdVOWlObGQxYlVSb1RXOUJjU3R1T0hac1R6WlBRMEpvYTNkbloxbFdUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlYxVEdGNENsbHllVGxqSzB4UWRUUmtZblJTYkUxb1QzUm9NbFJOZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSQldVUldVakJTUVZGSUwwSkhiM2RoU1ZwdFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKV2JGcFhNVFpqZVRsb1lqTkNlZ3BNV0VKeldWaFNiV0l6U25STWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTA1d1dqSTBkR05JVm1saVIyeHFURmRHYmxwWE5UQk1WMFo2Q21NeVZqQmplVFUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJyUjBOcGMwZEJVVkZDWnpjNGQwRlJSVVZMTW1nd1pFaENlazlwT0hZS1pFYzVjbHBYTkhWWlYwNHdZVmM1ZFdONU5XNWhXRkp2WkZkS01XTXlWbmxaTWpsMVpFZFdkV1JETldwaU1qQjNTSGRaUzB0M1dVSkNRVWRFZG5wQlFncEJaMUZTWkRJNWVXRXlXbk5pTTJSbVdrZHNlbU5IUmpCWk1tZDNUbWRaUzB0M1dVSkNRVWRFZG5wQlFrRjNVVzlaVkZacFRqSkpNRnBYU1hkYVJGSnJDazVYVm1oT2Fsa3hXbTFLYWsxWFdYZE9WRlY1VFcxUk5VNHlSWGhQVkUweFdtcHJOVmxxUVhoQ1oyOXlRbWRGUlVGWlR5OU5RVVZGUWtOT1ZHRlhaSFVLU1VkV05GbFhUakJKU0VJeFdXMTRjRmw1UWtKVU1VSlVTVWRHYmxwWE5UQkpSMFo2WXpKV01HTjZRV2xDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0pTYkFwYVYxWjBaVzVOZGxsWE9YZGplVEYzWWtkR01GcHRPWGxpVkVGa1FtZHZja0puUlVWQldVOHZUVUZGUjBKQk9YbGFWMXA2VERKb2JGbFhVbnBNTWpGb0NtRlhOSGRQZDFsTFMzZFpRa0pCUjBSMmVrRkNRMEZSZEVSRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZta0taRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOU0ZsSFEybHpSMEZSVVVKbk56aDNRVkZyUldGQmVHMWhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESldiRnBYTVRaamVUbG9Zak5DZWt4WVFuTlpXRkp0WWpOS2RFeDVOVzVoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3elRuQmFNalIwQ21OSVZtbGlSMnhxVEZkR2JscFhOVEJNVjBaNll6SldNR041TlRWaVYzaEJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOUkdkSFEybHpSMEZSVVVJS1p6YzRkMEZSYjBWTFozZHZXVlJXYVU0eVNUQmFWMGwzV2tSU2EwNVhWbWhPYWxreFdtMUthazFYV1hkT1ZGVjVUVzFSTlU0eVJYaFBWRTB4V21wck5RcFpha0ZrUW1kdmNrSm5SVVZCV1U4dlRVRkZURUpCT0UxRVYyUndaRWRvTVZscE1XOWlNMDR3V2xkUmQwNTNXVXRMZDFsQ1FrRkhSSFo2UVVKRVFWRndDa1JEWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIzVDBGWlMwdDNXVUlLUWtGSFJIWjZRVUpFVVZGeFJFTm9hRTVYU1ROWmFsSnNXV3BDYTA1SFVURmFWMFV5VG1wV2JWbHRUWGhhYWtFeFRsUkplVnBFYXpOWlZFVTFUWHBXYlFwUFZHeHBUVUk0UjBOcGMwZEJVVkZDWnpjNGQwRlJORVZGVVhkUVkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5RbTlIUTJselIwRlJVVUpuTnpoM0NrRlJPRVZFUVhkTFRWUk5lRTVxU1RGT1ZFRjVUbXBCY0VKbmIzSkNaMFZGUVZsUEwwMUJSVkZDUW5OTlIxZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZta0tURzFPZG1KVE9XeGFWMVowWlc1TmQwZFJXVXRMZDFsQ1FrRkhSSFo2UVVKRlVWRk1SRUZyZUUxRWEzcE5WRUV6VG5wUmQyUm5XVXRMZDFsQ1FrRkhSQXAyZWtGQ1JXZFNiMFJIV205a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIyQ2t4dFpIQmtSMmd4V1drNU0ySXpTbkphYlhoMlpETk5kbU15Ykc1aWFURjNaRmRLYzJGWFRYUlpWMlJzWW01UmRGbFlUbnBhV0ZKNlRHNXNkR0pGUW5rS1dsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjVVJEYUdoT1Ywa3pXV3BTYkZscVFtdE9SMUV4V2xkRk1ncE9hbFp0V1cxTmVGcHFRVEZPVkVsNVdrUnJNMWxVUlRWTmVsWnRUMVJzYVUxRFJVZERhWE5IUVZGUlFtYzNPSGRCVWxGRlJYZDNVbVF5T1hsaE1scHpDbUl6WkdaYVIyeDZZMGRHTUZreVozZFhkMWxMUzNkWlFrSkJSMFIyZWtGQ1JsRlNUa1JGZEc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFlLV2xkV2JHSlljSHBNTWtaMlkwaE5kR05IZUdoa1IxcDJZMjB3ZGxsWFRqQmhWemwxWTNrNWVXUlhOWHBNZWsxNFRtcFJkMDVxUVRSTmVrMTVUREpHTUFwa1IxWjBZMGhTZWt4NlJYZEdkMWxMUzNkWlFrSkJSMFIyZWtGQ1JtZFJTa1JCWkhkamJXd3lXVmhTYkUxR1NVZERhWE5IUVZGUlFtYzNPSGRCVW1kRkNsSkJlRU5qYlZaM1lucHdiRnBYVm5SbGJrNUJUVlJCTlUxNlJYZE9lbU13VERKR2RtTklUWFJqUjNob1pFZGFkbU50TVVGTlZFMTRUbXBKTVU1VVFYa0tUbXB3ZVZwWFdUWmpiVlp0WTNrNWIxcFhSbXRqZVRsMFdWZHNkVTFKUjB0Q1oyOXlRbWRGUlVGa1dqVkJaMUZEUWtoM1JXVm5RalJCU0ZsQk0xUXdkd3BoYzJKSVJWUktha2RTTkdOdFYyTXpRWEZLUzFoeWFtVlFTek12YURSd2VXZERPSEEzYnpSQlFVRkhaams0YkVwNmQwRkJRa0ZOUVZKNlFrWkJhVUk1Q2sxaWFXbGxURTV0ZUZVM05WRkphRzRyVFdvMFJUbFNTa0pFVm1oaU5Xc3dlbXhsVGpRME5HVlNRVWxvUVV4TE4xWlRSMjFsYlhSalJsZG9WRTloSzBRS1dGbEVPR1J1SzJsSWJHUnJaR04xTDFORVdIQnZkRTV1VFVGdlIwTkRjVWRUVFRRNVFrRk5SRUV5WTBGTlIxRkRUVVF5VFd4aWVUaElTWEZqZDNoUFZ3b3lNSEEyVFZRdmFUWkRibE13ZUdwT1MwVTNhRW93VnpCRlFqTTVXVzFWY2pBMmFFODNWVGMxYlhOeU1rbHBXV1o0VVVsM1dtaDJNVEpNYVZkNWEwRmxDa05OSzFsT1VXRXlhbVJ6UlZGMFFteG1RVmRoWmtjd1ppdHFjV1pGVkhWdVkzSkpUVlpuVDBSMVlpdGlOV2RNVFVvM2R6Z0tMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="
49
53
  }
50
54
  ],
51
55
  "timestampVerificationData": {}
@@ -53,8 +57,8 @@
53
57
  "messageSignature": {
54
58
  "messageDigest": {
55
59
  "algorithm": "SHA2_256",
56
- "digest": "ksc3r127R1GfPB5pxCtYMA4HStRmm9L8VBJQnPie0LA="
60
+ "digest": "mpZqYd1CtmGGQoeg6T/Ea+HVqSnMfNvPQrOm8pBv8xE="
57
61
  },
58
- "signature": "MEUCIFP1DAPBRpMCofpfx/BJdep/zYdjTngqh3Fg5+yDYfTpAiEA2i9i4DoaLgSWOcASEFdVryLz+RKITAmcm9cUPHqIRgo="
62
+ "signature": "MEUCIERbGAFGtI1qHvIa4xCDg5EsbvkWMInKMp1O8bK91S3uAiEA70rGrpngt8f8LPUS9N2zr3J6cfld21s3AB9mE9QUlQs="
59
63
  }
60
64
  }
@@ -14,9 +14,12 @@ const EXACT_STABLE_VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
14
14
  const PLAN_ID = /^sha256:[a-f0-9]{64}$/u;
15
15
  const SHA256 = /^[a-f0-9]{64}$/u;
16
16
  const SHA512_INTEGRITY = /^sha512-[A-Za-z0-9+/]+={0,2}$/u;
17
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
17
18
  const PACKAGE_NAMES = ['@aopslabs/aops', '@aopslabs/aops-server'];
18
19
  const HEALTH_SAMPLES = 4;
19
20
  const HEALTH_INTERVAL_MS = 3_000;
21
+ const HEALTH_STARTUP_ATTEMPTS = 30;
22
+ const HEALTH_STARTUP_INTERVAL_MS = 2_000;
20
23
  function cleanEnvironment() {
21
24
  return {
22
25
  ...process.env,
@@ -44,8 +47,32 @@ function defaultRunner(command, args, cwd = process.cwd()) {
44
47
  assert.equal(result.status, 0, `${command} ${args.join(' ')} failed\n${result.stdout}\n${result.stderr}`);
45
48
  return result.stdout;
46
49
  }
47
- function npmCommand() {
48
- return process.platform === 'win32' ? 'npm.cmd' : 'npm';
50
+ export function resolveNpmInvocation(options = {}) {
51
+ const platform = options.platform ?? process.platform;
52
+ if (platform !== 'win32')
53
+ return { command: 'npm', prefixArgs: [] };
54
+ const nodeExecutable = path.resolve(options.nodeExecutable ?? process.execPath);
55
+ const environment = options.environment ?? process.env;
56
+ const fileExists = options.fileExists ?? existsSync;
57
+ const candidates = [
58
+ path.join(path.dirname(nodeExecutable), 'node_modules', 'npm', 'bin', 'npm-cli.js'),
59
+ ];
60
+ const npmExecPath = environment.npm_execpath?.trim();
61
+ if (npmExecPath && /^npm-cli\.(?:c?js)$/iu.test(path.basename(npmExecPath))) {
62
+ candidates.push(path.resolve(npmExecPath));
63
+ }
64
+ for (const entry of String(environment.PATH ?? '').split(path.delimiter)) {
65
+ if (!entry.trim())
66
+ continue;
67
+ candidates.push(path.resolve(entry, 'node_modules', 'npm', 'bin', 'npm-cli.js'));
68
+ }
69
+ const npmCli = [...new Set(candidates)].find((candidate) => fileExists(candidate));
70
+ assert.ok(npmCli, 'windows_npm_cli_not_found');
71
+ return { command: nodeExecutable, prefixArgs: [npmCli] };
72
+ }
73
+ function runNpm(run, args, cwd) {
74
+ const invocation = resolveNpmInvocation();
75
+ return run(invocation.command, [...invocation.prefixArgs, ...args], cwd);
49
76
  }
50
77
  export function publicNpmArgs(args) {
51
78
  return [
@@ -106,9 +133,8 @@ function packageManifest(packageRoot, expectedName) {
106
133
  return manifest;
107
134
  }
108
135
  function inspectGlobalInstall(run) {
109
- const npm = npmCommand();
110
- const globalPrefix = plainDirectory(run(npm, ['prefix', '--global']).trim(), 'global npm prefix');
111
- const globalRoot = plainDirectory(run(npm, ['root', '--global']).trim(), 'global npm root');
136
+ const globalPrefix = plainDirectory(runNpm(run, ['prefix', '--global']).trim(), 'global npm prefix');
137
+ const globalRoot = plainDirectory(runNpm(run, ['root', '--global']).trim(), 'global npm root');
112
138
  ensureWithin(globalPrefix, globalRoot, 'global npm root');
113
139
  const cliRoot = path.join(globalRoot, '@aopslabs', 'aops');
114
140
  const cli = packageManifest(cliRoot, '@aopslabs/aops');
@@ -129,10 +155,12 @@ function inspectGlobalInstall(run) {
129
155
  assert.equal(exactVersion(server.version, `installed ${placement} Server version`), exactServerDependency, `installed ${placement} Server does not match the CLI exact dependency`);
130
156
  }
131
157
  const cliPath = plainFile(path.join(cliRoot, 'dist', 'main.js'), 'global AOPS CLI entrypoint');
158
+ const serverPath = plainDirectory(nestedServer ? nestedServerRoot : topLevelServerRoot, 'global AOPS Server root');
132
159
  return {
133
160
  globalPrefix,
134
161
  globalRoot,
135
162
  cliPath,
163
+ serverPath,
136
164
  packages: {
137
165
  cli: exactVersion(cli.version, 'installed CLI version'),
138
166
  server: exactServerDependency,
@@ -141,7 +169,7 @@ function inspectGlobalInstall(run) {
141
169
  };
142
170
  }
143
171
  function npmViewString(run, selector, field) {
144
- const value = parseJson(run(npmCommand(), publicNpmArgs(['view', selector, field, '--json'])).trim(), `npm_view_${field}`);
172
+ const value = parseJson(runNpm(run, publicNpmArgs(['view', selector, field, '--json'])).trim(), `npm_view_${field}`);
145
173
  if (typeof value !== 'string')
146
174
  throw new Error(`${selector} ${field} must be a string`);
147
175
  return value;
@@ -189,7 +217,7 @@ function assertHealthyServices(services) {
189
217
  assert.equal(services.cockpit.health, 'healthy', 'AOPS Cockpit must be healthy before update');
190
218
  }
191
219
  function packRegistryPackage(run, destination, name, version) {
192
- const packed = parseJson(run(npmCommand(), publicNpmArgs([
220
+ const packed = parseJson(runNpm(run, publicNpmArgs([
193
221
  'pack',
194
222
  `${name}@${version}`,
195
223
  '--ignore-scripts',
@@ -276,6 +304,8 @@ export function prepareGlobalUpdate(options = {}, run = defaultRunner) {
276
304
  requiresExactConfirmation: true,
277
305
  healthSamples: HEALTH_SAMPLES,
278
306
  healthIntervalMs: HEALTH_INTERVAL_MS,
307
+ healthStartupAttempts: HEALTH_STARTUP_ATTEMPTS,
308
+ healthStartupIntervalMs: HEALTH_STARTUP_INTERVAL_MS,
279
309
  },
280
310
  };
281
311
  const plan = { ...body, planId: computeGlobalUpdatePlanId(body) };
@@ -330,6 +360,8 @@ export function readGlobalUpdatePlan(planPath) {
330
360
  assert.equal(plan.safety.requiresExactConfirmation, true);
331
361
  assert.equal(plan.safety.healthSamples, HEALTH_SAMPLES);
332
362
  assert.equal(plan.safety.healthIntervalMs, HEALTH_INTERVAL_MS);
363
+ assert.equal(plan.safety.healthStartupAttempts, HEALTH_STARTUP_ATTEMPTS);
364
+ assert.equal(plan.safety.healthStartupIntervalMs, HEALTH_STARTUP_INTERVAL_MS);
333
365
  return plan;
334
366
  }
335
367
  export function installGlobalUpdateClosure(run, plan, records, topology) {
@@ -337,10 +369,10 @@ export function installGlobalUpdateClosure(run, plan, records, topology) {
337
369
  const server = packageRecordByName(records, '@aopslabs/aops-server');
338
370
  const cacheRoot = path.join(plan.operationRoot, 'cache');
339
371
  mkdirSync(cacheRoot, { recursive: true, mode: 0o700 });
340
- run(npmCommand(), publicNpmArgs(['cache', 'add', server.path, `--cache=${cacheRoot}`]));
372
+ runNpm(run, publicNpmArgs(['cache', 'add', server.path, `--cache=${cacheRoot}`]));
341
373
  const topLevelServerRoot = path.join(plan.globalRoot, '@aopslabs', 'aops-server');
342
374
  if (existsSync(path.join(topLevelServerRoot, 'package.json'))) {
343
- run(npmCommand(), publicNpmArgs([
375
+ runNpm(run, publicNpmArgs([
344
376
  '--prefix',
345
377
  plan.globalPrefix,
346
378
  'uninstall',
@@ -363,12 +395,12 @@ export function installGlobalUpdateClosure(run, plan, records, topology) {
363
395
  '--audit=false',
364
396
  ];
365
397
  if (topology.topLevelServer && !topology.nestedServer) {
366
- run(npmCommand(), publicNpmArgs([...commonInstallArgs, cli.path, server.path]));
398
+ runNpm(run, publicNpmArgs([...commonInstallArgs, cli.path, server.path]));
367
399
  return;
368
400
  }
369
- run(npmCommand(), publicNpmArgs([...commonInstallArgs, cli.path]));
401
+ runNpm(run, publicNpmArgs([...commonInstallArgs, cli.path]));
370
402
  if (topology.topLevelServer) {
371
- run(npmCommand(), publicNpmArgs([
403
+ runNpm(run, publicNpmArgs([
372
404
  ...commonInstallArgs,
373
405
  server.path,
374
406
  ]));
@@ -386,16 +418,54 @@ function stopService(run, cliPath, service, bestEffort = false) {
386
418
  function startService(run, cliPath, service) {
387
419
  run(process.execPath, [cliPath, service, 'start', '--json']);
388
420
  }
421
+ function updateServerApplication(run, cliPath, expected) {
422
+ const result = runInstalledJson(run, cliPath, ['server', 'update', '--detach', '--json']);
423
+ assert.equal(result.status, 'community-native-application-updated');
424
+ assert.equal(result.priorReleaseVersion, expected.prior);
425
+ assert.equal(result.releaseVersion, expected.target);
426
+ assert.equal(typeof result.updateId, 'string');
427
+ assert.match(result.updateId, UUID);
428
+ return result.updateId;
429
+ }
430
+ function rollbackServerApplication(run, cliPath, updateId, serverPath, expectedRelease) {
431
+ const result = runInstalledJson(run, cliPath, [
432
+ 'server',
433
+ 'rollback',
434
+ 'app',
435
+ '--update-id',
436
+ updateId,
437
+ '--source-root',
438
+ serverPath,
439
+ '--detach',
440
+ '--json',
441
+ ]);
442
+ assert.equal(result.status, 'community-native-application-rolled-back');
443
+ assert.equal(result.updateId, updateId);
444
+ assert.equal(result.releaseVersion, expectedRelease);
445
+ }
389
446
  const defaultExecutionDependencies = {
390
447
  fetch: globalThis.fetch.bind(globalThis),
391
448
  sleep: (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),
392
449
  };
450
+ class StartupHealthPending extends Error {
451
+ constructor(cause) {
452
+ super('global_update_health_startup_pending', { cause });
453
+ }
454
+ }
393
455
  async function assertStableHealth(run, plan, execution) {
394
456
  const evidence = [];
395
- for (let sample = 1; sample <= plan.safety.healthSamples; sample += 1) {
457
+ const collectSample = async (sample, startup) => {
396
458
  const installed = inspectGlobalInstall(run);
397
- const services = serviceSnapshot(run, installed.cliPath);
398
- assertHealthyServices(services);
459
+ let services;
460
+ try {
461
+ services = serviceSnapshot(run, installed.cliPath);
462
+ assertHealthyServices(services);
463
+ }
464
+ catch (error) {
465
+ if (startup)
466
+ throw new StartupHealthPending(error);
467
+ throw error;
468
+ }
399
469
  const serverOrigin = validateLoopbackOrigin(services.server.origin, 'AOPS Server origin');
400
470
  const cockpitOrigin = validateLoopbackOrigin(services.cockpit.origin, 'AOPS Cockpit origin');
401
471
  const endpoints = [];
@@ -404,15 +474,45 @@ async function assertStableHealth(run, plan, execution) {
404
474
  ['cockpit', cockpitOrigin],
405
475
  ['cockpit-proxy', `${cockpitOrigin}/api/health`],
406
476
  ]) {
407
- const response = await execution.fetch(url, { cache: 'no-store', signal: AbortSignal.timeout(15_000) });
477
+ let response;
478
+ try {
479
+ response = await execution.fetch(url, { cache: 'no-store', signal: AbortSignal.timeout(15_000) });
480
+ }
481
+ catch (error) {
482
+ if (startup)
483
+ throw new StartupHealthPending(error);
484
+ throw error;
485
+ }
486
+ if (response.status !== 200 && startup) {
487
+ throw new StartupHealthPending(new Error(`${name} health returned ${response.status}`));
488
+ }
408
489
  assert.equal(response.status, 200, `${name} health returned ${response.status}`);
409
490
  const body = await response.arrayBuffer();
410
491
  endpoints.push({ name, url, status: response.status, bytes: body.byteLength });
411
492
  }
412
- evidence.push({ sample, observedAt: new Date().toISOString(), endpoints });
413
- if (sample < plan.safety.healthSamples) {
414
- await execution.sleep(plan.safety.healthIntervalMs);
493
+ return { sample, observedAt: new Date().toISOString(), endpoints };
494
+ };
495
+ let startupError;
496
+ for (let attempt = 1; attempt <= plan.safety.healthStartupAttempts; attempt += 1) {
497
+ try {
498
+ evidence.push(await collectSample(1, true));
499
+ startupError = undefined;
500
+ break;
415
501
  }
502
+ catch (error) {
503
+ if (!(error instanceof StartupHealthPending))
504
+ throw error;
505
+ startupError = error.cause ?? error;
506
+ if (attempt < plan.safety.healthStartupAttempts) {
507
+ await execution.sleep(plan.safety.healthStartupIntervalMs);
508
+ }
509
+ }
510
+ }
511
+ if (startupError)
512
+ throw startupError;
513
+ for (let sample = 2; sample <= plan.safety.healthSamples; sample += 1) {
514
+ await execution.sleep(plan.safety.healthIntervalMs);
515
+ evidence.push(await collectSample(sample, false));
416
516
  }
417
517
  return evidence;
418
518
  }
@@ -437,6 +537,7 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
437
537
  assert.equal(current.globalPrefix, plan.globalPrefix, 'global npm prefix changed after update planning');
438
538
  assertHealthyServices(serviceSnapshot(run, current.cliPath));
439
539
  const events = [];
540
+ let applicationUpdateId = null;
440
541
  try {
441
542
  stopService(run, current.cliPath, 'cockpit');
442
543
  events.push('stopped:cockpit');
@@ -447,8 +548,11 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
447
548
  const updated = inspectGlobalInstall(run);
448
549
  assert.deepEqual(updated.packages, plan.target.packages, 'installed candidate closure is not exact');
449
550
  assert.deepEqual(updated.topology, plan.target.topology, 'installed candidate topology is not canonical');
450
- startService(run, updated.cliPath, 'server');
451
- events.push('started:server');
551
+ applicationUpdateId = updateServerApplication(run, updated.cliPath, {
552
+ prior: plan.prior.packages.server,
553
+ target: plan.target.packages.server,
554
+ });
555
+ events.push('updated:server');
452
556
  startService(run, updated.cliPath, 'cockpit');
453
557
  events.push('started:cockpit');
454
558
  const healthEvidence = await assertStableHealth(run, plan, execution);
@@ -474,7 +578,14 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
474
578
  const restored = inspectGlobalInstall(run);
475
579
  assert.deepEqual(restored.packages, plan.prior.packages, 'rollback package closure is not exact');
476
580
  assert.deepEqual(restored.topology, plan.prior.topology, 'rollback package topology is not exact');
477
- startService(run, restored.cliPath, 'server');
581
+ if (applicationUpdateId) {
582
+ rollbackServerApplication(run, restored.cliPath, applicationUpdateId, restored.serverPath, plan.prior.packages.server);
583
+ events.push('rolled-back:server-application');
584
+ }
585
+ else {
586
+ startService(run, restored.cliPath, 'server');
587
+ events.push('started:server-restore');
588
+ }
478
589
  startService(run, restored.cliPath, 'cockpit');
479
590
  await assertStableHealth(run, plan, execution);
480
591
  events.push('rollback:healthy');
@@ -543,9 +543,9 @@ function defaultNativeRoot() {
543
543
  return moduleDirectory.endsWith(`${path.sep}dist`) ? bundled : compiledOrSource;
544
544
  }
545
545
  function injectedNativeManifestSha256() {
546
- return typeof "a1ddbb2b62d0b9b929667faf1404db6d2623ae8fd448ba770ccf3b59c478cbd2" === 'undefined'
546
+ return typeof "9644b89d6936c82a514f32f74d2c65324d45079255cebc642a4af2e36d482964" === 'undefined'
547
547
  ? undefined
548
- : "a1ddbb2b62d0b9b929667faf1404db6d2623ae8fd448ba770ccf3b59c478cbd2";
548
+ : "9644b89d6936c82a514f32f74d2c65324d45079255cebc642a4af2e36d482964";
549
549
  }
550
550
  function sha256(bytes) {
551
551
  return createHash('sha256').update(bytes).digest('hex');
@@ -42,7 +42,7 @@
42
42
  "capabilityClass": "windows-ntfs-crash-recoverable-v1",
43
43
  "qualification": {
44
44
  "relativePath": "qualifications/win32-x64.json",
45
- "sha256": "c02837036e8e0254db24c0c7e7db49e24acc659359ebc42ce9941da1173a1cab"
45
+ "sha256": "f589981718dff79e64aa1171acf66abcb86a662b94015592b22217911752ed58"
46
46
  }
47
47
  }
48
48
  ]
@@ -7,7 +7,7 @@
7
7
  "filesystem": "NTFS",
8
8
  "primitiveProfile": "windows-createfile-flush-movefileex-v1",
9
9
  "capabilityClass": "windows-ntfs-crash-recoverable-v1",
10
- "evidenceSha256": "011dad8836525e5fa57f452a7f199f9c3fd644170938a765253a409c051237fe",
10
+ "evidenceSha256": "0c390c3a76decbc63fcae8e7d84b56322bf25d2fae728406d8a3dda91f09585e",
11
11
  "crashInjectionPoints": [
12
12
  "authority-history",
13
13
  "authority-current",
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aopslabs/aops",
3
- "version": "0.3.12",
3
+ "version": "0.3.13",
4
4
  "type": "module",
5
5
  "description": "AOPS CLI and terminal setup application.",
6
6
  "aopsDockerServerVersion": "0.2.13",