@remixhq/core 0.1.40 → 0.1.42

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/api.d.ts CHANGED
@@ -852,6 +852,9 @@ type ApiClient = {
852
852
  listAppTimeline(appId: string, params?: {
853
853
  limit?: number;
854
854
  cursor?: string;
855
+ includeHistorical?: boolean;
856
+ includeCosts?: boolean;
857
+ includeMergeRequestHistory?: boolean;
855
858
  }): Promise<Json>;
856
859
  getAppTimelineEvent(appId: string, eventId: string): Promise<Json>;
857
860
  listAppEditQueue(appId: string, params?: {
@@ -906,6 +909,8 @@ type ApiClient = {
906
909
  }): Promise<Json>;
907
910
  importFromGithubFirstParty(payload: {
908
911
  repoFullName: string;
912
+ installationId?: number;
913
+ githubRepoId?: number;
909
914
  branch?: string;
910
915
  path?: string;
911
916
  appName?: string;
@@ -918,6 +923,34 @@ type ApiClient = {
918
923
  defaultBranch?: string;
919
924
  repoFingerprint?: string;
920
925
  }): Promise<Json>;
926
+ getGithubStatus(): Promise<Json>;
927
+ startGithubOAuth(): Promise<Json>;
928
+ getGithubInstallUrl(): Promise<Json>;
929
+ syncGithubInstallations(): Promise<Json>;
930
+ listGithubInstallations(): Promise<Json>;
931
+ listGithubRepositories(installationId: number): Promise<Json>;
932
+ linkAppGithubSource(appId: string, payload: {
933
+ installationId: number;
934
+ githubRepoId?: number;
935
+ repoFullName: string;
936
+ branch: string;
937
+ path?: string;
938
+ defaultBranch?: string;
939
+ remoteUrl?: string;
940
+ repoFingerprint?: string;
941
+ headCommitHash?: string;
942
+ }): Promise<Json>;
943
+ getAppGithubPullRequest(appId: string): Promise<Json>;
944
+ createAppGithubPullRequest(appId: string, payload?: {
945
+ title?: string;
946
+ body?: string;
947
+ baseBranch?: string;
948
+ draft?: boolean;
949
+ }): Promise<Json>;
950
+ updateAppGithubPullRequest(appId: string, payload?: {
951
+ title?: string;
952
+ body?: string;
953
+ }): Promise<Json>;
921
954
  forkApp(appId: string, payload?: {
922
955
  name?: string;
923
956
  platform?: string;
package/dist/api.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-QIESQM7X.js";
3
+ } from "./chunk-UN3Q7P5E.js";
4
4
  import "./chunk-7XJGOKEO.js";
5
5
  export {
6
6
  createApiClient
package/dist/auth.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { W as WithRefreshLock, S as SessionStore, a as StoredSession } from './tokenProvider-BP3YfJHm.js';
2
2
  export { R as RefreshLockOptions, e as RefreshStoredSession, f as ResolvedAuthToken, T as TokenProvider, c as createRefreshLock, b as createStoredSessionTokenProvider, s as shouldRefreshSoon, d as storedSessionSchema } from './tokenProvider-BP3YfJHm.js';
3
3
  import { CoreConfig } from './config.js';
4
+ import { R as RemixError } from './cliError-Bels0ULL.js';
4
5
  import 'zod';
5
6
 
6
7
  declare function createLocalSessionStore(params?: {
@@ -46,7 +47,62 @@ declare function createDefaultRefreshLock(filePath?: string): WithRefreshLock;
46
47
  declare function isNetworkError(err: unknown): boolean;
47
48
  declare function isInvalidGrantError(err: unknown): boolean;
48
49
 
50
+ type RemixAuthProvider = "google" | "github";
51
+ type WorkosAuthOrganization = {
52
+ id: string;
53
+ name?: string | null;
54
+ };
55
+ type WorkosAuthFactor = {
56
+ id: string;
57
+ type: string;
58
+ authenticationChallengeId?: string | null;
59
+ };
60
+ type WorkosAuthChallenge = {
61
+ code: string;
62
+ message: string;
63
+ email?: string | null;
64
+ pendingAuthenticationToken?: string | null;
65
+ emailVerificationId?: string | null;
66
+ organizations?: WorkosAuthOrganization[];
67
+ authenticationFactors?: WorkosAuthFactor[];
68
+ user?: {
69
+ id?: string | null;
70
+ email?: string | null;
71
+ firstName?: string | null;
72
+ lastName?: string | null;
73
+ emailVerified?: boolean | null;
74
+ } | null;
75
+ authMethods?: Record<string, boolean> | null;
76
+ connectionIds?: string[];
77
+ ssoConnectionIds?: string[];
78
+ };
79
+ type WorkosContinuationInput = {
80
+ type: "email_verification";
81
+ pendingAuthenticationToken: string;
82
+ code: string;
83
+ } | {
84
+ type: "organization_selection";
85
+ pendingAuthenticationToken: string;
86
+ organizationId: string;
87
+ } | {
88
+ type: "mfa_totp";
89
+ pendingAuthenticationToken: string;
90
+ authenticationChallengeId: string;
91
+ code: string;
92
+ };
93
+ declare class RemixAuthContinuationError extends RemixError {
94
+ readonly challenge: WorkosAuthChallenge;
95
+ constructor(message: string, challenge: WorkosAuthChallenge, statusCode: number);
96
+ }
49
97
  type RemixAuthHelpers = {
98
+ startLogin(params: {
99
+ redirectTo: string;
100
+ state?: string;
101
+ provider?: RemixAuthProvider;
102
+ }): Promise<{
103
+ url: string;
104
+ codeVerifier?: string;
105
+ }>;
50
106
  startGoogleLogin(params: {
51
107
  redirectTo: string;
52
108
  state?: string;
@@ -54,14 +110,22 @@ type RemixAuthHelpers = {
54
110
  url: string;
55
111
  codeVerifier?: string;
56
112
  }>;
113
+ startGithubLogin(params: {
114
+ redirectTo: string;
115
+ state?: string;
116
+ }): Promise<{
117
+ url: string;
118
+ codeVerifier?: string;
119
+ }>;
57
120
  exchangeCode(params: {
58
121
  code: string;
59
122
  codeVerifier?: string;
60
123
  }): Promise<StoredSession>;
124
+ continueAuthentication(input: WorkosContinuationInput): Promise<StoredSession>;
61
125
  refreshWithStoredSession(params: {
62
126
  session: StoredSession;
63
127
  }): Promise<StoredSession>;
64
128
  };
65
129
  declare function createRemixAuthHelpers(config: CoreConfig): RemixAuthHelpers;
66
130
 
67
- export { type RemixAuthHelpers, SessionStore, StoredSession, WithRefreshLock, createDefaultRefreshLock, createLocalSessionStore, createRemixAuthHelpers, defaultSessionFilePath, isInvalidGrantError, isNetworkError };
131
+ export { RemixAuthContinuationError, type RemixAuthHelpers, SessionStore, StoredSession, WithRefreshLock, type WorkosAuthChallenge, type WorkosContinuationInput, createDefaultRefreshLock, createLocalSessionStore, createRemixAuthHelpers, defaultSessionFilePath, isInvalidGrantError, isNetworkError };
package/dist/auth.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import {
2
+ RemixAuthContinuationError,
2
3
  createDefaultRefreshLock,
3
4
  createLocalSessionStore,
4
5
  createRefreshLock,
@@ -9,9 +10,10 @@ import {
9
10
  isNetworkError,
10
11
  shouldRefreshSoon,
11
12
  storedSessionSchema
12
- } from "./chunk-QCRTVR5N.js";
13
+ } from "./chunk-PDX2IQJO.js";
13
14
  import "./chunk-7XJGOKEO.js";
14
15
  export {
16
+ RemixAuthContinuationError,
15
17
  createDefaultRefreshLock,
16
18
  createLocalSessionStore,
17
19
  createRefreshLock,
@@ -288,6 +288,20 @@ function createStoredSessionTokenProvider(params) {
288
288
 
289
289
  // src/auth/supabase.ts
290
290
  import crypto from "crypto";
291
+ var RemixAuthContinuationError = class extends RemixError {
292
+ challenge;
293
+ constructor(message, challenge, statusCode) {
294
+ super(message, { code: challenge.code, exitCode: 1, statusCode });
295
+ this.name = "RemixAuthContinuationError";
296
+ this.challenge = challenge;
297
+ }
298
+ };
299
+ function isRecord(value) {
300
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
301
+ }
302
+ function isWorkosAuthChallenge(value) {
303
+ return isRecord(value) && typeof value.code === "string";
304
+ }
291
305
  async function postBackend(config, path3, body, options) {
292
306
  const response = await fetch(new URL(path3, config.apiUrl), {
293
307
  method: "POST",
@@ -296,6 +310,16 @@ async function postBackend(config, path3, body, options) {
296
310
  body: JSON.stringify(body)
297
311
  });
298
312
  const payload = await response.json();
313
+ if (response.status === 403 && !payload.success && isWorkosAuthChallenge(payload.responseObject)) {
314
+ throw new RemixAuthContinuationError(
315
+ payload.message || payload.responseObject.message || "Authentication continuation required.",
316
+ {
317
+ ...payload.responseObject,
318
+ message: payload.responseObject.message || payload.message || "Authentication continuation required."
319
+ },
320
+ response.status
321
+ );
322
+ }
299
323
  if (!response.ok || !payload.success || payload.responseObject == null) {
300
324
  throw new RemixError(payload.message || `Remix backend request failed with status ${response.status}.`, {
301
325
  exitCode: 1
@@ -332,14 +356,21 @@ function normalizeBrowserReturnTo(redirectTo) {
332
356
  return redirectTo;
333
357
  }
334
358
  function createRemixAuthHelpers(config) {
359
+ async function startLogin(params) {
360
+ const path3 = params.state ? "/v1/auth/cli/login-url" : "/v1/auth/login-url";
361
+ const pkce = params.state ? createPkcePair() : null;
362
+ const body = params.state ? { returnTo: params.redirectTo, state: params.state, codeChallenge: pkce?.codeChallenge, provider: params.provider ?? "google" } : { returnTo: normalizeBrowserReturnTo(params.redirectTo), provider: params.provider ?? "google" };
363
+ const result = await postBackend(config, path3, body, params.state ? void 0 : { credentials: "include" });
364
+ if (!result.url) throw new RemixError("Remix backend did not return an auth URL.", { exitCode: 1 });
365
+ return pkce ? { url: result.url, codeVerifier: pkce.codeVerifier } : { url: result.url };
366
+ }
335
367
  return {
368
+ startLogin,
336
369
  async startGoogleLogin(params) {
337
- const path3 = params.state ? "/v1/auth/cli/login-url" : "/v1/auth/login-url";
338
- const pkce = params.state ? createPkcePair() : null;
339
- const body = params.state ? { returnTo: params.redirectTo, state: params.state, codeChallenge: pkce?.codeChallenge } : { returnTo: normalizeBrowserReturnTo(params.redirectTo) };
340
- const result = await postBackend(config, path3, body, params.state ? void 0 : { credentials: "include" });
341
- if (!result.url) throw new RemixError("Remix backend did not return an auth URL.", { exitCode: 1 });
342
- return pkce ? { url: result.url, codeVerifier: pkce.codeVerifier } : { url: result.url };
370
+ return startLogin({ ...params, provider: "google" });
371
+ },
372
+ async startGithubLogin(params) {
373
+ return startLogin({ ...params, provider: "github" });
343
374
  },
344
375
  async exchangeCode(params) {
345
376
  const result = await postBackend(config, "/v1/auth/cli/exchange", {
@@ -348,6 +379,10 @@ function createRemixAuthHelpers(config) {
348
379
  });
349
380
  return toStoredSession(result);
350
381
  },
382
+ async continueAuthentication(input) {
383
+ const result = await postBackend(config, "/v1/auth/cli/continue", input);
384
+ return toStoredSession(result);
385
+ },
351
386
  async refreshWithStoredSession(params) {
352
387
  const result = await postBackend(config, "/v1/auth/token/refresh", {
353
388
  refreshToken: params.session.refresh_token
@@ -367,5 +402,6 @@ export {
367
402
  isInvalidGrantError,
368
403
  shouldRefreshSoon,
369
404
  createStoredSessionTokenProvider,
405
+ RemixAuthContinuationError,
370
406
  createRemixAuthHelpers
371
407
  };
@@ -73,6 +73,11 @@ function buildAppTimelineQuery(params) {
73
73
  const qs = new URLSearchParams();
74
74
  if (typeof params?.limit === "number") qs.set("limit", String(params.limit));
75
75
  if (params?.cursor) qs.set("cursor", params.cursor);
76
+ if (typeof params?.includeHistorical === "boolean") qs.set("includeHistorical", String(params.includeHistorical));
77
+ if (typeof params?.includeCosts === "boolean") qs.set("includeCosts", String(params.includeCosts));
78
+ if (typeof params?.includeMergeRequestHistory === "boolean") {
79
+ qs.set("includeMergeRequestHistory", String(params.includeMergeRequestHistory));
80
+ }
76
81
  return suffix(qs);
77
82
  }
78
83
  function buildAppEditQueueQuery(params) {
@@ -279,6 +284,25 @@ function createApiClient(config, opts) {
279
284
  body: JSON.stringify(payload ?? {})
280
285
  }),
281
286
  getAppPreview: (appId, params) => request(`/v1/apps/${encodeURIComponent(appId)}/preview${buildAppPreviewQuery(params)}`, { method: "GET" }),
287
+ getGithubStatus: () => request("/v1/github/status", { method: "GET" }),
288
+ startGithubOAuth: () => request("/v1/github/oauth/start", { method: "GET" }),
289
+ getGithubInstallUrl: () => request("/v1/github/install-url", { method: "GET" }),
290
+ syncGithubInstallations: () => request("/v1/github/installations/sync", { method: "POST" }),
291
+ listGithubInstallations: () => request("/v1/github/installations", { method: "GET" }),
292
+ listGithubRepositories: (installationId) => request(`/v1/github/installations/${encodeURIComponent(String(installationId))}/repositories`, { method: "GET" }),
293
+ linkAppGithubSource: (appId, payload) => request(`/v1/apps/${encodeURIComponent(appId)}/github/link`, {
294
+ method: "POST",
295
+ body: JSON.stringify(payload)
296
+ }),
297
+ getAppGithubPullRequest: (appId) => request(`/v1/apps/${encodeURIComponent(appId)}/github/pull-request`, { method: "GET" }),
298
+ createAppGithubPullRequest: (appId, payload) => request(`/v1/apps/${encodeURIComponent(appId)}/github/pull-request`, {
299
+ method: "POST",
300
+ body: JSON.stringify(payload ?? {})
301
+ }),
302
+ updateAppGithubPullRequest: (appId, payload) => request(`/v1/apps/${encodeURIComponent(appId)}/github/pull-request`, {
303
+ method: "PATCH",
304
+ body: JSON.stringify(payload ?? {})
305
+ }),
282
306
  createAppShareLink: (appId, payload) => request(`/v1/apps/${encodeURIComponent(appId)}/share-links`, {
283
307
  method: "POST",
284
308
  body: JSON.stringify(payload ?? {})
@@ -0,0 +1,14 @@
1
+ declare class RemixError extends Error {
2
+ readonly code: string | null;
3
+ readonly exitCode: number;
4
+ readonly hint: string | null;
5
+ readonly statusCode: number | null;
6
+ constructor(message: string, opts?: {
7
+ code?: string | null;
8
+ exitCode?: number;
9
+ hint?: string | null;
10
+ statusCode?: number | null;
11
+ });
12
+ }
13
+
14
+ export { RemixError as R };
package/dist/errors.d.ts CHANGED
@@ -1,15 +1,4 @@
1
- declare class RemixError extends Error {
2
- readonly code: string | null;
3
- readonly exitCode: number;
4
- readonly hint: string | null;
5
- readonly statusCode: number | null;
6
- constructor(message: string, opts?: {
7
- code?: string | null;
8
- exitCode?: number;
9
- hint?: string | null;
10
- statusCode?: number | null;
11
- });
12
- }
1
+ export { R as CliError, R as RemixError } from './cliError-Bels0ULL.js';
13
2
 
14
3
  declare const REMIX_ERROR_CODES: {
15
4
  readonly REPO_LOCK_HELD: "REPO_LOCK_HELD";
@@ -20,4 +9,4 @@ declare const REMIX_ERROR_CODES: {
20
9
  };
21
10
  type RemixErrorCode = (typeof REMIX_ERROR_CODES)[keyof typeof REMIX_ERROR_CODES];
22
11
 
23
- export { RemixError as CliError, REMIX_ERROR_CODES, RemixError, type RemixErrorCode };
12
+ export { REMIX_ERROR_CODES, type RemixErrorCode };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- export { CliError, REMIX_ERROR_CODES, CliError as RemixError, RemixErrorCode } from './errors.js';
1
+ export { R as CliError, R as RemixError } from './cliError-Bels0ULL.js';
2
+ export { REMIX_ERROR_CODES, RemixErrorCode } from './errors.js';
2
3
  export { CoreConfig, ResolveConfigOptions, configSchema, resolveConfig } from './config.js';
3
4
  export { S as SessionStore, a as StoredSession, W as WithRefreshLock, c as createRefreshLock, b as createStoredSessionTokenProvider, s as shouldRefreshSoon, d as storedSessionSchema } from './tokenProvider-BP3YfJHm.js';
4
- export { createDefaultRefreshLock, createLocalSessionStore, createRemixAuthHelpers, defaultSessionFilePath, isInvalidGrantError, isNetworkError } from './auth.js';
5
+ export { RemixAuthContinuationError, WorkosAuthChallenge, WorkosContinuationInput, createDefaultRefreshLock, createLocalSessionStore, createRemixAuthHelpers, defaultSessionFilePath, isInvalidGrantError, isNetworkError } from './auth.js';
5
6
  export { AgentMemoryItem, AgentMemoryKind, AgentMemorySearchItem, AgentMemorySearchResponse, AgentMemorySummary, AgentMemoryTimelineResponse, ApiClient, AppContext, AppContextAccessPath, AppPreviewExpectedKind, AppPreviewProcessStatus, AppPreviewQuery, AppPreviewResponse, AppReconcileResponse, AppSandboxCommandRun, AppShareLinkSummary, Bundle, BundlePlatform, BundleStatus, ChangeStepDiffResponse, CreateAppShareLinkPayload, DetectProjectRuntimeTargetsPayload, ImportProjectRuntimeEnvPayload, InitiateBundleRequest, InvitationRecord, MergeRequest, MergeRequestReview, MergeRequestStatus, MobileQrPayloads, ProjectRuntimeEnvMetadata, ProjectRuntimeEnvScope, ProjectRuntimeTargetMetadata, ProjectRuntimeTargetScope, ProjectTrigger, ProjectTriggerPayload, ProjectTriggerScope, ProjectTriggerStep, ProjectTriggerStepPayload, ReconcilePreflightResponse, ResolveProjectRuntimeEnvForLocalPullResponse, RunAppRuntimeTargetPayload, RunAppSandboxCommandPayload, RunAppTriggerEventPayload, RunAppTriggerPayload, RuntimeCommandKind, RuntimeTargetKind, SetProjectRuntimeEnvPayload, SetProjectRuntimeTargetPayload, SyncLocalResponse, SyncUpstreamResponse, TriggerEventMetadata, TriggerEventSource, TriggerIntegrationStatus, TriggerMode, TriggerRun, TriggerStepRun, TriggerStepType, UpdateProjectTriggerPayload, createApiClient } from './api.js';
6
7
  import 'zod';
7
8
  import './contracts-DTeSJnoC.js';
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-QIESQM7X.js";
3
+ } from "./chunk-UN3Q7P5E.js";
4
4
  import {
5
+ RemixAuthContinuationError,
5
6
  createDefaultRefreshLock,
6
7
  createLocalSessionStore,
7
8
  createRefreshLock,
@@ -12,7 +13,7 @@ import {
12
13
  isNetworkError,
13
14
  shouldRefreshSoon,
14
15
  storedSessionSchema
15
- } from "./chunk-QCRTVR5N.js";
16
+ } from "./chunk-PDX2IQJO.js";
16
17
  import {
17
18
  configSchema,
18
19
  resolveConfig
@@ -27,6 +28,7 @@ import {
27
28
  export {
28
29
  RemixError as CliError,
29
30
  REMIX_ERROR_CODES,
31
+ RemixAuthContinuationError,
30
32
  RemixError,
31
33
  configSchema,
32
34
  createApiClient,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remixhq/core",
3
- "version": "0.1.40",
3
+ "version": "0.1.42",
4
4
  "description": "Remix core library",
5
5
  "homepage": "https://github.com/RemixDotOne/remix-core",
6
6
  "license": "MIT",