@knowsuchagency/fulcrum 1.7.0 → 1.8.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/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/png" href="/logo.png" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Fulcrum</title>
8
- <script type="module" crossorigin src="/assets/index-fIJu9jIH.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-C8TFMshN.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-_aUlx8a1.css">
10
10
  </head>
11
11
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowsuchagency/fulcrum",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Harness Attention. Orchestrate Agents. Ship.",
5
5
  "license": "PolyForm-Perimeter-1.0.0",
6
6
  "repository": {
package/server/index.js CHANGED
@@ -4739,6 +4739,7 @@ __export(exports_settings, {
4739
4739
  syncClaudeCodeTheme: () => syncClaudeCodeTheme,
4740
4740
  setNestedValue: () => setNestedValue,
4741
4741
  resetSettings: () => resetSettings,
4742
+ isTestMode: () => isTestMode,
4742
4743
  isDeveloperMode: () => isDeveloperMode,
4743
4744
  initializeFulcrumDirectories: () => initializeFulcrumDirectories,
4744
4745
  getZAiSettings: () => getZAiSettings,
@@ -4757,12 +4758,36 @@ __export(exports_settings, {
4757
4758
  ensureWorktreesDir: () => ensureWorktreesDir,
4758
4759
  ensureLatestSettings: () => ensureLatestSettings,
4759
4760
  ensureFulcrumDir: () => ensureFulcrumDir,
4761
+ enableTestMode: () => enableTestMode,
4760
4762
  CURRENT_SCHEMA_VERSION: () => CURRENT_SCHEMA_VERSION,
4761
4763
  CLAUDE_CODE_THEMES: () => CLAUDE_CODE_THEMES
4762
4764
  });
4763
4765
  import * as fs2 from "fs";
4764
4766
  import * as path from "path";
4765
4767
  import * as os from "os";
4768
+ function enableTestMode() {
4769
+ _testMode = true;
4770
+ }
4771
+ function isTestMode() {
4772
+ return _testMode;
4773
+ }
4774
+ function getRealHomeDir() {
4775
+ return process.env.HOME_BACKUP || os.homedir();
4776
+ }
4777
+ function getHomeDir() {
4778
+ return process.env.HOME || os.homedir();
4779
+ }
4780
+ function assertNotProductionPath(p, context) {
4781
+ if (!_testMode)
4782
+ return;
4783
+ const realHome = getRealHomeDir();
4784
+ const productionFulcrum = path.join(realHome, ".fulcrum");
4785
+ const productionClaude = path.join(realHome, ".claude");
4786
+ const productionClaudeJson = path.join(realHome, ".claude.json");
4787
+ if (p.startsWith(productionFulcrum + path.sep) || p === productionFulcrum || p.startsWith(productionClaude + path.sep) || p === productionClaude || p === productionClaudeJson) {
4788
+ throw new Error(`TEST ISOLATION VIOLATION in ${context}: attempted to access production path ${p}`);
4789
+ }
4790
+ }
4766
4791
  function getNestedValue(obj, path2) {
4767
4792
  return path2.split(".").reduce((o, k) => {
4768
4793
  if (o && typeof o === "object") {
@@ -4821,10 +4846,10 @@ function expandPath(p) {
4821
4846
  if (!p)
4822
4847
  return p;
4823
4848
  if (p === "~") {
4824
- return os.homedir();
4849
+ return getHomeDir();
4825
4850
  }
4826
4851
  if (p.startsWith("~/")) {
4827
- return path.join(os.homedir(), p.slice(2));
4852
+ return path.join(getHomeDir(), p.slice(2));
4828
4853
  }
4829
4854
  if (!path.isAbsolute(p)) {
4830
4855
  return path.resolve(p);
@@ -4833,13 +4858,19 @@ function expandPath(p) {
4833
4858
  }
4834
4859
  function getFulcrumDir() {
4835
4860
  if (process.env.FULCRUM_DIR) {
4836
- return expandPath(process.env.FULCRUM_DIR);
4861
+ const p = expandPath(process.env.FULCRUM_DIR);
4862
+ assertNotProductionPath(p, "getFulcrumDir");
4863
+ return p;
4837
4864
  }
4838
4865
  const cwdFulcrum = path.join(process.cwd(), ".fulcrum");
4839
4866
  if (fs2.existsSync(cwdFulcrum)) {
4867
+ assertNotProductionPath(cwdFulcrum, "getFulcrumDir");
4840
4868
  return cwdFulcrum;
4841
4869
  }
4842
- return path.join(os.homedir(), ".fulcrum");
4870
+ if (_testMode) {
4871
+ throw new Error("TEST ISOLATION VIOLATION: FULCRUM_DIR not set and no local .fulcrum directory found");
4872
+ }
4873
+ return path.join(getHomeDir(), ".fulcrum");
4843
4874
  }
4844
4875
  function getDatabasePath() {
4845
4876
  return path.join(getFulcrumDir(), "fulcrum.db");
@@ -5141,7 +5172,9 @@ function updateNotificationSettings(updates, clientTimestamp) {
5141
5172
  return updated;
5142
5173
  }
5143
5174
  function getClaudeSettingsPath() {
5144
- return path.join(os.homedir(), ".claude", "settings.json");
5175
+ const p = path.join(getHomeDir(), ".claude", "settings.json");
5176
+ assertNotProductionPath(p, "getClaudeSettingsPath");
5177
+ return p;
5145
5178
  }
5146
5179
  function getClaudeSettings() {
5147
5180
  const settingsPath = getClaudeSettingsPath();
@@ -5163,7 +5196,9 @@ function updateClaudeSettings(updates) {
5163
5196
  fs2.writeFileSync(settingsPath, JSON.stringify(merged, null, 2), "utf-8");
5164
5197
  }
5165
5198
  function getClaudeConfigPath() {
5166
- return path.join(os.homedir(), ".claude.json");
5199
+ const p = path.join(getHomeDir(), ".claude.json");
5200
+ assertNotProductionPath(p, "getClaudeConfigPath");
5201
+ return p;
5167
5202
  }
5168
5203
  function getClaudeConfig() {
5169
5204
  const configPath = getClaudeConfigPath();
@@ -5302,7 +5337,7 @@ function ensureLatestSettings() {
5302
5337
  fs2.writeFileSync(settingsPath, JSON.stringify(merged, null, 2), "utf-8");
5303
5338
  log2.settings.info("Settings normalized to latest schema", { schemaVersion: CURRENT_SCHEMA_VERSION });
5304
5339
  }
5305
- var CURRENT_SCHEMA_VERSION = 1, CLAUDE_CODE_THEMES, DEFAULT_SETTINGS, OLD_DEFAULT_PORT = 3333, MIGRATION_MAP, DEFAULT_NOTIFICATION_SETTINGS, claudeConfigLock, DEFAULT_ZAI_SETTINGS;
5340
+ var _testMode = false, CURRENT_SCHEMA_VERSION = 1, CLAUDE_CODE_THEMES, DEFAULT_SETTINGS, OLD_DEFAULT_PORT = 3333, MIGRATION_MAP, DEFAULT_NOTIFICATION_SETTINGS, claudeConfigLock, DEFAULT_ZAI_SETTINGS;
5306
5341
  var init_settings = __esm(() => {
5307
5342
  init_logger3();
5308
5343
  CLAUDE_CODE_THEMES = ["light", "light-ansi", "light-daltonized", "dark", "dark-ansi", "dark-daltonized"];
@@ -11418,10 +11453,10 @@ var require_resolve_block_map = __commonJS((exports) => {
11418
11453
  let offset = bm.offset;
11419
11454
  let commentEnd = null;
11420
11455
  for (const collItem of bm.items) {
11421
- const { start, key, sep: sep3, value } = collItem;
11456
+ const { start, key, sep: sep4, value } = collItem;
11422
11457
  const keyProps = resolveProps.resolveProps(start, {
11423
11458
  indicator: "explicit-key-ind",
11424
- next: key ?? sep3?.[0],
11459
+ next: key ?? sep4?.[0],
11425
11460
  offset,
11426
11461
  onError,
11427
11462
  parentIndent: bm.indent,
@@ -11435,7 +11470,7 @@ var require_resolve_block_map = __commonJS((exports) => {
11435
11470
  else if ("indent" in key && key.indent !== bm.indent)
11436
11471
  onError(offset, "BAD_INDENT", startColMsg);
11437
11472
  }
11438
- if (!keyProps.anchor && !keyProps.tag && !sep3) {
11473
+ if (!keyProps.anchor && !keyProps.tag && !sep4) {
11439
11474
  commentEnd = keyProps.end;
11440
11475
  if (keyProps.comment) {
11441
11476
  if (map.comment)
@@ -11460,7 +11495,7 @@ var require_resolve_block_map = __commonJS((exports) => {
11460
11495
  ctx.atKey = false;
11461
11496
  if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
11462
11497
  onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique");
11463
- const valueProps = resolveProps.resolveProps(sep3 ?? [], {
11498
+ const valueProps = resolveProps.resolveProps(sep4 ?? [], {
11464
11499
  indicator: "map-value-ind",
11465
11500
  next: value,
11466
11501
  offset: keyNode.range[2],
@@ -11476,7 +11511,7 @@ var require_resolve_block_map = __commonJS((exports) => {
11476
11511
  if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024)
11477
11512
  onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key");
11478
11513
  }
11479
- const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep3, null, valueProps, onError);
11514
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep4, null, valueProps, onError);
11480
11515
  if (ctx.schema.compat)
11481
11516
  utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);
11482
11517
  offset = valueNode.range[2];
@@ -11562,7 +11597,7 @@ var require_resolve_end = __commonJS((exports) => {
11562
11597
  let comment = "";
11563
11598
  if (end) {
11564
11599
  let hasSpace = false;
11565
- let sep3 = "";
11600
+ let sep4 = "";
11566
11601
  for (const token of end) {
11567
11602
  const { source, type } = token;
11568
11603
  switch (type) {
@@ -11576,13 +11611,13 @@ var require_resolve_end = __commonJS((exports) => {
11576
11611
  if (!comment)
11577
11612
  comment = cb;
11578
11613
  else
11579
- comment += sep3 + cb;
11580
- sep3 = "";
11614
+ comment += sep4 + cb;
11615
+ sep4 = "";
11581
11616
  break;
11582
11617
  }
11583
11618
  case "newline":
11584
11619
  if (comment)
11585
- sep3 += source;
11620
+ sep4 += source;
11586
11621
  hasSpace = true;
11587
11622
  break;
11588
11623
  default:
@@ -11622,18 +11657,18 @@ var require_resolve_flow_collection = __commonJS((exports) => {
11622
11657
  let offset = fc.offset + fc.start.source.length;
11623
11658
  for (let i = 0;i < fc.items.length; ++i) {
11624
11659
  const collItem = fc.items[i];
11625
- const { start, key, sep: sep3, value } = collItem;
11660
+ const { start, key, sep: sep4, value } = collItem;
11626
11661
  const props = resolveProps.resolveProps(start, {
11627
11662
  flow: fcName,
11628
11663
  indicator: "explicit-key-ind",
11629
- next: key ?? sep3?.[0],
11664
+ next: key ?? sep4?.[0],
11630
11665
  offset,
11631
11666
  onError,
11632
11667
  parentIndent: fc.indent,
11633
11668
  startOnNewline: false
11634
11669
  });
11635
11670
  if (!props.found) {
11636
- if (!props.anchor && !props.tag && !sep3 && !value) {
11671
+ if (!props.anchor && !props.tag && !sep4 && !value) {
11637
11672
  if (i === 0 && props.comma)
11638
11673
  onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`);
11639
11674
  else if (i < fc.items.length - 1)
@@ -11685,8 +11720,8 @@ var require_resolve_flow_collection = __commonJS((exports) => {
11685
11720
  }
11686
11721
  }
11687
11722
  }
11688
- if (!isMap && !sep3 && !props.found) {
11689
- const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep3, null, props, onError);
11723
+ if (!isMap && !sep4 && !props.found) {
11724
+ const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep4, null, props, onError);
11690
11725
  coll.items.push(valueNode);
11691
11726
  offset = valueNode.range[2];
11692
11727
  if (isBlock(value))
@@ -11698,7 +11733,7 @@ var require_resolve_flow_collection = __commonJS((exports) => {
11698
11733
  if (isBlock(key))
11699
11734
  onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg);
11700
11735
  ctx.atKey = false;
11701
- const valueProps = resolveProps.resolveProps(sep3 ?? [], {
11736
+ const valueProps = resolveProps.resolveProps(sep4 ?? [], {
11702
11737
  flow: fcName,
11703
11738
  indicator: "map-value-ind",
11704
11739
  next: value,
@@ -11709,8 +11744,8 @@ var require_resolve_flow_collection = __commonJS((exports) => {
11709
11744
  });
11710
11745
  if (valueProps.found) {
11711
11746
  if (!isMap && !props.found && ctx.options.strict) {
11712
- if (sep3)
11713
- for (const st of sep3) {
11747
+ if (sep4)
11748
+ for (const st of sep4) {
11714
11749
  if (st === valueProps.found)
11715
11750
  break;
11716
11751
  if (st.type === "newline") {
@@ -11727,7 +11762,7 @@ var require_resolve_flow_collection = __commonJS((exports) => {
11727
11762
  else
11728
11763
  onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`);
11729
11764
  }
11730
- const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep3, null, valueProps, onError) : null;
11765
+ const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep4, null, valueProps, onError) : null;
11731
11766
  if (valueNode) {
11732
11767
  if (isBlock(value))
11733
11768
  onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg);
@@ -11904,7 +11939,7 @@ var require_resolve_block_scalar = __commonJS((exports) => {
11904
11939
  chompStart = i + 1;
11905
11940
  }
11906
11941
  let value = "";
11907
- let sep3 = "";
11942
+ let sep4 = "";
11908
11943
  let prevMoreIndented = false;
11909
11944
  for (let i = 0;i < contentStart; ++i)
11910
11945
  value += lines[i][0].slice(trimIndent) + `
@@ -11922,33 +11957,33 @@ var require_resolve_block_scalar = __commonJS((exports) => {
11922
11957
  indent = "";
11923
11958
  }
11924
11959
  if (type === Scalar.Scalar.BLOCK_LITERAL) {
11925
- value += sep3 + indent.slice(trimIndent) + content;
11926
- sep3 = `
11960
+ value += sep4 + indent.slice(trimIndent) + content;
11961
+ sep4 = `
11927
11962
  `;
11928
11963
  } else if (indent.length > trimIndent || content[0] === "\t") {
11929
- if (sep3 === " ")
11930
- sep3 = `
11964
+ if (sep4 === " ")
11965
+ sep4 = `
11931
11966
  `;
11932
- else if (!prevMoreIndented && sep3 === `
11967
+ else if (!prevMoreIndented && sep4 === `
11933
11968
  `)
11934
- sep3 = `
11969
+ sep4 = `
11935
11970
 
11936
11971
  `;
11937
- value += sep3 + indent.slice(trimIndent) + content;
11938
- sep3 = `
11972
+ value += sep4 + indent.slice(trimIndent) + content;
11973
+ sep4 = `
11939
11974
  `;
11940
11975
  prevMoreIndented = true;
11941
11976
  } else if (content === "") {
11942
- if (sep3 === `
11977
+ if (sep4 === `
11943
11978
  `)
11944
11979
  value += `
11945
11980
  `;
11946
11981
  else
11947
- sep3 = `
11982
+ sep4 = `
11948
11983
  `;
11949
11984
  } else {
11950
- value += sep3 + content;
11951
- sep3 = " ";
11985
+ value += sep4 + content;
11986
+ sep4 = " ";
11952
11987
  prevMoreIndented = false;
11953
11988
  }
11954
11989
  }
@@ -12129,27 +12164,27 @@ var require_resolve_flow_scalar = __commonJS((exports) => {
12129
12164
  if (!match3)
12130
12165
  return source;
12131
12166
  let res = match3[1];
12132
- let sep3 = " ";
12167
+ let sep4 = " ";
12133
12168
  let pos = first.lastIndex;
12134
12169
  line.lastIndex = pos;
12135
12170
  while (match3 = line.exec(source)) {
12136
12171
  if (match3[1] === "") {
12137
- if (sep3 === `
12172
+ if (sep4 === `
12138
12173
  `)
12139
- res += sep3;
12174
+ res += sep4;
12140
12175
  else
12141
- sep3 = `
12176
+ sep4 = `
12142
12177
  `;
12143
12178
  } else {
12144
- res += sep3 + match3[1];
12145
- sep3 = " ";
12179
+ res += sep4 + match3[1];
12180
+ sep4 = " ";
12146
12181
  }
12147
12182
  pos = line.lastIndex;
12148
12183
  }
12149
12184
  const last = /[ \t]*(.*)/sy;
12150
12185
  last.lastIndex = pos;
12151
12186
  match3 = last.exec(source);
12152
- return res + sep3 + (match3?.[1] ?? "");
12187
+ return res + sep4 + (match3?.[1] ?? "");
12153
12188
  }
12154
12189
  function doubleQuotedValue(source, onError) {
12155
12190
  let res = "";
@@ -12922,14 +12957,14 @@ var require_cst_stringify = __commonJS((exports) => {
12922
12957
  }
12923
12958
  }
12924
12959
  }
12925
- function stringifyItem({ start, key, sep: sep3, value }) {
12960
+ function stringifyItem({ start, key, sep: sep4, value }) {
12926
12961
  let res = "";
12927
12962
  for (const st of start)
12928
12963
  res += st.source;
12929
12964
  if (key)
12930
12965
  res += stringifyToken(key);
12931
- if (sep3)
12932
- for (const st of sep3)
12966
+ if (sep4)
12967
+ for (const st of sep4)
12933
12968
  res += st.source;
12934
12969
  if (value)
12935
12970
  res += stringifyToken(value);
@@ -14059,18 +14094,18 @@ var require_parser = __commonJS((exports) => {
14059
14094
  if (this.type === "map-value-ind") {
14060
14095
  const prev = getPrevProps(this.peek(2));
14061
14096
  const start = getFirstKeyStartProps(prev);
14062
- let sep3;
14097
+ let sep4;
14063
14098
  if (scalar.end) {
14064
- sep3 = scalar.end;
14065
- sep3.push(this.sourceToken);
14099
+ sep4 = scalar.end;
14100
+ sep4.push(this.sourceToken);
14066
14101
  delete scalar.end;
14067
14102
  } else
14068
- sep3 = [this.sourceToken];
14103
+ sep4 = [this.sourceToken];
14069
14104
  const map = {
14070
14105
  type: "block-map",
14071
14106
  offset: scalar.offset,
14072
14107
  indent: scalar.indent,
14073
- items: [{ start, key: scalar, sep: sep3 }]
14108
+ items: [{ start, key: scalar, sep: sep4 }]
14074
14109
  };
14075
14110
  this.onKeyLine = true;
14076
14111
  this.stack[this.stack.length - 1] = map;
@@ -14224,15 +14259,15 @@ var require_parser = __commonJS((exports) => {
14224
14259
  } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) {
14225
14260
  const start2 = getFirstKeyStartProps(it.start);
14226
14261
  const key = it.key;
14227
- const sep3 = it.sep;
14228
- sep3.push(this.sourceToken);
14262
+ const sep4 = it.sep;
14263
+ sep4.push(this.sourceToken);
14229
14264
  delete it.key;
14230
14265
  delete it.sep;
14231
14266
  this.stack.push({
14232
14267
  type: "block-map",
14233
14268
  offset: this.offset,
14234
14269
  indent: this.indent,
14235
- items: [{ start: start2, key, sep: sep3 }]
14270
+ items: [{ start: start2, key, sep: sep4 }]
14236
14271
  });
14237
14272
  } else if (start.length > 0) {
14238
14273
  it.sep = it.sep.concat(start, this.sourceToken);
@@ -14426,13 +14461,13 @@ var require_parser = __commonJS((exports) => {
14426
14461
  const prev = getPrevProps(parent);
14427
14462
  const start = getFirstKeyStartProps(prev);
14428
14463
  fixFlowSeqItems(fc);
14429
- const sep3 = fc.end.splice(1, fc.end.length);
14430
- sep3.push(this.sourceToken);
14464
+ const sep4 = fc.end.splice(1, fc.end.length);
14465
+ sep4.push(this.sourceToken);
14431
14466
  const map = {
14432
14467
  type: "block-map",
14433
14468
  offset: fc.offset,
14434
14469
  indent: fc.indent,
14435
- items: [{ start, key: fc, sep: sep3 }]
14470
+ items: [{ start, key: fc, sep: sep4 }]
14436
14471
  };
14437
14472
  this.onKeyLine = true;
14438
14473
  this.stack[this.stack.length - 1] = map;
@@ -44231,8 +44266,8 @@ var path2 = {
44231
44266
  win32: { sep: "\\" },
44232
44267
  posix: { sep: "/" }
44233
44268
  };
44234
- var sep = defaultPlatform === "win32" ? path2.win32.sep : path2.posix.sep;
44235
- minimatch.sep = sep;
44269
+ var sep2 = defaultPlatform === "win32" ? path2.win32.sep : path2.posix.sep;
44270
+ minimatch.sep = sep2;
44236
44271
  var GLOBSTAR = Symbol("globstar **");
44237
44272
  minimatch.GLOBSTAR = GLOBSTAR;
44238
44273
  var qmark2 = "[^/]";
@@ -47475,7 +47510,7 @@ class PathScurryBase {
47475
47510
  #children;
47476
47511
  nocase;
47477
47512
  #fs;
47478
- constructor(cwd = process.cwd(), pathImpl, sep2, { nocase, childrenCacheSize = 16 * 1024, fs: fs3 = defaultFS } = {}) {
47513
+ constructor(cwd = process.cwd(), pathImpl, sep3, { nocase, childrenCacheSize = 16 * 1024, fs: fs3 = defaultFS } = {}) {
47479
47514
  this.#fs = fsFromOption(fs3);
47480
47515
  if (cwd instanceof URL || cwd.startsWith("file://")) {
47481
47516
  cwd = fileURLToPath(cwd);
@@ -47486,7 +47521,7 @@ class PathScurryBase {
47486
47521
  this.#resolveCache = new ResolveCache;
47487
47522
  this.#resolvePosixCache = new ResolveCache;
47488
47523
  this.#children = new ChildrenCache(childrenCacheSize);
47489
- const split = cwdPath.substring(this.rootPath.length).split(sep2);
47524
+ const split = cwdPath.substring(this.rootPath.length).split(sep3);
47490
47525
  if (split.length === 1 && !split[0]) {
47491
47526
  split.pop();
47492
47527
  }
@@ -53315,8 +53350,8 @@ function withCustomRequest(customRequest) {
53315
53350
 
53316
53351
  // node_modules/@octokit/auth-token/dist-bundle/index.js
53317
53352
  var b64url = "(?:[a-zA-Z0-9_-]+)";
53318
- var sep3 = "\\.";
53319
- var jwtRE = new RegExp(`^${b64url}${sep3}${b64url}${sep3}${b64url}$`);
53353
+ var sep4 = "\\.";
53354
+ var jwtRE = new RegExp(`^${b64url}${sep4}${b64url}${sep4}${b64url}$`);
53320
53355
  var isJWT = jwtRE.test.bind(jwtRE);
53321
53356
  async function auth(token) {
53322
53357
  const isApp = isJWT(token);