@felan-ai/felan 0.7.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.
- package/NOTICE +23 -2
- package/README.md +73 -15
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +1 -8
- package/dist/application.js.map +1 -1
- package/dist/extensions.d.ts +9 -3
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +34 -2
- package/dist/extensions.js.map +1 -1
- package/dist/mcp/callback-server.d.ts +11 -0
- package/dist/mcp/callback-server.d.ts.map +1 -0
- package/dist/mcp/callback-server.js +221 -0
- package/dist/mcp/callback-server.js.map +1 -0
- package/dist/mcp/config.d.ts +20 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +349 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +22 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/oauth-host.d.ts +41 -0
- package/dist/mcp/oauth-host.d.ts.map +1 -0
- package/dist/mcp/oauth-host.js +510 -0
- package/dist/mcp/oauth-host.js.map +1 -0
- package/dist/mcp/oauth-store.d.ts +27 -0
- package/dist/mcp/oauth-store.d.ts.map +1 -0
- package/dist/mcp/oauth-store.js +138 -0
- package/dist/mcp/oauth-store.js.map +1 -0
- package/dist/powerline.d.ts +4 -0
- package/dist/powerline.d.ts.map +1 -0
- package/dist/powerline.js +91 -0
- package/dist/powerline.js.map +1 -0
- package/dist/runtime-factory.d.ts +1 -0
- package/dist/runtime-factory.d.ts.map +1 -1
- package/dist/runtime-factory.js +1 -0
- package/dist/runtime-factory.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/subagents/agent-navigator.d.ts +44 -0
- package/dist/subagents/agent-navigator.d.ts.map +1 -0
- package/dist/subagents/agent-navigator.js +667 -0
- package/dist/subagents/agent-navigator.js.map +1 -0
- package/dist/subagents/agent-transcript.d.ts +19 -0
- package/dist/subagents/agent-transcript.d.ts.map +1 -0
- package/dist/subagents/agent-transcript.js +335 -0
- package/dist/subagents/agent-transcript.js.map +1 -0
- package/dist/subagents/catalog.d.ts.map +1 -1
- package/dist/subagents/catalog.js +2 -1
- package/dist/subagents/catalog.js.map +1 -1
- package/dist/subagents/host.d.ts +9 -2
- package/dist/subagents/host.d.ts.map +1 -1
- package/dist/subagents/host.js +40 -8
- package/dist/subagents/host.js.map +1 -1
- package/package.json +12 -6
- package/dist/subagents/presenter.d.ts +0 -11
- package/dist/subagents/presenter.d.ts.map +0 -1
- package/dist/subagents/presenter.js +0 -34
- 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
|
|
10
|
-
https://github.com/earendil-works/pi,
|
|
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
|
@@ -19,26 +19,28 @@ Felan suppresses Pi's version notification, bundled changelog, package update
|
|
|
19
19
|
notifications, and install/update telemetry. Update behavior is owned by the
|
|
20
20
|
Felan application.
|
|
21
21
|
|
|
22
|
-
Each session uses a
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
Each session uses a `HostAgentRuntime` with host path access. Its cwd resolves
|
|
23
|
+
relative paths, while file operations and process working directories can use
|
|
24
|
+
any path available to the current user. Pi's session runtime recreates the host
|
|
25
|
+
runtime, filtered settings, resources, and session composition for new, resume,
|
|
26
|
+
fork, clone, and import flows, then rebinds the active interactive UI. Host mode
|
|
27
|
+
is not an isolation boundary.
|
|
27
28
|
|
|
28
29
|
Root sessions store extension state under
|
|
29
30
|
`$FELAN_AGENT_DIR/storage/sessions/<encoded-root-session-id>`. Every nested
|
|
30
|
-
subagent shares its root session's storage path
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
ordinary readable paths.
|
|
31
|
+
subagent shares its root session's storage path. Longer-retention agent state
|
|
32
|
+
uses `$FELAN_AGENT_DIR/storage/agent`. Storage handles remain scoped to their
|
|
33
|
+
declared roots, while ordinary runtime file operations can access these and
|
|
34
|
+
other host paths directly.
|
|
35
35
|
|
|
36
36
|
Only source-controlled built-in Felan extensions can be imported. External
|
|
37
37
|
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`:
|
|
@@ -47,9 +49,11 @@ All built-in extensions are enabled by default. Toggle them in
|
|
|
47
49
|
{
|
|
48
50
|
"builtinExtensions": {
|
|
49
51
|
"subagents": true,
|
|
52
|
+
"askUser": true,
|
|
50
53
|
"tasks": true,
|
|
51
54
|
"prewalk": true,
|
|
52
55
|
"context": true,
|
|
56
|
+
"mcp": true,
|
|
53
57
|
"webAccess": true,
|
|
54
58
|
"backgroundBash": true,
|
|
55
59
|
"codex": true,
|
|
@@ -58,6 +62,54 @@ All built-in extensions are enabled by default. Toggle them in
|
|
|
58
62
|
}
|
|
59
63
|
```
|
|
60
64
|
|
|
65
|
+
`askUser` provides the sequential `ask_user` tool. The local host presents
|
|
66
|
+
single questions or 1-4 question wizards as searchable overlays or inline
|
|
67
|
+
dialogs, with multi-select, freeform answers, and optional comments.
|
|
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
|
+
|
|
61
113
|
`tasks` provides `TaskCreate`, `TaskUpdate`, `TaskList`, and `TaskGet` over one
|
|
62
114
|
dependency-aware graph shared by the root session and every nested subagent.
|
|
63
115
|
Task state lives under
|
|
@@ -102,12 +154,18 @@ provides `Agent`, `list_subagents`,
|
|
|
102
154
|
`get_subagent_result`, `steer_subagent`, and `cancel_subagent`. A root-scoped
|
|
103
155
|
local host queues every run asynchronously, persists the latest child session
|
|
104
156
|
metadata, delivers completion notices, supports bounded nesting, and uses the
|
|
105
|
-
application's current workspace. The TUI
|
|
106
|
-
|
|
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.
|
|
107
165
|
Completed-child continuation uses the same child ID and Pi session file while
|
|
108
166
|
replacing the latest result. The default list also
|
|
109
|
-
includes `@felan-ai/ext-powerline` for an ANSI-aware footer
|
|
110
|
-
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.
|
|
111
169
|
|
|
112
170
|
Local agent definitions are loaded only from bundled Felan definitions,
|
|
113
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;
|
|
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"}
|
package/dist/application.js
CHANGED
|
@@ -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
|
-
|
|
18
|
-
try {
|
|
19
|
-
await mode.run();
|
|
20
|
-
}
|
|
21
|
-
finally {
|
|
22
|
-
detachPresenter();
|
|
23
|
-
}
|
|
16
|
+
await mode.run();
|
|
24
17
|
}
|
|
25
18
|
finally {
|
|
26
19
|
try {
|
package/dist/application.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/extensions.d.ts
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
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';
|
|
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";
|
|
3
7
|
export declare const subagentsExtensionPackage = "@felan-ai/ext-subagents";
|
|
4
8
|
export declare const builtinExtensionPackages: {
|
|
5
9
|
readonly subagents: "@felan-ai/ext-subagents";
|
|
10
|
+
readonly askUser: "@felan-ai/ext-ask-user";
|
|
6
11
|
readonly tasks: "@felan-ai/ext-tasks";
|
|
7
12
|
readonly prewalk: "@felan-ai/ext-prewalk";
|
|
8
13
|
readonly context: "@felan-ai/ext-context";
|
|
14
|
+
readonly mcp: "@felan-ai/ext-mcp";
|
|
9
15
|
readonly webAccess: "@felan-ai/ext-web-access";
|
|
10
16
|
readonly backgroundBash: "@felan-ai/ext-background-bash";
|
|
11
17
|
readonly codex: "@felan-ai/ext-codex";
|
|
12
18
|
readonly powerline: "@felan-ai/ext-powerline";
|
|
13
19
|
};
|
|
14
|
-
export declare const localExtensionPackages: ("@felan-ai/ext-subagents" | "@felan-ai/ext-
|
|
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")[];
|
|
15
21
|
export type BuiltinExtensionName = keyof typeof builtinExtensionPackages;
|
|
16
22
|
export type BuiltinExtensionSettings = Partial<Record<BuiltinExtensionName, boolean>>;
|
|
17
23
|
export declare function resolveBuiltinExtensionPackages(settings: unknown): readonly string[];
|
|
18
24
|
export declare const importLocalExtension: ExtensionPackageImporter;
|
|
19
|
-
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;
|
|
20
26
|
//# sourceMappingURL=extensions.d.ts.map
|
package/dist/extensions.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/extensions.js
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
|
+
import { createAskUserExtension } from '@felan-ai/ext-ask-user';
|
|
2
|
+
import { createTuiAskUserHost } from '@felan-ai/ext-ask-user/tui';
|
|
3
|
+
import { createPowerlineExtension } from '@felan-ai/ext-powerline';
|
|
1
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';
|
|
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';
|
|
2
11
|
export const subagentsExtensionPackage = '@felan-ai/ext-subagents';
|
|
3
12
|
export const builtinExtensionPackages = {
|
|
4
13
|
subagents: subagentsExtensionPackage,
|
|
14
|
+
askUser: askUserExtensionPackage,
|
|
5
15
|
tasks: '@felan-ai/ext-tasks',
|
|
6
16
|
prewalk: '@felan-ai/ext-prewalk',
|
|
7
17
|
context: '@felan-ai/ext-context',
|
|
18
|
+
mcp: mcpExtensionPackage,
|
|
8
19
|
webAccess: '@felan-ai/ext-web-access',
|
|
9
20
|
backgroundBash: '@felan-ai/ext-background-bash',
|
|
10
21
|
codex: '@felan-ai/ext-codex',
|
|
11
|
-
powerline:
|
|
22
|
+
powerline: powerlineExtensionPackage,
|
|
12
23
|
};
|
|
13
24
|
export const localExtensionPackages = Object.values(builtinExtensionPackages);
|
|
14
25
|
const localExtensionPackageSet = new Set(localExtensionPackages);
|
|
@@ -33,13 +44,30 @@ export const importLocalExtension = async (packageName) => {
|
|
|
33
44
|
}
|
|
34
45
|
return import(packageName);
|
|
35
46
|
};
|
|
36
|
-
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
|
+
});
|
|
37
53
|
return async (packageName) => {
|
|
54
|
+
if (packageName === askUserExtensionPackage) {
|
|
55
|
+
return { default: createAskUserExtension(createTuiAskUserHost()) };
|
|
56
|
+
}
|
|
57
|
+
if (packageName === mcpExtensionPackage) {
|
|
58
|
+
return { default: createLocalMcpExtension() };
|
|
59
|
+
}
|
|
38
60
|
if (packageName === subagentsExtensionPackage) {
|
|
39
61
|
const subagents = createSubagentsExtension(host);
|
|
40
62
|
return {
|
|
41
63
|
default: ((pi) => {
|
|
42
64
|
subagents(pi);
|
|
65
|
+
registerLocalSubagentNavigator(pi, host, {
|
|
66
|
+
renderRailInEditor: () => !powerlineLoaded,
|
|
67
|
+
onRailRendererChange: (renderer) => {
|
|
68
|
+
agentRailRenderer = renderer;
|
|
69
|
+
},
|
|
70
|
+
});
|
|
43
71
|
if (shutdownHost) {
|
|
44
72
|
pi.on('session_shutdown', async (event) => {
|
|
45
73
|
if (event.reason !== 'reload')
|
|
@@ -49,6 +77,10 @@ export function createLocalExtensionImporter(host, importExtension = importLocal
|
|
|
49
77
|
}),
|
|
50
78
|
};
|
|
51
79
|
}
|
|
80
|
+
if (packageName === powerlineExtensionPackage) {
|
|
81
|
+
powerlineLoaded = true;
|
|
82
|
+
return { default: powerline };
|
|
83
|
+
}
|
|
52
84
|
return importExtension(packageName);
|
|
53
85
|
};
|
|
54
86
|
}
|
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,GAEzB,MAAM,yBAAyB,CAAC;
|
|
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"}
|