@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.
- package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/aops-cli.md +13 -0
- package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/aops-system.md +15 -0
- package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/manifest.json +7 -7
- package/agent-assets-release/agent-assets/inventory.json +5 -5
- package/agent-assets-release/agent-assets/projection.json +1 -1
- package/agent-assets-release/agent-assets-release.json +38 -38
- package/agent-assets-release/agent-assets-release.sigstore.json +25 -25
- package/assets/agent-assets/core/user-guides/aops-cli.md +13 -0
- package/assets/agent-assets/core/user-guides/aops-system.md +15 -0
- package/dist/commands/community-server.js +1 -0
- package/dist/commands/global-update.js +336 -8
- package/dist/lib/agent-assets/native-fs.js +2 -2
- package/native/manifest.json +1 -1
- package/native/qualifications/win32-x64.json +1 -1
- package/native/tui/darwin-arm64/aops-tui +0 -0
- package/native/tui/win32-x64/aops-tui.exe +0 -0
- package/package.json +2 -1
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/agentspace/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/aops-cli-core/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/chatv3/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/collaborative-work/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/discuss/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/docman/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/mission/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/projectman/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/sys/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/view/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/references/working-disciplines/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/agent-assets.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/agentspace.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/chatv3.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/docman.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/projectman.md +0 -0
- /package/agent-assets-release/agent-assets/core/{e66703ed1e78896b46a4124b8c26f2972a504900425517ea51f1dcc484d411a1 → 387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447}/files/user-guides/sys.md +0 -0
- /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":
|
|
76
|
+
"byteLength": 52016,
|
|
77
77
|
"path": "user-guides/aops-cli.md",
|
|
78
|
-
"sha256": "
|
|
78
|
+
"sha256": "9984693a3bed26654e7beace62f61dc5227306e4c253ca63f8f3582bed6929a4"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
|
-
"byteLength":
|
|
81
|
+
"byteLength": 5564,
|
|
82
82
|
"path": "user-guides/aops-system.md",
|
|
83
|
-
"sha256": "
|
|
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": "
|
|
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.
|
|
121
|
-
"versionId": "community-core-0.3.
|
|
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/
|
|
9
|
+
"manifestRef": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/manifest.json",
|
|
10
10
|
"name": "aops",
|
|
11
11
|
"optional": false,
|
|
12
|
-
"packageSha256": "
|
|
13
|
-
"version": "0.3.
|
|
14
|
-
"versionId": "community-core-0.3.
|
|
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": "
|
|
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": "
|
|
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/
|
|
10
|
+
"manifestRef": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/manifest.json",
|
|
11
11
|
"name": "aops",
|
|
12
12
|
"optional": false,
|
|
13
|
-
"packageSha256": "
|
|
14
|
-
"version": "0.3.
|
|
15
|
-
"versionId": "community-core-0.3.
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
85
|
+
"ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/agentspace.md",
|
|
86
86
|
"sha256": "18924d928b659eb80a7736a104b56b9693cffe91cc4499e739a2a67a0922c519"
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
"byteLength":
|
|
90
|
-
"ref": "agent-assets/core/
|
|
91
|
-
"sha256": "
|
|
89
|
+
"byteLength": 52016,
|
|
90
|
+
"ref": "agent-assets/core/387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447/files/user-guides/aops-cli.md",
|
|
91
|
+
"sha256": "9984693a3bed26654e7beace62f61dc5227306e4c253ca63f8f3582bed6929a4"
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
|
-
"byteLength":
|
|
95
|
-
"ref": "agent-assets/core/
|
|
96
|
-
"sha256": "
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
126
|
-
"sha256": "
|
|
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": "
|
|
136
|
+
"sha256": "d7fa6b1266894d6730ca688be6e696ae613c3ea1bc57ea2198158060192aa9e7"
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
139
|
"byteLength": 281,
|
|
140
140
|
"ref": "agent-assets/projection.json",
|
|
141
|
-
"sha256": "
|
|
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": "
|
|
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": "
|
|
157
|
+
"sha256": "59bd38f95ce1047dded991728089d00ae21c3affacf1240d0f13f2052fda2c13"
|
|
158
158
|
},
|
|
159
159
|
"root": "agent-assets",
|
|
160
160
|
"schemaVersion": 1,
|
|
161
|
-
"setSha256": "
|
|
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.
|
|
169
|
+
"releaseVersion": "0.3.18",
|
|
170
170
|
"schemaVersion": 1,
|
|
171
171
|
"source": {
|
|
172
|
-
"commit": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
21
|
+
"integratedTime": "1786740573",
|
|
22
22
|
"inclusionPromise": {
|
|
23
|
-
"signedEntryTimestamp": "
|
|
23
|
+
"signedEntryTimestamp": "MEYCIQDhORlKgbFD7fA5gLwoultbfLUWyUmn1ygQV8tjcW7BHAIhALIHSkMod4Y+tvnhcq3mWvrbmvA6spp7uAf30ynpc32a"
|
|
24
24
|
},
|
|
25
25
|
"inclusionProof": {
|
|
26
|
-
"logIndex": "
|
|
27
|
-
"rootHash": "
|
|
28
|
-
"treeSize": "
|
|
26
|
+
"logIndex": "2347026248",
|
|
27
|
+
"rootHash": "RtUFOrRHoskbD5PYp854fA66uRpkhbwg4SZb418qtvg=",
|
|
28
|
+
"treeSize": "2347026263",
|
|
29
29
|
"hashes": [
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
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\
|
|
51
|
+
"envelope": "rekor.sigstore.dev - 1193050959916656506\n2347026263\nRtUFOrRHoskbD5PYp854fA66uRpkhbwg4SZb418qtvg=\n\n— rekor.sigstore.dev wNI9ajBFAiAjECxzEY+qYNfPo226KB7MDGYSGJGw5AliWON1FirLUgIhAPDcs7rzExG0WeuKtYSujkJvybVIYWPpBw+HYxYFkyn0\n"
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
|
-
"canonicalizedBody": "
|
|
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": "
|
|
62
|
+
"digest": "/dA+ij/RJVYyUyiPadWJ20ubzYjY2Z6pD+iEqNUSV9M="
|
|
63
63
|
},
|
|
64
|
-
"signature": "
|
|
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
|
-
|
|
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
|
-
|
|
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) =>
|
|
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 "
|
|
546
|
+
return typeof "859b976094fe8cde402fd4ff8b48716df0360ce7e30e698f43b6515216f4c95f" === 'undefined'
|
|
547
547
|
? undefined
|
|
548
|
-
: "
|
|
548
|
+
: "859b976094fe8cde402fd4ff8b48716df0360ce7e30e698f43b6515216f4c95f";
|
|
549
549
|
}
|
|
550
550
|
function sha256(bytes) {
|
|
551
551
|
return createHash('sha256').update(bytes).digest('hex');
|
package/native/manifest.json
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"capabilityClass": "windows-ntfs-crash-recoverable-v1",
|
|
43
43
|
"qualification": {
|
|
44
44
|
"relativePath": "qualifications/win32-x64.json",
|
|
45
|
-
"sha256": "
|
|
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": "
|
|
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.
|
|
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",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|