@bragi-gmbh/codebus 1.4.0 → 1.6.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 (146) hide show
  1. package/dist/ci-hooks/ci-hooks.js +126 -0
  2. package/dist/ci-hooks/ci-hooks.js.map +1 -0
  3. package/dist/commands/adr.js +30 -0
  4. package/dist/commands/adr.js.map +1 -0
  5. package/dist/commands/agent.js +175 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/as.js +1 -1
  8. package/dist/commands/as.js.map +1 -1
  9. package/dist/commands/ask.js +1 -1
  10. package/dist/commands/ask.js.map +1 -1
  11. package/dist/commands/checkin.js +1 -1
  12. package/dist/commands/checkin.js.map +1 -1
  13. package/dist/commands/ci-findings.js +129 -0
  14. package/dist/commands/ci-findings.js.map +1 -0
  15. package/dist/commands/ci-reply.js +117 -0
  16. package/dist/commands/ci-reply.js.map +1 -0
  17. package/dist/commands/ci-steer-escalate.js +65 -0
  18. package/dist/commands/ci-steer-escalate.js.map +1 -0
  19. package/dist/commands/cli-mcp-correlation.js +131 -0
  20. package/dist/commands/cli-mcp-correlation.js.map +1 -0
  21. package/dist/commands/connector-attach-detach.js +542 -0
  22. package/dist/commands/connector-attach-detach.js.map +1 -0
  23. package/dist/commands/connector.js +513 -0
  24. package/dist/commands/connector.js.map +1 -0
  25. package/dist/commands/contract.js +33 -0
  26. package/dist/commands/contract.js.map +1 -0
  27. package/dist/commands/correlation.js +194 -0
  28. package/dist/commands/correlation.js.map +1 -0
  29. package/dist/commands/decision.js +63 -0
  30. package/dist/commands/decision.js.map +1 -1
  31. package/dist/commands/digest.js +14 -3
  32. package/dist/commands/digest.js.map +1 -1
  33. package/dist/commands/do.js +127 -0
  34. package/dist/commands/do.js.map +1 -0
  35. package/dist/commands/factory-attention.js +106 -0
  36. package/dist/commands/factory-attention.js.map +1 -0
  37. package/dist/commands/factory-context-read.js +171 -0
  38. package/dist/commands/factory-context-read.js.map +1 -0
  39. package/dist/commands/factory-interventions.js +102 -0
  40. package/dist/commands/factory-interventions.js.map +1 -0
  41. package/dist/commands/factory.js +187 -0
  42. package/dist/commands/factory.js.map +1 -1
  43. package/dist/commands/github-login.js +109 -53
  44. package/dist/commands/github-login.js.map +1 -1
  45. package/dist/commands/graph-pull.js +130 -0
  46. package/dist/commands/graph-pull.js.map +1 -0
  47. package/dist/commands/graph.js +5 -1
  48. package/dist/commands/graph.js.map +1 -1
  49. package/dist/commands/inbox.js +7 -7
  50. package/dist/commands/inbox.js.map +1 -1
  51. package/dist/commands/ingest.js +1 -1
  52. package/dist/commands/ingest.js.map +1 -1
  53. package/dist/commands/init.js +10 -1
  54. package/dist/commands/init.js.map +1 -1
  55. package/dist/commands/install.js +1160 -55
  56. package/dist/commands/install.js.map +1 -1
  57. package/dist/commands/integration-ledger.js +81 -0
  58. package/dist/commands/integration-ledger.js.map +1 -0
  59. package/dist/commands/knowledge.js +194 -0
  60. package/dist/commands/knowledge.js.map +1 -0
  61. package/dist/commands/links.js +1 -1
  62. package/dist/commands/links.js.map +1 -1
  63. package/dist/commands/login.js +1 -1
  64. package/dist/commands/login.js.map +1 -1
  65. package/dist/commands/morning.js +50 -1
  66. package/dist/commands/morning.js.map +1 -1
  67. package/dist/commands/plan-compiler.js +260 -0
  68. package/dist/commands/plan-compiler.js.map +1 -0
  69. package/dist/commands/plan-lint.js +275 -0
  70. package/dist/commands/plan-lint.js.map +1 -0
  71. package/dist/commands/plan-score.js +203 -0
  72. package/dist/commands/plan-score.js.map +1 -0
  73. package/dist/commands/plan.js +481 -15
  74. package/dist/commands/plan.js.map +1 -1
  75. package/dist/commands/product-validity.js +168 -0
  76. package/dist/commands/product-validity.js.map +1 -0
  77. package/dist/commands/question.js +1 -1
  78. package/dist/commands/question.js.map +1 -1
  79. package/dist/commands/read-policy.js +131 -0
  80. package/dist/commands/read-policy.js.map +1 -0
  81. package/dist/commands/read.js +1 -1
  82. package/dist/commands/read.js.map +1 -1
  83. package/dist/commands/repo.js +106 -8
  84. package/dist/commands/repo.js.map +1 -1
  85. package/dist/commands/repository-protection.js +209 -0
  86. package/dist/commands/repository-protection.js.map +1 -0
  87. package/dist/commands/resolve.js +2 -2
  88. package/dist/commands/resolve.js.map +1 -1
  89. package/dist/commands/self-healing.js +26 -0
  90. package/dist/commands/self-healing.js.map +1 -0
  91. package/dist/commands/send.js +1 -1
  92. package/dist/commands/send.js.map +1 -1
  93. package/dist/commands/serial-merge.js +303 -0
  94. package/dist/commands/serial-merge.js.map +1 -0
  95. package/dist/commands/session.js +1 -1
  96. package/dist/commands/session.js.map +1 -1
  97. package/dist/commands/spend.js +31 -0
  98. package/dist/commands/spend.js.map +1 -0
  99. package/dist/commands/task.js +92 -1
  100. package/dist/commands/task.js.map +1 -1
  101. package/dist/commands/taxonomy.js +21 -0
  102. package/dist/commands/taxonomy.js.map +1 -0
  103. package/dist/commands/verify.js +77 -0
  104. package/dist/commands/verify.js.map +1 -0
  105. package/dist/config/self-healing-analysis.json +158 -0
  106. package/dist/errors.js +18 -4
  107. package/dist/errors.js.map +1 -1
  108. package/dist/execution/client.js +53 -0
  109. package/dist/execution/client.js.map +1 -0
  110. package/dist/execution/local.js +24 -0
  111. package/dist/execution/local.js.map +1 -0
  112. package/dist/execution/ssh.js +38 -0
  113. package/dist/execution/ssh.js.map +1 -0
  114. package/dist/graph.js +78 -16
  115. package/dist/graph.js.map +1 -1
  116. package/dist/index.js +40 -2
  117. package/dist/index.js.map +1 -1
  118. package/dist/json-lite.js +248 -0
  119. package/dist/json-lite.js.map +1 -0
  120. package/dist/knowledge-drift.js +40 -0
  121. package/dist/knowledge-drift.js.map +1 -0
  122. package/dist/lint/parallelism.js +414 -0
  123. package/dist/lint/parallelism.js.map +1 -0
  124. package/dist/mail-latency.js +11 -1
  125. package/dist/mail-latency.js.map +1 -1
  126. package/dist/mcp-ci-findings.js +31 -0
  127. package/dist/mcp-ci-findings.js.map +1 -0
  128. package/dist/mcp-correlation.js +290 -0
  129. package/dist/mcp-correlation.js.map +1 -0
  130. package/dist/mcp-factory-context-read.js +81 -0
  131. package/dist/mcp-factory-context-read.js.map +1 -0
  132. package/dist/mcp-registry.js +147 -1
  133. package/dist/mcp-registry.js.map +1 -1
  134. package/dist/mcp.js +94 -5
  135. package/dist/mcp.js.map +1 -1
  136. package/dist/openrouter-reservation-guard.js +97 -0
  137. package/dist/openrouter-reservation-guard.js.map +1 -0
  138. package/dist/self-healing-analysis-loader.js +150 -0
  139. package/dist/self-healing-analysis-loader.js.map +1 -0
  140. package/dist/sender.js +11 -9
  141. package/dist/sender.js.map +1 -1
  142. package/dist/toml-lite.js +546 -0
  143. package/dist/toml-lite.js.map +1 -0
  144. package/dist/version-check.js +23 -7
  145. package/dist/version-check.js.map +1 -1
  146. package/package.json +5 -3
@@ -0,0 +1,542 @@
1
+ /**
2
+ * connector-attach-detach.ts — Phase 2 v16 jira-teams-attach-detach child.
3
+ *
4
+ * Purpose: CLI surface for the CodeBus API attach/detach operation with
5
+ * idempotency key and event receipt (com.bragi.contract.connector-adapter@0.5.0-proposed).
6
+ *
7
+ * ADRs applied: 0003 (CodeBus is the control plane), 0005 (tools are interfaces),
8
+ * 0006 (OpenRouter spend gateway), 0007 (plan standard thresholds), 0010
9
+ * (connectors are adapters: registry row + n8n flow + contract test), 0012
10
+ * (reviews are executable rule sets; second-model verification — the connector
11
+ * adapter contract test, e.g. connectors/jira/jira-adapter.bats and
12
+ * connectors/teams/teams-adapter.bats, is the review rule; it is executed by
13
+ * a second model distinct from the author), 0013 (leases and blast radius).
14
+ *
15
+ * PROD binding: REPROD-2160 bcode v0.12.0-proposed / OUT-jira-teams-attach-detach
16
+ * Child ID: com.bragi.work.bcode-phase2.jira-teams-attach-detach
17
+ * Binding status: pending_prod_sections_receipt (producing_child:
18
+ * com.bragi.work.bcode-phase2.prod-sections-for-children)
19
+ * Source join: pending_owner_ratification
20
+ *
21
+ * Contracts produced: com.bragi.contract.connector-adapter@0.5.0-proposed
22
+ * (attach_detach API operation with idempotency key and event receipt)
23
+ * Contracts consumed: com.bragi.contract.connector-adapter@0.5.0-proposed,
24
+ * com.bragi.contract.jira-teams-decision-bridge@0.5.0-proposed
25
+ *
26
+ * Built on unmerged siblings: jira-registry, jira-factory-adapter,
27
+ * teams-registry, teams-factory-adapter
28
+ *
29
+ * Invariant: NO secrets are logged. auth_ref is a reference name only.
30
+ * Invariant: local_registry_files_forbidden — attach/detach must go through
31
+ * the CodeBus API (RPC / table insert under RLS), never a local file.
32
+ * Invariant: idempotency key is required on every attach; the server-side
33
+ * RPC / unique constraint guarantees deduplication.
34
+ * Invariant: event receipts (jira_registry_events / registry row state)
35
+ * are verified after every mutation — a connector with no attach event receipt
36
+ * is treated as missing_rollback and refused.
37
+ * Invariant: idempotency lookup happens BEFORE policy checks on retry paths
38
+ * (ADR-0010; mirrors 0118_plan_import_idempotency_before_policy.sql's idempotency-before-policy ordering).
39
+ */
40
+ import { resolveConfig } from "../config.js";
41
+ import { makeCtx, workspaceId } from "../client.js";
42
+ import { render } from "../output.js";
43
+ import { CodebusError } from "../errors.js";
44
+ // ── Constants ────────────────────────────────────────────────────────────
45
+ /** At least two trailing-slash variants are stripped before the regex test. */
46
+ export const JIRA_CLOUD_BASE_URL = /^https:\/\/[a-z0-9-]+\.atlassian\.net$/i;
47
+ export const JIRA_PROJECT_KEY = /^[A-Z][A-Z0-9_]{1,15}$/;
48
+ export const UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
49
+ // ── Pure validation (no IO, fully unit-testable) ──────────────────────────
50
+ /**
51
+ * Normalise and validate a Jira Cloud base URL.
52
+ * Strips trailing slashes / trailing path components, lowercases the host.
53
+ * Rejects anything that is not a bare https://*.atlassian.net host —
54
+ * this is the CLIENT-SIDE half of the DB CHECK constraint in migration 0159;
55
+ * the server remains the authoritative gate.
56
+ */
57
+ export function validateJiraBaseUrl(url) {
58
+ const normalized = (url ?? "").trim().replace(/\/+$/, "").toLowerCase();
59
+ if (!JIRA_CLOUD_BASE_URL.test(normalized)) {
60
+ throw new CodebusError(`--base-url must be a bare Jira Cloud URL like https://yourteam.atlassian.net ` +
61
+ `(https only, *.atlassian.net host, no path/port/query), got: ${url ?? ""}`);
62
+ }
63
+ return normalized;
64
+ }
65
+ /**
66
+ * Validate and normalise a comma-separated Jira project-key list.
67
+ * Each key must match [A-Z][A-Z0-9_]{1,15}.
68
+ */
69
+ export function validateProjectKeys(raw) {
70
+ if (!raw || typeof raw !== "string") {
71
+ throw new CodebusError("project keys are required (comma-separated, e.g. PROJ,OTHER)");
72
+ }
73
+ const keys = raw.split(",").map((s) => s.trim()).filter(Boolean);
74
+ if (keys.length === 0) {
75
+ throw new CodebusError("at least one project key is required");
76
+ }
77
+ const result = [];
78
+ for (const key of keys) {
79
+ if (!JIRA_PROJECT_KEY.test(key)) {
80
+ throw new CodebusError(`invalid Jira project key: ${key} (must be [A-Z][A-Z0-9_]{1,15})`);
81
+ }
82
+ result.push(key);
83
+ }
84
+ return result;
85
+ }
86
+ /**
87
+ * Idempotency key is required on every attach.
88
+ * Never silently drop an absent key — fail loudly.
89
+ */
90
+ export function validateIdempotencyKey(key, context) {
91
+ const trimmed = (key ?? "").trim();
92
+ if (!trimmed) {
93
+ throw new CodebusError(`idempotency_key is required for ${context} attach (prevents duplicate replay, ADR-0010)`);
94
+ }
95
+ return trimmed;
96
+ }
97
+ /**
98
+ * auth_ref is a reference name, never the secret itself.
99
+ * Rejects the typed REPROD-UNAVAILABLE sentinel that signals pending
100
+ * Philipp input — the connector contract forbids fabricating unavailable
101
+ * REPROD content as fact.
102
+ */
103
+ export function validateAuthRef(ref) {
104
+ const trimmed = (ref ?? "").trim();
105
+ if (!trimmed) {
106
+ throw new CodebusError("auth_ref is required (reference to auth secret, never the secret itself)");
107
+ }
108
+ if (trimmed === "REPROD-UNAVAILABLE") {
109
+ throw new CodebusError("auth_ref is pending owner input (pending_Philipp_input) — cannot attach connector");
110
+ }
111
+ return trimmed;
112
+ }
113
+ /**
114
+ * Validate a UUID (Teams tenant / app ID).
115
+ */
116
+ export function validateUuid(id, label) {
117
+ const trimmed = (id ?? "").trim();
118
+ if (!trimmed || !UUID_V4.test(trimmed)) {
119
+ throw new CodebusError(`invalid ${label}: must be a UUID, got: ${id ?? ""} — pass a valid UUID (e.g. from 'codebus agent list --json'); see 'codebus <cmd> --help'.`);
120
+ }
121
+ return trimmed;
122
+ }
123
+ /**
124
+ * Reject file-local attach. ADR-0010: attaching or detaching a connector is
125
+ * a registry row + n8n flow, never a code change in CodeBus core, and NEVER
126
+ * a local file write. A "file" attach source is a local-registry-authority
127
+ * violation.
128
+ */
129
+ export function validateAttachSource(source) {
130
+ const normalized = (source ?? "api").toLowerCase().trim();
131
+ if (normalized === "file" || normalized === "local" || normalized === "filesystem") {
132
+ throw new CodebusError("file-only attach is forbidden: local_registry_files_forbidden (ADR-0010, connector contract). " +
133
+ "All connector state must go through the CodeBus API/RPC.");
134
+ }
135
+ if (normalized !== "api") {
136
+ throw new CodebusError(`unknown attach source: ${source} (must be 'api')`);
137
+ }
138
+ return "api";
139
+ }
140
+ /**
141
+ * Verify that an event receipt of `expectedKind` exists for `registryId`.
142
+ * Returns boolean — caller decides refusal.
143
+ */
144
+ export function verifyEventReceipt(events, registryId, expectedKind) {
145
+ if (!Array.isArray(events) || events.length === 0) {
146
+ return false;
147
+ }
148
+ return events.some((e) => e.registry_id === registryId && e.event_kind === expectedKind);
149
+ }
150
+ /**
151
+ * Verify rollback integrity: every active connector must have an attach event
152
+ * receipt; every detached connector must have a detach event receipt.
153
+ * Returns a structured result so callers can surface all issues at once
154
+ * rather than throwing on the first one.
155
+ */
156
+ export function verifyRollbackIntegrity(connector, events) {
157
+ const issues = [];
158
+ // Active (non-deleted) connectors must have an attach event receipt.
159
+ if (connector.active) {
160
+ if (!verifyEventReceipt(events, connector.id, "attach")) {
161
+ issues.push(`connector ${connector.id} is active but has no attach event receipt (missing_rollback)`);
162
+ }
163
+ }
164
+ // Detached connectors must have a detach event receipt.
165
+ if (!connector.active) {
166
+ if (!verifyEventReceipt(events, connector.id, "detach")) {
167
+ issues.push(`connector ${connector.id} is detached but has no detach event receipt (missing_rollback)`);
168
+ }
169
+ }
170
+ // Idempotency key must be present — never silently dropped.
171
+ if (!connector.idempotency_key) {
172
+ issues.push(`connector ${connector.id} has no idempotency_key (refuses)`);
173
+ }
174
+ // auth_ref must be present and not the unavailable sentinel.
175
+ if (!connector.auth_ref || connector.auth_ref === "REPROD-UNAVAILABLE") {
176
+ issues.push(`connector ${connector.id} has invalid auth_ref (pending_Philipp_input)`);
177
+ }
178
+ return { valid: issues.length === 0, issues };
179
+ }
180
+ /**
181
+ * Normalise a raw Supabase row into a typed ConnectorRow.
182
+ * Handles both jira_registry and teams_connectors shapes.
183
+ * Explicit null/absent checks per reviewer rules.
184
+ */
185
+ export function normaliseConnectorRow(type, row) {
186
+ const id = String(row.id ?? "");
187
+ if (!id)
188
+ throw new CodebusError("connector row has no id");
189
+ const authRef = String(row.auth_ref ?? "");
190
+ const idempotencyKey = String(row.idempotency_key ?? "");
191
+ const createdAt = String(row.created_at ?? "");
192
+ const updatedAt = String(row.updated_at ?? "");
193
+ // Jira row: deleted_at indicates detach (soft delete).
194
+ if (type === "jira") {
195
+ const deletedAt = row.deleted_at ? String(row.deleted_at) : null;
196
+ return {
197
+ id,
198
+ connector_type: "jira",
199
+ base_url: row.base_url ? String(row.base_url) : undefined,
200
+ project_keys: Array.isArray(row.project_keys)
201
+ ? row.project_keys
202
+ : undefined,
203
+ auth_ref: authRef,
204
+ idempotency_key: idempotencyKey,
205
+ active: deletedAt === null,
206
+ deleted_at: deletedAt,
207
+ created_at: createdAt,
208
+ updated_at: updatedAt,
209
+ };
210
+ }
211
+ // Teams row: active boolean indicates detach state.
212
+ const active = row.active !== undefined ? Boolean(row.active) : false;
213
+ return {
214
+ id,
215
+ connector_type: "teams",
216
+ name: row.name ? String(row.name) : undefined,
217
+ teams_app_id: row.teams_app_id ? String(row.teams_app_id) : undefined,
218
+ teams_tenant_id: row.teams_tenant_id ? String(row.teams_tenant_id) : undefined,
219
+ auth_ref: authRef,
220
+ idempotency_key: idempotencyKey,
221
+ active,
222
+ deleted_at: null,
223
+ created_at: createdAt,
224
+ updated_at: updatedAt,
225
+ };
226
+ }
227
+ // ── Core IO functions (use ctx.supabase; mockable in tests) ───────────────
228
+ /**
229
+ * Attach a Jira connector to the current workspace.
230
+ * Calls the jira_registry_attach RPC (idempotent via idempotency_key).
231
+ * The RPC appends an attach event to jira_registry_events BEFORE
232
+ * inserting the registry row — event-before-effect ordering.
233
+ */
234
+ export async function attachJiraCore(ctx, opts, source) {
235
+ validateAttachSource(source);
236
+ const ws = await workspaceId(ctx);
237
+ const baseUrl = validateJiraBaseUrl(opts.baseUrl);
238
+ const projectKeys = validateProjectKeys(opts.projectKeys);
239
+ const authRef = validateAuthRef(opts.authRef);
240
+ const idempotencyKey = validateIdempotencyKey(opts.idempotencyKey, "jira");
241
+ const { data, error } = await ctx.supabase.rpc("jira_registry_attach", {
242
+ p_workspace_id: ws,
243
+ p_base_url: baseUrl,
244
+ p_project_keys: projectKeys,
245
+ p_auth_ref: authRef,
246
+ p_idempotency_key: idempotencyKey,
247
+ });
248
+ if (error)
249
+ throw new CodebusError(`jira_registry_attach RPC failed: ${error.message}`);
250
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
251
+ throw new CodebusError("jira_registry_attach RPC returned an invalid response");
252
+ }
253
+ return normaliseConnectorRow("jira", data);
254
+ }
255
+ /**
256
+ * Detach a Jira connector. Calls jira_registry_detach RPC, which appends
257
+ * a detach event to jira_registry_events BEFORE soft-deleting the row.
258
+ */
259
+ export async function detachJiraCore(ctx, registryId) {
260
+ const id = validateRegistryId(registryId, "jira");
261
+ const { data, error } = await ctx.supabase.rpc("jira_registry_detach", {
262
+ p_registry_id: id,
263
+ });
264
+ if (error)
265
+ throw new CodebusError(`jira_registry_detach RPC failed: ${error.message}`);
266
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
267
+ throw new CodebusError("jira_registry_detach RPC returned an invalid response");
268
+ }
269
+ const result = data;
270
+ return {
271
+ status: String(result.status ?? ""),
272
+ registry_id: String(result.registry_id ?? ""),
273
+ };
274
+ }
275
+ /**
276
+ * List all Jira connectors for this workspace.
277
+ */
278
+ export async function listJiraConnectorsCore(ctx) {
279
+ const ws = await workspaceId(ctx);
280
+ const { data, error } = await ctx.supabase
281
+ .from("jira_registry")
282
+ .select("*")
283
+ .eq("workspace_id", ws);
284
+ if (error)
285
+ throw new CodebusError(`failed to list jira connectors: ${error.message}`);
286
+ return (data ?? []).map((row) => normaliseConnectorRow("jira", row));
287
+ }
288
+ /**
289
+ * Attach a Teams connector to the current workspace.
290
+ * Inserts into teams_connectors under RLS; the workspace membership policy
291
+ * and owner validation gate the insert. Idempotency is enforced by the
292
+ * unique (workspace_id, teams_app_id, teams_tenant_id) constraint.
293
+ */
294
+ export async function attachTeamsCore(ctx, opts, source) {
295
+ validateAttachSource(source);
296
+ const ws = await workspaceId(ctx);
297
+ const name = validateConnectorName(opts.name);
298
+ const tenantId = validateUuid(opts.tenantId, "Teams tenant ID");
299
+ const appId = validateUuid(opts.appId, "Teams app ID");
300
+ const authRef = validateAuthRef(opts.authRef);
301
+ const idempotencyKey = validateIdempotencyKey(opts.idempotencyKey, "teams");
302
+ const { data, error } = await ctx.supabase
303
+ .from("teams_connectors")
304
+ .insert({
305
+ workspace_id: ws,
306
+ name: name,
307
+ teams_tenant_id: tenantId,
308
+ teams_app_id: appId,
309
+ auth_ref: authRef,
310
+ idempotency_key: idempotencyKey,
311
+ })
312
+ .select()
313
+ .single();
314
+ if (error)
315
+ throw new CodebusError(`teams connector attach failed: ${error.message}`);
316
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
317
+ throw new CodebusError("teams connector attach returned no row");
318
+ }
319
+ return normaliseConnectorRow("teams", data);
320
+ }
321
+ /**
322
+ * Detach a Teams connector (set active=false).
323
+ * The RLS modify policy requires owner_person_id = current_person_id(),
324
+ * so only the connector owner can detach it.
325
+ */
326
+ export async function detachTeamsCore(ctx, connectorId) {
327
+ const id = validateRegistryId(connectorId, "teams");
328
+ const { data, error } = await ctx.supabase
329
+ .from("teams_connectors")
330
+ .update({ active: false })
331
+ .eq("id", id)
332
+ .select()
333
+ .single();
334
+ if (error)
335
+ throw new CodebusError(`teams connector detach failed: ${error.message}`);
336
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
337
+ throw new CodebusError("teams connector detach returned no row");
338
+ }
339
+ return normaliseConnectorRow("teams", data);
340
+ }
341
+ /**
342
+ * List all Teams connectors for this workspace.
343
+ */
344
+ export async function listTeamsConnectorsCore(ctx) {
345
+ const ws = await workspaceId(ctx);
346
+ const { data, error } = await ctx.supabase
347
+ .from("teams_connectors")
348
+ .select("*")
349
+ .eq("workspace_id", ws);
350
+ if (error)
351
+ throw new CodebusError(`failed to list teams connectors: ${error.message}`);
352
+ return (data ?? []).map((row) => normaliseConnectorRow("teams", row));
353
+ }
354
+ // ── Event receipt listing / verification IO ──────────────────────────────
355
+ /**
356
+ * List event receipts for a Jira registry entry.
357
+ * Reads jira_registry_events (append-only, event-before-effect).
358
+ */
359
+ export async function listConnectorEventsCore(ctx, registryId) {
360
+ const id = validateRegistryId(registryId, "jira");
361
+ const { data, error } = await ctx.supabase
362
+ .from("jira_registry_events")
363
+ .select("*")
364
+ .eq("registry_id", id)
365
+ .order("created_at", { ascending: true });
366
+ if (error)
367
+ throw new CodebusError(`failed to list events: ${error.message}`);
368
+ return (data ?? []).map((row) => ({
369
+ id: String(row.id ?? ""),
370
+ registry_id: row.registry_id ? String(row.registry_id) : null,
371
+ event_kind: row.event_kind,
372
+ event_body: row.event_body ?? {},
373
+ created_at: String(row.created_at ?? ""),
374
+ }));
375
+ }
376
+ /**
377
+ * Verify receipt integrity for a connector: fetch the registry row and its
378
+ * events, then run verifyRollbackIntegrity.
379
+ * For Jira this reads both jira_registry and jira_registry_events.
380
+ * For Teams this reads teams_connectors (no events table; row state is the receipt).
381
+ */
382
+ export async function verifyConnectorReceiptCore(ctx, registryId, connectorType) {
383
+ const id = validateRegistryId(registryId, connectorType);
384
+ const ws = await workspaceId(ctx);
385
+ if (connectorType === "jira") {
386
+ const { data: row, error: rowErr } = await ctx.supabase
387
+ .from("jira_registry")
388
+ .select("*")
389
+ .eq("id", id)
390
+ .eq("workspace_id", ws)
391
+ .single();
392
+ if (rowErr || !row) {
393
+ throw new CodebusError(`jira registry entry not found: ${id}`);
394
+ }
395
+ const connector = normaliseConnectorRow("jira", row);
396
+ const { data: events, error: evtErr } = await ctx.supabase
397
+ .from("jira_registry_events")
398
+ .select("*")
399
+ .eq("registry_id", id)
400
+ .order("created_at", { ascending: true });
401
+ if (evtErr)
402
+ throw new CodebusError(`failed to list events: ${evtErr.message}`);
403
+ const eventReceipts = (events ?? []).map((e) => ({
404
+ id: String(e.id ?? ""),
405
+ registry_id: e.registry_id ? String(e.registry_id) : null,
406
+ event_kind: e.event_kind,
407
+ event_body: e.event_body ?? {},
408
+ created_at: String(e.created_at ?? ""),
409
+ }));
410
+ return verifyRollbackIntegrity(connector, eventReceipts);
411
+ }
412
+ // Teams: no separate events table; verify row state + idempotency key + auth_ref.
413
+ const { data: row, error: rowErr } = await ctx.supabase
414
+ .from("teams_connectors")
415
+ .select("*")
416
+ .eq("id", id)
417
+ .eq("workspace_id", ws)
418
+ .single();
419
+ if (rowErr || !row) {
420
+ throw new CodebusError(`teams connector not found: ${id}`);
421
+ }
422
+ const connector = normaliseConnectorRow("teams", row);
423
+ // Teams has no events table — row existence + active flag + idempotency key
424
+ // is the receipt. A "missing_rollback" for Teams means the row exists but
425
+ // has no idempotency_key (state was written without going through the attach API).
426
+ return verifyRollbackIntegrity(connector, []);
427
+ }
428
+ // ── Additional pure validators ─────────────────────────────────────────────
429
+ export function validateRegistryId(id, type) {
430
+ const trimmed = (id ?? "").trim();
431
+ if (!trimmed) {
432
+ throw new CodebusError(`${type} registry id is required`);
433
+ }
434
+ if (!UUID_V4.test(trimmed)) {
435
+ throw new CodebusError(`invalid ${type} registry id: must be a UUID, got: ${trimmed}`);
436
+ }
437
+ return trimmed;
438
+ }
439
+ export function validateConnectorName(name) {
440
+ const trimmed = (name ?? "").trim();
441
+ if (!trimmed || trimmed.length === 0) {
442
+ throw new CodebusError("connector name is required");
443
+ }
444
+ if (trimmed.length > 200) {
445
+ throw new CodebusError("connector name must be at most 200 characters");
446
+ }
447
+ return trimmed;
448
+ }
449
+ // ── Command registration ───────────────────────────────────────────────────
450
+ export function registerConnector(program, g) {
451
+ const connector = program
452
+ .command("connector")
453
+ .description("manage connector attach/detach via CodeBus API (ADR-0010: registry row + n8n flow + contract test)");
454
+ const attach = g(connector.command("attach").description("attach a connector to this workspace via the CodeBus API"));
455
+ g(attach.command("jira"))
456
+ .description("attach Jira connector to this workspace")
457
+ .requiredOption("--base-url <url>", "Jira Cloud base URL, e.g. https://team.atlassian.net")
458
+ .requiredOption("--project-keys <keys>", "comma-separated Jira project keys, e.g. PROJ,OTHER")
459
+ .requiredOption("--auth-ref <ref>", "reference to auth secret (never the secret itself)")
460
+ .requiredOption("--idempotency-key <key>", "idempotency key to prevent duplicate replay")
461
+ .option("--source <method>", "attach source: 'api' only (default); 'file' is forbidden", "api")
462
+ .option("--json", "output as JSON")
463
+ .action(async (o) => {
464
+ const ctx = await makeCtx(resolveConfig(o));
465
+ const result = await attachJiraCore(ctx, o, o.source);
466
+ console.log(render([result], { json: !!o.json }));
467
+ });
468
+ g(attach.command("teams"))
469
+ .description("attach Teams connector to this workspace")
470
+ .requiredOption("--name <name>", "display name for this Teams connector")
471
+ .requiredOption("--tenant-id <id>", "Azure tenant ID (UUID)")
472
+ .requiredOption("--app-id <id>", "Teams app registration ID (UUID)")
473
+ .requiredOption("--auth-ref <ref>", "reference to auth secret (never the secret itself)")
474
+ .requiredOption("--idempotency-key <key>", "idempotency key to prevent duplicate replay")
475
+ .option("--source <method>", "attach source: 'api' only (default); 'file' is forbidden", "api")
476
+ .option("--json", "output as JSON")
477
+ .action(async (o) => {
478
+ const ctx = await makeCtx(resolveConfig(o));
479
+ const result = await attachTeamsCore(ctx, o, o.source);
480
+ console.log(render([result], { json: !!o.json }));
481
+ });
482
+ const detach = g(connector.command("detach").description("detach a connector from this workspace"));
483
+ g(detach.command("jira").argument("<registry-id>", "Jira registry entry UUID"))
484
+ .option("--json", "output as JSON")
485
+ .action(async (id, o) => {
486
+ const ctx = await makeCtx(resolveConfig(o));
487
+ const result = await detachJiraCore(ctx, id);
488
+ console.log(render([result], { json: !!o.json }));
489
+ });
490
+ g(detach.command("teams").argument("<connector-id>", "Teams connector UUID"))
491
+ .option("--json", "output as JSON")
492
+ .action(async (id, o) => {
493
+ const ctx = await makeCtx(resolveConfig(o));
494
+ const result = await detachTeamsCore(ctx, id);
495
+ console.log(render([result], { json: !!o.json }));
496
+ });
497
+ g(connector.command("list").argument("[type]", "jira | teams | all (default: all)"))
498
+ .option("--json", "output as JSON")
499
+ .action(async (type, o) => {
500
+ const ctx = await makeCtx(resolveConfig(o));
501
+ const jira = await listJiraConnectorsCore(ctx);
502
+ const teams = await listTeamsConnectorsCore(ctx);
503
+ const all = [...jira, ...teams];
504
+ let result;
505
+ if (!type || type === "all")
506
+ result = all;
507
+ else if (type === "jira")
508
+ result = jira;
509
+ else if (type === "teams")
510
+ result = teams;
511
+ else
512
+ throw new CodebusError(`unknown connector type: ${type} (jira | teams | all)`);
513
+ console.log(render(result, { json: !!o.json }));
514
+ });
515
+ g(connector
516
+ .command("events")
517
+ .argument("<registry-id>", "Jira registry entry UUID")
518
+ .description("list attach/detach event receipts for a Jira connector"))
519
+ .option("--json", "output as JSON")
520
+ .action(async (id, _o) => {
521
+ const ctx = await makeCtx(resolveConfig(_o));
522
+ const events = await listConnectorEventsCore(ctx, id);
523
+ console.log(render(events, { json: !!_o.json }));
524
+ });
525
+ g(connector
526
+ .command("verify-receipt")
527
+ .argument("<registry-id>", "Jira or Teams connector UUID")
528
+ .argument("<type>", "jira | teams"))
529
+ .description("verify event receipts and rollback integrity for a connector")
530
+ .option("--json", "output as JSON")
531
+ .action(async (id, type, o) => {
532
+ const ctx = await makeCtx(resolveConfig(o));
533
+ const connectorType = type === "teams" ? "teams" : "jira";
534
+ const result = await verifyConnectorReceiptCore(ctx, id, connectorType);
535
+ console.log(render([{ valid: result.valid, issues: result.issues }], { json: !!o.json }));
536
+ if (!result.valid) {
537
+ throw new CodebusError(`receipt verification failed: ${result.issues.join("; ")}`);
538
+ }
539
+ });
540
+ return connector;
541
+ }
542
+ //# sourceMappingURL=connector-attach-detach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-attach-detach.js","sourceRoot":"","sources":["../../src/commands/connector-attach-detach.ts"],"names":[],"mappings":"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"}