@felan-ai/felan 0.35.1 → 0.35.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.
package/README.md CHANGED
@@ -63,7 +63,7 @@ are unchanged; the model API identifier `azure-openai-responses` is also still
63
63
  used by Azure model definitions.
64
64
 
65
65
  Felan Code supports Node.js 22.19.0 or newer. Repository development and CI use
66
- Node.js 22.20.0 with pnpm 9.15.5.
66
+ Node.js 22.23.4 with pnpm 9.15.5.
67
67
 
68
68
  ```sh
69
69
  felan
@@ -0,0 +1,3 @@
1
+ export declare function loadAgentEnvironment(agentDir: string, environment?: NodeJS.ProcessEnv): boolean;
2
+ export declare function daemonTargetAgentDir(targetArgument: string | undefined): string | undefined;
3
+ //# sourceMappingURL=agent-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-environment.d.ts","sourceRoot":"","sources":["../src/agent-environment.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM5G;AAGD,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAW3F"}
@@ -0,0 +1,35 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parseEnv } from 'node:util';
4
+ // The daemon outlives the client that spawned it, so the agent directory's .env overrides the inherited
5
+ // environment to keep configuration independent of which terminal started the daemon. It must run before
6
+ // daemon-scoped providers read the environment.
7
+ export function loadAgentEnvironment(agentDir, environment = process.env) {
8
+ let contents;
9
+ try {
10
+ contents = readFileSync(join(agentDir, '.env'), 'utf8');
11
+ }
12
+ catch (error) {
13
+ return error.code === 'ENOENT';
14
+ }
15
+ Object.assign(environment, parseEnv(contents));
16
+ return true;
17
+ }
18
+ // Mirrors the daemon's launch target layout; the daemon validates the target itself afterwards.
19
+ export function daemonTargetAgentDir(targetArgument) {
20
+ try {
21
+ const target = JSON.parse(targetArgument ?? '');
22
+ if (!target || typeof target !== 'object')
23
+ return undefined;
24
+ const kind = Reflect.get(target, 'kind');
25
+ const agentDir = Reflect.get(target, 'agentDir');
26
+ const directory = Reflect.get(target, 'directory');
27
+ if (kind === 'production' && typeof agentDir === 'string')
28
+ return agentDir;
29
+ if (kind === 'isolated' && typeof directory === 'string')
30
+ return join(directory, 'agent');
31
+ }
32
+ catch { }
33
+ return undefined;
34
+ }
35
+ //# sourceMappingURL=agent-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-environment.js","sourceRoot":"","sources":["../src/agent-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,wGAAwG;AACxG,yGAAyG;AACzG,gDAAgD;AAChD,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,cAAiC,OAAO,CAAC,GAAG;IACjG,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAChE,OAAO,KAAK,EAAE,CAAC;QAAC,OAAQ,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;IAAC,CAAC;IAC5E,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,cAAkC;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,YAAY,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC3E,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -105,9 +105,9 @@ export declare class SessionClient {
105
105
  retryAt: number;
106
106
  } | undefined;
107
107
  get identity(): {
108
+ agentDir: string;
108
109
  namespaceId: string;
109
110
  instanceId: string;
110
- agentDir: string;
111
111
  rootSet: string[];
112
112
  } | undefined;
113
113
  get capabilities(): {
@@ -121,9 +121,9 @@ export declare class SessionClient {
121
121
  capabilities?: ("ui.action" | "ui.status" | "ui.progress" | "ui.document" | "ui.view" | "native.events")[];
122
122
  daemonVersion: string;
123
123
  identity: {
124
+ agentDir: string;
124
125
  namespaceId: string;
125
126
  instanceId: string;
126
- agentDir: string;
127
127
  rootSet: string[];
128
128
  };
129
129
  protocol: 1;
@@ -1,5 +1,6 @@
1
1
  import { fileURLToPath } from 'node:url';
2
2
  import { runDaemonProcess } from '@felan-ai/daemon/daemon-bootstrap';
3
+ import { daemonTargetAgentDir, loadAgentEnvironment } from './agent-environment.js';
3
4
  import { FELAN_VERSION } from './version.js';
4
5
  const manager = {
5
6
  packageName: '@felan-ai/felan',
@@ -8,6 +9,10 @@ const manager = {
8
9
  resolveProvider: specifier => import.meta.resolve(specifier),
9
10
  packagedDefaultPath: fileURLToPath(new URL('./host.json', import.meta.url)),
10
11
  };
12
+ const agentDir = daemonTargetAgentDir(process.argv[2]);
13
+ if (agentDir && !loadAgentEnvironment(agentDir)) {
14
+ process.stderr.write('Felan daemon could not read .env; using the inherited environment.\n');
15
+ }
11
16
  try {
12
17
  await runDaemonProcess(process.argv.slice(2), manager);
13
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-host.js","sourceRoot":"","sources":["../src/daemon-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,OAAO,GAAgB;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;IAC5B,eAAe,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5D,mBAAmB,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CAC5E,CAAC;AAEF,IAAI,CAAC;IAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAAC,CAAC;AAC/D,MAAM,CAAC;IACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;IACjG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"daemon-host.js","sourceRoot":"","sources":["../src/daemon-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,OAAO,GAAgB;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;IAC5B,eAAe,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5D,mBAAmB,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,IAAI,QAAQ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;AAC/F,CAAC;AAED,IAAI,CAAC;IAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAAC,CAAC;AAC/D,MAAM,CAAC;IACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;IACjG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@felan-ai/felan",
3
- "version": "0.35.1",
3
+ "version": "0.35.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@felan-ai/felan",
9
- "version": "0.35.1",
9
+ "version": "0.35.3",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@felan-ai/daemon": "0.5.1",
12
+ "@felan-ai/daemon": "0.5.2",
13
13
  "@agentclientprotocol/sdk": "1.4.0",
14
14
  "@earendil-works/pi-coding-agent": "1.4.0",
15
15
  "@earendil-works/pi-tui": "1.4.0",
@@ -19,31 +19,31 @@
19
19
  "typebox": "1.1.38",
20
20
  "@felan-ai/agent-core": "0.14.5",
21
21
  "@felan-ai/ext-ask-user": "0.11.4",
22
- "@felan-ai/ext-background-bash": "0.13.4",
23
22
  "@felan-ai/ext-browser": "0.13.0",
24
- "@felan-ai/ext-codebase-memory": "0.9.0",
25
23
  "@felan-ai/ext-claude-code": "0.2.1",
24
+ "@felan-ai/ext-codebase-memory": "0.9.0",
25
+ "@felan-ai/ext-background-bash": "0.13.4",
26
26
  "@felan-ai/ext-codex": "0.11.0",
27
+ "@felan-ai/ext-context-view": "0.9.1",
27
28
  "@felan-ai/ext-context": "0.11.0",
28
29
  "@felan-ai/ext-felan-api": "0.9.1",
29
30
  "@felan-ai/ext-fusion": "0.3.4",
30
- "@felan-ai/ext-context-view": "0.9.1",
31
31
  "@felan-ai/ext-insights": "0.9.1",
32
32
  "@felan-ai/ext-markitdown": "0.10.1",
33
- "@felan-ai/ext-memory": "0.10.1",
34
33
  "@felan-ai/ext-mcp": "0.9.1",
35
- "@felan-ai/ext-output-style": "0.10.0",
34
+ "@felan-ai/ext-memory": "0.10.1",
36
35
  "@felan-ai/ext-model-tools": "0.5.0",
37
36
  "@felan-ai/ext-powerline": "0.15.0",
38
37
  "@felan-ai/ext-prewalk": "0.13.1",
39
- "@felan-ai/ext-prompt-history": "0.8.4",
40
38
  "@felan-ai/ext-rtk-optimizer": "0.11.1",
41
39
  "@felan-ai/ext-session-compaction": "0.8.0",
40
+ "@felan-ai/ext-prompt-history": "0.8.4",
41
+ "@felan-ai/ext-output-style": "0.10.0",
42
42
  "@felan-ai/ext-session-title": "0.8.0",
43
- "@felan-ai/session-protocol": "0.4.1",
44
43
  "@felan-ai/ext-subagents": "0.13.1",
45
- "@felan-ai/ext-web-access": "0.12.1",
46
- "@felan-ai/ext-tasks": "0.10.0"
44
+ "@felan-ai/ext-tasks": "0.10.0",
45
+ "@felan-ai/session-protocol": "0.4.1",
46
+ "@felan-ai/ext-web-access": "0.12.1"
47
47
  },
48
48
  "bin": {
49
49
  "felan": "./dist/cli.js"
@@ -590,8 +590,8 @@
590
590
  }
591
591
  },
592
592
  "node_modules/@felan-ai/daemon": {
593
- "version": "0.5.1",
594
- "resolved": "https://registry.npmjs.org/@felan-ai/daemon/-/daemon-0.5.1.tgz",
593
+ "version": "0.5.2",
594
+ "resolved": "https://registry.npmjs.org/@felan-ai/daemon/-/daemon-0.5.2.tgz",
595
595
  "license": "MIT",
596
596
  "dependencies": {
597
597
  "@earendil-works/pi-coding-agent": "1.4.0",
@@ -1722,6 +1722,7 @@
1722
1722
  "version": "3.34.1",
1723
1723
  "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.34.1.tgz",
1724
1724
  "integrity": "sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw==",
1725
+ "deprecated": "Deprecated due to a bug in custom logger data redaction. See https://github.com/aws/aws-sdk-js-v3/issues/8393.",
1725
1726
  "license": "Apache-2.0",
1726
1727
  "dependencies": {
1727
1728
  "@smithy/types": "^4.18.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@felan-ai/felan",
3
- "version": "0.35.1",
3
+ "version": "0.35.3",
4
4
  "description": "Felan Code: an open-source, model-portable coding agent built for cost-efficient, verifiable software work",
5
5
  "keywords": [
6
6
  "ai",
@@ -86,7 +86,7 @@
86
86
  }
87
87
  },
88
88
  "dependencies": {
89
- "@felan-ai/daemon": "0.5.1",
89
+ "@felan-ai/daemon": "0.5.2",
90
90
  "@agentclientprotocol/sdk": "1.4.0",
91
91
  "@earendil-works/pi-coding-agent": "1.4.0",
92
92
  "@earendil-works/pi-tui": "1.4.0",
@@ -95,32 +95,32 @@
95
95
  "open": "11.0.0",
96
96
  "typebox": "1.1.38",
97
97
  "@felan-ai/agent-core": "0.14.5",
98
- "@felan-ai/ext-ask-user": "0.11.4",
99
- "@felan-ai/ext-browser": "0.13.0",
100
- "@felan-ai/ext-codebase-memory": "0.9.0",
101
98
  "@felan-ai/ext-background-bash": "0.13.4",
99
+ "@felan-ai/ext-browser": "0.13.0",
102
100
  "@felan-ai/ext-claude-code": "0.2.1",
101
+ "@felan-ai/ext-codebase-memory": "0.9.0",
102
+ "@felan-ai/ext-ask-user": "0.11.4",
103
103
  "@felan-ai/ext-codex": "0.11.0",
104
- "@felan-ai/ext-context": "0.11.0",
105
- "@felan-ai/ext-felan-api": "0.9.1",
106
104
  "@felan-ai/ext-context-view": "0.9.1",
105
+ "@felan-ai/ext-felan-api": "0.9.1",
106
+ "@felan-ai/ext-context": "0.11.0",
107
+ "@felan-ai/ext-fusion": "0.3.4",
107
108
  "@felan-ai/ext-insights": "0.9.1",
108
- "@felan-ai/ext-markitdown": "0.10.1",
109
109
  "@felan-ai/ext-mcp": "0.9.1",
110
- "@felan-ai/ext-fusion": "0.3.4",
110
+ "@felan-ai/ext-memory": "0.10.1",
111
111
  "@felan-ai/ext-model-tools": "0.5.0",
112
+ "@felan-ai/ext-markitdown": "0.10.1",
112
113
  "@felan-ai/ext-output-style": "0.10.0",
113
- "@felan-ai/ext-memory": "0.10.1",
114
+ "@felan-ai/ext-powerline": "0.15.0",
114
115
  "@felan-ai/ext-prewalk": "0.13.1",
115
116
  "@felan-ai/ext-prompt-history": "0.8.4",
116
117
  "@felan-ai/ext-rtk-optimizer": "0.11.1",
117
- "@felan-ai/ext-powerline": "0.15.0",
118
118
  "@felan-ai/ext-session-compaction": "0.8.0",
119
119
  "@felan-ai/ext-session-title": "0.8.0",
120
+ "@felan-ai/ext-tasks": "0.10.0",
120
121
  "@felan-ai/ext-subagents": "0.13.1",
121
122
  "@felan-ai/ext-web-access": "0.12.1",
122
- "@felan-ai/session-protocol": "0.4.1",
123
- "@felan-ai/ext-tasks": "0.10.0"
123
+ "@felan-ai/session-protocol": "0.4.1"
124
124
  },
125
125
  "publishConfig": {
126
126
  "access": "public",