@felan-ai/felan 0.8.0 → 0.9.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 +58 -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 +7 -3
  7. package/dist/extensions.d.ts.map +1 -1
  8. package/dist/extensions.js +27 -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 +12 -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,6 +53,7 @@ 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,
@@ -63,6 +66,50 @@ All built-in extensions are enabled by default. Toggle them in
63
66
  single questions or 1-4 question wizards as searchable overlays or inline
64
67
  dialogs, with multi-select, freeform answers, and optional comments.
65
68
 
69
+ `mcp` provides one OAuth-only remote MCP gateway. It merges
70
+ `$FELAN_AGENT_DIR/mcp.json` with `<cwd>/.mcp.json`; the project file has higher
71
+ precedence for same-name servers. It does not discover `.pi/mcp.json`, Cursor,
72
+ Claude, Codex, or other ambient host configuration. A minimal Felan-owned
73
+ config is:
74
+
75
+ ```json
76
+ {
77
+ "mcpServers": {
78
+ "notion": {
79
+ "url": "https://mcp.notion.com/mcp",
80
+ "auth": "oauth"
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ Servers in the Felan-owned file must explicitly use `auth: "oauth"`. Standard
87
+ project entries with `type: "http"` and a URL may omit `auth`; Felan treats
88
+ those entries as OAuth. The initial port supports remote HTTP MCP servers
89
+ through Streamable HTTP with classified SSE fallback. Unsupported project
90
+ entries such as stdio, sockets, bearer tokens, and custom headers are skipped
91
+ with a warning rather than executed. Direct tools and MCP Apps are not loaded.
92
+ Optional per-server `oauth` fields are `clientId`, `clientSecret`,
93
+ `clientSecretEnv`, `scope`, `redirectUri`, `clientName`, `clientUri`, and
94
+ `authorizationParams`. Dynamic client registration is used when no client ID
95
+ is configured. A client secret or `clientSecretEnv` requires `clientId`;
96
+ prefer the environment reference over storing a client secret in the file.
97
+ The default callback is `http://127.0.0.1:3118/callback`; set `redirectUri` to
98
+ the exact pre-registered loopback callback when using a configured client.
99
+
100
+ Run `/mcp` to inspect configured servers, list tools, reconnect, authenticate,
101
+ or log out. `/mcp auth [server]` opens a server picker when its argument is
102
+ omitted. Configuration is loaded at startup;
103
+ run `/reload` after editing either file. The model uses the `mcp` gateway tool
104
+ for search, describe, and remote tool calls. The local host follows the upstream
105
+ adapter's browser + PKCE loopback flow and stores tokens and dynamic-client
106
+ credentials in the OS credential store, bound to the Felan agent directory,
107
+ server name, server URL, OAuth client/redirect/scope profile, and
108
+ authorization-server issuer. It fails closed when that store is unavailable.
109
+ Print-mode subagents never open a browser or callback listener; they can reuse
110
+ credentials established by a root TUI session. MCP metadata and results are
111
+ bounded and explicitly marked as untrusted remote content.
112
+
66
113
  `tasks` provides `TaskCreate`, `TaskUpdate`, `TaskList`, and `TaskGet` over one
67
114
  dependency-aware graph shared by the root session and every nested subagent.
68
115
  Task state lives under
@@ -107,12 +154,18 @@ provides `Agent`, `list_subagents`,
107
154
  `get_subagent_result`, `steer_subagent`, and `cancel_subagent`. A root-scoped
108
155
  local host queues every run asynchronously, persists the latest child session
109
156
  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.
157
+ application's current workspace. The TUI shows each queued or running direct
158
+ child in a full-width interactive rail beneath the powerline status rows, or
159
+ beneath the editor when powerline is disabled. Press Down at the editor's newest
160
+ prompt to enter the rail, use Up/Down to select a child, press Up on the first
161
+ child to return to the editor, and press Enter to open that child in the agent
162
+ navigator. Use `/agents` or `Alt+A` to open the navigator directly, follow live
163
+ transcripts, send steering messages, or stop active work.
164
+ Runtime shutdown awaits active-child cancellation before Pi teardown.
112
165
  Completed-child continuation uses the same child ID and Pi session file while
113
166
  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.
167
+ includes `@felan-ai/ext-powerline` for an ANSI-aware footer with subscription
168
+ usage; it is a direct TUI dependency and is not part of cloud composition.
116
169
 
117
170
  Local agent definitions are loaded only from bundled Felan definitions,
118
171
  `~/.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,16 @@ 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";
14
18
  readonly powerline: "@felan-ai/ext-powerline";
15
19
  };
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")[];
20
+ 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")[];
17
21
  export type BuiltinExtensionName = keyof typeof builtinExtensionPackages;
18
22
  export type BuiltinExtensionSettings = Partial<Record<BuiltinExtensionName, boolean>>;
19
23
  export declare function resolveBuiltinExtensionPackages(settings: unknown): readonly string[];
20
24
  export declare const importLocalExtension: ExtensionPackageImporter;
21
- export declare function createLocalExtensionImporter(host: SubagentHost, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>): ExtensionPackageImporter;
25
+ export declare function createLocalExtensionImporter(host: SubagentHost & LocalSubagentNavigatorHost, modelRuntime: ModelRuntime, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>): ExtensionPackageImporter;
22
26
  //# 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;;;;;;;;;;;CAW3B,CAAC;AACX,eAAO,MAAM,sBAAsB,+QAA0C,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,11 @@ 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
+ powerline: powerlineExtensionPackage,
16
23
  };
17
24
  export const localExtensionPackages = Object.values(builtinExtensionPackages);
18
25
  const localExtensionPackageSet = new Set(localExtensionPackages);
@@ -37,16 +44,30 @@ export const importLocalExtension = async (packageName) => {
37
44
  }
38
45
  return import(packageName);
39
46
  };
40
- export function createLocalExtensionImporter(host, importExtension = importLocalExtension, shutdownHost) {
47
+ export function createLocalExtensionImporter(host, modelRuntime, importExtension = importLocalExtension, shutdownHost) {
48
+ let powerlineLoaded = false;
49
+ let agentRailRenderer;
50
+ const powerline = createPowerlineExtension(createLocalSubscriptionUsageHost(modelRuntime), {
51
+ footerRows: (width) => agentRailRenderer?.(width) ?? [],
52
+ });
41
53
  return async (packageName) => {
42
54
  if (packageName === askUserExtensionPackage) {
43
55
  return { default: createAskUserExtension(createTuiAskUserHost()) };
44
56
  }
57
+ if (packageName === mcpExtensionPackage) {
58
+ return { default: createLocalMcpExtension() };
59
+ }
45
60
  if (packageName === subagentsExtensionPackage) {
46
61
  const subagents = createSubagentsExtension(host);
47
62
  return {
48
63
  default: ((pi) => {
49
64
  subagents(pi);
65
+ registerLocalSubagentNavigator(pi, host, {
66
+ renderRailInEditor: () => !powerlineLoaded,
67
+ onRailRendererChange: (renderer) => {
68
+ agentRailRenderer = renderer;
69
+ },
70
+ });
50
71
  if (shutdownHost) {
51
72
  pi.on('session_shutdown', async (event) => {
52
73
  if (event.reason !== 'reload')
@@ -56,6 +77,10 @@ export function createLocalExtensionImporter(host, importExtension = importLocal
56
77
  }),
57
78
  };
58
79
  }
80
+ if (packageName === powerlineExtensionPackage) {
81
+ powerlineLoaded = true;
82
+ return { default: powerline };
83
+ }
59
84
  return importExtension(packageName);
60
85
  };
61
86
  }
@@ -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"}