identity.mjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright (c) 未来飞马
  2. //
  3. // MIT License — Copyright (c) 2026 Fmode (未来飞马)
  4. //
  5. // Trademark Notice:
  6. // The MIT license grants copyright permissions for source code only.
  7. // It does NOT grant any rights to use trademarks including "未来飞马",
  8. // "Harness Loop", "RSI", and associated slogan "让AI进化提前发生,让AI落地快人一步".
  9. // Any use of these trademarks requires separate written permission.
  10. import { readFileSync, existsSync } from 'node:fs';
  11. import { hostname, homedir } from 'node:os';
  12. // 读取 JSON 文件,自动剥 BOM,失败返回 null
  13. function readJson(p) {
  14. if (!existsSync(p)) return null;
  15. try {
  16. const raw = readFileSync(p, 'utf-8').replace(/^/, '');
  17. return JSON.parse(raw);
  18. } catch {
  19. return null;
  20. }
  21. }
  22. /**
  23. * 身份解析高兼容链:
  24. * userid: FMODE_USERID → FMODE_AGENT_USERID → /opt/data/fmode-identity.json → $HOME/.fmode/config.json → ./.fmode/config.json
  25. * sessionToken: FMODE_SESSION_TOKEN → $HOME/.fmode/config/user.json → $HOME/.fmode/config.json → ./.fmode/config.json
  26. * agentId: FMODE_AGENT_ID → AGENT_ID → $HOME/.fmode/config.json → hostname()
  27. *
  28. * $HOME 容器 hermes 用户 = /opt/data;root 用户 = /root;两处都能命中。
  29. */
  30. export function resolveIdentity() {
  31. const home = process.env.HOME || homedir();
  32. const userid =
  33. process.env.FMODE_USERID ||
  34. process.env.FMODE_AGENT_USERID ||
  35. readJson('/opt/data/fmode-identity.json')?.userid ||
  36. readJson(`${home}/.fmode/config.json`)?.userid ||
  37. readJson('./.fmode/config.json')?.userid ||
  38. null;
  39. const sessionToken =
  40. process.env.FMODE_SESSION_TOKEN ||
  41. readJson(`${home}/.fmode/config/user.json`)?.sessionToken ||
  42. readJson(`${home}/.fmode/config.json`)?.sessionToken ||
  43. readJson('./.fmode/config.json')?.sessionToken ||
  44. // ⚠️ 兜底:容器普遍有 /opt/data/fmode-identity.json(开通时写入),
  45. // 而 ~/.fmode/config.json 不一定有。放在最后不改变既有优先级。
  46. // 实测 34 台容器中 32 台只有 fmode-identity.json 带 session_token。
  47. readJson('/opt/data/fmode-identity.json')?.session_token ||
  48. readJson(`${home}/.fmode-harness-agent/fmode-identity.json`)?.session_token ||
  49. null;
  50. const agentId =
  51. process.env.FMODE_AGENT_ID ||
  52. process.env.AGENT_ID ||
  53. readJson(`${home}/.fmode/config.json`)?.agentId ||
  54. hostname();
  55. return { userid, sessionToken, agentId };
  56. }
  57. /** 仅打印身份摘要(不暴露密钥本体)*/
  58. export function identitySummary(identity) {
  59. const { userid, sessionToken, agentId } = identity;
  60. return {
  61. userid: userid || '(未找到)',
  62. sessionToken: sessionToken
  63. ? `${sessionToken.slice(0, 8)}... (${sessionToken.length} 字符)`
  64. : '(未找到)',
  65. agentId,
  66. };
  67. }