@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.
Files changed (90) hide show
  1. package/CHANGELOG.md +222 -1
  2. package/README.md +312 -12
  3. package/ROADMAP.md +88 -7
  4. package/SECURITY.md +78 -5
  5. package/SKILL.md +108 -1
  6. package/dist/archive.d.ts +2 -2
  7. package/dist/archive.js +2 -2
  8. package/dist/{bridge-service-hX1ZQp4W.d.ts → bridge-service-CNBKdYXh.d.ts} +2 -1
  9. package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-ByJ6CaJk.d.ts} +3 -0
  10. package/dist/bridge.d.ts +25 -8
  11. package/dist/bridge.js +19 -9
  12. package/dist/{chunk-MBPZXTJA.js → chunk-7VJI2MXI.js} +285 -42
  13. package/dist/chunk-7VJI2MXI.js.map +1 -0
  14. package/dist/{chunk-4VB44KJU.js → chunk-AWE3DFZV.js} +3 -2
  15. package/dist/chunk-AWE3DFZV.js.map +1 -0
  16. package/dist/{chunk-GADH244D.js → chunk-E4OWHGUE.js} +16 -5
  17. package/dist/chunk-E4OWHGUE.js.map +1 -0
  18. package/dist/{chunk-NCO7RLBM.js → chunk-GTK4KOED.js} +108 -8
  19. package/dist/chunk-GTK4KOED.js.map +1 -0
  20. package/dist/{chunk-SPSMZOCJ.js → chunk-HUHG7XTB.js} +6 -5
  21. package/dist/chunk-HUHG7XTB.js.map +1 -0
  22. package/dist/{chunk-5GMB3A77.js → chunk-IVG4XWWS.js} +26 -14
  23. package/dist/chunk-IVG4XWWS.js.map +1 -0
  24. package/dist/{chunk-WAI2IYIQ.js → chunk-P635FAN4.js} +50 -7
  25. package/dist/chunk-P635FAN4.js.map +1 -0
  26. package/dist/{chunk-45BZGB77.js → chunk-QNXHDOJ5.js} +218 -24
  27. package/dist/chunk-QNXHDOJ5.js.map +1 -0
  28. package/dist/{chunk-UAHMP6GC.js → chunk-QPC6JHA3.js} +10 -7
  29. package/dist/chunk-QPC6JHA3.js.map +1 -0
  30. package/dist/{chunk-Q6PPMXJC.js → chunk-SN7PIVDF.js} +377 -21
  31. package/dist/chunk-SN7PIVDF.js.map +1 -0
  32. package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
  33. package/dist/{chunk-2DFNOLMO.js → chunk-XDNT6ZNZ.js} +9 -6
  34. package/dist/chunk-XDNT6ZNZ.js.map +1 -0
  35. package/dist/{chunk-CEXBMOI5.js → chunk-Z6JP6MYD.js} +2 -2
  36. package/dist/cli.js +5867 -438
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client-runtime.d.ts +4 -2
  39. package/dist/client-runtime.js +7 -7
  40. package/dist/contracts/generate.js +1 -1
  41. package/dist/dr.d.ts +9 -2
  42. package/dist/dr.js +6 -4
  43. package/dist/{gateway-CggQ8vTC.d.ts → gateway-CW-61lvs.d.ts} +27 -3
  44. package/dist/gateway-main.js +71 -7
  45. package/dist/gateway-main.js.map +1 -1
  46. package/dist/gateway.d.ts +3 -3
  47. package/dist/gateway.js +3 -3
  48. package/dist/index.js +8 -8
  49. package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-C9KG9Z69.d.ts} +1 -1
  50. package/dist/postgres-production-preflight.d.ts +32 -0
  51. package/dist/postgres-production-preflight.js +249 -0
  52. package/dist/postgres-production-preflight.js.map +1 -0
  53. package/dist/server.js +8 -8
  54. package/dist/sqlite-edge-store-CdMIOrho.d.ts +148 -0
  55. package/dist/sqlite.d.ts +19 -80
  56. package/dist/sqlite.js +11 -3
  57. package/docs/architecture-v2.md +292 -15
  58. package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
  59. package/docs/deployment.md +349 -0
  60. package/docs/troubleshooting.md +23 -0
  61. package/llms.txt +69 -1
  62. package/openapi/agent-bridge-v2.openapi.json +1151 -124
  63. package/package.json +10 -2
  64. package/schemas/agent-bridge-v2.capabilities.json +26 -1
  65. package/schemas/agent-bridge-v2.mcp.json +11 -1
  66. package/schemas/agent-bridge-v2.schema.json +167 -0
  67. package/sql/migrations/007_runtime_role.sql +8 -4
  68. package/sql/migrations/013_row_isolation.sql +71 -8
  69. package/sql/migrations/014_owner_control_plane.sql +124 -31
  70. package/sql/migrations/015_portable_archives.sql +143 -41
  71. package/sql/migrations/016_native_dr_fence.sql +102 -35
  72. package/sql/migrations/017_gateway_authority_binding.sql +99 -0
  73. package/sql/migrations/018_endpoint_migration_challenges.sql +1054 -0
  74. package/sql/migrations/019_endpoint_migration_same_successor.sql +348 -0
  75. package/sql/migrations/020_managed_authority_compat.sql +698 -0
  76. package/sql/migrations/021_native_backup_reader.sql +421 -0
  77. package/sql/setup.sql +1 -3
  78. package/dist/chunk-2DFNOLMO.js.map +0 -1
  79. package/dist/chunk-45BZGB77.js.map +0 -1
  80. package/dist/chunk-4VB44KJU.js.map +0 -1
  81. package/dist/chunk-5GMB3A77.js.map +0 -1
  82. package/dist/chunk-GADH244D.js.map +0 -1
  83. package/dist/chunk-MBPZXTJA.js.map +0 -1
  84. package/dist/chunk-NCO7RLBM.js.map +0 -1
  85. package/dist/chunk-Q6PPMXJC.js.map +0 -1
  86. package/dist/chunk-SPSMZOCJ.js.map +0 -1
  87. package/dist/chunk-UAHMP6GC.js.map +0 -1
  88. package/dist/chunk-WAI2IYIQ.js.map +0 -1
  89. /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
  90. /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,membership.admin_option,
150
- coalesce((to_jsonb(membership)->>'inherit_option')::boolean,true) inherit_option,
151
- coalesce((to_jsonb(membership)->>'set_option')::boolean,true) set_option
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','true')||':'||
601
- coalesce(to_jsonb(membership)->>'set_option','true')
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','true')||':'||
697
- coalesce(to_jsonb(membership)->>'set_option','true')
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,true admin_option from names
787
- union all select names.archive_role,registry.member_role,false from active_registry registry cross join names
788
- ), actual_memberships as (
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.inherit_option or not membership.set_option)
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,true admin_option from names
905
- union all select names.operator_role,names.schema_owner,true from names
906
- union all select names.auditor_role,names.schema_owner,true from 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
- ), actual_memberships as (
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.inherit_option or not membership.set_option)
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;