@clawscarf/cli 0.1.0-alpha.1

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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/THIRD_PARTY_NOTICES.md +102 -0
  4. package/deploy/execution/browser/LICENSE.playwright +202 -0
  5. package/deploy/execution/browser/seccomp.json +640 -0
  6. package/deploy/execution/browser-node/configuration.js +85 -0
  7. package/deploy/execution/browser-node/operator.js +167 -0
  8. package/deploy/execution/network/node-ingress.cfg +35 -0
  9. package/deploy/models/catalog.json +275 -0
  10. package/deploy/openshell/policy.yaml +24 -0
  11. package/generated/http/LICENSE.md +21 -0
  12. package/generated/http/client/client.gen.d.ts +2 -0
  13. package/generated/http/client/client.gen.js +216 -0
  14. package/generated/http/client/index.d.ts +10 -0
  15. package/generated/http/client/index.js +6 -0
  16. package/generated/http/client/types.gen.d.ts +120 -0
  17. package/generated/http/client/types.gen.js +2 -0
  18. package/generated/http/client/utils.gen.d.ts +37 -0
  19. package/generated/http/client/utils.gen.js +228 -0
  20. package/generated/http/core/auth.gen.d.ts +25 -0
  21. package/generated/http/core/auth.gen.js +14 -0
  22. package/generated/http/core/bodySerializer.gen.d.ts +25 -0
  23. package/generated/http/core/bodySerializer.gen.js +57 -0
  24. package/generated/http/core/params.gen.d.ts +43 -0
  25. package/generated/http/core/params.gen.js +109 -0
  26. package/generated/http/core/pathSerializer.gen.d.ts +33 -0
  27. package/generated/http/core/pathSerializer.gen.js +106 -0
  28. package/generated/http/core/queryKeySerializer.gen.d.ts +18 -0
  29. package/generated/http/core/queryKeySerializer.gen.js +92 -0
  30. package/generated/http/core/serverSentEvents.gen.d.ts +71 -0
  31. package/generated/http/core/serverSentEvents.gen.js +132 -0
  32. package/generated/http/core/types.gen.d.ts +83 -0
  33. package/generated/http/core/types.gen.js +2 -0
  34. package/generated/http/core/utils.gen.d.ts +19 -0
  35. package/generated/http/core/utils.gen.js +87 -0
  36. package/package.json +37 -0
  37. package/packs/README.md +130 -0
  38. package/packs/research-team/pack.json +20 -0
  39. package/packs/research-team/researcher/CLAW.md +19 -0
  40. package/packs/research-team/researcher/package.json +8 -0
  41. package/packs/research-team/researcher/profiles/openclaw.yml +6 -0
  42. package/packs/research-team/reviewer/CLAW.md +19 -0
  43. package/packs/research-team/reviewer/package.json +8 -0
  44. package/packs/research-team/reviewer/profiles/openclaw.yml +6 -0
  45. package/pnpm-lock.yaml +7158 -0
  46. package/recipes/README.md +37 -0
  47. package/recipes/team-server/recipe.json +28 -0
  48. package/release/README.md +137 -0
  49. package/release/components.json +29 -0
  50. package/release/operator.md +63 -0
  51. package/runtime/configuration.js +135 -0
  52. package/runtime/connections-configuration.js +70 -0
  53. package/runtime/model-contract.js +92 -0
  54. package/runtime/releases/0.1.0-alpha.1.json +37 -0
  55. package/scripts/clawscarf.js +92 -0
  56. package/scripts/cloud/login.js +134 -0
  57. package/scripts/cloud/registration.js +232 -0
  58. package/scripts/cloud/url.js +9 -0
  59. package/scripts/connections.js +193 -0
  60. package/scripts/controller.js +143 -0
  61. package/scripts/deployment/browser-node-compose.js +81 -0
  62. package/scripts/deployment/browser-node-helper.js +9 -0
  63. package/scripts/deployment/browser-node-pairing.js +165 -0
  64. package/scripts/deployment/browser-node.js +154 -0
  65. package/scripts/deployment/browser.js +143 -0
  66. package/scripts/deployment/certificates.js +76 -0
  67. package/scripts/deployment/compose.js +191 -0
  68. package/scripts/deployment/configuration.js +275 -0
  69. package/scripts/deployment/connection-policy.js +80 -0
  70. package/scripts/deployment/connection-settings.js +60 -0
  71. package/scripts/deployment/connections-runtime.js +31 -0
  72. package/scripts/deployment/connections.js +213 -0
  73. package/scripts/deployment/controller-compose.js +59 -0
  74. package/scripts/deployment/database.js +199 -0
  75. package/scripts/deployment/entrypoint.js +7 -0
  76. package/scripts/deployment/images.js +17 -0
  77. package/scripts/deployment/initial-services.js +53 -0
  78. package/scripts/deployment/launch.js +177 -0
  79. package/scripts/deployment/logs.js +15 -0
  80. package/scripts/deployment/model-gateway-compose.js +74 -0
  81. package/scripts/deployment/model-gateway.js +125 -0
  82. package/scripts/deployment/models.js +82 -0
  83. package/scripts/deployment/networks.js +354 -0
  84. package/scripts/deployment/policy.js +56 -0
  85. package/scripts/deployment/preflight.js +124 -0
  86. package/scripts/deployment/prepare.js +205 -0
  87. package/scripts/deployment/process.js +70 -0
  88. package/scripts/deployment/relay.js +58 -0
  89. package/scripts/deployment/runtime-binding.js +100 -0
  90. package/scripts/deployment/runtime.js +232 -0
  91. package/scripts/deployment/state.js +154 -0
  92. package/scripts/deployment/team.js +76 -0
  93. package/scripts/deployment/upgrade-rpc.py +148 -0
  94. package/scripts/deployment/upgrade-state.js +47 -0
  95. package/scripts/deployment/upgrade.js +298 -0
  96. package/scripts/deployment/volumes.js +24 -0
  97. package/scripts/errors.js +9 -0
  98. package/scripts/installation/administrator.js +23 -0
  99. package/scripts/installation/command.js +176 -0
  100. package/scripts/installation/configuration.js +104 -0
  101. package/scripts/installation/configure.js +122 -0
  102. package/scripts/installation/delete.js +111 -0
  103. package/scripts/installation/doctor.js +8 -0
  104. package/scripts/installation/errors.js +8 -0
  105. package/scripts/installation/files.js +51 -0
  106. package/scripts/installation/installer/cloud.js +22 -0
  107. package/scripts/installation/installer/collect.js +245 -0
  108. package/scripts/installation/installer/inputs.js +59 -0
  109. package/scripts/installation/installer/menu.js +49 -0
  110. package/scripts/installation/installer/prompts.js +139 -0
  111. package/scripts/installation/installer/run.js +251 -0
  112. package/scripts/installation/installer/secrets.js +16 -0
  113. package/scripts/installation/installer/sections/access.js +69 -0
  114. package/scripts/installation/installer/sections/certificates.js +18 -0
  115. package/scripts/installation/installer/sections/connections.js +4 -0
  116. package/scripts/installation/installer/sections/external-models.js +35 -0
  117. package/scripts/installation/installer/sections/models.js +119 -0
  118. package/scripts/installation/installer/sections/packs.js +82 -0
  119. package/scripts/installation/installer/sections/resources.js +10 -0
  120. package/scripts/installation/installer/settings.js +192 -0
  121. package/scripts/installation/installer/summary.js +44 -0
  122. package/scripts/installation/lifecycle.js +127 -0
  123. package/scripts/installation/location.js +3 -0
  124. package/scripts/installation/models.js +42 -0
  125. package/scripts/installation/options.js +360 -0
  126. package/scripts/installation/packs.js +150 -0
  127. package/scripts/installation/plan.js +121 -0
  128. package/scripts/installation/prerequisites.js +170 -0
  129. package/scripts/installation/recipes/catalog.js +55 -0
  130. package/scripts/installation/recipes/definition.js +32 -0
  131. package/scripts/installation/reconfigure.js +255 -0
  132. package/scripts/installation/requirements.js +23 -0
  133. package/scripts/installation/resolve.js +217 -0
  134. package/scripts/installation/runtime.js +87 -0
  135. package/scripts/installation/save.js +95 -0
  136. package/scripts/installation/setup.js +91 -0
  137. package/scripts/models/catalog.js +9 -0
  138. package/scripts/models/configuration.js +184 -0
  139. package/scripts/models/credentials.js +132 -0
  140. package/scripts/models/runtime.js +87 -0
  141. package/scripts/output.js +34 -0
  142. package/scripts/packs/connections.js +95 -0
  143. package/scripts/packs/lifecycle.js +125 -0
  144. package/scripts/packs/model.js +66 -0
  145. package/scripts/packs/native.js +69 -0
  146. package/scripts/packs/openshell.js +148 -0
  147. package/scripts/packs/policy.js +189 -0
  148. package/scripts/packs/requirements.in +1 -0
  149. package/scripts/packs/requirements.js +11 -0
  150. package/scripts/packs/requirements.txt +116 -0
  151. package/scripts/packs/source.js +90 -0
  152. package/scripts/packs/transport.py +68 -0
  153. package/scripts/people.js +52 -0
  154. package/scripts/release/create.js +62 -0
  155. package/scripts/release/definition.js +51 -0
  156. package/scripts/session.js +27 -0
  157. package/services/access/generated/client.gen.d.ts +12 -0
  158. package/services/access/generated/client.gen.js +3 -0
  159. package/services/access/generated/fastify.gen.d.ts +49 -0
  160. package/services/access/generated/fastify.gen.js +2 -0
  161. package/services/access/generated/index.d.ts +2 -0
  162. package/services/access/generated/index.js +2 -0
  163. package/services/access/generated/sdk.gen.d.ts +28 -0
  164. package/services/access/generated/sdk.gen.js +107 -0
  165. package/services/access/generated/types.gen.d.ts +349 -0
  166. package/services/access/generated/types.gen.js +2 -0
  167. package/services/access/migrations/001_access.sql +39 -0
  168. package/services/access/migrations/002_administrator_setup.sql +16 -0
  169. package/services/access/migrations/003_local_login_completion.sql +5 -0
  170. package/services/access/migrations/004_invitations.sql +21 -0
  171. package/services/access/repo/postgres.js +341 -0
  172. package/services/access/repo/session-logout.js +28 -0
  173. package/services/access/types/credential.js +2 -0
  174. package/services/access/types/errors.js +7 -0
  175. package/services/access/types/ingress.js +1 -0
  176. package/services/access/types/model.js +1 -0
  177. package/services/access/types/native-errors.js +7 -0
  178. package/services/access/types/native.js +1 -0
  179. package/services/cloud/generated/client.gen.d.ts +12 -0
  180. package/services/cloud/generated/client.gen.js +3 -0
  181. package/services/cloud/generated/index.d.ts +2 -0
  182. package/services/cloud/generated/index.js +2 -0
  183. package/services/cloud/generated/sdk.gen.d.ts +145 -0
  184. package/services/cloud/generated/sdk.gen.js +488 -0
  185. package/services/cloud/generated/types.gen.d.ts +2034 -0
  186. package/services/cloud/generated/types.gen.js +2 -0
  187. package/services/connections/cloud/generated/client.gen.d.ts +12 -0
  188. package/services/connections/cloud/generated/client.gen.js +3 -0
  189. package/services/connections/cloud/generated/fastify.gen.d.ts +68 -0
  190. package/services/connections/cloud/generated/fastify.gen.js +2 -0
  191. package/services/connections/cloud/generated/index.d.ts +2 -0
  192. package/services/connections/cloud/generated/index.js +2 -0
  193. package/services/connections/cloud/generated/sdk.gen.d.ts +95 -0
  194. package/services/connections/cloud/generated/sdk.gen.js +210 -0
  195. package/services/connections/cloud/generated/types.gen.d.ts +1044 -0
  196. package/services/connections/cloud/generated/types.gen.js +2 -0
  197. package/services/connections/migrations/001_connections.sql +220 -0
@@ -0,0 +1,2 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+ export {};
@@ -0,0 +1,220 @@
1
+ -- Up Migration
2
+ CREATE SCHEMA clawscarf_connections;
3
+ SET LOCAL search_path TO clawscarf_connections, pg_catalog;
4
+ CREATE TABLE connections (
5
+ id uuid PRIMARY KEY,
6
+ server_id uuid NOT NULL,
7
+ connector_id text NOT NULL CHECK(length(connector_id) BETWEEN 1 AND 100),
8
+ name text NOT NULL CHECK(length(name) BETWEEN 1 AND 160 AND name=btrim(name)),
9
+ grant_policy jsonb NOT NULL CHECK(jsonb_typeof(grant_policy)='object' AND grant_policy->>'mode' IN ('all','selected')),
10
+ state text NOT NULL CHECK(state IN ('not_connected','connected','needs_attention','disconnected')),
11
+ generation integer NOT NULL CHECK(generation>0),
12
+ revision integer NOT NULL CHECK(revision>0),
13
+ active_account_id uuid,
14
+ failure jsonb,
15
+ created_at timestamptz NOT NULL,
16
+ updated_at timestamptz NOT NULL,
17
+ UNIQUE(server_id,id),
18
+ CHECK(state<>'connected' OR active_account_id IS NOT NULL),
19
+ CHECK(state<>'disconnected' OR active_account_id IS NULL)
20
+ );
21
+ CREATE INDEX connections_page ON connections(server_id,id);
22
+ CREATE TABLE connection_setups (
23
+ id uuid PRIMARY KEY,
24
+ server_id uuid NOT NULL,
25
+ connection_id uuid NOT NULL,
26
+ initiator_id uuid NOT NULL,
27
+ actor jsonb NOT NULL CHECK(jsonb_typeof(actor)='object' AND actor->>'userId'=initiator_id::text),
28
+ session_hash text NOT NULL,
29
+ subject_id text NOT NULL,
30
+ project_id text NOT NULL,
31
+ kind text NOT NULL CHECK(kind IN ('initial','reconnect')),
32
+ state text NOT NULL CHECK(state IN ('creating','pending','verifying','succeeded','expired','cancelled','failed','outcome_unknown')),
33
+ account_id uuid,
34
+ sealed_url text,
35
+ allocation_dispatched_at timestamptz,
36
+ preparation_dispatched_at timestamptz,
37
+ preparation_catalog_version text CHECK(preparation_catalog_version ~ '^sha256:[a-f0-9]{64}$'),
38
+ prepared_auth jsonb,
39
+ CONSTRAINT connection_setups_preparation_pair CHECK((preparation_dispatched_at IS NULL)=(preparation_catalog_version IS NULL)),
40
+ CONSTRAINT connection_setups_prepared_auth CHECK(prepared_auth IS NULL OR (
41
+ preparation_dispatched_at IS NOT NULL
42
+ AND jsonb_typeof(prepared_auth)='object'
43
+ AND prepared_auth ?& ARRAY['id','toolkit']
44
+ AND prepared_auth-ARRAY['id','toolkit']='{}'::jsonb
45
+ AND jsonb_typeof(prepared_auth->'id')='string'
46
+ AND jsonb_typeof(prepared_auth->'toolkit')='string'
47
+ AND char_length(prepared_auth->>'id') BETWEEN 1 AND 4096
48
+ AND char_length(prepared_auth->>'toolkit') BETWEEN 1 AND 4096
49
+ AND prepared_auth->>'id'=btrim(prepared_auth->>'id')
50
+ AND prepared_auth->>'toolkit'=btrim(prepared_auth->>'toolkit')
51
+ )),
52
+
53
+ created_at timestamptz NOT NULL,
54
+ expires_at timestamptz NOT NULL,
55
+ completed_at timestamptz,
56
+ failure jsonb,
57
+ FOREIGN KEY(server_id,connection_id) REFERENCES connections(server_id,id),
58
+ UNIQUE(server_id,connection_id,id),
59
+ CHECK(state<>'pending' OR (account_id IS NOT NULL AND sealed_url IS NOT NULL)),
60
+ CHECK(state NOT IN ('creating','pending','verifying') OR completed_at IS NULL)
61
+ );
62
+ CREATE UNIQUE INDEX connection_one_pending_setup ON connection_setups(connection_id) WHERE state IN ('creating','pending','verifying');
63
+ CREATE INDEX connection_setups_initiator ON connection_setups(initiator_id,project_id) WHERE state IN ('creating','pending','verifying');
64
+ CREATE INDEX connection_setups_due ON connection_setups(expires_at) WHERE state IN ('creating','pending','verifying');
65
+ CREATE TABLE connection_accounts (
66
+ id uuid PRIMARY KEY,
67
+ server_id uuid NOT NULL,
68
+ connection_id uuid NOT NULL,
69
+ setup_id uuid NOT NULL,
70
+ project_id text NOT NULL,
71
+ provider_account_id text NOT NULL,
72
+ subject_id text NOT NULL,
73
+ toolkit text NOT NULL,
74
+ auth_configuration_id text NOT NULL,
75
+ state text NOT NULL CHECK(state IN ('candidate','active','cleanup')),
76
+ cleanup text NOT NULL CHECK(cleanup IN ('none','pending','running','complete','needs_attention')),
77
+ revocation_job_id text,
78
+ failure jsonb,
79
+ next_attempt_at timestamptz,
80
+ UNIQUE(project_id,provider_account_id),
81
+ UNIQUE(server_id,connection_id,id),
82
+ FOREIGN KEY(server_id,connection_id,setup_id) REFERENCES connection_setups(server_id,connection_id,id),
83
+ CHECK((state='cleanup')=(cleanup<>'none'))
84
+ );
85
+ CREATE UNIQUE INDEX connection_one_active_account ON connection_accounts(connection_id) WHERE state='active';
86
+ CREATE INDEX connection_accounts_cleanup ON connection_accounts(next_attempt_at) WHERE cleanup IN ('pending','running');
87
+ ALTER TABLE connections ADD FOREIGN KEY(server_id,id,active_account_id) REFERENCES connection_accounts(server_id,connection_id,id);
88
+ ALTER TABLE connection_setups ADD FOREIGN KEY(server_id,connection_id,account_id) REFERENCES connection_accounts(server_id,connection_id,id);
89
+ CREATE TABLE connection_commands (
90
+ server_id uuid NOT NULL,
91
+ actor_id uuid NOT NULL,
92
+ key text NOT NULL CHECK(length(key) BETWEEN 1 AND 200),
93
+ fingerprint text NOT NULL,
94
+ resource_id uuid NOT NULL,
95
+ PRIMARY KEY(server_id,actor_id,key)
96
+ );
97
+ CREATE TABLE connection_credentials (
98
+ id uuid PRIMARY KEY,
99
+ server_id uuid NOT NULL,
100
+ generation integer NOT NULL CHECK(generation>0),
101
+ hash text NOT NULL UNIQUE,
102
+ state text NOT NULL CHECK(state IN ('active','revoked')),
103
+ UNIQUE(server_id,generation)
104
+ );
105
+ CREATE UNIQUE INDEX connection_one_active_credential ON connection_credentials(server_id) WHERE state='active';
106
+ CREATE TABLE connection_invocations (
107
+ id uuid PRIMARY KEY,
108
+ server_id uuid NOT NULL,
109
+ connection_id uuid NOT NULL,
110
+ generation integer NOT NULL CHECK(generation>0),
111
+ credential_id uuid NOT NULL REFERENCES connection_credentials(id),
112
+ credential_generation integer NOT NULL CHECK(credential_generation>0),
113
+ account_id uuid NOT NULL,
114
+ agent_id text NOT NULL,
115
+ correlation text NOT NULL,
116
+ fingerprint text NOT NULL,
117
+ action_id text NOT NULL,
118
+ version text NOT NULL,
119
+ state text NOT NULL CHECK(state IN ('dispatching','succeeded','rejected','outcome_unknown')),
120
+ created_at timestamptz NOT NULL,
121
+ completed_at timestamptz,
122
+ failure jsonb,
123
+ sealed_result text,
124
+ sealed_result_manifest text,
125
+ result_unavailable text,
126
+ UNIQUE(server_id,correlation),
127
+ FOREIGN KEY(server_id,connection_id,account_id) REFERENCES connection_accounts(server_id,connection_id,id),
128
+ CONSTRAINT connection_invocations_result_storage_check CHECK(num_nonnulls(sealed_result,sealed_result_manifest,result_unavailable)=1),
129
+ CONSTRAINT connection_invocations_result_retention_check CHECK(result_unavailable IN ('pending','failed','outcome_unknown','invalid_result','expired')),
130
+ CONSTRAINT connection_invocations_result_success_check CHECK(state='succeeded' OR (sealed_result IS NULL AND sealed_result_manifest IS NULL)),
131
+ CHECK((state='dispatching')=(completed_at IS NULL))
132
+ );
133
+ CREATE INDEX connection_invocations_dispatch ON connection_invocations(created_at) WHERE state='dispatching';
134
+ CREATE TABLE connection_callbacks (
135
+ hash text PRIMARY KEY,
136
+ user_id uuid NOT NULL,
137
+ connection_id uuid REFERENCES connections(id),
138
+ state text NOT NULL CHECK(state IN ('verifying','complete')),
139
+ created_at timestamptz NOT NULL DEFAULT clock_timestamp()
140
+ );
141
+
142
+ CREATE TABLE connection_result_pages (
143
+ invocation_id uuid NOT NULL,
144
+ page_number integer NOT NULL,
145
+ sealed_page text NOT NULL,
146
+ CONSTRAINT connection_result_pages_invocation_fkey
147
+ FOREIGN KEY(invocation_id) REFERENCES connection_invocations(id) ON DELETE CASCADE,
148
+ CONSTRAINT connection_result_pages_number_check CHECK(page_number>=0 AND page_number<1025),
149
+ CONSTRAINT connection_result_pages_payload_check CHECK(octet_length(sealed_page) BETWEEN 1 AND 65536),
150
+ CONSTRAINT connection_result_pages_pkey PRIMARY KEY(invocation_id,page_number)
151
+ );
152
+
153
+ CREATE INDEX connection_invocations_result_retention
154
+ ON connection_invocations(completed_at,id)
155
+ WHERE sealed_result IS NOT NULL OR sealed_result_manifest IS NOT NULL;
156
+
157
+ CREATE TABLE connection_callback_receipts (
158
+ callback_hash text PRIMARY KEY REFERENCES connection_callbacks(hash),
159
+ project_id text NOT NULL CHECK(octet_length(project_id) BETWEEN 1 AND 4096 AND project_id=btrim(project_id)),
160
+ subject_id text NOT NULL CHECK(octet_length(subject_id) BETWEEN 1 AND 4096 AND subject_id=btrim(subject_id)),
161
+ provider_account_id text NOT NULL CHECK(octet_length(provider_account_id) BETWEEN 1 AND 4096 AND provider_account_id=btrim(provider_account_id)),
162
+ toolkit text NOT NULL CHECK(octet_length(toolkit) BETWEEN 1 AND 4096 AND toolkit=btrim(toolkit))
163
+ );
164
+
165
+ CREATE INDEX connection_callback_receipts_account
166
+ ON connection_callback_receipts USING hash(provider_account_id);
167
+
168
+ CREATE TABLE connection_returns (
169
+ id uuid PRIMARY KEY,
170
+ cookie_hash text NOT NULL CHECK(cookie_hash ~ '^[0-9a-f]{64}$'),
171
+ session_hash text NOT NULL CHECK(session_hash ~ '^[0-9a-f]{64}$'),
172
+ sealed_session text NOT NULL CHECK(octet_length(sealed_session) BETWEEN 1 AND 65536),
173
+ created_at timestamptz NOT NULL DEFAULT statement_timestamp(),
174
+ expires_at timestamptz NOT NULL DEFAULT statement_timestamp() + interval '10 minutes',
175
+ CONSTRAINT connection_returns_lifetime CHECK(expires_at>created_at AND expires_at<=created_at+interval '10 minutes'),
176
+ UNIQUE(cookie_hash,session_hash)
177
+ );
178
+
179
+ CREATE INDEX connection_returns_expiry ON connection_returns(expires_at);
180
+
181
+ CREATE FUNCTION connection_catalog_valid_bindings(bindings jsonb) RETURNS boolean
182
+ LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$
183
+ SELECT CASE WHEN jsonb_typeof(bindings)='array' THEN
184
+ jsonb_array_length(bindings)<=2000
185
+ AND NOT EXISTS (
186
+ SELECT 1 FROM jsonb_array_elements(bindings) AS element(binding)
187
+ WHERE NOT COALESCE(CASE WHEN jsonb_typeof(binding)='object' THEN
188
+ binding ?& ARRAY['id','toolkit']
189
+ AND binding-ARRAY['id','toolkit']='{}'::jsonb
190
+ AND jsonb_typeof(binding->'id')='string'
191
+ AND jsonb_typeof(binding->'toolkit')='string'
192
+ AND binding->>'id' ~ '^[a-z][a-z0-9_]{0,99}$'
193
+ AND binding->>'toolkit' ~ '^[a-z][a-z0-9_]{0,99}$'
194
+ ELSE false END,false)
195
+ )
196
+ AND jsonb_array_length(bindings)=(SELECT count(DISTINCT binding->>'id') FROM jsonb_array_elements(bindings) AS element(binding))
197
+ AND jsonb_array_length(bindings)=(SELECT count(DISTINCT binding->>'toolkit') FROM jsonb_array_elements(bindings) AS element(binding))
198
+ ELSE false END
199
+ $$;
200
+
201
+ CREATE TABLE connection_catalog_publication (
202
+ singleton integer PRIMARY KEY CHECK(singleton=1),
203
+ version text CHECK(version ~ '^sha256:[a-f0-9]{64}$'),
204
+ connectors jsonb NOT NULL CHECK(connection_catalog_valid_bindings(connectors)),
205
+ CONSTRAINT connection_catalog_publication_unpublished CHECK(version IS NOT NULL OR connectors='[]'::jsonb)
206
+ );
207
+ INSERT INTO connection_catalog_publication(singleton,version,connectors) VALUES(1,NULL,'[]'::jsonb);
208
+
209
+
210
+ CREATE INDEX connections_connector ON connections(connector_id,id);
211
+ CREATE INDEX connection_accounts_catalog ON connection_accounts(connection_id,id)
212
+ WHERE state IN ('candidate','active') OR cleanup IN ('pending','running','needs_attention');
213
+ CREATE INDEX connection_setups_catalog ON connection_setups(connection_id,id)
214
+ WHERE state IN ('creating','pending','verifying','outcome_unknown')
215
+ OR (allocation_dispatched_at IS NOT NULL AND account_id IS NULL)
216
+ OR (preparation_dispatched_at IS NOT NULL AND prepared_auth IS NULL);
217
+ CREATE INDEX connection_invocations_catalog ON connection_invocations(connection_id,id) WHERE state='dispatching';
218
+
219
+ -- Down Migration
220
+ DROP SCHEMA clawscarf_connections CASCADE;