@aopslabs/aops 0.3.17 → 0.3.18

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.
Files changed (36) hide show
  1. package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/aops-cli.md +13 -0
  2. package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/aops-system.md +15 -0
  3. package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/manifest.json +7 -7
  4. package/agent-assets-release/agent-assets/inventory.json +5 -5
  5. package/agent-assets-release/agent-assets/projection.json +1 -1
  6. package/agent-assets-release/agent-assets-release.json +38 -38
  7. package/agent-assets-release/agent-assets-release.sigstore.json +25 -25
  8. package/assets/agent-assets/core/user-guides/aops-cli.md +13 -0
  9. package/assets/agent-assets/core/user-guides/aops-system.md +15 -0
  10. package/dist/commands/community-server.js +1 -0
  11. package/dist/commands/global-update.js +336 -8
  12. package/dist/lib/agent-assets/native-fs.js +2 -2
  13. package/native/manifest.json +1 -1
  14. package/native/qualifications/win32-x64.json +1 -1
  15. package/native/tui/darwin-arm64/aops-tui +0 -0
  16. package/native/tui/win32-x64/aops-tui.exe +0 -0
  17. package/package.json +2 -1
  18. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/SKILL.md +0 -0
  19. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/agentspace/SKILL.md +0 -0
  20. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/aops-cli-core/SKILL.md +0 -0
  21. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/chatv3/SKILL.md +0 -0
  22. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/collaborative-work/SKILL.md +0 -0
  23. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/discuss/SKILL.md +0 -0
  24. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/docman/SKILL.md +0 -0
  25. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/mission/SKILL.md +0 -0
  26. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/projectman/SKILL.md +0 -0
  27. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/sys/SKILL.md +0 -0
  28. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/view/SKILL.md +0 -0
  29. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/working-disciplines/SKILL.md +0 -0
  30. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/agent-assets.md +0 -0
  31. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/agentspace.md +0 -0
  32. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/chatv3.md +0 -0
  33. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/docman.md +0 -0
  34. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/projectman.md +0 -0
  35. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/sys.md +0 -0
  36. /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/working-disciplines.md +0 -0
@@ -61,6 +61,19 @@ aops update prepare --json
61
61
  aops update apply --plan <update-plan.json> --confirm <sha256-plan-id> --json
62
62
  ```
63
63
 
64
+ For the one-time transition from a CLI released before candidate-owned update
65
+ execution, prepare with the installed CLI and apply through the exact external
66
+ target package instead:
67
+
68
+ ```text
69
+ # macOS/Linux (`NUL` replaces `/dev/null` on Windows)
70
+ npm exec --yes --registry=https://registry.npmjs.org --userconfig=/dev/null --package=@aopslabs/aops@<exact-target> -- aops update bridge --plan <update-plan.json> --confirm <sha256-plan-id> --json
71
+ ```
72
+
73
+ `update bridge` refuses to run from the installed old CLI and requires its own
74
+ package version to equal the immutable plan target. Future transitions use the
75
+ normal candidate-owned `update apply` path.
76
+
64
77
  Prepare is non-mutating and retains exact candidate and rollback tarballs.
65
78
  Apply stops Cockpit before Server, installs the public closure as one global
66
79
  CLI with its exact nested Server, repeatedly checks loopback health, and
@@ -55,6 +55,21 @@ aops update prepare --json
55
55
  aops update apply --plan <update-plan.json> --confirm <sha256-plan-id> --json
56
56
  ```
57
57
 
58
+ CLI versions released before candidate-owned execution cannot retroactively
59
+ load the safer apply implementation. For that one transition, let the
60
+ installed old CLI run `prepare`, then launch the exact target package outside
61
+ the global installation and use its explicit bridge command. macOS/Linux:
62
+
63
+ ```text
64
+ npm exec --yes --registry=https://registry.npmjs.org --userconfig=/dev/null --package=@aopslabs/aops@<exact-target> -- aops update bridge --plan <update-plan.json> --confirm <sha256-plan-id> --json
65
+ ```
66
+
67
+ Windows uses the same command with `--userconfig=NUL`. The bridge rejects the
68
+ installed old CLI entrypoint and a candidate version that differs from the
69
+ plan target; that external candidate then stages and re-verifies the complete
70
+ executor closure before any global mutation. Once this transition succeeds,
71
+ ordinary TUI and headless Apply actions use candidate-owned execution.
72
+
58
73
  All metadata and tarball reads are pinned to the public npm registry. A legacy
59
74
  top-level Server dedupe is treated as a repairable package-layout issue. The
60
75
  updater does not publish packages, create tags/releases, or replace the normal
@@ -73,14 +73,14 @@
73
73
  "sha256": "18924d928b659eb80a7736a104b56b9693cffe91cc4499e739a2a67a0922c519"
74
74
  },
75
75
  {
76
- "byteLength": 51366,
76
+ "byteLength": 52016,
77
77
  "path": "user-guides/aops-cli.md",
78
- "sha256": "bcf09a9246da2854ef7d3a057688fccd8c5c06613f41044d3d8bc556e623bac8"
78
+ "sha256": "9984693a3bed26654e7beace62f61dc5227306e4c253ca63f8f3582bed6929a4"
79
79
  },
80
80
  {
81
- "byteLength": 4675,
81
+ "byteLength": 5564,
82
82
  "path": "user-guides/aops-system.md",
83
- "sha256": "3e001003b36c6cc392e8998b1399ac36558438b49a7cfe1a6b482edfdbf44bb7"
83
+ "sha256": "f22e10256fc70764b951a3fb3326abf7bcaf8c0821ec9c85182d51d18da4b52b"
84
84
  },
85
85
  {
86
86
  "byteLength": 5664,
@@ -109,7 +109,7 @@
109
109
  }
110
110
  ],
111
111
  "name": "aops",
112
- "packageSha256": "e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1",
112
+ "packageSha256": "387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447",
113
113
  "provenance": {
114
114
  "expectedDigestSource": "signed-release-manifest",
115
115
  "reference": "aops-platform-agent-assets:core",
@@ -117,6 +117,6 @@
117
117
  },
118
118
  "schemaVersion": 1,
119
119
  "standard": "aops-community-core-v1",
120
- "version": "0.3.17",
121
- "versionId": "community-core-0.3.17"
120
+ "version": "0.3.18",
121
+ "versionId": "community-core-0.3.18"
122
122
  }
@@ -6,12 +6,12 @@
6
6
  },
7
7
  "core": {
8
8
  "entryFile": "SKILL.md",
9
- "manifestRef": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/manifest.json",
9
+ "manifestRef": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/manifest.json",
10
10
  "name": "aops",
11
11
  "optional": false,
12
- "packageSha256": "e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1",
13
- "version": "0.3.17",
14
- "versionId": "community-core-0.3.17"
12
+ "packageSha256": "387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447",
13
+ "version": "0.3.18",
14
+ "versionId": "community-core-0.3.18"
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": "8ec9dbd13f555253a1450fda1018707576832e24",
25
+ "commit": "9625e4bb91ced6a1f3883eaa8f1c1b61003dab49",
26
26
  "repository": "git+https://github.com/eeemzs/aops-platform",
27
27
  "root": "apps/aops-cli/assets/agent-assets"
28
28
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "catalogPackageSha256": [],
3
- "corePackageSha256": "e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1",
3
+ "corePackageSha256": "387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447",
4
4
  "gatewayRef": "agent-assets/gateway/aops/SKILL.md",
5
5
  "kind": "aops-community-agent-assets-projection-v1",
6
6
  "root": "agent-assets",
@@ -7,123 +7,123 @@
7
7
  },
8
8
  "core": {
9
9
  "entryFile": "SKILL.md",
10
- "manifestRef": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/manifest.json",
10
+ "manifestRef": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/manifest.json",
11
11
  "name": "aops",
12
12
  "optional": false,
13
- "packageSha256": "e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1",
14
- "version": "0.3.17",
15
- "versionId": "community-core-0.3.17"
13
+ "packageSha256": "387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447",
14
+ "version": "0.3.18",
15
+ "versionId": "community-core-0.3.18"
16
16
  },
17
17
  "files": [
18
18
  {
19
19
  "byteLength": 2738,
20
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/SKILL.md",
20
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/SKILL.md",
21
21
  "sha256": "44f8e0ffe807195d6890719e1350a630d159ee74f219001d9393d1d9a8d4818b"
22
22
  },
23
23
  {
24
24
  "byteLength": 2681,
25
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/agentspace/SKILL.md",
25
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/agentspace/SKILL.md",
26
26
  "sha256": "08e33ef035c41beead342202a1f07af4391b1e4ed62cea9a4d79b43e966c7c0f"
27
27
  },
28
28
  {
29
29
  "byteLength": 3804,
30
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/aops-cli-core/SKILL.md",
30
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/aops-cli-core/SKILL.md",
31
31
  "sha256": "a645a2f50bc35b2033d05bad770b2f0a53e3f162b95f00dfd493ba718c062433"
32
32
  },
33
33
  {
34
34
  "byteLength": 2341,
35
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/chatv3/SKILL.md",
35
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/chatv3/SKILL.md",
36
36
  "sha256": "0f45d8fe418f740456e7f448ce472a7f0784a7cd5b01fe4cbc81439ded3c7931"
37
37
  },
38
38
  {
39
39
  "byteLength": 2869,
40
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/collaborative-work/SKILL.md",
40
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/collaborative-work/SKILL.md",
41
41
  "sha256": "f4d2af3c384368b1adb1308f2c3731b17e6b4074e4ebdfc8c8f061ba2bb01a67"
42
42
  },
43
43
  {
44
44
  "byteLength": 2386,
45
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/discuss/SKILL.md",
45
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/discuss/SKILL.md",
46
46
  "sha256": "03cd2bde90b590b4ce6a370a6d17d1aaabbb6693fee47c29e0e45848b3d7f8d6"
47
47
  },
48
48
  {
49
49
  "byteLength": 2736,
50
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/docman/SKILL.md",
50
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/docman/SKILL.md",
51
51
  "sha256": "cf48bfa4d94a97a0d2805d5d9dd7a7d0f7430adaf36b9b2fc685465c42cd8cd7"
52
52
  },
53
53
  {
54
54
  "byteLength": 1910,
55
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/mission/SKILL.md",
55
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/mission/SKILL.md",
56
56
  "sha256": "f4ce9c60c3d12ba45e9eaba0069ed9d8936438a15e0ae1974fa8b15a17ae67a1"
57
57
  },
58
58
  {
59
59
  "byteLength": 3167,
60
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/projectman/SKILL.md",
60
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/projectman/SKILL.md",
61
61
  "sha256": "2ff36573d7bf85b2212d1c819bb692cbdfb49f4ea77fdd95d0a263c4007c31b0"
62
62
  },
63
63
  {
64
64
  "byteLength": 1621,
65
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/sys/SKILL.md",
65
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/sys/SKILL.md",
66
66
  "sha256": "89cb838aafed26874a0fbc121078435a2ec27bf2901527a51515833e63b1dff4"
67
67
  },
68
68
  {
69
69
  "byteLength": 1865,
70
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/view/SKILL.md",
70
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/view/SKILL.md",
71
71
  "sha256": "644603a17444374025acf52975dc5df04e1412d69965b210a28b6b5ed203c90b"
72
72
  },
73
73
  {
74
74
  "byteLength": 3093,
75
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/references/working-disciplines/SKILL.md",
75
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/references/working-disciplines/SKILL.md",
76
76
  "sha256": "406c7215917ff68e22c221847c72af9c38dc9ddab6cb0a4beaedd46038bda08d"
77
77
  },
78
78
  {
79
79
  "byteLength": 3333,
80
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/agent-assets.md",
80
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/agent-assets.md",
81
81
  "sha256": "12ef09138579d9bfc75a33d51c78bc50d8b34556eb6070af64a8c03d93927f05"
82
82
  },
83
83
  {
84
84
  "byteLength": 7702,
85
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/agentspace.md",
85
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/agentspace.md",
86
86
  "sha256": "18924d928b659eb80a7736a104b56b9693cffe91cc4499e739a2a67a0922c519"
87
87
  },
88
88
  {
89
- "byteLength": 51366,
90
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/aops-cli.md",
91
- "sha256": "bcf09a9246da2854ef7d3a057688fccd8c5c06613f41044d3d8bc556e623bac8"
89
+ "byteLength": 52016,
90
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/aops-cli.md",
91
+ "sha256": "9984693a3bed26654e7beace62f61dc5227306e4c253ca63f8f3582bed6929a4"
92
92
  },
93
93
  {
94
- "byteLength": 4675,
95
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/aops-system.md",
96
- "sha256": "3e001003b36c6cc392e8998b1399ac36558438b49a7cfe1a6b482edfdbf44bb7"
94
+ "byteLength": 5564,
95
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/aops-system.md",
96
+ "sha256": "f22e10256fc70764b951a3fb3326abf7bcaf8c0821ec9c85182d51d18da4b52b"
97
97
  },
98
98
  {
99
99
  "byteLength": 5664,
100
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/chatv3.md",
100
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/chatv3.md",
101
101
  "sha256": "80c8654463ee21bad8cd1a6557cc6476df788fd8f557441987c94d81ebf23ffd"
102
102
  },
103
103
  {
104
104
  "byteLength": 5838,
105
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/docman.md",
105
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/docman.md",
106
106
  "sha256": "0e434b7bf043260038d12062b1adc5cbf4ba0adf918c9fdf879262dc50bd779c"
107
107
  },
108
108
  {
109
109
  "byteLength": 6660,
110
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/projectman.md",
110
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/projectman.md",
111
111
  "sha256": "23289f31414c9d753f348efb6b5c1e58fe1ff217b6c730d6443279e6052a0509"
112
112
  },
113
113
  {
114
114
  "byteLength": 3432,
115
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/sys.md",
115
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/sys.md",
116
116
  "sha256": "3959f5c044314be14f368529edffd7adb80bb475b659397c6f4bbec8086c5f28"
117
117
  },
118
118
  {
119
119
  "byteLength": 27262,
120
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/files/user-guides/working-disciplines.md",
120
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/working-disciplines.md",
121
121
  "sha256": "c440185924c91755008ce9977c1ab3128994973038e610fe04cad392b14af79b"
122
122
  },
123
123
  {
124
124
  "byteLength": 3978,
125
- "ref": "agent-assets/core/e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1/manifest.json",
126
- "sha256": "7bd0dae26ac1f2c4a626be098cf16fc03770903bfa563d8983c25d4e2b850909"
125
+ "ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/manifest.json",
126
+ "sha256": "779e586e3a308fdcb2807dcc3a7f0e169b70d8ebff1f23bc27d785f03fd124b1"
127
127
  },
128
128
  {
129
129
  "byteLength": 621,
@@ -133,12 +133,12 @@
133
133
  {
134
134
  "byteLength": 926,
135
135
  "ref": "agent-assets/inventory.json",
136
- "sha256": "8ea98c67db89ee60010818de0323280ee13cc39dfe4e4b6db8b1f538654556a4"
136
+ "sha256": "d7fa6b1266894d6730ca688be6e696ae613c3ea1bc57ea2198158060192aa9e7"
137
137
  },
138
138
  {
139
139
  "byteLength": 281,
140
140
  "ref": "agent-assets/projection.json",
141
- "sha256": "cdd37ff6e95a06384310ea293d9b9f2453066ad04d55e98033d630d7a5e19310"
141
+ "sha256": "59bd38f95ce1047dded991728089d00ae21c3affacf1240d0f13f2052fda2c13"
142
142
  }
143
143
  ],
144
144
  "gateway": {
@@ -149,16 +149,16 @@
149
149
  },
150
150
  "inventory": {
151
151
  "ref": "agent-assets/inventory.json",
152
- "sha256": "8ea98c67db89ee60010818de0323280ee13cc39dfe4e4b6db8b1f538654556a4"
152
+ "sha256": "d7fa6b1266894d6730ca688be6e696ae613c3ea1bc57ea2198158060192aa9e7"
153
153
  },
154
154
  "kind": "aops-community-agent-assets-release-v1",
155
155
  "projection": {
156
156
  "ref": "agent-assets/projection.json",
157
- "sha256": "cdd37ff6e95a06384310ea293d9b9f2453066ad04d55e98033d630d7a5e19310"
157
+ "sha256": "59bd38f95ce1047dded991728089d00ae21c3affacf1240d0f13f2052fda2c13"
158
158
  },
159
159
  "root": "agent-assets",
160
160
  "schemaVersion": 1,
161
- "setSha256": "c2f35b08f0bed8495acdb386959b968eaf1cc7962ffe75f037514c323ec3b8d3"
161
+ "setSha256": "08aca523632b9f6a46843a744fb08120b9efd34ef90694dd636c12275ba39204"
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.17",
169
+ "releaseVersion": "0.3.18",
170
170
  "schemaVersion": 1,
171
171
  "source": {
172
- "commit": "8ec9dbd13f555253a1450fda1018707576832e24",
172
+ "commit": "9625e4bb91ced6a1f3883eaa8f1c1b61003dab49",
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": "MIIHdTCCBvugAwIBAgIUZd2FCK0o+geU3MbUqTyTz9wwGqEwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODE0MTE0OTU5WhcNMjYwODE0MTE1OTU5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhU4CclVZEMV1ZklWXJZpDBq2Tldtdg+xyBkWkMVFR9Jj2BIeq757uE1oNDfSy2AQdrH+1litREcyTIRqarMpNqOCBhowggYWMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUR3VQ5fDFcaHkPFa+MhMK2mtOC4gwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdAYDVR0RAQH/BGowaIZmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoOGVjOWRiZDEzZjU1NTI1M2ExNDUwZmRhMTAxODcwNzU3NjgzMmUyNDAxBgorBgEEAYO/MAEEBCNTaWduIGV4YWN0IHB1YmxpYyBBT1BTIGFnZW50IGFzc2V0czAiBgorBgEEAYO/MAEFBBRlZWVtenMvYW9wcy1wbGF0Zm9ybTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHYGCisGAQQBg78wAQkEaAxmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOGVjOWRiZDEzZjU1NTI1M2ExNDUwZmRhMTAxODcwNzU3NjgzMmUyNDAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwNwYKKwYBBAGDvzABDAQpDCdodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0wOAYKKwYBBAGDvzABDQQqDCg4ZWM5ZGJkMTNmNTU1MjUzYTE0NTBmZGExMDE4NzA3NTc2ODMyZTI0MB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTMxNjI1NTAyNjApBgorBgEEAYO/MAEQBBsMGWh0dHBzOi8vZ2l0aHViLmNvbS9lZWVtenMwGQYKKwYBBAGDvzABEQQLDAkxMDkzMTA3NzQwdgYKKwYBBAGDvzABEgRoDGZodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1wdWJsaWMtYWdlbnQtYXNzZXRzLnltbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg4ZWM5ZGJkMTNmNTU1MjUzYTE0NTBmZGExMDE4NzA3NTc2ODMyZTI0MCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwWwYKKwYBBAGDvzABFQRNDEtodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vYWN0aW9ucy9ydW5zLzMxNzk3NzMyMzcxL2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMFIGCisGAQQBg78wARgERAxCcmVwbzplZWVtenNAMTA5MzEwNzc0L2FvcHMtcGxhdGZvcm1AMTMxNjI1NTAyNjpyZWY6cmVmcy9oZWFkcy9tYWluMIGLBgorBgEEAdZ5AgQCBH0EewB5AHcA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGgABuI8gAABAMASDBGAiEA6oMIw5HslIVThsBdjutRllYO7JmbLcC74Lhe0+Cf8AgCIQDQnMc5+LVb7uqc9zQCWk6+aKVGcF/5slatYoh4d5O/0jAKBggqhkjOPQQDAwNoADBlAjEAqF59n/6aJqg0gsTXqlmv9CgkzrYtZg68jGMx49iAVnnaNbu8p3tDdv5ISK6jqnNzAjAtp5hvZjizXZ90I2Si3dUm6cw4RnwGY2ajP326dNry6Aek/RHAsf7Q1zlmfPiH/1M="
7
+ "rawBytes": "MIIHczCCBvqgAwIBAgIUdeNa7JRGS7GE7Ik4OOY2fT9ivgIwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwODE0MjA0OTMzWhcNMjYwODE0MjA1OTMzWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqc9n//da3ZYztX+FL55rwnd6HIKR04R6cBwhd6o8EjYXrkx7Te0bH6H1eUUBuYpBtJeCEHPy6i42TLYGQsIZBqOCBhkwggYVMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUz271iaiRST8SxR7NePwmvDb5vcMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wdAYDVR0RAQH/BGowaIZmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wHwYKKwYBBAGDvzABAgQRd29ya2Zsb3dfZGlzcGF0Y2gwNgYKKwYBBAGDvzABAwQoOTYyNWU0YmI5MWNlZDZhMWYzODgzZWFhOGYxYzFiNjEwMDNkYWI0OTAxBgorBgEEAYO/MAEEBCNTaWduIGV4YWN0IHB1YmxpYyBBT1BTIGFnZW50IGFzc2V0czAiBgorBgEEAYO/MAEFBBRlZWVtenMvYW9wcy1wbGF0Zm9ybTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHYGCisGAQQBg78wAQkEaAxmaHR0cHM6Ly9naXRodWIuY29tL2VlZW16cy9hb3BzLXBsYXRmb3JtLy5naXRodWIvd29ya2Zsb3dzL3NpZ24tcHVibGljLWFnZW50LWFzc2V0cy55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoOTYyNWU0YmI5MWNlZDZhMWYzODgzZWFhOGYxYzFiNjEwMDNkYWI0OTAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwNwYKKwYBBAGDvzABDAQpDCdodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0wOAYKKwYBBAGDvzABDQQqDCg5NjI1ZTRiYjkxY2VkNmExZjM4ODNlYWE4ZjFjMWI2MTAwM2RhYjQ5MB8GCisGAQQBg78wAQ4EEQwPcmVmcy9oZWFkcy9tYWluMBoGCisGAQQBg78wAQ8EDAwKMTMxNjI1NTAyNjApBgorBgEEAYO/MAEQBBsMGWh0dHBzOi8vZ2l0aHViLmNvbS9lZWVtenMwGQYKKwYBBAGDvzABEQQLDAkxMDkzMTA3NzQwdgYKKwYBBAGDvzABEgRoDGZodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vLmdpdGh1Yi93b3JrZmxvd3Mvc2lnbi1wdWJsaWMtYWdlbnQtYXNzZXRzLnltbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg5NjI1ZTRiYjkxY2VkNmExZjM4ODNlYWE4ZjFjMWI2MTAwM2RhYjQ5MCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwWwYKKwYBBAGDvzABFQRNDEtodHRwczovL2dpdGh1Yi5jb20vZWVlbXpzL2FvcHMtcGxhdGZvcm0vYWN0aW9ucy9ydW5zLzMxODM5NjA3ODY4L2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMFIGCisGAQQBg78wARgERAxCcmVwbzplZWVtenNAMTA5MzEwNzc0L2FvcHMtcGxhdGZvcm1AMTMxNjI1NTAyNjpyZWY6cmVmcy9oZWFkcy9tYWluMIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGgAgmEXgAABAMARzBFAiEAiL4ymZ51Y8wZejrsE8a0+0BFKY7nuxFE0MAxqqMZefkCICmZxkBmPjOOySdkigRBcaOgomeIcjuvSefFyqvawkP9MAoGCCqGSM49BAMDA2cAMGQCMBINp3pCiAnV7UX/VDb4hNTa0RERcs6IVyuxfDpmfCbFkhTOjvc93rJ88xI7Ng3LVwIwCMLmUU2j1ZiBY6GJExF4c7kuSK7BCsFMaUjlb/zBao4hNDYACWGZQWO4nPsZz6zm"
8
8
  }
9
9
  ]
10
10
  },
11
11
  "tlogEntries": [
12
12
  {
13
- "logIndex": "2465979414",
13
+ "logIndex": "2468930510",
14
14
  "logId": {
15
15
  "keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="
16
16
  },
@@ -18,29 +18,29 @@
18
18
  "kind": "hashedrekord",
19
19
  "version": "0.0.1"
20
20
  },
21
- "integratedTime": "1786708199",
21
+ "integratedTime": "1786740573",
22
22
  "inclusionPromise": {
23
- "signedEntryTimestamp": "MEUCIQDVnCXmd+dWXPUkUON8AVS8ZRn283AkgGzNmkTHkJAWgQIgIwVrGFuSw4eWBWi/lYSkC8opUmxTIUV7hEz66phFDyU="
23
+ "signedEntryTimestamp": "MEYCIQDhORlKgbFD7fA5gLwoultbfLUWyUmn1ygQV8tjcW7BHAIhALIHSkMod4Y+tvnhcq3mWvrbmvA6spp7uAf30ynpc32a"
24
24
  },
25
25
  "inclusionProof": {
26
- "logIndex": "2344075152",
27
- "rootHash": "MFPm5ZK2IJadoJv25QXAXMlVuU8+zS6SZ7Nn9MDd2xY=",
28
- "treeSize": "2344075153",
26
+ "logIndex": "2347026248",
27
+ "rootHash": "RtUFOrRHoskbD5PYp854fA66uRpkhbwg4SZb418qtvg=",
28
+ "treeSize": "2347026263",
29
29
  "hashes": [
30
- "SMl+GjVkpYO17Wk15ocgG0G1zbe3yqMSWIADCVhLJ24=",
31
- "4v8ukh0jyMhNoIC9+Hc5C2m0nzFkrHq3QO+wH10KeyA=",
32
- "pIgZ6vz3Mk4eGNNRH5Wy+dBKs5rIkJdEah66rNbTwSk=",
33
- "pVwjzLJV20sCktXk94djrr5/OJqlH7IUcgGIkYrbFeY=",
34
- "6osWRQiHRK4k211kZtmBHe1IllhEmP0y3h/6Adr83oU=",
35
- "c0DIFoh0xqW9ThjdbTlsAt4DsK3zJbBGSl6daBybD/E=",
36
- "Xeo0pZcWuagGcBqP71AcDgW8STqCapcM2CIiGPAZjz4=",
37
- "ocsZkH5kOmi9eSvVYRkmnJxkZ1wc5GUj4fwnzvUgMS8=",
38
- "Y0ICJNF38CtIcmOhOCyK7eoXS4xQ59KVY4TawSGrJTg=",
39
- "ccTvbOUW4YI2E3+5Xg5I4Lh6n83Y7DgVCnXgAq9LKW4=",
40
- "X5s9oIuHyPBfQ1DjKPt6MdhcRih6HtpYCLIAhs6gbIg=",
41
- "AqJKrVZwx+xCo0abYNJUukaSFnUE+wTFdVpt1GaS0g0=",
42
- "K7ya/tAh7mL8QFPaTZ3AhGARblg3/o9WAf5/JvDGSqk=",
43
- "fdUMQV0uAsazK6HFzp8+Hq/NxW+XhzMqMGn3OWKFCSA=",
30
+ "SSA8HXZ1E1sc4aNG7TE5iZgLHBmE6D+z+oVvNIJqtUw=",
31
+ "9A/j0m2YOudeWtOnw3MNwPo9ZZqPjBpYJzMPlmkyNBs=",
32
+ "h1eISEt3cSqISIkMgwDZ2JRH6ER+w9An4OUJSwylnn0=",
33
+ "d1XqpyxCg04G4HL2h+qukpDDv34QR8/jzImmTxMlRZI=",
34
+ "RuKhiSwwkfjDlmEsSalCg+qJcEWVuagaxrlJvY4A5rs=",
35
+ "iQeZiZPGfDs4CDmrAuDHJpo7p3elMeYaNtIhhb5OERA=",
36
+ "dqn2aDir33pkavJtjAWCfWBLVTKbFzfE7AJ3Y9lSwGI=",
37
+ "uVSnQwhY9bumTQrrHHW/XFcSOHDmb6Gr0G0J5lemSFc=",
38
+ "7lgnNTxg6FwbJv2J184+C9emUBzg6fryouoYogqxb6M=",
39
+ "phs23xXNQ9VojvixMwpgiHO7GZg0yOYjcK8K3ZQh960=",
40
+ "QxfKGVNfBgdLBO8hfscwuCykK1JsG4ehf/aNkLm6GL8=",
41
+ "s5E9cyfPV5iYeoP4ngJ8bEF5+ErZqr5ThFo2awVdIO4=",
42
+ "K1vfg3sJABH0J5LZVXFihxGvE7G/oc8VMVnGIJWGyJ4=",
43
+ "rMc0j4Grkbg91aezLH+VaNa8WInEP33cVjZOfF8d11w=",
44
44
  "L1XzmA0JH00/N2sVFkU4WHPKi2wzrlh+VIop3VzmV2s=",
45
45
  "0qBvTqmqSnaffENLNDR34y9oY/4UQsDsIQcllDxgne0=",
46
46
  "mYkFdqU5C9m3w88wTn9l6UpYo+PI93c232s+vBiBEpM=",
@@ -48,10 +48,10 @@
48
48
  "xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="
49
49
  ],
50
50
  "checkpoint": {
51
- "envelope": "rekor.sigstore.dev - 1193050959916656506\n2344075153\nMFPm5ZK2IJadoJv25QXAXMlVuU8+zS6SZ7Nn9MDd2xY=\n\n— rekor.sigstore.dev wNI9ajBFAiA0MMJmzGvWhm901tjKpkUGmzcZ0lihQX+tamCvnHk2UAIhAIvECN+l8DDcxg5PpoGmkBTyj0tyfWfcV2KXo7mYn56I\n"
51
+ "envelope": "rekor.sigstore.dev - 1193050959916656506\n2347026263\nRtUFOrRHoskbD5PYp854fA66uRpkhbwg4SZb418qtvg=\n\n— rekor.sigstore.dev wNI9ajBFAiAjECxzEY+qYNfPo226KB7MDGYSGJGw5AliWON1FirLUgIhAPDcs7rzExG0WeuKtYSujkJvybVIYWPpBw+HYxYFkyn0\n"
52
52
  }
53
53
  },
54
- "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjNjcxZjBhNTM5M2QwNDc4ZjRmOTFkMDBkMjVhZDM5YWYyYWQ0ZTIzYTAwZGUxYjEzYzVlZWZkOTg4MTkxMDdkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRkhQemM4Q2k1a05Pb1l6R1c4czIxUW5wNStxbkNkVUllSGtxVElPZTRPMEFpQWtnT2xzazV3NldhYThHVnJyNmJ6cG5majlPSGJ0bnBlQ1oyTnJEQ2JvTUE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGtWRU5EUW5aMVowRjNTVUpCWjBsVldtUXlSa05MTUc4cloyVlZNMDFpVlhGVWVWUjZPWGQzUjNGRmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFUlRCTlZFVXdUMVJWTlZkb1kwNU5hbGwzVDBSRk1FMVVSVEZQVkZVMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZvVlRSRFkyeFdXa1ZOVmpGYWEyeFhXRXBhY0VSQ2NUSlViR1IwWkdjcmVIbENhMWNLYTAxV1JsSTVTbW95UWtsbGNUYzFOM1ZGTVc5T1JHWlRlVEpCVVdSeVNDc3hiR2wwVWtWamVWUkpVbkZoY2sxd1RuRlBRMEpvYjNkbloxbFhUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZTTTFaUkNqVm1SRVpqWVVoclVFWmhLMDFvVFVzeWJYUlBRelJuZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSQldVUldVakJTUVZGSUwwSkhiM2RoU1ZwdFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKV2JGcFhNVFpqZVRsb1lqTkNlZ3BNV0VKeldWaFNiV0l6U25STWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTA1d1dqSTBkR05JVm1saVIyeHFURmRHYmxwWE5UQk1WMFo2Q21NeVZqQmplVFUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJyUjBOcGMwZEJVVkZDWnpjNGQwRlJSVVZMTW1nd1pFaENlazlwT0hZS1pFYzVjbHBYTkhWWlYwNHdZVmM1ZFdONU5XNWhXRkp2WkZkS01XTXlWbmxaTWpsMVpFZFdkV1JETldwaU1qQjNTSGRaUzB0M1dVSkNRVWRFZG5wQlFncEJaMUZTWkRJNWVXRXlXbk5pTTJSbVdrZHNlbU5IUmpCWk1tZDNUbWRaUzB0M1dVSkNRVWRFZG5wQlFrRjNVVzlQUjFacVQxZFNhVnBFUlhwYWFsVXhDazVVU1RGTk1rVjRUa1JWZDFwdFVtaE5WRUY0VDBSamQwNTZWVE5PYW1kNlRXMVZlVTVFUVhoQ1oyOXlRbWRGUlVGWlR5OU5RVVZGUWtOT1ZHRlhaSFVLU1VkV05GbFhUakJKU0VJeFdXMTRjRmw1UWtKVU1VSlVTVWRHYmxwWE5UQkpSMFo2WXpKV01HTjZRV2xDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0pTYkFwYVYxWjBaVzVOZGxsWE9YZGplVEYzWWtkR01GcHRPWGxpVkVGa1FtZHZja0puUlVWQldVOHZUVUZGUjBKQk9YbGFWMXA2VERKb2JGbFhVbnBNTWpGb0NtRlhOSGRQZDFsTFMzZFpRa0pCUjBSMmVrRkNRMEZSZEVSRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZta0taRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOU0ZsSFEybHpSMEZSVVVKbk56aDNRVkZyUldGQmVHMWhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESldiRnBYTVRaamVUbG9Zak5DZWt4WVFuTlpXRkp0WWpOS2RFeDVOVzVoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3elRuQmFNalIwQ21OSVZtbGlSMnhxVEZkR2JscFhOVEJNVjBaNll6SldNR041TlRWaVYzaEJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOUkdkSFEybHpSMEZSVVVJS1p6YzRkMEZSYjBWTFozZHZUMGRXYWs5WFVtbGFSRVY2V21wVk1VNVVTVEZOTWtWNFRrUlZkMXB0VW1oTlZFRjRUMFJqZDA1NlZUTk9hbWQ2VFcxVmVRcE9SRUZrUW1kdmNrSm5SVVZCV1U4dlRVRkZURUpCT0UxRVYyUndaRWRvTVZscE1XOWlNMDR3V2xkUmQwNTNXVXRMZDFsQ1FrRkhSSFo2UVVKRVFWRndDa1JEWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIzVDBGWlMwdDNXVUlLUWtGSFJIWjZRVUpFVVZGeFJFTm5ORnBYVFRWYVIwcHJUVlJPYlU1VVZURk5hbFY2V1ZSRk1FNVVRbTFhUjBWNFRVUkZORTU2UVROT1ZHTXlUMFJOZVFwYVZFa3dUVUk0UjBOcGMwZEJVVkZDWnpjNGQwRlJORVZGVVhkUVkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5RbTlIUTJselIwRlJVVUpuTnpoM0NrRlJPRVZFUVhkTFRWUk5lRTVxU1RGT1ZFRjVUbXBCY0VKbmIzSkNaMFZGUVZsUEwwMUJSVkZDUW5OTlIxZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZta0tURzFPZG1KVE9XeGFWMVowWlc1TmQwZFJXVXRMZDFsQ1FrRkhSSFo2UVVKRlVWRk1SRUZyZUUxRWEzcE5WRUV6VG5wUmQyUm5XVXRMZDFsQ1FrRkhSQXAyZWtGQ1JXZFNiMFJIV205a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIyQ2t4dFpIQmtSMmd4V1drNU0ySXpTbkphYlhoMlpETk5kbU15Ykc1aWFURjNaRmRLYzJGWFRYUlpWMlJzWW01UmRGbFlUbnBhV0ZKNlRHNXNkR0pGUW5rS1dsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjVVJEWnpSYVYwMDFXa2RLYTAxVVRtMU9WRlV4VFdwVmVncFpWRVV3VGxSQ2JWcEhSWGhOUkVVMFRucEJNMDVVWXpKUFJFMTVXbFJKTUUxRFJVZERhWE5IUVZGUlFtYzNPSGRCVWxGRlJYZDNVbVF5T1hsaE1scHpDbUl6WkdaYVIyeDZZMGRHTUZreVozZFhkMWxMUzNkWlFrSkJSMFIyZWtGQ1JsRlNUa1JGZEc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFlLV2xkV2JHSlljSHBNTWtaMlkwaE5kR05IZUdoa1IxcDJZMjB3ZGxsWFRqQmhWemwxWTNrNWVXUlhOWHBNZWsxNFRucHJNMDU2VFhsTmVtTjRUREpHTUFwa1IxWjBZMGhTZWt4NlJYZEdkMWxMUzNkWlFrSkJSMFIyZWtGQ1JtZFJTa1JCWkhkamJXd3lXVmhTYkUxR1NVZERhWE5IUVZGUlFtYzNPSGRCVW1kRkNsSkJlRU5qYlZaM1lucHdiRnBYVm5SbGJrNUJUVlJCTlUxNlJYZE9lbU13VERKR2RtTklUWFJqUjNob1pFZGFkbU50TVVGTlZFMTRUbXBKTVU1VVFYa0tUbXB3ZVZwWFdUWmpiVlp0WTNrNWIxcFhSbXRqZVRsMFdWZHNkVTFKUjB4Q1oyOXlRbWRGUlVGa1dqVkJaMUZEUWtnd1JXVjNRalZCU0dOQk0xUXdkd3BoYzJKSVJWUktha2RTTkdOdFYyTXpRWEZLUzFoeWFtVlFTek12YURSd2VXZERPSEEzYnpSQlFVRkhaMEZDZFVrNFowRkJRa0ZOUVZORVFrZEJhVVZCQ2padlRVbDNOVWh6YkVsV1ZHaHpRbVJxZFhSU2JHeFpUemRLYldKTVkwTTNORXhvWlRBclEyWTRRV2REU1ZGRVVXNU5ZelVyVEZaaU4zVnhZemw2VVVNS1YyczJLMkZMVmtkalJpODFjMnhoZEZsdmFEUmtOVTh2TUdwQlMwSm5aM0ZvYTJwUFVGRlJSRUYzVG05QlJFSnNRV3BGUVhGR05UbHVMelpoU25Gbk1BcG5jMVJZY1d4dGRqbERaMnQ2Y2xsMFdtYzJPR3BIVFhnME9XbEJWbTV1WVU1aWRUaHdNM1JFWkhZMVNWTkxObXB4Yms1NlFXcEJkSEExYUhaYWFtbDZDbGhhT1RCSk1sTnBNMlJWYlRaamR6UlNibmRIV1RKaGFsQXpNalprVG5KNU5rRmxheTlTU0VGelpqZFJNWHBzYldaUWFVZ3ZNVTA5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn19fX0="
54
+ "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJmZGQwM2U4YTNmZDEyNTU2MzI1MzI4OGY2OWQ1ODlkYjRiOWJjZDg4ZDhkOTllYTkwZmU4ODRhOGQ1MTI1N2QzIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQTh3UzVqdWNQb0xWU0tTNlg0anNoWGVPN0k1VDZTSWtrT0RGc0craVowdEFpQjdTSklucDR0cU80V2kwTXh1Wkt3RXJIdGVlSXBjUG4rcTRBOGROMW1SVWc9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaGpla05EUW5aeFowRjNTVUpCWjBsVlpHVk9ZVGRLVWtkVE4wZEZOMGxyTkU5UFdUSm1WRGxwZG1kSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlFUlRCTmFrRXdUMVJOZWxkb1kwNU5hbGwzVDBSRk1FMXFRVEZQVkUxNlYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZ4WXpsdUx5OWtZVE5hV1hwMFdDdEdURFUxY25kdVpEWklTVXRTTURSU05tTkNkMmdLWkRadk9FVnFXVmh5YTNnM1ZHVXdZa2cyU0RGbFZWVkNkVmx3UW5SS1pVTkZTRkI1Tm1rME1sUk1XVWRSYzBsYVFuRlBRMEpvYTNkbloxbFdUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlY2TWpjeENtbGhhVkpUVkRoVGVGSTNUbVZRZDIxMlJHSTFkbU5OZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJSQldVUldVakJTUVZGSUwwSkhiM2RoU1ZwdFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKV2JGcFhNVFpqZVRsb1lqTkNlZ3BNV0VKeldWaFNiV0l6U25STWVUVnVZVmhTYjJSWFNYWmtNamw1WVRKYWMySXpaSHBNTTA1d1dqSTBkR05JVm1saVIyeHFURmRHYmxwWE5UQk1WMFo2Q21NeVZqQmplVFUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJyUjBOcGMwZEJVVkZDWnpjNGQwRlJSVVZMTW1nd1pFaENlazlwT0hZS1pFYzVjbHBYTkhWWlYwNHdZVmM1ZFdONU5XNWhXRkp2WkZkS01XTXlWbmxaTWpsMVpFZFdkV1JETldwaU1qQjNTSGRaUzB0M1dVSkNRVWRFZG5wQlFncEJaMUZTWkRJNWVXRXlXbk5pTTJSbVdrZHNlbU5IUmpCWk1tZDNUbWRaUzB0M1dVSkNRVWRFZG5wQlFrRjNVVzlQVkZsNVRsZFZNRmx0U1RWTlYwNXNDbHBFV21oTlYxbDZUMFJuZWxwWFJtaFBSMWw0V1hwR2FVNXFSWGROUkU1cldWZEpNRTlVUVhoQ1oyOXlRbWRGUlVGWlR5OU5RVVZGUWtOT1ZHRlhaSFVLU1VkV05GbFhUakJKU0VJeFdXMTRjRmw1UWtKVU1VSlVTVWRHYmxwWE5UQkpSMFo2WXpKV01HTjZRV2xDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0pTYkFwYVYxWjBaVzVOZGxsWE9YZGplVEYzWWtkR01GcHRPWGxpVkVGa1FtZHZja0puUlVWQldVOHZUVUZGUjBKQk9YbGFWMXA2VERKb2JGbFhVbnBNTWpGb0NtRlhOSGRQZDFsTFMzZFpRa0pCUjBSMmVrRkNRMEZSZEVSRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZta0taRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOU0ZsSFEybHpSMEZSVVVKbk56aDNRVkZyUldGQmVHMWhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESldiRnBYTVRaamVUbG9Zak5DZWt4WVFuTlpXRkp0WWpOS2RFeDVOVzVoV0ZKdlpGZEpkbVF5T1hsaE1scHpZak5rZWt3elRuQmFNalIwQ21OSVZtbGlSMnhxVEZkR2JscFhOVEJNVjBaNll6SldNR041TlRWaVYzaEJZMjFXYldONU9XOWFWMFpyWTNrNWRGbFhiSFZOUkdkSFEybHpSMEZSVVVJS1p6YzRkMEZSYjBWTFozZHZUMVJaZVU1WFZUQlpiVWsxVFZkT2JGcEVXbWhOVjFsNlQwUm5lbHBYUm1oUFIxbDRXWHBHYVU1cVJYZE5SRTVyV1ZkSk1BcFBWRUZrUW1kdmNrSm5SVVZCV1U4dlRVRkZURUpCT0UxRVYyUndaRWRvTVZscE1XOWlNMDR3V2xkUmQwNTNXVXRMZDFsQ1FrRkhSSFo2UVVKRVFWRndDa1JEWkc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIzVDBGWlMwdDNXVUlLUWtGSFJIWjZRVUpFVVZGeFJFTm5OVTVxU1RGYVZGSnBXV3ByZUZreVZtdE9iVVY0V21wTk5FOUVUbXhaVjBVMFdtcEdhazFYU1RKTlZFRjNUVEpTYUFwWmFsRTFUVUk0UjBOcGMwZEJVVkZDWnpjNGQwRlJORVZGVVhkUVkyMVdiV041T1c5YVYwWnJZM2s1ZEZsWGJIVk5RbTlIUTJselIwRlJVVUpuTnpoM0NrRlJPRVZFUVhkTFRWUk5lRTVxU1RGT1ZFRjVUbXBCY0VKbmIzSkNaMFZGUVZsUEwwMUJSVkZDUW5OTlIxZG9NR1JJUW5wUGFUaDJXakpzTUdGSVZta0tURzFPZG1KVE9XeGFWMVowWlc1TmQwZFJXVXRMZDFsQ1FrRkhSSFo2UVVKRlVWRk1SRUZyZUUxRWEzcE5WRUV6VG5wUmQyUm5XVXRMZDFsQ1FrRkhSQXAyZWtGQ1JXZFNiMFJIV205a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFphVjFac1lsaHdla3d5Um5aalNFMTBZMGQ0YUdSSFduWmpiVEIyQ2t4dFpIQmtSMmd4V1drNU0ySXpTbkphYlhoMlpETk5kbU15Ykc1aWFURjNaRmRLYzJGWFRYUlpWMlJzWW01UmRGbFlUbnBhV0ZKNlRHNXNkR0pGUW5rS1dsZGFla3d5YUd4WlYxSjZUREl4YUdGWE5IZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1JYZFJjVVJEWnpWT2Fra3hXbFJTYVZscWEzaFpNbFpyVG0xRmVBcGFhazAwVDBST2JGbFhSVFJhYWtacVRWZEpNazFVUVhkTk1sSm9XV3BSTlUxRFJVZERhWE5IUVZGUlFtYzNPSGRCVWxGRlJYZDNVbVF5T1hsaE1scHpDbUl6WkdaYVIyeDZZMGRHTUZreVozZFhkMWxMUzNkWlFrSkJSMFIyZWtGQ1JsRlNUa1JGZEc5a1NGSjNZM3B2ZGt3eVpIQmtSMmd4V1drMWFtSXlNSFlLV2xkV2JHSlljSHBNTWtaMlkwaE5kR05IZUdoa1IxcDJZMjB3ZGxsWFRqQmhWemwxWTNrNWVXUlhOWHBNZWsxNFQwUk5OVTVxUVROUFJGazBUREpHTUFwa1IxWjBZMGhTZWt4NlJYZEdkMWxMUzNkWlFrSkJSMFIyZWtGQ1JtZFJTa1JCWkhkamJXd3lXVmhTYkUxR1NVZERhWE5IUVZGUlFtYzNPSGRCVW1kRkNsSkJlRU5qYlZaM1lucHdiRnBYVm5SbGJrNUJUVlJCTlUxNlJYZE9lbU13VERKR2RtTklUWFJqUjNob1pFZGFkbU50TVVGTlZFMTRUbXBKTVU1VVFYa0tUbXB3ZVZwWFdUWmpiVlp0WTNrNWIxcFhSbXRqZVRsMFdWZHNkVTFKUjB0Q1oyOXlRbWRGUlVGa1dqVkJaMUZEUWtoM1JXVm5RalJCU0ZsQk0xUXdkd3BoYzJKSVJWUktha2RTTkdOdFYyTXpRWEZLUzFoeWFtVlFTek12YURSd2VXZERPSEEzYnpSQlFVRkhaMEZuYlVWWVowRkJRa0ZOUVZKNlFrWkJhVVZCQ21sTU5IbHRXalV4V1RoM1dtVnFjbk5GT0dFd0t6QkNSa3RaTjI1MWVFWkZNRTFCZUhGeFRWcGxabXREU1VOdFduaHJRbTFRYWs5UGVWTmthMmxuVWtJS1kyRlBaMjl0WlVsamFuVjJVMlZtUm5seGRtRjNhMUE1VFVGdlIwTkRjVWRUVFRRNVFrRk5SRUV5WTBGTlIxRkRUVUpKVG5BemNFTnBRVzVXTjFWWUx3cFdSR0kwYUU1VVlUQlNSVkpqY3paSlZubDFlR1pFY0cxbVEySkdhMmhVVDJwMll6a3pja280T0hoSk4wNW5NMHhXZDBsM1EwMU1iVlZWTW1veFdtbENDbGsyUjBwRmVFWTBZemRyZFZOTE4wSkRjMFpOWVZWcWJHSXZla0poYnpSb1RrUlpRVU5YUjFwUlYwODBibEJ6V25vMmVtMEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0ifX19fQ=="
55
55
  }
56
56
  ],
57
57
  "timestampVerificationData": {}
@@ -59,8 +59,8 @@
59
59
  "messageSignature": {
60
60
  "messageDigest": {
61
61
  "algorithm": "SHA2_256",
62
- "digest": "xnHwpTk9BHj0+R0A0lrTmvKtTiOgDeGxPF7v2YgZEH0="
62
+ "digest": "/dA+ij/RJVYyUyiPadWJ20ubzYjY2Z6pD+iEqNUSV9M="
63
63
  },
64
- "signature": "MEQCIFHPzc8Ci5kNOoYzGW8s21Qnp5+qnCdUIeHkqTIOe4O0AiAkgOlsk5w6Waa8GVrr6bzpnfj9OHbtnpeCZ2NrDCboMA=="
64
+ "signature": "MEQCIA8wS5jucPoLVSKS6X4jshXeO7I5T6SIkkODFsG+iZ0tAiB7SJInp4tqO4Wi0MxuZKwErHteeIpcPn+q4A8dN1mRUg=="
65
65
  }
66
66
  }
@@ -61,6 +61,19 @@ aops update prepare --json
61
61
  aops update apply --plan <update-plan.json> --confirm <sha256-plan-id> --json
62
62
  ```
63
63
 
64
+ For the one-time transition from a CLI released before candidate-owned update
65
+ execution, prepare with the installed CLI and apply through the exact external
66
+ target package instead:
67
+
68
+ ```text
69
+ # macOS/Linux (`NUL` replaces `/dev/null` on Windows)
70
+ npm exec --yes --registry=https://registry.npmjs.org --userconfig=/dev/null --package=@aopslabs/aops@<exact-target> -- aops update bridge --plan <update-plan.json> --confirm <sha256-plan-id> --json
71
+ ```
72
+
73
+ `update bridge` refuses to run from the installed old CLI and requires its own
74
+ package version to equal the immutable plan target. Future transitions use the
75
+ normal candidate-owned `update apply` path.
76
+
64
77
  Prepare is non-mutating and retains exact candidate and rollback tarballs.
65
78
  Apply stops Cockpit before Server, installs the public closure as one global
66
79
  CLI with its exact nested Server, repeatedly checks loopback health, and
@@ -55,6 +55,21 @@ aops update prepare --json
55
55
  aops update apply --plan <update-plan.json> --confirm <sha256-plan-id> --json
56
56
  ```
57
57
 
58
+ CLI versions released before candidate-owned execution cannot retroactively
59
+ load the safer apply implementation. For that one transition, let the
60
+ installed old CLI run `prepare`, then launch the exact target package outside
61
+ the global installation and use its explicit bridge command. macOS/Linux:
62
+
63
+ ```text
64
+ npm exec --yes --registry=https://registry.npmjs.org --userconfig=/dev/null --package=@aopslabs/aops@<exact-target> -- aops update bridge --plan <update-plan.json> --confirm <sha256-plan-id> --json
65
+ ```
66
+
67
+ Windows uses the same command with `--userconfig=NUL`. The bridge rejects the
68
+ installed old CLI entrypoint and a candidate version that differs from the
69
+ plan target; that external candidate then stages and re-verifies the complete
70
+ executor closure before any global mutation. Once this transition succeeds,
71
+ ordinary TUI and headless Apply actions use candidate-owned execution.
72
+
58
73
  All metadata and tarball reads are pinned to the public npm registry. A legacy
59
74
  top-level Server dedupe is treated as a repairable package-layout issue. The
60
75
  updater does not publish packages, create tags/releases, or replace the normal
@@ -440,6 +440,7 @@ async function runWithOperationJournal(params) {
440
440
  code: 'community_server_operation_failed',
441
441
  phase: 'operation',
442
442
  details: {
443
+ operationId: journal.record().id,
443
444
  operation: params.operation,
444
445
  journalPhase: journal.record().phase,
445
446
  journalStep: journal.record().step,
@@ -1,14 +1,18 @@
1
1
  import assert from 'node:assert/strict';
2
2
  import { spawnSync } from 'node:child_process';
3
3
  import { createHash } from 'node:crypto';
4
- import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, writeFileSync, } from 'node:fs';
4
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readlinkSync, readFileSync, realpathSync, writeFileSync, } from 'node:fs';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
7
  import { compareCanonicalText } from '@aopslabs/artifact-trust-contracts';
8
- import { Command } from 'commander';
8
+ import { Command, Option } from 'commander';
9
+ import { isCommunityDiagnosticV1 } from '../lib/community-diagnostic.js';
9
10
  const CHECK_CONTRACT = 'aops.global-update-check/v1';
10
11
  const PLAN_CONTRACT = 'aops.global-update-plan/v1';
11
12
  const RESULT_CONTRACT = 'aops.global-update-result/v1';
13
+ const EXECUTOR_CONTRACT = 'aops.global-update-executor/v1';
14
+ const RESULT_FILE = 'update-result.json';
15
+ const EXECUTOR_RECEIPT_FILE = 'executor-receipt.json';
12
16
  const PUBLIC_REGISTRY = 'https://registry.npmjs.org';
13
17
  const EXACT_STABLE_VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/u;
14
18
  const PLAN_ID = /^sha256:[a-f0-9]{64}$/u;
@@ -20,6 +24,16 @@ const HEALTH_SAMPLES = 4;
20
24
  const HEALTH_INTERVAL_MS = 3_000;
21
25
  const HEALTH_STARTUP_ATTEMPTS = 30;
22
26
  const HEALTH_STARTUP_INTERVAL_MS = 2_000;
27
+ class ChildCommandError extends Error {
28
+ status;
29
+ diagnostic;
30
+ constructor(command, status, diagnostic) {
31
+ super(`${path.basename(command)} failed with status ${status ?? 'unknown'}`);
32
+ this.name = 'ChildCommandError';
33
+ this.status = status;
34
+ this.diagnostic = diagnostic;
35
+ }
36
+ }
23
37
  function cleanEnvironment() {
24
38
  return {
25
39
  ...process.env,
@@ -44,7 +58,17 @@ function defaultRunner(command, args, cwd = process.cwd()) {
44
58
  });
45
59
  if (result.error)
46
60
  throw result.error;
47
- assert.equal(result.status, 0, `${command} ${args.join(' ')} failed\n${result.stdout}\n${result.stderr}`);
61
+ if (result.status !== 0) {
62
+ let diagnostic;
63
+ try {
64
+ const parsed = JSON.parse(result.stderr.trim());
65
+ if (isCommunityDiagnosticV1(parsed.error))
66
+ diagnostic = parsed.error;
67
+ }
68
+ catch {
69
+ }
70
+ throw new ChildCommandError(command, result.status, diagnostic);
71
+ }
48
72
  return result.stdout;
49
73
  }
50
74
  export function resolveNpmInvocation(options = {}) {
@@ -54,13 +78,12 @@ export function resolveNpmInvocation(options = {}) {
54
78
  const nodeExecutable = path.resolve(options.nodeExecutable ?? process.execPath);
55
79
  const environment = options.environment ?? process.env;
56
80
  const fileExists = options.fileExists ?? existsSync;
57
- const candidates = [
58
- path.join(path.dirname(nodeExecutable), 'node_modules', 'npm', 'bin', 'npm-cli.js'),
59
- ];
81
+ const candidates = [];
60
82
  const npmExecPath = environment.npm_execpath?.trim();
61
83
  if (npmExecPath && /^npm-cli\.(?:c?js)$/iu.test(path.basename(npmExecPath))) {
62
84
  candidates.push(path.resolve(npmExecPath));
63
85
  }
86
+ candidates.push(path.join(path.dirname(nodeExecutable), 'node_modules', 'npm', 'bin', 'npm-cli.js'));
64
87
  for (const entry of String(environment.PATH ?? '').split(path.delimiter)) {
65
88
  if (!entry.trim())
66
89
  continue;
@@ -108,6 +131,57 @@ export function compareStableVersions(left, right) {
108
131
  function sha256(file) {
109
132
  return createHash('sha256').update(readFileSync(file)).digest('hex');
110
133
  }
134
+ function executorTreeInventory(executorRoot) {
135
+ const root = plainDirectory(executorRoot, 'candidate executor root');
136
+ const records = [];
137
+ let totalBytes = 0;
138
+ const visit = (directory, prefix) => {
139
+ for (const entry of readdirSync(directory, { withFileTypes: true })
140
+ .sort((left, right) => compareCanonicalText(left.name, right.name))) {
141
+ const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
142
+ const absolute = path.join(directory, entry.name);
143
+ const stat = lstatSync(absolute);
144
+ const normalizedRelative = relative.replace(/\\/gu, '/');
145
+ if (stat.isSymbolicLink()) {
146
+ const target = readlinkSync(absolute);
147
+ const resolved = realpathSync.native(absolute);
148
+ ensureWithin(root, resolved, `candidate executor link ${normalizedRelative}`);
149
+ records.push({
150
+ path: normalizedRelative,
151
+ type: 'link',
152
+ target: target.replace(/\\/gu, '/'),
153
+ resolved: path.relative(root, resolved).replace(/\\/gu, '/'),
154
+ });
155
+ assert.equal(records.length <= 20_000, true, 'candidate executor entry bound exceeded');
156
+ continue;
157
+ }
158
+ if (stat.isDirectory()) {
159
+ records.push({ path: normalizedRelative, type: 'directory', mode: stat.mode & 0o777 });
160
+ assert.equal(records.length <= 20_000, true, 'candidate executor entry bound exceeded');
161
+ visit(absolute, relative);
162
+ continue;
163
+ }
164
+ assert.equal(stat.isFile(), true, `candidate executor entry invalid: ${normalizedRelative}`);
165
+ const canonical = plainFile(absolute, `candidate executor file ${normalizedRelative}`);
166
+ ensureWithin(root, canonical, `candidate executor file ${normalizedRelative}`);
167
+ totalBytes += stat.size;
168
+ records.push({
169
+ path: normalizedRelative,
170
+ type: 'file',
171
+ mode: stat.mode & 0o777,
172
+ bytes: stat.size,
173
+ sha256: sha256(canonical),
174
+ });
175
+ assert.equal(records.length <= 20_000, true, 'candidate executor entry bound exceeded');
176
+ assert.equal(totalBytes <= 512 * 1024 * 1024, true, 'candidate executor package byte bound exceeded');
177
+ }
178
+ };
179
+ visit(root, '');
180
+ return {
181
+ entryCount: records.length,
182
+ sha256: createHash('sha256').update(JSON.stringify(records)).digest('hex'),
183
+ };
184
+ }
111
185
  function plainDirectory(candidate, label) {
112
186
  const absolute = path.resolve(candidate);
113
187
  const stat = lstatSync(absolute);
@@ -364,6 +438,136 @@ export function readGlobalUpdatePlan(planPath) {
364
438
  assert.equal(plan.safety.healthStartupIntervalMs, HEALTH_STARTUP_INTERVAL_MS);
365
439
  return plan;
366
440
  }
441
+ function readCandidateExecutorReceipt(plan, receiptPath) {
442
+ const operationRoot = plainDirectory(plan.operationRoot, 'global update operation root');
443
+ const resolved = plainFile(receiptPath, 'global update executor receipt');
444
+ assert.equal(resolved, path.join(operationRoot, EXECUTOR_RECEIPT_FILE), 'global update executor receipt must stay at the operation root');
445
+ const receipt = parseJson(readFileSync(resolved, 'utf8'), 'global_update_executor_receipt');
446
+ assert.equal(receipt.schemaVersion, 1);
447
+ assert.equal(receipt.contract, EXECUTOR_CONTRACT);
448
+ assert.equal(receipt.planId, plan.planId, 'global update executor plan identity mismatch');
449
+ const executorRoot = plainDirectory(receipt.executorRoot, 'global update executor root');
450
+ ensureWithin(operationRoot, executorRoot, 'global update executor root');
451
+ assert.equal(executorRoot, path.join(operationRoot, 'executor'));
452
+ const entrypoint = plainFile(receipt.entrypoint, 'global update executor entrypoint');
453
+ ensureWithin(executorRoot, entrypoint, 'global update executor entrypoint');
454
+ assert.equal(entrypoint, receipt.entrypoint, 'global update executor entrypoint must be canonical');
455
+ assert.match(receipt.entrypointSha256, SHA256);
456
+ assert.equal(sha256(entrypoint), receipt.entrypointSha256, 'global update executor entrypoint changed');
457
+ const candidate = packageRecordByName(plan.candidates, '@aopslabs/aops');
458
+ assert.equal(receipt.candidate.version, candidate.version);
459
+ assert.equal(receipt.candidate.sha256, candidate.sha256);
460
+ const executorPackageRoot = path.join(executorRoot, 'node_modules', '@aopslabs', 'aops');
461
+ const executorManifest = packageManifest(executorPackageRoot, '@aopslabs/aops');
462
+ assert.equal(executorManifest.version, plan.target.packages.cli);
463
+ const dependencies = executorManifest.dependencies;
464
+ assert.equal(dependencies?.['@aopslabs/aops-server'], plan.target.packages.server);
465
+ const executorServer = packageManifest(path.join(executorRoot, 'node_modules', '@aopslabs', 'aops-server'), '@aopslabs/aops-server');
466
+ assert.equal(executorServer.version, plan.target.packages.server);
467
+ assert.equal(Number.isSafeInteger(receipt.executorEntryCount), true);
468
+ assert.match(receipt.executorContentSha256, SHA256);
469
+ const inventory = executorTreeInventory(executorRoot);
470
+ assert.equal(inventory.entryCount, receipt.executorEntryCount, 'candidate executor entry count changed');
471
+ assert.equal(inventory.sha256, receipt.executorContentSha256, 'candidate executor content changed');
472
+ return receipt;
473
+ }
474
+ export function stageCandidateGlobalUpdateExecutor(plan, run = defaultRunner) {
475
+ const receiptPath = path.join(plan.operationRoot, EXECUTOR_RECEIPT_FILE);
476
+ if (existsSync(receiptPath)) {
477
+ return { receipt: readCandidateExecutorReceipt(plan, receiptPath), receiptPath };
478
+ }
479
+ const executorRoot = path.join(plan.operationRoot, 'executor');
480
+ assert.equal(existsSync(executorRoot), false, 'unverified global update executor directory already exists');
481
+ mkdirSync(executorRoot, { mode: 0o700 });
482
+ const cacheRoot = path.join(plan.operationRoot, 'cache');
483
+ mkdirSync(cacheRoot, { recursive: true, mode: 0o700 });
484
+ const cli = packageRecordByName(plan.candidates, '@aopslabs/aops');
485
+ const server = packageRecordByName(plan.candidates, '@aopslabs/aops-server');
486
+ runNpm(run, publicNpmArgs([
487
+ '--prefix',
488
+ executorRoot,
489
+ 'install',
490
+ '--ignore-scripts',
491
+ '--omit=dev',
492
+ '--prefer-offline',
493
+ `--cache=${cacheRoot}`,
494
+ '--fund=false',
495
+ '--audit=false',
496
+ cli.path,
497
+ server.path,
498
+ ]));
499
+ const entrypoint = plainFile(path.join(executorRoot, 'node_modules', '@aopslabs', 'aops', 'dist', 'main.js'), 'global update executor entrypoint');
500
+ const inventory = executorTreeInventory(executorRoot);
501
+ const receipt = {
502
+ schemaVersion: 1,
503
+ contract: EXECUTOR_CONTRACT,
504
+ planId: plan.planId,
505
+ executorRoot: plainDirectory(executorRoot, 'global update executor root'),
506
+ entrypoint,
507
+ entrypointSha256: sha256(entrypoint),
508
+ executorEntryCount: inventory.entryCount,
509
+ executorContentSha256: inventory.sha256,
510
+ candidate: { version: cli.version, sha256: cli.sha256 },
511
+ };
512
+ writeFileSync(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
513
+ return { receipt: readCandidateExecutorReceipt(plan, receiptPath), receiptPath };
514
+ }
515
+ function validateCandidateExecutorInvocation(plan, receiptPath) {
516
+ const receipt = readCandidateExecutorReceipt(plan, receiptPath);
517
+ const invokedEntrypoint = plainFile(process.argv[1], 'invoked AOPS CLI entrypoint');
518
+ assert.equal(invokedEntrypoint, receipt.entrypoint, 'candidate update execution must run from the verified staged entrypoint');
519
+ return receipt;
520
+ }
521
+ export function validateLegacyGlobalUpdateBridgeInvocation(plan, invokedEntrypoint = process.argv[1]) {
522
+ const invoked = plainFile(invokedEntrypoint, 'legacy update bridge candidate entrypoint');
523
+ const globalCliRoot = plainDirectory(path.dirname(path.dirname(plan.cliPath)), 'planned global CLI root');
524
+ const relativeToGlobal = path.relative(globalCliRoot, invoked);
525
+ assert.equal(relativeToGlobal.startsWith('..') || path.isAbsolute(relativeToGlobal), true, 'legacy update bridge must run from an external exact candidate, not the installed old CLI');
526
+ const candidateRoot = plainDirectory(path.dirname(path.dirname(invoked)), 'legacy update bridge candidate root');
527
+ const manifest = packageManifest(candidateRoot, '@aopslabs/aops');
528
+ const version = exactVersion(manifest.version, 'legacy update bridge candidate version');
529
+ assert.equal(version, plan.target.packages.cli, 'legacy update bridge candidate must match the plan target');
530
+ return { candidateRoot, version };
531
+ }
532
+ export function dispatchGlobalUpdate(options, run = defaultRunner) {
533
+ const plan = readGlobalUpdatePlan(options.plan);
534
+ assert.equal(options.confirm, plan.planId, 'global update confirmation does not match the exact plan');
535
+ const resultPath = path.join(plan.operationRoot, RESULT_FILE);
536
+ assert.equal(existsSync(resultPath), false, 'global_update_plan_already_terminal');
537
+ let executorStarted = false;
538
+ try {
539
+ const { receipt, receiptPath } = stageCandidateGlobalUpdateExecutor(plan, run);
540
+ executorStarted = true;
541
+ return parseJson(run(process.execPath, [
542
+ receipt.entrypoint,
543
+ 'update',
544
+ 'apply',
545
+ '--plan',
546
+ options.plan,
547
+ '--confirm',
548
+ options.confirm,
549
+ '--executor-receipt',
550
+ receiptPath,
551
+ '--json',
552
+ ]).trim(), 'global_update_candidate_result');
553
+ }
554
+ catch (error) {
555
+ if (!existsSync(resultPath)) {
556
+ writeTerminalUpdateResult(plan, {
557
+ schemaVersion: 1,
558
+ contract: RESULT_CONTRACT,
559
+ status: executorStarted ? 'executor-result-missing' : 'executor-staging-failed',
560
+ planId: plan.planId,
561
+ failedStage: executorStarted ? 'candidate-executor' : 'stage-candidate-executor',
562
+ globalState: executorStarted ? 'unknown-requires-inspection' : 'unchanged',
563
+ rollbackPerformed: false,
564
+ error: safeUpdateError(error),
565
+ events: [],
566
+ });
567
+ }
568
+ throw new Error(`global update candidate executor failed; diagnostic record: ${resultPath}`, { cause: error });
569
+ }
570
+ }
367
571
  export function installGlobalUpdateClosure(run, plan, records, topology) {
368
572
  const cli = packageRecordByName(records, '@aopslabs/aops');
369
573
  const server = packageRecordByName(records, '@aopslabs/aops-server');
@@ -528,9 +732,61 @@ export function validateLoopbackOrigin(value, label) {
528
732
  assert.equal(url.hash, '', `${label} must not include a fragment`);
529
733
  return url.origin;
530
734
  }
735
+ function nestedCommunityDiagnostic(error) {
736
+ const pending = [error];
737
+ const visited = new Set();
738
+ while (pending.length > 0) {
739
+ const candidate = pending.shift();
740
+ if (!candidate || visited.has(candidate))
741
+ continue;
742
+ visited.add(candidate);
743
+ if (typeof candidate === 'object') {
744
+ const record = candidate;
745
+ if (isCommunityDiagnosticV1(record.diagnostic))
746
+ return record.diagnostic;
747
+ if (record.cause)
748
+ pending.push(record.cause);
749
+ if (candidate instanceof AggregateError)
750
+ pending.push(...candidate.errors);
751
+ }
752
+ }
753
+ return undefined;
754
+ }
755
+ function safeUpdateError(error) {
756
+ const diagnostic = nestedCommunityDiagnostic(error);
757
+ if (diagnostic) {
758
+ const details = diagnostic.details;
759
+ return Object.fromEntries(Object.entries({
760
+ code: diagnostic.code,
761
+ causeCode: diagnostic.cause.code,
762
+ phase: diagnostic.phase,
763
+ operationId: typeof details.operationId === 'string' && UUID.test(details.operationId)
764
+ ? details.operationId
765
+ : undefined,
766
+ operation: typeof details.operation === 'string' ? details.operation : undefined,
767
+ journalPhase: typeof details.journalPhase === 'string' ? details.journalPhase : undefined,
768
+ journalStep: typeof details.journalStep === 'string' ? details.journalStep : undefined,
769
+ }).filter(([, value]) => value !== undefined));
770
+ }
771
+ const original = error instanceof Error ? error.message : String(error ?? 'global update failed');
772
+ const message = original
773
+ .split(/\r?\n/u, 1)[0]
774
+ .replace(/https?:\/\/\S+/giu, '[REDACTED_URL]')
775
+ .replace(/((?:password|passwd|secret|token|api[_-]?key|authorization)\s*[=:]\s*)\S+/giu, '$1[REDACTED]')
776
+ .replace(/(?:[A-Za-z]:\\|\/)\S+/gu, '[REDACTED_PATH]')
777
+ .slice(0, 500);
778
+ const code = /\b(?:aops|community|global_update)_[a-z0-9_]+\b/iu.exec(original)?.[0]?.toLowerCase()
779
+ ?? 'global_update_failed';
780
+ return { code, message };
781
+ }
782
+ function writeTerminalUpdateResult(plan, result) {
783
+ const resultPath = path.join(plan.operationRoot, RESULT_FILE);
784
+ writeFileSync(resultPath, `${JSON.stringify(result, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
785
+ }
531
786
  export async function applyGlobalUpdate(options, run = defaultRunner, execution = defaultExecutionDependencies) {
532
787
  const plan = readGlobalUpdatePlan(options.plan);
533
788
  assert.equal(options.confirm, plan.planId, 'global update confirmation does not match the exact plan');
789
+ assert.equal(existsSync(path.join(plan.operationRoot, RESULT_FILE)), false, 'global_update_plan_already_terminal');
534
790
  const current = inspectGlobalInstall(run);
535
791
  assert.deepEqual(current.packages, plan.prior.packages, 'global packages changed after update planning');
536
792
  assert.deepEqual(current.topology, plan.prior.topology, 'global package topology changed after update planning');
@@ -538,31 +794,39 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
538
794
  assertHealthyServices(serviceSnapshot(run, current.cliPath));
539
795
  const events = [];
540
796
  let applicationUpdateId = null;
797
+ let failedStage = 'stop-cockpit';
541
798
  try {
542
799
  stopService(run, current.cliPath, 'cockpit');
543
800
  events.push('stopped:cockpit');
801
+ failedStage = 'stop-server';
544
802
  stopService(run, current.cliPath, 'server');
545
803
  events.push('stopped:server');
804
+ failedStage = 'install-candidate';
546
805
  installGlobalUpdateClosure(run, plan, plan.candidates, plan.target.topology);
547
806
  events.push('installed:candidate');
807
+ failedStage = 'verify-candidate';
548
808
  const updated = inspectGlobalInstall(run);
549
809
  assert.deepEqual(updated.packages, plan.target.packages, 'installed candidate closure is not exact');
550
810
  assert.deepEqual(updated.topology, plan.target.topology, 'installed candidate topology is not canonical');
551
811
  if (plan.prior.packages.server === plan.target.packages.server) {
812
+ failedStage = 'start-unchanged-server';
552
813
  startService(run, updated.cliPath, 'server');
553
814
  events.push('started:server-unchanged');
554
815
  }
555
816
  else {
817
+ failedStage = 'update-server-application';
556
818
  applicationUpdateId = updateServerApplication(run, updated.cliPath, {
557
819
  prior: plan.prior.packages.server,
558
820
  target: plan.target.packages.server,
559
821
  });
560
822
  events.push('updated:server');
561
823
  }
824
+ failedStage = 'start-cockpit';
562
825
  startService(run, updated.cliPath, 'cockpit');
563
826
  events.push('started:cockpit');
827
+ failedStage = 'stable-health';
564
828
  const healthEvidence = await assertStableHealth(run, plan, execution);
565
- return {
829
+ const result = {
566
830
  schemaVersion: 1,
567
831
  contract: RESULT_CONTRACT,
568
832
  status: 'updated',
@@ -573,9 +837,13 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
573
837
  healthEvidence,
574
838
  next: 'Exit and reopen the AOPS TUI to run the newly installed binary.',
575
839
  };
840
+ writeTerminalUpdateResult(plan, result);
841
+ return result;
576
842
  }
577
843
  catch (updateError) {
844
+ const updateStage = failedStage;
578
845
  events.push('rollback:started');
846
+ let rollbackError;
579
847
  try {
580
848
  stopService(run, plan.cliPath, 'cockpit', true);
581
849
  stopService(run, plan.cliPath, 'server', true);
@@ -611,10 +879,50 @@ export async function applyGlobalUpdate(options, run = defaultRunner, execution
611
879
  events.push('rollback:services-recovered');
612
880
  }
613
881
  catch (serviceRecoveryError) {
882
+ writeTerminalUpdateResult(plan, {
883
+ schemaVersion: 1,
884
+ contract: RESULT_CONTRACT,
885
+ status: 'recovery-required',
886
+ planId: plan.planId,
887
+ failedStage: updateStage,
888
+ rollbackPerformed: true,
889
+ rollback: { status: 'failed', error: safeUpdateError(rollbackError) },
890
+ serviceRecovery: { status: 'failed', error: safeUpdateError(serviceRecoveryError) },
891
+ error: safeUpdateError(updateError),
892
+ events,
893
+ });
614
894
  throw new AggregateError([updateError, rollbackError, serviceRecoveryError], `global update, automatic rollback, and service recovery failed; services may remain stopped; recovery artifacts remain at ${plan.operationRoot}`);
615
895
  }
896
+ writeTerminalUpdateResult(plan, {
897
+ schemaVersion: 1,
898
+ contract: RESULT_CONTRACT,
899
+ status: 'failed-restored',
900
+ planId: plan.planId,
901
+ failedStage: updateStage,
902
+ installed: plan.prior.packages,
903
+ rollbackPerformed: true,
904
+ rollback: {
905
+ status: 'healthy',
906
+ recovery: 'services-recovered',
907
+ applicationRollbackError: safeUpdateError(rollbackError),
908
+ },
909
+ error: safeUpdateError(updateError),
910
+ events,
911
+ });
616
912
  throw new AggregateError([updateError, rollbackError], `global update and application rollback failed; prior exact packages and healthy services were restored; recovery artifacts remain at ${plan.operationRoot}`);
617
913
  }
914
+ writeTerminalUpdateResult(plan, {
915
+ schemaVersion: 1,
916
+ contract: RESULT_CONTRACT,
917
+ status: 'failed-restored',
918
+ planId: plan.planId,
919
+ failedStage: updateStage,
920
+ installed: plan.prior.packages,
921
+ rollbackPerformed: true,
922
+ rollback: { status: 'healthy' },
923
+ error: safeUpdateError(updateError),
924
+ events,
925
+ });
618
926
  throw new Error('global update failed; the prior exact packages were restored and are healthy', { cause: updateError });
619
927
  }
620
928
  }
@@ -639,7 +947,27 @@ export function makeGlobalUpdateCommand() {
639
947
  .description('Apply one exact prepared plan with automatic rollback and health verification')
640
948
  .requiredOption('--plan <path>', 'Exact update-plan.json path returned by prepare')
641
949
  .requiredOption('--confirm <plan-id>', 'Exact sha256 plan id returned by prepare')
950
+ .addOption(new Option('--executor-receipt <path>').hideHelp())
642
951
  .option('--json', 'Output JSON')
643
- .action(async (options) => output(await applyGlobalUpdate(options), options.json === true));
952
+ .action(async (options) => {
953
+ if (typeof options.executorReceipt === 'string') {
954
+ const plan = readGlobalUpdatePlan(options.plan);
955
+ validateCandidateExecutorInvocation(plan, options.executorReceipt);
956
+ output(await applyGlobalUpdate(options), options.json === true);
957
+ return;
958
+ }
959
+ output(dispatchGlobalUpdate(options), options.json === true);
960
+ });
961
+ command
962
+ .command('bridge')
963
+ .description('Apply an old-CLI plan from an externally launched exact public candidate')
964
+ .requiredOption('--plan <path>', 'Exact update-plan.json path returned by the installed old CLI')
965
+ .requiredOption('--confirm <plan-id>', 'Exact sha256 plan id returned by prepare')
966
+ .option('--json', 'Output JSON')
967
+ .action((options) => {
968
+ const plan = readGlobalUpdatePlan(options.plan);
969
+ validateLegacyGlobalUpdateBridgeInvocation(plan);
970
+ output(dispatchGlobalUpdate(options), options.json === true);
971
+ });
644
972
  return command;
645
973
  }
@@ -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 "6164b5c4d71eb6eed7d12b49faf10cd9f7c5324de4e893f50087e7089b5483b3" === 'undefined'
546
+ return typeof "859b976094fe8cde402fd4ff8b48716df0360ce7e30e698f43b6515216f4c95f" === 'undefined'
547
547
  ? undefined
548
- : "6164b5c4d71eb6eed7d12b49faf10cd9f7c5324de4e893f50087e7089b5483b3";
548
+ : "859b976094fe8cde402fd4ff8b48716df0360ce7e30e698f43b6515216f4c95f";
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": "08d7ccc099bcc86e1e4a8cea6ea0d7b50eee76f3a126d6020bf11b2b2edacb3c"
45
+ "sha256": "57572099d109ed36bd889f2b9f68a1b3bb4b02d31dc776ac9bd1e40c05c83693"
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": "dd80c815d10feb9499911bc5eb9c3bf56964afe66faa894ebc9de478cb0e5311",
10
+ "evidenceSha256": "8f3be9ab0d760a626f18989308788bd3f590169212bf5ba56cfc255c1c845f89",
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.17",
3
+ "version": "0.3.18",
4
4
  "type": "module",
5
5
  "description": "AOPS CLI and terminal setup application.",
6
6
  "aopsDockerServerVersion": "0.2.15",
@@ -44,6 +44,7 @@
44
44
  "test:package-identity": "node --test test/package-identity.test.mjs test/npm-tar-entry-mode.test.mjs",
45
45
  "test:tui-launcher": "node --test test/tui-launcher.test.mjs",
46
46
  "test:global-update": "node --test test/global-update.test.mjs test/cli-error-format.test.mjs",
47
+ "test:global-update-public-bridge": "node scripts/verify-global-update-public-bridge.mjs",
47
48
  "test:skill-discovery": "node --test test/skill-discovery.test.mjs",
48
49
  "test:target-auth": "node --test test/target-auth.test.mjs test/device-login.test.mjs",
49
50
  "test:target-transport": "node --test test/target-transport.test.mjs",