@agentworkforce/deploy 3.0.15 → 3.0.17

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/connect.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { PersonaSpec } from '@agentworkforce/persona-kit';
1
+ import type { IntegrationSource, PersonaSpec } from '@agentworkforce/persona-kit';
2
2
  import type { DeployIO, IntegrationConnectOutcome } from './types.js';
3
3
  /**
4
4
  * Resolver the orchestrator uses to check + connect a Relayfile-backed
@@ -11,10 +11,28 @@ import type { DeployIO, IntegrationConnectOutcome } from './types.js';
11
11
  * dep tree (smaller bin, faster install).
12
12
  */
13
13
  export interface IntegrationConnectResolver {
14
- /** Is the provider already linked to the workspace? */
14
+ /**
15
+ * Is the provider already linked to the right scope for this persona?
16
+ *
17
+ * `source` discriminates which scope the cloud will resolve at dispatch
18
+ * time (deployer-user / workspace / workspace-service-account). The
19
+ * preflight check must hit the same scope: a `user_integrations` row
20
+ * does not satisfy a workspace-scoped persona declaration and vice
21
+ * versa. Defaults to `{ kind: 'deployer_user' }` (matches the
22
+ * persona-kit default at parse time).
23
+ *
24
+ * `expectedConfigKey` is the Nango provider-config-key the persona's
25
+ * declared `provider` resolves to (e.g. provider `slack` →
26
+ * `slack-relay`). When supplied, rows whose `providerConfigKey` does
27
+ * not match are ignored — protecting against false positives when the
28
+ * workspace has multiple Slack providers (slack-relay / slack-ricky /
29
+ * slack-nightcto / slack-my-senior-dev / slack-sage).
30
+ */
15
31
  isConnected(args: {
16
32
  workspace: string;
17
33
  provider: string;
34
+ source?: IntegrationSource;
35
+ expectedConfigKey?: string;
18
36
  }): Promise<boolean>;
19
37
  /** Run the browser-based OAuth flow and resolve when the user finishes. */
20
38
  connect(args: {
@@ -83,6 +101,27 @@ export interface ConnectAllInput {
83
101
  authRecovery?: IntegrationAuthRecoveryResolver;
84
102
  /** Required only when persona.useSubscription is true. */
85
103
  subscription?: ProviderSubscriptionResolver;
104
+ /**
105
+ * Optional resolver for the Nango provider-config-key behind each provider
106
+ * id. Backed by `GET /api/v1/integrations/catalog`. When supplied, the
107
+ * walker passes the expected config-key into the resolver's `isConnected`
108
+ * call so e.g. a persona declaring `slack` is verified against the
109
+ * `slack-relay` config-key specifically, ignoring rows backed by other
110
+ * Slack providers (slack-ricky / slack-nightcto / slack-sage / etc.).
111
+ *
112
+ * When omitted, the walker falls back to provider-name-only matching,
113
+ * which is sufficient for providers that have a single config-key but
114
+ * loses precision for ambiguous ones.
115
+ */
116
+ providerConfigKeys?: ProviderConfigKeyResolver;
117
+ }
118
+ /**
119
+ * Returns the expected Nango provider-config-key for a persona-declared
120
+ * provider id. The CLI implementation caches the cloud catalog response
121
+ * after the first lookup to keep deploys cheap.
122
+ */
123
+ export interface ProviderConfigKeyResolver {
124
+ resolve(provider: string): Promise<string | undefined>;
86
125
  }
87
126
  export interface ConnectAllResult {
88
127
  outcomes: IntegrationConnectOutcome[];
@@ -107,4 +146,16 @@ export interface ConnectAllResult {
107
146
  * `skipped` outcomes (today: fails the deploy at the call site).
108
147
  */
109
148
  export declare function connectIntegrations(input: ConnectAllInput): Promise<ConnectAllResult>;
149
+ /**
150
+ * Resolver backed by `GET /api/v1/integrations/catalog`. The catalog is
151
+ * pulled once on first lookup and cached for the lifetime of this
152
+ * instance. Designed to be plugged into `ConnectAllInput.providerConfigKeys`
153
+ * so the walker can pass a `expectedConfigKey` into `isConnected` calls.
154
+ */
155
+ export declare function relayfileCatalogConfigKeyResolver(opts: {
156
+ apiUrl: string;
157
+ workspaceToken: string | (() => string | Promise<string>);
158
+ fetch?: typeof fetch;
159
+ io?: Pick<DeployIO, 'warn'>;
160
+ }): ProviderConfigKeyResolver;
110
161
  //# sourceMappingURL=connect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAkBtE;;;;;;;;;GASG;AACH,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,WAAW,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,2EAA2E;IAC3E,OAAO,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3F;AAED;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5F;AAED;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,0BAA0B,CAcnE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,GAAG,0BAA0B,CAiE7B;AAUD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,QAAQ,CAAC;IACb,YAAY,EAAE,0BAA0B,CAAC;IACzC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,+BAA+B,CAAC;IAC/C,0DAA0D;IAC1D,YAAY,CAAC,EAAE,4BAA4B,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+I3F"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
package/dist/connect.js CHANGED
@@ -41,11 +41,24 @@ export function relayfileIntegrationResolver(opts) {
41
41
  const sleepImpl = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
42
42
  const apiUrl = opts.apiUrl.replace(/\/+$/, '');
43
43
  return {
44
- async isConnected({ workspace, provider }) {
44
+ async isConnected({ workspace, provider, source, expectedConfigKey }) {
45
45
  const workspaceId = workspace || opts.workspaceId;
46
46
  const token = await resolveWorkspaceToken(opts.workspaceToken);
47
- const body = await requestJson(fetchImpl, `${apiUrl}/api/v1/workspaces/${encodeURIComponent(workspaceId)}/integrations`, token);
48
- return listHasConnectedProvider(body, provider);
47
+ const effectiveSource = source ?? { kind: 'deployer_user' };
48
+ const list = await fetchIntegrationsForScope({
49
+ fetchImpl,
50
+ apiUrl,
51
+ token,
52
+ workspaceId,
53
+ source: effectiveSource,
54
+ io
55
+ });
56
+ return listHasConnectedProvider(list, provider, {
57
+ ...(expectedConfigKey ? { expectedConfigKey } : {}),
58
+ ...(effectiveSource.kind === 'workspace_service_account'
59
+ ? { serviceAccountName: effectiveSource.name }
60
+ : {})
61
+ });
49
62
  },
50
63
  async connect({ workspace, provider }) {
51
64
  const workspaceId = workspace || opts.workspaceId;
@@ -114,8 +127,13 @@ export async function connectIntegrations(input) {
114
127
  const integrations = input.persona.integrations ?? {};
115
128
  const outcomes = [];
116
129
  for (const provider of Object.keys(integrations)) {
130
+ const integrationEntry = integrations[provider] ?? {};
131
+ const source = integrationEntry.source ?? { kind: 'deployer_user' };
132
+ const expectedConfigKey = input.providerConfigKeys
133
+ ? await input.providerConfigKeys.resolve(provider).catch(() => undefined)
134
+ : undefined;
117
135
  let statusCheckFailure;
118
- let connected = await checkProviderConnected(input, provider, (message) => {
136
+ let connected = await checkProviderConnected(input, provider, source, expectedConfigKey, (message) => {
119
137
  statusCheckFailure = message;
120
138
  });
121
139
  if (connected) {
@@ -135,7 +153,7 @@ export async function connectIntegrations(input) {
135
153
  });
136
154
  if (recovered) {
137
155
  statusCheckFailure = undefined;
138
- connected = await checkProviderConnected(input, provider, (message) => {
156
+ connected = await checkProviderConnected(input, provider, source, expectedConfigKey, (message) => {
139
157
  statusCheckFailure = message;
140
158
  });
141
159
  if (connected) {
@@ -223,9 +241,14 @@ export async function connectIntegrations(input) {
223
241
  ...(subscriptionProvider ? { subscriptionProvider } : {})
224
242
  };
225
243
  }
226
- async function checkProviderConnected(input, provider, onFailure) {
244
+ async function checkProviderConnected(input, provider, source, expectedConfigKey, onFailure) {
227
245
  return await input.integrations
228
- .isConnected({ workspace: input.workspace, provider })
246
+ .isConnected({
247
+ workspace: input.workspace,
248
+ provider,
249
+ source,
250
+ ...(expectedConfigKey ? { expectedConfigKey } : {})
251
+ })
229
252
  .catch((err) => {
230
253
  const message = err instanceof Error ? err.message : String(err);
231
254
  onFailure(message);
@@ -233,6 +256,14 @@ async function checkProviderConnected(input, provider, onFailure) {
233
256
  return false;
234
257
  });
235
258
  }
259
+ function cloudRequestError(message, status) {
260
+ const err = new Error(message);
261
+ err.status = status;
262
+ return err;
263
+ }
264
+ function isCloudRequestError(err) {
265
+ return err instanceof Error && typeof err.status === 'number';
266
+ }
236
267
  async function requestJson(fetchImpl, url, token, init = {}) {
237
268
  const res = await fetchImpl(url, {
238
269
  ...init,
@@ -243,13 +274,13 @@ async function requestJson(fetchImpl, url, token, init = {}) {
243
274
  }
244
275
  });
245
276
  if (res.status === 401) {
246
- throw new Error('cloud integration request failed: unauthorized. Your active workspace session is invalid or expired. Run `agentworkforce login --workspace <id-or-slug>` to refresh, then retry.');
277
+ throw cloudRequestError('cloud integration request failed: unauthorized. Your active workspace session is invalid or expired. Run `agentworkforce login --workspace <id-or-slug>` to refresh, then retry.', 401);
247
278
  }
248
279
  if (res.status === 403) {
249
- throw new Error('cloud integration request failed: forbidden. The active account is not authorized for this workspace. Run `agentworkforce login --workspace <id-or-slug>` against an account with access, then retry.');
280
+ throw cloudRequestError('cloud integration request failed: forbidden. The active account is not authorized for this workspace. Run `agentworkforce login --workspace <id-or-slug>` against an account with access, then retry.', 403);
250
281
  }
251
282
  if (!res.ok) {
252
- throw new Error(`cloud integration request failed: ${res.status} ${await res.text().catch(() => '')}`.trim());
283
+ throw cloudRequestError(`cloud integration request failed: ${res.status} ${await res.text().catch(() => '')}`.trim(), res.status);
253
284
  }
254
285
  return await res.json();
255
286
  }
@@ -262,7 +293,44 @@ function isIntegrationUnauthorizedFailure(message) {
262
293
  async function resolveWorkspaceToken(token) {
263
294
  return typeof token === 'function' ? await token() : token;
264
295
  }
265
- function listHasConnectedProvider(body, provider) {
296
+ /**
297
+ * Fetch the integrations list backing the persona's declared `source`.
298
+ *
299
+ * - `deployer_user` (the default) → `GET /api/v1/me/integrations`
300
+ * (reads `user_integrations` for the authed cloud user, per
301
+ * `AgentWorkforce/cloud#988`).
302
+ * - `workspace` / `workspace_service_account` → `GET /api/v1/workspaces/<id>/integrations`
303
+ * (reads `workspace_integrations`).
304
+ *
305
+ * Backwards-compat: if `/me/integrations` is unavailable (older cloud that
306
+ * hasn't shipped cloud#988 yet), fall back to the workspace endpoint with a
307
+ * warning. Authors deploying personas with `source: { kind: 'deployer_user' }`
308
+ * against an older cloud will see false negatives, but the deploy still
309
+ * surfaces a clean error rather than silently mis-resolving.
310
+ */
311
+ async function fetchIntegrationsForScope(args) {
312
+ if (args.source.kind === 'deployer_user') {
313
+ const url = `${args.apiUrl}/api/v1/me/integrations`;
314
+ try {
315
+ return await requestJson(args.fetchImpl, url, args.token);
316
+ }
317
+ catch (err) {
318
+ // Only fall back when the endpoint itself is missing (older cloud that
319
+ // hasn't shipped cloud#988). Any other failure — auth, 5xx, network —
320
+ // must propagate so callers see the real error and can drive the
321
+ // existing auth-recovery flow rather than silently masking the cause.
322
+ if (isCloudRequestError(err) && (err.status === 404 || err.status === 405)) {
323
+ args.io?.warn?.('cloud does not expose /api/v1/me/integrations yet; falling back to the workspace integrations list. ' +
324
+ 'Deployer-user-scoped connections may show as not-connected. ' +
325
+ 'Tracking in AgentWorkforce/cloud#988.');
326
+ return await requestJson(args.fetchImpl, `${args.apiUrl}/api/v1/workspaces/${encodeURIComponent(args.workspaceId)}/integrations`, args.token);
327
+ }
328
+ throw err;
329
+ }
330
+ }
331
+ return await requestJson(args.fetchImpl, `${args.apiUrl}/api/v1/workspaces/${encodeURIComponent(args.workspaceId)}/integrations`, args.token);
332
+ }
333
+ function listHasConnectedProvider(body, provider, opts = {}) {
266
334
  const candidates = Array.isArray(body)
267
335
  ? body
268
336
  : body && typeof body === 'object' && Array.isArray(body.integrations)
@@ -272,9 +340,35 @@ function listHasConnectedProvider(body, provider) {
272
340
  if (!item || typeof item !== 'object' || Array.isArray(item))
273
341
  return false;
274
342
  const record = item;
275
- return record.provider === provider && isConnectedStatus(record);
343
+ if (record.provider !== provider)
344
+ return false;
345
+ if (opts.expectedConfigKey) {
346
+ const rowConfigKey = readString(record, 'providerConfigKey');
347
+ // If the row carries a providerConfigKey, enforce strict match.
348
+ // If the field is missing entirely (older cloud that hasn't shipped
349
+ // cloud#988), fall through to status-only matching — the cloud
350
+ // server will still resolve the right config-key at dispatch time.
351
+ if (rowConfigKey !== undefined && rowConfigKey !== opts.expectedConfigKey) {
352
+ return false;
353
+ }
354
+ }
355
+ if (opts.serviceAccountName) {
356
+ const rowName = readString(record, 'name') ?? readString(record, 'serviceAccountName');
357
+ if (rowName !== opts.serviceAccountName)
358
+ return false;
359
+ }
360
+ return isConnectedStatus(record);
276
361
  });
277
362
  }
363
+ /**
364
+ * A row counts as "connected" only when the cloud's derived state is
365
+ * affirmatively healthy. The previous implementation also accepted "any
366
+ * truthy connectionId" as a yes, which produced false positives whenever a
367
+ * stale row was left behind by an abandoned OAuth attempt. The cloud now
368
+ * derives `status` from `initialSync + writeback` (see
369
+ * `cloud/packages/web/app/api/v1/workspaces/[workspaceId]/integrations/route.ts:62`),
370
+ * so trusting that field is both correct and sufficient.
371
+ */
278
372
  function isConnectedStatus(value) {
279
373
  if (!value || typeof value !== 'object' || Array.isArray(value))
280
374
  return false;
@@ -285,12 +379,52 @@ function isConnectedStatus(value) {
285
379
  || record.state === 'connected'
286
380
  || record.state === 'ready'
287
381
  || record.ready === true
288
- || Boolean(record.connectionId)
289
- || Boolean(record.currentConnectionId)
290
382
  || (record.oauth !== null
291
383
  && typeof record.oauth === 'object'
292
384
  && record.oauth.connected === true);
293
385
  }
386
+ /**
387
+ * Resolver backed by `GET /api/v1/integrations/catalog`. The catalog is
388
+ * pulled once on first lookup and cached for the lifetime of this
389
+ * instance. Designed to be plugged into `ConnectAllInput.providerConfigKeys`
390
+ * so the walker can pass a `expectedConfigKey` into `isConnected` calls.
391
+ */
392
+ export function relayfileCatalogConfigKeyResolver(opts) {
393
+ const fetchImpl = opts.fetch ?? fetch;
394
+ const apiUrl = opts.apiUrl.replace(/\/+$/, '');
395
+ let cache = null;
396
+ const load = async () => {
397
+ const token = await resolveWorkspaceToken(opts.workspaceToken);
398
+ const body = await requestJson(fetchImpl, `${apiUrl}/api/v1/integrations/catalog`, token);
399
+ const entries = Array.isArray(body)
400
+ ? body
401
+ : body && typeof body === 'object' && Array.isArray(body.providers)
402
+ ? body.providers
403
+ : [];
404
+ const map = new Map();
405
+ for (const entry of entries) {
406
+ const id = readString(entry, 'id');
407
+ const configKey = readString(entry, 'configKey') ?? readString(entry, 'defaultConfigKey');
408
+ if (id && configKey)
409
+ map.set(id, configKey);
410
+ }
411
+ return map;
412
+ };
413
+ return {
414
+ async resolve(provider) {
415
+ if (!cache) {
416
+ cache = load().catch((err) => {
417
+ const message = err instanceof Error ? err.message : String(err);
418
+ opts.io?.warn?.(`cloud integration catalog fetch failed (${message}); falling back to provider-name-only matching for this deploy`);
419
+ cache = null;
420
+ return new Map();
421
+ });
422
+ }
423
+ const map = await cache;
424
+ return map.get(provider);
425
+ }
426
+ };
427
+ }
294
428
  function readString(value, field) {
295
429
  if (!value || typeof value !== 'object' || Array.isArray(value))
296
430
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { connectIntegrations, relayfileIntegrationResolver } from './connect.js';
3
+ import { connectIntegrations, relayfileCatalogConfigKeyResolver, relayfileIntegrationResolver } from './connect.js';
4
4
  import { createBufferedIO } from './io.js';
5
5
  function okJson(body, status = 200) {
6
6
  return new Response(JSON.stringify(body), {
@@ -8,7 +8,7 @@ function okJson(body, status = 200) {
8
8
  headers: { 'content-type': 'application/json' }
9
9
  });
10
10
  }
11
- test('relayfileIntegrationResolver isConnected reads the cloud integration list', async () => {
11
+ test('relayfileIntegrationResolver isConnected defaults to /me/integrations (deployer_user)', async () => {
12
12
  const urls = [];
13
13
  const resolver = relayfileIntegrationResolver({
14
14
  apiUrl: 'https://cloud.example.test',
@@ -17,17 +17,168 @@ test('relayfileIntegrationResolver isConnected reads the cloud integration list'
17
17
  fetch: async (url) => {
18
18
  urls.push(String(url));
19
19
  return okJson([
20
- { provider: 'github', status: 'ready', connectionId: 'conn-1' }
20
+ { provider: 'github', providerConfigKey: 'github-relay', status: 'ready' }
21
21
  ]);
22
22
  }
23
23
  });
24
24
  assert.equal(await resolver.isConnected({ workspace: 'ws-runtime', provider: 'github' }), true);
25
25
  assert.equal(await resolver.isConnected({ workspace: 'ws-runtime', provider: 'notion' }), false);
26
26
  assert.deepEqual(urls, [
27
- 'https://cloud.example.test/api/v1/workspaces/ws-runtime/integrations',
27
+ 'https://cloud.example.test/api/v1/me/integrations',
28
+ 'https://cloud.example.test/api/v1/me/integrations'
29
+ ]);
30
+ });
31
+ test('relayfileIntegrationResolver isConnected hits /workspaces/<id>/integrations for workspace source', async () => {
32
+ const urls = [];
33
+ const resolver = relayfileIntegrationResolver({
34
+ apiUrl: 'https://cloud.example.test',
35
+ workspaceId: 'ws-1',
36
+ workspaceToken: 'tok',
37
+ fetch: async (url) => {
38
+ urls.push(String(url));
39
+ return okJson([
40
+ { provider: 'github', providerConfigKey: 'github-relay', status: 'ready' }
41
+ ]);
42
+ }
43
+ });
44
+ assert.equal(await resolver.isConnected({
45
+ workspace: 'ws-runtime',
46
+ provider: 'github',
47
+ source: { kind: 'workspace' }
48
+ }), true);
49
+ assert.deepEqual(urls, [
28
50
  'https://cloud.example.test/api/v1/workspaces/ws-runtime/integrations'
29
51
  ]);
30
52
  });
53
+ test('relayfileIntegrationResolver isConnected rejects rows whose providerConfigKey does not match', async () => {
54
+ // Workspace has slack-ricky connected. Persona declares plain `slack`, which
55
+ // should resolve to slack-relay. The row exists with provider:'slack' but
56
+ // backed by a different config-key → must NOT count as connected.
57
+ const resolver = relayfileIntegrationResolver({
58
+ apiUrl: 'https://cloud.example.test',
59
+ workspaceId: 'ws-1',
60
+ workspaceToken: 'tok',
61
+ fetch: async () => okJson([{ provider: 'slack', providerConfigKey: 'slack-ricky', status: 'ready' }])
62
+ });
63
+ assert.equal(await resolver.isConnected({
64
+ workspace: 'ws-1',
65
+ provider: 'slack',
66
+ expectedConfigKey: 'slack-relay'
67
+ }), false);
68
+ });
69
+ test('relayfileIntegrationResolver isConnected accepts a matching providerConfigKey', async () => {
70
+ const resolver = relayfileIntegrationResolver({
71
+ apiUrl: 'https://cloud.example.test',
72
+ workspaceId: 'ws-1',
73
+ workspaceToken: 'tok',
74
+ fetch: async () => okJson([{ provider: 'slack', providerConfigKey: 'slack-relay', status: 'ready' }])
75
+ });
76
+ assert.equal(await resolver.isConnected({
77
+ workspace: 'ws-1',
78
+ provider: 'slack',
79
+ expectedConfigKey: 'slack-relay'
80
+ }), true);
81
+ });
82
+ test('relayfileIntegrationResolver isConnected falls back to provider-name match when row lacks providerConfigKey', async () => {
83
+ // Older cloud (pre cloud#988) returns rows without providerConfigKey. To
84
+ // avoid hard-failing every deploy until that ships, the matcher treats a
85
+ // missing field as "trust the server" and matches by provider name only.
86
+ const resolver = relayfileIntegrationResolver({
87
+ apiUrl: 'https://cloud.example.test',
88
+ workspaceId: 'ws-1',
89
+ workspaceToken: 'tok',
90
+ fetch: async () => okJson([{ provider: 'slack', status: 'ready' }])
91
+ });
92
+ assert.equal(await resolver.isConnected({
93
+ workspace: 'ws-1',
94
+ provider: 'slack',
95
+ expectedConfigKey: 'slack-relay'
96
+ }), true);
97
+ });
98
+ test('relayfileIntegrationResolver isConnected ignores rows with only a connectionId (no status)', async () => {
99
+ // The previous matcher treated any truthy connectionId as connected. That
100
+ // caused false positives whenever an abandoned OAuth left an orphan row.
101
+ const resolver = relayfileIntegrationResolver({
102
+ apiUrl: 'https://cloud.example.test',
103
+ workspaceId: 'ws-1',
104
+ workspaceToken: 'tok',
105
+ fetch: async () => okJson([{ provider: 'slack', connectionId: 'orphan' }])
106
+ });
107
+ assert.equal(await resolver.isConnected({ workspace: 'ws-1', provider: 'slack' }), false);
108
+ });
109
+ test('relayfileIntegrationResolver isConnected does NOT fall back when /me/integrations returns 5xx with "404" in the body', async () => {
110
+ // Regression: previous implementation regex-matched "404" anywhere in the
111
+ // error message and treated a 500 whose body mentioned "/api/v1/foo/404"
112
+ // (or any other 404 substring) as a missing-endpoint signal. The check
113
+ // must use the explicit HTTP status, not the body text.
114
+ const urls = [];
115
+ const resolver = relayfileIntegrationResolver({
116
+ apiUrl: 'https://cloud.example.test',
117
+ workspaceId: 'ws-1',
118
+ workspaceToken: 'tok',
119
+ fetch: async (url) => {
120
+ urls.push(String(url));
121
+ return new Response('upstream timeout (request 404abc failed)', { status: 500 });
122
+ }
123
+ });
124
+ await assert.rejects(resolver.isConnected({ workspace: 'ws-runtime', provider: 'github' }), /cloud integration request failed: 500/);
125
+ // Only the /me call should have happened — no silent fallback to workspace.
126
+ assert.deepEqual(urls, ['https://cloud.example.test/api/v1/me/integrations']);
127
+ });
128
+ test('relayfileIntegrationResolver isConnected falls back to workspace endpoint when /me/integrations 404s', async () => {
129
+ const io = createBufferedIO();
130
+ const urls = [];
131
+ const resolver = relayfileIntegrationResolver({
132
+ apiUrl: 'https://cloud.example.test',
133
+ workspaceId: 'ws-1',
134
+ workspaceToken: 'tok',
135
+ io,
136
+ fetch: async (url) => {
137
+ urls.push(String(url));
138
+ if (String(url).endsWith('/me/integrations')) {
139
+ return new Response('not found', { status: 404 });
140
+ }
141
+ return okJson([{ provider: 'github', status: 'ready' }]);
142
+ }
143
+ });
144
+ assert.equal(await resolver.isConnected({ workspace: 'ws-runtime', provider: 'github' }), true);
145
+ assert.deepEqual(urls, [
146
+ 'https://cloud.example.test/api/v1/me/integrations',
147
+ 'https://cloud.example.test/api/v1/workspaces/ws-runtime/integrations'
148
+ ]);
149
+ assert.ok(io.messages.some((m) => m.level === 'warn' && /me\/integrations/.test(m.message)));
150
+ });
151
+ test('relayfileCatalogConfigKeyResolver returns the expected configKey and caches the catalog', async () => {
152
+ let calls = 0;
153
+ const resolver = relayfileCatalogConfigKeyResolver({
154
+ apiUrl: 'https://cloud.example.test',
155
+ workspaceToken: 'tok',
156
+ fetch: async () => {
157
+ calls += 1;
158
+ return okJson({
159
+ providers: [
160
+ { id: 'slack', configKey: 'slack-relay' },
161
+ { id: 'github', configKey: 'github-relay' }
162
+ ]
163
+ });
164
+ }
165
+ });
166
+ assert.equal(await resolver.resolve('slack'), 'slack-relay');
167
+ assert.equal(await resolver.resolve('github'), 'github-relay');
168
+ assert.equal(await resolver.resolve('unknown'), undefined);
169
+ assert.equal(calls, 1, 'catalog should be fetched exactly once and cached');
170
+ });
171
+ test('relayfileCatalogConfigKeyResolver returns undefined for every provider when catalog fetch fails', async () => {
172
+ const io = createBufferedIO();
173
+ const resolver = relayfileCatalogConfigKeyResolver({
174
+ apiUrl: 'https://cloud.example.test',
175
+ workspaceToken: 'tok',
176
+ io,
177
+ fetch: async () => new Response('boom', { status: 500 })
178
+ });
179
+ assert.equal(await resolver.resolve('slack'), undefined);
180
+ assert.ok(io.messages.some((m) => m.level === 'warn' && /catalog/.test(m.message)));
181
+ });
31
182
  test('relayfileIntegrationResolver reads the latest workspace token for each request', async () => {
32
183
  let token = 'old-token';
33
184
  const authHeaders = [];
@@ -36,12 +187,13 @@ test('relayfileIntegrationResolver reads the latest workspace token for each req
36
187
  workspaceId: 'ws-1',
37
188
  workspaceToken: () => token,
38
189
  fetch: async (_url, init) => {
39
- authHeaders.push(String(new Headers(init?.headers).get('authorization')));
40
- if (authHeaders.length === 1) {
190
+ const auth = String(new Headers(init?.headers).get('authorization'));
191
+ authHeaders.push(auth);
192
+ if (auth === 'Bearer old-token') {
41
193
  return okJson({ error: 'Unauthorized' }, 401);
42
194
  }
43
195
  return okJson([
44
- { provider: 'github', status: 'ready', connectionId: 'conn-1' }
196
+ { provider: 'github', providerConfigKey: 'github-relay', status: 'ready' }
45
197
  ]);
46
198
  }
47
199
  });