@felan-ai/felan 0.8.0 → 0.10.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.
Files changed (56) hide show
  1. package/NOTICE +23 -2
  2. package/README.md +67 -5
  3. package/dist/application.d.ts.map +1 -1
  4. package/dist/application.js +1 -8
  5. package/dist/application.js.map +1 -1
  6. package/dist/extensions.d.ts +8 -3
  7. package/dist/extensions.d.ts.map +1 -1
  8. package/dist/extensions.js +28 -2
  9. package/dist/extensions.js.map +1 -1
  10. package/dist/mcp/callback-server.d.ts +11 -0
  11. package/dist/mcp/callback-server.d.ts.map +1 -0
  12. package/dist/mcp/callback-server.js +221 -0
  13. package/dist/mcp/callback-server.js.map +1 -0
  14. package/dist/mcp/config.d.ts +20 -0
  15. package/dist/mcp/config.d.ts.map +1 -0
  16. package/dist/mcp/config.js +349 -0
  17. package/dist/mcp/config.js.map +1 -0
  18. package/dist/mcp/index.d.ts +3 -0
  19. package/dist/mcp/index.d.ts.map +1 -0
  20. package/dist/mcp/index.js +22 -0
  21. package/dist/mcp/index.js.map +1 -0
  22. package/dist/mcp/oauth-host.d.ts +41 -0
  23. package/dist/mcp/oauth-host.d.ts.map +1 -0
  24. package/dist/mcp/oauth-host.js +510 -0
  25. package/dist/mcp/oauth-host.js.map +1 -0
  26. package/dist/mcp/oauth-store.d.ts +27 -0
  27. package/dist/mcp/oauth-store.d.ts.map +1 -0
  28. package/dist/mcp/oauth-store.js +138 -0
  29. package/dist/mcp/oauth-store.js.map +1 -0
  30. package/dist/powerline.d.ts +4 -0
  31. package/dist/powerline.d.ts.map +1 -0
  32. package/dist/powerline.js +91 -0
  33. package/dist/powerline.js.map +1 -0
  34. package/dist/runtime.d.ts.map +1 -1
  35. package/dist/runtime.js +1 -1
  36. package/dist/runtime.js.map +1 -1
  37. package/dist/subagents/agent-navigator.d.ts +44 -0
  38. package/dist/subagents/agent-navigator.d.ts.map +1 -0
  39. package/dist/subagents/agent-navigator.js +667 -0
  40. package/dist/subagents/agent-navigator.js.map +1 -0
  41. package/dist/subagents/agent-transcript.d.ts +19 -0
  42. package/dist/subagents/agent-transcript.d.ts.map +1 -0
  43. package/dist/subagents/agent-transcript.js +335 -0
  44. package/dist/subagents/agent-transcript.js.map +1 -0
  45. package/dist/subagents/catalog.d.ts.map +1 -1
  46. package/dist/subagents/catalog.js +2 -1
  47. package/dist/subagents/catalog.js.map +1 -1
  48. package/dist/subagents/host.d.ts +9 -2
  49. package/dist/subagents/host.d.ts.map +1 -1
  50. package/dist/subagents/host.js +40 -8
  51. package/dist/subagents/host.js.map +1 -1
  52. package/package.json +13 -7
  53. package/dist/subagents/presenter.d.ts +0 -11
  54. package/dist/subagents/presenter.d.ts.map +0 -1
  55. package/dist/subagents/presenter.js +0 -34
  56. package/dist/subagents/presenter.js.map +0 -1
package/NOTICE CHANGED
@@ -6,6 +6,27 @@ This package composes the MIT-licensed @felan-ai/agent-core and Felan extension
6
6
  packages listed in package.json. Their package-level LICENSE and NOTICE files
7
7
  contain the applicable attribution and source provenance.
8
8
 
9
- The terminal application uses @earendil-works/pi-coding-agent 0.84.0 from
10
- https://github.com/earendil-works/pi, licensed under the MIT License.
9
+ The terminal application uses @earendil-works/pi-coding-agent and
10
+ @earendil-works/pi-tui 0.84.0 from https://github.com/earendil-works/pi,
11
+ licensed under the MIT License.
11
12
  Copyright (c) 2025 Mario Zechner.
13
+
14
+ The local powerline subscription host adapts provider request behavior from
15
+ packages/pi-powerline in https://github.com/mslavov/pi-extensions at commit
16
+ 7e72e509fe45a5a87c4c2e176cb711de994a8c1d. Copyright (c) 2026 Milko Slavov.
17
+ That source credits the MIT-licensed packages/sub-core from
18
+ https://github.com/marckrenn/pi-sub for subscription provider and usage logic.
19
+ Copyright (c) 2026 Marc Krenn.
20
+
21
+ The local subagent navigator adapts the MIT-licensed agent navigator and
22
+ transcript components from packages/pi-subagents in
23
+ https://github.com/mslavov/pi-extensions at commit
24
+ 7e72e509fe45a5a87c4c2e176cb711de994a8c1d. Copyright (c) 2026 tintinweb.
25
+ Modifications copyright (c) 2026 Milko Slavov.
26
+
27
+ The local MCP OAuth host uses @napi-rs/keyring 1.3.0 from
28
+ https://github.com/Brooooooklyn/keyring-node, licensed under the MIT License.
29
+ Copyright (c) 2020 N-API for Rust.
30
+
31
+ It uses open 11.0.0 from https://github.com/sindresorhus/open, licensed under
32
+ the MIT License. Copyright (c) Sindre Sorhus.
package/README.md CHANGED
@@ -38,7 +38,9 @@ packages, extensions, configured skill paths, prompts, themes, and Pi context
38
38
  files remain filtered. Agent Skills are loaded from `~/.agents/skills` and
39
39
  `<workspace>/.agents/skills` and are shared with local subagents.
40
40
  The built-in powerline reads `~/.felan/powerline.json` (or
41
- `$FELAN_AGENT_DIR/powerline.json`) once when it initializes.
41
+ `$FELAN_AGENT_DIR/powerline.json`) once when it initializes. Its subscription
42
+ segment obtains the active Codex or Claude OAuth token through Felan's
43
+ `ModelRuntime` and requests usage from that provider's fixed endpoint.
42
44
 
43
45
  All built-in extensions are enabled by default. Toggle them in
44
46
  `~/.felan/settings.json`:
@@ -51,9 +53,11 @@ All built-in extensions are enabled by default. Toggle them in
51
53
  "tasks": true,
52
54
  "prewalk": true,
53
55
  "context": true,
56
+ "mcp": true,
54
57
  "webAccess": true,
55
58
  "backgroundBash": true,
56
59
  "codex": true,
60
+ "rtkOptimizer": true,
57
61
  "powerline": false
58
62
  }
59
63
  }
@@ -63,6 +67,50 @@ All built-in extensions are enabled by default. Toggle them in
63
67
  single questions or 1-4 question wizards as searchable overlays or inline
64
68
  dialogs, with multi-select, freeform answers, and optional comments.
65
69
 
70
+ `mcp` provides one OAuth-only remote MCP gateway. It merges
71
+ `$FELAN_AGENT_DIR/mcp.json` with `<cwd>/.mcp.json`; the project file has higher
72
+ precedence for same-name servers. It does not discover `.pi/mcp.json`, Cursor,
73
+ Claude, Codex, or other ambient host configuration. A minimal Felan-owned
74
+ config is:
75
+
76
+ ```json
77
+ {
78
+ "mcpServers": {
79
+ "notion": {
80
+ "url": "https://mcp.notion.com/mcp",
81
+ "auth": "oauth"
82
+ }
83
+ }
84
+ }
85
+ ```
86
+
87
+ Servers in the Felan-owned file must explicitly use `auth: "oauth"`. Standard
88
+ project entries with `type: "http"` and a URL may omit `auth`; Felan treats
89
+ those entries as OAuth. The initial port supports remote HTTP MCP servers
90
+ through Streamable HTTP with classified SSE fallback. Unsupported project
91
+ entries such as stdio, sockets, bearer tokens, and custom headers are skipped
92
+ with a warning rather than executed. Direct tools and MCP Apps are not loaded.
93
+ Optional per-server `oauth` fields are `clientId`, `clientSecret`,
94
+ `clientSecretEnv`, `scope`, `redirectUri`, `clientName`, `clientUri`, and
95
+ `authorizationParams`. Dynamic client registration is used when no client ID
96
+ is configured. A client secret or `clientSecretEnv` requires `clientId`;
97
+ prefer the environment reference over storing a client secret in the file.
98
+ The default callback is `http://127.0.0.1:3118/callback`; set `redirectUri` to
99
+ the exact pre-registered loopback callback when using a configured client.
100
+
101
+ Run `/mcp` to inspect configured servers, list tools, reconnect, authenticate,
102
+ or log out. `/mcp auth [server]` opens a server picker when its argument is
103
+ omitted. Configuration is loaded at startup;
104
+ run `/reload` after editing either file. The model uses the `mcp` gateway tool
105
+ for search, describe, and remote tool calls. The local host follows the upstream
106
+ adapter's browser + PKCE loopback flow and stores tokens and dynamic-client
107
+ credentials in the OS credential store, bound to the Felan agent directory,
108
+ server name, server URL, OAuth client/redirect/scope profile, and
109
+ authorization-server issuer. It fails closed when that store is unavailable.
110
+ Print-mode subagents never open a browser or callback listener; they can reuse
111
+ credentials established by a root TUI session. MCP metadata and results are
112
+ bounded and explicitly marked as untrusted remote content.
113
+
66
114
  `tasks` provides `TaskCreate`, `TaskUpdate`, `TaskList`, and `TaskGet` over one
67
115
  dependency-aware graph shared by the root session and every nested subagent.
68
116
  Task state lives under
@@ -88,6 +136,14 @@ ordinary coding tools when another model is selected. Root and nested sessions
88
136
  load the same optional request controls from `$FELAN_AGENT_DIR/codex.json`; see
89
137
  the extension package README for the three supported fields.
90
138
 
139
+ `rtkOptimizer` delegates command rewrites to an `rtk` executable available in
140
+ the active runtime and compacts noisy command, read, and grep results. It
141
+ supports both ordinary `bash` calls and Codex `exec_command` / `write_stdin`
142
+ calls; Codex result envelopes remain intact while only their `Output:` payloads
143
+ are compacted. Configuration is shared by root and nested sessions at
144
+ `$FELAN_AGENT_DIR/storage/agent/rtk-optimizer/config.json`. Use `/rtk` for
145
+ interactive settings, runtime verification, and session savings metrics.
146
+
91
147
  ## System prompt append
92
148
 
93
149
  The TUI reads one optional `$FELAN_AGENT_DIR/APPEND_SYSTEM.md` file when each
@@ -107,12 +163,18 @@ provides `Agent`, `list_subagents`,
107
163
  `get_subagent_result`, `steer_subagent`, and `cancel_subagent`. A root-scoped
108
164
  local host queues every run asynchronously, persists the latest child session
109
165
  metadata, delivers completion notices, supports bounded nesting, and uses the
110
- application's current workspace. The TUI status line shows active/recent child
111
- state, and runtime shutdown awaits active-child cancellation before Pi teardown.
166
+ application's current workspace. The TUI shows each queued or running direct
167
+ child in a full-width interactive rail beneath the powerline status rows, or
168
+ beneath the editor when powerline is disabled. Press Down at the editor's newest
169
+ prompt to enter the rail, use Up/Down to select a child, press Up on the first
170
+ child to return to the editor, and press Enter to open that child in the agent
171
+ navigator. Use `/agents` or `Alt+A` to open the navigator directly, follow live
172
+ transcripts, send steering messages, or stop active work.
173
+ Runtime shutdown awaits active-child cancellation before Pi teardown.
112
174
  Completed-child continuation uses the same child ID and Pi session file while
113
175
  replacing the latest result. The default list also
114
- includes `@felan-ai/ext-powerline` for an ANSI-aware footer; it is a direct TUI
115
- dependency and is not part of cloud composition.
176
+ includes `@felan-ai/ext-powerline` for an ANSI-aware footer with subscription
177
+ usage; it is a direct TUI dependency and is not part of cloud composition.
116
178
 
117
179
  Local agent definitions are loaded only from bundled Felan definitions,
118
180
  `~/.felan/agents/*.md` (or `$FELAN_AGENT_DIR/agents/*.md`), and
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,oBAAqB,SAAQ,8BAA8B;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CrF"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,oBAAqB,SAAQ,8BAA8B;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrF"}
@@ -1,6 +1,5 @@
1
1
  import { InteractiveMode } from '@earendil-works/pi-coding-agent';
2
2
  import { createLocalFelanRuntime, } from './runtime.js';
3
- import { attachLocalSubagentPresenter } from './subagents/presenter.js';
4
3
  export async function runLocalFelan(options = {}) {
5
4
  const runtime = await createLocalFelanRuntime(options);
6
5
  const previousPiAgentDir = process.env.PI_CODING_AGENT_DIR;
@@ -14,13 +13,7 @@ export async function runLocalFelan(options = {}) {
14
13
  ...(options.initialMessage === undefined ? {} : { initialMessage: options.initialMessage }),
15
14
  ...(options.verbose === undefined ? {} : { verbose: options.verbose }),
16
15
  });
17
- const detachPresenter = attachLocalSubagentPresenter(runtime, mode);
18
- try {
19
- await mode.run();
20
- }
21
- finally {
22
- detachPresenter();
23
- }
16
+ await mode.run();
24
17
  }
25
18
  finally {
26
19
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EACL,uBAAuB,GAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAOxE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC3D,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE;YACxC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,4BAA4B,CAClD,OAAO,EACP,IAAqE,CACtE,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,eAAe,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;YACvD,CAAC;YACD,IAAI,0BAA0B,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,0BAA0B,CAAC;YACjE,CAAC;YACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,mBAAmB,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EACL,uBAAuB,GAExB,MAAM,cAAc,CAAC;AAOtB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC3D,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE;YACxC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;YACvD,CAAC;YACD,IAAI,0BAA0B,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,0BAA0B,CAAC;YACjE,CAAC;YACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,mBAAmB,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,6 +1,9 @@
1
- import type { ExtensionPackageImporter } from '@felan-ai/agent-core';
1
+ import type { ExtensionPackageImporter, ModelRuntime } from '@felan-ai/agent-core';
2
2
  import { type SubagentHost } from '@felan-ai/ext-subagents';
3
+ import { type LocalSubagentNavigatorHost } from './subagents/agent-navigator.js';
3
4
  export declare const askUserExtensionPackage = "@felan-ai/ext-ask-user";
5
+ export declare const mcpExtensionPackage = "@felan-ai/ext-mcp";
6
+ export declare const powerlineExtensionPackage = "@felan-ai/ext-powerline";
4
7
  export declare const subagentsExtensionPackage = "@felan-ai/ext-subagents";
5
8
  export declare const builtinExtensionPackages: {
6
9
  readonly subagents: "@felan-ai/ext-subagents";
@@ -8,15 +11,17 @@ export declare const builtinExtensionPackages: {
8
11
  readonly tasks: "@felan-ai/ext-tasks";
9
12
  readonly prewalk: "@felan-ai/ext-prewalk";
10
13
  readonly context: "@felan-ai/ext-context";
14
+ readonly mcp: "@felan-ai/ext-mcp";
11
15
  readonly webAccess: "@felan-ai/ext-web-access";
12
16
  readonly backgroundBash: "@felan-ai/ext-background-bash";
13
17
  readonly codex: "@felan-ai/ext-codex";
18
+ readonly rtkOptimizer: "@felan-ai/ext-rtk-optimizer";
14
19
  readonly powerline: "@felan-ai/ext-powerline";
15
20
  };
16
- export declare const localExtensionPackages: ("@felan-ai/ext-ask-user" | "@felan-ai/ext-subagents" | "@felan-ai/ext-tasks" | "@felan-ai/ext-prewalk" | "@felan-ai/ext-context" | "@felan-ai/ext-web-access" | "@felan-ai/ext-background-bash" | "@felan-ai/ext-codex" | "@felan-ai/ext-powerline")[];
21
+ export declare const localExtensionPackages: ("@felan-ai/ext-subagents" | "@felan-ai/ext-ask-user" | "@felan-ai/ext-mcp" | "@felan-ai/ext-powerline" | "@felan-ai/ext-tasks" | "@felan-ai/ext-prewalk" | "@felan-ai/ext-context" | "@felan-ai/ext-web-access" | "@felan-ai/ext-background-bash" | "@felan-ai/ext-codex" | "@felan-ai/ext-rtk-optimizer")[];
17
22
  export type BuiltinExtensionName = keyof typeof builtinExtensionPackages;
18
23
  export type BuiltinExtensionSettings = Partial<Record<BuiltinExtensionName, boolean>>;
19
24
  export declare function resolveBuiltinExtensionPackages(settings: unknown): readonly string[];
20
25
  export declare const importLocalExtension: ExtensionPackageImporter;
21
- export declare function createLocalExtensionImporter(host: SubagentHost, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>): ExtensionPackageImporter;
26
+ export declare function createLocalExtensionImporter(host: SubagentHost & LocalSubagentNavigatorHost, modelRuntime: ModelRuntime, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>): ExtensionPackageImporter;
22
27
  //# sourceMappingURL=extensions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,wBAAwB;;;;;;;;;;CAU3B,CAAC;AACX,eAAO,MAAM,sBAAsB,yPAA0C,CAAC;AAE9E,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;AAItF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAYpF;AAED,eAAO,MAAM,oBAAoB,EAAE,wBAKlC,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,YAAY,EAClB,eAAe,GAAE,wBAA+C,EAChE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACjC,wBAAwB,CAoB1B"}
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAInF,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AACvD,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;CAY3B,CAAC;AACX,eAAO,MAAM,sBAAsB,+SAA0C,CAAC;AAE9E,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;AAItF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAYpF;AAED,eAAO,MAAM,oBAAoB,EAAE,wBAKlC,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,YAAY,GAAG,0BAA0B,EAC/C,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,wBAA+C,EAChE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACjC,wBAAwB,CAsC1B"}
@@ -1,7 +1,13 @@
1
1
  import { createAskUserExtension } from '@felan-ai/ext-ask-user';
2
2
  import { createTuiAskUserHost } from '@felan-ai/ext-ask-user/tui';
3
+ import { createPowerlineExtension } from '@felan-ai/ext-powerline';
3
4
  import { createSubagentsExtension, } from '@felan-ai/ext-subagents';
5
+ import { createLocalMcpExtension } from './mcp/index.js';
6
+ import { createLocalSubscriptionUsageHost } from './powerline.js';
7
+ import { registerLocalSubagentNavigator, } from './subagents/agent-navigator.js';
4
8
  export const askUserExtensionPackage = '@felan-ai/ext-ask-user';
9
+ export const mcpExtensionPackage = '@felan-ai/ext-mcp';
10
+ export const powerlineExtensionPackage = '@felan-ai/ext-powerline';
5
11
  export const subagentsExtensionPackage = '@felan-ai/ext-subagents';
6
12
  export const builtinExtensionPackages = {
7
13
  subagents: subagentsExtensionPackage,
@@ -9,10 +15,12 @@ export const builtinExtensionPackages = {
9
15
  tasks: '@felan-ai/ext-tasks',
10
16
  prewalk: '@felan-ai/ext-prewalk',
11
17
  context: '@felan-ai/ext-context',
18
+ mcp: mcpExtensionPackage,
12
19
  webAccess: '@felan-ai/ext-web-access',
13
20
  backgroundBash: '@felan-ai/ext-background-bash',
14
21
  codex: '@felan-ai/ext-codex',
15
- powerline: '@felan-ai/ext-powerline',
22
+ rtkOptimizer: '@felan-ai/ext-rtk-optimizer',
23
+ powerline: powerlineExtensionPackage,
16
24
  };
17
25
  export const localExtensionPackages = Object.values(builtinExtensionPackages);
18
26
  const localExtensionPackageSet = new Set(localExtensionPackages);
@@ -37,16 +45,30 @@ export const importLocalExtension = async (packageName) => {
37
45
  }
38
46
  return import(packageName);
39
47
  };
40
- export function createLocalExtensionImporter(host, importExtension = importLocalExtension, shutdownHost) {
48
+ export function createLocalExtensionImporter(host, modelRuntime, importExtension = importLocalExtension, shutdownHost) {
49
+ let powerlineLoaded = false;
50
+ let agentRailRenderer;
51
+ const powerline = createPowerlineExtension(createLocalSubscriptionUsageHost(modelRuntime), {
52
+ footerRows: (width) => agentRailRenderer?.(width) ?? [],
53
+ });
41
54
  return async (packageName) => {
42
55
  if (packageName === askUserExtensionPackage) {
43
56
  return { default: createAskUserExtension(createTuiAskUserHost()) };
44
57
  }
58
+ if (packageName === mcpExtensionPackage) {
59
+ return { default: createLocalMcpExtension() };
60
+ }
45
61
  if (packageName === subagentsExtensionPackage) {
46
62
  const subagents = createSubagentsExtension(host);
47
63
  return {
48
64
  default: ((pi) => {
49
65
  subagents(pi);
66
+ registerLocalSubagentNavigator(pi, host, {
67
+ renderRailInEditor: () => !powerlineLoaded,
68
+ onRailRendererChange: (renderer) => {
69
+ agentRailRenderer = renderer;
70
+ },
71
+ });
50
72
  if (shutdownHost) {
51
73
  pi.on('session_shutdown', async (event) => {
52
74
  if (event.reason !== 'reload')
@@ -56,6 +78,10 @@ export function createLocalExtensionImporter(host, importExtension = importLocal
56
78
  }),
57
79
  };
58
80
  }
81
+ if (packageName === powerlineExtensionPackage) {
82
+ powerlineLoaded = true;
83
+ return { default: powerline };
84
+ }
59
85
  return importExtension(packageName);
60
86
  };
61
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface OAuthCallbackResult {
2
+ readonly code: string;
3
+ readonly iss?: string;
4
+ }
5
+ export interface OAuthCallbackReservation {
6
+ readonly redirectUri: string;
7
+ wait(): Promise<OAuthCallbackResult>;
8
+ release(): void;
9
+ }
10
+ export declare function reserveOAuthCallback(redirectUri: string, state: string, signal: AbortSignal, timeoutMs?: number): Promise<OAuthCallbackReservation>;
11
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/mcp/callback-server.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAoBD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,SAAS,SAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAenC"}
@@ -0,0 +1,221 @@
1
+ import { createServer } from 'node:http';
2
+ const DEFAULT_CALLBACK_TIMEOUT_MS = 5 * 60 * 1_000;
3
+ const brokers = new Map();
4
+ export async function reserveOAuthCallback(redirectUri, state, signal, timeoutMs = DEFAULT_CALLBACK_TIMEOUT_MS) {
5
+ if (!/^[A-Za-z0-9_-]{32,256}$/u.test(state))
6
+ throw new Error('OAuth state is invalid');
7
+ if (!Number.isInteger(timeoutMs) || timeoutMs <= 0)
8
+ throw new Error('OAuth callback timeout must be positive');
9
+ const endpoint = parseRedirectUri(redirectUri);
10
+ for (;;) {
11
+ let broker = brokers.get(endpoint.key);
12
+ if (!broker) {
13
+ broker = new EndpointBroker(endpoint);
14
+ brokers.set(endpoint.key, broker);
15
+ }
16
+ await broker.ready;
17
+ if (broker.accepting)
18
+ return broker.reserve(endpoint, state, signal, timeoutMs);
19
+ await broker.closed;
20
+ }
21
+ }
22
+ class EndpointBroker {
23
+ ready;
24
+ closed;
25
+ #endpoint;
26
+ #server;
27
+ #pending = new Map();
28
+ #accepting = true;
29
+ #resolveClosed;
30
+ constructor(endpoint) {
31
+ this.#endpoint = endpoint;
32
+ this.#server = createServer((request, response) => this.#handle(request, response));
33
+ this.closed = new Promise((resolve) => {
34
+ this.#resolveClosed = resolve;
35
+ });
36
+ this.ready = new Promise((resolve, reject) => {
37
+ const onError = (error) => {
38
+ this.#accepting = false;
39
+ brokers.delete(endpoint.key);
40
+ reject(new Error(`Could not start OAuth callback listener on ${endpoint.listenHost}:${endpoint.port}`, {
41
+ cause: error,
42
+ }));
43
+ this.#resolveClosed();
44
+ };
45
+ this.#server.once('error', onError);
46
+ this.#server.listen(endpoint.port, endpoint.listenHost, () => {
47
+ this.#server.removeListener('error', onError);
48
+ this.#server.on('error', (error) => this.#failAll(error));
49
+ resolve();
50
+ });
51
+ });
52
+ }
53
+ get accepting() {
54
+ return this.#accepting;
55
+ }
56
+ reserve(endpoint, state, signal, timeoutMs) {
57
+ if (!this.#accepting)
58
+ throw new Error('OAuth callback listener is closing');
59
+ if (this.#pending.has(state))
60
+ throw new Error('OAuth callback state is already reserved');
61
+ signal.throwIfAborted();
62
+ let resolve;
63
+ let reject;
64
+ const promise = new Promise((resolvePromise, rejectPromise) => {
65
+ resolve = resolvePromise;
66
+ reject = rejectPromise;
67
+ });
68
+ const onAbort = () => this.#remove(state, abortReason(signal));
69
+ const timer = setTimeout(() => {
70
+ this.#remove(state, new Error('OAuth callback timed out'));
71
+ }, timeoutMs);
72
+ const cleanup = () => {
73
+ clearTimeout(timer);
74
+ signal.removeEventListener('abort', onAbort);
75
+ };
76
+ this.#pending.set(state, {
77
+ path: endpoint.path,
78
+ promise,
79
+ resolve,
80
+ reject,
81
+ cleanup,
82
+ });
83
+ signal.addEventListener('abort', onAbort, { once: true });
84
+ if (signal.aborted)
85
+ onAbort();
86
+ let released = false;
87
+ return {
88
+ redirectUri: endpoint.url.toString(),
89
+ wait: () => promise,
90
+ release: () => {
91
+ if (released)
92
+ return;
93
+ released = true;
94
+ this.#remove(state, new Error('OAuth callback cancelled'));
95
+ },
96
+ };
97
+ }
98
+ #handle(request, response) {
99
+ setCallbackHeaders(response);
100
+ if (request.method !== 'GET' || !request.url) {
101
+ respond(response, 405, 'OAuth callback requires GET.');
102
+ return;
103
+ }
104
+ let url;
105
+ try {
106
+ url = new URL(request.url, this.#endpoint.url.origin);
107
+ }
108
+ catch {
109
+ respond(response, 400, 'Invalid OAuth callback.');
110
+ return;
111
+ }
112
+ const state = url.searchParams.get('state');
113
+ const pending = state ? this.#pending.get(state) : undefined;
114
+ if (!state || !pending || url.pathname !== pending.path) {
115
+ respond(response, 400, 'Invalid or expired OAuth callback.');
116
+ return;
117
+ }
118
+ const providerError = url.searchParams.get('error');
119
+ const code = url.searchParams.get('code');
120
+ if (providerError) {
121
+ this.#remove(state, new Error('OAuth authorization was denied'));
122
+ respond(response, 400, 'OAuth authorization was not completed. You can close this window.');
123
+ return;
124
+ }
125
+ if (!code) {
126
+ this.#remove(state, new Error('OAuth callback did not include an authorization code'));
127
+ respond(response, 400, 'OAuth callback did not include a code. You can close this window.');
128
+ return;
129
+ }
130
+ this.#pending.delete(state);
131
+ pending.cleanup();
132
+ pending.resolve({
133
+ code,
134
+ ...(url.searchParams.get('iss') === null ? {} : { iss: url.searchParams.get('iss') }),
135
+ });
136
+ respond(response, 200, 'OAuth authentication completed. You can close this window.');
137
+ this.#closeIfIdle();
138
+ }
139
+ #remove(state, error) {
140
+ const pending = this.#pending.get(state);
141
+ if (!pending)
142
+ return;
143
+ this.#pending.delete(state);
144
+ pending.cleanup();
145
+ pending.reject(error);
146
+ void pending.promise.catch(() => { });
147
+ this.#closeIfIdle();
148
+ }
149
+ #failAll(error) {
150
+ for (const state of [...this.#pending.keys()]) {
151
+ this.#remove(state, new Error('OAuth callback listener failed', { cause: error }));
152
+ }
153
+ this.#closeIfIdle();
154
+ }
155
+ #closeIfIdle() {
156
+ if (!this.#accepting || this.#pending.size > 0)
157
+ return;
158
+ this.#accepting = false;
159
+ setImmediate(() => {
160
+ if (this.#pending.size > 0) {
161
+ this.#accepting = true;
162
+ return;
163
+ }
164
+ this.#server.close(() => {
165
+ if (brokers.get(this.#endpoint.key) === this)
166
+ brokers.delete(this.#endpoint.key);
167
+ this.#resolveClosed();
168
+ });
169
+ });
170
+ }
171
+ }
172
+ function parseRedirectUri(value) {
173
+ let url;
174
+ try {
175
+ url = new URL(value);
176
+ }
177
+ catch (error) {
178
+ throw new Error('OAuth redirectUri must be an absolute URL', { cause: error });
179
+ }
180
+ const hostname = url.hostname.toLowerCase();
181
+ const listenHost = hostname === '[::1]' || hostname === '::1'
182
+ ? '::1'
183
+ : hostname;
184
+ if (url.protocol !== 'http:'
185
+ || (listenHost !== '127.0.0.1' && listenHost !== '::1' && listenHost !== 'localhost')) {
186
+ throw new Error('OAuth redirectUri must use HTTP on localhost or a loopback address');
187
+ }
188
+ if (url.username || url.password || url.search || url.hash) {
189
+ throw new Error('OAuth redirectUri must not contain credentials, a query, or a fragment');
190
+ }
191
+ if (!url.port)
192
+ throw new Error('OAuth redirectUri must include an explicit port');
193
+ const port = Number.parseInt(url.port, 10);
194
+ if (!Number.isInteger(port) || port <= 0 || port > 65_535) {
195
+ throw new Error('OAuth redirectUri must include a valid port');
196
+ }
197
+ const path = url.pathname || '/';
198
+ return {
199
+ url,
200
+ listenHost,
201
+ port,
202
+ path,
203
+ key: `${listenHost}:${port}`,
204
+ };
205
+ }
206
+ function setCallbackHeaders(response) {
207
+ response.setHeader('cache-control', 'no-store');
208
+ response.setHeader('content-security-policy', "default-src 'none'; frame-ancestors 'none'; base-uri 'none'");
209
+ response.setHeader('content-type', 'text/plain; charset=utf-8');
210
+ response.setHeader('referrer-policy', 'no-referrer');
211
+ response.setHeader('x-content-type-options', 'nosniff');
212
+ response.setHeader('x-frame-options', 'DENY');
213
+ }
214
+ function respond(response, status, message) {
215
+ response.statusCode = status;
216
+ response.end(message);
217
+ }
218
+ function abortReason(signal) {
219
+ return signal.reason instanceof Error ? signal.reason : new Error('OAuth callback aborted');
220
+ }
221
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../src/mcp/callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AgentRuntime } from '@felan-ai/agent-core';
2
+ import { type McpConfig } from '@felan-ai/ext-mcp';
3
+ export interface LocalMcpOAuthConfig {
4
+ readonly clientId?: string;
5
+ readonly clientSecret?: string;
6
+ readonly clientSecretEnv?: string;
7
+ readonly scope?: string;
8
+ readonly redirectUri?: string;
9
+ readonly clientName?: string;
10
+ readonly clientUri?: string;
11
+ readonly authorizationParams?: Readonly<Record<string, string>>;
12
+ }
13
+ export interface LocalMcpConfig {
14
+ readonly config: McpConfig;
15
+ readonly oauth: Readonly<Record<string, LocalMcpOAuthConfig>>;
16
+ readonly warnings: readonly string[];
17
+ }
18
+ export declare function readLocalMcpConfig(runtime: AgentRuntime, agentDir: string): Promise<LocalMcpConfig>;
19
+ export declare function validateLocalMcpConfig(value: unknown, source?: string): LocalMcpConfig;
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAwCD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAIzB;AA2CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAa,GAAG,cAAc,CAgC1F"}