@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.
Files changed (114) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/README.md +467 -29
  3. package/ROADMAP.md +104 -0
  4. package/SECURITY.md +73 -0
  5. package/SKILL.md +68 -2
  6. package/bin/agent-bridge +2 -2
  7. package/clients/claude-desktop.json +3 -1
  8. package/dist/archive.d.ts +163 -0
  9. package/dist/archive.js +50 -0
  10. package/dist/archive.js.map +1 -0
  11. package/dist/bridge-domain-CBX3IVqC.d.ts +153 -0
  12. package/dist/{bridge-service-CfqMcMAn.d.ts → bridge-service-hX1ZQp4W.d.ts} +15 -5
  13. package/dist/bridge-store-DPVSCwfs.d.ts +102 -0
  14. package/dist/bridge.d.ts +76 -17
  15. package/dist/bridge.js +52 -24
  16. package/dist/chunk-2DFNOLMO.js +618 -0
  17. package/dist/chunk-2DFNOLMO.js.map +1 -0
  18. package/dist/{chunk-KVR4JBRF.js → chunk-2EVLG3YA.js} +2 -2
  19. package/dist/{chunk-KVR4JBRF.js.map → chunk-2EVLG3YA.js.map} +1 -1
  20. package/dist/chunk-45BZGB77.js +709 -0
  21. package/dist/chunk-45BZGB77.js.map +1 -0
  22. package/dist/chunk-4VB44KJU.js +230 -0
  23. package/dist/chunk-4VB44KJU.js.map +1 -0
  24. package/dist/chunk-5GMB3A77.js +1013 -0
  25. package/dist/chunk-5GMB3A77.js.map +1 -0
  26. package/dist/chunk-A6W4QALF.js +1258 -0
  27. package/dist/chunk-A6W4QALF.js.map +1 -0
  28. package/dist/chunk-BZLMF5O5.js +328 -0
  29. package/dist/chunk-BZLMF5O5.js.map +1 -0
  30. package/dist/{chunk-AXL2I7FH.js → chunk-CEXBMOI5.js} +240 -79
  31. package/dist/chunk-CEXBMOI5.js.map +1 -0
  32. package/dist/chunk-GADH244D.js +527 -0
  33. package/dist/chunk-GADH244D.js.map +1 -0
  34. package/dist/chunk-MBPZXTJA.js +2428 -0
  35. package/dist/chunk-MBPZXTJA.js.map +1 -0
  36. package/dist/chunk-NCO7RLBM.js +146 -0
  37. package/dist/chunk-NCO7RLBM.js.map +1 -0
  38. package/dist/chunk-Q6PPMXJC.js +1050 -0
  39. package/dist/chunk-Q6PPMXJC.js.map +1 -0
  40. package/dist/{chunk-4KAOBC5X.js → chunk-SPSMZOCJ.js} +190 -165
  41. package/dist/chunk-SPSMZOCJ.js.map +1 -0
  42. package/dist/chunk-UAHMP6GC.js +54 -0
  43. package/dist/chunk-UAHMP6GC.js.map +1 -0
  44. package/dist/{chunk-YD6YJATN.js → chunk-VOQIDTCJ.js} +4 -2
  45. package/dist/chunk-VOQIDTCJ.js.map +1 -0
  46. package/dist/chunk-WAI2IYIQ.js +554 -0
  47. package/dist/chunk-WAI2IYIQ.js.map +1 -0
  48. package/dist/cli.d.ts +2 -1
  49. package/dist/cli.js +3577 -250
  50. package/dist/cli.js.map +1 -1
  51. package/dist/client-config.d.ts +1 -1
  52. package/dist/client-config.js +1 -1
  53. package/dist/client-runtime.d.ts +10 -6
  54. package/dist/client-runtime.js +9 -6
  55. package/dist/contracts/generate.d.ts +2 -0
  56. package/dist/contracts/generate.js +247 -0
  57. package/dist/contracts/generate.js.map +1 -0
  58. package/dist/dr.d.ts +324 -0
  59. package/dist/dr.js +124 -0
  60. package/dist/dr.js.map +1 -0
  61. package/dist/gateway-CggQ8vTC.d.ts +78 -0
  62. package/dist/gateway-main.js +190 -8
  63. package/dist/gateway-main.js.map +1 -1
  64. package/dist/gateway.d.ts +4 -3
  65. package/dist/gateway.js +4 -3
  66. package/dist/index.js +11 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/postgres-bridge-store-Bfd3hRId.d.ts +49 -0
  69. package/dist/server.d.ts +3 -2
  70. package/dist/server.js +13 -8
  71. package/dist/sqlite.d.ts +94 -12
  72. package/dist/sqlite.js +7 -4
  73. package/docs/architecture-v2.md +375 -0
  74. package/docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md +85 -0
  75. package/docs/decisions/0002-canonical-operation-contract-registry.md +46 -0
  76. package/docs/ecosystem.md +54 -0
  77. package/docs/postmortems/2026-07-08-wrapper-source-drift.md +82 -0
  78. package/docs/troubleshooting.md +89 -0
  79. package/llms.txt +96 -4
  80. package/openapi/agent-bridge-v2.openapi.json +9610 -0
  81. package/package.json +24 -4
  82. package/schemas/agent-bridge-v2.capabilities.json +1829 -0
  83. package/schemas/agent-bridge-v2.mcp.json +2074 -0
  84. package/schemas/agent-bridge-v2.schema.json +4560 -0
  85. package/sql/migrations/008_message_projects.sql +36 -0
  86. package/sql/migrations/009_mailbox_query_indexes.sql +28 -0
  87. package/sql/migrations/010_publisher_delivery_policy.sql +210 -0
  88. package/sql/migrations/011_credential_security.sql +875 -0
  89. package/sql/migrations/012_request_authority.sql +177 -0
  90. package/sql/migrations/013_row_isolation.sql +495 -0
  91. package/sql/migrations/014_owner_control_plane.sql +1641 -0
  92. package/sql/migrations/015_portable_archives.sql +1813 -0
  93. package/sql/migrations/016_native_dr_fence.sql +1005 -0
  94. package/bin/CLAUDE.md +0 -11
  95. package/dist/bridge-domain-BcnBeHOn.d.ts +0 -97
  96. package/dist/bridge-store-BuGjxTn4.d.ts +0 -61
  97. package/dist/chunk-4KAOBC5X.js.map +0 -1
  98. package/dist/chunk-6MAZ6YLZ.js +0 -146
  99. package/dist/chunk-6MAZ6YLZ.js.map +0 -1
  100. package/dist/chunk-AXL2I7FH.js.map +0 -1
  101. package/dist/chunk-BV6W4AJK.js +0 -211
  102. package/dist/chunk-BV6W4AJK.js.map +0 -1
  103. package/dist/chunk-CKSKUBDQ.js +0 -153
  104. package/dist/chunk-CKSKUBDQ.js.map +0 -1
  105. package/dist/chunk-JOUBDRYX.js +0 -272
  106. package/dist/chunk-JOUBDRYX.js.map +0 -1
  107. package/dist/chunk-JTC5YURG.js +0 -49
  108. package/dist/chunk-JTC5YURG.js.map +0 -1
  109. package/dist/chunk-O26W5QHS.js +0 -409
  110. package/dist/chunk-O26W5QHS.js.map +0 -1
  111. package/dist/chunk-WEULPMUY.js +0 -988
  112. package/dist/chunk-WEULPMUY.js.map +0 -1
  113. package/dist/chunk-YD6YJATN.js.map +0 -1
  114. 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;