fourmis-agents-sdk 0.2.2 → 0.2.4

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.
@@ -97,14 +97,18 @@ __export(exports_openai_oauth, {
97
97
  import { randomBytes, createHash } from "crypto";
98
98
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
99
99
  import { join } from "path";
100
+ import { homedir } from "os";
101
+ function getHome() {
102
+ return process.env.HOME ?? homedir();
103
+ }
100
104
  function tokenDir() {
101
- return join(process.env.HOME ?? "/root", ".fourmis");
105
+ return join(getHome(), ".fourmis");
102
106
  }
103
107
  function tokenPath() {
104
108
  return join(tokenDir(), "openai-auth.json");
105
109
  }
106
110
  function codexFallbackPath() {
107
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
111
+ return join(getHome(), ".codex", "auth.json");
108
112
  }
109
113
  function loadTokens() {
110
114
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1447,9 +1451,10 @@ class OpenAIAdapter {
1447
1451
  }
1448
1452
  }
1449
1453
  function loadTokensSync() {
1454
+ const home = process.env.HOME ?? __require("os").homedir();
1450
1455
  const paths = [
1451
- `${process.env.HOME}/.fourmis/openai-auth.json`,
1452
- `${process.env.HOME}/.codex/auth.json`
1456
+ `${home}/.fourmis/openai-auth.json`,
1457
+ `${home}/.codex/auth.json`
1453
1458
  ];
1454
1459
  for (const p of paths) {
1455
1460
  try {
@@ -2053,8 +2058,6 @@ var ALL_TOOLS = {
2053
2058
  function buildToolRegistry(toolNames, allowedTools, disallowedTools) {
2054
2059
  const registry = new ToolRegistry;
2055
2060
  for (const name of toolNames) {
2056
- if (allowedTools && !allowedTools.includes(name))
2057
- continue;
2058
2061
  if (disallowedTools?.includes(name))
2059
2062
  continue;
2060
2063
  const tool = ALL_TOOLS[name];
@@ -97,14 +97,18 @@ __export(exports_openai_oauth, {
97
97
  import { randomBytes, createHash } from "crypto";
98
98
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
99
99
  import { join } from "path";
100
+ import { homedir } from "os";
101
+ function getHome() {
102
+ return process.env.HOME ?? homedir();
103
+ }
100
104
  function tokenDir() {
101
- return join(process.env.HOME ?? "/root", ".fourmis");
105
+ return join(getHome(), ".fourmis");
102
106
  }
103
107
  function tokenPath() {
104
108
  return join(tokenDir(), "openai-auth.json");
105
109
  }
106
110
  function codexFallbackPath() {
107
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
111
+ return join(getHome(), ".codex", "auth.json");
108
112
  }
109
113
  function loadTokens() {
110
114
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1447,9 +1451,10 @@ class OpenAIAdapter {
1447
1451
  }
1448
1452
  }
1449
1453
  function loadTokensSync() {
1454
+ const home = process.env.HOME ?? __require("os").homedir();
1450
1455
  const paths = [
1451
- `${process.env.HOME}/.fourmis/openai-auth.json`,
1452
- `${process.env.HOME}/.codex/auth.json`
1456
+ `${home}/.fourmis/openai-auth.json`,
1457
+ `${home}/.codex/auth.json`
1453
1458
  ];
1454
1459
  for (const p of paths) {
1455
1460
  try {
@@ -2053,8 +2058,6 @@ var ALL_TOOLS = {
2053
2058
  function buildToolRegistry(toolNames, allowedTools, disallowedTools) {
2054
2059
  const registry = new ToolRegistry;
2055
2060
  for (const name of toolNames) {
2056
- if (allowedTools && !allowedTools.includes(name))
2057
- continue;
2058
2061
  if (disallowedTools?.includes(name))
2059
2062
  continue;
2060
2063
  const tool = ALL_TOOLS[name];
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAqB,MAAM,YAAY,CAAC;AAoBzE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,GAAG,KAAK,CAqJR"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAqB,MAAM,YAAY,CAAC;AAoBzE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,GAAG,KAAK,CA8JR"}
package/dist/api.js CHANGED
@@ -97,14 +97,18 @@ __export(exports_openai_oauth, {
97
97
  import { randomBytes, createHash } from "crypto";
98
98
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
99
99
  import { join } from "path";
100
+ import { homedir } from "os";
101
+ function getHome() {
102
+ return process.env.HOME ?? homedir();
103
+ }
100
104
  function tokenDir() {
101
- return join(process.env.HOME ?? "/root", ".fourmis");
105
+ return join(getHome(), ".fourmis");
102
106
  }
103
107
  function tokenPath() {
104
108
  return join(tokenDir(), "openai-auth.json");
105
109
  }
106
110
  function codexFallbackPath() {
107
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
111
+ return join(getHome(), ".codex", "auth.json");
108
112
  }
109
113
  function loadTokens() {
110
114
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1447,9 +1451,10 @@ class OpenAIAdapter {
1447
1451
  }
1448
1452
  }
1449
1453
  function loadTokensSync() {
1454
+ const home = process.env.HOME ?? __require("os").homedir();
1450
1455
  const paths = [
1451
- `${process.env.HOME}/.fourmis/openai-auth.json`,
1452
- `${process.env.HOME}/.codex/auth.json`
1456
+ `${home}/.fourmis/openai-auth.json`,
1457
+ `${home}/.codex/auth.json`
1453
1458
  ];
1454
1459
  for (const p of paths) {
1455
1460
  try {
@@ -2053,8 +2058,6 @@ var ALL_TOOLS = {
2053
2058
  function buildToolRegistry(toolNames, allowedTools, disallowedTools) {
2054
2059
  const registry = new ToolRegistry;
2055
2060
  for (const name of toolNames) {
2056
- if (allowedTools && !allowedTools.includes(name))
2057
- continue;
2058
2061
  if (disallowedTools?.includes(name))
2059
2062
  continue;
2060
2063
  const tool = ALL_TOOLS[name];
@@ -2209,7 +2212,7 @@ class PermissionManager {
2209
2212
  // src/settings.ts
2210
2213
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
2211
2214
  import { dirname as dirname2, join as join2 } from "path";
2212
- import { homedir } from "os";
2215
+ import { homedir as homedir2 } from "os";
2213
2216
 
2214
2217
  class SettingsManager {
2215
2218
  cwd;
@@ -2295,7 +2298,7 @@ class SettingsManager {
2295
2298
  sourceToPath(source) {
2296
2299
  switch (source) {
2297
2300
  case "user":
2298
- return join2(homedir(), ".claude", "settings.json");
2301
+ return join2(homedir2(), ".claude", "settings.json");
2299
2302
  case "project":
2300
2303
  return join2(this.cwd, ".claude", "settings.json");
2301
2304
  case "local":
@@ -2305,7 +2308,7 @@ class SettingsManager {
2305
2308
  destinationToPath(destination) {
2306
2309
  switch (destination) {
2307
2310
  case "userSettings":
2308
- return join2(homedir(), ".claude", "settings.json");
2311
+ return join2(homedir2(), ".claude", "settings.json");
2309
2312
  case "projectSettings":
2310
2313
  return join2(this.cwd, ".claude", "settings.json");
2311
2314
  case "localSettings":
@@ -2537,11 +2540,16 @@ class McpClientManager {
2537
2540
  await client.connect(clientTransport);
2538
2541
  } else if (config.type === "sse") {
2539
2542
  const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
2540
- const transport = new SSEClientTransport(new URL(config.url));
2543
+ const opts = config.headers ? {
2544
+ eventSourceInit: { headers: config.headers },
2545
+ requestInit: { headers: config.headers }
2546
+ } : undefined;
2547
+ const transport = new SSEClientTransport(new URL(config.url), opts);
2541
2548
  await client.connect(transport);
2542
2549
  } else if (config.type === "http") {
2543
2550
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
2544
- const transport = new StreamableHTTPClientTransport(new URL(config.url));
2551
+ const requestInit = config.headers ? { headers: config.headers } : undefined;
2552
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
2545
2553
  await client.connect(transport);
2546
2554
  } else {
2547
2555
  const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
@@ -2926,12 +2934,12 @@ class TaskManager {
2926
2934
  // src/utils/session-store.ts
2927
2935
  import { readFileSync as readFileSync4, appendFileSync, mkdirSync as mkdirSync3, readdirSync, statSync } from "fs";
2928
2936
  import { join as join4 } from "path";
2929
- import { homedir as homedir2 } from "os";
2937
+ import { homedir as homedir3 } from "os";
2930
2938
  function sanitizeCwd(cwd) {
2931
2939
  return cwd.replace(/[/.]/g, "-");
2932
2940
  }
2933
2941
  function sessionsDir(cwd) {
2934
- return join4(homedir2(), ".claude", "projects", sanitizeCwd(cwd));
2942
+ return join4(homedir3(), ".claude", "projects", sanitizeCwd(cwd));
2935
2943
  }
2936
2944
  function ensureDir(dir) {
2937
2945
  mkdirSync3(dir, { recursive: true });
@@ -3039,7 +3047,7 @@ function query(params) {
3039
3047
  });
3040
3048
  const model = options.model ?? DEFAULT_MODEL;
3041
3049
  const toolNames = resolveToolNames(options.tools);
3042
- const registry = buildToolRegistry(toolNames, options.allowedTools, options.disallowedTools);
3050
+ const registry = buildToolRegistry(toolNames, undefined, options.disallowedTools);
3043
3051
  const systemPrompt = options.systemPrompt ?? buildSystemPrompt({
3044
3052
  tools: registry.list(),
3045
3053
  cwd: options.cwd,
@@ -3067,6 +3075,14 @@ function query(params) {
3067
3075
  mergedPermissions.deny = mergedDeny;
3068
3076
  }
3069
3077
  }
3078
+ if (options.allowedTools && options.allowedTools.length > 0) {
3079
+ if (!mergedPermissions)
3080
+ mergedPermissions = {};
3081
+ mergedPermissions.allow = [
3082
+ ...mergedPermissions.allow ?? [],
3083
+ ...options.allowedTools
3084
+ ];
3085
+ }
3070
3086
  const permissions = new PermissionManager(options.permissionMode ?? "default", options.canUseTool, mergedPermissions, settingsManager);
3071
3087
  const cwd = options.cwd ?? process.cwd();
3072
3088
  let sessionId = options.sessionId ?? uuid();
@@ -28,14 +28,18 @@ __export(exports_openai_oauth, {
28
28
  import { randomBytes, createHash } from "crypto";
29
29
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
30
30
  import { join } from "path";
31
+ import { homedir } from "os";
32
+ function getHome() {
33
+ return process.env.HOME ?? homedir();
34
+ }
31
35
  function tokenDir() {
32
- return join(process.env.HOME ?? "/root", ".fourmis");
36
+ return join(getHome(), ".fourmis");
33
37
  }
34
38
  function tokenPath() {
35
39
  return join(tokenDir(), "openai-auth.json");
36
40
  }
37
41
  function codexFallbackPath() {
38
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
42
+ return join(getHome(), ".codex", "auth.json");
39
43
  }
40
44
  function loadTokens() {
41
45
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1 +1 @@
1
- {"version":3,"file":"openai-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/openai-oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAcF,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAahD;AAYD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAKnE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAO5D;AAmDD,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAwBhG;AAID,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CACzB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BnE"}
1
+ {"version":3,"file":"openai-oauth.d.ts","sourceRoot":"","sources":["../../src/auth/openai-oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAkBF,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAahD;AAYD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAKnE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAO5D;AAmDD,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAwBhG;AAID,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CACzB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BnE"}
@@ -27,14 +27,18 @@ __export(exports_openai_oauth, {
27
27
  import { randomBytes, createHash } from "crypto";
28
28
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
29
29
  import { join } from "path";
30
+ import { homedir } from "os";
31
+ function getHome() {
32
+ return process.env.HOME ?? homedir();
33
+ }
30
34
  function tokenDir() {
31
- return join(process.env.HOME ?? "/root", ".fourmis");
35
+ return join(getHome(), ".fourmis");
32
36
  }
33
37
  function tokenPath() {
34
38
  return join(tokenDir(), "openai-auth.json");
35
39
  }
36
40
  function codexFallbackPath() {
37
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
41
+ return join(getHome(), ".codex", "auth.json");
38
42
  }
39
43
  function loadTokens() {
40
44
  for (const p of [tokenPath(), codexFallbackPath()]) {
package/dist/index.js CHANGED
@@ -97,14 +97,18 @@ __export(exports_openai_oauth, {
97
97
  import { randomBytes, createHash } from "crypto";
98
98
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
99
99
  import { join } from "path";
100
+ import { homedir } from "os";
101
+ function getHome() {
102
+ return process.env.HOME ?? homedir();
103
+ }
100
104
  function tokenDir() {
101
- return join(process.env.HOME ?? "/root", ".fourmis");
105
+ return join(getHome(), ".fourmis");
102
106
  }
103
107
  function tokenPath() {
104
108
  return join(tokenDir(), "openai-auth.json");
105
109
  }
106
110
  function codexFallbackPath() {
107
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
111
+ return join(getHome(), ".codex", "auth.json");
108
112
  }
109
113
  function loadTokens() {
110
114
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1447,9 +1451,10 @@ class OpenAIAdapter {
1447
1451
  }
1448
1452
  }
1449
1453
  function loadTokensSync() {
1454
+ const home = process.env.HOME ?? __require("os").homedir();
1450
1455
  const paths = [
1451
- `${process.env.HOME}/.fourmis/openai-auth.json`,
1452
- `${process.env.HOME}/.codex/auth.json`
1456
+ `${home}/.fourmis/openai-auth.json`,
1457
+ `${home}/.codex/auth.json`
1453
1458
  ];
1454
1459
  for (const p of paths) {
1455
1460
  try {
@@ -2053,8 +2058,6 @@ var ALL_TOOLS = {
2053
2058
  function buildToolRegistry(toolNames, allowedTools, disallowedTools) {
2054
2059
  const registry = new ToolRegistry;
2055
2060
  for (const name of toolNames) {
2056
- if (allowedTools && !allowedTools.includes(name))
2057
- continue;
2058
2061
  if (disallowedTools?.includes(name))
2059
2062
  continue;
2060
2063
  const tool = ALL_TOOLS[name];
@@ -2209,7 +2212,7 @@ class PermissionManager {
2209
2212
  // src/settings.ts
2210
2213
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
2211
2214
  import { dirname as dirname2, join as join2 } from "path";
2212
- import { homedir } from "os";
2215
+ import { homedir as homedir2 } from "os";
2213
2216
 
2214
2217
  class SettingsManager {
2215
2218
  cwd;
@@ -2295,7 +2298,7 @@ class SettingsManager {
2295
2298
  sourceToPath(source) {
2296
2299
  switch (source) {
2297
2300
  case "user":
2298
- return join2(homedir(), ".claude", "settings.json");
2301
+ return join2(homedir2(), ".claude", "settings.json");
2299
2302
  case "project":
2300
2303
  return join2(this.cwd, ".claude", "settings.json");
2301
2304
  case "local":
@@ -2305,7 +2308,7 @@ class SettingsManager {
2305
2308
  destinationToPath(destination) {
2306
2309
  switch (destination) {
2307
2310
  case "userSettings":
2308
- return join2(homedir(), ".claude", "settings.json");
2311
+ return join2(homedir2(), ".claude", "settings.json");
2309
2312
  case "projectSettings":
2310
2313
  return join2(this.cwd, ".claude", "settings.json");
2311
2314
  case "localSettings":
@@ -2537,11 +2540,16 @@ class McpClientManager {
2537
2540
  await client.connect(clientTransport);
2538
2541
  } else if (config.type === "sse") {
2539
2542
  const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
2540
- const transport = new SSEClientTransport(new URL(config.url));
2543
+ const opts = config.headers ? {
2544
+ eventSourceInit: { headers: config.headers },
2545
+ requestInit: { headers: config.headers }
2546
+ } : undefined;
2547
+ const transport = new SSEClientTransport(new URL(config.url), opts);
2541
2548
  await client.connect(transport);
2542
2549
  } else if (config.type === "http") {
2543
2550
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
2544
- const transport = new StreamableHTTPClientTransport(new URL(config.url));
2551
+ const requestInit = config.headers ? { headers: config.headers } : undefined;
2552
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
2545
2553
  await client.connect(transport);
2546
2554
  } else {
2547
2555
  const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
@@ -2926,12 +2934,12 @@ class TaskManager {
2926
2934
  // src/utils/session-store.ts
2927
2935
  import { readFileSync as readFileSync4, appendFileSync, mkdirSync as mkdirSync3, readdirSync, statSync } from "fs";
2928
2936
  import { join as join4 } from "path";
2929
- import { homedir as homedir2 } from "os";
2937
+ import { homedir as homedir3 } from "os";
2930
2938
  function sanitizeCwd(cwd) {
2931
2939
  return cwd.replace(/[/.]/g, "-");
2932
2940
  }
2933
2941
  function sessionsDir(cwd) {
2934
- return join4(homedir2(), ".claude", "projects", sanitizeCwd(cwd));
2942
+ return join4(homedir3(), ".claude", "projects", sanitizeCwd(cwd));
2935
2943
  }
2936
2944
  function ensureDir(dir) {
2937
2945
  mkdirSync3(dir, { recursive: true });
@@ -3039,7 +3047,7 @@ function query(params) {
3039
3047
  });
3040
3048
  const model = options.model ?? DEFAULT_MODEL;
3041
3049
  const toolNames = resolveToolNames(options.tools);
3042
- const registry = buildToolRegistry(toolNames, options.allowedTools, options.disallowedTools);
3050
+ const registry = buildToolRegistry(toolNames, undefined, options.disallowedTools);
3043
3051
  const systemPrompt = options.systemPrompt ?? buildSystemPrompt({
3044
3052
  tools: registry.list(),
3045
3053
  cwd: options.cwd,
@@ -3067,6 +3075,14 @@ function query(params) {
3067
3075
  mergedPermissions.deny = mergedDeny;
3068
3076
  }
3069
3077
  }
3078
+ if (options.allowedTools && options.allowedTools.length > 0) {
3079
+ if (!mergedPermissions)
3080
+ mergedPermissions = {};
3081
+ mergedPermissions.allow = [
3082
+ ...mergedPermissions.allow ?? [],
3083
+ ...options.allowedTools
3084
+ ];
3085
+ }
3070
3086
  const permissions = new PermissionManager(options.permissionMode ?? "default", options.canUseTool, mergedPermissions, settingsManager);
3071
3087
  const cwd = options.cwd ?? process.cwd();
3072
3088
  let sessionId = options.sessionId ?? uuid();
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAEf,eAAe,EAChB,MAAM,YAAY,CAAC;AASpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;gBAEzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKnB,UAAU;IAsDxB;;OAEG;IACH,QAAQ,IAAI,kBAAkB,EAAE;IAsB1B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BnF,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IA4BrF,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAepE,MAAM,IAAI,eAAe,EAAE;IAcrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAEf,eAAe,EAChB,MAAM,YAAY,CAAC;AASpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;gBAEzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKnB,UAAU;IA+DxB;;OAEG;IACH,QAAQ,IAAI,kBAAkB,EAAE;IAsB1B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BnF,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IA4BrF,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAepE,MAAM,IAAI,eAAe,EAAE;IAcrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC"}
@@ -35,11 +35,16 @@ class McpClientManager {
35
35
  await client.connect(clientTransport);
36
36
  } else if (config.type === "sse") {
37
37
  const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
38
- const transport = new SSEClientTransport(new URL(config.url));
38
+ const opts = config.headers ? {
39
+ eventSourceInit: { headers: config.headers },
40
+ requestInit: { headers: config.headers }
41
+ } : undefined;
42
+ const transport = new SSEClientTransport(new URL(config.url), opts);
39
43
  await client.connect(transport);
40
44
  } else if (config.type === "http") {
41
45
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
42
- const transport = new StreamableHTTPClientTransport(new URL(config.url));
46
+ const requestInit = config.headers ? { headers: config.headers } : undefined;
47
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
43
48
  await client.connect(transport);
44
49
  } else {
45
50
  const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
package/dist/mcp/index.js CHANGED
@@ -35,11 +35,16 @@ class McpClientManager {
35
35
  await client.connect(clientTransport);
36
36
  } else if (config.type === "sse") {
37
37
  const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
38
- const transport = new SSEClientTransport(new URL(config.url));
38
+ const opts = config.headers ? {
39
+ eventSourceInit: { headers: config.headers },
40
+ requestInit: { headers: config.headers }
41
+ } : undefined;
42
+ const transport = new SSEClientTransport(new URL(config.url), opts);
39
43
  await client.connect(transport);
40
44
  } else if (config.type === "http") {
41
45
  const { StreamableHTTPClientTransport } = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
42
- const transport = new StreamableHTTPClientTransport(new URL(config.url));
46
+ const requestInit = config.headers ? { headers: config.headers } : undefined;
47
+ const transport = new StreamableHTTPClientTransport(new URL(config.url), { requestInit });
43
48
  await client.connect(transport);
44
49
  } else {
45
50
  const { StdioClientTransport } = await import("@modelcontextprotocol/sdk/client/stdio.js");
@@ -27,14 +27,18 @@ __export(exports_openai_oauth, {
27
27
  import { randomBytes, createHash } from "crypto";
28
28
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
29
29
  import { join } from "path";
30
+ import { homedir } from "os";
31
+ function getHome() {
32
+ return process.env.HOME ?? homedir();
33
+ }
30
34
  function tokenDir() {
31
- return join(process.env.HOME ?? "/root", ".fourmis");
35
+ return join(getHome(), ".fourmis");
32
36
  }
33
37
  function tokenPath() {
34
38
  return join(tokenDir(), "openai-auth.json");
35
39
  }
36
40
  function codexFallbackPath() {
37
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
41
+ return join(getHome(), ".codex", "auth.json");
38
42
  }
39
43
  function loadTokens() {
40
44
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -850,9 +854,10 @@ class OpenAIAdapter {
850
854
  }
851
855
  }
852
856
  function loadTokensSync() {
857
+ const home = process.env.HOME ?? __require("os").homedir();
853
858
  const paths = [
854
- `${process.env.HOME}/.fourmis/openai-auth.json`,
855
- `${process.env.HOME}/.codex/auth.json`
859
+ `${home}/.fourmis/openai-auth.json`,
860
+ `${home}/.codex/auth.json`
856
861
  ];
857
862
  for (const p of paths) {
858
863
  try {
@@ -27,14 +27,18 @@ __export(exports_openai_oauth, {
27
27
  import { randomBytes, createHash } from "crypto";
28
28
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
29
29
  import { join } from "path";
30
+ import { homedir } from "os";
31
+ function getHome() {
32
+ return process.env.HOME ?? homedir();
33
+ }
30
34
  function tokenDir() {
31
- return join(process.env.HOME ?? "/root", ".fourmis");
35
+ return join(getHome(), ".fourmis");
32
36
  }
33
37
  function tokenPath() {
34
38
  return join(tokenDir(), "openai-auth.json");
35
39
  }
36
40
  function codexFallbackPath() {
37
- return join(process.env.HOME ?? "/root", ".codex", "auth.json");
41
+ return join(getHome(), ".codex", "auth.json");
38
42
  }
39
43
  function loadTokens() {
40
44
  for (const p of [tokenPath(), codexFallbackPath()]) {
@@ -1064,9 +1068,10 @@ class OpenAIAdapter {
1064
1068
  }
1065
1069
  }
1066
1070
  function loadTokensSync() {
1071
+ const home = process.env.HOME ?? __require("os").homedir();
1067
1072
  const paths = [
1068
- `${process.env.HOME}/.fourmis/openai-auth.json`,
1069
- `${process.env.HOME}/.codex/auth.json`
1073
+ `${home}/.fourmis/openai-auth.json`,
1074
+ `${home}/.codex/auth.json`
1070
1075
  ];
1071
1076
  for (const p of paths) {
1072
1077
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAkB7C;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,YAAY,CAed"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAkB7C;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,YAAY,CAad"}
@@ -570,8 +570,6 @@ var ALL_TOOLS = {
570
570
  function buildToolRegistry(toolNames, allowedTools, disallowedTools) {
571
571
  const registry = new ToolRegistry;
572
572
  for (const name of toolNames) {
573
- if (allowedTools && !allowedTools.includes(name))
574
- continue;
575
573
  if (disallowedTools?.includes(name))
576
574
  continue;
577
575
  const tool = ALL_TOOLS[name];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fourmis-agents-sdk",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Multi-provider AI agent SDK with direct API access and in-process tool execution",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",