@creatornader/agent-bridge 0.3.1 → 0.5.0
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/CHANGELOG.md +222 -1
- package/README.md +312 -12
- package/ROADMAP.md +88 -7
- package/SECURITY.md +78 -5
- package/SKILL.md +108 -1
- package/dist/archive.d.ts +2 -2
- package/dist/archive.js +2 -2
- package/dist/{bridge-service-hX1ZQp4W.d.ts → bridge-service-CNBKdYXh.d.ts} +2 -1
- package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-ByJ6CaJk.d.ts} +3 -0
- package/dist/bridge.d.ts +25 -8
- package/dist/bridge.js +19 -9
- package/dist/{chunk-MBPZXTJA.js → chunk-7VJI2MXI.js} +285 -42
- package/dist/chunk-7VJI2MXI.js.map +1 -0
- package/dist/{chunk-4VB44KJU.js → chunk-AWE3DFZV.js} +3 -2
- package/dist/chunk-AWE3DFZV.js.map +1 -0
- package/dist/{chunk-GADH244D.js → chunk-E4OWHGUE.js} +16 -5
- package/dist/chunk-E4OWHGUE.js.map +1 -0
- package/dist/{chunk-NCO7RLBM.js → chunk-GTK4KOED.js} +108 -8
- package/dist/chunk-GTK4KOED.js.map +1 -0
- package/dist/{chunk-SPSMZOCJ.js → chunk-HUHG7XTB.js} +6 -5
- package/dist/chunk-HUHG7XTB.js.map +1 -0
- package/dist/{chunk-5GMB3A77.js → chunk-IVG4XWWS.js} +26 -14
- package/dist/chunk-IVG4XWWS.js.map +1 -0
- package/dist/{chunk-WAI2IYIQ.js → chunk-P635FAN4.js} +50 -7
- package/dist/chunk-P635FAN4.js.map +1 -0
- package/dist/{chunk-45BZGB77.js → chunk-QNXHDOJ5.js} +218 -24
- package/dist/chunk-QNXHDOJ5.js.map +1 -0
- package/dist/{chunk-UAHMP6GC.js → chunk-QPC6JHA3.js} +10 -7
- package/dist/chunk-QPC6JHA3.js.map +1 -0
- package/dist/{chunk-Q6PPMXJC.js → chunk-SN7PIVDF.js} +377 -21
- package/dist/chunk-SN7PIVDF.js.map +1 -0
- package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
- package/dist/{chunk-2DFNOLMO.js → chunk-XDNT6ZNZ.js} +9 -6
- package/dist/chunk-XDNT6ZNZ.js.map +1 -0
- package/dist/{chunk-CEXBMOI5.js → chunk-Z6JP6MYD.js} +2 -2
- package/dist/cli.js +5867 -438
- package/dist/cli.js.map +1 -1
- package/dist/client-runtime.d.ts +4 -2
- package/dist/client-runtime.js +7 -7
- package/dist/contracts/generate.js +1 -1
- package/dist/dr.d.ts +9 -2
- package/dist/dr.js +6 -4
- package/dist/{gateway-CggQ8vTC.d.ts → gateway-CW-61lvs.d.ts} +27 -3
- package/dist/gateway-main.js +71 -7
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +3 -3
- package/dist/gateway.js +3 -3
- package/dist/index.js +8 -8
- package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-C9KG9Z69.d.ts} +1 -1
- package/dist/postgres-production-preflight.d.ts +32 -0
- package/dist/postgres-production-preflight.js +249 -0
- package/dist/postgres-production-preflight.js.map +1 -0
- package/dist/server.js +8 -8
- package/dist/sqlite-edge-store-CdMIOrho.d.ts +148 -0
- package/dist/sqlite.d.ts +19 -80
- package/dist/sqlite.js +11 -3
- package/docs/architecture-v2.md +292 -15
- package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
- package/docs/deployment.md +349 -0
- package/docs/troubleshooting.md +23 -0
- package/llms.txt +69 -1
- package/openapi/agent-bridge-v2.openapi.json +1151 -124
- package/package.json +10 -2
- package/schemas/agent-bridge-v2.capabilities.json +26 -1
- package/schemas/agent-bridge-v2.mcp.json +11 -1
- package/schemas/agent-bridge-v2.schema.json +167 -0
- package/sql/migrations/007_runtime_role.sql +8 -4
- package/sql/migrations/013_row_isolation.sql +71 -8
- package/sql/migrations/014_owner_control_plane.sql +124 -31
- package/sql/migrations/015_portable_archives.sql +143 -41
- package/sql/migrations/016_native_dr_fence.sql +102 -35
- package/sql/migrations/017_gateway_authority_binding.sql +99 -0
- package/sql/migrations/018_endpoint_migration_challenges.sql +1054 -0
- package/sql/migrations/019_endpoint_migration_same_successor.sql +348 -0
- package/sql/migrations/020_managed_authority_compat.sql +698 -0
- package/sql/migrations/021_native_backup_reader.sql +421 -0
- package/sql/setup.sql +1 -3
- package/dist/chunk-2DFNOLMO.js.map +0 -1
- package/dist/chunk-45BZGB77.js.map +0 -1
- package/dist/chunk-4VB44KJU.js.map +0 -1
- package/dist/chunk-5GMB3A77.js.map +0 -1
- package/dist/chunk-GADH244D.js.map +0 -1
- package/dist/chunk-MBPZXTJA.js.map +0 -1
- package/dist/chunk-NCO7RLBM.js.map +0 -1
- package/dist/chunk-Q6PPMXJC.js.map +0 -1
- package/dist/chunk-SPSMZOCJ.js.map +0 -1
- package/dist/chunk-UAHMP6GC.js.map +0 -1
- package/dist/chunk-WAI2IYIQ.js.map +0 -1
- /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
- /package/dist/{chunk-CEXBMOI5.js.map → chunk-Z6JP6MYD.js.map} +0 -0
|
@@ -146,23 +146,36 @@ begin
|
|
|
146
146
|
where event.member_role=session_user and event.control_role in ('operator','auditor')
|
|
147
147
|
order by event.control_role,event.sequence desc
|
|
148
148
|
), direct_membership as (
|
|
149
|
-
select granted.rolname control_role,
|
|
150
|
-
|
|
151
|
-
coalesce((to_jsonb(membership)->>'
|
|
149
|
+
select granted.rolname control_role,
|
|
150
|
+
bool_or(membership.admin_option) admin_option,
|
|
151
|
+
bool_or(coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)) inherit_option,
|
|
152
|
+
bool_or(coalesce((to_jsonb(membership)->>'set_option')::boolean,true)) set_option,
|
|
153
|
+
bool_and(case when member.rolname=schema_owner then
|
|
154
|
+
(membership.grantor=10 and membership.admin_option
|
|
155
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
156
|
+
=coalesce((to_jsonb(membership)->>'set_option')::boolean,true))
|
|
157
|
+
or (membership.grantor=member.oid
|
|
158
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
159
|
+
and coalesce((to_jsonb(membership)->>'set_option')::boolean,true))
|
|
160
|
+
else membership.grantor=(select oid from pg_catalog.pg_roles where rolname=schema_owner)
|
|
161
|
+
and not membership.admin_option
|
|
162
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
163
|
+
and coalesce((to_jsonb(membership)->>'set_option')::boolean,true) end) grants_valid
|
|
152
164
|
from pg_catalog.pg_auth_members membership
|
|
153
165
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
154
166
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
155
167
|
where member.rolname=session_user and granted.rolname in (operator_role,auditor_role)
|
|
168
|
+
group by granted.rolname
|
|
156
169
|
)
|
|
157
170
|
select
|
|
158
171
|
coalesce(bool_or(membership.control_role=operator_role
|
|
159
|
-
and membership.inherit_option and membership.set_option and (
|
|
172
|
+
and membership.inherit_option and membership.set_option and membership.grants_valid and (
|
|
160
173
|
(session_user=schema_owner and membership.admin_option)
|
|
161
174
|
or (latest.control_role='operator' and latest.action='register'
|
|
162
175
|
and not membership.admin_option)
|
|
163
176
|
)),false),
|
|
164
177
|
coalesce(bool_or(membership.control_role=auditor_role
|
|
165
|
-
and membership.inherit_option and membership.set_option and (
|
|
178
|
+
and membership.inherit_option and membership.set_option and membership.grants_valid and (
|
|
166
179
|
(session_user=schema_owner and membership.admin_option)
|
|
167
180
|
or (latest.control_role='auditor' and latest.action='register'
|
|
168
181
|
and not membership.admin_option)
|
|
@@ -379,16 +392,27 @@ begin
|
|
|
379
392
|
select event.action from agent_bridge.archive_membership_events event
|
|
380
393
|
where event.member_role=session_user order by event.sequence desc limit 1
|
|
381
394
|
), direct_membership as (
|
|
382
|
-
select membership.admin_option,
|
|
383
|
-
coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true) inherit_option,
|
|
384
|
-
coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option
|
|
395
|
+
select bool_or(membership.admin_option) admin_option,
|
|
396
|
+
bool_or(coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)) inherit_option,
|
|
397
|
+
bool_or(coalesce((to_jsonb(membership)->>'set_option')::boolean,true)) set_option,
|
|
398
|
+
bool_and(case when member.rolname=schema_owner then
|
|
399
|
+
(membership.grantor=10 and membership.admin_option
|
|
400
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
401
|
+
=coalesce((to_jsonb(membership)->>'set_option')::boolean,true))
|
|
402
|
+
or (membership.grantor=member.oid
|
|
403
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
404
|
+
and coalesce((to_jsonb(membership)->>'set_option')::boolean,true))
|
|
405
|
+
else membership.grantor=(select oid from pg_catalog.pg_roles where rolname=schema_owner)
|
|
406
|
+
and not membership.admin_option
|
|
407
|
+
and coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true)
|
|
408
|
+
and coalesce((to_jsonb(membership)->>'set_option')::boolean,true) end) grants_valid
|
|
385
409
|
from pg_catalog.pg_auth_members membership
|
|
386
410
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
387
411
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
388
412
|
where member.rolname=session_user and granted.rolname=archive_role
|
|
389
413
|
)
|
|
390
414
|
select coalesce(bool_or(
|
|
391
|
-
membership.inherit_option and membership.set_option and (
|
|
415
|
+
membership.inherit_option and membership.set_option and membership.grants_valid and (
|
|
392
416
|
(session_user=schema_owner and membership.admin_option)
|
|
393
417
|
or (latest.action='register' and not membership.admin_option)
|
|
394
418
|
)
|
|
@@ -596,14 +620,15 @@ returns text language sql stable set search_path = '' as $$
|
|
|
596
620
|
)
|
|
597
621
|
union all
|
|
598
622
|
select 'membership',granted.rolname||'->'||member.rolname,
|
|
599
|
-
membership.admin_option::text||':'||
|
|
600
|
-
coalesce(to_jsonb(membership)->>'inherit_option',
|
|
601
|
-
coalesce(to_jsonb(membership)->>'set_option',
|
|
623
|
+
bool_or(membership.admin_option)::text||':'||
|
|
624
|
+
bool_or(coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true))::text||':'||
|
|
625
|
+
bool_or(coalesce((to_jsonb(membership)->>'set_option')::boolean,true))::text
|
|
602
626
|
from pg_catalog.pg_auth_members membership
|
|
603
627
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
604
628
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
605
629
|
where member.rolname in (select role_name from control_roles)
|
|
606
630
|
or granted.rolname=(select owner_role from names)
|
|
631
|
+
group by granted.rolname,member.rolname
|
|
607
632
|
union all
|
|
608
633
|
select 'relation_acl',relation.oid::regclass::text,
|
|
609
634
|
pg_catalog.pg_get_userbyid(privilege.grantor)||':'||
|
|
@@ -692,14 +717,15 @@ returns text language sql stable set search_path = '' as $$
|
|
|
692
717
|
)
|
|
693
718
|
union all
|
|
694
719
|
select 'owner_membership',granted.rolname||'->'||member.rolname,
|
|
695
|
-
membership.admin_option::text||':'||
|
|
696
|
-
coalesce(to_jsonb(membership)->>'inherit_option',
|
|
697
|
-
coalesce(to_jsonb(membership)->>'set_option',
|
|
720
|
+
bool_or(membership.admin_option)::text||':'||
|
|
721
|
+
bool_or(coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true))::text||':'||
|
|
722
|
+
bool_or(coalesce((to_jsonb(membership)->>'set_option')::boolean,true))::text
|
|
698
723
|
from pg_catalog.pg_auth_members membership
|
|
699
724
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
700
725
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
701
726
|
where granted.rolname=(select archive_role from names)
|
|
702
727
|
and member.oid=(select schema_owner from names)
|
|
728
|
+
group by granted.rolname,member.rolname
|
|
703
729
|
union all
|
|
704
730
|
select 'relation_acl',relation.oid::regclass::text,
|
|
705
731
|
pg_catalog.pg_get_userbyid(privilege.grantor)||':'||
|
|
@@ -764,10 +790,12 @@ do $ownership$
|
|
|
764
790
|
declare
|
|
765
791
|
owner_role text := 'agent_bridge_control_owner_'||substr(md5(current_database()),1,16);
|
|
766
792
|
begin
|
|
793
|
+
execute format('grant create on schema agent_bridge to %I',owner_role);
|
|
767
794
|
execute format(
|
|
768
795
|
'alter function agent_bridge.owner_control_attestation_definition() owner to %I',
|
|
769
796
|
owner_role
|
|
770
797
|
);
|
|
798
|
+
execute format('revoke create on schema agent_bridge from %I',owner_role);
|
|
771
799
|
end
|
|
772
800
|
$ownership$;
|
|
773
801
|
|
|
@@ -783,17 +811,35 @@ returns boolean language sql stable security definer set search_path = '' as $$
|
|
|
783
811
|
), active_registry as (
|
|
784
812
|
select member_role from latest_registry where action='register'
|
|
785
813
|
), expected_memberships as (
|
|
786
|
-
select names.archive_role granted_role,names.schema_owner member_role,
|
|
787
|
-
|
|
788
|
-
|
|
814
|
+
select names.archive_role granted_role,names.schema_owner member_role,
|
|
815
|
+
true admin_option,true inherit_option,true set_option from names
|
|
816
|
+
union all select names.archive_role,registry.member_role,false,true,true
|
|
817
|
+
from active_registry registry cross join names
|
|
818
|
+
), raw_memberships as (
|
|
789
819
|
select granted.rolname::name granted_role,member.rolname::name member_role,
|
|
790
820
|
membership.admin_option,
|
|
791
821
|
coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true) inherit_option,
|
|
792
|
-
coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option
|
|
822
|
+
coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option,
|
|
823
|
+
membership.grantor,member.oid member_oid
|
|
793
824
|
from pg_catalog.pg_auth_members membership
|
|
794
825
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
795
826
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
796
827
|
where granted.rolname=(select archive_role from names)
|
|
828
|
+
), actual_memberships as (
|
|
829
|
+
select membership.granted_role,membership.member_role,
|
|
830
|
+
bool_or(membership.admin_option) admin_option,
|
|
831
|
+
bool_or(membership.inherit_option) inherit_option,
|
|
832
|
+
bool_or(membership.set_option) set_option,
|
|
833
|
+
bool_and(case when membership.member_role=names.schema_owner then
|
|
834
|
+
(membership.grantor=10 and membership.admin_option
|
|
835
|
+
and membership.inherit_option=membership.set_option)
|
|
836
|
+
or (membership.grantor=membership.member_oid
|
|
837
|
+
and membership.inherit_option and membership.set_option)
|
|
838
|
+
else membership.grantor=(select oid from pg_catalog.pg_roles where rolname=names.schema_owner)
|
|
839
|
+
and not membership.admin_option
|
|
840
|
+
and membership.inherit_option and membership.set_option end) grants_valid
|
|
841
|
+
from raw_memberships membership cross join names
|
|
842
|
+
group by membership.granted_role,membership.member_role
|
|
797
843
|
)
|
|
798
844
|
select current_setting('server_version_num')::integer/10000=any(array[15,16,17,18])
|
|
799
845
|
and exists(select 1 from pg_catalog.pg_roles role,names where role.rolname=names.archive_role
|
|
@@ -804,14 +850,14 @@ returns boolean language sql stable security definer set search_path = '' as $$
|
|
|
804
850
|
) from agent_bridge.portable_archive_attestations attestation
|
|
805
851
|
where attestation.name='portable-archive-v3')
|
|
806
852
|
and not exists(
|
|
807
|
-
(select granted_role,member_role,admin_option from actual_memberships
|
|
808
|
-
except select granted_role,member_role,admin_option from expected_memberships)
|
|
853
|
+
(select granted_role,member_role,admin_option,inherit_option,set_option from actual_memberships
|
|
854
|
+
except select granted_role,member_role,admin_option,inherit_option,set_option from expected_memberships)
|
|
809
855
|
union all
|
|
810
|
-
(select granted_role,member_role,admin_option from expected_memberships
|
|
811
|
-
except select granted_role,member_role,admin_option from actual_memberships)
|
|
856
|
+
(select granted_role,member_role,admin_option,inherit_option,set_option from expected_memberships
|
|
857
|
+
except select granted_role,member_role,admin_option,inherit_option,set_option from actual_memberships)
|
|
812
858
|
)
|
|
813
859
|
and not exists(select 1 from actual_memberships membership
|
|
814
|
-
where not membership.
|
|
860
|
+
where not membership.grants_valid)
|
|
815
861
|
and not exists(select 1 from active_registry registry
|
|
816
862
|
left join pg_catalog.pg_roles role on role.rolname=registry.member_role
|
|
817
863
|
where role.oid is null or not role.rolcanlogin or role.rolsuper or role.rolcreaterole
|
|
@@ -901,24 +947,41 @@ returns boolean language sql stable security definer set search_path = '' as $$
|
|
|
901
947
|
), active_registry as (
|
|
902
948
|
select member_role,control_role from latest_registry where action='register'
|
|
903
949
|
), expected_memberships as (
|
|
904
|
-
select names.owner_role granted_role,names.schema_owner member_role,
|
|
905
|
-
|
|
906
|
-
union all select names.
|
|
950
|
+
select names.owner_role granted_role,names.schema_owner member_role,
|
|
951
|
+
true admin_option,true inherit_option,true set_option from names
|
|
952
|
+
union all select names.operator_role,names.schema_owner,true,true,true from names
|
|
953
|
+
union all select names.auditor_role,names.schema_owner,true,true,true from names
|
|
907
954
|
union all
|
|
908
955
|
select case registry.control_role when 'operator' then names.operator_role
|
|
909
|
-
else names.auditor_role end,registry.member_role,false
|
|
956
|
+
else names.auditor_role end,registry.member_role,false,true,true
|
|
910
957
|
from active_registry registry cross join names
|
|
911
|
-
),
|
|
958
|
+
), raw_memberships as (
|
|
912
959
|
select granted.rolname::name granted_role,member.rolname::name member_role,
|
|
913
960
|
membership.admin_option,
|
|
914
961
|
coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true) inherit_option,
|
|
915
|
-
coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option
|
|
962
|
+
coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option,
|
|
963
|
+
membership.grantor,member.oid member_oid
|
|
916
964
|
from pg_catalog.pg_auth_members membership
|
|
917
965
|
join pg_catalog.pg_roles granted on granted.oid=membership.roleid
|
|
918
966
|
join pg_catalog.pg_roles member on member.oid=membership.member
|
|
919
967
|
where granted.rolname in (
|
|
920
968
|
(select owner_role from names),(select operator_role from names),(select auditor_role from names)
|
|
921
969
|
)
|
|
970
|
+
), actual_memberships as (
|
|
971
|
+
select membership.granted_role,membership.member_role,
|
|
972
|
+
bool_or(membership.admin_option) admin_option,
|
|
973
|
+
bool_or(membership.inherit_option) inherit_option,
|
|
974
|
+
bool_or(membership.set_option) set_option,
|
|
975
|
+
bool_and(case when membership.member_role=names.schema_owner then
|
|
976
|
+
(membership.grantor=10 and membership.admin_option
|
|
977
|
+
and membership.inherit_option=membership.set_option)
|
|
978
|
+
or (membership.grantor=membership.member_oid
|
|
979
|
+
and membership.inherit_option and membership.set_option)
|
|
980
|
+
else membership.grantor=(select oid from pg_catalog.pg_roles where rolname=names.schema_owner)
|
|
981
|
+
and not membership.admin_option
|
|
982
|
+
and membership.inherit_option and membership.set_option end) grants_valid
|
|
983
|
+
from raw_memberships membership cross join names
|
|
984
|
+
group by membership.granted_role,membership.member_role
|
|
922
985
|
), authority_closure as (
|
|
923
986
|
select control_role.granted_role,candidate.rolname::name member_role
|
|
924
987
|
from names
|
|
@@ -937,14 +1000,14 @@ returns boolean language sql stable security definer set search_path = '' as $$
|
|
|
937
1000
|
) from agent_bridge.owner_control_attestations attestation
|
|
938
1001
|
where attestation.name='owner-control-v4')
|
|
939
1002
|
and not exists (
|
|
940
|
-
(select granted_role,member_role,admin_option from actual_memberships
|
|
941
|
-
except select granted_role,member_role,admin_option from expected_memberships)
|
|
1003
|
+
(select granted_role,member_role,admin_option,inherit_option,set_option from actual_memberships
|
|
1004
|
+
except select granted_role,member_role,admin_option,inherit_option,set_option from expected_memberships)
|
|
942
1005
|
union all
|
|
943
|
-
(select granted_role,member_role,admin_option from expected_memberships
|
|
944
|
-
except select granted_role,member_role,admin_option from actual_memberships)
|
|
1006
|
+
(select granted_role,member_role,admin_option,inherit_option,set_option from expected_memberships
|
|
1007
|
+
except select granted_role,member_role,admin_option,inherit_option,set_option from actual_memberships)
|
|
945
1008
|
)
|
|
946
1009
|
and not exists (select 1 from actual_memberships membership
|
|
947
|
-
where not membership.
|
|
1010
|
+
where not membership.grants_valid)
|
|
948
1011
|
and not exists (
|
|
949
1012
|
select 1 from active_registry registry
|
|
950
1013
|
left join pg_catalog.pg_roles role_record on role_record.rolname=registry.member_role
|
|
@@ -981,8 +1044,12 @@ returns boolean language sql stable security definer set search_path = '' as $$
|
|
|
981
1044
|
)
|
|
982
1045
|
$$;
|
|
983
1046
|
|
|
1047
|
+
select set_config(
|
|
1048
|
+
'role','agent_bridge_control_owner_'||substr(md5(current_database()),1,16),false
|
|
1049
|
+
);
|
|
984
1050
|
insert into agent_bridge.owner_control_attestations(name,catalog_definition)
|
|
985
1051
|
values('owner-control-v4',agent_bridge.owner_control_attestation_definition());
|
|
1052
|
+
reset role;
|
|
986
1053
|
|
|
987
1054
|
insert into agent_bridge.portable_archive_attestations(name,catalog_definition)
|
|
988
1055
|
values('portable-archive-v3',agent_bridge.portable_archive_attestation_definition());
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
begin;
|
|
2
|
+
|
|
3
|
+
select pg_advisory_xact_lock(1646705660);
|
|
4
|
+
|
|
5
|
+
create table agent_bridge.gateway_authority (
|
|
6
|
+
singleton boolean not null default true,
|
|
7
|
+
authority_id uuid not null default gen_random_uuid(),
|
|
8
|
+
constraint gateway_authority_singleton primary key (singleton),
|
|
9
|
+
constraint gateway_authority_singleton_true check (singleton),
|
|
10
|
+
constraint gateway_authority_id_unique unique (authority_id)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
insert into agent_bridge.gateway_authority(singleton) values (true);
|
|
14
|
+
|
|
15
|
+
create function agent_bridge.reject_gateway_authority_mutation()
|
|
16
|
+
returns trigger
|
|
17
|
+
language plpgsql set search_path = '' as $$
|
|
18
|
+
begin
|
|
19
|
+
raise exception 'gateway authority is immutable';
|
|
20
|
+
end
|
|
21
|
+
$$;
|
|
22
|
+
|
|
23
|
+
create trigger gateway_authority_immutable
|
|
24
|
+
before update or delete or truncate on agent_bridge.gateway_authority
|
|
25
|
+
for each statement execute function agent_bridge.reject_gateway_authority_mutation();
|
|
26
|
+
|
|
27
|
+
create function agent_bridge.gateway_authority_ready()
|
|
28
|
+
returns boolean
|
|
29
|
+
language sql stable security definer set search_path = '' as $$
|
|
30
|
+
select count(*)=1 and bool_and(singleton and authority_id is not null)
|
|
31
|
+
from agent_bridge.gateway_authority
|
|
32
|
+
$$;
|
|
33
|
+
|
|
34
|
+
create function agent_bridge.open_request_authority_bound(
|
|
35
|
+
requested_credential_id uuid,
|
|
36
|
+
credential_hash text,
|
|
37
|
+
requested_request_id uuid
|
|
38
|
+
) returns table(
|
|
39
|
+
gateway_authority_id uuid,
|
|
40
|
+
credential_id uuid,
|
|
41
|
+
workspace_id text,
|
|
42
|
+
principal text,
|
|
43
|
+
scopes text[]
|
|
44
|
+
)
|
|
45
|
+
language plpgsql volatile security definer set search_path = '' as $$
|
|
46
|
+
declare
|
|
47
|
+
bound_gateway_authority_id uuid;
|
|
48
|
+
authority_credential_id uuid;
|
|
49
|
+
authority_workspace_id text;
|
|
50
|
+
authority_principal text;
|
|
51
|
+
authority_scopes text[];
|
|
52
|
+
begin
|
|
53
|
+
select authority_id into strict bound_gateway_authority_id
|
|
54
|
+
from agent_bridge.gateway_authority
|
|
55
|
+
where singleton;
|
|
56
|
+
|
|
57
|
+
select authority.credential_id,authority.workspace_id,authority.principal,authority.scopes
|
|
58
|
+
into authority_credential_id,authority_workspace_id,authority_principal,authority_scopes
|
|
59
|
+
from agent_bridge.open_request_authority(
|
|
60
|
+
requested_credential_id,credential_hash,requested_request_id
|
|
61
|
+
) authority;
|
|
62
|
+
|
|
63
|
+
if not found then return; end if;
|
|
64
|
+
|
|
65
|
+
gateway_authority_id := bound_gateway_authority_id;
|
|
66
|
+
credential_id := authority_credential_id;
|
|
67
|
+
workspace_id := authority_workspace_id;
|
|
68
|
+
principal := authority_principal;
|
|
69
|
+
scopes := authority_scopes;
|
|
70
|
+
return next;
|
|
71
|
+
end
|
|
72
|
+
$$;
|
|
73
|
+
|
|
74
|
+
revoke all on agent_bridge.gateway_authority from public;
|
|
75
|
+
revoke all on function agent_bridge.reject_gateway_authority_mutation() from public;
|
|
76
|
+
revoke all on function agent_bridge.gateway_authority_ready() from public;
|
|
77
|
+
revoke all on function agent_bridge.open_request_authority_bound(uuid,text,uuid) from public;
|
|
78
|
+
|
|
79
|
+
do $roles$
|
|
80
|
+
declare
|
|
81
|
+
runtime_role text := 'agent_bridge_runtime_' || substr(md5(current_database()),1,16);
|
|
82
|
+
role_name text;
|
|
83
|
+
begin
|
|
84
|
+
foreach role_name in array array[runtime_role,'anon','authenticated'] loop
|
|
85
|
+
if exists (select 1 from pg_roles where rolname=role_name) then
|
|
86
|
+
execute format('revoke all on agent_bridge.gateway_authority from %I',role_name);
|
|
87
|
+
execute format('revoke all on function agent_bridge.gateway_authority_ready() from %I',role_name);
|
|
88
|
+
execute format('revoke all on function agent_bridge.open_request_authority_bound(uuid,text,uuid) from %I',role_name);
|
|
89
|
+
end if;
|
|
90
|
+
end loop;
|
|
91
|
+
execute format('grant execute on function agent_bridge.gateway_authority_ready() to %I',runtime_role);
|
|
92
|
+
execute format('grant execute on function agent_bridge.open_request_authority_bound(uuid,text,uuid) to %I',runtime_role);
|
|
93
|
+
end
|
|
94
|
+
$roles$;
|
|
95
|
+
|
|
96
|
+
insert into agent_bridge.schema_migrations(version,name,checksum)
|
|
97
|
+
values (17,'gateway_authority_binding','__AGENT_BRIDGE_MIGRATION_CHECKSUM__');
|
|
98
|
+
|
|
99
|
+
commit;
|