@fml-inc/fml 0.8.7 → 0.8.9

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fml",
3
- "version": "0.8.7",
3
+ "version": "0.8.9",
4
4
  "description": "FML agent tools for Claude Code",
5
5
  "mcpServers": {
6
6
  "fml": {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runRawSyncOnce
3
- } from "./chunk-5JJQWV4G.js";
3
+ } from "./chunk-JPHN4VKM.js";
4
4
  import {
5
5
  resolvePackageRoot
6
6
  } from "./chunk-F57IFY3K.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  FML_HOOK_CAPTURE_DISABLED_FILE,
3
3
  FML_OBSERVER_LOG_FILE
4
- } from "./chunk-B3H2YWPJ.js";
4
+ } from "./chunk-HDAFEHUY.js";
5
5
 
6
6
  // src/json-file.ts
7
7
  import { randomUUID } from "crypto";
@@ -7,7 +7,7 @@ import {
7
7
  getSelectedOrg,
8
8
  getSiteUrlForConvexUrl,
9
9
  getValidToken
10
- } from "./chunk-B3H2YWPJ.js";
10
+ } from "./chunk-HDAFEHUY.js";
11
11
 
12
12
  // src/fml-client.ts
13
13
  var LOGIN_EXPIRED_MESSAGE = "Authentication expired. Run `fml login` to sign in again, then restart Claude Code.";
@@ -79,7 +79,7 @@ function createFmlClient(token, options = {}) {
79
79
  const repo = resolveRepoFromCwd(process.cwd());
80
80
  if (repo) body.repo = repo.repo;
81
81
  if (isServiceToken) {
82
- const { readTokens, SERVICE_TOKEN_LOGIN_USER_ID } = await import("./token-store-ORR5MIJL.js");
82
+ const { readTokens, SERVICE_TOKEN_LOGIN_USER_ID } = await import("./token-store-GYU3AXBK.js");
83
83
  const stored = readTokens(options.envName);
84
84
  const storedUserExternalId = stored?.tokenType === "service" && stored.user.id !== SERVICE_TOKEN_LOGIN_USER_ID ? stored.user.id : void 0;
85
85
  const userExternalId = process.env.FML_USER_EXTERNAL_ID ?? storedUserExternalId;
@@ -3,7 +3,7 @@ import {
3
3
  FML_OBSERVER_LOCK_FILE,
4
4
  FML_OBSERVER_PORT,
5
5
  FML_OBSERVER_STATE_FILE
6
- } from "./chunk-B3H2YWPJ.js";
6
+ } from "./chunk-HDAFEHUY.js";
7
7
 
8
8
  // ../../packages/panopticon/src/observer/auth.ts
9
9
  import crypto from "crypto";
@@ -193,6 +193,7 @@ function ensureDirs() {
193
193
 
194
194
  // src/config.ts
195
195
  var DEFAULT_PROD_URL = "https://api.fml.inc";
196
+ var DEFAULT_SYNC_URL = DEFAULT_PROD_URL;
196
197
  var DEFAULT_TARGET_NAME = "fml";
197
198
  var LEGACY_HOSTED_BACKEND_URLS = [
198
199
  "https://trustworthy-chihuahua-382.convex.site"
@@ -338,9 +339,6 @@ function getSiteUrlForConvexUrl(convexUrl) {
338
339
  var initialized = false;
339
340
  var sentry = null;
340
341
  var client = null;
341
- function isSentryEnabled() {
342
- return process.env.SENTRY_ENABLED === "true";
343
- }
344
342
  async function loadSentry() {
345
343
  if (sentry) return sentry;
346
344
  try {
@@ -350,15 +348,35 @@ async function loadSentry() {
350
348
  return null;
351
349
  }
352
350
  }
353
- async function initSentry() {
354
- if (initialized) return;
351
+ async function initSentry(forceRefresh = false) {
352
+ if (initialized && !forceRefresh) return;
355
353
  initialized = true;
356
- if (!isSentryEnabled()) return;
354
+ let config;
355
+ try {
356
+ const { resolveCliSentryConfig } = await import("./telemetry-config-HRSNDMTG.js");
357
+ config = process.env.SENTRY_ENABLED === "false" ? null : await resolveCliSentryConfig(
358
+ process.env.SENTRY_ENABLED === "true" && true ? "https://4c243521c03917c886d0bf33bc0038c8@o4510167429873664.ingest.us.sentry.io/4511078213156864" : "",
359
+ forceRefresh
360
+ );
361
+ } catch {
362
+ config = null;
363
+ }
364
+ if (client) {
365
+ try {
366
+ await client.close(2e3);
367
+ } catch {
368
+ }
369
+ client = null;
370
+ }
371
+ if (!config?.dsn) {
372
+ sentry?.getCurrentScope().setClient(void 0);
373
+ return;
374
+ }
357
375
  const mod = await loadSentry();
358
376
  if (!mod) return;
359
377
  client = new mod.ServerRuntimeClient({
360
- dsn: "https://4c243521c03917c886d0bf33bc0038c8@o4510167429873664.ingest.us.sentry.io/4511078213156864",
361
- environment: process.env.DEPLOYMENT_ENV ?? process.env.NODE_ENV ?? "production",
378
+ dsn: config.dsn,
379
+ environment: config.environment,
362
380
  tracesSampleRate: 0,
363
381
  integrations: [],
364
382
  stackParser: mod.createStackParser(mod.nodeStackLineParser()),
@@ -1378,7 +1396,7 @@ async function getValidToken(opts) {
1378
1396
  return stored.accessToken;
1379
1397
  }
1380
1398
  if (stored.tokenType === "service") {
1381
- return await getOrStartTokenRefresh(
1399
+ const accessToken2 = await getOrStartTokenRefresh(
1382
1400
  serviceRefreshPromises,
1383
1401
  key,
1384
1402
  forceRefresh,
@@ -1424,6 +1442,12 @@ async function getValidToken(opts) {
1424
1442
  }),
1425
1443
  opts?.signal
1426
1444
  );
1445
+ await refreshTelemetryConfigAfterTokenRefresh(
1446
+ envName,
1447
+ accessToken2,
1448
+ opts?.signal
1449
+ );
1450
+ return accessToken2;
1427
1451
  }
1428
1452
  if (stored.refreshInvalidAt) {
1429
1453
  console.error(
@@ -1431,13 +1455,34 @@ async function getValidToken(opts) {
1431
1455
  );
1432
1456
  return null;
1433
1457
  }
1434
- return await getOrStartTokenRefresh(
1458
+ const accessToken = await getOrStartTokenRefresh(
1435
1459
  oauthRefreshPromises,
1436
1460
  key,
1437
1461
  forceRefresh,
1438
1462
  () => refreshTokenWithLock(envName, forceRefresh, opts?.signal),
1439
1463
  opts?.signal
1440
1464
  );
1465
+ await refreshTelemetryConfigAfterTokenRefresh(
1466
+ envName,
1467
+ accessToken,
1468
+ opts?.signal
1469
+ );
1470
+ return accessToken;
1471
+ }
1472
+ async function refreshTelemetryConfigAfterTokenRefresh(envName, accessToken, signal) {
1473
+ if (!accessToken || signal?.aborted) return;
1474
+ try {
1475
+ const current = readTokens(envName);
1476
+ if (current?.accessToken !== accessToken) return;
1477
+ const { refreshCliTelemetryConfig } = await import("./telemetry-config-HRSNDMTG.js");
1478
+ await refreshCliTelemetryConfig({
1479
+ envName,
1480
+ accessToken,
1481
+ siteUrl: current.siteUrl,
1482
+ signal
1483
+ });
1484
+ } catch {
1485
+ }
1441
1486
  }
1442
1487
  async function refreshTokenWithLock(envName, forceRefresh = false, signal) {
1443
1488
  const lock = await acquireRefreshLock(envName, signal);
@@ -1543,7 +1588,9 @@ async function refreshToken(stored, lock, envName, signal) {
1543
1588
  },
1544
1589
  orgId: stored.orgId,
1545
1590
  orgSlug: stored.orgSlug,
1546
- workosClientId: stored.workosClientId
1591
+ workosClientId: stored.workosClientId,
1592
+ // The backend this login belongs to does not change on rotation.
1593
+ ...stored.siteUrl ? { siteUrl: stored.siteUrl } : {}
1547
1594
  };
1548
1595
  const pendingPath = stagePendingOAuthRefresh(
1549
1596
  stored.refreshToken,
@@ -1580,8 +1627,6 @@ async function refreshToken(stored, lock, envName, signal) {
1580
1627
  }
1581
1628
 
1582
1629
  export {
1583
- initSentry,
1584
- Sentry,
1585
1630
  resolveFmlDefaultDirectories,
1586
1631
  FML_DATA_DIR,
1587
1632
  FML_STATE_DIR,
@@ -1606,6 +1651,7 @@ export {
1606
1651
  observerOnlyOverrideWarning,
1607
1652
  ensureDirs,
1608
1653
  DEFAULT_PROD_URL,
1654
+ DEFAULT_SYNC_URL,
1609
1655
  DEFAULT_TARGET_NAME,
1610
1656
  isHostedBackendUrl,
1611
1657
  isValidEnvName,
@@ -1632,5 +1678,7 @@ export {
1632
1678
  SERVICE_TOKEN_LOGIN_USER_ID,
1633
1679
  clearStoredCredentials,
1634
1680
  storeServiceRefreshToken,
1635
- getValidToken
1681
+ getValidToken,
1682
+ initSentry,
1683
+ Sentry
1636
1684
  };
@@ -6,7 +6,7 @@ import {
6
6
  getSiteUrlForConvexUrl,
7
7
  getSyncDestinationIdentity,
8
8
  getValidToken
9
- } from "./chunk-B3H2YWPJ.js";
9
+ } from "./chunk-HDAFEHUY.js";
10
10
 
11
11
  // ../../packages/panopticon/src/artifact.ts
12
12
  import {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Sentry
3
- } from "./chunk-B3H2YWPJ.js";
3
+ } from "./chunk-HDAFEHUY.js";
4
4
 
5
5
  // src/bin-utils.ts
6
6
  import fs from "fs";
@@ -53,7 +53,7 @@ var PACKAGE_NAME = "@fml-inc/fml";
53
53
  var UPDATE_TIMEOUT_MS = 12e4;
54
54
  var SETUP_TIMEOUT_MS = 3e5;
55
55
  function getCurrentVersion() {
56
- return true ? "0.8.7+af45d2af" : "unknown";
56
+ return true ? "0.8.9+6863d154" : "unknown";
57
57
  }
58
58
  function parseVersion(version) {
59
59
  const match = SEMVER_PATTERN.exec(version);
@@ -6,7 +6,7 @@ import {
6
6
  getSiteUrlForConvexUrl,
7
7
  getSyncDestinationIdentity,
8
8
  getValidToken
9
- } from "./chunk-B3H2YWPJ.js";
9
+ } from "./chunk-HDAFEHUY.js";
10
10
 
11
11
  // src/hooks/sync-loop.ts
12
12
  import { createHash } from "crypto";
package/dist/cli.js CHANGED
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  createFmlClient,
4
4
  getAuthenticatedClient
5
- } from "./chunk-LOJPIJZW.js";
5
+ } from "./chunk-GDOXY4W2.js";
6
6
  import {
7
7
  execBinSync,
8
8
  handleUpdate,
9
9
  resolveBin
10
- } from "./chunk-XFALHTDL.js";
10
+ } from "./chunk-TWJ62CZX.js";
11
11
  import {
12
12
  openObserverLog,
13
13
  readJsonFile,
14
14
  setHookCaptureDisabled,
15
15
  writeJsonFile,
16
16
  writeTextFileAtomic
17
- } from "./chunk-LPSZCTTJ.js";
17
+ } from "./chunk-2ZCXGYI5.js";
18
18
  import {
19
19
  CODEX_HOOK_EVENTS,
20
20
  GEMINI_HOOK_EVENTS,
@@ -29,7 +29,7 @@ import {
29
29
  readObserverAuthToken,
30
30
  readObserverStateStatus,
31
31
  removeObserverStateIfOwned
32
- } from "./chunk-4YLSKFDU.js";
32
+ } from "./chunk-H5LWJ5PH.js";
33
33
  import "./chunk-7V7G7NVF.js";
34
34
  import {
35
35
  claudeConfigDirectory,
@@ -38,7 +38,7 @@ import {
38
38
  geminiConfigDirectory,
39
39
  initializeSyncSettings,
40
40
  runRawSyncOnce
41
- } from "./chunk-5JJQWV4G.js";
41
+ } from "./chunk-JPHN4VKM.js";
42
42
  import {
43
43
  resolvePackageRoot
44
44
  } from "./chunk-F57IFY3K.js";
@@ -86,7 +86,7 @@ import {
86
86
  storeServiceRefreshToken,
87
87
  writeEnvConfig,
88
88
  writeTokens
89
- } from "./chunk-B3H2YWPJ.js";
89
+ } from "./chunk-HDAFEHUY.js";
90
90
  import "./chunk-MLKGABMK.js";
91
91
 
92
92
  // src/cli.ts
@@ -132,7 +132,7 @@ var STOP_TIMEOUT_MS = 5e3;
132
132
  var FORCE_STOP_TIMEOUT_MS = 2e3;
133
133
  var POLL_INTERVAL_MS = 50;
134
134
  function expectedObserverVersion() {
135
- return true ? "0.8.7+af45d2af" : "dev";
135
+ return true ? "0.8.9+6863d154" : "dev";
136
136
  }
137
137
  function delay(ms) {
138
138
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -7438,6 +7438,7 @@ async function runServiceTokenLogin(refreshToken, backendUrl) {
7438
7438
  throw new Error("Service token login failed.");
7439
7439
  }
7440
7440
  commitLoginEnvironment(environment);
7441
+ await initSentry(true);
7441
7442
  await selectOrg(environment);
7442
7443
  console.log("Logged in with FML service token.");
7443
7444
  console.log(
@@ -7478,6 +7479,7 @@ async function runInteractiveLogin(opts = {}) {
7478
7479
  );
7479
7480
  }
7480
7481
  await linkGitHubIdentity(environment);
7482
+ await initSentry(true);
7481
7483
  await selectOrg(environment);
7482
7484
  return;
7483
7485
  }
@@ -7492,6 +7494,7 @@ async function runInteractiveLogin(opts = {}) {
7492
7494
  commitLoginEnvironment(environment);
7493
7495
  console.log(`Logged in as ${result.name} (${result.email})`);
7494
7496
  await linkGitHubIdentity(environment);
7497
+ await initSentry(true);
7495
7498
  await selectOrg(environment);
7496
7499
  }
7497
7500
  async function handleLogin(opts) {
@@ -8997,7 +9000,7 @@ async function handleConfigDetail(opts) {
8997
9000
  // src/commands/tools.ts
8998
9001
  import { readFileSync } from "fs";
8999
9002
  import path29 from "path";
9000
- var pluginVersion = true ? "0.8.7+af45d2af" : void 0;
9003
+ var pluginVersion = true ? "0.8.9+6863d154" : void 0;
9001
9004
  async function getApi() {
9002
9005
  const api = await getAuthenticatedClient();
9003
9006
  if (!api) {
@@ -9154,7 +9157,7 @@ if (process.argv.length <= 2 || process.argv.includes("--help") || process.argv.
9154
9157
  printBanner();
9155
9158
  }
9156
9159
  var program = new Command().name("fml").description("FML CLI and agent tools").version(
9157
- true ? "0.8.7+af45d2af" : "dev"
9160
+ true ? "0.8.9+6863d154" : "dev"
9158
9161
  );
9159
9162
  function formatCommandInventory(cmd, prefix = "") {
9160
9163
  const name = prefix ? `${prefix} ${cmd.name()}` : cmd.name();
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  hookCaptureIsDisabled,
4
4
  openObserverLog
5
- } from "./chunk-LPSZCTTJ.js";
5
+ } from "./chunk-2ZCXGYI5.js";
6
6
  import {
7
7
  getActiveHookDestinationBinding
8
- } from "./chunk-PJWMSHHZ.js";
8
+ } from "./chunk-WE7MAWAW.js";
9
9
  import {
10
10
  HookInboxCapacityError,
11
11
  OBSERVER_HEARTBEAT_STALE_MS,
@@ -19,7 +19,7 @@ import {
19
19
  readObserverAuthToken,
20
20
  readObserverState,
21
21
  recordHookInboxLoss
22
- } from "./chunk-4YLSKFDU.js";
22
+ } from "./chunk-H5LWJ5PH.js";
23
23
  import {
24
24
  resolveRepositoryRootFromCwd,
25
25
  resolveRepositorySlugFromCwd
@@ -35,7 +35,7 @@ import {
35
35
  FML_OBSERVER_ENDPOINT_FILE,
36
36
  FML_OBSERVER_STATE_FILE,
37
37
  getValidToken
38
- } from "./chunk-B3H2YWPJ.js";
38
+ } from "./chunk-HDAFEHUY.js";
39
39
  import "./chunk-MLKGABMK.js";
40
40
 
41
41
  // src/hooks/handler.ts
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createFmlClient,
4
4
  getAuthenticatedClient
5
- } from "../chunk-LOJPIJZW.js";
5
+ } from "../chunk-GDOXY4W2.js";
6
6
  import {
7
7
  resolveRepoFromCwd
8
8
  } from "../chunk-7V7G7NVF.js";
@@ -17,7 +17,7 @@ import {
17
17
  getValidToken,
18
18
  initSentry,
19
19
  readTokens
20
- } from "../chunk-B3H2YWPJ.js";
20
+ } from "../chunk-HDAFEHUY.js";
21
21
  import "../chunk-MLKGABMK.js";
22
22
 
23
23
  // src/mcp/server.ts
@@ -5,11 +5,11 @@ import {
5
5
  isWinShim,
6
6
  quoteWinArg,
7
7
  resolveBin
8
- } from "./chunk-XFALHTDL.js";
8
+ } from "./chunk-TWJ62CZX.js";
9
9
  import {
10
10
  createHookSyncLoop,
11
11
  getActiveHookDestinationBinding
12
- } from "./chunk-PJWMSHHZ.js";
12
+ } from "./chunk-WE7MAWAW.js";
13
13
  import {
14
14
  OBSERVER_PROTOCOL_VERSION,
15
15
  OBSERVER_SERVICE_NAME,
@@ -30,16 +30,16 @@ import {
30
30
  removeObserverStateIfOwned,
31
31
  retireHookInboxEntry,
32
32
  updateObserverState
33
- } from "./chunk-4YLSKFDU.js";
33
+ } from "./chunk-H5LWJ5PH.js";
34
34
  import "./chunk-7V7G7NVF.js";
35
35
  import {
36
36
  ObserverSyncCycleAbortedError,
37
37
  runObserverSyncCycleSubprocess
38
- } from "./chunk-6BTC3S7C.js";
38
+ } from "./chunk-2DGHAVVR.js";
39
39
  import {
40
40
  createCliRawSync,
41
41
  invalidateCliRawSyncDiscoveryCache
42
- } from "./chunk-5JJQWV4G.js";
42
+ } from "./chunk-JPHN4VKM.js";
43
43
  import "./chunk-F57IFY3K.js";
44
44
  import {
45
45
  FML_OBSERVER_AUTH_TOKEN_FILE,
@@ -58,7 +58,7 @@ import {
58
58
  getSyncDestinationAuthBinding,
59
59
  getValidToken,
60
60
  observerOnlyOverrideWarning
61
- } from "./chunk-B3H2YWPJ.js";
61
+ } from "./chunk-HDAFEHUY.js";
62
62
  import "./chunk-MLKGABMK.js";
63
63
 
64
64
  // src/observer-server.ts
@@ -1546,7 +1546,7 @@ var hookRejectionStatus = () => ({
1546
1546
  ...lastRejectedReason !== void 0 ? { lastRejectedReason } : {},
1547
1547
  ...lastRejectedTarget !== void 0 ? { lastRejectedTarget } : {}
1548
1548
  });
1549
- var packageVersion = true ? "0.8.7+af45d2af" : "dev";
1549
+ var packageVersion = true ? "0.8.9+6863d154" : "dev";
1550
1550
  var health = () => ({
1551
1551
  status: "ok",
1552
1552
  service: OBSERVER_SERVICE_NAME,