@creatornader/agent-bridge 0.2.0 → 0.3.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 +63 -1
- package/README.md +467 -29
- package/ROADMAP.md +104 -0
- package/SECURITY.md +73 -0
- package/SKILL.md +68 -2
- package/bin/agent-bridge +2 -2
- package/clients/claude-desktop.json +3 -1
- package/dist/archive.d.ts +163 -0
- package/dist/archive.js +50 -0
- package/dist/archive.js.map +1 -0
- package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
- package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
- package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
- package/dist/bridge.d.ts +76 -17
- package/dist/bridge.js +52 -24
- package/dist/chunk-2DFNOLMO.js +618 -0
- package/dist/chunk-2DFNOLMO.js.map +1 -0
- package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
- package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
- package/dist/chunk-45BZGB77.js +709 -0
- package/dist/chunk-45BZGB77.js.map +1 -0
- package/dist/chunk-4VB44KJU.js +230 -0
- package/dist/chunk-4VB44KJU.js.map +1 -0
- package/dist/chunk-5GMB3A77.js +1013 -0
- package/dist/chunk-5GMB3A77.js.map +1 -0
- package/dist/chunk-A6W4QALF.js +1258 -0
- package/dist/chunk-A6W4QALF.js.map +1 -0
- package/dist/chunk-BZLMF5O5.js +328 -0
- package/dist/chunk-BZLMF5O5.js.map +1 -0
- package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
- package/dist/chunk-CEXBMOI5.js.map +1 -0
- package/dist/chunk-GADH244D.js +527 -0
- package/dist/chunk-GADH244D.js.map +1 -0
- package/dist/chunk-MBPZXTJA.js +2428 -0
- package/dist/chunk-MBPZXTJA.js.map +1 -0
- package/dist/chunk-NCO7RLBM.js +146 -0
- package/dist/chunk-NCO7RLBM.js.map +1 -0
- package/dist/chunk-Q6PPMXJC.js +1050 -0
- package/dist/chunk-Q6PPMXJC.js.map +1 -0
- package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
- package/dist/chunk-SPSMZOCJ.js.map +1 -0
- package/dist/chunk-UAHMP6GC.js +54 -0
- package/dist/chunk-UAHMP6GC.js.map +1 -0
- package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
- package/dist/chunk-VOQIDTCJ.js.map +1 -0
- package/dist/chunk-WAI2IYIQ.js +554 -0
- package/dist/chunk-WAI2IYIQ.js.map +1 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +3577 -250
- package/dist/cli.js.map +1 -1
- package/dist/client-config.d.ts +1 -1
- package/dist/client-config.js +1 -1
- package/dist/client-runtime.d.ts +10 -6
- package/dist/client-runtime.js +9 -6
- package/dist/contracts/generate.d.ts +2 -0
- package/dist/contracts/generate.js +247 -0
- package/dist/contracts/generate.js.map +1 -0
- package/dist/dr.d.ts +324 -0
- package/dist/dr.js +124 -0
- package/dist/dr.js.map +1 -0
- package/dist/gateway-CggQ8vTC.d.ts +78 -0
- package/dist/gateway-main.js +190 -8
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +4 -3
- package/dist/gateway.js +4 -3
- package/dist/index.js +11 -8
- package/dist/index.js.map +1 -1
- package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
- package/dist/server.d.ts +3 -2
- package/dist/server.js +13 -8
- package/dist/sqlite.d.ts +94 -12
- package/dist/sqlite.js +7 -4
- package/docs/architecture-v2.md +375 -0
- package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
- package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
- package/docs/ecosystem.md +54 -0
- package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
- package/docs/troubleshooting.md +89 -0
- package/llms.txt +96 -4
- package/openapi/agent-bridge-v2.openapi.json +9610 -0
- package/package.json +24 -4
- package/schemas/agent-bridge-v2.capabilities.json +1829 -0
- package/schemas/agent-bridge-v2.mcp.json +2074 -0
- package/schemas/agent-bridge-v2.schema.json +4560 -0
- package/sql/migrations/008_message_projects.sql +36 -0
- package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
- package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
- package/sql/migrations/011_credential_security.sql +875 -0
- package/sql/migrations/012_request_authority.sql +177 -0
- package/sql/migrations/013_row_isolation.sql +495 -0
- package/sql/migrations/014_owner_control_plane.sql +1641 -0
- package/sql/migrations/015_portable_archives.sql +1813 -0
- package/sql/migrations/016_native_dr_fence.sql +1005 -0
- package/bin/CLAUDE.md +0 -11
- package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
- package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
- package/dist/chunk-4KAOBC5X.js.map +0 -1
- package/dist/chunk-6MAZ6YLZ.js +0 -146
- package/dist/chunk-6MAZ6YLZ.js.map +0 -1
- package/dist/chunk-AXL2I7FH.js.map +0 -1
- package/dist/chunk-BV6W4AJK.js +0 -211
- package/dist/chunk-BV6W4AJK.js.map +0 -1
- package/dist/chunk-CKSKUBDQ.js +0 -153
- package/dist/chunk-CKSKUBDQ.js.map +0 -1
- package/dist/chunk-JOUBDRYX.js +0 -272
- package/dist/chunk-JOUBDRYX.js.map +0 -1
- package/dist/chunk-JTC5YURG.js +0 -49
- package/dist/chunk-JTC5YURG.js.map +0 -1
- package/dist/chunk-O26W5QHS.js +0 -409
- package/dist/chunk-O26W5QHS.js.map +0 -1
- package/dist/chunk-WEULPMUY.js +0 -988
- package/dist/chunk-WEULPMUY.js.map +0 -1
- package/dist/chunk-YD6YJATN.js.map +0 -1
- package/dist/gateway-BULozv3K.d.ts +0 -54
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
begin;
|
|
2
|
+
|
|
3
|
+
select pg_advisory_xact_lock(1646705660);
|
|
4
|
+
|
|
5
|
+
alter table agent_bridge.messages add column if not exists project text;
|
|
6
|
+
alter table agent_bridge.messages drop constraint if exists messages_project_label;
|
|
7
|
+
alter table agent_bridge.messages add constraint messages_project_label
|
|
8
|
+
check (
|
|
9
|
+
project is null or (
|
|
10
|
+
project = btrim(project)
|
|
11
|
+
and char_length(project) between 1 and 128
|
|
12
|
+
)
|
|
13
|
+
);
|
|
14
|
+
create index if not exists messages_project
|
|
15
|
+
on agent_bridge.messages(workspace, project, sequence)
|
|
16
|
+
where project is not null;
|
|
17
|
+
|
|
18
|
+
insert into agent_bridge.schema_migrations (version, name, checksum)
|
|
19
|
+
values (8, 'message_projects', '__AGENT_BRIDGE_MIGRATION_CHECKSUM__')
|
|
20
|
+
on conflict (version) do update set applied_at=agent_bridge.schema_migrations.applied_at
|
|
21
|
+
where agent_bridge.schema_migrations.name=excluded.name
|
|
22
|
+
and agent_bridge.schema_migrations.checksum=excluded.checksum;
|
|
23
|
+
|
|
24
|
+
do $migration$
|
|
25
|
+
begin
|
|
26
|
+
if not exists (
|
|
27
|
+
select 1 from agent_bridge.schema_migrations
|
|
28
|
+
where version=8 and name='message_projects'
|
|
29
|
+
and checksum='__AGENT_BRIDGE_MIGRATION_CHECKSUM__'
|
|
30
|
+
) then
|
|
31
|
+
raise exception 'migration 8_message_projects conflicts with recorded schema state';
|
|
32
|
+
end if;
|
|
33
|
+
end
|
|
34
|
+
$migration$;
|
|
35
|
+
|
|
36
|
+
commit;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
begin;
|
|
2
|
+
|
|
3
|
+
select pg_advisory_xact_lock(1646705660);
|
|
4
|
+
|
|
5
|
+
-- Inbox/all visibility uses jsonb's key-existence operator. The existing
|
|
6
|
+
-- workspace/source/sequence indexes already cover sent history.
|
|
7
|
+
create index if not exists messages_targets_gin
|
|
8
|
+
on agent_bridge.messages using gin (targets);
|
|
9
|
+
|
|
10
|
+
insert into agent_bridge.schema_migrations (version, name, checksum)
|
|
11
|
+
values (9, 'mailbox_query_indexes', '__AGENT_BRIDGE_MIGRATION_CHECKSUM__')
|
|
12
|
+
on conflict (version) do update set applied_at=agent_bridge.schema_migrations.applied_at
|
|
13
|
+
where agent_bridge.schema_migrations.name=excluded.name
|
|
14
|
+
and agent_bridge.schema_migrations.checksum=excluded.checksum;
|
|
15
|
+
|
|
16
|
+
do $migration$
|
|
17
|
+
begin
|
|
18
|
+
if not exists (
|
|
19
|
+
select 1 from agent_bridge.schema_migrations
|
|
20
|
+
where version=9 and name='mailbox_query_indexes'
|
|
21
|
+
and checksum='__AGENT_BRIDGE_MIGRATION_CHECKSUM__'
|
|
22
|
+
) then
|
|
23
|
+
raise exception 'migration 9_mailbox_query_indexes conflicts with recorded schema state';
|
|
24
|
+
end if;
|
|
25
|
+
end
|
|
26
|
+
$migration$;
|
|
27
|
+
|
|
28
|
+
commit;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
begin;
|
|
2
|
+
|
|
3
|
+
select pg_advisory_xact_lock(1646705660);
|
|
4
|
+
|
|
5
|
+
drop trigger if exists messages_immutable on agent_bridge.messages;
|
|
6
|
+
|
|
7
|
+
alter table agent_bridge.messages
|
|
8
|
+
add column if not exists delivery_mode text,
|
|
9
|
+
add column if not exists delivery_max_attempts integer,
|
|
10
|
+
add column if not exists delivery_retry_base_delay_ms integer,
|
|
11
|
+
add column if not exists delivery_retry_max_delay_ms integer,
|
|
12
|
+
add column if not exists delivery_retry_jitter_ratio double precision,
|
|
13
|
+
add column if not exists delivery_not_before timestamptz;
|
|
14
|
+
|
|
15
|
+
update agent_bridge.messages
|
|
16
|
+
set delivery_mode = case when jsonb_array_length(targets) = 0 then 'mailbox' else 'leased' end,
|
|
17
|
+
delivery_max_attempts = case when jsonb_array_length(targets) = 0 then null else 5 end,
|
|
18
|
+
delivery_retry_base_delay_ms = case when jsonb_array_length(targets) = 0 then null else 1000 end,
|
|
19
|
+
delivery_retry_max_delay_ms = case when jsonb_array_length(targets) = 0 then null else 60000 end,
|
|
20
|
+
delivery_retry_jitter_ratio = case when jsonb_array_length(targets) = 0 then null else 0.2 end
|
|
21
|
+
where delivery_mode is null;
|
|
22
|
+
|
|
23
|
+
alter table agent_bridge.messages alter column delivery_mode set not null;
|
|
24
|
+
alter table agent_bridge.messages drop constraint if exists messages_delivery_policy_valid;
|
|
25
|
+
alter table agent_bridge.messages add constraint messages_delivery_policy_valid check (
|
|
26
|
+
(delivery_mode = 'mailbox'
|
|
27
|
+
and delivery_max_attempts is null
|
|
28
|
+
and delivery_retry_base_delay_ms is null
|
|
29
|
+
and delivery_retry_max_delay_ms is null
|
|
30
|
+
and delivery_retry_jitter_ratio is null
|
|
31
|
+
and delivery_not_before is null)
|
|
32
|
+
or
|
|
33
|
+
(delivery_mode = 'leased'
|
|
34
|
+
and jsonb_array_length(targets) > 0
|
|
35
|
+
and delivery_max_attempts between 1 and 100
|
|
36
|
+
and delivery_retry_base_delay_ms between 1 and 3600000
|
|
37
|
+
and delivery_retry_max_delay_ms between delivery_retry_base_delay_ms and 86400000
|
|
38
|
+
and delivery_retry_jitter_ratio between 0 and 1
|
|
39
|
+
and (delivery_not_before is null or expires_at is null or delivery_not_before < expires_at))
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
create trigger messages_immutable before update or delete on agent_bridge.messages
|
|
43
|
+
for each row execute function agent_bridge.reject_message_mutation();
|
|
44
|
+
|
|
45
|
+
alter table agent_bridge.deliveries drop constraint if exists deliveries_state_check;
|
|
46
|
+
alter table agent_bridge.deliveries add constraint deliveries_state_check
|
|
47
|
+
check (state in ('pending','claimed','acked','retrying','dead','cancelled'));
|
|
48
|
+
alter table agent_bridge.deliveries
|
|
49
|
+
add column if not exists created_at timestamptz not null default now(),
|
|
50
|
+
add column if not exists priority_rank smallint not null default 2,
|
|
51
|
+
add column if not exists cycle_attempt integer,
|
|
52
|
+
add column if not exists requeue_count integer not null default 0,
|
|
53
|
+
add column if not exists last_actor text,
|
|
54
|
+
add column if not exists last_action text;
|
|
55
|
+
|
|
56
|
+
update agent_bridge.deliveries delivery
|
|
57
|
+
set created_at = message.created_at,
|
|
58
|
+
priority_rank = case message.priority when 'urgent' then 0 when 'high' then 1 else 2 end,
|
|
59
|
+
cycle_attempt = coalesce(delivery.cycle_attempt, delivery.attempt),
|
|
60
|
+
last_actor = coalesce(delivery.last_actor, case
|
|
61
|
+
when delivery.state='pending' and delivery.attempt=0 then message.source
|
|
62
|
+
when delivery.state='dead' and delivery.last_error in ('message expired','maximum attempts reached') then 'agent-bridge'
|
|
63
|
+
else coalesce(
|
|
64
|
+
delivery.lease_owner,
|
|
65
|
+
(select event.lease_owner from agent_bridge.delivery_events event
|
|
66
|
+
where event.delivery_id=delivery.id and event.lease_owner is not null
|
|
67
|
+
and event.to_state='claimed' and event.attempt=delivery.attempt
|
|
68
|
+
order by event.sequence desc limit 1),
|
|
69
|
+
delivery.recipient)
|
|
70
|
+
end),
|
|
71
|
+
last_action = coalesce(delivery.last_action, case
|
|
72
|
+
when delivery.state='pending' and delivery.attempt=0 then 'created'
|
|
73
|
+
when delivery.state='claimed' then 'claim'
|
|
74
|
+
when delivery.state='acked' then 'ack'
|
|
75
|
+
when delivery.state='retrying' then 'nack_retry'
|
|
76
|
+
when delivery.state='dead' and delivery.last_error='message expired' then 'message_expired'
|
|
77
|
+
when delivery.state='dead' and delivery.last_error='maximum attempts reached' then 'attempts_exhausted'
|
|
78
|
+
when delivery.state='dead' then 'nack_dead'
|
|
79
|
+
when delivery.state='cancelled' then 'cancel'
|
|
80
|
+
else 'created'
|
|
81
|
+
end)
|
|
82
|
+
from agent_bridge.messages message
|
|
83
|
+
where message.workspace = delivery.workspace and message.id = delivery.message_id;
|
|
84
|
+
|
|
85
|
+
alter table agent_bridge.deliveries
|
|
86
|
+
alter column cycle_attempt set not null,
|
|
87
|
+
alter column cycle_attempt set default 0,
|
|
88
|
+
alter column last_action set not null;
|
|
89
|
+
alter table agent_bridge.deliveries drop constraint if exists deliveries_lifecycle_valid;
|
|
90
|
+
alter table agent_bridge.deliveries add constraint deliveries_lifecycle_valid check (
|
|
91
|
+
priority_rank between 0 and 2
|
|
92
|
+
and cycle_attempt >= 0
|
|
93
|
+
and cycle_attempt <= attempt
|
|
94
|
+
and requeue_count >= 0
|
|
95
|
+
and last_action in (
|
|
96
|
+
'created','claim','ack','nack_retry','nack_dead','lease_expired',
|
|
97
|
+
'attempts_exhausted','message_expired','cancel','requeue'
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
alter table agent_bridge.delivery_events
|
|
102
|
+
add column if not exists cycle_attempt integer,
|
|
103
|
+
add column if not exists requeue_count integer not null default 0,
|
|
104
|
+
add column if not exists actor text,
|
|
105
|
+
add column if not exists action text;
|
|
106
|
+
|
|
107
|
+
update agent_bridge.delivery_events event
|
|
108
|
+
set cycle_attempt = coalesce(event.cycle_attempt, event.attempt),
|
|
109
|
+
actor = coalesce(event.actor, case
|
|
110
|
+
when event.from_state is null then message.source
|
|
111
|
+
when event.to_state='dead' and event.error in ('message expired','maximum attempts reached') then 'agent-bridge'
|
|
112
|
+
when event.to_state in ('acked','retrying','dead') then coalesce(
|
|
113
|
+
event.lease_owner,
|
|
114
|
+
(select claim.lease_owner from agent_bridge.delivery_events claim
|
|
115
|
+
where claim.delivery_id=event.delivery_id and claim.to_state='claimed'
|
|
116
|
+
and claim.attempt=event.attempt and claim.sequence<event.sequence
|
|
117
|
+
and claim.lease_owner is not null
|
|
118
|
+
order by claim.sequence desc limit 1),
|
|
119
|
+
delivery.recipient)
|
|
120
|
+
else coalesce(event.lease_owner,delivery.recipient)
|
|
121
|
+
end),
|
|
122
|
+
action = coalesce(event.action, case
|
|
123
|
+
when event.from_state is null then 'created'
|
|
124
|
+
when event.to_state = 'claimed' then 'claim'
|
|
125
|
+
when event.to_state = 'acked' then 'ack'
|
|
126
|
+
when event.to_state = 'retrying' then 'nack_retry'
|
|
127
|
+
when event.to_state = 'dead' and event.error = 'message expired' then 'message_expired'
|
|
128
|
+
when event.to_state = 'dead' and event.error = 'maximum attempts reached' then 'attempts_exhausted'
|
|
129
|
+
when event.to_state = 'dead' then 'nack_dead'
|
|
130
|
+
when event.to_state = 'cancelled' then 'cancel'
|
|
131
|
+
else 'created'
|
|
132
|
+
end)
|
|
133
|
+
from agent_bridge.deliveries delivery, agent_bridge.messages message
|
|
134
|
+
where delivery.id = event.delivery_id
|
|
135
|
+
and message.workspace=event.workspace and message.id=event.message_id;
|
|
136
|
+
|
|
137
|
+
alter table agent_bridge.delivery_events
|
|
138
|
+
alter column cycle_attempt set not null,
|
|
139
|
+
alter column actor set not null,
|
|
140
|
+
alter column action set not null;
|
|
141
|
+
alter table agent_bridge.delivery_events drop constraint if exists delivery_events_action_valid;
|
|
142
|
+
alter table agent_bridge.delivery_events add constraint delivery_events_action_valid check (
|
|
143
|
+
action in (
|
|
144
|
+
'created','claim','ack','nack_retry','nack_dead','lease_expired',
|
|
145
|
+
'attempts_exhausted','message_expired','cancel','requeue'
|
|
146
|
+
)
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
create or replace function agent_bridge.record_delivery_event() returns trigger
|
|
150
|
+
language plpgsql set search_path = '' as $$
|
|
151
|
+
begin
|
|
152
|
+
if tg_op = 'INSERT'
|
|
153
|
+
or old.state is distinct from new.state
|
|
154
|
+
or old.attempt is distinct from new.attempt
|
|
155
|
+
or old.requeue_count is distinct from new.requeue_count
|
|
156
|
+
or old.last_action is distinct from new.last_action then
|
|
157
|
+
insert into agent_bridge.delivery_events (
|
|
158
|
+
delivery_id, message_id, workspace, recipient, from_state, to_state,
|
|
159
|
+
attempt, cycle_attempt, requeue_count, lease_owner, error, actor, action
|
|
160
|
+
) values (
|
|
161
|
+
new.id, new.message_id, new.workspace, new.recipient,
|
|
162
|
+
case when tg_op = 'INSERT' then null else old.state end,
|
|
163
|
+
new.state, new.attempt, new.cycle_attempt, new.requeue_count,
|
|
164
|
+
new.lease_owner, new.last_error, coalesce(new.last_actor, new.recipient), new.last_action
|
|
165
|
+
);
|
|
166
|
+
end if;
|
|
167
|
+
return new;
|
|
168
|
+
end
|
|
169
|
+
$$;
|
|
170
|
+
drop trigger if exists deliveries_record_event on agent_bridge.deliveries;
|
|
171
|
+
create trigger deliveries_record_event
|
|
172
|
+
after insert or update on agent_bridge.deliveries
|
|
173
|
+
for each row execute function agent_bridge.record_delivery_event();
|
|
174
|
+
|
|
175
|
+
drop index if exists agent_bridge.deliveries_claim;
|
|
176
|
+
create index deliveries_claim on agent_bridge.deliveries
|
|
177
|
+
(workspace, recipient, priority_rank, available_at, created_at, id)
|
|
178
|
+
where state in ('pending','retrying','claimed');
|
|
179
|
+
create index if not exists deliveries_publisher_lookup on agent_bridge.deliveries
|
|
180
|
+
(workspace, message_id, created_at, id);
|
|
181
|
+
create index if not exists deliveries_terminal_lookup on agent_bridge.deliveries
|
|
182
|
+
(workspace, recipient, state, created_at, id)
|
|
183
|
+
where state in ('dead','cancelled');
|
|
184
|
+
|
|
185
|
+
insert into agent_bridge.schema_migrations (version, name, checksum)
|
|
186
|
+
values (10, 'publisher_delivery_policy', '__AGENT_BRIDGE_MIGRATION_CHECKSUM__')
|
|
187
|
+
on conflict (version) do update set applied_at=agent_bridge.schema_migrations.applied_at
|
|
188
|
+
where agent_bridge.schema_migrations.name=excluded.name
|
|
189
|
+
and agent_bridge.schema_migrations.checksum=excluded.checksum;
|
|
190
|
+
|
|
191
|
+
do $migration$
|
|
192
|
+
begin
|
|
193
|
+
if not exists (
|
|
194
|
+
select 1 from agent_bridge.schema_migrations
|
|
195
|
+
where version=10 and name='publisher_delivery_policy'
|
|
196
|
+
and checksum='__AGENT_BRIDGE_MIGRATION_CHECKSUM__'
|
|
197
|
+
) then
|
|
198
|
+
raise exception 'migration 10_publisher_delivery_policy conflicts with recorded schema state';
|
|
199
|
+
end if;
|
|
200
|
+
if not exists (
|
|
201
|
+
select 1 from pg_trigger
|
|
202
|
+
where tgrelid='agent_bridge.messages'::regclass
|
|
203
|
+
and tgname='messages_immutable' and not tgisinternal
|
|
204
|
+
) then
|
|
205
|
+
raise exception 'message immutability trigger was not restored';
|
|
206
|
+
end if;
|
|
207
|
+
end
|
|
208
|
+
$migration$;
|
|
209
|
+
|
|
210
|
+
commit;
|