@atel-ai/runtime-core 0.1.2 → 0.1.3

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 +1 @@
1
- {"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAuC,MAAM,YAAY,CAAC;AAS/E,eAAO,MAAM,aAAa,EAAE,OA6B3B,CAAC"}
1
+ {"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAuC,MAAM,YAAY,CAAC;AAS/E,eAAO,MAAM,aAAa,EAAE,OAqC3B,CAAC"}
@@ -10,6 +10,7 @@
10
10
  * 首跑冷连接可能慢(实测首次可达 220s),timeout 给足。
11
11
  */
12
12
  import fs from 'node:fs';
13
+ import os from 'node:os';
13
14
  import path from 'node:path';
14
15
  import { CliWaker } from '../wakers/cli.js';
15
16
  import { which, runText } from './util.js';
@@ -28,22 +29,55 @@ export const hermesAdapter = {
28
29
  return { present: true, binPath: bin, version };
29
30
  },
30
31
  async writeMcpConfig(ctx) {
31
- // Hermes env MCP_ATEL_API_KEY 注入纯 JWT;落盘供唤醒器读取注入。
32
+ // Hermes 配置里写 `Authorization: Bearer ${MCP_ATEL_API_KEY}`,且它从 ~/.hermes/.env
33
+ // 读该变量(优先级高于进程 env,真机实证)。所以 JWT 续期必须写进 ~/.hermes/.env,
34
+ // 否则用旧 token 连到旧身份。同时落 dataDir 一份备查。
32
35
  const f = tokenFile(ctx.config.dataDir);
33
36
  fs.mkdirSync(path.dirname(f), { recursive: true });
34
37
  fs.writeFileSync(f, ctx.token);
38
+ upsertHermesEnv('MCP_ATEL_API_KEY', ctx.token);
35
39
  },
36
40
  createWaker(ctx) {
37
41
  return new CliWaker({
38
42
  bin: 'hermes',
39
43
  defaultTimeoutMs: 360_000, // 冷启首次可达 220s,留足
40
44
  log: ctx.log,
41
- buildArgs: ({ prompt }) => ['chat', '-q', prompt, '--yolo'],
45
+ // hermes chat -q;若设了 ATEL_HERMES_MODEL 则用它(需有能力的模型 + 网关 dotted id,
46
+ // 如 claude-sonnet-4.6;haiku 太弱会把 MCP 工具当 shell 命令误调,真机实证)。
47
+ buildArgs: ({ prompt }) => {
48
+ const m = process.env.ATEL_HERMES_MODEL;
49
+ return ['chat', '-q', prompt, ...(m ? ['-m', m] : []), '--yolo'];
50
+ },
42
51
  // 每次唤醒前读最新 JWT 注入 env(JWT 续期后即时生效;token 由 writeMcpConfig 落盘)
43
52
  env: () => readHermesEnv(ctx.config.dataDir),
44
53
  });
45
54
  },
46
55
  };
56
+ /** upsert KEY=value 到 ~/.hermes/.env(hermes 真正读取 MCP header 变量的地方)。 */
57
+ function upsertHermesEnv(key, value) {
58
+ try {
59
+ const envPath = path.join(os.homedir(), '.hermes', '.env');
60
+ let s = '';
61
+ try {
62
+ s = fs.readFileSync(envPath, 'utf8');
63
+ }
64
+ catch {
65
+ s = '';
66
+ }
67
+ const line = `${key}=${value}`;
68
+ if (new RegExp(`^${key}=.*$`, 'm').test(s)) {
69
+ s = s.replace(new RegExp(`^${key}=.*$`, 'm'), line);
70
+ }
71
+ else {
72
+ s = (s ? s.replace(/\n*$/, '\n') : '') + line + '\n';
73
+ }
74
+ fs.mkdirSync(path.dirname(envPath), { recursive: true });
75
+ fs.writeFileSync(envPath, s);
76
+ }
77
+ catch {
78
+ /* best-effort;~/.hermes 不存在时(hermes 未装)忽略 */
79
+ }
80
+ }
47
81
  function readHermesEnv(dataDir) {
48
82
  try {
49
83
  const token = fs.readFileSync(tokenFile(dataDir), 'utf8').trim();
@@ -1 +1 @@
1
- {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE3C,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,EAAE,EAAE,QAAQ;IACZ,WAAW,EAAE,uBAAuB;IACpC,IAAI,EAAE,KAAK;IAEX,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAgB;QACnC,oDAAoD;QACpD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,WAAW,CAAC,GAAa;QACvB,OAAO,IAAI,QAAQ,CAAC;YAClB,GAAG,EAAE,QAAQ;YACb,gBAAgB,EAAE,OAAO,EAAE,iBAAiB;YAC5C,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC;YAC3D,6DAA6D;YAC7D,GAAG,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atel-ai/runtime-core",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "ATEL agent companion 内核: 两路入站(Spine订阅+relay轮询) + 无头唤醒 + 事件→角色→工具映射 + JWT生命周期 + 失败自治 + 可观测",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",