act-cli 0.7.6__tar.gz → 0.8.1__tar.gz

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 (41) hide show
  1. {act_cli-0.7.6 → act_cli-0.8.1}/Cargo.lock +148 -44
  2. {act_cli-0.7.6 → act_cli-0.8.1}/Cargo.toml +2 -2
  3. {act_cli-0.7.6 → act_cli-0.8.1}/PKG-INFO +1 -1
  4. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/Cargo.toml +1 -0
  5. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/main.rs +143 -26
  6. act_cli-0.8.1/act-cli/src/resolve.rs +42 -0
  7. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/rmcp_bridge.rs +23 -1
  8. act_cli-0.8.1/crates/act-store/Cargo.toml +30 -0
  9. act_cli-0.8.1/crates/act-store/README.md +125 -0
  10. act_cli-0.8.1/crates/act-store/src/fetch.rs +605 -0
  11. act_cli-0.8.1/crates/act-store/src/index.rs +302 -0
  12. act_cli-0.8.1/crates/act-store/src/layout.rs +111 -0
  13. act_cli-0.8.1/crates/act-store/src/lib.rs +61 -0
  14. act_cli-0.8.1/crates/act-store/src/lock.rs +76 -0
  15. act_cli-0.8.1/crates/act-store/src/provenance.rs +172 -0
  16. act_cli-0.8.1/crates/act-store/src/reference.rs +181 -0
  17. act_cli-0.8.1/crates/act-store/src/referrer.rs +64 -0
  18. act_cli-0.8.1/crates/act-store/src/store.rs +626 -0
  19. act_cli-0.7.6/act-cli/src/resolve.rs +0 -418
  20. {act_cli-0.7.6 → act_cli-0.8.1}/README.md +0 -0
  21. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/README.md +0 -0
  22. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/build.rs +0 -0
  23. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/config.rs +0 -0
  24. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/format.rs +0 -0
  25. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/http.rs +0 -0
  26. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/bindings/mod.rs +0 -0
  27. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/effective.rs +0 -0
  28. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/fs_matcher.rs +0 -0
  29. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/fs_policy.rs +0 -0
  30. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/http_client.rs +0 -0
  31. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/http_policy.rs +0 -0
  32. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/mod.rs +0 -0
  33. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/network.rs +0 -0
  34. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/sessions.rs +0 -0
  35. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/src/runtime/sockets_policy.rs +0 -0
  36. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/wit/deps/act-core/act-core.wit +0 -0
  37. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/wit/deps/act-tools/act-tools.wit +0 -0
  38. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/wit/deps.lock +0 -0
  39. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/wit/deps.toml +0 -0
  40. {act_cli-0.7.6 → act_cli-0.8.1}/act-cli/wit/world.wit +0 -0
  41. {act_cli-0.7.6 → act_cli-0.8.1}/pyproject.toml +0 -0
@@ -4,7 +4,7 @@ version = 4
4
4
 
5
5
  [[package]]
6
6
  name = "act-build"
7
- version = "0.7.6"
7
+ version = "0.8.1"
8
8
  dependencies = [
9
9
  "act-types",
10
10
  "anyhow",
@@ -14,11 +14,13 @@ dependencies = [
14
14
  "dirs",
15
15
  "flate2",
16
16
  "globset",
17
+ "http",
17
18
  "include_dir",
18
19
  "json-patch",
19
20
  "minijinja",
20
21
  "oci-client",
21
- "reqwest",
22
+ "olpc-cjson",
23
+ "reqwest 0.13.4",
22
24
  "serde",
23
25
  "serde_json",
24
26
  "sha2 0.11.0",
@@ -35,8 +37,9 @@ dependencies = [
35
37
 
36
38
  [[package]]
37
39
  name = "act-cli"
38
- version = "0.7.6"
40
+ version = "0.8.1"
39
41
  dependencies = [
42
+ "act-store",
40
43
  "act-types",
41
44
  "anyhow",
42
45
  "axum",
@@ -57,7 +60,7 @@ dependencies = [
57
60
  "owo-colors",
58
61
  "path-clean",
59
62
  "regex",
60
- "reqwest",
63
+ "reqwest 0.13.4",
61
64
  "rmcp",
62
65
  "serde",
63
66
  "serde_json",
@@ -78,6 +81,27 @@ dependencies = [
78
81
  "wasmtime-wasi-http",
79
82
  ]
80
83
 
84
+ [[package]]
85
+ name = "act-store"
86
+ version = "0.1.1"
87
+ dependencies = [
88
+ "chrono",
89
+ "dirs",
90
+ "fs4",
91
+ "oci-client",
92
+ "oci-spec",
93
+ "regex",
94
+ "reqwest 0.12.28",
95
+ "serde",
96
+ "serde_json",
97
+ "sha2 0.11.0",
98
+ "tempfile",
99
+ "thiserror 2.0.18",
100
+ "tokio",
101
+ "tracing",
102
+ "url",
103
+ ]
104
+
81
105
  [[package]]
82
106
  name = "act-types"
83
107
  version = "0.7.1"
@@ -304,9 +328,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
304
328
 
305
329
  [[package]]
306
330
  name = "bitflags"
307
- version = "2.11.1"
331
+ version = "2.12.1"
308
332
  source = "registry+https://github.com/rust-lang/crates.io-index"
309
- checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
333
+ checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a"
310
334
 
311
335
  [[package]]
312
336
  name = "block-buffer"
@@ -430,9 +454,9 @@ dependencies = [
430
454
 
431
455
  [[package]]
432
456
  name = "cc"
433
- version = "1.2.62"
457
+ version = "1.2.63"
434
458
  source = "registry+https://github.com/rust-lang/crates.io-index"
435
- checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
459
+ checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
436
460
  dependencies = [
437
461
  "find-msvc-tools",
438
462
  "jobserver",
@@ -1051,9 +1075,9 @@ dependencies = [
1051
1075
 
1052
1076
  [[package]]
1053
1077
  name = "displaydoc"
1054
- version = "0.2.5"
1078
+ version = "0.2.6"
1055
1079
  source = "registry+https://github.com/rust-lang/crates.io-index"
1056
- checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
1080
+ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
1057
1081
  dependencies = [
1058
1082
  "proc-macro2",
1059
1083
  "quote",
@@ -1203,6 +1227,16 @@ dependencies = [
1203
1227
  "windows-sys 0.59.0",
1204
1228
  ]
1205
1229
 
1230
+ [[package]]
1231
+ name = "fs4"
1232
+ version = "1.1.0"
1233
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1234
+ checksum = "7e72ed92b67c146290f88e9c89d60ca163ea417a446f61ffd7b72df3e7f1dfd5"
1235
+ dependencies = [
1236
+ "rustix",
1237
+ "windows-sys 0.61.2",
1238
+ ]
1239
+
1206
1240
  [[package]]
1207
1241
  name = "fs_extra"
1208
1242
  version = "1.3.0"
@@ -1481,9 +1515,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
1481
1515
 
1482
1516
  [[package]]
1483
1517
  name = "http"
1484
- version = "1.4.0"
1518
+ version = "1.4.1"
1485
1519
  source = "registry+https://github.com/rust-lang/crates.io-index"
1486
- checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
1520
+ checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0"
1487
1521
  dependencies = [
1488
1522
  "bytes",
1489
1523
  "itoa",
@@ -1544,9 +1578,9 @@ dependencies = [
1544
1578
 
1545
1579
  [[package]]
1546
1580
  name = "hyper"
1547
- version = "1.9.0"
1581
+ version = "1.10.1"
1548
1582
  source = "registry+https://github.com/rust-lang/crates.io-index"
1549
- checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
1583
+ checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
1550
1584
  dependencies = [
1551
1585
  "atomic-waker",
1552
1586
  "bytes",
@@ -1577,6 +1611,7 @@ dependencies = [
1577
1611
  "tokio",
1578
1612
  "tokio-rustls",
1579
1613
  "tower-service",
1614
+ "webpki-roots",
1580
1615
  ]
1581
1616
 
1582
1617
  [[package]]
@@ -2026,9 +2061,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
2026
2061
 
2027
2062
  [[package]]
2028
2063
  name = "libredox"
2029
- version = "0.1.16"
2064
+ version = "0.1.17"
2030
2065
  source = "registry+https://github.com/rust-lang/crates.io-index"
2031
- checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c"
2066
+ checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
2032
2067
  dependencies = [
2033
2068
  "libc",
2034
2069
  ]
@@ -2056,9 +2091,9 @@ dependencies = [
2056
2091
 
2057
2092
  [[package]]
2058
2093
  name = "log"
2059
- version = "0.4.29"
2094
+ version = "0.4.31"
2060
2095
  source = "registry+https://github.com/rust-lang/crates.io-index"
2061
- checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
2096
+ checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f"
2062
2097
 
2063
2098
  [[package]]
2064
2099
  name = "lru-slab"
@@ -2098,9 +2133,9 @@ checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4"
2098
2133
 
2099
2134
  [[package]]
2100
2135
  name = "memchr"
2101
- version = "2.8.0"
2136
+ version = "2.8.1"
2102
2137
  source = "registry+https://github.com/rust-lang/crates.io-index"
2103
- checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
2138
+ checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
2104
2139
 
2105
2140
  [[package]]
2106
2141
  name = "memfd"
@@ -2145,9 +2180,9 @@ dependencies = [
2145
2180
 
2146
2181
  [[package]]
2147
2182
  name = "mio"
2148
- version = "1.2.0"
2183
+ version = "1.2.1"
2149
2184
  source = "registry+https://github.com/rust-lang/crates.io-index"
2150
- checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
2185
+ checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
2151
2186
  dependencies = [
2152
2187
  "libc",
2153
2188
  "wasi",
@@ -2219,7 +2254,7 @@ dependencies = [
2219
2254
  "oci-spec",
2220
2255
  "olpc-cjson",
2221
2256
  "regex",
2222
- "reqwest",
2257
+ "reqwest 0.13.4",
2223
2258
  "serde",
2224
2259
  "serde_json",
2225
2260
  "sha2 0.11.0",
@@ -2722,9 +2757,47 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
2722
2757
 
2723
2758
  [[package]]
2724
2759
  name = "reqwest"
2725
- version = "0.13.3"
2760
+ version = "0.12.28"
2726
2761
  source = "registry+https://github.com/rust-lang/crates.io-index"
2727
- checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0"
2762
+ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
2763
+ dependencies = [
2764
+ "base64",
2765
+ "bytes",
2766
+ "futures-core",
2767
+ "http",
2768
+ "http-body",
2769
+ "http-body-util",
2770
+ "hyper",
2771
+ "hyper-rustls",
2772
+ "hyper-util",
2773
+ "js-sys",
2774
+ "log",
2775
+ "percent-encoding",
2776
+ "pin-project-lite",
2777
+ "quinn",
2778
+ "rustls",
2779
+ "rustls-pki-types",
2780
+ "serde",
2781
+ "serde_json",
2782
+ "serde_urlencoded",
2783
+ "sync_wrapper",
2784
+ "tokio",
2785
+ "tokio-rustls",
2786
+ "tower",
2787
+ "tower-http",
2788
+ "tower-service",
2789
+ "url",
2790
+ "wasm-bindgen",
2791
+ "wasm-bindgen-futures",
2792
+ "web-sys",
2793
+ "webpki-roots",
2794
+ ]
2795
+
2796
+ [[package]]
2797
+ name = "reqwest"
2798
+ version = "0.13.4"
2799
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2800
+ checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3"
2728
2801
  dependencies = [
2729
2802
  "base64",
2730
2803
  "bytes",
@@ -2873,6 +2946,7 @@ checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
2873
2946
  dependencies = [
2874
2947
  "aws-lc-rs",
2875
2948
  "once_cell",
2949
+ "ring",
2876
2950
  "rustls-pki-types",
2877
2951
  "rustls-webpki",
2878
2952
  "subtle",
@@ -2881,9 +2955,9 @@ dependencies = [
2881
2955
 
2882
2956
  [[package]]
2883
2957
  name = "rustls-native-certs"
2884
- version = "0.8.3"
2958
+ version = "0.8.4"
2885
2959
  source = "registry+https://github.com/rust-lang/crates.io-index"
2886
- checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
2960
+ checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
2887
2961
  dependencies = [
2888
2962
  "openssl-probe",
2889
2963
  "rustls-pki-types",
@@ -3207,9 +3281,9 @@ dependencies = [
3207
3281
 
3208
3282
  [[package]]
3209
3283
  name = "shlex"
3210
- version = "1.3.0"
3284
+ version = "2.0.1"
3211
3285
  source = "registry+https://github.com/rust-lang/crates.io-index"
3212
- checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
3286
+ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
3213
3287
 
3214
3288
  [[package]]
3215
3289
  name = "signal-hook-registry"
@@ -3269,9 +3343,9 @@ dependencies = [
3269
3343
 
3270
3344
  [[package]]
3271
3345
  name = "socket2"
3272
- version = "0.6.3"
3346
+ version = "0.6.4"
3273
3347
  source = "registry+https://github.com/rust-lang/crates.io-index"
3274
- checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
3348
+ checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
3275
3349
  dependencies = [
3276
3350
  "libc",
3277
3351
  "windows-sys 0.61.2",
@@ -3761,9 +3835,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
3761
3835
 
3762
3836
  [[package]]
3763
3837
  name = "typenum"
3764
- version = "1.20.0"
3838
+ version = "1.20.1"
3765
3839
  source = "registry+https://github.com/rust-lang/crates.io-index"
3766
- checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
3840
+ checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
3767
3841
 
3768
3842
  [[package]]
3769
3843
  name = "unicase"
@@ -3842,9 +3916,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
3842
3916
 
3843
3917
  [[package]]
3844
3918
  name = "uuid"
3845
- version = "1.23.1"
3919
+ version = "1.23.2"
3846
3920
  source = "registry+https://github.com/rust-lang/crates.io-index"
3847
- checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
3921
+ checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7"
3848
3922
  dependencies = [
3849
3923
  "getrandom 0.4.2",
3850
3924
  "js-sys",
@@ -4008,6 +4082,16 @@ dependencies = [
4008
4082
  "wasmparser 0.250.0",
4009
4083
  ]
4010
4084
 
4085
+ [[package]]
4086
+ name = "wasm-encoder"
4087
+ version = "0.251.0"
4088
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4089
+ checksum = "5a879a421bd17c528b74721b2abf4c62e8f1d1889c2ba8c3c50d02deaf2ce395"
4090
+ dependencies = [
4091
+ "leb128fmt",
4092
+ "wasmparser 0.251.0",
4093
+ ]
4094
+
4011
4095
  [[package]]
4012
4096
  name = "wasm-metadata"
4013
4097
  version = "0.244.0"
@@ -4071,6 +4155,17 @@ dependencies = [
4071
4155
  "serde",
4072
4156
  ]
4073
4157
 
4158
+ [[package]]
4159
+ name = "wasmparser"
4160
+ version = "0.251.0"
4161
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4162
+ checksum = "437970b35b1a85cfde9c74b2398352d8d653f3bd8e3a3db0c063ea8f5b4b36ff"
4163
+ dependencies = [
4164
+ "bitflags",
4165
+ "indexmap 2.14.0",
4166
+ "semver",
4167
+ ]
4168
+
4074
4169
  [[package]]
4075
4170
  name = "wasmprinter"
4076
4171
  version = "0.248.0"
@@ -4405,22 +4500,22 @@ dependencies = [
4405
4500
 
4406
4501
  [[package]]
4407
4502
  name = "wast"
4408
- version = "250.0.0"
4503
+ version = "251.0.0"
4409
4504
  source = "registry+https://github.com/rust-lang/crates.io-index"
4410
- checksum = "69e9294a1f0204aeb5c47e95165517f43ef3cc895918c4f3e939380d4c290f4a"
4505
+ checksum = "5cc7467dda0a96142eb2c980329dfb62480b1e1d3622fdeb1a44e2bca6ceed74"
4411
4506
  dependencies = [
4412
4507
  "bumpalo",
4413
4508
  "leb128fmt",
4414
4509
  "memchr",
4415
4510
  "unicode-width",
4416
- "wasm-encoder 0.250.0",
4511
+ "wasm-encoder 0.251.0",
4417
4512
  ]
4418
4513
 
4419
4514
  [[package]]
4420
4515
  name = "wat"
4421
- version = "1.250.0"
4516
+ version = "1.251.0"
4422
4517
  source = "registry+https://github.com/rust-lang/crates.io-index"
4423
- checksum = "0a549ed329a70e444e0f7796391ab2a87d0aef30ddde9f60e16e429224fafd02"
4518
+ checksum = "81b1086c9e85b95bd6a229a928bc6c6d0662e42af0250c88d067b418831ea4d4"
4424
4519
  dependencies = [
4425
4520
  "wast",
4426
4521
  ]
@@ -4454,6 +4549,15 @@ dependencies = [
4454
4549
  "rustls-pki-types",
4455
4550
  ]
4456
4551
 
4552
+ [[package]]
4553
+ name = "webpki-roots"
4554
+ version = "1.0.7"
4555
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4556
+ checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d"
4557
+ dependencies = [
4558
+ "rustls-pki-types",
4559
+ ]
4560
+
4457
4561
  [[package]]
4458
4562
  name = "winapi"
4459
4563
  version = "0.3.9"
@@ -4955,18 +5059,18 @@ dependencies = [
4955
5059
 
4956
5060
  [[package]]
4957
5061
  name = "zerocopy"
4958
- version = "0.8.48"
5062
+ version = "0.8.50"
4959
5063
  source = "registry+https://github.com/rust-lang/crates.io-index"
4960
- checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
5064
+ checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
4961
5065
  dependencies = [
4962
5066
  "zerocopy-derive",
4963
5067
  ]
4964
5068
 
4965
5069
  [[package]]
4966
5070
  name = "zerocopy-derive"
4967
- version = "0.8.48"
5071
+ version = "0.8.50"
4968
5072
  source = "registry+https://github.com/rust-lang/crates.io-index"
4969
- checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
5073
+ checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
4970
5074
  dependencies = [
4971
5075
  "proc-macro2",
4972
5076
  "quote",
@@ -1,9 +1,9 @@
1
1
  [workspace]
2
- members = ["act-cli"]
2
+ members = ["act-cli", "crates/act-store"]
3
3
  resolver = "3"
4
4
 
5
5
  [workspace.package]
6
- version = "0.7.6"
6
+ version = "0.8.1"
7
7
  edition = "2024"
8
8
  license = "MIT OR Apache-2.0"
9
9
  repository = "https://github.com/actcore/act-cli"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: act-cli
3
- Version: 0.7.6
3
+ Version: 0.8.1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -56,6 +56,7 @@ cidr = "0.3"
56
56
  globset = "0.4"
57
57
  path-clean = "1"
58
58
  owo-colors = { version = "4.3.0", features = ["supports-colors"] }
59
+ act-store = { version = "0.1.0", path = "../crates/act-store" }
59
60
 
60
61
  [dev-dependencies]
61
62
  tempfile = "3"
@@ -185,6 +185,27 @@ enum Command {
185
185
  /// the session lives as long as the host).
186
186
  #[command(subcommand)]
187
187
  Session(SessionCommand),
188
+ /// Manage the local component store (list, update, gc).
189
+ #[command(subcommand)]
190
+ Store(StoreCommand),
191
+ }
192
+
193
+ #[derive(clap::Subcommand)]
194
+ enum StoreCommand {
195
+ /// List components in the local store.
196
+ List {
197
+ /// Output format.
198
+ #[arg(long, value_enum, default_value_t = OutputFormat::Text)]
199
+ format: OutputFormat,
200
+ },
201
+ /// Re-resolve stored components and re-pull any whose digest moved.
202
+ Update {
203
+ /// A single ref to update (omit to update all stored components).
204
+ #[arg(name = "ref")]
205
+ reference: Option<ComponentRef>,
206
+ },
207
+ /// Delete store blobs no longer referenced by any component.
208
+ Gc,
188
209
  }
189
210
 
190
211
  #[derive(clap::Subcommand)]
@@ -220,6 +241,7 @@ async fn main() -> Result<()> {
220
241
  Command::Session(sub) => match sub {
221
242
  SessionCommand::OpenArgsSchema { opts, .. } => opts.config.as_deref(),
222
243
  },
244
+ Command::Store(_) => None,
223
245
  };
224
246
  let log_level = config::load_config(config_path)
225
247
  .ok()
@@ -269,6 +291,11 @@ async fn main() -> Result<()> {
269
291
  cmd_session_open_args_schema(component, opts).await
270
292
  }
271
293
  },
294
+ Command::Store(sub) => match sub {
295
+ StoreCommand::List { format } => cmd_list(format).await,
296
+ StoreCommand::Update { reference } => cmd_update(reference).await,
297
+ StoreCommand::Gc => cmd_gc().await,
298
+ },
272
299
  }
273
300
  }
274
301
 
@@ -804,42 +831,132 @@ async fn cmd_pull(
804
831
  output: Option<PathBuf>,
805
832
  output_from_ref: bool,
806
833
  ) -> Result<()> {
807
- // Resolve to local path (downloads to cache for remote refs)
808
- // Always download fresh — pull is explicit user action
809
- let cached_path = resolve::resolve(&reference, true).await?;
834
+ let store = resolve::open_store()?;
835
+ let reference_str = reference.to_string();
836
+ let stored = act_store::pull(&store, &reference_str)
837
+ .await
838
+ .with_context(|| format!("pulling {reference_str}"))?;
839
+
840
+ // Path to the stored wasm blob (read-through hit; no re-pull).
841
+ let stored_path = act_store::ensure(&store, &reference_str).await?;
842
+
843
+ let export = output.or_else(|| {
844
+ output_from_ref.then(|| {
845
+ let ref_str = reference.to_string();
846
+ let base = ref_str
847
+ .rsplit('/')
848
+ .next()
849
+ .unwrap_or(&ref_str)
850
+ .split(':')
851
+ .next()
852
+ .unwrap_or(&ref_str);
853
+ let filename = if base.ends_with(".wasm") {
854
+ base.to_string()
855
+ } else {
856
+ format!("{base}.wasm")
857
+ };
858
+ PathBuf::from(filename)
859
+ })
860
+ });
810
861
 
811
- if let Some(out) = output {
812
- tokio::fs::copy(&cached_path, &out)
813
- .await
814
- .with_context(|| format!("copying to {}", out.display()))?;
815
- println!("{}", out.display());
816
- } else if output_from_ref {
817
- let ref_str = reference.to_string();
818
- let base = ref_str
819
- .rsplit('/')
820
- .next()
821
- .unwrap_or(&ref_str)
822
- .split(':')
823
- .next()
824
- .unwrap_or(&ref_str);
825
- let filename = if base.ends_with(".wasm") {
826
- base.to_string()
827
- } else {
828
- format!("{base}.wasm")
829
- };
830
- let out = PathBuf::from(&filename);
831
- tokio::fs::copy(&cached_path, &out)
862
+ if let Some(out) = export {
863
+ tokio::fs::copy(&stored_path, &out)
832
864
  .await
833
865
  .with_context(|| format!("copying to {}", out.display()))?;
834
866
  println!("{}", out.display());
835
867
  } else {
836
- // No output flag — print cached path
837
- println!("{}", cached_path.display());
868
+ println!(
869
+ "{} -> {} (sha256:{})",
870
+ reference_str,
871
+ stored_path.display(),
872
+ stored.manifest_digest
873
+ );
874
+ }
875
+ Ok(())
876
+ }
877
+
878
+ // ── Store subcommands ─────────────────────────────────────────────────────────
879
+
880
+ async fn cmd_list(format: OutputFormat) -> Result<()> {
881
+ let store = resolve::open_store()?;
882
+ let mut items = store.list()?;
883
+ items.sort_by(|a, b| source_ref(&a.provenance).cmp(source_ref(&b.provenance)));
884
+ match format {
885
+ OutputFormat::Json => {
886
+ let rows: Vec<_> = items
887
+ .iter()
888
+ .map(|s| {
889
+ serde_json::json!({
890
+ "ref": source_ref(&s.provenance),
891
+ "digest": s.provenance.digest,
892
+ "name": s.provenance.name,
893
+ "version": s.provenance.version,
894
+ "fetched_at": s.provenance.fetched_at,
895
+ })
896
+ })
897
+ .collect();
898
+ println!("{}", serde_json::to_string_pretty(&rows)?);
899
+ }
900
+ OutputFormat::Text => {
901
+ if items.is_empty() {
902
+ println!("(store is empty)");
903
+ }
904
+ for s in &items {
905
+ println!(
906
+ "{}\t{}\t{}",
907
+ source_ref(&s.provenance),
908
+ s.provenance.version.as_deref().unwrap_or("-"),
909
+ s.provenance.digest
910
+ );
911
+ }
912
+ }
838
913
  }
914
+ Ok(())
915
+ }
839
916
 
917
+ async fn cmd_update(reference: Option<ComponentRef>) -> Result<()> {
918
+ let store = resolve::open_store()?;
919
+ let refs: Vec<String> = match reference {
920
+ Some(r) => vec![r.to_string()],
921
+ None => store
922
+ .list()?
923
+ .iter()
924
+ .map(|s| source_ref(&s.provenance).to_string())
925
+ .collect(),
926
+ };
927
+ if refs.is_empty() {
928
+ println!("(store is empty)");
929
+ return Ok(());
930
+ }
931
+ for r in refs {
932
+ match act_store::update(&store, &r).await {
933
+ Ok(act_store::UpdateOutcome::Unchanged) => println!("{r}\tunchanged"),
934
+ Ok(act_store::UpdateOutcome::Updated { from, to }) => {
935
+ println!("{r}\tupdated {from} -> {to}")
936
+ }
937
+ Ok(act_store::UpdateOutcome::NotStored) => println!("{r}\tnot stored"),
938
+ Err(e) => eprintln!("{r}\tERROR: {e}"),
939
+ }
940
+ }
941
+ Ok(())
942
+ }
943
+
944
+ async fn cmd_gc() -> Result<()> {
945
+ let store = resolve::open_store()?;
946
+ let removed = store.gc()?;
947
+ println!("removed {removed} unreferenced blob(s)");
840
948
  Ok(())
841
949
  }
842
950
 
951
+ /// The source ref (as typed) recorded in a provenance.
952
+ fn source_ref(p: &act_store::Provenance) -> &str {
953
+ match &p.source {
954
+ act_store::Source::Oci { reference } => reference,
955
+ act_store::Source::Http { url, .. } => url,
956
+ act_store::Source::Local { path } => path,
957
+ }
958
+ }
959
+
843
960
  #[cfg(test)]
844
961
  mod tests {
845
962
  use super::*;