aac-cli 0.2.1__tar.gz → 0.2.2__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 (34) hide show
  1. {aac_cli-0.2.1/aac_cli.egg-info → aac_cli-0.2.2}/PKG-INFO +32 -8
  2. {aac_cli-0.2.1 → aac_cli-0.2.2}/README.md +31 -7
  3. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/__init__.py +1 -1
  4. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/cli.py +58 -4
  5. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/config_render.py +2 -1
  6. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/init_cli.py +3 -2
  7. {aac_cli-0.2.1 → aac_cli-0.2.2/aac_cli.egg-info}/PKG-INFO +32 -8
  8. {aac_cli-0.2.1 → aac_cli-0.2.2}/pyproject.toml +1 -1
  9. {aac_cli-0.2.1 → aac_cli-0.2.2}/LICENSE +0 -0
  10. {aac_cli-0.2.1 → aac_cli-0.2.2}/MANIFEST.in +0 -0
  11. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/__main__.py +0 -0
  12. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/admin_key_pem.py +0 -0
  13. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/agent_cli.py +0 -0
  14. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/agent_config.py +0 -0
  15. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/agent_health.py +0 -0
  16. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/agent_layout.py +0 -0
  17. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/agent_record.py +0 -0
  18. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/api_key_rotation_state.py +0 -0
  19. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/config.py +0 -0
  20. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/dev_material.py +0 -0
  21. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/idp_recovery.py +0 -0
  22. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/material_cases.py +0 -0
  23. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/profiles.py +0 -0
  24. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/reference.py +0 -0
  25. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/registration_state.py +0 -0
  26. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/secure_files.py +0 -0
  27. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/sso_login.py +0 -0
  28. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli/supplied_material.py +0 -0
  29. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli.egg-info/SOURCES.txt +0 -0
  30. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli.egg-info/dependency_links.txt +0 -0
  31. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli.egg-info/entry_points.txt +0 -0
  32. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli.egg-info/requires.txt +0 -0
  33. {aac_cli-0.2.1 → aac_cli-0.2.2}/aac_cli.egg-info/top_level.txt +0 -0
  34. {aac_cli-0.2.1 → aac_cli-0.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aac-cli
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: The aac platform CLI — headless operator interface to the AAC control plane (tenant registration, chain audit).
5
5
  Author: Agent Authority Cloud Project
6
6
  License-Expression: Apache-2.0
@@ -242,9 +242,24 @@ peer identities are known. No self destination is added.
242
242
 
243
243
  **Chain-start boundary:** restrict `/v1/agent/delegations` and
244
244
  `/v1/agent/mint-root` to the authorized originating application at the
245
- network/ingress boundary. The current sidecar does not authenticate these callers;
246
- sharing a private network with peers is insufficient. Expose only intended
247
- receive/A2A routes to peers. Development certificates do not require `dev_mode`.
245
+ network/ingress boundary. Sidecar **v0.4.0 and later** also require the existing
246
+ pair's AAC1-HMAC-SHA256 signature over the exact alias and raw request body.
247
+ Older releases do not authenticate these callers, so sharing a private network
248
+ with peers is insufficient. An authorized separate originator may hold the pair
249
+ secret only inside the same trusted tenant-application boundary; it gains
250
+ callback-signing capability too. Never share secrets across pairs or tenants.
251
+ Pairing freshness is not idempotent chain creation; do not automatically retry
252
+ an uncertain mint. Development certificates do not require `dev_mode`.
253
+
254
+ Applications using v0.4.0 can supply per-request `obligations` for T1. Equal
255
+ configured/request values combine once; differing values refuse rather than
256
+ override or intersect. Put dynamic limits in the request instead of also
257
+ configuring a different class value. Native request `valid_until` is reserved;
258
+ remove it and use class `valid_for`. For signed correlation, normally supply a
259
+ `task_ref` obligation per request: top-level `task_ref` alone is correlation
260
+ metadata, while a static class predicate deliberately shares one convergence
261
+ key across that class's chains. Omitted/null metadata inherits a configured or
262
+ obligation predicate; an explicit conflicting value refuses before minting.
248
263
 
249
264
  The following is the complete input schema. Unknown fields, duplicate mapping
250
265
  keys, YAML aliases/merge keys, object tags and files over 64 KiB are refused.
@@ -891,10 +906,19 @@ aac tenant reissue-api-key --profile prod
891
906
 
892
907
  ### Domains and workloads
893
908
 
894
- Every tenant gets a hosted trust domain from AAC; registration saves it in
895
- the profile, and `aac tenant assign-hosted-domain` assigns one to a tenant
896
- that has none yet. To use your own DNS domain as a trust domain instead,
897
- prove control of it with a DNS TXT record, then bind it:
909
+ Every tenant gets an AAC-assigned trust domain: the tenant id plus a suffix
910
+ the control plane selects for its environment,
911
+ `<tenant_id>.tenants.stage.cascadeauth.dev` on stage and
912
+ `<tenant_id>.tenants.cascadeauth.com` on production. No DNS record or proof
913
+ of ownership is needed; the first call allocates the name permanently and
914
+ every later call returns the same one, so use the name the command returns
915
+ rather than building it yourself. Registration saves it in the profile as
916
+ `hosted_trust_domain`. Signing in with `aac sso login` does not write it:
917
+ `aac tenant assign-hosted-domain` requests the same allocation and saves it
918
+ into the profile bound to that tenant, as `aac init` does during setup. To
919
+ use a custom domain you own as a trust domain instead, prove control of it
920
+ with a DNS TXT record, then bind it; a domain you own is recorded on the
921
+ server and never written to the profile:
898
922
 
899
923
  ```bash
900
924
  aac tenant issue-domain-challenge --profile prod --domain example.com
@@ -225,9 +225,24 @@ peer identities are known. No self destination is added.
225
225
 
226
226
  **Chain-start boundary:** restrict `/v1/agent/delegations` and
227
227
  `/v1/agent/mint-root` to the authorized originating application at the
228
- network/ingress boundary. The current sidecar does not authenticate these callers;
229
- sharing a private network with peers is insufficient. Expose only intended
230
- receive/A2A routes to peers. Development certificates do not require `dev_mode`.
228
+ network/ingress boundary. Sidecar **v0.4.0 and later** also require the existing
229
+ pair's AAC1-HMAC-SHA256 signature over the exact alias and raw request body.
230
+ Older releases do not authenticate these callers, so sharing a private network
231
+ with peers is insufficient. An authorized separate originator may hold the pair
232
+ secret only inside the same trusted tenant-application boundary; it gains
233
+ callback-signing capability too. Never share secrets across pairs or tenants.
234
+ Pairing freshness is not idempotent chain creation; do not automatically retry
235
+ an uncertain mint. Development certificates do not require `dev_mode`.
236
+
237
+ Applications using v0.4.0 can supply per-request `obligations` for T1. Equal
238
+ configured/request values combine once; differing values refuse rather than
239
+ override or intersect. Put dynamic limits in the request instead of also
240
+ configuring a different class value. Native request `valid_until` is reserved;
241
+ remove it and use class `valid_for`. For signed correlation, normally supply a
242
+ `task_ref` obligation per request: top-level `task_ref` alone is correlation
243
+ metadata, while a static class predicate deliberately shares one convergence
244
+ key across that class's chains. Omitted/null metadata inherits a configured or
245
+ obligation predicate; an explicit conflicting value refuses before minting.
231
246
 
232
247
  The following is the complete input schema. Unknown fields, duplicate mapping
233
248
  keys, YAML aliases/merge keys, object tags and files over 64 KiB are refused.
@@ -874,10 +889,19 @@ aac tenant reissue-api-key --profile prod
874
889
 
875
890
  ### Domains and workloads
876
891
 
877
- Every tenant gets a hosted trust domain from AAC; registration saves it in
878
- the profile, and `aac tenant assign-hosted-domain` assigns one to a tenant
879
- that has none yet. To use your own DNS domain as a trust domain instead,
880
- prove control of it with a DNS TXT record, then bind it:
892
+ Every tenant gets an AAC-assigned trust domain: the tenant id plus a suffix
893
+ the control plane selects for its environment,
894
+ `<tenant_id>.tenants.stage.cascadeauth.dev` on stage and
895
+ `<tenant_id>.tenants.cascadeauth.com` on production. No DNS record or proof
896
+ of ownership is needed; the first call allocates the name permanently and
897
+ every later call returns the same one, so use the name the command returns
898
+ rather than building it yourself. Registration saves it in the profile as
899
+ `hosted_trust_domain`. Signing in with `aac sso login` does not write it:
900
+ `aac tenant assign-hosted-domain` requests the same allocation and saves it
901
+ into the profile bound to that tenant, as `aac init` does during setup. To
902
+ use a custom domain you own as a trust domain instead, prove control of it
903
+ with a DNS TXT record, then bind it; a domain you own is recorded on the
904
+ server and never written to the profile:
881
905
 
882
906
  ```bash
883
907
  aac tenant issue-domain-challenge --profile prod --domain example.com
@@ -10,4 +10,4 @@ entrypoint (`aac_cli.cli:entrypoint`).
10
10
  # test in bin/tests/test_cli_version_parity.py. A literal keeps the
11
11
  # shipped code free of import-time metadata lookups (and their
12
12
  # not-installed failure mode).
13
- __version__ = "0.2.1"
13
+ __version__ = "0.2.2"
@@ -431,7 +431,8 @@ def _print_api_key_verification_guidance(
431
431
  """
432
432
  verification_url = f"{data_plane_url}/v1/trust-anchors"
433
433
  print(
434
- "\nVERIFY THIS API KEY NOW (API-key authentication only):\n"
434
+ "\nVERIFY THIS API KEY NOW: copy/paste and run ONE of the two commands below "
435
+ "(API-key authentication only):\n"
435
436
  f" aac trust-anchor list --tenant-id {tenant_id} "
436
437
  f"--profile {shlex.quote(profile)}\n\n"
437
438
  " { printf 'header = \"Authorization: Bearer '; \\\n"
@@ -1493,7 +1494,7 @@ def _print_staged_api_key_guidance(
1493
1494
  verification_url = f"{data_plane_url}/v1/trust-anchors"
1494
1495
  print(
1495
1496
  "\nSTAGED MIGRATION (the current profile credential is unchanged):\n"
1496
- f" 1. Verify the staged key from {staged_path}:\n"
1497
+ f" 1. Verify the staged key from {staged_path}: copy/paste and run\n"
1497
1498
  " { printf 'header = \"Authorization: Bearer '; \\\n"
1498
1499
  f" tr -d '\\n' < {shlex.quote(str(staged_path))}; \\\n"
1499
1500
  " printf '\"\\n'; } | \\\n"
@@ -4973,10 +4974,63 @@ def build_parser() -> argparse.ArgumentParser:
4973
4974
  for verb, reactivation in (("assign-hosted-domain", False), ("reactivate-hosted-domain", True)):
4974
4975
  hosted = tenant_verbs.add_parser(
4975
4976
  verb,
4977
+ formatter_class=argparse.RawDescriptionHelpFormatter,
4976
4978
  help=(
4977
- "Reactivate the existing assigned binding without changing tenant identity."
4979
+ "Reactivate the tenant's AAC-assigned trust domain after a revocation; "
4980
+ "the name does not change."
4978
4981
  if reactivation
4979
- else "Assign a hosted domain to an existing tenant; repeated calls reuse it."
4982
+ else "Request the AAC-assigned trust domain for your tenant and save it "
4983
+ "in the bound profile; repeated calls reuse it."
4984
+ ),
4985
+ epilog=(
4986
+ (
4987
+ "What this command does\n"
4988
+ "\n"
4989
+ " Reactivates your tenant's existing AAC-assigned trust domain after a\n"
4990
+ " revocation, when self-service reactivation is allowed or under the\n"
4991
+ " platform ceremony. On an active binding it changes nothing. It never\n"
4992
+ " allocates a new name, and it is not for a domain you own. The name is\n"
4993
+ " your tenant id plus a suffix the control plane selects for its\n"
4994
+ " environment. Use the name the command returns rather than building\n"
4995
+ " it yourself:\n"
4996
+ if reactivation
4997
+ else "What this command does\n"
4998
+ "\n"
4999
+ " Requests the AAC-assigned trust domain for your tenant. The name is your\n"
5000
+ " tenant id plus a suffix the control plane selects for its environment;\n"
5001
+ " no DNS record or proof of ownership is needed. The first call allocates\n"
5002
+ " the name permanently and every later call returns the same one. Use the\n"
5003
+ " name the command returns rather than building it yourself:\n"
5004
+ )
5005
+ + "\n"
5006
+ " on stage <tenant_id>.tenants.stage.cascadeauth.dev\n"
5007
+ " on production <tenant_id>.tenants.cascadeauth.com\n"
5008
+ "\n"
5009
+ "Where the domain is saved\n"
5010
+ "\n"
5011
+ " On success it is written into the selected profile as hosted_trust_domain,\n"
5012
+ " if that profile is bound to this tenant; a profile bound to another tenant\n"
5013
+ " is left unchanged. Signing in with `aac sso login` does not write it, so a\n"
5014
+ + (
5015
+ " profile bound that way has no such line until this command,\n"
5016
+ " `aac tenant assign-hosted-domain` or `aac init` runs. Replace main with\n"
5017
+ " your profile name:\n"
5018
+ if reactivation
5019
+ else " profile bound that way has no such line until this command or\n"
5020
+ " `aac init` runs. Replace main with your profile name:\n"
5021
+ )
5022
+ + "\n"
5023
+ f" aac tenant {verb} --profile main\n"
5024
+ " aac profile show main\n"
5025
+ "\n"
5026
+ "To use a custom domain you own instead\n"
5027
+ "\n"
5028
+ " Prove control of it with a DNS TXT record, then bind it. A domain you\n"
5029
+ " own is recorded on the server and never written to the profile:\n"
5030
+ "\n"
5031
+ " aac tenant issue-domain-challenge --profile main --domain example.com\n"
5032
+ " aac tenant verify-domain --profile main --domain example.com\n"
5033
+ " aac tenant bind-trust-domain --profile main --trust-domain example.com\n"
4980
5034
  ),
4981
5035
  )
4982
5036
  _add_common_flags(hosted)
@@ -71,7 +71,8 @@ def generated_header(
71
71
  + "# Apply changes with --agent-config PATH; refresh and renewal use saved values.\n"
72
72
  + "# Restart the sidecar after applying configuration or renewing certificates.\n"
73
73
  + "# Restrict /v1/agent/delegations and /v1/agent/mint-root to the authorized\n"
74
- + "# originating application at network/ingress until chain-start authentication ships.\n"
74
+ + "# originating application. Sidecar v0.4.0+ also requires pairing signatures;\n"
75
+ + "# older releases rely on the network/ingress restriction.\n"
75
76
  )
76
77
 
77
78
 
@@ -1861,8 +1861,9 @@ def add_init_parser(nouns: argparse._SubParsersAction) -> None:
1861
1861
  epilog=(
1862
1862
  "Pass --agent-config to explicitly apply tenant configuration; omit it on a "
1863
1863
  "rerun to refresh the last applied values. Restart the sidecar after applying. "
1864
- "Until chain-start authentication is available, restrict /v1/agent/delegations "
1865
- "and /v1/agent/mint-root to your authorized originating application at ingress."
1864
+ "Sidecar v0.4.0 and later require pairing signatures on /v1/agent/delegations "
1865
+ "and /v1/agent/mint-root. On older releases, restrict these routes to your "
1866
+ "authorized originating application at ingress."
1866
1867
  ),
1867
1868
  )
1868
1869
  init.add_argument(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aac-cli
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: The aac platform CLI — headless operator interface to the AAC control plane (tenant registration, chain audit).
5
5
  Author: Agent Authority Cloud Project
6
6
  License-Expression: Apache-2.0
@@ -242,9 +242,24 @@ peer identities are known. No self destination is added.
242
242
 
243
243
  **Chain-start boundary:** restrict `/v1/agent/delegations` and
244
244
  `/v1/agent/mint-root` to the authorized originating application at the
245
- network/ingress boundary. The current sidecar does not authenticate these callers;
246
- sharing a private network with peers is insufficient. Expose only intended
247
- receive/A2A routes to peers. Development certificates do not require `dev_mode`.
245
+ network/ingress boundary. Sidecar **v0.4.0 and later** also require the existing
246
+ pair's AAC1-HMAC-SHA256 signature over the exact alias and raw request body.
247
+ Older releases do not authenticate these callers, so sharing a private network
248
+ with peers is insufficient. An authorized separate originator may hold the pair
249
+ secret only inside the same trusted tenant-application boundary; it gains
250
+ callback-signing capability too. Never share secrets across pairs or tenants.
251
+ Pairing freshness is not idempotent chain creation; do not automatically retry
252
+ an uncertain mint. Development certificates do not require `dev_mode`.
253
+
254
+ Applications using v0.4.0 can supply per-request `obligations` for T1. Equal
255
+ configured/request values combine once; differing values refuse rather than
256
+ override or intersect. Put dynamic limits in the request instead of also
257
+ configuring a different class value. Native request `valid_until` is reserved;
258
+ remove it and use class `valid_for`. For signed correlation, normally supply a
259
+ `task_ref` obligation per request: top-level `task_ref` alone is correlation
260
+ metadata, while a static class predicate deliberately shares one convergence
261
+ key across that class's chains. Omitted/null metadata inherits a configured or
262
+ obligation predicate; an explicit conflicting value refuses before minting.
248
263
 
249
264
  The following is the complete input schema. Unknown fields, duplicate mapping
250
265
  keys, YAML aliases/merge keys, object tags and files over 64 KiB are refused.
@@ -891,10 +906,19 @@ aac tenant reissue-api-key --profile prod
891
906
 
892
907
  ### Domains and workloads
893
908
 
894
- Every tenant gets a hosted trust domain from AAC; registration saves it in
895
- the profile, and `aac tenant assign-hosted-domain` assigns one to a tenant
896
- that has none yet. To use your own DNS domain as a trust domain instead,
897
- prove control of it with a DNS TXT record, then bind it:
909
+ Every tenant gets an AAC-assigned trust domain: the tenant id plus a suffix
910
+ the control plane selects for its environment,
911
+ `<tenant_id>.tenants.stage.cascadeauth.dev` on stage and
912
+ `<tenant_id>.tenants.cascadeauth.com` on production. No DNS record or proof
913
+ of ownership is needed; the first call allocates the name permanently and
914
+ every later call returns the same one, so use the name the command returns
915
+ rather than building it yourself. Registration saves it in the profile as
916
+ `hosted_trust_domain`. Signing in with `aac sso login` does not write it:
917
+ `aac tenant assign-hosted-domain` requests the same allocation and saves it
918
+ into the profile bound to that tenant, as `aac init` does during setup. To
919
+ use a custom domain you own as a trust domain instead, prove control of it
920
+ with a DNS TXT record, then bind it; a domain you own is recorded on the
921
+ server and never written to the profile:
898
922
 
899
923
  ```bash
900
924
  aac tenant issue-domain-challenge --profile prod --domain example.com
@@ -32,7 +32,7 @@ build-backend = "setuptools.build_meta"
32
32
 
33
33
  [project]
34
34
  name = "aac-cli"
35
- version = "0.2.1"
35
+ version = "0.2.2"
36
36
  description = "The aac platform CLI — headless operator interface to the AAC control plane (tenant registration, chain audit)."
37
37
  readme = "README.md"
38
38
  requires-python = ">=3.10"
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