@lqc123qwe/car-runtime 1.15.1 → 1.15.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/dist/SHA256SUMS +1 -1
- package/dist/car-runtime-1.15.2.tgz +0 -0
- package/dist/car-runtime-1.15.2.tgz.sig.bundle +1 -0
- package/dist/memory/store.d.ts +3 -1
- package/dist/memory/store.js +7 -4
- package/dist/release-audit.jsonl +4 -4
- package/dist/runtime-core/llm.js +11 -1
- package/dist/sbom.json +4 -4
- package/package.json +1 -1
- package/src/memory/store.ts +7 -4
- package/src/runtime-core/llm.ts +11 -1
- package/dist/car-runtime-1.15.1.tgz +0 -0
- package/dist/car-runtime-1.15.1.tgz.sig.bundle +0 -1
package/dist/SHA256SUMS
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
e0800ec15d94c8b4e6410a98642f4dc703c2335fa85cf75436003ccc26a2d327 car-runtime-1.15.2.tgz
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"base64Signature":"MEUCICbvk8lw/0J5k1bnaKNZCM/xgESEFF1qskK5z/7inngoAiEA5582ex8TI6YiJkKaYNPzuIKkUF7S99dxANZb7kpLwLU=","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1akNDQm0yZ0F3SUJBZ0lVSzFtZE02eUltaklTQkxGZ29TY2h3VTlJZXUwd0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ESXdNREkwTURJNFdoY05Nall4TURJd01ESTFNREk0V2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwcVF3SVNGV2VndFhBYzI4dzR4dGs3U0lyOFU1TFBKWlBmOHYKbGJvdEFveGszbnI0bWs5YjlLVWRDWmNSRVYzOGdZV0N3YnVkQzZzMXpHMUc4UEJjbGFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpJd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLR1F4TWpaa05EUXlNVGt6TUdVMk5HVTNOV00zTmpZMQpNamcwWmpSbVpHWTNZVEpqWkRnNU5qSXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVFV1TWpBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpJd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENoawpNVEkyWkRRME1qRTVNekJsTmpSbE56VmpOelkyTlRJNE5HWTBabVJtTjJFeVkyUTRPVFl5TUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENoawpNVEkyWkRRME1qRTVNekJsTmpSbE56VmpOelkyTlRJNE5HWTBabVJtTjJFeVkyUTRPVFl5TUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVFV1TWpBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFMUxqSXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2hrTVRJMlpEUTBNakU1TXpCbE5qUmxOelZqTnpZMk5USTROR1kwWm1SbU4yRXlZMlE0T1RZeU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTVNell3TVRZeApPRFE0TDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE5TNHlNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hWeTZETkFBQUJBTUFSekJGCkFpRUFrcWFVMUZQZVhGSzh1bHlCWmdZTFZvWHZRVnpUdThURnIwb0MwVDFXYWlJQ0lFakRpdDZsVXUyUkZRQkUKS04wMFA3TTZrUGlBK25uN1FwM1l4L09NVjYwbk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01BaDJEOXJPSTQ4bApjMUFrM3lnVG1ybWF3VXRsOW9rd2pVcVJkTjVrSmNMcjNKWjdpd0h3VmtCV1N3Vm5Ja09BVUFJd1NiK2dFK2loCm1FZUo3Q0VBNktmSXJad0dzN2c3UFhPS2tyVFBYQWYzYmFUSHJRRFRDbWFSeExibjd5WWFEelJICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K","rekorBundle":{"SignedEntryTimestamp":"MEUCIGu7TqDI7QG1De0ED4bg7V58GvGtV+wwmfbPqrwhlx3vAiEAj917MyoFKHsgkZvu/rLtaR4kd1UzZ7MWzVjP+eUHf00=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJlMDgwMGVjMTVkOTRjOGI0ZTY0MTBhOTg2NDJmNGRjNzAzYzIzMzVmYTg1Y2Y3NTQzNjAwM2NjYzI2YTJkMzI3In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJQ2J2azhsdy8wSjVrMWJuYUtOWkNNL3hnRVNFRkYxcXNrSzV6Lzdpbm5nb0FpRUE1NTgyZXg4VEk2WWlKa0thWU5QenVJS2tVRjdTOTlkeEFOWmI3a3BMd0xVPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFha05EUW0weVowRjNTVUpCWjBsVlN6RnRaRTAyZVVsdGFrbFRRa3hHWjI5VFkyaDNWVGxKWlhVd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFU1hkTlJFa3dUVVJKTkZkb1kwNU5hbGw0VFVSSmQwMUVTVEZOUkVrMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV3Y1ZGM1NWTkdWMlZuZEZoQll6STRkelI0ZEdzM1UwbHlPRlUxVEZCS1dsQm1PSFlLYkdKdmRFRnZlR3N6Ym5JMGJXczVZamxMVldSRFdtTlNSVll6T0dkWlYwTjNZblZrUXpaek1YcEhNVWM0VUVKamJHRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1V4VEdwSmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUjFGNFRXcGFhMDVFVVhsTlZHdDZUVWRWTWs1SFZUTk9WMDB6VG1wWk1RcE5hbWN3V21wU2JWcEhXVE5aVkVwcVdrUm5OVTVxU1hkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkZWMVRXcEJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVXhUR3BKZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm9hd3BOVkVreVdrUlJNRTFxUlRWTmVrSnNUbXBTYkU1NlZtcE9lbGt5VGxSSk5FNUhXVEJhYlZKdFRqSkZlVmt5VVRSUFZGbDVUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVOb2F3cE5WRWt5V2tSUk1FMXFSVFZOZWtKc1RtcFNiRTU2Vm1wT2Vsa3lUbFJKTkU1SFdUQmFiVkp0VGpKRmVWa3lVVFJQVkZsNVRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkZWMVRXcEJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTVV4cVNYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJoclRWUkpNbHBFVVRCTmFrVTFUWHBDYkU1cVVteE9lbFpxVG5wWk1rNVVTVFJPUjFrd1dtMVNiVTR5UlhsWk1sRTBUMVJaZVUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUVk5lbGwzVFZSWmVBcFBSRkUwVERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU1VE5IbE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaFdlVFpFVGtGQlFVSkJUVUZTZWtKR0NrRnBSVUZyY1dGVk1VWlFaVmhHU3poMWJIbENXbWRaVEZadldIWlJWbnBVZFRoVVJuSXdiME13VkRGWFlXbEpRMGxGYWtScGREWnNWWFV5VWtaUlFrVUtTMDR3TUZBM1RUWnJVR2xCSzI1dU4xRndNMWw0TDA5TlZqWXdiazFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbU5CVFVkUlEwMUJhREpFT1hKUFNUUTRiQXBqTVVGck0zbG5WRzF5YldGM1ZYUnNPVzlyZDJwVmNWSmtUalZyU21OTWNqTktXamRwZDBoM1ZtdENWMU4zVm01SmEwOUJWVUZKZDFOaUsyZEZLMmxvQ20xRlpVbzNRMFZCTmt0bVNYSmFkMGR6TjJjM1VGaFBTMnR5VkZCWVFXWXpZbUZVU0hKUlJGUkRiV0ZTZUV4aWJqZDVXV0ZFZWxKSUNpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19","integratedTime":1792464029,"logIndex":3329865420,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -24,7 +24,9 @@ export interface MemoryEventPayload {
|
|
|
24
24
|
export declare class MemoryStore {
|
|
25
25
|
#private;
|
|
26
26
|
readonly dir: string;
|
|
27
|
-
constructor(dir: string
|
|
27
|
+
constructor(dir: string, opts?: {
|
|
28
|
+
now?: () => number;
|
|
29
|
+
});
|
|
28
30
|
/** 列出全部记忆(updatedAt 降序——最近维护优先);坏文件显式拒绝(带病不静默,loadSessionLog 同纪律) */
|
|
29
31
|
list(): MemoryEntry[];
|
|
30
32
|
get(id: string): MemoryEntry | undefined;
|
package/dist/memory/store.js
CHANGED
|
@@ -38,8 +38,11 @@ function assertValidId(id) {
|
|
|
38
38
|
}
|
|
39
39
|
export class MemoryStore {
|
|
40
40
|
dir;
|
|
41
|
-
|
|
41
|
+
/** 时钟缝(1.15.2 测试可观测性):缺省 Date.now;spec 注入受控时钟消除同毫秒排序竞态 */
|
|
42
|
+
#now;
|
|
43
|
+
constructor(dir, opts) {
|
|
42
44
|
this.dir = dir;
|
|
45
|
+
this.#now = opts?.now ?? Date.now;
|
|
43
46
|
mkdirSync(dir, { recursive: true });
|
|
44
47
|
}
|
|
45
48
|
#file(id) {
|
|
@@ -100,7 +103,7 @@ export class MemoryStore {
|
|
|
100
103
|
if (this.get(id)) {
|
|
101
104
|
throw new Error(`CAR-E-MEM-EXISTS: 记忆 "${id}" 已存在(write 冲突 fail-visible——修改请走 edit)`);
|
|
102
105
|
}
|
|
103
|
-
const now =
|
|
106
|
+
const now = this.#now();
|
|
104
107
|
const entry = { id, text: input.text, createdAt: now, updatedAt: now };
|
|
105
108
|
if (input.tags?.length)
|
|
106
109
|
entry.tags = [...input.tags];
|
|
@@ -126,7 +129,7 @@ export class MemoryStore {
|
|
|
126
129
|
}
|
|
127
130
|
// tags 语义:undefined = 不变(payload 不带键,重放取前态);数组 = 整体替换(含空数组 =
|
|
128
131
|
// 清空,payload 恒带键——重放 [] 与清空同构,禁「带键/缺键」二义)
|
|
129
|
-
const next = { ...prev, text, updatedAt:
|
|
132
|
+
const next = { ...prev, text, updatedAt: this.#now() };
|
|
130
133
|
if (tags !== undefined) {
|
|
131
134
|
const { tags: _drop, ...rest } = next;
|
|
132
135
|
void _drop;
|
|
@@ -191,7 +194,7 @@ export class MemoryStore {
|
|
|
191
194
|
});
|
|
192
195
|
try {
|
|
193
196
|
if (target.present) {
|
|
194
|
-
const entry = { id, text: target.text, createdAt: target.createdAt, updatedAt:
|
|
197
|
+
const entry = { id, text: target.text, createdAt: target.createdAt, updatedAt: this.#now() };
|
|
195
198
|
if (target.tags?.length)
|
|
196
199
|
entry.tags = [...target.tags];
|
|
197
200
|
if (target.sourceSession)
|
package/dist/release-audit.jsonl
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"stage":"archive","detail":"git archive HEAD → car-runtime-1.15.
|
|
2
|
-
{"stage":"sha256sums","detail":"SHA256SUMS
|
|
3
|
-
{"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":
|
|
4
|
-
{"stage":"cosign-keyless","detail":"signed car-runtime-1.15.
|
|
1
|
+
{"stage":"archive","detail":"git archive HEAD → car-runtime-1.15.2.tgz(395974 bytes,树哈希锚定)","ts":1792464026924}
|
|
2
|
+
{"stage":"sha256sums","detail":"SHA256SUMS e0800ec15d94c8b4…(裸字节复核通过)","ts":1792464026924}
|
|
3
|
+
{"stage":"sbom","detail":"55 个组件(运行时依赖 0 项)","ts":1792464026929}
|
|
4
|
+
{"stage":"cosign-keyless","detail":"signed car-runtime-1.15.2.tgz (keyless OIDC + Rekor)","ts":1792464030951}
|
package/dist/runtime-core/llm.js
CHANGED
|
@@ -164,6 +164,11 @@ const nodeHttpSseFetch = (url, init = {}) => new Promise((resolve, reject) => {
|
|
|
164
164
|
const mod = u.protocol === 'https:' ? httpsRequest : httpRequest;
|
|
165
165
|
const req = mod(u, { method: init.method ?? 'GET', headers: init.headers }, res => {
|
|
166
166
|
const status = res.statusCode ?? 0;
|
|
167
|
+
// 1.15.2-BUG(桌面 S6 终验实证):取消时 req.destroy(err) 会让**响应流** res 异步 emit
|
|
168
|
+
// 'error'——此前无监听 → Node 抛 unhandled 'error' 事件 → 宿主进程直接退出(Electron
|
|
169
|
+
// utilityProcess 无 uncaughtException 兜底时 = 句柄全失、引导队列被 resume 误标 interrupted)。
|
|
170
|
+
// 迭代器侧已由 streamSsePost 的 catch 按 D-19 静默收口,此处监听仅防进程级未捕获异常
|
|
171
|
+
res.on('error', () => { });
|
|
167
172
|
resolve({
|
|
168
173
|
ok: status >= 200 && status < 300,
|
|
169
174
|
status,
|
|
@@ -176,8 +181,13 @@ const nodeHttpSseFetch = (url, init = {}) => new Promise((resolve, reject) => {
|
|
|
176
181
|
body: res,
|
|
177
182
|
});
|
|
178
183
|
});
|
|
184
|
+
// 1.15.2-BUG(桌面 S6 终验 R-1 实证):取消走 destroy() **不带 Error**——此前
|
|
185
|
+
// `req.destroy(new Error('aborted'))` 在 Electron Node 24 宿主体内表现为进程级未捕获
|
|
186
|
+
// 异常(响应流侧异步派发,无监听 → 宿主 utilityProcess 直接退出,句柄全失、引导队列被
|
|
187
|
+
// resume 误标 interrupted)。取消语义已由 spec.signal / D-19 承载,无需错误对象;
|
|
188
|
+
// res 侧 error 监听为双保险(中断时的取消性错误不再逃逸到进程级)。
|
|
179
189
|
const onAbort = () => { try {
|
|
180
|
-
req.destroy(
|
|
190
|
+
req.destroy();
|
|
181
191
|
}
|
|
182
192
|
catch { /* 已完成 */ } };
|
|
183
193
|
if (init.signal) {
|
package/dist/sbom.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CAR-SBOM",
|
|
3
3
|
"specVersion": "0.1",
|
|
4
|
-
"version": "1.15.
|
|
4
|
+
"version": "1.15.2",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
7
7
|
"type": "file",
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
{
|
|
127
127
|
"type": "file",
|
|
128
128
|
"path": "src/memory/store.ts",
|
|
129
|
-
"sha256": "
|
|
129
|
+
"sha256": "6390d1bd7739ca7f1d37cc5012cced4870ea9d8aba8310e5eac40d4f340d7b77"
|
|
130
130
|
},
|
|
131
131
|
{
|
|
132
132
|
"type": "file",
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
{
|
|
177
177
|
"type": "file",
|
|
178
178
|
"path": "src/runtime-core/llm.ts",
|
|
179
|
-
"sha256": "
|
|
179
|
+
"sha256": "b61eb6d9373442b5e35476b741184b5048451b6530c3490ea2a178d2982a8cc9"
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
"type": "file",
|
|
@@ -271,7 +271,7 @@
|
|
|
271
271
|
{
|
|
272
272
|
"type": "file",
|
|
273
273
|
"path": "package.json",
|
|
274
|
-
"sha256": "
|
|
274
|
+
"sha256": "8504cceeead963e5b78bc07d347fef56432304bb8b2db676c7b0c2a386a9d7c2"
|
|
275
275
|
},
|
|
276
276
|
{
|
|
277
277
|
"type": "file",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lqc123qwe/car-runtime",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.2",
|
|
4
4
|
"description": "Composable Agent Runtime (CAR) - microkernel plugin system with sandboxed PTC, append-only hashed session log, and MCP host bridge",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
package/src/memory/store.ts
CHANGED
|
@@ -67,9 +67,12 @@ function assertValidId(id: string): void {
|
|
|
67
67
|
|
|
68
68
|
export class MemoryStore {
|
|
69
69
|
readonly dir: string
|
|
70
|
+
/** 时钟缝(1.15.2 测试可观测性):缺省 Date.now;spec 注入受控时钟消除同毫秒排序竞态 */
|
|
71
|
+
readonly #now: () => number
|
|
70
72
|
|
|
71
|
-
constructor(dir: string) {
|
|
73
|
+
constructor(dir: string, opts?: { now?: () => number }) {
|
|
72
74
|
this.dir = dir
|
|
75
|
+
this.#now = opts?.now ?? Date.now
|
|
73
76
|
mkdirSync(dir, { recursive: true })
|
|
74
77
|
}
|
|
75
78
|
|
|
@@ -132,7 +135,7 @@ export class MemoryStore {
|
|
|
132
135
|
if (this.get(id)) {
|
|
133
136
|
throw new Error(`CAR-E-MEM-EXISTS: 记忆 "${id}" 已存在(write 冲突 fail-visible——修改请走 edit)`)
|
|
134
137
|
}
|
|
135
|
-
const now =
|
|
138
|
+
const now = this.#now()
|
|
136
139
|
const entry: MemoryEntry = { id, text: input.text, createdAt: now, updatedAt: now }
|
|
137
140
|
if (input.tags?.length) entry.tags = [...input.tags]
|
|
138
141
|
if (input.sourceSession) entry.sourceSession = input.sourceSession
|
|
@@ -156,7 +159,7 @@ export class MemoryStore {
|
|
|
156
159
|
}
|
|
157
160
|
// tags 语义:undefined = 不变(payload 不带键,重放取前态);数组 = 整体替换(含空数组 =
|
|
158
161
|
// 清空,payload 恒带键——重放 [] 与清空同构,禁「带键/缺键」二义)
|
|
159
|
-
const next: MemoryEntry = { ...prev, text, updatedAt:
|
|
162
|
+
const next: MemoryEntry = { ...prev, text, updatedAt: this.#now() }
|
|
160
163
|
if (tags !== undefined) {
|
|
161
164
|
const { tags: _drop, ...rest } = next as MemoryEntry & { tags?: string[] }
|
|
162
165
|
void _drop
|
|
@@ -216,7 +219,7 @@ export class MemoryStore {
|
|
|
216
219
|
} satisfies MemoryEventPayload)
|
|
217
220
|
try {
|
|
218
221
|
if (target.present) {
|
|
219
|
-
const entry: MemoryEntry = { id, text: target.text!, createdAt: target.createdAt!, updatedAt:
|
|
222
|
+
const entry: MemoryEntry = { id, text: target.text!, createdAt: target.createdAt!, updatedAt: this.#now() }
|
|
220
223
|
if (target.tags?.length) entry.tags = [...target.tags]
|
|
221
224
|
if (target.sourceSession) entry.sourceSession = target.sourceSession
|
|
222
225
|
this.#writeFile(entry)
|
package/src/runtime-core/llm.ts
CHANGED
|
@@ -189,6 +189,11 @@ const nodeHttpSseFetch = (url: string, init: { method?: string; headers?: Record
|
|
|
189
189
|
const mod = u.protocol === 'https:' ? httpsRequest : httpRequest
|
|
190
190
|
const req = mod(u, { method: init.method ?? 'GET', headers: init.headers }, res => {
|
|
191
191
|
const status = res.statusCode ?? 0
|
|
192
|
+
// 1.15.2-BUG(桌面 S6 终验实证):取消时 req.destroy(err) 会让**响应流** res 异步 emit
|
|
193
|
+
// 'error'——此前无监听 → Node 抛 unhandled 'error' 事件 → 宿主进程直接退出(Electron
|
|
194
|
+
// utilityProcess 无 uncaughtException 兜底时 = 句柄全失、引导队列被 resume 误标 interrupted)。
|
|
195
|
+
// 迭代器侧已由 streamSsePost 的 catch 按 D-19 静默收口,此处监听仅防进程级未捕获异常
|
|
196
|
+
res.on('error', () => { /* 取消/中断:由消费侧(streamSsePost catch)收口 */ })
|
|
192
197
|
resolve({
|
|
193
198
|
ok: status >= 200 && status < 300,
|
|
194
199
|
status,
|
|
@@ -201,7 +206,12 @@ const nodeHttpSseFetch = (url: string, init: { method?: string; headers?: Record
|
|
|
201
206
|
body: res,
|
|
202
207
|
})
|
|
203
208
|
})
|
|
204
|
-
|
|
209
|
+
// 1.15.2-BUG(桌面 S6 终验 R-1 实证):取消走 destroy() **不带 Error**——此前
|
|
210
|
+
// `req.destroy(new Error('aborted'))` 在 Electron Node 24 宿主体内表现为进程级未捕获
|
|
211
|
+
// 异常(响应流侧异步派发,无监听 → 宿主 utilityProcess 直接退出,句柄全失、引导队列被
|
|
212
|
+
// resume 误标 interrupted)。取消语义已由 spec.signal / D-19 承载,无需错误对象;
|
|
213
|
+
// res 侧 error 监听为双保险(中断时的取消性错误不再逃逸到进程级)。
|
|
214
|
+
const onAbort = () => { try { req.destroy() } catch { /* 已完成 */ } }
|
|
205
215
|
if (init.signal) {
|
|
206
216
|
if (init.signal.aborted) onAbort()
|
|
207
217
|
else init.signal.addEventListener('abort', onAbort, { once: true })
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"base64Signature":"MEYCIQC1Pd8enRMQuJLPeyQxzcr+Jrs5tNBepaveEloOXtX2ngIhALWseKiCpb4moRpy0KpUqDQI5IbifzLv1ok43QvSeHQY","cert":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUc1ekNDQm0yZ0F3SUJBZ0lVT1lYVXBLWkZCSWZzelIvZFQwNm9jNVcydWl3d0NnWUlLb1pJemowRUF3TXcKTnpFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUjR3SEFZRFZRUURFeFZ6YVdkemRHOXlaUzFwYm5SbApjbTFsWkdsaGRHVXdIaGNOTWpZeE1ERTVNRGN3TWpJNFdoY05Nall4TURFNU1EY3hNakk0V2pBQU1Ga3dFd1lICktvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUwZFFETHVuWmtEb2RNdy9lSHNIL2o1RnlmNjNFN2FLL2VXWncKN3RoUG1aYSs4TmxYWHByVHo4elFqWXl5aWtiZHh1b2JMSGFOU2lPZy9uK3UwcFlDWXFPQ0JZd3dnZ1dJTUE0RwpBMVVkRHdFQi93UUVBd0lIZ0RBVEJnTlZIU1VFRERBS0JnZ3JCZ0VGQlFjREF6QWZCZ05WSFNNRUdEQVdnQlRmCjArblBWaVFSbHZtbzJPa29WYUxHTGhoa1B6QmlCZ05WSFJFQkFmOEVXREJXaGxSb2RIUndjem92TDJkcGRHaDEKWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHpMM0psYkdWaApjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpFd09RWUtLd1lCQkFHRHZ6QUJBUVFyYUhSMGNITTZMeTkwCmIydGxiaTVoWTNScGIyNXpMbWRwZEdoMVluVnpaWEpqYjI1MFpXNTBMbU52YlRBVkJnb3JCZ0VFQVlPL01BRUMKQkFkeVpXeGxZWE5sTURZR0Npc0dBUVFCZzc4d0FRTUVLR1UzWkRneE5tRm1NV1F6WkRaa1pqSTVNVEpoWldNdwpNRGt6TW1Vek9XVmpZMkkyTkdJNU1XWXdGUVlLS3dZQkJBR0R2ekFCQkFRSGNtVnNaV0Z6WlRBZ0Jnb3JCZ0VFCkFZTy9NQUVGQkJKc2NXTTJNalF2WTJGeUxYSjFiblJwYldVd0hnWUtLd1lCQkFHRHZ6QUJCZ1FRY21WbWN5OTAKWVdkekx6RXVNVFV1TVRBN0Jnb3JCZ0VFQVlPL01BRUlCQzBNSzJoMGRIQnpPaTh2ZEc5clpXNHVZV04wYVc5dQpjeTVuYVhSb2RXSjFjMlZ5WTI5dWRHVnVkQzVqYjIwd1pBWUtLd1lCQkFHRHZ6QUJDUVJXREZSb2RIUndjem92CkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMEwyTmhjaTF5ZFc1MGFXMWxMeTVuYVhSb2RXSXZkMjl5YTJac2IzZHoKTDNKbGJHVmhjMlV1ZVcxc1FISmxabk12ZEdGbmN5OHhMakUxTGpFd09BWUtLd1lCQkFHRHZ6QUJDZ1FxRENobApOMlE0TVRaaFpqRmtNMlEyWkdZeU9URXlZV1ZqTURBNU16SmxNemxsWTJOaU5qUmlPVEZtTUIwR0Npc0dBUVFCCmc3OHdBUXNFRHd3TloybDBhSFZpTFdodmMzUmxaREExQmdvckJnRUVBWU8vTUFFTUJDY01KV2gwZEhCek9pOHYKWjJsMGFIVmlMbU52YlM5c2NXTTJNalF2WTJGeUxYSjFiblJwYldVd09BWUtLd1lCQkFHRHZ6QUJEUVFxRENobApOMlE0TVRaaFpqRmtNMlEyWkdZeU9URXlZV1ZqTURBNU16SmxNemxsWTJOaU5qUmlPVEZtTUNBR0Npc0dBUVFCCmc3OHdBUTRFRWd3UWNtVm1jeTkwWVdkekx6RXVNVFV1TVRBYUJnb3JCZ0VFQVlPL01BRVBCQXdNQ2pFek5qRXgKT1RJM01UUXdLUVlLS3dZQkJBR0R2ekFCRUFRYkRCbG9kSFJ3Y3pvdkwyZHBkR2gxWWk1amIyMHZiSEZqTmpJMApNQmdHQ2lzR0FRUUJnNzh3QVJFRUNnd0lOamt5TXpRMU5qUXdaQVlLS3dZQkJBR0R2ekFCRWdSV0RGUm9kSFJ3CmN6b3ZMMmRwZEdoMVlpNWpiMjB2YkhGak5qSTBMMk5oY2kxeWRXNTBhVzFsTHk1bmFYUm9kV0l2ZDI5eWEyWnMKYjNkekwzSmxiR1ZoYzJVdWVXMXNRSEpsWm5NdmRHRm5jeTh4TGpFMUxqRXdPQVlLS3dZQkJBR0R2ekFCRXdRcQpEQ2hsTjJRNE1UWmhaakZrTTJRMlpHWXlPVEV5WVdWak1EQTVNekpsTXpsbFkyTmlOalJpT1RGbU1CY0dDaXNHCkFRUUJnNzh3QVJRRUNRd0hjbVZzWldGelpUQlpCZ29yQmdFRUFZTy9NQUVWQkVzTVNXaDBkSEJ6T2k4dloybDAKYUhWaUxtTnZiUzlzY1dNMk1qUXZZMkZ5TFhKMWJuUnBiV1V2WVdOMGFXOXVjeTl5ZFc1ekx6TTVNakV6TkRJMgpPVEU1TDJGMGRHVnRjSFJ6THpFd0ZnWUtLd1lCQkFHRHZ6QUJGZ1FJREFad2RXSnNhV013VUFZS0t3WUJCQUdECnZ6QUJHQVJDREVCeVpYQnZPbXh4WXpZeU5FQTJPVEl6TkRVMk5DOWpZWEl0Y25WdWRHbHRaVUF4TXpZeE1Ua3kKTnpFME9uSmxaanB5WldaekwzUmhaM012TVM0eE5TNHhNSUdLQmdvckJnRUVBZFo1QWdRQ0JId0VlZ0I0QUhZQQozVDB3YXNiSEVUSmpHUjRjbVdjM0FxSktYcmplUEszL2g0cHlnQzhwN280QUFBR2hVdmdGUWdBQUJBTUFSekJGCkFpQVVzSXJVZm4xRDVDelMzVWRkd1NzV2FwSEU1aW5nWTVCYkxXSXdCTnpKakFJaEFQbU9WNW9UajNGdXNDbUcKV3dRNmxuQ2dkS3VwM1IrT1p0VHVqVFhXWjA4ME1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01FNlZxVGhrMGxMaAo5NEVsU05iMjNFWlI1UXA5T3J4RHBwckhkODFKUklJeEpUczE0M2QrZ1ZwRG1jVWxmRFdxRlFJeEFMQ2U0Vi9YCjQyZUwwMjFMSHR5ekFBelV4ei9IakdHOVU3Zk9RVkhFejVnb2dHMVpLR1JRTkVZMXBOL0Z4QkNrVUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==","rekorBundle":{"SignedEntryTimestamp":"MEUCIGZpwjyHanrQN38GmVzMx+W/q7gYQ8ee+mVMm9bgMYBuAiEA9SpTASJaO9rm+UTocrIKNF6DeLUSiHFJk5NRq8RiPJA=","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI0OGM1NzMzNDE0YTdmNDAyN2ViNDQxYTM1YjRkYjBmOTExYjVhOGI4MWQ4ODlhZDIxMjg0MDQwMWQ4ZTJiNzUyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUMxUGQ4ZW5STVF1SkxQZXlReHpjcitKcnM1dE5CZXBhdmVFbG9PWHRYMm5nSWhBTFdzZUtpQ3BiNG1vUnB5MEtwVXFEUUk1SWJpZnpMdjFvazQzUXZTZUhRWSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVYzFla05EUW0weVowRjNTVUpCWjBsVlQxbFlWWEJMV2taQ1NXWnplbEl2WkZRd05tOWpOVmN5ZFdsM2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFplRTFFUlRWTlJHTjNUV3BKTkZkb1kwNU5hbGw0VFVSRk5VMUVZM2hOYWtrMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV3WkZGRVRIVnVXbXRFYjJSTmR5OWxTSE5JTDJvMVJubG1Oak5GTjJGTEwyVlhXbmNLTjNSb1VHMWFZU3M0VG14WVdIQnlWSG80ZWxGcVdYbDVhV3RpWkhoMWIySk1TR0ZPVTJsUFp5OXVLM1V3Y0ZsRFdYRlBRMEpaZDNkbloxZEpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXWkNaMDVXU0ZOTlJVZEVRVmRuUWxSbUNqQXJibEJXYVZGU2JIWnRiekpQYTI5V1lVeEhUR2hvYTFCNlFtbENaMDVXU0ZKRlFrRm1PRVZYUkVKWGFHeFNiMlJJVW5kamVtOTJUREprY0dSSGFERUtXV2sxYW1JeU1IWmlTRVpxVG1wSk1Fd3lUbWhqYVRGNVpGYzFNR0ZYTVd4TWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTBwc1lrZFdhQXBqTWxWMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IaE1ha1V4VEdwRmQwOVJXVXRMZDFsQ1FrRkhSSFo2UVVKQlVWRnlZVWhTTUdOSVRUWk1lVGt3Q21JeWRHeGlhVFZvV1ROU2NHSXlOWHBNYldSd1pFZG9NVmx1Vm5wYVdFcHFZakkxTUZwWE5UQk1iVTUyWWxSQlZrSm5iM0pDWjBWRlFWbFBMMDFCUlVNS1FrRmtlVnBYZUd4WldFNXNUVVJaUjBOcGMwZEJVVkZDWnpjNGQwRlJUVVZMUjFVeldrUm5lRTV0Um0xTlYxRjZXa1JhYTFwcVNUVk5WRXBvV2xkTmR3cE5SR3Q2VFcxVmVrOVhWbXBaTWtreVRrZEpOVTFYV1hkR1VWbExTM2RaUWtKQlIwUjJla0ZDUWtGUlNHTnRWbk5hVjBaNldsUkJaMEpuYjNKQ1owVkZDa0ZaVHk5TlFVVkdRa0pLYzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMGhuV1V0TGQxbENRa0ZIUkhaNlFVSkNaMUZSWTIxV2JXTjVPVEFLV1Zka2VreDZSWFZOVkZWMVRWUkJOMEpuYjNKQ1owVkZRVmxQTDAxQlJVbENRekJOU3pKb01HUklRbnBQYVRoMlpFYzVjbHBYTkhWWlYwNHdZVmM1ZFFwamVUVnVZVmhTYjJSWFNqRmpNbFo1V1RJNWRXUkhWblZrUXpWcVlqSXdkMXBCV1V0TGQxbENRa0ZIUkhaNlFVSkRVVkpYUkVaU2IyUklVbmRqZW05MkNrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUV3eVRtaGphVEY1WkZjMU1HRlhNV3hNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIb0tURE5LYkdKSFZtaGpNbFYxWlZjeGMxRklTbXhhYmsxMlpFZEdibU41T0hoTWFrVXhUR3BGZDA5QldVdExkMWxDUWtGSFJIWjZRVUpEWjFGeFJFTm9iQXBPTWxFMFRWUmFhRnBxUm10Tk1sRXlXa2RaZVU5VVJYbFpWMVpxVFVSQk5VMTZTbXhOZW14c1dUSk9hVTVxVW1sUFZFWnRUVUl3UjBOcGMwZEJVVkZDQ21jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacFRGZG9kbU16VW14YVJFRXhRbWR2Y2tKblJVVkJXVTh2VFVGRlRVSkRZMDFLVjJnd1pFaENlazlwT0hZS1dqSnNNR0ZJVm1sTWJVNTJZbE01YzJOWFRUSk5hbEYyV1RKR2VVeFlTakZpYmxKd1lsZFZkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVOb2JBcE9NbEUwVFZSYWFGcHFSbXROTWxFeVdrZFplVTlVUlhsWlYxWnFUVVJCTlUxNlNteE5lbXhzV1RKT2FVNXFVbWxQVkVadFRVTkJSME5wYzBkQlVWRkNDbWMzT0hkQlVUUkZSV2QzVVdOdFZtMWplVGt3V1Zka2VreDZSWFZOVkZWMVRWUkJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmVrNXFSWGdLVDFSSk0wMVVVWGRMVVZsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWWtSQ2JHOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaVNFWnFUbXBKTUFwTlFtZEhRMmx6UjBGUlVVSm5OemgzUVZKRlJVTm5kMGxPYW10NVRYcFJNVTVxVVhkYVFWbExTM2RaUWtKQlIwUjJla0ZDUldkU1YwUkdVbTlrU0ZKM0NtTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZa2hHYWs1cVNUQk1NazVvWTJreGVXUlhOVEJoVnpGc1RIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTUtZak5rZWt3elNteGlSMVpvWXpKVmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUaDRUR3BGTVV4cVJYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjUXBFUTJoc1RqSlJORTFVV21oYWFrWnJUVEpSTWxwSFdYbFBWRVY1V1ZkV2FrMUVRVFZOZWtwc1RYcHNiRmt5VG1sT2FsSnBUMVJHYlUxQ1kwZERhWE5IQ2tGUlVVSm5OemgzUVZKUlJVTlJkMGhqYlZaeldsZEdlbHBVUWxwQ1oyOXlRbWRGUlVGWlR5OU5RVVZXUWtWelRWTlhhREJrU0VKNlQyazRkbG95YkRBS1lVaFdhVXh0VG5aaVV6bHpZMWROTWsxcVVYWlpNa1o1VEZoS01XSnVVbkJpVjFWMldWZE9NR0ZYT1hWamVUbDVaRmMxZWt4NlRUVk5ha1Y2VGtSSk1ncFBWRVUxVERKR01HUkhWblJqU0ZKNlRIcEZkMFpuV1V0TGQxbENRa0ZIUkhaNlFVSkdaMUZKUkVGYWQyUlhTbk5oVjAxM1ZVRlpTMHQzV1VKQ1FVZEVDblo2UVVKSFFWSkRSRVZDZVZwWVFuWlBiWGg0V1hwWmVVNUZRVEpQVkVsNlRrUlZNazVET1dwWldFbDBZMjVXZFdSSGJIUmFWVUY0VFhwWmVFMVVhM2tLVG5wRk1FOXVTbXhhYW5CNVdsZGFla3d6VW1oYU0wMTJUVk0wZUU1VE5IaE5TVWRMUW1kdmNrSm5SVVZCWkZvMVFXZFJRMEpJZDBWbFowSTBRVWhaUVFvelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdOMjgwUVVGQlIyaFZkbWRHVVdkQlFVSkJUVUZTZWtKR0NrRnBRVlZ6U1hKVlptNHhSRFZEZWxNelZXUmtkMU56VjJGd1NFVTFhVzVuV1RWQ1lreFhTWGRDVG5wS2FrRkphRUZRYlU5V05XOVVhak5HZFhORGJVY0tWM2RSTm14dVEyZGtTM1Z3TTFJclQxcDBWSFZxVkZoWFdqQTRNRTFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMUZObFp4Vkdock1HeE1hQW81TkVWc1UwNWlNak5GV2xJMVVYQTVUM0o0UkhCd2NraGtPREZLVWtsSmVFcFVjekUwTTJRcloxWndSRzFqVld4bVJGZHhSbEZKZUVGTVEyVTBWaTlZQ2pReVpVd3dNakZNU0hSNWVrRkJlbFY0ZWk5SWFrZEhPVlUzWms5UlZraEZlalZuYjJkSE1WcExSMUpSVGtWWk1YQk9MMFo0UWtOclZVRTlQUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In19fX0=","integratedTime":1792393348,"logIndex":3319543860,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}
|