@bragi-gmbh/codebus 1.3.0 → 1.6.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/dist/ci-hooks/ci-hooks.js +126 -0
- package/dist/ci-hooks/ci-hooks.js.map +1 -0
- package/dist/commands/agent.js +137 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/as.js +1 -1
- package/dist/commands/as.js.map +1 -1
- package/dist/commands/ask.js +1 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/ci-findings.js +129 -0
- package/dist/commands/ci-findings.js.map +1 -0
- package/dist/commands/ci-reply.js +117 -0
- package/dist/commands/ci-reply.js.map +1 -0
- package/dist/commands/ci-steer-escalate.js +65 -0
- package/dist/commands/ci-steer-escalate.js.map +1 -0
- package/dist/commands/cli-mcp-correlation.js +131 -0
- package/dist/commands/cli-mcp-correlation.js.map +1 -0
- package/dist/commands/connector-attach-detach.js +542 -0
- package/dist/commands/connector-attach-detach.js.map +1 -0
- package/dist/commands/connector.js +513 -0
- package/dist/commands/connector.js.map +1 -0
- package/dist/commands/correlation.js +194 -0
- package/dist/commands/correlation.js.map +1 -0
- package/dist/commands/decision.js +63 -0
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/digest.js +14 -3
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/do.js +127 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/doc.js +276 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/factory-attention.js +106 -0
- package/dist/commands/factory-attention.js.map +1 -0
- package/dist/commands/factory-context-read.js +171 -0
- package/dist/commands/factory-context-read.js.map +1 -0
- package/dist/commands/factory-interventions.js +102 -0
- package/dist/commands/factory-interventions.js.map +1 -0
- package/dist/commands/factory.js +187 -0
- package/dist/commands/factory.js.map +1 -1
- package/dist/commands/graph-pull.js +130 -0
- package/dist/commands/graph-pull.js.map +1 -0
- package/dist/commands/graph.js +5 -1
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/inbox.js +7 -7
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/ingest.js +1 -1
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.js +1160 -55
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/integration-ledger.js +81 -0
- package/dist/commands/integration-ledger.js.map +1 -0
- package/dist/commands/knowledge.js +178 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/links.js +1 -1
- package/dist/commands/links.js.map +1 -1
- package/dist/commands/morning.js +50 -1
- package/dist/commands/morning.js.map +1 -1
- package/dist/commands/plan-compiler.js +260 -0
- package/dist/commands/plan-compiler.js.map +1 -0
- package/dist/commands/plan-lint.js +275 -0
- package/dist/commands/plan-lint.js.map +1 -0
- package/dist/commands/plan-score.js +203 -0
- package/dist/commands/plan-score.js.map +1 -0
- package/dist/commands/plan.js +481 -15
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/product-validity.js +168 -0
- package/dist/commands/product-validity.js.map +1 -0
- package/dist/commands/question.js +1 -1
- package/dist/commands/question.js.map +1 -1
- package/dist/commands/read-policy.js +131 -0
- package/dist/commands/read-policy.js.map +1 -0
- package/dist/commands/read.js +1 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/repo.js +106 -8
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/repository-protection.js +209 -0
- package/dist/commands/repository-protection.js.map +1 -0
- package/dist/commands/resolve.js +2 -2
- package/dist/commands/resolve.js.map +1 -1
- package/dist/commands/self-healing.js +26 -0
- package/dist/commands/self-healing.js.map +1 -0
- package/dist/commands/send.js +1 -1
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/serial-merge.js +303 -0
- package/dist/commands/serial-merge.js.map +1 -0
- package/dist/commands/session.js +1 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/task.js +92 -1
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/verify.js +77 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/self-healing-analysis.json +158 -0
- package/dist/errors.js +18 -4
- package/dist/errors.js.map +1 -1
- package/dist/execution/client.js +53 -0
- package/dist/execution/client.js.map +1 -0
- package/dist/execution/local.js +24 -0
- package/dist/execution/local.js.map +1 -0
- package/dist/execution/ssh.js +38 -0
- package/dist/execution/ssh.js.map +1 -0
- package/dist/graph.js +78 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/json-lite.js +248 -0
- package/dist/json-lite.js.map +1 -0
- package/dist/knowledge-drift.js +40 -0
- package/dist/knowledge-drift.js.map +1 -0
- package/dist/lint/parallelism.js +414 -0
- package/dist/lint/parallelism.js.map +1 -0
- package/dist/mail-latency.js +11 -1
- package/dist/mail-latency.js.map +1 -1
- package/dist/mcp-ci-findings.js +31 -0
- package/dist/mcp-ci-findings.js.map +1 -0
- package/dist/mcp-correlation.js +290 -0
- package/dist/mcp-correlation.js.map +1 -0
- package/dist/mcp-factory-context-read.js +81 -0
- package/dist/mcp-factory-context-read.js.map +1 -0
- package/dist/mcp-registry.js +202 -1
- package/dist/mcp-registry.js.map +1 -1
- package/dist/mcp.js +94 -5
- package/dist/mcp.js.map +1 -1
- package/dist/openrouter-reservation-guard.js +97 -0
- package/dist/openrouter-reservation-guard.js.map +1 -0
- package/dist/self-healing-analysis-loader.js +150 -0
- package/dist/self-healing-analysis-loader.js.map +1 -0
- package/dist/sender.js +11 -9
- package/dist/sender.js.map +1 -1
- package/dist/toml-lite.js +546 -0
- package/dist/toml-lite.js.map +1 -0
- package/dist/version-check.js +23 -7
- package/dist/version-check.js.map +1 -1
- 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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"}
|