Fen source API
Exported Fennel surfaces discovered from source, grouped by namespace. Inline @doc blocks provide summaries and signatures where present.
Core (fen.core.*) #
fen.core.agent #
Module neighborhood graph: DOT · SVG
fen.core.agent.make-agent #
(make-agent {:provider-name :model :system :tools :api-key :on-event :max-tokens :convert-to-llm :provider-options}) -> Agent
Construct an Agent record with empty messages, ready for repeated step calls. :api-key and :max-tokens are auto-injected into provider-options. :convert-to-llm projects custom AgentMessages onto canonical Messages before each provider call.
packages/core/src/fen/core/agent.fnl:47
fen.core.agent.step #
(step agent user-msg ?cancel-fn) -> string
Run one user turn. Appends a UserMessage, then iterates provider-call -> tool-execution until a non-tool stop reason or the safety cap. Cooperative yields when called inside a coroutine; ?cancel-fn polled at every yield.
packages/core/src/fen/core/agent.fnl:454
fen.core.agent.SAFETY-CAP #
number
Hard ceiling on tool-call iterations per step. Bump if a real workflow needs more, don't remove.
packages/core/src/fen/core/agent.fnl:15
fen.core.agent.complete-messages #
(complete-messages agent messages ?model ?opts ?on-event ?yield-fn) -> AssistantMessage
Run one provider completion using an agent's provider configuration, explicit canonical messages, and no tools.
packages/core/src/fen/core/agent.fnl:376
fen.core.diagnostics #
Module neighborhood graph: DOT · SVG
fen.core.diagnostics.set-runtime-info! #
(set-runtime-info! info) -> table|nil
Store sanitized runtime/build metadata for durable error/provider diagnostics.
packages/core/src/fen/core/diagnostics.fnl:34
fen.core.diagnostics.runtime-info #
(runtime-info) -> table|nil
Return runtime/build metadata previously injected by fen.main, if available.
packages/core/src/fen/core/diagnostics.fnl:44
fen.core.docs.contracts #
Module neighborhood graph: DOT · SVG
fen.core.docs.contracts.types #
table
Canonical message, content, tool, usage, and agent-context type contracts shared by providers, tools, sessions, and docs.
packages/core/src/fen/core/docs/contracts.fnl:15
fen.core.docs.contracts.register-kinds #
table
Extension registration kind contracts describing required fields for tools, commands, providers, presenters, panels, hooks, and prompt fragments.
packages/core/src/fen/core/docs/contracts.fnl:158
fen.core.docs.contracts.events #
table
Event bus contract table documenting emitted runtime event shapes and fields consumed by presenters and extensions.
packages/core/src/fen/core/docs/contracts.fnl:295
fen.core.docs.contracts.interfaces #
table
Interface contract table for provider, auth backend, session backend, and presenter records.
packages/core/src/fen/core/docs/contracts.fnl:614
fen.core.extensions.events #
Module neighborhood graph: DOT · SVG
fen.core.extensions.events.error-log-path #
(error-log-path) -> string
Lazily compute and return the JSONL file path where extension event-bus failures are persisted.
packages/core/src/fen/core/extensions/events.fnl:45
fen.core.extensions.events.list-errors #
(list-errors) -> [ExtensionError]
Return the bounded in-memory list of sanitized extension error records captured by the event bus.
packages/core/src/fen/core/extensions/events.fnl:96
fen.core.extensions.events.emit #
(emit ev) -> nil
Record error events, dispatch ev to handlers for ev.type, and then dispatch to wildcard :* subscribers.
packages/core/src/fen/core/extensions/events.fnl:129
fen.core.extensions.events.on #
(on event-name handler ?owner) -> unsubscribe-fn
Subscribe a handler to one event name with optional owner tagging and return a closure that removes that exact handler.
packages/core/src/fen/core/extensions/events.fnl:142
fen.core.extensions.events.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove every event handler tagged with owner from all event buckets during extension reload or teardown.
packages/core/src/fen/core/extensions/events.fnl:153
fen.core.extensions.events.list #
(list) -> table
Return a safe introspection table of subscribed event names and handler owners without exposing handler functions.
packages/core/src/fen/core/extensions/events.fnl:162
fen.core.extensions.loader #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.load-sibling #
(load-sibling spec sibling) -> any
Load a sibling .fnl/.lua file for a path-shaped extension's api.load helper without requiring a global namespace.
packages/core/src/fen/core/extensions/loader/init.fnl:219
fen.core.extensions.loader.load! #
(load! opts ?mode) -> ExtensionLoadSummary
Discover, gate, and load admissible extensions, failing fast only after collecting first-party load failures.
packages/core/src/fen/core/extensions/loader/init.fnl:240
fen.core.extensions.loader.summarize #
(summarize items) -> ExtensionLoadSummary
Fold per-extension load entries into aggregate loaded/changed/failed counters plus the original extension list.
packages/core/src/fen/core/extensions/loader/init.fnl:286
fen.core.extensions.loader.reload-extension! #
(reload-extension! name) -> ok?, err
Reload a previously loaded extension by name using its retained spec and interactive TUI reload mode.
packages/core/src/fen/core/extensions/loader/init.fnl:303
fen.core.extensions.loader.discover #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.discover.first-party-roots #
(first-party-roots) -> [string]
Return trusted flat first-party overlay roots supplied by the single-file launcher.
packages/core/src/fen/core/extensions/loader/discover.fnl:116
fen.core.extensions.loader.discover.project-roots #
(project-roots) -> [string]
Return .fen/extensions roots from cwd upward to the worktree boundary, nearest first for project-local override priority.
packages/core/src/fen/core/extensions/loader/discover.fnl:131
fen.core.extensions.loader.discover.user-roots #
(user-roots) -> [string]
Return user extension roots from FEN_EXTENSIONS_PATH plus the XDG fen/extensions directory.
packages/core/src/fen/core/extensions/loader/discover.fnl:156
fen.core.extensions.loader.discover.discover #
(discover explicit-paths) -> [ExtensionSpec]
Build the deduped extension spec list in load-priority order: explicit, first-party flat overlays, project, user, then embedded first-party.
packages/core/src/fen/core/extensions/loader/discover.fnl:296
fen.core.extensions.loader.manifest #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.manifest.strip-ext #
[name]
packages/core/src/fen/core/extensions/loader/manifest.fnl:25
fen.core.extensions.loader.manifest.load-file #
[file-path]
packages/core/src/fen/core/extensions/loader/manifest.fnl:42
fen.core.extensions.loader.manifest.manifest-path #
[dir]
packages/core/src/fen/core/extensions/loader/manifest.fnl:48
fen.core.extensions.loader.manifest.entry-path-for-dir #
[dir]
packages/core/src/fen/core/extensions/loader/manifest.fnl:55
fen.core.extensions.loader.manifest.read-manifest #
[file-path]
packages/core/src/fen/core/extensions/loader/manifest.fnl:62
fen.core.extensions.loader.manifest.entry-module-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:68
fen.core.extensions.loader.manifest.entry-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:72
fen.core.extensions.loader.manifest.interactive-only? #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:76
fen.core.extensions.loader.manifest.presenter-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:81
fen.core.extensions.loader.manifest.first-party? #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:84
fen.core.extensions.loader.manifest.reload-modules #
[manifest fallback]
packages/core/src/fen/core/extensions/loader/manifest.fnl:89
fen.core.extensions.loader.manifest.reload-exclude #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:95
fen.core.extensions.loader.manifest.enabled? #
[spec]
packages/core/src/fen/core/extensions/loader/manifest.fnl:100
fen.core.extensions.loader.manifest.entry-register #
[entry]
packages/core/src/fen/core/extensions/loader/manifest.fnl:106
fen.core.extensions.loader.manifest.requires-modules #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:126
fen.core.extensions.loader.manifest.requires-shared-libs #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:132
fen.core.extensions.loader.manifest.missing-requires-modules #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:137
fen.core.extensions.loader.manifest.missing-deps #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:146
fen.core.extensions.loader.reload #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.reload.file-changed?! #
(file-changed?! file-path) -> boolean
Update and compare the cached fingerprint for a path-shaped extension file, returning true only after a prior baseline changed.
packages/core/src/fen/core/extensions/loader/reload.fnl:42
fen.core.extensions.loader.reload.change-summary #
(change-summary mods) -> ReloadChangeSummary
Probe module fingerprints, update the reload cache, and return checked/changed counts plus changed module names.
packages/core/src/fen/core/extensions/loader/reload.fnl:51
fen.core.extensions.loader.reload.clear-reload-modules! #
(clear-reload-modules! manifest fallback) -> ReloadChangeSummary
Re-require manifest reload modules in place, respecting reload-exclude, and return one summary for user-facing reload diagnostics.
packages/core/src/fen/core/extensions/loader/reload.fnl:83
fen.core.extensions.register #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.register #
(register kind spec owner) -> register-result
Dispatch one extension contribution to the per-kind registry module and return its owner-tagged unregister handle.
packages/core/src/fen/core/extensions/register/init.fnl:38
fen.core.extensions.register.unregister-by-owner #
(unregister-by-owner owner) -> nil
Sweep every registry kind and event-handler bucket, removing contributions tagged with owner during reload or teardown.
packages/core/src/fen/core/extensions/register/init.fnl:57
fen.core.extensions.register.list #
(list kind) -> frozen-table
Return a frozen introspection list for the requested registry kind, including extensions, hooks, event handlers, and prompt fragments.
packages/core/src/fen/core/extensions/register/init.fnl:107
fen.core.extensions.register.collect-introspection #
(collect-introspection ?owner ?ctx) -> table
Evaluate registered introspection snapshots through the centralized pcall-isolated collector.
packages/core/src/fen/core/extensions/register/init.fnl:130
fen.core.extensions.register.auth_backend #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.auth_backend.register #
(register spec owner handle-result) -> register-result
Validate and install a singleton auth-backend contribution keyed by :name for provider credential lookup.
packages/core/src/fen/core/extensions/register/auth_backend.fnl:6
fen.core.extensions.register.auth_backend.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove every auth backend installed by owner without disturbing backends registered by other extensions.
packages/core/src/fen/core/extensions/register/auth_backend.fnl:17
fen.core.extensions.register.auth_backend.find #
(find name) -> AuthBackend|nil
Return the registered auth backend for name, or nil when no matching backend is installed.
packages/core/src/fen/core/extensions/register/auth_backend.fnl:27
fen.core.extensions.register.auth_backend.list #
(list) -> [AuthBackendInfo]
Return auth backend metadata for introspection, including owner and optional credential capability flags.
packages/core/src/fen/core/extensions/register/auth_backend.fnl:35
fen.core.extensions.register.command #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.command.register #
(register spec owner handle-result) -> register-result
Validate and install a slash-command contribution keyed by :name with its handler and command metadata.
packages/core/src/fen/core/extensions/register/command.fnl:7
fen.core.extensions.register.command.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all slash commands installed by owner so extension reloads replace commands without stale aliases.
packages/core/src/fen/core/extensions/register/command.fnl:21
fen.core.extensions.register.command.dispatch #
(dispatch line caller-state) -> nil
Parse a slash command line, enforce idle-only guards, pcall-isolate the handler, and emit user-facing errors.
packages/core/src/fen/core/extensions/register/command.fnl:44
fen.core.extensions.register.command.list #
(list) -> [CommandInfo]
Return command metadata used by help, docs, and diagnostics without exposing handler functions.
packages/core/src/fen/core/extensions/register/command.fnl:69
fen.core.extensions.register.control #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.control.register #
(register spec owner handle-result) -> register-result
Validate and append a presenter-neutral control contribution with owner tagging for reload cleanup.
packages/core/src/fen/core/extensions/register/control.fnl:6
fen.core.extensions.register.control.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all control contributions installed by owner from the ordered controls registry.
packages/core/src/fen/core/extensions/register/control.fnl:17
fen.core.extensions.register.control.list #
(list) -> [ControlInfo]
Return control metadata for presenters and docs, including keys/order while hiding mutable registry records.
packages/core/src/fen/core/extensions/register/control.fnl:26
fen.core.extensions.register.hook #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.hook.register #
(register spec owner handle-result) -> register-result
Validate and append a before-tool hook contribution that can inspect or veto pending tool execution.
packages/core/src/fen/core/extensions/register/hook.fnl:6
fen.core.extensions.register.hook.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all before-tool hooks installed by owner during extension reload or teardown.
packages/core/src/fen/core/extensions/register/hook.fnl:19
fen.core.extensions.register.hook.list #
(list) -> [HookInfo]
Return hook contributions without exposing hook functions.
packages/core/src/fen/core/extensions/register/hook.fnl:28
fen.core.extensions.register.hook.run-before-tool #
(run-before-tool tool-name args ctx) -> {:block? boolean :reason string|nil}
Run registered before-tool hooks in order and return the first veto decision, or an explicit non-blocking decision.
packages/core/src/fen/core/extensions/register/hook.fnl:39
fen.core.extensions.register.introspect #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.introspect.register #
[spec owner handle-result]
packages/core/src/fen/core/extensions/register/introspect.fnl:17
fen.core.extensions.register.introspect.unregister-by-owner #
[owner]
packages/core/src/fen/core/extensions/register/introspect.fnl:26
fen.core.extensions.register.introspect.list #
[]
packages/core/src/fen/core/extensions/register/introspect.fnl:38
fen.core.extensions.register.introspect.collect #
[?owner ?ctx]
packages/core/src/fen/core/extensions/register/introspect.fnl:83
fen.core.extensions.register.panel #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.panel.register #
(register spec owner handle-result) -> register-result
Validate a panel contribution, fill default placement/order fields, and append it to the presenter panel registry.
packages/core/src/fen/core/extensions/register/panel.fnl:27
fen.core.extensions.register.panel.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all panel contributions installed by owner while preserving the shared panel registry table identity.
packages/core/src/fen/core/extensions/register/panel.fnl:47
fen.core.extensions.register.panel.list #
(list) -> [Panel]
Return panel contributions sorted by order, owner, and name for deterministic presenter layout.
packages/core/src/fen/core/extensions/register/panel.fnl:64
fen.core.extensions.register.presenter #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.presenter.promote-ui-slot! #
(promote-ui-slot!) -> nil
Recompute the shared UI slot from the first active presenter that supplies one after unregister or reload.
packages/core/src/fen/core/extensions/register/presenter.fnl:10
fen.core.extensions.register.presenter.active-presenter #
(active-presenter) -> Presenter|nil
Return the first registered presenter marked active, or nil when no presenter has claimed the run.
packages/core/src/fen/core/extensions/register/presenter.fnl:22
fen.core.extensions.register.presenter.register #
(register spec owner handle-result) -> register-result
Validate and append a presenter contribution, promoting its UI slot immediately when it is active.
packages/core/src/fen/core/extensions/register/presenter.fnl:35
fen.core.extensions.register.presenter.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove presenters installed by owner and promote the next active UI slot so extension APIs keep working after reload.
packages/core/src/fen/core/extensions/register/presenter.fnl:52
fen.core.extensions.register.presenter.init-active-presenter #
(init-active-presenter ctx) -> ok?, result
Call the active presenter's optional :init lifecycle method through a pcall-style result pair.
packages/core/src/fen/core/extensions/register/presenter.fnl:75
fen.core.extensions.register.presenter.shutdown-active-presenter #
(shutdown-active-presenter ctx) -> ok?, result
Call the active presenter's optional :shutdown lifecycle method during process teardown.
packages/core/src/fen/core/extensions/register/presenter.fnl:83
fen.core.extensions.register.presenter.run-active-presenter #
(run-active-presenter ctx) -> ok?, result
Call the active presenter's required :run lifecycle method and report an error pair when no runnable presenter exists.
packages/core/src/fen/core/extensions/register/presenter.fnl:91
fen.core.extensions.register.presenter.build-ui-slot #
(build-ui-slot) -> table
Build the stable extension-facing UI facade whose methods dispatch to the active presenter or lightweight fallbacks.
packages/core/src/fen/core/extensions/register/presenter.fnl:124
fen.core.extensions.register.presenter.list #
(list) -> [PresenterInfo]
Return presenter metadata and lifecycle capability flags for diagnostics and runtime docs.
packages/core/src/fen/core/extensions/register/presenter.fnl:135
fen.core.extensions.register.prompt #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.prompt.contribute #
(contribute text-or-fn ?opts owner handle-result) -> register-result
Append an ordered system-prompt fragment from api.prompt, tagging owner metadata and returning an unregister handle.
packages/core/src/fen/core/extensions/register/prompt.fnl:16
fen.core.extensions.register.prompt.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all system-prompt fragments contributed by owner during reload or extension teardown.
packages/core/src/fen/core/extensions/register/prompt.fnl:35
fen.core.extensions.register.prompt.render #
(render ?ctx) -> string|nil
Render registered prompt fragments in final order, omitting nil/empty fragments and isolating fragment function errors.
packages/core/src/fen/core/extensions/register/prompt.fnl:68
fen.core.extensions.register.prompt.list #
(list) -> [PromptFragmentInfo]
Return prompt-fragment metadata in final render order without exposing raw fragment text content.
packages/core/src/fen/core/extensions/register/prompt.fnl:94
fen.core.extensions.register.provider #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.provider.register #
(register spec owner handle-result) -> register-result
Validate and install a singleton provider contribution keyed by name, defaulting name from api when omitted.
packages/core/src/fen/core/extensions/register/provider.fnl:6
fen.core.extensions.register.provider.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove every provider installed by owner without clobbering same-name providers registered later by other owners.
packages/core/src/fen/core/extensions/register/provider.fnl:22
fen.core.extensions.register.provider.find #
(find name) -> Provider|nil
Find a provider by its unique registry name; provider :api is protocol metadata, not the deterministic dispatch key.
packages/core/src/fen/core/extensions/register/provider.fnl:32
fen.core.extensions.register.provider.list-by-api #
(list-by-api api) -> [Provider]
Return all providers whose protocol/family metadata matches api for introspection and delegation.
packages/core/src/fen/core/extensions/register/provider.fnl:42
fen.core.extensions.register.provider.find-by-api #
(find-by-api api) -> Provider|nil
Return the first provider matching an api family for legacy/introspection callers that cannot require unique provider names.
packages/core/src/fen/core/extensions/register/provider.fnl:57
fen.core.extensions.register.provider.list #
(list) -> [ProviderInfo]
Return provider metadata for model selection, docs, and diagnostics while preserving provider implementation records internally.
packages/core/src/fen/core/extensions/register/provider.fnl:68
fen.core.extensions.register.session_backend #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.session_backend.register #
(register spec owner handle-result) -> register-result
Validate required session backend methods and install the backend by name for session persistence selection.
packages/core/src/fen/core/extensions/register/session_backend.fnl:13
fen.core.extensions.register.session_backend.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove session backends installed by owner and clear active session state if the active backend is removed.
packages/core/src/fen/core/extensions/register/session_backend.fnl:28
fen.core.extensions.register.session_backend.find #
(find name) -> SessionBackend|nil
Return the registered session backend for name, or nil when no backend is installed under that name.
packages/core/src/fen/core/extensions/register/session_backend.fnl:41
fen.core.extensions.register.session_backend.set-active! #
(set-active! name) -> SessionBackend|nil
Record the active session backend name, resolve it immediately, and return the selected backend if present.
packages/core/src/fen/core/extensions/register/session_backend.fnl:49
fen.core.extensions.register.session_backend.active #
(active) -> SessionBackend|nil
Return the cached active backend or resolve the active backend name after reload restored the registry.
packages/core/src/fen/core/extensions/register/session_backend.fnl:59
fen.core.extensions.register.session_backend.set-info! #
(set-info! info) -> info
Store the active session info record for later runtime inspection by commands, tools, and docs.
packages/core/src/fen/core/extensions/register/session_backend.fnl:68
fen.core.extensions.register.session_backend.info #
(info) -> SessionInfo|nil
Return the cached active session info record without touching backend storage.
packages/core/src/fen/core/extensions/register/session_backend.fnl:77
fen.core.extensions.register.session_backend.list #
(list) -> [SessionBackendInfo]
Return session backend names and owners for diagnostics and generated runtime documentation.
packages/core/src/fen/core/extensions/register/session_backend.fnl:84
fen.core.extensions.register.status #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.status.register #
(register spec owner handle-result) -> register-result
Validate a status-line contributor, fill default side/order fields, and append it to the status registry.
packages/core/src/fen/core/extensions/register/status.fnl:12
fen.core.extensions.register.status.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all status contributors installed by owner while preserving contributors from other extensions.
packages/core/src/fen/core/extensions/register/status.fnl:30
fen.core.extensions.register.status.list #
(list) -> [StatusItem]
Return status contributors sorted by order, owner, and name for deterministic presenter rendering.
packages/core/src/fen/core/extensions/register/status.fnl:47
fen.core.extensions.register.tool #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.tool.register #
(register spec owner handle-result) -> register-result
Validate and append an AgentTool contribution so the agent can expose it to providers and execute ToolCalls by name.
packages/core/src/fen/core/extensions/register/tool.fnl:6
fen.core.extensions.register.tool.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove every tool contribution installed by owner from the extension tool registry.
packages/core/src/fen/core/extensions/register/tool.fnl:17
fen.core.extensions.register.tool.merged #
(merged base) -> [AgentTool]
Return base tools followed by extension-contributed tools in registry order for agent-step tool exposure.
packages/core/src/fen/core/extensions/register/tool.fnl:26
fen.core.extensions.register.tool.list #
(list) -> [ToolInfo]
Return lightweight tool metadata for docs and diagnostics without exposing execute functions.
packages/core/src/fen/core/extensions/register/tool.fnl:38
fen.core.extensions.rocks #
Module neighborhood graph: DOT · SVG
fen.core.extensions.rocks.default-tree #
(default-tree) -> string
Return the fen-managed LuaRocks tree, honoring FEN_ROCKS_TREE before falling back to the user data directory.
packages/core/src/fen/core/extensions/rocks.fnl:12
fen.core.extensions.rocks.lua-path-fragment #
(lua-path-fragment tree) -> string
Build the package.path fragment that exposes pure-Lua modules installed in a fen rocks tree.
packages/core/src/fen/core/extensions/rocks.fnl:23
fen.core.extensions.rocks.lua-cpath-fragment #
(lua-cpath-fragment tree) -> string
Build the package.cpath fragment that exposes native Lua 5.4 modules installed in a fen rocks tree.
packages/core/src/fen/core/extensions/rocks.fnl:32
fen.core.extensions.rocks.prepend-tree! #
(prepend-tree! ?tree) -> true|nil
Prepend an existing fen rocks tree to package.path and package.cpath so extension dependencies can be required.
packages/core/src/fen/core/extensions/rocks.fnl:45
fen.core.extensions.rocks.rockspecs #
(rockspecs dir) -> [string]
List top-level .rockspec files in an extension directory for build and missing-dependency diagnostics.
packages/core/src/fen/core/extensions/rocks.fnl:67
fen.core.extensions.rocks.rockspec-present? #
(rockspec-present? dir) -> boolean
Return true when an extension directory contains at least one rockspec for fen ext build guidance.
packages/core/src/fen/core/extensions/rocks.fnl:77
fen.core.extensions.rocks.single-rockspec #
(single-rockspec dir) -> rockspec|nil, err|nil
Require exactly one rockspec in an extension directory and return a user-facing error when zero or multiple are present.
packages/core/src/fen/core/extensions/rocks.fnl:85
fen.core.extensions.rocks.parse-missing-module #
(parse-missing-module err) -> string|nil
Extract the missing module name from Lua's standard require error so loader failures can suggest installation actions.
packages/core/src/fen/core/extensions/rocks.fnl:99
fen.core.extensions.rocks.manual-install-command #
(manual-install-command module-name ?tree) -> string
Format the LuaRocks install command users can run to install a missing dependency into the fen rocks tree.
packages/core/src/fen/core/extensions/rocks.fnl:110
fen.core.extensions.rocks.build-command #
(build-command dir) -> string
Format the fen ext build command for an extension directory that declares a rockspec.
packages/core/src/fen/core/extensions/rocks.fnl:119
fen.core.extensions.rocks.missing-module-message #
(missing-module-message spec module-name) -> string
Build an actionable loader error for one missing Lua module, preferring fen ext build when the extension has a rockspec.
packages/core/src/fen/core/extensions/rocks.fnl:136
fen.core.extensions.rocks.missing-modules-message #
(missing-modules-message spec modules) -> string
Build an actionable loader error for declared missing modules, including shared-library hints from the manifest.
packages/core/src/fen/core/extensions/rocks.fnl:151
fen.core.extensions.rocks.build! #
(build! dir) -> exit-code
Build an extension rockspec into the fen rocks tree using bundled LuaRocks when available, returning process-style exit codes.
packages/core/src/fen/core/extensions/rocks.fnl:207
fen.core.extensions.state #
Module neighborhood graph: DOT · SVG
fen.core.extensions.state.version #
number
Schema/version marker for the persistent extension state table shared across reloadable extension modules.
packages/core/src/fen/core/extensions/state.fnl:3
fen.core.extensions.state.handlers #
table
Event-bus handler buckets keyed by event name, preserving subscriptions across reloadable event-module updates.
packages/core/src/fen/core/extensions/state.fnl:9
fen.core.extensions.state.tools-extra #
[AgentTool]
Array registry of extension-contributed tools appended to the agent's base tool set each step.
packages/core/src/fen/core/extensions/state.fnl:15
fen.core.extensions.state.commands-extra #
table
Singleton registry of slash-command contributions keyed by command name for dispatch and help introspection.
packages/core/src/fen/core/extensions/state.fnl:21
fen.core.extensions.state.controls-extra #
[Control]
Array registry of presenter-neutral keyboard/control contributions exposed to active presenters.
packages/core/src/fen/core/extensions/state.fnl:27
fen.core.extensions.state.status-extra #
[StatusItem]
Array registry of status-line contributors sorted by presenters into left/right status regions.
packages/core/src/fen/core/extensions/state.fnl:33
fen.core.extensions.state.panel-extra #
[Panel]
Array registry of non-modal panel contributions rendered by presenters that support panel regions.
packages/core/src/fen/core/extensions/state.fnl:39
fen.core.extensions.state.presenters #
[Presenter]
Array registry of presenter contributions, including lifecycle callbacks and optional UI slot implementations.
packages/core/src/fen/core/extensions/state.fnl:45
fen.core.extensions.state.introspectors-extra #
[Introspector]
Array registry of extension-owned read-only snapshot providers exposed through agent_state, /extensions, and runtime diagnostics.
packages/core/src/fen/core/extensions/state.fnl:51
fen.core.extensions.state.providers #
table
Singleton registry of LLM provider contributions keyed by provider name for deterministic model dispatch.
packages/core/src/fen/core/extensions/state.fnl:57
fen.core.extensions.state.auth-backends #
table
Singleton registry of auth backend contributions keyed by name for provider credential resolution.
packages/core/src/fen/core/extensions/state.fnl:63
fen.core.extensions.state.session-backends #
table
Singleton registry of session persistence backend contributions keyed by backend name.
packages/core/src/fen/core/extensions/state.fnl:69
fen.core.extensions.state.session #
table
Active session backend selection and cached SessionInfo shared by session commands, tools, and backends.
packages/core/src/fen/core/extensions/state.fnl:75
fen.core.extensions.state.hooks #
table
Lifecycle hook registries, currently the before-tool hook array consulted before tool execution.
packages/core/src/fen/core/extensions/state.fnl:81
fen.core.extensions.state.prompt-fragments #
[PromptFragment]
Ordered system-prompt fragment registry rendered into the agent context before provider calls.
packages/core/src/fen/core/extensions/state.fnl:87
fen.core.extensions.state.prompt-next-seq #
number
Monotonic sequence counter used to keep prompt-fragment ordering stable when fragments share the same order.
packages/core/src/fen/core/extensions/state.fnl:93
fen.core.extensions.state.extensions #
table
Loader status records keyed by extension name for runtime docs, diagnostics, and extension-listing commands.
packages/core/src/fen/core/extensions/state.fnl:99
fen.core.extensions.state.reload-fingerprints #
table
Cached file/module fingerprints that let extension reload report checked and changed modules across reloads.
packages/core/src/fen/core/extensions/state.fnl:105
fen.core.extensions.state.runtime-info #
table|nil
Sanitized runtime/build metadata injected by fen.main and attached to durable diagnostics.
packages/core/src/fen/core/extensions/state.fnl:111
fen.core.extensions.state.errors #
[ExtensionError]
Bounded in-memory list of sanitized extension/event-bus errors for diagnostics and user-facing commands.
packages/core/src/fen/core/extensions/state.fnl:117
fen.core.extensions.state.error-log-path #
string|nil
Lazily initialized JSONL path where extension and event-bus errors are mirrored for postmortem inspection.
packages/core/src/fen/core/extensions/state.fnl:123
fen.core.extensions.state.ui #
table
Persistent presenter UI slot wrapper whose identity survives reload while active presenter behavior changes underneath.
packages/core/src/fen/core/extensions/state.fnl:129
fen.core.extensions.test_api #
Module neighborhood graph: DOT · SVG
fen.core.extensions.test_api.reset! #
(reset!) -> nil
Wipe all extension registries in place for tests without requiring the broad runtime facade.
packages/core/src/fen/core/extensions/test_api.fnl:36
fen.core.extensions.test_api.make-runtime-api #
[?owner ?manifest ?opts]
packages/core/src/fen/core/extensions/test_api.fnl:74
fen.core.extensions.test_api.make #
(make ?owner ?manifest) -> ExtensionApi
Build a captured extension API for tests, resetting global extension state and recording registrations, prompts, and events.
packages/core/src/fen/core/extensions/test_api.fnl:81
fen.core.extensions.util #
Module neighborhood graph: DOT · SVG
fen.core.extensions.util.deep-copy #
(deep-copy v) -> any
Recursively copy Lua tables so extension registry records cannot mutate caller-owned contribution specs.
packages/core/src/fen/core/extensions/util.fnl:3
fen.core.extensions.util.freeze #
(freeze t) -> table
Return a recursive read-only proxy around a copied table for safe extension-facing introspection lists.
packages/core/src/fen/core/extensions/util.fnl:16
fen.core.extensions.util.remove-where #
(remove-where t pred) -> nil
Mutate an array-like table in place, removing entries whose predicate returns true while iterating from the end.
packages/core/src/fen/core/extensions/util.fnl:41
fen.core.extensions.util.clear-table #
(clear-table t) -> nil
Delete every key from an existing table so long-lived state table identity survives reloads and resets.
packages/core/src/fen/core/extensions/util.fnl:52
fen.core.extensions.util.add-tagged! #
(add-tagged! list spec owner) -> record, unregister-fn
Append a deep-copied owner-tagged contribution to an array registry and return the record plus identity-based unregister closure.
packages/core/src/fen/core/extensions/util.fnl:60
fen.core.extensions.util.set-tagged! #
(set-tagged! dict name spec owner) -> record, unregister-fn
Install a deep-copied owner-tagged singleton registry entry and return a stale-safe unregister closure.
packages/core/src/fen/core/extensions/util.fnl:76
fen.core.llm #
Module neighborhood graph: DOT · SVG
fen.core.llm.register #
(register provider) -> provider
Compatibility helper for in-process callers/tests. Prefer (extensions.register :provider provider owner) in extensions.
packages/core/src/fen/core/llm/init.fnl:11
fen.core.llm.get-provider #
(get-provider provider-name) -> provider
Resolve a provider by registered :name. Errors if the name is unknown.
packages/core/src/fen/core/llm/init.fnl:22
fen.core.llm.complete #
(complete provider-name model context options ?on-event ?yield-fn) -> AssistantMessage
Dispatch a completion to the named provider. Returns a canonical AssistantMessage. The provider chooses native streaming, cooperative-yield streaming, or blocking based on which callbacks are present.
packages/core/src/fen/core/llm/init.fnl:67
fen.core.llm.emit-block-events #
(emit-block-events asst emit) -> nil
Synthesize streaming block events from a complete AssistantMessage. Compatibility bridge for providers that do not implement :complete-stream natively.
packages/core/src/fen/core/llm/init.fnl:31
fen.core.llm.event_stream #
Module neighborhood graph: DOT · SVG
fen.core.llm.event_stream.new-stream #
(new-stream on-event) -> AssistantEventStream
Create a synchronous assistant-event sink that records events, forwards them to an observer, and captures the final result.
packages/core/src/fen/core/llm/event_stream.fnl:30
fen.core.llm.event_stream.terminal-event? #
(terminal-event? ev) -> boolean
Return true when an assistant stream event terminates the stream with either :done or :error.
packages/core/src/fen/core/llm/event_stream.fnl:9
fen.core.llm.event_stream.event-result #
(event-result ev) -> AssistantMessage|string|nil
Extract the final AssistantMessage or error payload carried by a terminal assistant stream event.
packages/core/src/fen/core/llm/event_stream.fnl:18
fen.core.llm.models #
Module neighborhood graph: DOT · SVG
fen.core.llm.models.config-dir #
(config-dir) -> string
Return fen's user configuration directory, honoring XDG_CONFIG_HOME through the shared path helper.
packages/core/src/fen/core/llm/models.fnl:16
fen.core.llm.models.config-path #
(config-path) -> string
Return the models.json path used for custom provider and model registry configuration.
packages/core/src/fen/core/llm/models.fnl:24
fen.core.llm.models.load #
(load) -> table
Load and cache the raw providers map from models.json, returning an empty table for missing or malformed config.
packages/core/src/fen/core/llm/models.fnl:94
fen.core.llm.models.get-provider #
(get-provider name) -> ModelsProvider|nil
Return the normalized models.json provider record for name, including api, base-url, api-key, compat, and models.
packages/core/src/fen/core/llm/models.fnl:120
fen.core.llm.models.register-providers! #
(register-providers!) -> number
Register every valid models.json provider into the extension registry under owner :models_json and return the count installed.
packages/core/src/fen/core/llm/models.fnl:173
fen.core.llm.models.resolve-api-key #
(resolve-api-key value) -> string|nil
Resolve a models.json apiKey field by treating nil/empty values as absent and all-caps values as environment variable names.
packages/core/src/fen/core/llm/models.fnl:58
fen.core.llm.models.looks-like-env-var? #
(looks-like-env-var? s) -> boolean
Return true when an apiKey string looks like an environment variable name rather than a literal credential.
packages/core/src/fen/core/llm/models.fnl:41
fen.core.llm.models.first-model-id #
(first-model-id provider) -> string|nil
Pick the first declared model id from a normalized provider record for default-model selection.
packages/core/src/fen/core/llm/models.fnl:130
fen.core.llm.models.available-models #
(available-models opts) -> [ModelRef]
Return selectable model refs from registered providers, filtering credential-gated built-ins until auth is configured.
packages/core/src/fen/core/llm/models.fnl:256
fen.core.llm.models.canonical-model-id #
(canonical-model-id model-ref) -> string
Format a model reference as the canonical provider/id string accepted by model resolution and displayed by commands.
packages/core/src/fen/core/llm/models.fnl:208
fen.core.llm.models.resolve-model-exact #
(resolve-model-exact query models) -> {:status :model :candidates}
Resolve an exact model query by canonical provider/id first and then by unique bare model id.
packages/core/src/fen/core/llm/models.fnl:290
fen.core.llm.models.resolve-model #
(resolve-model query models) -> {:status :model :candidates}
Resolve a model query by exact provider/id or bare id first, then by unique substring over provider/id or id.
packages/core/src/fen/core/llm/models.fnl:305
fen.core.llm.retry #
Module neighborhood graph: DOT · SVG
fen.core.llm.retry.DEFAULT-MAX-ATTEMPTS #
number
Default maximum number of provider HTTP attempts, including the initial try and transient retries.
packages/core/src/fen/core/llm/retry.fnl:9
fen.core.llm.retry.DEFAULT-BASE-DELAY-MS #
number
Default base delay in milliseconds used as the first exponential-backoff jitter cap.
packages/core/src/fen/core/llm/retry.fnl:16
fen.core.llm.retry.DEFAULT-MAX-DELAY-MS #
number
Default maximum jitter cap in milliseconds for provider retry backoff delays.
packages/core/src/fen/core/llm/retry.fnl:23
fen.core.llm.retry.transient? #
(transient? status err-message ?curl-code) -> boolean
Return true for provider HTTP status or curl code that is safe to retry below the agent message layer.
packages/core/src/fen/core/llm/retry.fnl:53
fen.core.llm.retry.mark-incomplete-stream #
packages/core/src/fen/core/llm/retry.fnl:237
fen.core.llm.retry.options #
(options provider ?opts ?on-event) -> table
Build with-retry options from provider request opts, honoring AGENT_FENNEL_RETRY=0 and emitting tagged :provider-retry events.
packages/core/src/fen/core/llm/retry.fnl:175
fen.core.llm.retry.parse-retry-after #
(parse-retry-after headers) -> number|nil
Parse Retry-After or retry-after-ms response headers into a millisecond delay for provider backoff.
packages/core/src/fen/core/llm/retry.fnl:97
fen.core.llm.retry.backoff-delay #
(backoff-delay attempt base-ms max-ms) -> number
Compute a full-jitter exponential backoff delay in milliseconds for the given failed attempt number.
packages/core/src/fen/core/llm/retry.fnl:116
fen.core.llm.retry.with-retry #
(with-retry opts make-request ?yield!) -> response
Run a provider request with bounded retry, Retry-After support, jittered backoff, and cooperative cancellation yields.
packages/core/src/fen/core/llm/retry.fnl:202
fen.core.prompt #
Module neighborhood graph: DOT · SVG
fen.core.prompt.build-context #
(build-context opts tools) -> table
Build the minimal context table passed to registered system-prompt fragment renderers.
packages/core/src/fen/core/prompt.fnl:11
fen.core.prompt.build #
(build opts tools) -> string
Render all extension-contributed system-prompt fragments for opts/tools and return an empty string when none render.
packages/core/src/fen/core/prompt.fnl:20
fen.core.settings #
Module neighborhood graph: DOT · SVG
fen.core.settings.config-dir #
(config-dir) -> string
Return fen's user configuration directory, honoring XDG_CONFIG_HOME through the shared path helper.
packages/core/src/fen/core/settings.fnl:15
fen.core.settings.config-path #
(config-path) -> string
Return the settings.json path used for mutable user preferences such as the default provider and model.
packages/core/src/fen/core/settings.fnl:23
fen.core.settings.load #
(load ?p) -> Settings
Load normalized user settings from settings.json, returning an empty record for missing or malformed files.
packages/core/src/fen/core/settings.fnl:60
fen.core.settings.save! #
(save! settings ?p) -> Settings
Atomically write normalized default-provider/default-model settings while preserving unknown top-level keys already on disk.
packages/core/src/fen/core/settings.fnl:87
fen.core.settings.set-defaults! #
(set-defaults! provider model ?p) -> Settings
Persist the default provider and model selected by commands, then return the normalized settings record.
packages/core/src/fen/core/settings.fnl:106
fen.core.settings.set-thinking-default! #
(set-thinking-default! level ?p) -> Settings
Persist the default provider-neutral thinking level and return the normalized settings record.
packages/core/src/fen/core/settings.fnl:115
fen.core.thinking #
Module neighborhood graph: DOT · SVG
fen.core.thinking.LEVELS #
packages/core/src/fen/core/thinking.fnl:61
fen.core.thinking.normalize-level #
packages/core/src/fen/core/thinking.fnl:61
fen.core.thinking.valid-level? #
packages/core/src/fen/core/thinking.fnl:61
fen.core.thinking.levels #
packages/core/src/fen/core/thinking.fnl:61
fen.core.thinking.level-list #
packages/core/src/fen/core/thinking.fnl:61
fen.core.thinking.level- #
packages/core/src/fen/core/thinking.fnl:61
fen.core.tools #
Module neighborhood graph: DOT · SVG
fen.core.tools.descriptors #
(descriptors reg) -> [Tool]
Strip executable AgentTool records down to canonical Tool descriptors passed to providers.
packages/core/src/fen/core/tools.fnl:22
fen.core.tools.execute-call #
(execute-call reg tool-call ctx ?yield-fn) -> {:message :result :duration-seconds :tool-call}
Execute one canonical ToolCall against the registered tools and wrap the result as a ToolResultMessage plus diagnostics.
packages/core/src/fen/core/tools.fnl:101
fen.core.types #
Module neighborhood graph: DOT · SVG
fen.core.types.now-ms #
(now-ms) -> number
Current epoch in milliseconds. Used as the :timestamp field on canonical messages.
packages/core/src/fen/core/types.fnl:101
fen.core.types.text-block #
(text-block s) -> TextContent
Build a {:type :text :text s} block. The visible-text content kind.
packages/core/src/fen/core/types.fnl:108
fen.core.types.thinking-block #
(thinking-block {: thinking : thinking-signature : redacted}) -> ThinkingContent
Build a {:type :thinking ...} block. Carries reasoning text plus the opaque echo signature required by Anthropic extended thinking and OpenAI Responses for multi-turn echo.
packages/core/src/fen/core/types.fnl:116
fen.core.types.tool-call-block #
(tool-call-block id name args) -> ToolCall
Build a {:type :tool-call :id :name :arguments} block. Arguments is a parsed Lua table — providers JSON-decode wire arguments before calling this.
packages/core/src/fen/core/types.fnl:128
fen.core.types.user-message #
(user-message content) -> UserMessage
Build a {:role :user :content :timestamp} message. content is a string or [TextContent].
packages/core/src/fen/core/types.fnl:137
fen.core.types.assistant-message #
(assistant-message {: content : api : provider : model : usage : stop-reason : error-message}) -> AssistantMessage
Build a canonical AssistantMessage. Content defaults to []; usage and stop-reason fall back to safe defaults; error-message is set only when provided.
packages/core/src/fen/core/types.fnl:148
fen.core.types.tool-result-message #
(tool-result-message {: tool-call-id : tool-name : content : details : is-error?}) -> ToolResultMessage
Build a canonical ToolResultMessage. content is always an array; details is opaque presenter payload.
packages/core/src/fen/core/types.fnl:166
fen.core.types.assistant-error #
(assistant-error api provider model error-message) -> AssistantMessage
Build an AssistantMessage representing a transport/HTTP failure. Sets stop-reason :error and inserts a synthetic "[error] ..." text block.
packages/core/src/fen/core/types.fnl:182
fen.core.types.INCOMPLETE-STREAM-MSG #
string
Error message for a 2xx stream that closed without a terminal completion event. Shared so provider finalizers and their tests can't drift.
packages/core/src/fen/core/types.fnl:195
fen.core.types.assistant-text #
(assistant-text msg) -> string
Concatenate every TextContent block in msg.content. Returns "" if there are no text blocks.
packages/core/src/fen/core/types.fnl:202
fen.core.types.assistant-tool-calls #
(assistant-tool-calls msg) -> [ToolCall]
Return every :tool-call block in msg.content, in source order.
packages/core/src/fen/core/types.fnl:222
fen.core.types.assistant-thinking #
(assistant-thinking msg) -> [ThinkingContent]
Return every :thinking block in msg.content, in source order.
packages/core/src/fen/core/types.fnl:229
Extensions (fen.extensions.*) #
fen.extensions.agent_state #
Module neighborhood graph: DOT · SVG
fen.extensions.agent_state.register #
[api]
extensions/behaviors/companions/agent-state/init.fnl:12
fen.extensions.agent_state.tool #
Module neighborhood graph: DOT · SVG
fen.extensions.agent_state.tool.execute #
(execute args ctx ?api ?yield-fn) -> AgentToolResult
Execute an agent_state query against sanitized agent context and render the result as JSON or Fennel with truncation. Cooperative: yields before evaluation and inside expensive branches when ?yield-fn is given.
extensions/behaviors/companions/agent-state/tool.fnl:531
fen.extensions.agent_state.tool.parse-query #
(parse-query s) -> expr|nil, err|nil
Parse the agent_state mini-query language into an expression tree, returning a user-facing parse error on invalid input.
extensions/behaviors/companions/agent-state/tool.fnl:146
fen.extensions.agent_state.tool.eval-query #
(eval-query expr state) -> any
Evaluate the parsed agent_state query operators against the sanitized snapshot without exposing general code execution.
extensions/behaviors/companions/agent-state/tool.fnl:503
fen.extensions.agent_state.tool.sanitized-state #
(sanitized-state agent api ?ctx) -> table
Build the redacted agent-state snapshot exposed to the agent_state tool without leaking raw mutable agent internals.
extensions/behaviors/companions/agent-state/tool.fnl:389
fen.extensions.builtin_tools #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.register #
[api]
extensions/behaviors/kernel/builtin-tools/init.fnl:11
fen.extensions.builtin_tools.bash #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.bash.name #
keyword
Registry name for the built-in Bash tool descriptor advertised to providers and slash-command docs.
extensions/behaviors/kernel/builtin-tools/bash.fnl:3
fen.extensions.builtin_tools.bash.bash #
AgentToolSpec
Complete Bash tool specification exported by the module for registration in the built-in tool registry.
extensions/behaviors/kernel/builtin-tools/bash.fnl:9
fen.extensions.builtin_tools.bash.label #
string
Human-readable label shown in tool-running status and generated tool listings before shell commands.
extensions/behaviors/kernel/builtin-tools/bash.fnl:15
fen.extensions.builtin_tools.bash.snippet #
string
Short Bash tool teaser used by generated docs and compact tool summaries before the full description.
extensions/behaviors/kernel/builtin-tools/bash.fnl:21
fen.extensions.builtin_tools.bash.description #
string
Provider-facing Bash tool description documenting merged stdout/stderr and tail-truncation behavior.
extensions/behaviors/kernel/builtin-tools/bash.fnl:27
fen.extensions.builtin_tools.bash.parameters #
JSONSchema
JSON schema for Bash tool arguments, including command text, optional timeout, and checked working directory.
extensions/behaviors/kernel/builtin-tools/bash.fnl:33
fen.extensions.builtin_tools.bash.execute #
(execute args ctx yield-fn?) -> AgentToolResult
Bash tool executor that runs a shell command through the timed/cancellable process helper and returns capped output with exit status.
extensions/behaviors/kernel/builtin-tools/bash.fnl:39
fen.extensions.builtin_tools.edit #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.edit.name #
keyword
Registry name for the built-in exact-replacement edit tool descriptor.
extensions/behaviors/kernel/builtin-tools/edit.fnl:5
fen.extensions.builtin_tools.edit.edit #
AgentToolSpec
Complete edit tool specification exported for registration with batch and single-file replacement modes.
extensions/behaviors/kernel/builtin-tools/edit.fnl:11
fen.extensions.builtin_tools.edit.label #
string
Human-readable label shown in tool-running status and generated listings for exact text edits.
extensions/behaviors/kernel/builtin-tools/edit.fnl:17
fen.extensions.builtin_tools.edit.snippet #
string
Short edit tool teaser describing precise replacements for compact generated docs.
extensions/behaviors/kernel/builtin-tools/edit.fnl:23
fen.extensions.builtin_tools.edit.description #
string
Provider-facing edit tool description covering uniqueness, snapshot application, and all-or-nothing batch validation.
extensions/behaviors/kernel/builtin-tools/edit.fnl:29
fen.extensions.builtin_tools.edit.parameters #
JSONSchema
JSON schema for single-file and batch edit payloads, including exact old and replacement strings.
extensions/behaviors/kernel/builtin-tools/edit.fnl:35
fen.extensions.builtin_tools.edit.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Edit tool executor that validates mutually exclusive modes, yields between large validation/write phases, applies exact replacements, and reports write summaries.
extensions/behaviors/kernel/builtin-tools/edit.fnl:41
fen.extensions.builtin_tools.find #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.find.name #
keyword
Registry name for the built-in recursive file find tool descriptor.
extensions/behaviors/kernel/builtin-tools/find.fnl:5
fen.extensions.builtin_tools.find.find #
AgentToolSpec
Complete find tool specification exported for name-glob file discovery through the built-in registry.
extensions/behaviors/kernel/builtin-tools/find.fnl:11
fen.extensions.builtin_tools.find.label #
string
Human-readable label shown in tool-running status and generated listings for file discovery.
extensions/behaviors/kernel/builtin-tools/find.fnl:17
fen.extensions.builtin_tools.find.snippet #
string
Short find tool teaser used by generated docs and compact tool summaries.
extensions/behaviors/kernel/builtin-tools/find.fnl:23
fen.extensions.builtin_tools.find.description #
string
Provider-facing find tool description for recursive filename-glob searches.
extensions/behaviors/kernel/builtin-tools/find.fnl:29
fen.extensions.builtin_tools.find.parameters #
JSONSchema
JSON schema for find arguments, including required name glob, optional root path, and result limit.
extensions/behaviors/kernel/builtin-tools/find.fnl:35
fen.extensions.builtin_tools.find.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Find tool executor that shells out to POSIX find, limits result lines, and cooperatively drains output when a yield-fn is provided.
extensions/behaviors/kernel/builtin-tools/find.fnl:41
fen.extensions.builtin_tools.grep #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.grep.name #
keyword
Registry name for the built-in recursive grep tool descriptor.
extensions/behaviors/kernel/builtin-tools/grep.fnl:5
fen.extensions.builtin_tools.grep.grep #
AgentToolSpec
Complete grep tool specification exported for content search through the built-in registry.
extensions/behaviors/kernel/builtin-tools/grep.fnl:11
fen.extensions.builtin_tools.grep.label #
string
Human-readable label shown in tool-running status and generated listings for text searches.
extensions/behaviors/kernel/builtin-tools/grep.fnl:17
fen.extensions.builtin_tools.grep.snippet #
string
Short grep tool teaser used by generated docs before the full search option contract.
extensions/behaviors/kernel/builtin-tools/grep.fnl:23
fen.extensions.builtin_tools.grep.description #
string
Provider-facing grep tool description covering recursive regex search behavior.
extensions/behaviors/kernel/builtin-tools/grep.fnl:29
fen.extensions.builtin_tools.grep.parameters #
JSONSchema
JSON schema for grep arguments, including pattern, path, glob, literal, case, context, and limit controls.
extensions/behaviors/kernel/builtin-tools/grep.fnl:35
fen.extensions.builtin_tools.grep.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Grep tool executor that builds a POSIX grep pipeline, enforces an output limit, and cooperatively drains matches when a yield-fn is provided.
extensions/behaviors/kernel/builtin-tools/grep.fnl:41
fen.extensions.builtin_tools.ls #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.ls.name #
keyword
Registry name for the built-in directory listing tool descriptor.
extensions/behaviors/kernel/builtin-tools/ls.fnl:7
fen.extensions.builtin_tools.ls.ls #
AgentToolSpec
Complete ls tool specification exported for listing directory entries through the built-in registry.
extensions/behaviors/kernel/builtin-tools/ls.fnl:13
fen.extensions.builtin_tools.ls.label #
string
Human-readable label shown in tool-running status and generated listings for directory scans.
extensions/behaviors/kernel/builtin-tools/ls.fnl:19
fen.extensions.builtin_tools.ls.snippet #
string
Short ls tool teaser used by generated docs and compact tool summaries.
extensions/behaviors/kernel/builtin-tools/ls.fnl:25
fen.extensions.builtin_tools.ls.description #
string
Provider-facing ls tool description for shallow directory entry listings.
extensions/behaviors/kernel/builtin-tools/ls.fnl:31
fen.extensions.builtin_tools.ls.parameters #
JSONSchema
JSON schema for ls arguments, including optional target directory and output line limit.
extensions/behaviors/kernel/builtin-tools/ls.fnl:37
fen.extensions.builtin_tools.ls.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Ls tool executor that shells out to POSIX ls, cooperatively drains output when a yield-fn is provided, applies optional limits, and caps long output.
extensions/behaviors/kernel/builtin-tools/ls.fnl:43
fen.extensions.builtin_tools.read #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.read.name #
keyword
Registry name for the built-in file read tool descriptor.
extensions/behaviors/kernel/builtin-tools/read.fnl:7
fen.extensions.builtin_tools.read.read #
AgentToolSpec
Complete read tool specification exported for single-file and batched file inspection.
extensions/behaviors/kernel/builtin-tools/read.fnl:13
fen.extensions.builtin_tools.read.label #
string
Human-readable label shown in tool-running status and generated listings for file reads.
extensions/behaviors/kernel/builtin-tools/read.fnl:19
fen.extensions.builtin_tools.read.snippet #
string
Short read tool teaser used by generated docs before the full paging and truncation contract.
extensions/behaviors/kernel/builtin-tools/read.fnl:25
fen.extensions.builtin_tools.read.description #
string
Provider-facing read tool description covering full slurps, offset/limit paging, batched reads, and truncation tags.
extensions/behaviors/kernel/builtin-tools/read.fnl:31
fen.extensions.builtin_tools.read.parameters #
JSONSchema
JSON schema for read arguments, including path, batched paths, and optional line window controls.
extensions/behaviors/kernel/builtin-tools/read.fnl:37
fen.extensions.builtin_tools.read.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Read tool executor that dispatches single or batch reads, yielding during large file and batch work when cooperative.
extensions/behaviors/kernel/builtin-tools/read.fnl:43
fen.extensions.builtin_tools.registry #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.registry.registry #
[AgentToolSpec]
Ordered list of built-in tool specifications registered by the builtin-tools extension and reused by tests.
extensions/behaviors/kernel/builtin-tools/registry.fnl:3
fen.extensions.builtin_tools.truncate #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.truncate.DEFAULT-MAX-LINES #
number
Default maximum number of tool-output lines kept inline before truncation spills the full output.
extensions/behaviors/kernel/builtin-tools/truncate.fnl:3
fen.extensions.builtin_tools.truncate.DEFAULT-MAX-BYTES #
number
Default maximum number of tool-output bytes kept inline before truncation writes a spill file.
extensions/behaviors/kernel/builtin-tools/truncate.fnl:10
fen.extensions.builtin_tools.truncate.truncate-head #
(truncate-head s opts? yield-fn?) -> string, truncated?
Keep the beginning of tool output within max-lines/max-bytes, yielding during scans and full-output spills when cooperative.
extensions/behaviors/kernel/builtin-tools/truncate.fnl:96
fen.extensions.builtin_tools.truncate.truncate-tail #
(truncate-tail s opts? yield-fn?) -> string, truncated?
Keep the end of tool output within max-lines/max-bytes, yielding during scans and full-output spills when cooperative.
extensions/behaviors/kernel/builtin-tools/truncate.fnl:133
fen.extensions.builtin_tools.util #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.util.agent-result #
(agent-result content is-error? details) -> AgentToolResult
Build the common AgentToolResult shape used by built-in tools, preserving optional presenter details.
extensions/behaviors/kernel/builtin-tools/util.fnl:3
fen.extensions.builtin_tools.util.ok #
(ok text) -> AgentToolResult
Wrap successful plain text output as a canonical non-error AgentToolResult.
extensions/behaviors/kernel/builtin-tools/util.fnl:13
fen.extensions.builtin_tools.util.err #
(err message) -> AgentToolResult
Wrap an error message as a canonical AgentToolResult whose text is prefixed with error:.
extensions/behaviors/kernel/builtin-tools/util.fnl:21
fen.extensions.builtin_tools.util.shellquote #
(shellquote s) -> string
Quote a built-in tool path or argument as one POSIX shell word for system probes.
extensions/behaviors/kernel/builtin-tools/util.fnl:29
fen.extensions.builtin_tools.util.int-arg #
(int-arg v default) -> number
Normalize numeric tool arguments by converting to an integer or returning the provided default.
extensions/behaviors/kernel/builtin-tools/util.fnl:37
fen.extensions.builtin_tools.util.result-text #
(result-text r) -> string
Extract the first text block from an AgentToolResult for tests and composed tool helpers.
extensions/behaviors/kernel/builtin-tools/util.fnl:47
fen.extensions.builtin_tools.util.dir-exists? #
(dir-exists? path) -> boolean
Check whether a path is a directory using a shell-quoted POSIX test probe.
extensions/behaviors/kernel/builtin-tools/util.fnl:56
fen.extensions.builtin_tools.write #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.write.name #
keyword
Registry name for the built-in file write tool descriptor.
extensions/behaviors/kernel/builtin-tools/write.fnl:5
fen.extensions.builtin_tools.write.write #
AgentToolSpec
Complete write tool specification exported for creating or overwriting files.
extensions/behaviors/kernel/builtin-tools/write.fnl:11
fen.extensions.builtin_tools.write.label #
string
Human-readable label shown in tool-running status and generated listings for file writes.
extensions/behaviors/kernel/builtin-tools/write.fnl:17
fen.extensions.builtin_tools.write.snippet #
string
Short write tool teaser used by generated docs and compact tool summaries.
extensions/behaviors/kernel/builtin-tools/write.fnl:23
fen.extensions.builtin_tools.write.description #
string
Provider-facing write tool description documenting overwrite semantics and parent-directory creation.
extensions/behaviors/kernel/builtin-tools/write.fnl:29
fen.extensions.builtin_tools.write.parameters #
JSONSchema
JSON schema for write arguments containing the destination path and complete file content.
extensions/behaviors/kernel/builtin-tools/write.fnl:35
fen.extensions.builtin_tools.write.execute #
(execute args ctx? yield-fn?) -> AgentToolResult
Write tool executor that creates missing parent directories, yields during large content writes, and reports byte counts.
extensions/behaviors/kernel/builtin-tools/write.fnl:41
fen.extensions.compact #
Module neighborhood graph: DOT · SVG
fen.extensions.compact.register #
extensions/behaviors/companions/compact/init.fnl:242
fen.extensions.compact.register! #
extensions/behaviors/companions/compact/init.fnl:242
fen.extensions.compact._test #
extensions/behaviors/companions/compact/init.fnl:242
fen.extensions.default_prompt #
Module neighborhood graph: DOT · SVG
fen.extensions.default_prompt.tool-list-section #
(tool-list-section tools) -> string|nil
Render the available-tools prompt section from registered tool snippets, omitting the section when none are present.
extensions/behaviors/kernel/default-prompt/init.fnl:30
fen.extensions.default_prompt.guidelines-section #
(guidelines-section tools) -> string
Render built-in model guidance tailored to the currently available file, bash, read/edit, and agent_state tools.
extensions/behaviors/kernel/default-prompt/init.fnl:44
fen.extensions.default_prompt.context-section #
(context-section context-files) -> string|nil
Render loaded project context files as titled prompt sections for the default system prompt.
extensions/behaviors/kernel/default-prompt/init.fnl:68
fen.extensions.default_prompt.default-prompt #
string
Built-in fallback system prompt used when no SYSTEM.md or CLI system override is available.
extensions/behaviors/kernel/default-prompt/init.fnl:139
fen.extensions.default_prompt.register #
function
Registration entrypoint alias for installing the default prompt fragments into the extension registry.
extensions/behaviors/kernel/default-prompt/init.fnl:146
fen.extensions.default_prompt.register! #
function
Registration entrypoint alias for installing the default prompt fragments into the extension registry.
extensions/behaviors/kernel/default-prompt/init.fnl:146
fen.extensions.default_prompt.current-loader #
function
Loader accessor alias returning the cached default-prompt resource loader, creating it on first use.
extensions/behaviors/kernel/default-prompt/init.fnl:154
fen.extensions.default_prompt.resources #
Module neighborhood graph: DOT · SVG
fen.extensions.default_prompt.resources.make #
(make opts) -> ResourceLoader
Create and immediately load a reloadable resource snapshot for SYSTEM overlays and project context files.
extensions/behaviors/kernel/default-prompt/resources.fnl:73
fen.extensions.default_prompt.resources.cwd #
function
Path helper alias returning the current logical working directory for resource scans.
extensions/behaviors/kernel/default-prompt/resources.fnl:87
fen.extensions.default_prompt.resources.config-dir #
function
Helper alias returning fen's XDG configuration directory for prompt overlays and global context.
extensions/behaviors/kernel/default-prompt/resources.fnl:94
fen.extensions.default_prompt.resources.load-project-context-files #
function
Helper alias loading global and ancestor AGENTS.md or CLAUDE.md context files in prompt order.
extensions/behaviors/kernel/default-prompt/resources.fnl:101
fen.extensions.default_prompt.resources.load-system-file #
function
Helper alias resolving the effective SYSTEM.md or APPEND_SYSTEM.md overlay for the current project.
extensions/behaviors/kernel/default-prompt/resources.fnl:108
fen.extensions.default_prompt.resources._ancestors-root-to-leaf #
function
Test helper alias exposing the root-to-leaf ancestor walker used by prompt resource discovery.
extensions/behaviors/kernel/default-prompt/resources.fnl:115
fen.extensions.docs #
Module neighborhood graph: DOT · SVG
fen.extensions.docs.register #
(register api?) -> true
Register the /docs command, fen_docs tool, docs panel, and dismiss handler against the extension API.
extensions/behaviors/kernel/docs/init.fnl:477
fen.extensions.docs.state #
Module neighborhood graph: DOT · SVG
fen.extensions.docs.state.visible? #
boolean
Visibility flag for the persistent /docs panel that lists generated API and contract entries.
extensions/behaviors/kernel/docs/state.fnl:3
fen.extensions.docs.state.selected-topic #
string|nil
Current /docs topic selection used to keep the active group stable across row refreshes.
extensions/behaviors/kernel/docs/state.fnl:9
fen.extensions.docs.state.selected-name #
string|nil
Current /docs entry selection within the active topic for keyboard focus and detail rendering.
extensions/behaviors/kernel/docs/state.fnl:15
fen.extensions.docs.state.cached-rows #
[PresenterRow]|nil
Cached rendered /docs panel rows reused while topic, selection, and terminal width are unchanged.
extensions/behaviors/kernel/docs/state.fnl:21
fen.extensions.docs.state.cached-at #
number
Timestamp for the /docs panel cache, allowing registry documentation to be refreshed predictably.
extensions/behaviors/kernel/docs/state.fnl:27
fen.extensions.docs.state.cached-w #
number
Terminal width associated with cached /docs rows so resize events rebuild wrapped documentation text.
extensions/behaviors/kernel/docs/state.fnl:33
fen.extensions.docs.state.cached-selected-topic #
string|nil
Topic selection value associated with cached /docs rows so topic changes invalidate the panel cache.
extensions/behaviors/kernel/docs/state.fnl:39
fen.extensions.docs.state.cached-selected-name #
string|nil
Entry selection value associated with cached /docs rows so focus changes invalidate detail rendering.
extensions/behaviors/kernel/docs/state.fnl:45
fen.extensions.essentials #
Module neighborhood graph: DOT · SVG
fen.extensions.essentials.register #
[api]
extensions/behaviors/kernel/essentials/init.fnl:9
fen.extensions.essentials.commands.help #
Module neighborhood graph: DOT · SVG
fen.extensions.essentials.commands.help.register #
(register api) -> nil
Register the /help command that lists available slash commands and controls grouped by extension owner.
extensions/behaviors/kernel/essentials/commands/help.fnl:88
fen.extensions.essentials.commands.model #
Module neighborhood graph: DOT · SVG
fen.extensions.essentials.commands.model.register #
(register api) -> nil
Register the /model command for selecting configured models by overlay, index, exact id, or substring query.
extensions/behaviors/kernel/essentials/commands/model.fnl:115
fen.extensions.essentials.commands.thinking #
Module neighborhood graph: DOT · SVG
fen.extensions.essentials.commands.thinking.register #
(register api) -> nil
Register the /thinking command for inspecting and setting provider-neutral thinking effort.
extensions/behaviors/kernel/essentials/commands/thinking.fnl:109
fen.extensions.extensions_inspector #
Module neighborhood graph: DOT · SVG
fen.extensions.extensions_inspector.register #
[api]
extensions/behaviors/inspectors/extensions/init.fnl:7
fen.extensions.extensions_inspector.commands.extension #
Module neighborhood graph: DOT · SVG
fen.extensions.extensions_inspector.commands.extension.register #
(register api) -> nil
Register extension management commands plus the extension picker/detail panel and dismiss handler.
extensions/behaviors/inspectors/extensions/commands/extension.fnl:458
fen.extensions.extensions_inspector.state.extensions #
Module neighborhood graph: DOT · SVG
fen.extensions.extensions_inspector.state.extensions.visible? #
boolean
Visibility flag for the persistent /extensions panel, kept across hot reloads until dismissed or toggled.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:3
fen.extensions.extensions_inspector.state.extensions.view #
extensions/behaviors/inspectors/extensions/state/extensions.fnl:39
fen.extensions.extensions_inspector.state.extensions.extensions #
extensions/behaviors/inspectors/extensions/state/extensions.fnl:39
fen.extensions.extensions_inspector.state.extensions.selected-name #
string|nil
Currently selected extension name used by the /extensions panel to keep focus stable while rows refresh.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:9
fen.extensions.extensions_inspector.state.extensions.registry-kind #
extensions/behaviors/inspectors/extensions/state/extensions.fnl:39
fen.extensions.extensions_inspector.state.extensions.cached-rows #
[PresenterRow]|nil
Cached rendered /extensions panel rows reused between paints when width and selection have not changed.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:15
fen.extensions.extensions_inspector.state.extensions.cached-at #
number
Timestamp for the /extensions panel row cache, allowing throttled refreshes of registry-derived content.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:21
fen.extensions.extensions_inspector.state.extensions.cached-w #
number
Terminal width associated with cached /extensions rows so resizes invalidate wrapped panel content.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:27
fen.extensions.extensions_inspector.state.extensions.cached-selected-name #
string|nil
Extension selection value associated with cached rows so focus changes trigger a panel rerender.
extensions/behaviors/inspectors/extensions/state/extensions.fnl:33
fen.extensions.extensions_inspector.state.extensions.cached-view #
extensions/behaviors/inspectors/extensions/state/extensions.fnl:39
fen.extensions.extensions_inspector.state.extensions.cached-registry-kind #
extensions/behaviors/inspectors/extensions/state/extensions.fnl:39
fen.extensions.extensions_inspector.util #
Module neighborhood graph: DOT · SVG
fen.extensions.extensions_inspector.util.approx-tokens #
(approx-tokens s) -> number
Estimate token count from text length for status displays when provider-reported usage is unavailable.
extensions/behaviors/inspectors/extensions/util.fnl:7
fen.extensions.extensions_inspector.util.safe-json #
(safe-json v) -> string
JSON-encode a value for token estimation, falling back to tostring when encoding fails.
extensions/behaviors/inspectors/extensions/util.fnl:19
fen.extensions.extensions_inspector.util.content-tokens #
(content-tokens content) -> number
Estimate tokens for canonical message content, including text, thinking blocks, and tool-call names/arguments.
extensions/behaviors/inspectors/extensions/util.fnl:28
fen.extensions.extensions_inspector.util.estimated-context-tokens #
(estimated-context-tokens agent) -> number
Estimate the current agent context size from system prompt, messages, content blocks, and tool-result names.
extensions/behaviors/inspectors/extensions/util.fnl:51
fen.extensions.extensions_inspector.util.usage-totals #
(usage-totals messages) -> Usage
Sum provider usage counters across assistant messages for status and session diagnostics.
extensions/behaviors/inspectors/extensions/util.fnl:64
fen.extensions.extensions_inspector.util.fmt-tokens #
(fmt-tokens n) -> string
Format a token count compactly with raw, k, or M suffixes for slash-command status output.
extensions/behaviors/inspectors/extensions/util.fnl:83
fen.extensions.extensions_inspector.util.format-token-summary #
(format-token-summary usage approx) -> string
Build the one-line input/output/cache/context token summary shown by /status.
extensions/behaviors/inspectors/extensions/util.fnl:96
fen.extensions.extensions_inspector.util.runtime-version #
(runtime-version) -> string
Return the build-stamped fen version, or unknown when running from source/tests without dist metadata.
extensions/behaviors/inspectors/extensions/util.fnl:109
fen.extensions.extensions_inspector.util.nth-arg #
(nth-arg args n) -> string|nil
Extract the nth whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/extensions/util.fnl:120
fen.extensions.extensions_inspector.util.first-arg #
(first-arg args) -> string|nil
Extract the first whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/extensions/util.fnl:129
fen.extensions.handoff #
Module neighborhood graph: DOT · SVG
fen.extensions.handoff.register #
extensions/behaviors/companions/handoff/init.fnl:153
fen.extensions.handoff.register! #
(register!) -> true
Register the /handoff command that summarizes the current session and seeds a fresh session with the result.
extensions/behaviors/companions/handoff/init.fnl:135
fen.extensions.mem #
Module neighborhood graph: DOT · SVG
fen.extensions.mem.report-rows #
(report-rows run-state opts?) -> [PresenterRow]
Build memory diagnostics rows for the /mem panel, including optional GC before/after output, app state, registries, and history.
extensions/behaviors/companions/mem/init.fnl:130
fen.extensions.mem.panel-spec #
(panel-spec) -> PanelSpec
Return the /mem panel contribution that sizes and renders the cached memory diagnostics above the input.
extensions/behaviors/companions/mem/init.fnl:198
fen.extensions.mem.register #
function
Registration entrypoint alias for installing the /mem command, panel, sampling hook, and dismiss handler.
extensions/behaviors/companions/mem/init.fnl:292
fen.extensions.mem.register! #
function
Registration entrypoint alias for installing the /mem command, panel, sampling hook, and dismiss handler.
extensions/behaviors/companions/mem/init.fnl:292
fen.extensions.mem._state #
table
Test and diagnostics alias for the persistent memory diagnostics state table.
extensions/behaviors/companions/mem/init.fnl:300
fen.extensions.mem.state #
Module neighborhood graph: DOT · SVG
fen.extensions.mem.state.samples #
[number]
Rolling Lua heap samples used by the memory diagnostics panel to render its history sparkline.
extensions/behaviors/companions/mem/state.fnl:3
fen.extensions.mem.state.max-samples #
number
Maximum number of memory samples retained for the diagnostics panel history window.
extensions/behaviors/companions/mem/state.fnl:9
fen.extensions.mem.state.peak-kb #
number
Largest observed Lua heap size in kilobytes, used for peak reporting and sparkline scaling.
extensions/behaviors/companions/mem/state.fnl:15
fen.extensions.mem.state.visible? #
boolean
Visibility flag for the persistent memory diagnostics panel toggled by the /mem command.
extensions/behaviors/companions/mem/state.fnl:21
fen.extensions.mem.state.run-state #
table|nil
Last presenter run-state snapshot used by the memory panel to display agent and session details.
extensions/behaviors/companions/mem/state.fnl:27
fen.extensions.mem.state.cached-rows #
[PresenterRow]|nil
Cached rendered memory panel rows reused between paints to avoid noisy heap recomputation.
extensions/behaviors/companions/mem/state.fnl:33
fen.extensions.mem.state.cached-at #
number
Timestamp for the memory panel cache, supporting its one-hertz refresh throttle.
extensions/behaviors/companions/mem/state.fnl:39
fen.extensions.mem.state.cached-w #
number
Terminal width associated with cached memory rows so resize events rebuild the bordered panel.
extensions/behaviors/companions/mem/state.fnl:45
fen.extensions.print #
Module neighborhood graph: DOT · SVG
fen.extensions.print.run #
(run ctx) -> nil
Execute the one-shot print presenter by stepping the agent with the supplied prompt and printing the final text.
extensions/adapters/presenters/print/init.fnl:13
fen.extensions.print.register #
[api]
extensions/adapters/presenters/print/init.fnl:29
fen.extensions.prompt #
Module neighborhood graph: DOT · SVG
fen.extensions.prompt.register #
[api]
extensions/behaviors/inspectors/prompt/init.fnl:7
fen.extensions.prompt.commands.prompt #
Module neighborhood graph: DOT · SVG
fen.extensions.prompt.commands.prompt.register #
(register api) -> nil
Register the /prompt command and prompt-fragment panel for inspecting rendered system prompt state.
extensions/behaviors/inspectors/prompt/commands/prompt.fnl:99
fen.extensions.prompt.state.prompt #
Module neighborhood graph: DOT · SVG
fen.extensions.prompt.state.prompt.visible? #
boolean
Visibility flag for the persistent /prompt panel that previews assembled system prompt fragments.
extensions/behaviors/inspectors/prompt/state/prompt.fnl:3
fen.extensions.prompt.state.prompt.cached-rows #
[PresenterRow]|nil
Cached rendered /prompt panel rows reused while prompt content and terminal width remain stable.
extensions/behaviors/inspectors/prompt/state/prompt.fnl:9
fen.extensions.prompt.state.prompt.cached-at #
number
Timestamp for the /prompt panel cache, used to avoid rebuilding prompt rows on every repaint.
extensions/behaviors/inspectors/prompt/state/prompt.fnl:15
fen.extensions.prompt.state.prompt.cached-w #
number
Terminal width associated with cached /prompt rows so resize events rebuild wrapped preview text.
extensions/behaviors/inspectors/prompt/state/prompt.fnl:21
fen.extensions.provider_anthropic #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_anthropic.register #
[api]
extensions/adapters/providers/anthropic/init.fnl:15
fen.extensions.provider_anthropic.anthropic_messages #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_anthropic.anthropic_messages.api #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.provider #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.default-base-url #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.default-version #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.convert-messages #
(convert-messages messages _system-prompt) -> [WireMessage]
Convert canonical messages into Anthropic Messages wire shape, batching consecutive tool results into one user message.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:98
fen.extensions.provider_anthropic.anthropic_messages.convert-tools #
(convert-tools tools) -> [WireTool]
Convert canonical Tool descriptors into Anthropic flat tool specs with input_schema parameters.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:136
fen.extensions.provider_anthropic.anthropic_messages.map-stop-reason #
(map-stop-reason reason) -> StopReason, error-message|nil
Map Anthropic stop_reason values onto canonical StopReason values and explanatory error strings.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:155
fen.extensions.provider_anthropic.anthropic_messages.parse-response #
(parse-response resp model) -> AssistantMessage
Parse a non-streaming Anthropic Messages response into canonical assistant text, thinking, tool calls, usage, and stop reason.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:175
fen.extensions.provider_anthropic.anthropic_messages.process-stream-event! #
(process-stream-event! state ev emit) -> state
Fold one decoded Anthropic typed SSE event into stream state, content blocks, usage, and delta callbacks.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:433
fen.extensions.provider_anthropic.anthropic_messages.new-stream-state #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.finalize-stream-state #
(finalize-stream-state state emit) -> AssistantMessage
Finalize Anthropic streaming state into a canonical assistant message and emit the terminal done/error event.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:468
fen.extensions.provider_anthropic.anthropic_messages.finalize-stream #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:580
fen.extensions.provider_anthropic.anthropic_messages.build-body #
(build-body model context max-tokens options) -> table
Build an Anthropic Messages request body with system prompt/cache markers, tools, parallel-tool policy, and optional thinking budget.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:242
fen.extensions.provider_anthropic.anthropic_messages.complete #
(complete model context options ?on-event ?yield-fn) -> AssistantMessage
Execute one Anthropic provider call, choosing streaming/non-streaming and cooperative/blocking transport from callbacks.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:531
fen.extensions.provider_openai #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.register #
[api]
extensions/adapters/providers/openai/init.fnl:39
fen.extensions.provider_openai.openai_codex_keychain #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_keychain.default-agent-dir #
(default-agent-dir) -> string
Return fen's writable Codex auth directory, honoring FEN_AUTH_DIR before the XDG fen config directory.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:23
fen.extensions.provider_openai.openai_codex_keychain.default-auth-path #
(default-auth-path) -> string
Return the fen-owned auth.json path where Codex login, refresh, and logout persist credentials.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:34
fen.extensions.provider_openai.openai_codex_keychain.candidate-read-auth-paths #
(candidate-read-auth-paths) -> [string]
Return credential read paths in priority order. Currently this is only fen's auth.json path.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:43
fen.extensions.provider_openai.openai_codex_keychain.load #
(load ?path) -> table
Read and decode one auth.json file, returning an empty table for missing, unreadable, or malformed storage.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:79
fen.extensions.provider_openai.openai_codex_keychain.get #
(get provider-id ?path) -> table|nil
Return one provider credential record from the explicit path or fen-owned auth.json.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:99
fen.extensions.provider_openai.openai_codex_keychain.save #
(save data ?path) -> nil
Atomically write the full auth.json table, creating the parent directory and tightening file permissions to 0600.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:109
fen.extensions.provider_openai.openai_codex_keychain.set #
(set provider-id record ?path) -> table
Read-modify-write one provider credential record into auth.json and return the persisted auth table.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:138
fen.extensions.provider_openai.openai_codex_login #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_login.AUTHORIZE-URL #
string
Originator value sent in the authorization URL to identify fen's simplified Codex login flow.
extensions/adapters/providers/openai/openai_codex_login.fnl:271
fen.extensions.provider_openai.openai_codex_login.REDIRECT-URI #
string
Originator value sent in the authorization URL to identify fen's simplified Codex login flow.
extensions/adapters/providers/openai/openai_codex_login.fnl:271
fen.extensions.provider_openai.openai_codex_login.SCOPE #
string
Originator value sent in the authorization URL to identify fen's simplified Codex login flow.
extensions/adapters/providers/openai/openai_codex_login.fnl:271
fen.extensions.provider_openai.openai_codex_login.ORIGINATOR #
string
Originator value sent in the authorization URL to identify fen's simplified Codex login flow.
extensions/adapters/providers/openai/openai_codex_login.fnl:271
fen.extensions.provider_openai.openai_codex_login.generate-pkce #
(generate-pkce) -> {:verifier :challenge}
Generate a fresh PKCE verifier/challenge pair using platform randomness, SHA-256, and base64url encoding.
extensions/adapters/providers/openai/openai_codex_login.fnl:66
fen.extensions.provider_openai.openai_codex_login.build-authorize-url #
(build-authorize-url pkce state) -> string
Compose the ChatGPT OAuth authorization URL with PKCE challenge, state, scope, redirect URI, and Codex flow flags.
extensions/adapters/providers/openai/openai_codex_login.fnl:80
fen.extensions.provider_openai.openai_codex_login.parse-authorization-input #
(parse-authorization-input input) -> {:code :state}
Parse pasted Codex authorization input as full callback URL, raw query, code#state shorthand, or bare code.
extensions/adapters/providers/openai/openai_codex_login.fnl:123
fen.extensions.provider_openai.openai_codex_login.extract-query-param #
(extract-query-param query key) -> string|nil
Extract and URL-decode one parameter from an OAuth callback query string.
extensions/adapters/providers/openai/openai_codex_login.fnl:100
fen.extensions.provider_openai.openai_codex_login.exchange-code! #
(exchange-code! code verifier) -> CredentialRecord
Exchange an authorization code and PKCE verifier for Codex OAuth credentials, validating required token response fields.
extensions/adapters/providers/openai/openai_codex_login.fnl:152
fen.extensions.provider_openai.openai_codex_login.login! #
(login! ?path) -> CredentialRecord
Run the manual PKCE login flow, prompt for the callback code, exchange it, persist credentials, and print account status.
extensions/adapters/providers/openai/openai_codex_login.fnl:217
fen.extensions.provider_openai.openai_codex_login.logout! #
(logout! ?path) -> boolean
Remove the openai-codex credential record from auth.json and report whether anything was deleted.
extensions/adapters/providers/openai/openai_codex_login.fnl:249
fen.extensions.provider_openai.openai_codex_oauth #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_oauth.PROVIDER-ID #
string
OAuth client id used by the ChatGPT Codex login and refresh flows.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:193
fen.extensions.provider_openai.openai_codex_oauth.TOKEN-URL #
string
OAuth client id used by the ChatGPT Codex login and refresh flows.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:193
fen.extensions.provider_openai.openai_codex_oauth.CLIENT-ID #
string
OAuth client id used by the ChatGPT Codex login and refresh flows.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:193
fen.extensions.provider_openai.openai_codex_oauth.decode-jwt #
(decode-jwt token) -> table
Decode a JWT payload into a Lua table without signature verification for trusted on-disk Codex tokens.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:38
fen.extensions.provider_openai.openai_codex_oauth.extract-account-id #
(extract-account-id access-token) -> string|nil
Extract chatgpt_account_id from the OpenAI auth claim in a Codex access-token JWT, returning nil on parse failure.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:53
fen.extensions.provider_openai.openai_codex_oauth.refresh! #
(refresh! refresh-token) -> CredentialRecord
Exchange a refresh token at the OpenAI OAuth token endpoint and return a fresh Codex credential record.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:94
fen.extensions.provider_openai.openai_codex_oauth.expiring-soon? #
(expiring-soon? creds) -> boolean
Return true when stored Codex credentials are missing expiry or expire within the proactive refresh margin.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:135
fen.extensions.provider_openai.openai_codex_oauth.configured? #
(configured? ?path) -> boolean
Check whether auth.json contains a structurally usable openai-codex OAuth record without refreshing it.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:162
fen.extensions.provider_openai.openai_codex_oauth.get-fresh-creds! #
(get-fresh-creds! ?path) -> CredentialRecord
Load Codex credentials, refresh and persist them when near expiry, or raise a friendly login-required error.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:176
fen.extensions.provider_openai.openai_codex_oauth.form-encode #
(form-encode params) -> string
Encode OAuth form parameters as an ampersand-joined application/x-www-form-urlencoded body.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:81
fen.extensions.provider_openai.openai_codex_oauth.url-encode #
(url-encode s) -> string
Percent-encode one OAuth form component using the unreserved character set required by application/x-www-form-urlencoded.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:71
fen.extensions.provider_openai.openai_codex_responses #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_responses.api #
string
Default ChatGPT backend API root used by the Codex Responses adapter before appending /codex/responses.
extensions/adapters/providers/openai/openai_codex_responses.fnl:157
fen.extensions.provider_openai.openai_codex_responses.provider #
string
Default ChatGPT backend API root used by the Codex Responses adapter before appending /codex/responses.
extensions/adapters/providers/openai/openai_codex_responses.fnl:157
fen.extensions.provider_openai.openai_codex_responses.default-base-url #
string
Default ChatGPT backend API root used by the Codex Responses adapter before appending /codex/responses.
extensions/adapters/providers/openai/openai_codex_responses.fnl:157
fen.extensions.provider_openai.openai_codex_responses.build-url #
(build-url base-url) -> string
Normalize a ChatGPT backend base URL into the Codex Responses endpoint while preserving fully-qualified Codex URLs.
extensions/adapters/providers/openai/openai_codex_responses.fnl:30
fen.extensions.provider_openai.openai_codex_responses.map-codex-event #
(map-codex-event ev) -> table
Normalize Codex response.done and response.incomplete SSE aliases into the shared Responses reducer's response.completed event.
extensions/adapters/providers/openai/openai_codex_responses.fnl:64
fen.extensions.provider_openai.openai_codex_responses.build-headers #
(build-headers creds) -> table
Build ChatGPT Codex streaming request headers from OAuth credentials, including account id, beta flag, and user agent.
extensions/adapters/providers/openai/openai_codex_responses.fnl:50
fen.extensions.provider_openai.openai_codex_responses.merge-options #
(merge-options opts) -> table
Copy provider options and add Codex defaults for encrypted reasoning includes and skipping unsupported max_output_tokens.
extensions/adapters/providers/openai/openai_codex_responses.fnl:87
fen.extensions.provider_openai.openai_codex_responses.complete #
(complete model context options ?on-event ?yield-fn) -> AssistantMessage
Execute one ChatGPT Codex Responses call through the shared streaming pipeline with OAuth credentials and Codex event mapping.
extensions/adapters/providers/openai/openai_codex_responses.fnl:110
fen.extensions.provider_openai.openai_completions #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_completions.api #
string
Default OpenAI v1 API root used when models.json or provider options do not override the base URL.
extensions/adapters/providers/openai/openai_completions.fnl:667
fen.extensions.provider_openai.openai_completions.provider #
string
Default OpenAI v1 API root used when models.json or provider options do not override the base URL.
extensions/adapters/providers/openai/openai_completions.fnl:667
fen.extensions.provider_openai.openai_completions.default-base-url #
string
Default OpenAI v1 API root used when models.json or provider options do not override the base URL.
extensions/adapters/providers/openai/openai_completions.fnl:667
fen.extensions.provider_openai.openai_completions.build-url #
(build-url base-url) -> string
Normalize an OpenAI-compatible base URL into a Chat Completions endpoint while preserving fully-qualified legacy endpoints.
extensions/adapters/providers/openai/openai_completions.fnl:36
fen.extensions.provider_openai.openai_completions.convert-messages #
(convert-messages messages system-prompt compat) -> [WireMessage]
Convert canonical messages and optional system prompt into OpenAI Chat Completions wire messages, synthesizing errors for orphaned tool calls.
extensions/adapters/providers/openai/openai_completions.fnl:149
fen.extensions.provider_openai.openai_completions.convert-tools #
(convert-tools tools) -> [WireTool]
Convert canonical Tool descriptors into OpenAI Chat Completions function-tool declarations.
extensions/adapters/providers/openai/openai_completions.fnl:176
fen.extensions.provider_openai.openai_completions.map-stop-reason #
(map-stop-reason reason) -> StopReason, error-message|nil
Map OpenAI finish_reason values onto canonical StopReason values, returning error text for provider-side stops.
extensions/adapters/providers/openai/openai_completions.fnl:196
fen.extensions.provider_openai.openai_completions.parse-response #
(parse-response resp model) -> AssistantMessage
Parse a non-streaming OpenAI Chat Completions response into canonical assistant content, usage, tool calls, and stop reason.
extensions/adapters/providers/openai/openai_completions.fnl:243
fen.extensions.provider_openai.openai_completions.process-stream-chunk! #
(process-stream-chunk! state chunk emit) -> state
Fold one decoded streaming ChatCompletionChunk into stream state and emit text, thinking, and tool-call deltas.
extensions/adapters/providers/openai/openai_completions.fnl:490
fen.extensions.provider_openai.openai_completions.new-stream-state #
string
Default OpenAI v1 API root used when models.json or provider options do not override the base URL.
extensions/adapters/providers/openai/openai_completions.fnl:667
fen.extensions.provider_openai.openai_completions.finalize-stream-state #
(finalize-stream-state state emit) -> AssistantMessage
Close the streaming content block state, infer tool-use stops, emit the terminal event, and return the canonical assistant message.
extensions/adapters/providers/openai/openai_completions.fnl:548
fen.extensions.provider_openai.openai_completions.finalize-stream #
string
Default OpenAI v1 API root used when models.json or provider options do not override the base URL.
extensions/adapters/providers/openai/openai_completions.fnl:667
fen.extensions.provider_openai.openai_completions.build-body #
(build-body model context max-tokens compat options) -> table
Build the Chat Completions request body, applying models.json compat knobs for max-token fields, thinking formats, and parallel tools.
extensions/adapters/providers/openai/openai_completions.fnl:318
fen.extensions.provider_openai.openai_completions.complete #
(complete model context options ?on-event ?yield-fn) -> AssistantMessage
Execute one Chat Completions provider call, choosing streaming/non-streaming and cooperative/blocking transport from callbacks.
extensions/adapters/providers/openai/openai_completions.fnl:619
fen.extensions.provider_openai.openai_responses #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_responses.api #
string
Default OpenAI v1 API root used by the Responses adapter before appending /responses.
extensions/adapters/providers/openai/openai_responses.fnl:209
fen.extensions.provider_openai.openai_responses.provider #
string
Default OpenAI v1 API root used by the Responses adapter before appending /responses.
extensions/adapters/providers/openai/openai_responses.fnl:209
fen.extensions.provider_openai.openai_responses.default-base-url #
string
Default OpenAI v1 API root used by the Responses adapter before appending /responses.
extensions/adapters/providers/openai/openai_responses.fnl:209
fen.extensions.provider_openai.openai_responses.build-url #
(build-url base-url) -> string
Normalize an OpenAI base URL into the /responses endpoint while preserving already-qualified Responses URLs.
extensions/adapters/providers/openai/openai_responses.fnl:45
fen.extensions.provider_openai.openai_responses.build-body #
(build-body model context max-tokens options) -> table
Build a streaming Responses request body from canonical context, provider options, tools, reasoning settings, and prompt cache keys.
extensions/adapters/providers/openai/openai_responses.fnl:53
fen.extensions.provider_openai.openai_responses.build-request-opts #
(build-request-opts model context options on-chunk ?headers-override ?url-override) -> table
Assemble fen.util.http options for a streaming Responses POST, allowing Codex to override auth headers and endpoint URL.
extensions/adapters/providers/openai/openai_responses.fnl:134
fen.extensions.provider_openai.openai_responses.make-stream-pipeline #
(make-stream-pipeline model on-event event-mapper) -> state, parser, parser-error
Create the SSE parser and shared Responses stream reducer state for one streaming request, with optional Codex event mapping.
extensions/adapters/providers/openai/openai_responses.fnl:107
fen.extensions.provider_openai.openai_responses.finalize-stream #
(finalize-stream state parser parser-error model resp on-event) -> AssistantMessage
Finish the SSE parser, convert transport/parser/HTTP failures to assistant errors, or finalize shared Responses stream state.
extensions/adapters/providers/openai/openai_responses.fnl:161
fen.extensions.provider_openai.openai_responses.complete #
(complete model context options ?on-event ?yield-fn) -> AssistantMessage
Execute one OpenAI Responses provider call through the streaming SSE pipeline with optional cooperative transport and event forwarding.
extensions/adapters/providers/openai/openai_responses.fnl:172
fen.extensions.provider_openai.openai_responses_shared #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_responses_shared.build-url #
(build-url base-url responses-path) -> string
Normalize an OpenAI-compatible base URL into a Responses endpoint while preserving already-qualified URLs.
extensions/adapters/providers/openai/openai_responses_shared.fnl:960
fen.extensions.provider_openai.openai_responses_shared.build-body #
(build-body model context max-tokens options ?id) -> table
Build a streaming Responses request body from canonical context, provider options, tools, reasoning settings, and prompt cache keys.
extensions/adapters/providers/openai/openai_responses_shared.fnl:970
fen.extensions.provider_openai.openai_responses_shared.build-request-opts #
(build-request-opts model context options on-chunk ?headers-override ?url-override default-base-url responses-path ?id) -> table
Assemble fen.util.http options for a streaming OpenAI-compatible Responses POST.
extensions/adapters/providers/openai/openai_responses_shared.fnl:1052
fen.extensions.provider_openai.openai_responses_shared.make-stream-pipeline #
(make-stream-pipeline model on-event event-mapper) -> state, parser, parser-error
Create the SSE parser and shared Responses stream reducer state for one streaming request, with optional event mapping.
extensions/adapters/providers/openai/openai_responses_shared.fnl:1021
fen.extensions.provider_openai.openai_responses_shared.finalize-stream #
(finalize-stream state parser parser-error api provider model resp on-event) -> AssistantMessage
Finish a Responses SSE stream, preserving the calling provider's canonical API/provider identity.
extensions/adapters/providers/openai/openai_responses_shared.fnl:1077
fen.extensions.provider_openai.openai_responses_shared.convert-messages #
(convert-messages messages ?id) -> [ResponseInputItem]
Convert canonical transcript messages into Responses input items, repairing persisted shapes that would otherwise 4xx forever (cross-model/cross-backend fc_/rs_ ids, lone reasoning items, orphaned tool outputs, reasoning-less tool-call turns).
extensions/adapters/providers/openai/openai_responses_shared.fnl:395
fen.extensions.provider_openai.openai_responses_shared.convert-tools #
(convert-tools tools) -> [ResponseTool]
Convert canonical Tool descriptors into Responses function-tool declarations with strict set to JSON null.
extensions/adapters/providers/openai/openai_responses_shared.fnl:487
fen.extensions.provider_openai.openai_responses_shared.map-stop-reason #
(map-stop-reason status) -> StopReason, error-message|nil
Map Responses API response statuses onto canonical StopReason values and provider error messages.
extensions/adapters/providers/openai/openai_responses_shared.fnl:509
fen.extensions.provider_openai.openai_responses_shared.new-stream-state #
(new-stream-state model) -> table
Initialize the mutable reducer state used while folding Responses SSE events into canonical assistant content.
extensions/adapters/providers/openai/openai_responses_shared.fnl:552
fen.extensions.provider_openai.openai_responses_shared.process-event! #
(process-event! state event emit) -> nil
Dispatch one decoded Responses SSE event into reducer state, updating content, usage, errors, and delta callbacks.
extensions/adapters/providers/openai/openai_responses_shared.fnl:860
fen.extensions.provider_openai.openai_responses_shared.finalize-stream-state #
(finalize-stream-state state api provider emit) -> AssistantMessage
Finalize Responses reducer state into a canonical assistant message and emit the terminal done/error event.
extensions/adapters/providers/openai/openai_responses_shared.fnl:926
fen.extensions.provider_openai.openai_responses_shared.finish-current-block! #
(finish-current-block! state emit) -> nil
Close the active text/thinking/tool-call block, emit the matching end event, and clear current item pointers.
extensions/adapters/providers/openai/openai_responses_shared.fnl:578
fen.extensions.provider_openai.openai_responses_shared.write-failure-diagnostic! #
extensions/adapters/providers/openai/openai_responses_shared.fnl:1154
fen.extensions.provider_openai.openai_responses_shared.failure-diagnostic #
extensions/adapters/providers/openai/openai_responses_shared.fnl:1154
fen.extensions.provider_openai.openai_responses_shared.attach-diagnostic! #
extensions/adapters/providers/openai/openai_responses_shared.fnl:1154
fen.extensions.provider_openai.openai_responses_shared.redact-headers #
extensions/adapters/providers/openai/openai_responses_shared.fnl:1154
fen.extensions.provider_openai.openai_responses_shared.summarize-body #
extensions/adapters/providers/openai/openai_responses_shared.fnl:1154
fen.extensions.provider_openai.openai_responses_shared.clamp-reasoning-effort #
(clamp-reasoning-effort model effort) -> keyword
Apply Codex/OpenAI per-model reasoning-effort limits so request bodies avoid unsupported effort values.
extensions/adapters/providers/openai/openai_responses_shared.fnl:1134
fen.extensions.provider_openai.openai_responses_shared.split-compound-id #
(split-compound-id id) -> call-id, item-id|nil
Split Fen's compound Responses tool-call id into call_id and item_id components for wire conversion.
extensions/adapters/providers/openai/openai_responses_shared.fnl:285
fen.extensions.provider_openai.openai_responses_shared.parse-streaming-json #
(parse-streaming-json s) -> table
Best-effort JSON parser for in-flight streamed tool arguments, returning an empty table until complete JSON is available.
extensions/adapters/providers/openai/openai_responses_shared.fnl:539
fen.extensions.queue #
Module neighborhood graph: DOT · SVG
fen.extensions.queue.register #
[api]
extensions/behaviors/inspectors/queue/init.fnl:7
fen.extensions.queue.commands.queue #
Module neighborhood graph: DOT · SVG
fen.extensions.queue.commands.queue.register #
(register api) -> nil
Register queue management commands and the queue panel for pending steering/follow-up lines.
extensions/behaviors/inspectors/queue/commands/queue.fnl:142
fen.extensions.queue.state.queue #
Module neighborhood graph: DOT · SVG
fen.extensions.queue.state.queue.visible? #
boolean
Visibility flag for the persistent /queue panel showing queued steering and follow-up input.
extensions/behaviors/inspectors/queue/state/queue.fnl:3
fen.extensions.queue.state.queue.cached-rows #
[PresenterRow]|nil
Cached rendered /queue panel rows reused while queue state and terminal width remain stable.
extensions/behaviors/inspectors/queue/state/queue.fnl:9
fen.extensions.queue.state.queue.cached-at #
number
Timestamp for the /queue panel cache, supporting throttled refreshes during frequent repaints.
extensions/behaviors/inspectors/queue/state/queue.fnl:15
fen.extensions.queue.state.queue.cached-w #
number
Terminal width associated with cached /queue rows so resize events rebuild wrapped queue entries.
extensions/behaviors/inspectors/queue/state/queue.fnl:21
fen.extensions.queue.util #
Module neighborhood graph: DOT · SVG
fen.extensions.queue.util.approx-tokens #
(approx-tokens s) -> number
Estimate token count from text length for status displays when provider-reported usage is unavailable.
extensions/behaviors/inspectors/queue/util.fnl:7
fen.extensions.queue.util.safe-json #
(safe-json v) -> string
JSON-encode a value for token estimation, falling back to tostring when encoding fails.
extensions/behaviors/inspectors/queue/util.fnl:19
fen.extensions.queue.util.content-tokens #
(content-tokens content) -> number
Estimate tokens for canonical message content, including text, thinking blocks, and tool-call names/arguments.
extensions/behaviors/inspectors/queue/util.fnl:28
fen.extensions.queue.util.estimated-context-tokens #
(estimated-context-tokens agent) -> number
Estimate the current agent context size from system prompt, messages, content blocks, and tool-result names.
extensions/behaviors/inspectors/queue/util.fnl:51
fen.extensions.queue.util.usage-totals #
(usage-totals messages) -> Usage
Sum provider usage counters across assistant messages for status and session diagnostics.
extensions/behaviors/inspectors/queue/util.fnl:64
fen.extensions.queue.util.fmt-tokens #
(fmt-tokens n) -> string
Format a token count compactly with raw, k, or M suffixes for slash-command status output.
extensions/behaviors/inspectors/queue/util.fnl:83
fen.extensions.queue.util.format-token-summary #
(format-token-summary usage approx) -> string
Build the one-line input/output/cache/context token summary shown by /status.
extensions/behaviors/inspectors/queue/util.fnl:96
fen.extensions.queue.util.runtime-version #
(runtime-version) -> string
Return the build-stamped fen version, or unknown when running from source/tests without dist metadata.
extensions/behaviors/inspectors/queue/util.fnl:109
fen.extensions.queue.util.nth-arg #
(nth-arg args n) -> string|nil
Extract the nth whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/queue/util.fnl:120
fen.extensions.queue.util.first-arg #
(first-arg args) -> string|nil
Extract the first whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/queue/util.fnl:129
fen.extensions.session_jsonl #
Module neighborhood graph: DOT · SVG
fen.extensions.session_jsonl.register #
[api]
extensions/adapters/session-backends/jsonl/init.fnl:7
fen.extensions.session_jsonl.session #
Module neighborhood graph: DOT · SVG
fen.extensions.session_jsonl.session.open #
(open cwd) -> Session
Allocate a future append-only JSONL session path for cwd without creating the file until the first appended message.
extensions/adapters/session-backends/jsonl/session.fnl:196
fen.extensions.session_jsonl.session.open-existing #
(open-existing p) -> Session|nil
Open an existing session JSONL for append without writing a duplicate header, preserving header id and cwd.
extensions/adapters/session-backends/jsonl/session.fnl:461
fen.extensions.session_jsonl.session.append #
(append session msg) -> nil
Lazily open the session file if needed and append one canonical AgentMessage as a JSONL :message entry.
extensions/adapters/session-backends/jsonl/session.fnl:262
fen.extensions.session_jsonl.session.append-entry #
(append-entry session entry) -> entry|nil
Lazily open the session file and append one JSONL entry with stable id, parent-id, and timestamp metadata.
extensions/adapters/session-backends/jsonl/session.fnl:236
fen.extensions.session_jsonl.session.close #
(close session) -> nil
Close an open session file handle and clear it from the mutable session record.
extensions/adapters/session-backends/jsonl/session.fnl:283
fen.extensions.session_jsonl.session.latest-for-cwd #
(latest-for-cwd cwd) -> string|nil
Return the newest non-empty session JSONL path for cwd by scanning the cwd session directory newest first.
extensions/adapters/session-backends/jsonl/session.fnl:374
fen.extensions.session_jsonl.session.list-for-cwd #
(list-for-cwd cwd limit) -> [SessionInfo]
Return recent non-empty session metadata records for cwd in reverse chronological order, capped by limit.
extensions/adapters/session-backends/jsonl/session.fnl:444
fen.extensions.session_jsonl.session.header #
(header p) -> table|nil
Read and decode the first JSONL header entry from a session file, returning nil for unreadable or non-session headers.
extensions/adapters/session-backends/jsonl/session.fnl:391
fen.extensions.session_jsonl.session.title #
(title p) -> string|nil
Return a human-readable transcript title from the first user text, falling back to the first assistant text.
extensions/adapters/session-backends/jsonl/session.fnl:416
fen.extensions.session_jsonl.session.message-count #
(message-count p) -> number
Count valid :message entries in a session JSONL file while skipping the header and malformed lines.
extensions/adapters/session-backends/jsonl/session.fnl:366
fen.extensions.session_jsonl.session.find #
(find cwd target) -> string|nil
Resolve a resume target as latest, list index, existing path, exact id, or unique id/path prefix within cwd sessions.
extensions/adapters/session-backends/jsonl/session.fnl:474
fen.extensions.session_jsonl.session.load #
(load path) -> [Message]
Read a session JSONL file and return replayable canonical messages, applying the latest valid compaction entry when present.
extensions/adapters/session-backends/jsonl/session.fnl:537
fen.extensions.session_jsonl.session.sessions-root #
(sessions-root cwd) -> string
Return the state-directory path containing JSONL sessions for a specific cwd.
extensions/adapters/session-backends/jsonl/session.fnl:50
fen.extensions.session_jsonl.session.cwd-slug #
(cwd-slug cwd) -> string
Convert a cwd into the pi-mono-style session directory slug used under the fen sessions root.
extensions/adapters/session-backends/jsonl/session.fnl:37
fen.extensions.session_jsonl.session.VERSION #
number
Current JSONL session format version written into new session headers.
extensions/adapters/session-backends/jsonl/session.fnl:562
fen.extensions.session_jsonl.state #
Module neighborhood graph: DOT · SVG
fen.extensions.session_jsonl.state.record-cache #
extensions/adapters/session-backends/jsonl/state.fnl:7
fen.extensions.sessions #
Module neighborhood graph: DOT · SVG
fen.extensions.sessions.register #
[api]
extensions/behaviors/actions/sessions/init.fnl:7
fen.extensions.sessions.commands.session #
Module neighborhood graph: DOT · SVG
fen.extensions.sessions.commands.session.register #
(register api) -> nil
Register conversation/session lifecycle commands including /new, /reload, /sessions, and /resume aliases.
extensions/behaviors/actions/sessions/commands/session.fnl:312
fen.extensions.skills #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.dir-exists? #
function
Filesystem helper alias used by tests to stub directory existence during skill discovery.
extensions/behaviors/companions/skills/init.fnl:55
fen.extensions.skills.file-exists? #
function
Filesystem helper alias used by tests to stub skill file existence checks.
extensions/behaviors/companions/skills/init.fnl:62
fen.extensions.skills.realpath #
function
Filesystem helper alias used to canonicalize skill paths for deduplication and tests.
extensions/behaviors/companions/skills/init.fnl:69
fen.extensions.skills.parse-frontmatter #
(parse-frontmatter path) -> SkillMeta|nil
Parse a skill file's YAML frontmatter into invokable metadata using the path-derived fallback name.
extensions/behaviors/companions/skills/init.fnl:213
fen.extensions.skills.discover #
(discover extra-paths?) -> [Skill]
Scan default and explicit skill roots, respecting ignore files and deduplicating by canonical path and name.
extensions/behaviors/companions/skills/init.fnl:341
fen.extensions.skills.system-prompt-section #
(system-prompt-section skills) -> string|nil
Render discovered model-invokable skills as the XML prompt fragment consumed by the default prompt.
extensions/behaviors/companions/skills/init.fnl:361
fen.extensions.skills.user-skills-dir #
(user-skills-dir) -> string
Return fen's user-level skills directory under the XDG configuration root.
extensions/behaviors/companions/skills/init.fnl:389
fen.extensions.skills.project-skills-dir #
(project-skills-dir) -> string
Return fen's project-local skills directory path relative to the current workspace.
extensions/behaviors/companions/skills/init.fnl:396
fen.extensions.skills.bundled-skills-dir #
(bundled-skills-dir) -> string
Return the XDG data directory where fen materializes built-in skills.
extensions/behaviors/companions/skills/init.fnl:402
fen.extensions.skills._discover-from-roots #
function
Test helper alias for scanning an explicit root list without loading default skill roots.
extensions/behaviors/companions/skills/init.fnl:408
fen.extensions.skills._default-roots #
function
Test helper alias returning the ordered default user, project, and compatibility skill roots.
extensions/behaviors/companions/skills/init.fnl:415
fen.extensions.skills._ancestors #
function
Test helper alias for the project-ancestor walker used when building default skill roots.
extensions/behaviors/companions/skills/init.fnl:422
fen.extensions.skills.skills-text #
[skills ?filter]
extensions/behaviors/companions/skills/init.fnl:476
fen.extensions.skills.skill-detail-lines #
[skill]
extensions/behaviors/companions/skills/init.fnl:536
fen.extensions.skills.register #
function
Registration entrypoint alias for installing the available-skills prompt fragment.
extensions/behaviors/companions/skills/init.fnl:756
fen.extensions.skills.register! #
function
Registration entrypoint alias for installing the available-skills prompt fragment.
extensions/behaviors/companions/skills/init.fnl:756
fen.extensions.skills.bundled #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.bundled.skills #
[]
extensions/behaviors/companions/skills/bundled.fnl:64
fen.extensions.skills.ignore #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.ignore.with-dir #
(with-dir rules dir) -> [IgnoreRule]
Return a copied ignore-rule chain extended with .gitignore, .ignore, and .fdignore files from one directory.
extensions/behaviors/companions/skills/ignore.fnl:75
fen.extensions.skills.ignore.load-chain #
(load-chain root) -> [IgnoreRule]
Collect ignore rules from ancestor directories root-to-leaf for skill discovery traversal.
extensions/behaviors/companions/skills/ignore.fnl:86
fen.extensions.skills.ignore.match? #
(match? target is-dir? rules) -> boolean
Decide whether a path is ignored by the rule chain, with later negated or matching rules taking precedence.
extensions/behaviors/companions/skills/ignore.fnl:151
fen.extensions.skills.state #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.state.visible? #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.selected-name #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.cached-rows #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.cached-at #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.cached-w #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.cached-selected-name #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.discover-cache-key #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.discover-cache #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.skills.state.discover-cache-at #
extensions/behaviors/companions/skills/state.fnl:3
fen.extensions.status #
Module neighborhood graph: DOT · SVG
fen.extensions.status.register #
[api]
extensions/behaviors/inspectors/status/init.fnl:7
fen.extensions.status.commands.status #
Module neighborhood graph: DOT · SVG
fen.extensions.status.commands.status.register #
(register api) -> nil
Register the /status command and status panel for runtime, model, session, token, and extension diagnostics.
extensions/behaviors/inspectors/status/commands/status.fnl:151
fen.extensions.status.state.status #
Module neighborhood graph: DOT · SVG
fen.extensions.status.state.status.visible? #
boolean
Visibility flag for the persistent /status panel showing runtime, model, session, and context details.
extensions/behaviors/inspectors/status/state/status.fnl:3
fen.extensions.status.state.status.cached-rows #
[PresenterRow]|nil
Cached rendered /status panel rows reused while status inputs and terminal width remain stable.
extensions/behaviors/inspectors/status/state/status.fnl:9
fen.extensions.status.state.status.cached-at #
number
Timestamp for the /status panel cache, used to throttle recomputation of derived runtime details.
extensions/behaviors/inspectors/status/state/status.fnl:15
fen.extensions.status.state.status.cached-w #
number
Terminal width associated with cached /status rows so resize events rebuild aligned panel text.
extensions/behaviors/inspectors/status/state/status.fnl:21
fen.extensions.status.util #
Module neighborhood graph: DOT · SVG
fen.extensions.status.util.approx-tokens #
(approx-tokens s) -> number
Estimate token count from text length for status displays when provider-reported usage is unavailable.
extensions/behaviors/inspectors/status/util.fnl:7
fen.extensions.status.util.safe-json #
(safe-json v) -> string
JSON-encode a value for token estimation, falling back to tostring when encoding fails.
extensions/behaviors/inspectors/status/util.fnl:19
fen.extensions.status.util.content-tokens #
(content-tokens content) -> number
Estimate tokens for canonical message content, including text, thinking blocks, and tool-call names/arguments.
extensions/behaviors/inspectors/status/util.fnl:28
fen.extensions.status.util.estimated-context-tokens #
(estimated-context-tokens agent) -> number
Estimate the current agent context size from system prompt, messages, content blocks, and tool-result names.
extensions/behaviors/inspectors/status/util.fnl:51
fen.extensions.status.util.usage-totals #
(usage-totals messages) -> Usage
Sum provider usage counters across assistant messages for status and session diagnostics.
extensions/behaviors/inspectors/status/util.fnl:64
fen.extensions.status.util.fmt-tokens #
(fmt-tokens n) -> string
Format a token count compactly with raw, k, or M suffixes for slash-command status output.
extensions/behaviors/inspectors/status/util.fnl:83
fen.extensions.status.util.format-token-summary #
(format-token-summary usage approx) -> string
Build the one-line input/output/cache/context token summary shown by /status.
extensions/behaviors/inspectors/status/util.fnl:96
fen.extensions.status.util.runtime-version #
(runtime-version) -> string
Return the build-stamped fen version, or unknown when running from source/tests without dist metadata.
extensions/behaviors/inspectors/status/util.fnl:109
fen.extensions.status.util.nth-arg #
(nth-arg args n) -> string|nil
Extract the nth whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/status/util.fnl:129
fen.extensions.status.util.first-arg #
(first-arg args) -> string|nil
Extract the first whitespace-delimited argument from a slash-command argument string.
extensions/behaviors/inspectors/status/util.fnl:138
fen.extensions.stdio #
Module neighborhood graph: DOT · SVG
fen.extensions.stdio.render-event #
(render-event ev) -> nil
Render one event to stdio with prefixes, optional ANSI color, streaming delta coalescing, and stderr errors.
extensions/adapters/presenters/stdio/init.fnl:114
fen.extensions.stdio.stdin-tty? #
(stdin-tty?) -> boolean
Return whether stdin is an interactive terminal for prompt-prefix and line-mode behavior.
extensions/adapters/presenters/stdio/init.fnl:153
fen.extensions.stdio.drain-turn #
(drain-turn ctx) -> nil
Drive cooperative on-tick callbacks until the active agent turn completes in stdio mode.
extensions/adapters/presenters/stdio/init.fnl:168
fen.extensions.stdio.submit-line #
(submit-line ctx line interactive?) -> nil
Echo and submit one user line, then drain the resulting turn or emit a submit error.
extensions/adapters/presenters/stdio/init.fnl:183
fen.extensions.stdio.run #
(run ctx) -> nil
Run the line-oriented stdio presenter loop until EOF, prompting interactively when stdin is a TTY.
extensions/adapters/presenters/stdio/init.fnl:197
fen.extensions.stdio.notify #
(notify text opts?) -> nil
Implement the stdio UI notify hook by printing an informational line.
extensions/adapters/presenters/stdio/init.fnl:216
fen.extensions.stdio.prompt #
(prompt opts) -> string|nil
Implement the stdio UI prompt hook by printing a label and reading one line from stdin.
extensions/adapters/presenters/stdio/init.fnl:224
fen.extensions.stdio.select #
(select opts) -> Choice|nil
Implement the stdio UI select hook by listing choices and returning the numbered selection.
extensions/adapters/presenters/stdio/init.fnl:235
fen.extensions.stdio.register #
[api]
extensions/adapters/presenters/stdio/init.fnl:261
fen.extensions.todo #
Module neighborhood graph: DOT · SVG
fen.extensions.todo.register #
extensions/behaviors/companions/todo/init.fnl:341
fen.extensions.todo.register! #
extensions/behaviors/companions/todo/init.fnl:342
fen.extensions.todo.execute #
extensions/behaviors/companions/todo/init.fnl:343
fen.extensions.todo.validate-items #
extensions/behaviors/companions/todo/init.fnl:344
fen.extensions.todo.copy-items #
extensions/behaviors/companions/todo/init.fnl:345
fen.extensions.todo.counts #
extensions/behaviors/companions/todo/init.fnl:346
fen.extensions.todo.summary-line #
extensions/behaviors/companions/todo/init.fnl:347
fen.extensions.todo.render-text #
extensions/behaviors/companions/todo/init.fnl:348
fen.extensions.todo.panel-spec #
extensions/behaviors/companions/todo/init.fnl:349
fen.extensions.todo.rebuild-from-messages! #
extensions/behaviors/companions/todo/init.fnl:350
fen.extensions.todo._state #
extensions/behaviors/companions/todo/init.fnl:351
fen.extensions.todo._test #
extensions/behaviors/companions/todo/init.fnl:352
fen.extensions.todo.state #
Module neighborhood graph: DOT · SVG
fen.extensions.todo.state.items #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.version #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.visible? #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.cached-rows #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.cached-w #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.cached-version #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.todo.state.last-updated #
extensions/behaviors/companions/todo/state.fnl:3
fen.extensions.tui #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.init! #
(init!) -> nil
Initialize or refresh termbox runtime state, terminal modes, dimensions, and bracketed paste support.
extensions/adapters/presenters/tui/init.fnl:92
fen.extensions.tui.shutdown #
(shutdown) -> nil
Tear down termbox and bracketed paste mode when the TUI presenter exits.
extensions/adapters/presenters/tui/init.fnl:142
fen.extensions.tui.hard-refresh! #
(hard-refresh!) -> nil
Recover from external terminal corruption by re-asserting terminal modes and forcing a full repaint.
extensions/adapters/presenters/tui/init.fnl:158
fen.extensions.tui.suspend! #
(suspend!) -> nil
Ctrl-Z job-control suspend: restore the terminal, stop with SIGTSTP, then re-init and repaint on resume.
extensions/adapters/presenters/tui/init.fnl:172
fen.extensions.tui.reset-conversation! #
(reset-conversation!) -> nil
Clear transcript, streaming, input, paste, scroll, and per-turn status state while preserving UI identity.
extensions/adapters/presenters/tui/init.fnl:189
fen.extensions.tui.set-status-info #
(set-status-info info) -> nil
Merge provider, model, queue, and context details into the persistent TUI status line state.
extensions/adapters/presenters/tui/init.fnl:237
fen.extensions.tui.input-meta #
[?ev]
extensions/adapters/presenters/tui/init.fnl:291
fen.extensions.tui.warn-if-stalled! #
[phase start-ms ?get-turn ?ev]
extensions/adapters/presenters/tui/init.fnl:306
fen.extensions.tui.peek-timeout-ms #
(peek-timeout-ms is-busy?) -> number
Choose a short or idle termbox poll timeout based on dirty state, Alt resolution, busy work, and animation needs.
extensions/adapters/presenters/tui/init.fnl:333
fen.extensions.tui.interrupted-syscall? #
(interrupted-syscall? err) -> boolean
True when a peek_event error string is a transient signal-interrupted syscall (EINTR), which must not be treated as session-fatal.
extensions/adapters/presenters/tui/init.fnl:350
fen.extensions.tui.run #
(run on-submit on-tick on-cancel is-busy? ?get-turn) -> nil
Run the TUI presenter loop, repainting, polling termbox events, ticking cooperative work, and dispatching input. ?get-turn optionally returns the in-flight agent coroutine for richer stall diagnostics.
extensions/adapters/presenters/tui/init.fnl:374
fen.extensions.tui.register #
[api]
extensions/adapters/presenters/tui/init.fnl:455
fen.extensions.tui.draw #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.draw.in-bounds? #
(in-bounds? x y) -> boolean
Return whether a zero-based terminal coordinate is inside the current termbox dimensions.
extensions/adapters/presenters/tui/draw.fnl:14
fen.extensions.tui.draw.fill-row #
(fill-row y x0 x1 ch fg bg) -> nil
Fill a clipped horizontal row segment with one termbox print call to reduce Lua-to-C overhead.
extensions/adapters/presenters/tui/draw.fnl:23
fen.extensions.tui.draw.utf8-prefix-cols #
(utf8-prefix-cols s cols) -> string
Return a display-column-limited UTF-8 prefix without cutting multibyte characters in the middle.
extensions/adapters/presenters/tui/draw.fnl:39
fen.extensions.tui.draw.put-clipped #
(put-clipped x y fg bg s width-cap) -> nil
Print clipped text at an in-bounds coordinate while respecting both terminal width and caller cap.
extensions/adapters/presenters/tui/draw.fnl:74
fen.extensions.tui.ingest #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.ingest.append-event #
(append-event ev) -> nil
Ingest a bus event into transcript rows and TUI status side effects, including streaming coalescing and cache invalidation.
extensions/adapters/presenters/tui/ingest.fnl:84
fen.extensions.tui.input #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.input.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent input buffer, paste, history, quit, cancel, and Alt state fields after hot reloads.
extensions/adapters/presenters/tui/input.fnl:36
fen.extensions.tui.input.input-display-rows #
(input-display-rows buf width cursor) -> [InputDisplayRow]
Wrap the input buffer into prompt and continuation rows that preserve byte offsets for cursor placement.
extensions/adapters/presenters/tui/input.fnl:58
fen.extensions.tui.input.cursor-display-pos #
(cursor-display-pos rows cursor) -> row-index col
Locate the cursor within wrapped input rows using the same byte-offset view that painting uses.
extensions/adapters/presenters/tui/input.fnl:115
fen.extensions.tui.input.input-rows #
(input-rows) -> number
Return the current input region height, capped for multiline editing and terminal layout stability.
extensions/adapters/presenters/tui/input.fnl:130
fen.extensions.tui.input.paint-input #
(paint-input layout) -> nil
Paint the visible wrapped input rows and place or hide the terminal cursor within the input region.
extensions/adapters/presenters/tui/input.fnl:143
fen.extensions.tui.input.handle-key #
(handle-key ev on-submit on-cancel is-busy?) -> boolean|nil
Dispatch a termbox key event into buffer edits, history movement, submission, cancellation, or quit handling.
extensions/adapters/presenters/tui/input.fnl:525
fen.extensions.tui.input.handle-mouse #
(handle-mouse ev) -> nil
Interpret mouse wheel and click events for transcript scrolling, panel focus, and redraw invalidation.
extensions/adapters/presenters/tui/input.fnl:713
fen.extensions.tui.input.handle-event #
(handle-event ev on-submit on-cancel is-busy?) -> boolean|nil
Route termbox keyboard, mouse, resize, paste, and Alt-synthesized events through the TUI input layer.
extensions/adapters/presenters/tui/input.fnl:730
fen.extensions.tui.markdown #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.markdown.parse #
(parse s) -> [MarkdownBlock]
Parse Markdown source into the lightweight block records understood by the TUI renderer.
extensions/adapters/presenters/tui/markdown.fnl:574
fen.extensions.tui.markdown.parse-inline #
(parse-inline s attr?) -> [Segment]
Parse simple inline Markdown spans into styled text segments for termbox painting.
extensions/adapters/presenters/tui/markdown.fnl:581
fen.extensions.tui.markdown.render-block #
(render-block block width) -> [PresenterRow]
Render one parsed Markdown block into wrapped TUI rows for the requested width.
extensions/adapters/presenters/tui/markdown.fnl:588
fen.extensions.tui.markdown.render-text #
(render-text s width) -> [PresenterRow]
Parse and render Markdown text into styled TUI rows while preserving readable chat line breaks.
extensions/adapters/presenters/tui/markdown.fnl:595
fen.extensions.tui.markdown.render #
(render s width) -> [PresenterRow]
Compatibility alias for render-text used by transcript rendering and tests.
extensions/adapters/presenters/tui/markdown.fnl:602
fen.extensions.tui.markdown.display-len #
(display-len s) -> number
Approximate display width by counting UTF-8 codepoints as terminal cells.
extensions/adapters/presenters/tui/markdown.fnl:609
fen.extensions.tui.paint #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.paint.ensure-state-defaults! #
(ensure-state-defaults!) -> nil
Backfill persistent paint, transcript, status, errors, spinner, and input defaults after reloads.
extensions/adapters/presenters/tui/paint.fnl:46
fen.extensions.tui.paint.max-scroll #
(max-scroll) -> number
Return the maximum transcript scroll offset after accounting for the current input area height.
extensions/adapters/presenters/tui/paint.fnl:60
fen.extensions.tui.paint.layout #
(layout) -> Layout
Compute status, transcript, input, and registered panel slots for the current terminal dimensions.
extensions/adapters/presenters/tui/paint.fnl:126
fen.extensions.tui.paint.fmt-tokens #
function
Compact token-count formatter alias used by status renderers and tests.
extensions/adapters/presenters/tui/paint.fnl:177
fen.extensions.tui.paint.paint-status #
(paint-status layout) -> nil
Delegate status-line painting to the status panel module while preserving the paint facade entrypoint.
extensions/adapters/presenters/tui/paint.fnl:186
fen.extensions.tui.paint.paint-panels #
(paint-panels layout) -> nil
Render registered above-input and below-status panels with per-panel error isolation.
extensions/adapters/presenters/tui/paint.fnl:247
fen.extensions.tui.paint.paint-transcript #
(paint-transcript layout) -> nil
Paint the visible transcript viewport rows into the reserved transcript region.
extensions/adapters/presenters/tui/paint.fnl:263
fen.extensions.tui.paint.paint-input #
(paint-input layout) -> nil
Delegate to the input renderer for the reserved input region.
extensions/adapters/presenters/tui/paint.fnl:280
fen.extensions.tui.paint.invalidate! #
(invalidate!) -> nil
Mark the TUI dirty so the next presenter-loop pass repaints the terminal.
extensions/adapters/presenters/tui/paint.fnl:290
fen.extensions.tui.paint.invalidate-full! #
(invalidate-full!) -> nil
Request a cache-clearing repaint for resize, reload, and display toggles that invalidate wrapped rows.
extensions/adapters/presenters/tui/paint.fnl:299
fen.extensions.tui.paint.busy? #
(busy?) -> boolean|string|nil
Report whether thinking or tool-running status should keep the busy animation active.
extensions/adapters/presenters/tui/paint.fnl:309
fen.extensions.tui.paint.advance-spinner-if-due! #
(advance-spinner-if-due!) -> nil
Advance the status spinner on a throttled presenter-loop tick cadence and invalidate when it changes.
extensions/adapters/presenters/tui/paint.fnl:318
fen.extensions.tui.paint.redraw-if-needed! #
(redraw-if-needed!) -> nil
Repaint only when dirty or forced, clearing caches and terminal geometry before forced redraws.
extensions/adapters/presenters/tui/paint.fnl:337
fen.extensions.tui.paint.paint-frame! #
(paint-frame!) -> nil
Paint a complete frame into the termbox back buffer without presenting, allowing overlays to share the underlay.
extensions/adapters/presenters/tui/paint.fnl:358
fen.extensions.tui.paint.redraw! #
(redraw!) -> nil
Paint a complete TUI frame and present termbox's back buffer to the terminal.
extensions/adapters/presenters/tui/paint.fnl:380
fen.extensions.tui.paint.clear-render-caches! #
(clear-render-caches!) -> nil
Drop transcript render caches so forced repaints or reloads recompute rows with current renderers.
extensions/adapters/presenters/tui/paint.fnl:390
fen.extensions.tui.paint.force-redraw! #
(force-redraw!) -> nil
Blank-present and repaint the full terminal to resynchronize termbox front-buffer assumptions.
extensions/adapters/presenters/tui/paint.fnl:401
fen.extensions.tui.panels.busy #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.busy.spin-char #
(spin-char) -> string
Return the current busy indicator glyph, respecting the animation toggle and spinner frame counter.
extensions/adapters/presenters/tui/panels/busy.fnl:15
fen.extensions.tui.panels.busy.turn-elapsed #
(turn-elapsed) -> string
Return elapsed turn time text for the busy panel, or an empty string when no turn is active.
extensions/adapters/presenters/tui/panels/busy.fnl:28
fen.extensions.tui.panels.busy.height #
(height ctx) -> number
Reserve one above-input row only while thinking, retrying, or running a tool.
extensions/adapters/presenters/tui/panels/busy.fnl:58
fen.extensions.tui.panels.busy.render #
(render ctx) -> [PresenterRow]
Render spinner, busy label, retry delay, and elapsed time rows for the active turn.
extensions/adapters/presenters/tui/panels/busy.fnl:66
fen.extensions.tui.panels.busy.spec #
(spec) -> PanelSpec
Return the built-in busy panel contribution that appears above the input while work is active.
extensions/adapters/presenters/tui/panels/busy.fnl:79
fen.extensions.tui.panels.errors #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.errors.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent error-panel visibility state on live TUI state tables after reloads.
extensions/adapters/presenters/tui/panels/errors.fnl:15
fen.extensions.tui.panels.errors.toggle! #
(toggle! value?) -> boolean
Toggle or set the TUI error panel visibility and return the new visible state.
extensions/adapters/presenters/tui/panels/errors.fnl:63
fen.extensions.tui.panels.errors.visible? #
(visible?) -> boolean
Report whether the recent-errors panel should currently reserve below-status space.
extensions/adapters/presenters/tui/panels/errors.fnl:74
fen.extensions.tui.panels.errors.clear-transcript-errors! #
(clear-transcript-errors!) -> nil
Remove error and extension-error events from the transcript and invalidate transcript layout cache.
extensions/adapters/presenters/tui/panels/errors.fnl:108
fen.extensions.tui.panels.errors.spec #
(spec) -> PanelSpec
Return the error introspection panel contribution for below-status rendering.
extensions/adapters/presenters/tui/panels/errors.fnl:121
fen.extensions.tui.panels.status #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.status.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent status-info fields, token counters, retry state, queue counts, and running-label migration.
extensions/adapters/presenters/tui/panels/status.fnl:28
fen.extensions.tui.panels.status.paint #
(paint layout) -> nil
Paint the top status row by composing registered left and right status items with error isolation.
extensions/adapters/presenters/tui/panels/status.fnl:98
fen.extensions.tui.panels.transcript #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.transcript.TOOL-RESULT-PREVIEW-BYTES #
number
Maximum inline bytes from a tool result shown in collapsed transcript previews.
extensions/adapters/presenters/tui/panels/transcript.fnl:19
fen.extensions.tui.panels.transcript.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent transcript, streaming, scroll, Markdown, and tool-result display state after reloads.
extensions/adapters/presenters/tui/panels/transcript.fnl:26
fen.extensions.tui.panels.transcript.args- #
(args->string args) -> string
Convert tool-call arguments to compact JSON text for transcript fallback rendering.
extensions/adapters/presenters/tui/panels/transcript.fnl:57
fen.extensions.tui.panels.transcript.content- #
(content->text content) -> string
Concatenate text blocks from an AgentToolResult content list for tool-result previews.
extensions/adapters/presenters/tui/panels/transcript.fnl:68
fen.extensions.tui.panels.transcript.truncate #
(truncate s n) -> string
Return text capped to n bytes with a visible truncation marker for tool-result previews.
extensions/adapters/presenters/tui/panels/transcript.fnl:82
fen.extensions.tui.panels.transcript.count-lines #
(count-lines s) -> number
Count displayable newline-delimited lines for transcript summaries and tool-result metadata.
extensions/adapters/presenters/tui/panels/transcript.fnl:91
fen.extensions.tui.panels.transcript.lookup-tool-call #
(lookup-tool-call tool-call-id) -> table|nil
Find the matching prior tool-call event for a tool result by scanning the transcript tail.
extensions/adapters/presenters/tui/panels/transcript.fnl:140
fen.extensions.tui.panels.transcript.split-lines #
function
Line-splitting helper alias exported for input wrapping and transcript-rendering tests.
extensions/adapters/presenters/tui/panels/transcript.fnl:177
fen.extensions.tui.panels.transcript.tool-call-short #
(tool-call-short name args) -> string|nil
Format concise built-in tool call labels for the transcript and busy status row.
extensions/adapters/presenters/tui/panels/transcript.fnl:235
fen.extensions.tui.panels.transcript.event-text #
(event-text ev) -> string
Materialize streaming text chunks lazily and return the event's display text.
extensions/adapters/presenters/tui/panels/transcript.fnl:283
fen.extensions.tui.panels.transcript.invalidate-layout-cache! #
(invalidate-layout-cache!) -> nil
Drop the transcript-wide row-count cache after event changes or rendering toggles.
extensions/adapters/presenters/tui/panels/transcript.fnl:481
fen.extensions.tui.panels.transcript.clear-event-render-cache! #
(clear-event-render-cache! ev) -> nil
Clear one event's Markdown and wrapped-row caches and invalidate transcript layout.
extensions/adapters/presenters/tui/panels/transcript.fnl:491
fen.extensions.tui.panels.transcript.lines-for-event #
function
Cached event-to-row renderer alias exported for transcript viewport tests and diagnostics.
extensions/adapters/presenters/tui/panels/transcript.fnl:519
fen.extensions.tui.panels.transcript.viewport-lines #
(viewport-lines width region-h) -> [PresenterRow]
Return visible transcript rows using lazy tail rendering near the end and indexed cache for deep scroll.
extensions/adapters/presenters/tui/panels/transcript.fnl:638
fen.extensions.tui.panels.transcript.max-scroll #
(max-scroll input-rows) -> number
Compute the maximum useful transcript scroll offset for current terminal and input heights.
extensions/adapters/presenters/tui/panels/transcript.fnl:653
fen.extensions.tui.panels.transcript.jump-to-user-message! #
(jump-to-user-message! input-rows) -> boolean
Move the transcript viewport to the latest relevant user-authored message, repeating through older messages.
extensions/adapters/presenters/tui/panels/transcript.fnl:672
fen.extensions.tui.panels.transcript.clear-render-caches! #
(clear-render-caches!) -> nil
Clear cached rows for every transcript event so a forced repaint uses current renderers.
extensions/adapters/presenters/tui/panels/transcript.fnl:733
fen.extensions.tui.redraw #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.redraw.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent redraw and spinner scheduling fields after reloads.
extensions/adapters/presenters/tui/redraw.fnl:11
fen.extensions.tui.redraw.invalidate! #
(invalidate!) -> nil
Mark the TUI dirty so the next presenter-loop pass repaints the terminal.
extensions/adapters/presenters/tui/redraw.fnl:23
fen.extensions.tui.redraw.invalidate-full! #
(invalidate-full!) -> nil
Request a cache-clearing repaint for resize, reload, and display toggles that invalidate wrapped rows.
extensions/adapters/presenters/tui/redraw.fnl:33
fen.extensions.tui.select #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.select.filtered #
(filtered state) -> [Choice]
Return choices whose label or description match the current selector filter text.
extensions/adapters/presenters/tui/select.fnl:46
fen.extensions.tui.select.visible-window #
(visible-window state max-rows) -> first-index item-count total-count
Compute the visible selector slice so the cursor stays on-screen while moving through long choice lists.
extensions/adapters/presenters/tui/select.fnl:63
fen.extensions.tui.select.make-state #
(make-state opts) -> SelectState
Create the pure selector state record used by tests and the termbox overlay loop.
extensions/adapters/presenters/tui/select.fnl:80
fen.extensions.tui.select.step! #
(step! state key) -> SelectState
Apply one synthetic selector key to filtering, cursor movement, selection, or cancellation state.
extensions/adapters/presenters/tui/select.fnl:95
fen.extensions.tui.select.tui-select #
(tui-select opts) -> Choice|nil
Run the interactive TUI select overlay when termbox is initialized and return the chosen record.
extensions/adapters/presenters/tui/select.fnl:249
fen.extensions.tui.state #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.state.tb-initialized? #
boolean
Persistent termbox2 lifecycle flag used to keep TUI init and shutdown idempotent across reloads.
extensions/adapters/presenters/tui/state.fnl:10
fen.extensions.tui.state.tb-init-failed? #
boolean
Flag set when termbox2 initialization failed so startup can print a clean error and avoid unsafe teardown.
extensions/adapters/presenters/tui/state.fnl:16
fen.extensions.tui.state.tb-cols #
number
Last known terminal column count used by draw/layout code after termbox resize events.
extensions/adapters/presenters/tui/state.fnl:22
fen.extensions.tui.state.tb-rows #
number
Last known terminal row count used by draw/layout code after termbox resize events.
extensions/adapters/presenters/tui/state.fnl:28
fen.extensions.tui.state.dirty? #
boolean
Redraw scheduling flag set when visible TUI state changed and the next presenter loop should repaint.
extensions/adapters/presenters/tui/state.fnl:34
fen.extensions.tui.state.force-redraw? #
boolean
Strong redraw flag that clears render caches and blanks the presenter before repainting after resize, reload, or display toggles.
extensions/adapters/presenters/tui/state.fnl:40
fen.extensions.tui.state.spinner-ticks #
number
Event-loop tick counter used to pace busy spinner animation without adding another wall-clock dependency.
extensions/adapters/presenters/tui/state.fnl:46
fen.extensions.tui.state.spinner-interval-ticks #
number
Number of event-loop ticks between spinner frame advances while the agent is busy.
extensions/adapters/presenters/tui/state.fnl:52
fen.extensions.tui.state.animations? #
boolean
Global animation toggle controlling whether busy indicators use animated spinner frames or static fallback glyphs.
extensions/adapters/presenters/tui/state.fnl:58
fen.extensions.tui.state.transcript #
[PresenterEvent]
Append-only preprocessed transcript event log used as the source of truth for TUI rendering.
extensions/adapters/presenters/tui/state.fnl:64
fen.extensions.tui.state.streaming-assistant-rows #
table
Lookup table from streaming row keys to transcript rows so delta ingestion can update active assistant output efficiently.
extensions/adapters/presenters/tui/state.fnl:70
fen.extensions.tui.state.transcript-layout-cache #
table|nil
Width/display-keyed wrapped transcript layout cache used for fast viewport and max-scroll calculations.
extensions/adapters/presenters/tui/state.fnl:76
fen.extensions.tui.state.scroll-offset #
number
Number of wrapped transcript lines above the tail that anchor the viewport when the user scrolls up.
extensions/adapters/presenters/tui/state.fnl:82
fen.extensions.tui.state.new-content-below? #
boolean
Set while the transcript is scroll-locked and newly appended content is available below the viewport.
extensions/adapters/presenters/tui/state.fnl:88
fen.extensions.tui.state.last-user-jump-index #
number|nil
Transcript event index targeted by the last user-message jump, used so repeated keypresses walk to previous user messages.
extensions/adapters/presenters/tui/state.fnl:94
fen.extensions.tui.state.input-buf #
string
Current multi-line input buffer contents, including literal newlines and paste markers before submit expansion.
extensions/adapters/presenters/tui/state.fnl:100
fen.extensions.tui.state.input-cursor #
number
Byte offset cursor position inside input-buf for terminal input editing.
extensions/adapters/presenters/tui/state.fnl:106
fen.extensions.tui.state.paste-active? #
boolean
Bracketed-paste mode flag indicating incoming bytes should accumulate in paste-buffer instead of editing input directly.
extensions/adapters/presenters/tui/state.fnl:112
fen.extensions.tui.state.paste-buffer #
string
Accumulator for the current bracketed paste before it is compacted into an input marker.
extensions/adapters/presenters/tui/state.fnl:118
fen.extensions.tui.state.paste-counter #
number
Monotonic id counter for large pasted payload markers stored in the pastes table.
extensions/adapters/presenters/tui/state.fnl:124
fen.extensions.tui.state.pastes #
table
Table of compact paste marker ids to full pasted text, expanded back into input on submit.
extensions/adapters/presenters/tui/state.fnl:130
fen.extensions.tui.state.history #
[string]
In-process prompt history ring containing submitted prompts for up/down navigation.
extensions/adapters/presenters/tui/state.fnl:136
fen.extensions.tui.state.history-pos #
number
Prompt history navigation position where zero means the current live draft and positive values index backward from the end.
extensions/adapters/presenters/tui/state.fnl:142
fen.extensions.tui.state.history-draft #
string
Saved live input draft restored when the user navigates back out of history.
extensions/adapters/presenters/tui/state.fnl:148
fen.extensions.tui.state.expand-tool-results? #
boolean
Global /expand toggle controlling whether tool-result transcript events show full truncated bodies or one-line summaries.
extensions/adapters/presenters/tui/state.fnl:154
fen.extensions.tui.state.markdown? #
boolean
Global /markdown toggle controlling whether assistant text renders through the terminal markdown renderer or as plain text.
extensions/adapters/presenters/tui/state.fnl:160
fen.extensions.tui.state.hide-thinking-block? #
boolean
Global /thinking toggle controlling whether assistant reasoning blocks render visibly or collapse to a compact Thinking label.
extensions/adapters/presenters/tui/state.fnl:166
fen.extensions.tui.state.pending-quit? #
boolean
Two-press ctrl-c confirmation flag for idle quit behavior, cleared by any non-quit key.
extensions/adapters/presenters/tui/state.fnl:172
fen.extensions.tui.state.alt-pending? #
boolean
One-tick bare-Esc state used to distinguish dismiss from Alt-key combinations in INPUT_ESC mode.
extensions/adapters/presenters/tui/state.fnl:178
fen.extensions.tui.state.on-tick #
function|nil
Cooperative tick callback published by the run loop so nested selectors can keep agent coroutines and HTTP drains moving.
extensions/adapters/presenters/tui/state.fnl:184
fen.extensions.tui.state.cancel-pressed? #
boolean
Busy-turn ctrl-c flag recording that cancellation was requested before the agent loop observes and clears it.
extensions/adapters/presenters/tui/state.fnl:190
fen.extensions.tui.state.last-stall-warn-ms #
extensions/adapters/presenters/tui/state.fnl:202
fen.extensions.tui.state.status-info #
table
Persistent status-line model, token, queue, retry, thinking, cancellation, elapsed-time, and spinner metadata.
extensions/adapters/presenters/tui/state.fnl:196
fen.extensions.web #
Module neighborhood graph: DOT · SVG
fen.extensions.web.init! #
(init! ctx) -> nil
Store the presenter context and initialize the web server listener for browser clients.
extensions/adapters/presenters/web/init.fnl:73
fen.extensions.web.shutdown #
(shutdown ctx) -> nil
Clear the web presenter context and close server/client resources during presenter shutdown.
extensions/adapters/presenters/web/init.fnl:81
fen.extensions.web.run #
(run ctx) -> nil
Run the web presenter server loop with the current context until the presenter is asked to quit.
extensions/adapters/presenters/web/init.fnl:89
fen.extensions.web.register #
[api]
extensions/adapters/presenters/web/init.fnl:98
fen.extensions.web.ingest #
Module neighborhood graph: DOT · SVG
fen.extensions.web.ingest.append-event #
(append-event ev) -> nil
Ingest one bus event into web transcript and status state, including streaming assistant deltas and tool summaries.
extensions/adapters/presenters/web/ingest.fnl:79
fen.extensions.web.layout #
Module neighborhood graph: DOT · SVG
fen.extensions.web.layout.snapshot #
(snapshot ctx?) -> table
Build the JSON-serializable browser layout snapshot from status fragments, panels, transcript rows, select state, and reload sequence.
extensions/adapters/presenters/web/layout.fnl:115
fen.extensions.web.layout.html-snapshot #
(html-snapshot ctx?) -> table
Build a browser layout snapshot with pre-rendered HTML fragments for status, transcript, panels, and select state.
extensions/adapters/presenters/web/layout.fnl:186
fen.extensions.web.page #
Module neighborhood graph: DOT · SVG
fen.extensions.web.page.render #
function
Hiccup document renderer alias exported for browser page tests and reuse within web snapshots.
extensions/adapters/presenters/web/page.fnl:66
fen.extensions.web.page.render-node #
function
Single-node HTML renderer alias exported for focused escaping and element-rendering tests.
extensions/adapters/presenters/web/page.fnl:73
fen.extensions.web.page.html #
(html) -> string
Render the static browser presenter page with embedded CSS and JavaScript for HTTP/SSE interaction.
extensions/adapters/presenters/web/page.fnl:233
fen.extensions.web.server #
Module neighborhood graph: DOT · SVG
fen.extensions.web.server.parse-request #
(parse-request buf) -> Request|nil
Parse a buffered HTTP request once headers and the declared body length have arrived.
extensions/adapters/presenters/web/server.fnl:68
fen.extensions.web.server.broadcast! #
(broadcast! state ctx) -> nil
Queue a layout SSE frame to connected clients when the rendered browser snapshot changes.
extensions/adapters/presenters/web/server.fnl:247
fen.extensions.web.server.init #
(init ctx state) -> nil
Start the nonblocking LuaSocket HTTP server for the web presenter if it is not already listening.
extensions/adapters/presenters/web/server.fnl:255
fen.extensions.web.server.shutdown #
(shutdown ctx state) -> nil
Stop the web server, close HTTP and SSE clients, clear queues, and mark the presenter as quitting.
extensions/adapters/presenters/web/server.fnl:271
fen.extensions.web.server.tick #
(tick socket state ctx) -> nil
Service accepts, HTTP requests, pending inputs, cooperative ticks, SSE broadcasts, flushes, and pacing sleep once.
extensions/adapters/presenters/web/server.fnl:287
fen.extensions.web.server.wait-select #
(wait-select ctx state opts) -> Choice|nil
Publish an active browser select prompt, service the web loop until a reply arrives, and return the chosen choice.
extensions/adapters/presenters/web/server.fnl:310
fen.extensions.web.server.run #
(run ctx state) -> nil
Run the web server loop until shutdown sets the persistent quit flag.
extensions/adapters/presenters/web/server.fnl:334
fen.extensions.web.state #
Module neighborhood graph: DOT · SVG
fen.extensions.web.state.server #
server|nil
Active web server handle, kept outside reloadable modules so the listening socket can survive behavior reloads.
extensions/adapters/presenters/web/state.fnl:4
fen.extensions.web.state.host #
string
Interface address used by the web presenter when binding its HTTP/SSE server.
extensions/adapters/presenters/web/state.fnl:10
fen.extensions.web.state.port #
number
TCP port used by the web presenter server and advertised browser URL.
extensions/adapters/presenters/web/state.fnl:16
fen.extensions.web.state.clients #
[client]
Connected web client records tracked by the presenter server for lifecycle and cleanup.
extensions/adapters/presenters/web/state.fnl:22
fen.extensions.web.state.sse-clients #
[client]
Active Server-Sent Events client connections receiving transcript/status snapshots.
extensions/adapters/presenters/web/state.fnl:28
fen.extensions.web.state.pending-inputs #
[string]
User inputs submitted by browser clients and queued for the presenter loop to hand to the agent.
extensions/adapters/presenters/web/state.fnl:34
fen.extensions.web.state.quit? #
boolean
Presenter loop shutdown flag set by web controls when the browser requests session termination.
extensions/adapters/presenters/web/state.fnl:40
fen.extensions.web.state.last-snapshot #
string
Last serialized browser snapshot used to avoid redundant SSE broadcasts when visible state has not changed.
extensions/adapters/presenters/web/state.fnl:46
fen.extensions.web.state.last-broadcast #
number
Timestamp/counter of the last web snapshot broadcast used to pace browser updates.
extensions/adapters/presenters/web/state.fnl:52
fen.extensions.web.state.client-reload-seq #
number
Monotonic sequence bumped to tell browser clients that frontend assets or presenter behavior should reload.
extensions/adapters/presenters/web/state.fnl:58
fen.extensions.web.state.select-seq #
number
Monotonic id counter for active web select prompts so browser replies can be matched to the current prompt.
extensions/adapters/presenters/web/state.fnl:64
fen.extensions.web.state.active-select #
table|nil
Currently active browser select prompt, including choices and response bookkeeping for presenter UI APIs.
extensions/adapters/presenters/web/state.fnl:70
fen.extensions.web.state.presenter-ctx #
table|nil
Current web presenter runtime context captured for server handlers that need to submit input or request cancellation.
extensions/adapters/presenters/web/state.fnl:76
fen.extensions.web.state.transcript #
[PresenterEvent]
Persistent web transcript event log used to build browser snapshots after reloads or client reconnects.
extensions/adapters/presenters/web/state.fnl:82
fen.extensions.web.state.status-info #
table
Web status metadata for provider/model, context estimates, queues, running tool, thinking, cancellation, and turn timing.
extensions/adapters/presenters/web/state.fnl:88
Utilities (fen.util.*) #
fen.util.base64 #
Module neighborhood graph: DOT · SVG
fen.util.base64.decode-standard #
(decode-standard s) -> string
Decode a standard base64 string with optional padding into its raw byte string for trusted token payloads.
packages/util/src/fen/util/base64.fnl:20
fen.util.base64.decode-url #
(decode-url s) -> string|nil
Decode an unpadded base64url string by restoring the standard alphabet and padding before decoding.
packages/util/src/fen/util/base64.fnl:50
fen.util.base64.encode-standard #
(encode-standard bytes) -> string
Encode a raw byte string as standard base64 with RFC-style = padding.
packages/util/src/fen/util/base64.fnl:68
fen.util.base64.encode-url #
(encode-url bytes) -> string|nil
Encode raw bytes as unpadded base64url for PKCE and token-related wire formats.
packages/util/src/fen/util/base64.fnl:105
fen.util.checksum #
Module neighborhood graph: DOT · SVG
fen.util.checksum.file-fingerprint #
(file-fingerprint path) -> table|nil
Compute a small non-cryptographic checksum/size fingerprint for a file used by reload-change diagnostics.
packages/util/src/fen/util/checksum.fnl:6
fen.util.checksum.module-path #
(module-path modname) -> string|nil
Resolve a module name through package.path or its .fnl dev-path analogue so reload diagnostics can fingerprint the active source file.
packages/util/src/fen/util/checksum.fnl:56
fen.util.checksum.module-fingerprint #
(module-fingerprint modname) -> table|nil
Resolve and fingerprint a Lua module source file, returning nil when the module has no package.path file.
packages/util/src/fen/util/checksum.fnl:70
fen.util.flat_extensions #
Module neighborhood graph: DOT · SVG
fen.util.flat_extensions.build-map #
(build-map roots) -> table
Walk flat extension roots and build the manifest :name to directory map used by the namespace searcher.
packages/util/src/fen/util/flat_extensions.fnl:118
fen.util.flat_extensions.resolve-fnl #
(resolve-fnl map modname) -> string|nil
Return the flat source path for a fen.extensions module from a manifest-name map.
packages/util/src/fen/util/flat_extensions.fnl:137
fen.util.flat_extensions.make-searcher #
(make-searcher fennel map) -> searcher-fn
Build a package.searchers entry that maps fen.extensions.<name> modules back to flat extension source files.
packages/util/src/fen/util/flat_extensions.fnl:158
fen.util.flat_extensions.install! #
(install! opts) -> searcher-fn
Build and insert the flat-extension searcher into package.searchers at the requested position.
packages/util/src/fen/util/flat_extensions.fnl:175
fen.util.http #
Module neighborhood graph: DOT · SVG
fen.util.http.request #
(request opts) -> {:status :body :headers}|{:error}
Perform an HTTP request through the selected backend, supporting streaming chunks and cooperative yielding.
packages/util/src/fen/util/http/init.fnl:14
fen.util.http.backends.native #
Module neighborhood graph: DOT · SVG
fen.util.http.backends.native.request #
(request opts) -> {:status :body :headers}|{:error :curl-code?}
Translate kebab-case HTTP options/results and dispatch to the project-owned fen_http libcurl binding.
packages/util/src/fen/util/http/backends/native.fnl:36
fen.util.id #
Module neighborhood graph: DOT · SVG
fen.util.id.random-hex #
[n]
packages/util/src/fen/util/id.fnl:20
fen.util.id.uuidv7 #
[]
packages/util/src/fen/util/id.fnl:38
fen.util.json #
Module neighborhood graph: DOT · SVG
fen.util.json.encode #
cjson.empty_array
Sentinel table that serializes as [] instead of {}, used when provider wire payloads require literal empty arrays.
packages/util/src/fen/util/json.fnl:9
fen.util.json.decode #
cjson.empty_array
Sentinel table that serializes as [] instead of {}, used when provider wire payloads require literal empty arrays.
packages/util/src/fen/util/json.fnl:9
fen.util.json.null #
cjson.empty_array
Sentinel table that serializes as [] instead of {}, used when provider wire payloads require literal empty arrays.
packages/util/src/fen/util/json.fnl:9
fen.util.json.empty-array #
cjson.empty_array
Sentinel table that serializes as [] instead of {}, used when provider wire payloads require literal empty arrays.
packages/util/src/fen/util/json.fnl:9
fen.util.log #
Module neighborhood graph: DOT · SVG
fen.util.log.debug #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:25
fen.util.log.info #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:25
fen.util.log.warn #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:25
fen.util.log.error #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:25
fen.util.log.timestamp #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:25
fen.util.log_sink #
Module neighborhood graph: DOT · SVG
fen.util.log_sink.handle #
packages/util/src/fen/util/log_sink.fnl:16
fen.util.log_sink.open! #
(open! path) -> boolean,?string
Open path in append mode as the active log sink, closing any prior handle. Returns ok?, err.
packages/util/src/fen/util/log_sink.fnl:18
fen.util.log_sink.close! #
(close!) -> nil
Close and clear the active log sink handle, returning log routing to stderr.
packages/util/src/fen/util/log_sink.fnl:31
fen.util.log_sink.active? #
(active?) -> boolean
True when a file sink is currently open and write-line will land in the file.
packages/util/src/fen/util/log_sink.fnl:41
fen.util.log_sink.write-line #
(write-line s) -> boolean,?string
Append s plus a newline to the active sink and flush. Returns true on success; on write failure clears the handle (so callers can fall back to stderr) and returns false plus the error. No-op true when the sink is inactive.
packages/util/src/fen/util/log_sink.fnl:49
fen.util.path #
Module neighborhood graph: DOT · SVG
fen.util.path.home #
(home) -> string
Return HOME with a /tmp fallback so path helpers remain usable in stripped-down test or daemon environments.
packages/util/src/fen/util/path.fnl:16
fen.util.path.config-home #
(config-home) -> string
Return XDG_CONFIG_HOME or the conventional ~/.config directory under the resolved home path.
packages/util/src/fen/util/path.fnl:24
fen.util.path.config-dir #
(config-dir app) -> string
Return the per-application configuration directory under the XDG config home.
packages/util/src/fen/util/path.fnl:35
fen.util.path.state-home #
(state-home) -> string
Return XDG_STATE_HOME or the conventional ~/.local/state directory under the resolved home path.
packages/util/src/fen/util/path.fnl:43
fen.util.path.state-dir #
(state-dir app) -> string
Return the per-application state directory under the XDG state home.
packages/util/src/fen/util/path.fnl:54
fen.util.path.data-home #
(data-home) -> string
Return XDG_DATA_HOME or the conventional ~/.local/share directory under the resolved home path.
packages/util/src/fen/util/path.fnl:62
fen.util.path.data-dir #
(data-dir app) -> string
Return the per-application data directory under the XDG data home.
packages/util/src/fen/util/path.fnl:73
fen.util.path.ensure-dir! #
(ensure-dir! dir) -> nil
Create dir (and missing parents) with POSIX mkdir -p, swallowing failures so callers can attempt their write and surface a clearer error.
packages/util/src/fen/util/path.fnl:81
fen.util.path.shell-quote #
(shell-quote s) -> string
Quote a value as one POSIX shell word for helper functions that must invoke system tools safely.
packages/util/src/fen/util/path.fnl:89
fen.util.path.dirname #
(dirname path) -> string
Return the directory portion of a path, using . for bare names and / for root-level paths.
packages/util/src/fen/util/path.fnl:97
fen.util.path.basename #
(basename path) -> string
Return the final path component while tolerating a trailing slash.
packages/util/src/fen/util/path.fnl:108
fen.util.path.pwd-physical #
(pwd-physical dir) -> string|nil
Resolve a directory through pwd -P, returning its physical path or nil if the shell probe fails.
packages/util/src/fen/util/path.fnl:116
fen.util.path.cwd #
(cwd) -> string
Return the user's current directory spelling from PWD, falling back to a physical pwd probe and then . .
packages/util/src/fen/util/path.fnl:129
fen.util.path.realpath #
(realpath path) -> string
Resolve the directory portion of a path physically while preserving the original basename.
packages/util/src/fen/util/path.fnl:137
fen.util.path.file-exists? #
(file-exists? path) -> boolean
Return true only for regular files, preferring LuaFileSystem and falling back to POSIX test -f.
packages/util/src/fen/util/path.fnl:174
fen.util.path.dir-exists? #
(dir-exists? path) -> boolean
Return true only for directories, preferring LuaFileSystem and falling back to POSIX test -d.
packages/util/src/fen/util/path.fnl:186
fen.util.path.ancestors-root-to-leaf #
(ancestors-root-to-leaf start) -> [string]
Return a physical ancestor chain from / to start for deterministic project-context discovery.
packages/util/src/fen/util/path.fnl:195
fen.util.process #
Module neighborhood graph: DOT · SVG
fen.util.process.read-pipe-coop #
(read-pipe-coop pipe yield-fn) -> string
Drain a popen pipe in nonblocking chunks, yielding on EAGAIN so cooperative tool execution keeps the UI responsive.
packages/util/src/fen/util/process.fnl:27
fen.util.process.read-pipe-close #
(read-pipe-close pipe yield-fn?) -> string
Drain and close a popen pipe, guaranteeing close runs even when cooperative cancellation raises through yield-fn.
packages/util/src/fen/util/process.fnl:62
fen.util.process.run-captured #
(run-captured opts yield-fn?) -> table
Run a shell command with cooperative output capture, timeout/cancel cleanup, bounded inline output, and optional full-output spill file.
packages/util/src/fen/util/process.fnl:147
fen.util.process.monotonic-ms #
packages/util/src/fen/util/process.fnl:367
fen.util.process.sleep-ms #
packages/util/src/fen/util/process.fnl:367
fen.util.random #
Module neighborhood graph: DOT · SVG
fen.util.random.bytes #
(bytes n) -> string
Return n cryptographically random raw bytes from the platform RNG through the fen_random native binding.
packages/util/src/fen/util/random.fnl:11
fen.util.search.bitap #
Module neighborhood graph: DOT · SVG
fen.util.search.bitap.compile #
[pattern ?opts]
packages/util/src/fen/util/search/bitap.fnl:20
fen.util.search.bitap.match #
[compiled raw-text ?opts]
packages/util/src/fen/util/search/bitap.fnl:109
fen.util.search.bitap.score #
[compiled raw-text]
packages/util/src/fen/util/search/bitap.fnl:118
fen.util.sha256 #
Module neighborhood graph: DOT · SVG
fen.util.sha256.digest #
(digest bytes) -> string
Compute SHA-256 for a Lua string and return the 32-byte raw digest used by PKCE challenge construction.
packages/util/src/fen/util/sha256.fnl:98
fen.util.sha256.hex-digest #
(hex-digest bytes) -> string
Compute SHA-256 for a Lua string and return the lowercase 64-character hexadecimal digest.
packages/util/src/fen/util/sha256.fnl:117
fen.util.sse #
Module neighborhood graph: DOT · SVG
fen.util.sse.new-parser #
(new-parser on-event) -> parser
Create an incremental Server-Sent Events parser that accepts arbitrary chunks and dispatches complete event tables.
packages/util/src/fen/util/sse.fnl:28
fen.util.sse.parse #
(parse raw) -> [SseEvent]
Parse a complete Server-Sent Events payload into event tables, flushing any final unterminated line.
packages/util/src/fen/util/sse.fnl:99
fen.util.sse.json-events #
(json-events raw) -> [table]
Parse an SSE payload and JSON-decode every non-empty, non-[DONE] data field for provider tests and adapters.
packages/util/src/fen/util/sse.fnl:112
fen.util.text #
Module neighborhood graph: DOT · SVG
fen.util.text.DEFAULT-MAX-TOOL-RESULT-BYTES #
packages/util/src/fen/util/text.fnl:227
fen.util.text.MAX-SCAN-BYTES #
packages/util/src/fen/util/text.fnl:227
fen.util.text.default-tool-result-max-bytes #
packages/util/src/fen/util/text.fnl:227
fen.util.text.trim #
(trim s) -> string
Strip leading and trailing ASCII whitespace; nil becomes "".
packages/util/src/fen/util/text.fnl:11
fen.util.text.first-line #
(first-line s) -> string
Return the substring up to the first newline; nil becomes "".
packages/util/src/fen/util/text.fnl:19
fen.util.text.sanitize #
(sanitize s) -> {:text :changed? :unsafe-count :invalid-count :input-bytes}
Escape unsafe control bytes and invalid UTF-8 while preserving valid text and \n/\r/\t.
packages/util/src/fen/util/text.fnl:97
fen.util.text.scrub-tool-text #
(scrub-tool-text s ?opts) -> {:text :changed? :note :unsafe-count :invalid-count :truncated? :input-bytes :sanitized-bytes :kept-bytes :max-bytes}
Sanitize and cap provider-visible tool output text, appending an explicit marker when changed.
packages/util/src/fen/util/text.fnl:174
Testing (fen.testing.*) #
fen.testing #
Module neighborhood graph: DOT · SVG
fen.testing.shellquote #
(shellquote s) -> string
Quote a string for POSIX shell commands used by test filesystem helpers.
packages/testing/src/fen/testing/init.fnl:5
fen.testing.stub-getenv! #
(stub-getenv! resolver) -> nil
Replace os.getenv in tests with a resolver that can delegate to the original environment lookup.
packages/testing/src/fen/testing/init.fnl:23
fen.testing.restore-getenv! #
(restore-getenv!) -> nil
Restore the original os.getenv captured before tests installed any environment stubs.
packages/testing/src/fen/testing/init.fnl:34
fen.testing.reload-module #
(reload-module name) -> any
Clear package.loaded for one module and require it again so tests can observe module initialization behavior.
packages/testing/src/fen/testing/init.fnl:42
fen.testing.stub-http! #
(stub-http! responder) -> nil
Replace fen.util.http's backend with a test responder and clear the cached frontend module.
packages/testing/src/fen/testing/init.fnl:51
fen.testing.restore-http! #
(restore-http!) -> nil
Remove the stubbed HTTP backend and cached frontend so later tests reload the normal transport.
packages/testing/src/fen/testing/init.fnl:65
fen.testing.make-tmpdir #
(make-tmpdir) -> string
Create and register ownership of a temporary directory that rmtree is allowed to remove.
packages/testing/src/fen/testing/init.fnl:74
fen.testing.rmtree #
(rmtree path) -> nil
Remove an owned temporary directory tree, refusing arbitrary or unsafe paths.
packages/testing/src/fen/testing/init.fnl:87
fen.testing.write-file #
(write-file path content) -> path
Create parent directories as needed and write content to a test fixture file.
packages/testing/src/fen/testing/init.fnl:106
fen.testing.append-file #
(append-file path content) -> path
Append content to a test fixture file and return the path for fluent setup code.
packages/testing/src/fen/testing/init.fnl:120
fen.testing.read-file #
(read-file path) -> string|nil
Read a file if it exists, returning nil instead of failing for optional fixture paths.
packages/testing/src/fen/testing/init.fnl:131
fen.testing.read-file! #
(read-file! path) -> string
Read a required fixture file and fail the test immediately if it cannot be opened.
packages/testing/src/fen/testing/init.fnl:143
fen.testing.make-tmpfile #
(make-tmpfile content) -> string
Create an owned temporary file, write initial content, and return its path for the test.
packages/testing/src/fen/testing/init.fnl:154
fen.testing.rm-file #
(rm-file path) -> nil
Remove an owned temporary file and refuse paths that were not created by make-tmpfile.
packages/testing/src/fen/testing/init.fnl:170
fen.testing.assert-no-leaks! #
(assert-no-leaks!) -> nil
Assert that all owned temporary roots and files have been cleaned up by the test suite.
packages/testing/src/fen/testing/init.fnl:183
fen.testing.macros #
Module neighborhood graph: DOT · SVG
fen.testing.macros.with-tmpdir #
(with-tmpdir [name] body...) -> macro-form
Macro that creates an owned temp directory for a test body and always removes it afterward.
packages/testing/src/fen/testing/macros.fnl:14
fen.testing.macros.with-tmpfile #
(with-tmpfile [name content] body...) -> macro-form
Macro that creates an owned temp file with content for a test body and always removes it afterward.
packages/testing/src/fen/testing/macros.fnl:28
fen.testing.pty #
Module neighborhood graph: DOT · SVG
fen.testing.pty.spawn #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.read-until #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.drain #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.now #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.artifact-dir #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.ensure-dir #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.write-file #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.append-file #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.encode-json #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.cast-start #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.pty.cast-event #
packages/testing/src/fen/testing/pty.fnl:107
fen.testing.tui #
Module neighborhood graph: DOT · SVG
fen.testing.tui.install-termbox-stub! #
[]
packages/testing/src/fen/testing/tui.fnl:7
fen.testing.tui.install-markdown-stub! #
[]
packages/testing/src/fen/testing/tui.fnl:52
fen.testing.tui.reset-state! #
[?opts]
packages/testing/src/fen/testing/tui.fnl:59
Other (miscellaneous top-level modules) #
fen.provider_help #
Module neighborhood graph: DOT · SVG
fen.provider_help.render-index #
[]
packages/fen/src/fen/provider_help.fnl:123
fen.provider_help.render-provider #
[name]
packages/fen/src/fen/provider_help.fnl:150
fen.provider_help.known-provider? #
[name]
packages/fen/src/fen/provider_help.fnl:157
fen.provider_help.dispatch #
[argv]
packages/fen/src/fen/provider_help.fnl:160
fen.provider_help.missing-provider-message #
[provider-name key-var ?source]
packages/fen/src/fen/provider_help.fnl:173
fen.provider_help.unknown-provider-message #
[provider-name]
packages/fen/src/fen/provider_help.fnl:198
fen.script_runner #
Module neighborhood graph: DOT · SVG
fen.script_runner.usage #
(usage) -> string
Return command-line usage text for fen run.
packages/fen/src/fen/script_runner.fnl:41
fen.script_runner.eval-usage #
(eval-usage) -> string
Return command-line usage text for fen eval.
packages/fen/src/fen/script_runner.fnl:48
fen.script_runner.infer-language #
(infer-language script ?override) -> :lua|:fennel
Choose the runner language, using an explicit override before script extension inference.
packages/fen/src/fen/script_runner.fnl:55
fen.script_runner.build-arg-table #
(build-arg-table argv script-index) -> table
Build a Lua-compatible global arg table for a script selected from fen's original argv.
packages/fen/src/fen/script_runner.fnl:64
fen.script_runner.build-eval-arg-table #
(build-eval-arg-table argv code-index) -> table
Build a Lua-compatible global arg table for inline eval code.
packages/fen/src/fen/script_runner.fnl:80
fen.script_runner.parse #
(parse argv) -> table|nil, err|nil
Parse fen run arguments without invoking the general agent option parser.
packages/fen/src/fen/script_runner.fnl:100
fen.script_runner.parse-eval #
(parse-eval argv) -> table|nil, err|nil
Parse fen eval arguments without invoking the general agent option parser.
packages/fen/src/fen/script_runner.fnl:139
fen.script_runner.run! #
(run! argv) -> integer
Run the script selected by fen run and return the process exit code.
packages/fen/src/fen/script_runner.fnl:216
fen.script_runner.eval! #
(eval! argv) -> integer
Evaluate the code selected by fen eval and return the process exit code.
packages/fen/src/fen/script_runner.fnl:240
fen.turn_lifecycle #
Module neighborhood graph: DOT · SVG
fen.turn_lifecycle.complete-event #
(complete-event state ok? result-or-error) -> table
Build an :agent-turn-complete event for a finished agent turn.
packages/fen/src/fen/turn_lifecycle.fnl:27
fen.turn_lifecycle.emit-complete! #
(emit-complete! state ok? result-or-error) -> table
Emit and return the :agent-turn-complete lifecycle event for a finished agent turn.
packages/fen/src/fen/turn_lifecycle.fnl:48
fen.update #
Module neighborhood graph: DOT · SVG
fen.update.run! #
(run! argv) -> exit-code
Replace the running release binary with the latest GitHub release; refuses source/dev builds.
packages/fen/src/fen/update.fnl:230
fen.update.arch- #
packages/fen/src/fen/update.fnl:251
fen.update.expected-hash #
packages/fen/src/fen/update.fnl:252
fen.version #
Module neighborhood graph: DOT · SVG
fen.version.info #
(info) -> VersionInfo
Return source-checkout version metadata; Nix builds replace this module with a stamped table.
packages/fen/src/fen/version.fnl:46
fen.version.version #
(version) -> string
Return the short source version string used by CLI/status displays.
packages/fen/src/fen/version.fnl:54
fen.version.format #
(format ?info) -> string
Format version metadata as the single-line fen --version display.
packages/fen/src/fen/version.fnl:62