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:43
fen.core.agent.step #
(step agent user-msg ?cancel-fn ?step-opts)
Run one user turn through the loop. Appends a UserMessage, then iterates
packages/core/src/fen/core/agent.fnl:670
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:13
fen.core.agent.complete-messages #
(complete-messages agent messages ?model ?opts ?on-event ?yield-fn)
Run one provider completion against explicit canonical messages and no
packages/core/src/fen/core/agent.fnl:566
fen.core.diagnostics #
Module neighborhood graph: DOT · SVG
fen.core.diagnostics.set-runtime-info! #
(set-runtime-info! info)
Inject sanitized runtime/build metadata for later diagnostics.
packages/core/src/fen/core/diagnostics.fnl:29
fen.core.diagnostics.runtime-info #
(runtime-info)
Return sanitized runtime/build metadata, or nil if unavailable.
packages/core/src/fen/core/diagnostics.fnl:34
fen.core.extensions.build #
Module neighborhood graph: DOT · SVG
fen.core.extensions.build.workspace-output-path #
(workspace-output-path src) -> string
Map a workspace source path to its in-tree dist/ output, handling both rock-shaped src/ trees and flat-layout extensions.
packages/core/src/fen/core/extensions/build.fnl:85
fen.core.extensions.build.lrbuild-output-path #
(lrbuild-output-path src) -> string
Map a source path to its per-rock .lrbuild/ output, used when a single rockspec is built in place.
packages/core/src/fen/core/extensions/build.fnl:109
fen.core.extensions.build.compile-file #
(compile-file src output-path) -> nil
Compile a single Fennel source file to Lua and write it to the path returned by output-path.
packages/core/src/fen/core/extensions/build.fnl:121
fen.core.extensions.build.build-files #
(build-files files output-path) -> boolean
Compile a list of source files with the given output-path mapper, printing each failure and returning whether all succeeded.
packages/core/src/fen/core/extensions/build.fnl:132
fen.core.extensions.build.workspace-find #
packages/core/src/fen/core/extensions/build.fnl:147
fen.core.extensions.build.lrbuild-find #
packages/core/src/fen/core/extensions/build.fnl:154
fen.core.extensions.build.generate-bundled-skills-data #
(generate-bundled-skills-data out ?root) -> nil
Emit an embeddable Lua data module from real bundled SKILL.md sources, skipping silently when the bundled root is absent.
packages/core/src/fen/core/extensions/build.fnl:160
fen.core.extensions.build.build-lrbuild-dir #
(build-lrbuild-dir)
Rebuild the current directory's .lrbuild/ tree from its Fennel sources.
packages/core/src/fen/core/extensions/build.fnl:184
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:27
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:73
fen.core.extensions.events.emit #
(emit ev)
Dispatch ev to handlers[ev.type] and the :* wildcard bucket.
packages/core/src/fen/core/extensions/events.fnl:121
fen.core.extensions.events.on #
(on event-name handler ?owner)
Subscribe handler to event-name. Returns unsubscribe function.
packages/core/src/fen/core/extensions/events.fnl:134
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:140
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:149
fen.core.extensions.input #
Module neighborhood graph: DOT · SVG
fen.core.extensions.input.handle #
(handle input ctx) -> action
Dispatch non-slash user input through the ordered input-handler pipeline.
packages/core/src/fen/core/extensions/input.fnl:7
fen.core.extensions.loader #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.load-sibling #
(load-sibling spec sibling)
Load a sibling file relative to spec.dir. Used by (api.load :name) from
packages/core/src/fen/core/extensions/loader/init.fnl:213
fen.core.extensions.loader.load! #
(load! opts ?mode)
Discover and load every admissible extension. First-party extensions
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:273
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:290
fen.core.extensions.loader.compiler #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.compiler.compile! #
(compile! candidates ?yield!)
Candidates are ordered {:module :path} records. Unsupported when this
packages/core/src/fen/core/extensions/loader/compiler.fnl:55
fen.core.extensions.loader.discover #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.discover.discover #
(discover explicit-paths ?yield-fn)
Return the merged spec list in load priority: explicit overrides trusted
packages/core/src/fen/core/extensions/loader/discover/init.fnl:40
fen.core.extensions.loader.discover.backends.posix #
Module neighborhood graph: DOT · SVG
fen.core.extensions.loader.discover.backends.posix.first-party-roots #
(first-party-roots)
Return trusted flat first-party overlay roots.
packages/core/src/fen/core/extensions/loader/discover/backends/posix.fnl:103
fen.core.extensions.loader.discover.backends.posix.project-roots #
(project-roots)
Project-local roots: .fen/extensions in cwd and ancestors, walking upward
packages/core/src/fen/core/extensions/loader/discover/backends/posix.fnl:113
fen.core.extensions.loader.discover.backends.posix.user-roots #
(user-roots)
Roots that contain user-installed extensions: $FEN_EXTENSIONS_PATH (colon-
packages/core/src/fen/core/extensions/loader/discover/backends/posix.fnl:133
fen.core.extensions.loader.discover.backends.posix.enumerate #
(enumerate explicit-paths ?yield-fn)
Assemble the extension spec list from explicit paths and the filesystem/env
packages/core/src/fen/core/extensions/loader/discover/backends/posix.fnl:251
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:7
fen.core.extensions.loader.manifest.load-file #
(load-file file-path)
Run a .fnl/.lua file as a script and return its return value (or nil + err).
packages/core/src/fen/core/extensions/loader/manifest.fnl:22
fen.core.extensions.loader.manifest.manifest-path #
[dir]
packages/core/src/fen/core/extensions/loader/manifest.fnl:28
fen.core.extensions.loader.manifest.entry-path-for-dir #
[dir]
packages/core/src/fen/core/extensions/loader/manifest.fnl:35
fen.core.extensions.loader.manifest.read-manifest #
[file-path]
packages/core/src/fen/core/extensions/loader/manifest.fnl:42
fen.core.extensions.loader.manifest.entry-module-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:48
fen.core.extensions.loader.manifest.entry-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:51
fen.core.extensions.loader.manifest.interactive-only? #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:54
fen.core.extensions.loader.manifest.presenter-of #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:57
fen.core.extensions.loader.manifest.reload-modules #
[manifest fallback]
packages/core/src/fen/core/extensions/loader/manifest.fnl:60
fen.core.extensions.loader.manifest.reload-exclude #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:63
fen.core.extensions.loader.manifest.enabled? #
(enabled? spec ?setting)
Return (enabled? reason). Explicit --extension always loads; a boolean
packages/core/src/fen/core/extensions/loader/manifest.fnl:66
fen.core.extensions.loader.manifest.entry-register #
(entry-register entry)
Return the register fn from an extension entry: the entry itself when it is
packages/core/src/fen/core/extensions/loader/manifest.fnl:78
fen.core.extensions.loader.manifest.requires-modules #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:85
fen.core.extensions.loader.manifest.requires-shared-libs #
[manifest]
packages/core/src/fen/core/extensions/loader/manifest.fnl:88
fen.core.extensions.loader.manifest.missing-requires-modules #
(missing-requires-modules manifest)
Return all manifest-declared Lua modules that cannot be required.
packages/core/src/fen/core/extensions/loader/manifest.fnl:91
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:51
fen.core.extensions.loader.reload.change-summary #
(change-summary mods)
Probe each module for a fingerprint change, updating the cache. Returns a
packages/core/src/fen/core/extensions/loader/reload.fnl:60
fen.core.extensions.loader.reload.clear-reload-modules! #
(clear-reload-modules! manifest fallback ?yield ?opts)
Reload manifest.reload-modules (or fallback) from the first changed
packages/core/src/fen/core/extensions/loader/reload.fnl:130
fen.core.extensions.loader.reload.core-modules #
(core-modules)
Derive the reloadable core set from package.loaded instead of a hand-kept
packages/core/src/fen/core/extensions/loader/reload.fnl:176
fen.core.extensions.loader.reload.snapshot-core! #
(snapshot-core!) -> nil
Baseline fingerprints for the currently-loaded core modules so the first /reload after startup reports only real changes.
packages/core/src/fen/core/extensions/loader/reload.fnl:187
fen.core.extensions.loader.reload.reload-core! #
(reload-core! ?yield ?opts) -> (ok-count [failure] ReloadCoreSummary)
Skip recompilation when no core source changed; otherwise reload all currently-loaded core modules in place to refresh captured dependencies, yielding periodically and returning counts plus failures.
packages/core/src/fen/core/extensions/loader/reload.fnl:196
fen.core.extensions.logs #
Module neighborhood graph: DOT · SVG
fen.core.extensions.logs.record! #
(record! owner level value) -> LogRecord|nil
For enabled levels, sanitize and retain one owner-tagged extension log record, append it to logs.jsonl, and mirror it through fen.util.log; disabled levels avoid all record construction and file I/O.
packages/core/src/fen/core/extensions/logs.fnl:42
fen.core.extensions.logs.list #
(list) -> [LogRecord]
Return the bounded persistent extension log ring for structured introspection.
packages/core/src/fen/core/extensions/logs.fnl:61
fen.core.extensions.register #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.public-register-kind? #
(public-register-kind? kind) -> boolean
Return true when kind may be registered by unprivileged extension APIs.
packages/core/src/fen/core/extensions/register/init.fnl:91
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:100
fen.core.extensions.register.unregister-by-owner #
(unregister-by-owner owner)
Drop every registration tagged with owner.
packages/core/src/fen/core/extensions/register/init.fnl:111
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:161
fen.core.extensions.register.list-raw #
(list-raw kind)
Non-frozen variant of list for the presenter paint hot path. Cacheable
packages/core/src/fen/core/extensions/register/init.fnl:175
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:187
fen.core.extensions.register.list-actions #
[]
packages/core/src/fen/core/extensions/register/init.fnl:196
fen.core.extensions.register.invoke-action #
[owner name args ctx]
packages/core/src/fen/core/extensions/register/init.fnl:199
fen.core.extensions.register.action #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.action.register #
[spec owner handle-result]
packages/core/src/fen/core/extensions/register/action.fnl:17
fen.core.extensions.register.action.unregister-by-owner #
[owner]
packages/core/src/fen/core/extensions/register/action.fnl:33
fen.core.extensions.register.action.list #
(list)
Return harness-safe descriptors without executable callbacks.
packages/core/src/fen/core/extensions/register/action.fnl:45
fen.core.extensions.register.action.invoke #
(invoke owner name args ctx)
Validate arguments and invoke an action, always returning a structured result.
packages/core/src/fen/core/extensions/register/action.fnl:71
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:18
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:28
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:36
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:22
fen.core.extensions.register.command.dispatch #
(dispatch line caller-state)
Look up and pcall-isolate a registered slash command.
packages/core/src/fen/core/extensions/register/command.fnl:49
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.command.arg-completions #
(arg-completions name arg-prefix ctx)
Return argument-completion choices for command name.
packages/core/src/fen/core/extensions/register/command.fnl:106
fen.core.extensions.register.contribution #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.contribution.by-order #
[a b]
packages/core/src/fen/core/extensions/register/contribution.fnl:7
fen.core.extensions.register.contribution.register #
(register opts spec owner handle-result) -> register-result
Validate, default, and append one owner-tagged array contribution.
packages/core/src/fen/core/extensions/register/contribution.fnl:30
fen.core.extensions.register.contribution.unregister-by-owner #
(unregister-by-owner opts owner) -> nil
Remove all contributions tagged with owner from an array registry bucket.
packages/core/src/fen/core/extensions/register/contribution.fnl:45
fen.core.extensions.register.contribution.list #
(list opts) -> table
Return introspection records copied from an owner-tagged array registry bucket.
packages/core/src/fen/core/extensions/register/contribution.fnl:53
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:10
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:18
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:7
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:27
fen.core.extensions.register.hook.run-before-tool #
(run-before-tool ctx)
Run all hooks in deterministic registration order until one blocks.
packages/core/src/fen/core/extensions/register/hook.fnl:38
fen.core.extensions.register.input #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.input.register #
(register spec owner handle-result) -> register-result
Validate and append an ordered input handler contribution consulted before non-slash user input starts a turn.
packages/core/src/fen/core/extensions/register/input.fnl:14
fen.core.extensions.register.input.unregister-by-owner #
(unregister-by-owner owner) -> nil
Remove all input handlers installed by owner during extension reload or teardown.
packages/core/src/fen/core/extensions/register/input.fnl:29
fen.core.extensions.register.input.list #
(list) -> [InputHandlerInfo]
Return input handlers sorted by order/owner/name without exposing handler functions.
packages/core/src/fen/core/extensions/register/input.fnl:52
fen.core.extensions.register.input.handle #
(handle input ctx)
Dispatch input through registered handlers in ascending :order.
packages/core/src/fen/core/extensions/register/input.fnl:63
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:15
fen.core.extensions.register.introspect.unregister-by-owner #
[owner]
packages/core/src/fen/core/extensions/register/introspect.fnl:25
fen.core.extensions.register.introspect.list #
[]
packages/core/src/fen/core/extensions/register/introspect.fnl:37
fen.core.extensions.register.introspect.collect #
(collect ?owner ?ctx)
Return owner-scoped snapshot outputs. If owner is supplied, only collect
packages/core/src/fen/core/extensions/register/introspect.fnl:82
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:35
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:43
fen.core.extensions.register.presenter #
Module neighborhood graph: DOT · SVG
fen.core.extensions.register.presenter.promote-ui-slot! #
(promote-ui-slot!)
Select the ui table from the first active presenter that supplies one.
packages/core/src/fen/core/extensions/register/presenter.fnl:8
fen.core.extensions.register.presenter.active-presenter #
(active-presenter)
Return the first active presenter record, or nil.
packages/core/src/fen/core/extensions/register/presenter.fnl:15
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:23
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:40
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:63
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:71
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:79
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:110
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:121
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:17
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:38
fen.core.extensions.register.prompt.render #
(render ?ctx)
Render all registered prompt fragments in numeric order. Fragment functions
packages/core/src/fen/core/extensions/register/prompt.fnl:66
fen.core.extensions.register.prompt.stats #
(stats ?ctx)
Return per-fragment rendered-size metadata in final render order. Each entry
packages/core/src/fen/core/extensions/register/prompt.fnl:78
fen.core.extensions.register.prompt.list #
(list)
Return prompt fragments in final render order.
packages/core/src/fen/core/extensions/register/prompt.fnl:114
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:23
fen.core.extensions.register.provider.find #
(find name)
Find a provider by its unique registry name. Provider :api is protocol
packages/core/src/fen/core/extensions/register/provider.fnl:33
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:38
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:10
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:26
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:39
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:47
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:57
fen.core.extensions.register.session_backend.set-info! #
(set-info! info ?handle) -> info
Store active session metadata and, when supplied, its backend handle for extension-owned state entries.
packages/core/src/fen/core/extensions/register/session_backend.fnl:66
fen.core.extensions.register.session_backend.append-extension-state! #
(append-extension-state! extension state ?version) -> entry|nil
Append JSON-friendly state owned by one extension to the active session when the backend supports generic entries.
packages/core/src/fen/core/extensions/register/session_backend.fnl:96
fen.core.extensions.register.session_backend.latest-extension-state #
(latest-extension-state extension ?yield-fn ?accept) -> state,entry|nil
Return the latest valid state and entry owned by one extension in the active session.
packages/core/src/fen/core/extensions/register/session_backend.fnl:117
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:130
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:137
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:24
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:32
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:40
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:8
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:29
fen.core.extensions.register.tool.merged #
(merged base)
Return base ++ extension-contributed tools.
packages/core/src/fen/core/extensions/register/tool.fnl:37
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:45
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:7
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:18
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:26
fen.core.extensions.rocks.prepend-tree! #
(prepend-tree! ?tree)
Prepend a rocks tree to package.path/package.cpath when the tree exists.
packages/core/src/fen/core/extensions/rocks.fnl:39
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:58
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:68
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:76
fen.core.extensions.rocks.parse-missing-module #
(parse-missing-module err)
Extract X from Lua's standard module 'X' not found require error.
packages/core/src/fen/core/extensions/rocks.fnl:91
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:97
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:106
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:121
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:136
fen.core.extensions.rocks.build! #
(build! dir) -> exit-code
Build an extension rockspec into the fen rocks tree, compiling Fennel sources in process via the embedded compiler and installing through bundled LuaRocks, returning process-style exit codes.
packages/core/src/fen/core/extensions/rocks.fnl:209
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.registry-version #
number
Monotonic counter bumped by tagged-registry mutations so per-kind list memoization can skip recomputation on unchanged registries.
packages/core/src/fen/core/extensions/state.fnl:177
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.actions-extra #
[Action]
Owner-scoped typed action registry for privileged harness and headless callers, kept separate from model-facing tools.
packages/core/src/fen/core/extensions/state.fnl:57
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:63
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:69
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:75
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:81
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:87
fen.core.extensions.state.input-handlers #
[InputHandler]
Ordered registry of non-slash input handlers consulted before user input starts a turn.
packages/core/src/fen/core/extensions/state.fnl:93
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:99
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:105
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:111
fen.core.extensions.state.reload-core-failures #
table
Core modules whose last reload failed, retained so the next reload retries the complete loaded core set.
packages/core/src/fen/core/extensions/state.fnl:117
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:123
fen.core.extensions.state.dev-overlay #
table|nil
Persistent baseline search paths and active trusted development worktree roots used by the repo-local reload-from command.
packages/core/src/fen/core/extensions/state.fnl:129
fen.core.extensions.state.enqueue! #
function|nil
Interactive extension-installed enqueue bridge, available only while an interactive runtime is live.
packages/core/src/fen/core/extensions/state.fnl:135
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:141
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:147
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:153
fen.core.extensions.state.logs #
[LogRecord]
Bounded persistent ring of sanitized owner-tagged extension log records retained across extension reloads.
packages/core/src/fen/core/extensions/state.fnl:159
fen.core.extensions.state.log-path #
string|nil
Lazily initialized JSONL path where extension log records are mirrored for postmortem inspection.
packages/core/src/fen/core/extensions/state.fnl:165
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:171
fen.core.extensions.test_api #
Module neighborhood graph: DOT · SVG
fen.core.extensions.test_api.reset! #
(reset!)
Wipe all registries IN PLACE so identity references survive reset.
packages/core/src/fen/core/extensions/test_api.fnl:23
fen.core.extensions.test_api.make-runtime-api #
(make-runtime-api ?owner ?manifest ?opts)
Return an uncaptured runtime api for tests that need production-shaped
packages/core/src/fen/core/extensions/test_api.fnl:65
fen.core.extensions.test_api.make #
(make ?owner ?manifest ?opts)
Return a captured api. Resets the global extensions registry so the
packages/core/src/fen/core/extensions/test_api.fnl:70
fen.core.extensions.util #
Module neighborhood graph: DOT · SVG
fen.core.extensions.util.bump-registry-version! #
(bump-registry-version!)
Called by every tagged-registry mutation (register/unregister). List
packages/core/src/fen/core/extensions/util.fnl:5
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:12
fen.core.extensions.util.freeze #
(freeze t)
Read-only recursive proxy. Existing keys and nested tables reject writes.
packages/core/src/fen/core/extensions/util.fnl:25
fen.core.extensions.util.remove-where #
(remove-where t pred)
Mutate t in place, dropping entries where (pred entry index) is true.
packages/core/src/fen/core/extensions/util.fnl:46
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:56
fen.core.extensions.util.add-tagged! #
(add-tagged! list spec owner)
Append a deep-copied contribution to list, tag it with core-reserved
packages/core/src/fen/core/extensions/util.fnl:69
fen.core.extensions.util.set-tagged! #
(set-tagged! dict name spec owner)
Set a deep-copied singleton contribution in dict[name], tagged with
packages/core/src/fen/core/extensions/util.fnl:81
fen.core.llm #
Module neighborhood graph: DOT · SVG
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:5
fen.core.llm.complete #
(complete provider-name model context options ?on-event ?yield-fn)
Dispatch a completion to the named provider. Returns a canonical
packages/core/src/fen/core/llm/init.fnl:14
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:14
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:22
fen.core.llm.models.invalidate-caches! #
(invalidate-caches!) -> nil
Clear the models.json and dynamic provider catalog caches at the explicit reload boundary.
packages/core/src/fen/core/llm/models.fnl:55
fen.core.llm.models.load #
(load)
Returns the providers map. Cached after first successful read and cleared
packages/core/src/fen/core/llm/models.fnl:79
fen.core.llm.models.get-provider #
(get-provider name)
Returns a normalized provider record, or nil if name isn't configured.
packages/core/src/fen/core/llm/models.fnl:101
fen.core.llm.models.register-providers! #
(register-providers!)
Register models.json providers into the extension provider registry.
packages/core/src/fen/core/llm/models.fnl:143
fen.core.llm.models.resolve-api-key #
(resolve-api-key value)
value → resolved string or nil.
packages/core/src/fen/core/llm/models.fnl:41
fen.core.llm.models.looks-like-env-var? #
(looks-like-env-var? s)
Heuristic: an apiKey value that's all uppercase letters / digits /
packages/core/src/fen/core/llm/models.fnl:30
fen.core.llm.models.first-model-id #
(first-model-id provider)
Convenience for default-model selection: pick the first model id declared
packages/core/src/fen/core/llm/models.fnl:106
fen.core.llm.models.available-models #
(available-models opts)
Return flat model refs for registry-backed providers. Env-var and auth
packages/core/src/fen/core/llm/models.fnl:408
fen.core.llm.models.inspect-providers #
(inspect-providers opts query) -> [ProviderInspection]
Return registered providers, offline local readiness, secret-free auth state, optional connectivity checks, and model catalog metadata.
packages/core/src/fen/core/llm/models.fnl:359
fen.core.llm.models.dynamic-cache-snapshot #
(dynamic-cache-snapshot) -> table
Return a secret-free summary of dynamic provider model catalog cache state.
packages/core/src/fen/core/llm/models.fnl:336
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:176
fen.core.llm.models.resolve-model-exact #
(resolve-model-exact query models)
Resolve pi-mono-style exact model refs: canonical provider/id first,
packages/core/src/fen/core/llm/models.fnl:441
fen.core.llm.models.resolve-model #
(resolve-model query models)
Resolve a model query for fen's command-mode v1: exact provider/id or
packages/core/src/fen/core/llm/models.fnl:450
fen.core.llm.models.resolve-cli-model #
(resolve-cli-model query provider-name opts)
Client-side headless --model resolution against a single provider's catalog.
packages/core/src/fen/core/llm/models.fnl:546
fen.core.llm.models.split-model-ref #
(split-model-ref model-ref)
Inverse of canonical-model-id for CLI flag parsing. Splits on the first
packages/core/src/fen/core/llm/models.fnl:184
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:7
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:15
fen.core.prompt.stats #
(stats opts tools) -> [PromptFragmentStat]
Return per-fragment rendered-size metadata (bytes and approximate tokens) for the opts/tools context without exposing fragment text.
packages/core/src/fen/core/prompt.fnl:23
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:10
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:18
fen.core.settings.load #
(load ?p)
Return normalized defaults.json overlaid by mutable settings.json.
packages/core/src/fen/core/settings.fnl:88
fen.core.settings.save! #
(save! settings ?p)
Write settings atomically, preserving any unknown top-level keys already on disk.
packages/core/src/fen/core/settings.fnl:95
fen.core.settings.set-defaults! #
(set-defaults! provider model ?p)
Persist the default provider/model and return normalized settings.
packages/core/src/fen/core/settings.fnl:109
fen.core.settings.adopt-default-if-unset! #
(adopt-default-if-unset! provider model ?p)
Adopt provider/model as the default only when nothing is selected yet. Used
packages/core/src/fen/core/settings.fnl:113
fen.core.settings.set-thinking-default! #
(set-thinking-default! level ?p)
Persist the default provider-neutral thinking level.
packages/core/src/fen/core/settings.fnl:124
fen.core.settings.extension #
(extension name ?path) -> table
Return extension name's merged extensions.<name> settings without the loader-owned enabled flag, or {}.
packages/core/src/fen/core/settings.fnl:128
fen.core.settings.set-extension-enabled! #
(set-extension-enabled! name enabled? ?p)
Persist extensions.<name>.enabled, preserving every other key on disk.
packages/core/src/fen/core/settings.fnl:140
fen.core.storage #
Module neighborhood graph: DOT · SVG
fen.core.storage.read #
(read path)
Return the document's raw string contents, or nil when it does not exist.
packages/core/src/fen/core/storage/init.fnl:9
fen.core.storage.write! #
(write! path content)
Atomically replace the document at path with content. The default
packages/core/src/fen/core/storage/init.fnl:14
fen.core.storage.backends.default #
Module neighborhood graph: DOT · SVG
fen.core.storage.backends.default.read #
(read p)
Read entire file or return nil silently if missing. Config documents are
packages/core/src/fen/core/storage/backends/default.fnl:6
fen.core.storage.backends.default.write! #
(write! p content)
Atomically replace p with content: create the parent directory, write a
packages/core/src/fen/core/storage/backends/default.fnl:15
fen.core.thinking #
Module neighborhood graph: DOT · SVG
fen.core.thinking.LEVELS #
packages/core/src/fen/core/thinking.fnl:59
fen.core.thinking.normalize-level #
(normalize-level level)
Return a canonical keyword level, or nil when invalid/empty.
packages/core/src/fen/core/thinking.fnl:21
fen.core.thinking.valid-level? #
packages/core/src/fen/core/thinking.fnl:59
fen.core.thinking.levels #
packages/core/src/fen/core/thinking.fnl:59
fen.core.thinking.level-list #
packages/core/src/fen/core/thinking.fnl:59
fen.core.thinking.level->provider-options #
(level->provider-options level provider-api)
Map a thinking level to provider options for one provider API. Every
packages/core/src/fen/core/thinking.fnl:47
fen.core.tools #
Module neighborhood graph: DOT · SVG
fen.core.tools.descriptors #
(descriptors reg)
Strip execute/label → canonical Tool[] (the shape providers wrap).
packages/core/src/fen/core/tools.fnl:21
fen.core.tools.execute-call #
(execute-call reg tool-call ctx ?yield-fn)
Execute one canonical ToolCall block and wrap the result as a
packages/core/src/fen/core/tools.fnl:144
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:3
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:10
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:18
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:30
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:39
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:48
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:76
fen.core.types.assistant-error #
(assistant-error api provider model error-message)
Convenience: build an AssistantMessage representing a transport/HTTP failure.
packages/core/src/fen/core/types.fnl:96
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:106
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:113
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:133
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:140
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:93
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:527
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:138
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:500
fen.extensions.agent_state.tool.sanitized-state #
(sanitized-state agent api ?ctx ?yield-fn)
Build the introspection snapshot. Cheap scalar/reference fields are eager;
extensions/behaviors/companions/agent-state/tool.fnl:387
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:9
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:15
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:21
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:27
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:33
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:39
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:45
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.tool_search #
Module neighborhood graph: DOT · SVG
fen.extensions.builtin_tools.tool_search.name #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.tool_search #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.label #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.snippet #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.description #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.parameters #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
fen.extensions.builtin_tools.tool_search.execute #
extensions/behaviors/kernel/builtin-tools/tool_search.fnl:101
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)
Keep the first lines of s up to maxLines / maxBytes.
extensions/behaviors/kernel/builtin-tools/truncate.fnl:101
fen.extensions.builtin_tools.truncate.truncate-tail #
(truncate-tail s opts ?yield-fn)
Keep the last lines of s up to maxLines / maxBytes.
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.text-result #
(text-result text is-error? details)
Wrap plain text and optional details as a canonical AgentToolResult.
extensions/behaviors/kernel/builtin-tools/util.fnl:13
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:17
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:25
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:33
fen.extensions.builtin_tools.util.int-arg #
(int-arg v default)
Normalize integer-ish tool args.
extensions/behaviors/kernel/builtin-tools/util.fnl:41
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:46
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:55
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:6
fen.extensions.builtin_tools.write.write #
AgentToolSpec
Complete write tool specification exported for creating or overwriting files.
extensions/behaviors/kernel/builtin-tools/write.fnl:12
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:18
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:24
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:30
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:36
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:42
fen.extensions.claude_memory #
Module neighborhood graph: DOT · SVG
fen.extensions.claude_memory.inspect #
[?settings]
extensions/behaviors/companions/claude-memory/init.fnl:27
fen.extensions.claude_memory.register #
[api]
extensions/behaviors/companions/claude-memory/init.fnl:68
fen.extensions.compact #
Module neighborhood graph: DOT · SVG
fen.extensions.compact.register #
extensions/behaviors/companions/compact/init.fnl:430
fen.extensions.compact.register! #
extensions/behaviors/companions/compact/init.fnl:430
fen.extensions.compact._test #
extensions/behaviors/companions/compact/init.fnl:430
fen.extensions.decide #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.register #
(register api) -> true
Capture the api handle for the decision service, finish ask-async! tasks left by a previous instance with nil, pump new tasks on each :runtime-tick, and register the observing input handler, its staleness listeners, and /decide undo.
extensions/behaviors/kernel/decide/init.fnl:38
fen.extensions.decide.compaction #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.compaction.rate-tool-results #
(rate-tool-results messages span ?yield!) -> (span dropped)
Rate each older tool result of at least 1 KiB in span and return a copy where results rated >= 0.8 no longer needed are one-line stubs, plus the stub count; returns (span 0) when decide is disabled or never answers. Errors raised by ?yield! (cancellation) propagate.
extensions/behaviors/kernel/decide/compaction.fnl:163
fen.extensions.decide.compaction.ask-good-moment! #
(ask-good-moment! messages on-good) -> nil
Ask in the background whether the last subtask in messages finished, and call (on-good) only when the answer is at least 0.7; does nothing when decide is disabled. The caller re-checks its own conditions inside on-good.
extensions/behaviors/kernel/decide/compaction.fnl:212
fen.extensions.decide.input #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.input.forget-pending! #
(forget-pending! ev) -> nil
Drop pending idle tokens so a late answer for an older prompt never emits a hint; wired to :user and :reset-conversation.
extensions/behaviors/kernel/decide/input.fnl:151
fen.extensions.decide.input.undo! #
(undo!) -> {:ok true :queued true :queue :steering}|{:ok false :error msg}
Move the line last classified as a follow-up back to the steering queue while it is still pending there; backs /decide undo.
extensions/behaviors/kernel/decide/input.fnl:246
fen.extensions.decide.input.on-status-info #
(on-status-info ev) -> nil
Drop the /decide undo record once a :set-status-info event reports an empty follow-up queue, as clear-queues! does for /cancel-all, /new, /resume, and /handoff.
extensions/behaviors/kernel/decide/input.fnl:258
fen.extensions.decide.input.observe! #
(observe! api input ctx) -> nil
Observe one submitted line: an idle prompt starts a background preference and topic-shift check, a plain busy line a background classification; nothing asks while decide is disabled, and the input is never changed.
extensions/behaviors/kernel/decide/input.fnl:271
fen.extensions.decide.jev #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.jev.encode-request #
(encode-request model state questions) -> string
Encode a Decisions API request body for one state and a map of validated noul/choice questions; raises when state is not JSON-encodable.
extensions/behaviors/kernel/decide/jev.fnl:15
fen.extensions.decide.jev.post #
(post body api-key timeout-ms ?yield) -> {:status :body :headers}|{:error}
POST an encoded request to the Decisions API through fen.util.http with an overall timeout and a connect timeout capped at 2s; errors raised by ?yield propagate.
extensions/behaviors/kernel/decide/jev.fnl:28
fen.extensions.decide.jev.parse-response #
(parse-response resp questions) -> (answers usage)|(nil reason)
Map an HTTP response to answers keyed by question id ({:type :noul :noul p} or {:type :choice :choice opt :probabilities tbl :confidence c}) plus the raw usage; any transport error, non-200, malformed body, or missing/mistyped answer returns nil and a reason.
extensions/behaviors/kernel/decide/jev.fnl:82
fen.extensions.decide.openai #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.openai.encode-request #
(encode-request model state questions) -> string
Encode an OpenAI Decisions API request body for one state and a map of validated noul/choice questions; raises when state is not JSON-encodable or a question type is unsupported.
extensions/behaviors/kernel/decide/openai.fnl:34
fen.extensions.decide.openai.post #
(post body api-key timeout-ms ?yield) -> {:status :body :headers}|{:error}
POST an encoded request to the OpenAI Decisions API through fen.util.http with an overall timeout and a connect timeout capped at 2s; errors raised by ?yield propagate.
extensions/behaviors/kernel/decide/openai.fnl:66
fen.extensions.decide.openai.parse-response #
(parse-response resp questions) -> (answers usage)|(nil reason)
Map an OpenAI Decisions HTTP response to answers keyed by question id ({:type :noul :noul p} or {:type :choice :choice opt :probabilities tbl :confidence c}) plus raw usage; transport errors, non-200, malformed bodies, refusals, duplicate answers, or missing/mistyped answers return nil and a reason.
extensions/behaviors/kernel/decide/openai.fnl:130
fen.extensions.decide.service #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.service.max-request-bytes #
number
Byte cap on one encoded decision request (state plus questions); larger requests are skipped and return nil, keeping input well under Jev's 32k-token context. Consumers split or truncate state to fit.
extensions/behaviors/kernel/decide/service.fnl:38
fen.extensions.decide.service.enabled? #
(enabled?) -> boolean
Whether the decide extension is currently loaded, resolved at call time from the loader's status record; false after it is disabled on /reload.
extensions/behaviors/kernel/decide/service.fnl:45
fen.extensions.decide.service.ask #
(ask state questions ?opts) -> answers|nil
Ask the configured decisions backend (Jev on OpenRouter or OpenAI Decisions) typed questions ({id {:type :noul|:choice :instructions str :criteria tbl}}) about one JSON-encodable state; cooperative when ?opts.yield is given, blocking otherwise. Returns answers keyed by id or nil on any failure; errors raised by ?opts.yield propagate.
extensions/behaviors/kernel/decide/service.fnl:128
fen.extensions.decide.service.ask-async! #
(ask-async! state questions on-done) -> nil
Run ask in a cooperative task advanced once per :runtime-tick and call (on-done answers-or-nil) exactly once while the extension stays loaded; immediately with nil when disabled. /reload or disable-then-enable finishes a pending task with nil; presenters without ticks (--print, json) never run it.
extensions/behaviors/kernel/decide/service.fnl:179
fen.extensions.decide.service.finish-pending! #
(finish-pending!)
Finish every pending task with nil without resuming it. Called on each
extensions/behaviors/kernel/decide/service.fnl:199
fen.extensions.decide.service.pump! #
(pump!)
Resume each pending async task once; finished tasks report and drop out.
extensions/behaviors/kernel/decide/service.fnl:208
fen.extensions.decide.state #
Module neighborhood graph: DOT · SVG
fen.extensions.decide.state.api #
extensions/behaviors/kernel/decide/state.fnl:13
fen.extensions.decide.state.tasks #
extensions/behaviors/kernel/decide/state.fnl:13
fen.extensions.decide.state.topic-pending #
extensions/behaviors/kernel/decide/state.fnl:13
fen.extensions.decide.state.preference-pending #
extensions/behaviors/kernel/decide/state.fnl:13
fen.extensions.decide.state.reclassified #
extensions/behaviors/kernel/decide/state.fnl:13
fen.extensions.default_prompt #
Module neighborhood graph: DOT · SVG
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:31
fen.extensions.default_prompt.available-tools-section #
(available-tools-section tools)
List tools that are advertised only after tool_search activation. Always-
extensions/behaviors/kernel/default-prompt/init.fnl:60
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:75
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:147
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:154
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:154
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:162
fen.extensions.default_prompt.prefer #
Module neighborhood graph: DOT · SVG
fen.extensions.default_prompt.prefer.resolve-user-file #
(resolve-user-file) -> string
Resolve the target instruction file for user-scoped preferences, preferring existing user files.
extensions/behaviors/kernel/default-prompt/prefer.fnl:30
fen.extensions.default_prompt.prefer.resolve-project-file #
(resolve-project-file ?start-cwd) -> string
Resolve the target instruction file for project-scoped preferences, checking ancestors leaf-to-root.
extensions/behaviors/kernel/default-prompt/prefer.fnl:42
fen.extensions.default_prompt.prefer.format-entry #
(format-entry existing pref-text) -> string
Format markdown content appending pref-text as a bullet under Preferences.
extensions/behaviors/kernel/default-prompt/prefer.fnl:56
fen.extensions.default_prompt.prefer.save-preference! #
(save-preference! target-path pref-text) -> (boolean, string)
Append a preference bullet to the target markdown file, creating the file or section if absent.
extensions/behaviors/kernel/default-prompt/prefer.fnl:75
fen.extensions.default_prompt.prefer.get-candidate #
(get-candidate) -> string|nil
Return the pending suggested preference candidate, if any.
extensions/behaviors/kernel/default-prompt/prefer.fnl:93
fen.extensions.default_prompt.prefer.set-candidate! #
(set-candidate! ?text) -> nil
Set or clear the pending suggested preference candidate.
extensions/behaviors/kernel/default-prompt/prefer.fnl:101
fen.extensions.default_prompt.prefer.register! #
(register! api ?get-loader) -> true
Register the /prefer command, observe :hint suggestions, and clear stale candidates.
extensions/behaviors/kernel/default-prompt/prefer.fnl:133
fen.extensions.default_prompt.prefer.register #
extensions/behaviors/kernel/default-prompt/prefer.fnl:185
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:74
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:89
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:96
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:103
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:110
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:117
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:571
fen.extensions.docs.contracts #
Module neighborhood graph: DOT · SVG
fen.extensions.docs.contracts.types #
table
Canonical message, content, tool, usage, and agent-context type contracts shared by providers, tools, sessions, and docs.
extensions/behaviors/kernel/docs/contracts.fnl:15
fen.extensions.docs.contracts.register-kinds #
table
Extension registration kind contracts describing required fields for tools, commands, providers, presenters, panels, hooks, and prompt fragments.
extensions/behaviors/kernel/docs/contracts.fnl:172
fen.extensions.docs.contracts.events #
table
Event bus contract table documenting emitted runtime event shapes and fields consumed by presenters and extensions.
extensions/behaviors/kernel/docs/contracts.fnl:335
fen.extensions.docs.contracts.interfaces #
table
Interface contract table for provider, auth backend, session backend, and presenter records.
extensions/behaviors/kernel/docs/contracts.fnl:684
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 with an optional initial query, or by direct index or exact id.
extensions/behaviors/kernel/essentials/commands/model.fnl:214
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:108
fen.extensions.extensions_inspector #
Module neighborhood graph: DOT · SVG
fen.extensions.extensions_inspector.register #
[api]
extensions/behaviors/inspectors/extensions/init.fnl:8
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:606
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.goal #
Module neighborhood graph: DOT · SVG
fen.extensions.goal.register #
extensions/behaviors/companions/goal/init.fnl:843
fen.extensions.goal.register! #
extensions/behaviors/companions/goal/init.fnl:844
fen.extensions.goal._state #
extensions/behaviors/companions/goal/init.fnl:845
fen.extensions.goal._test #
extensions/behaviors/companions/goal/init.fnl:846
fen.extensions.goal.state #
Module neighborhood graph: DOT · SVG
fen.extensions.goal.state.status #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.idle #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.visible? #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.objective #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.iteration-count #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.max-iterations #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.last-result #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.last-error #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.last-reason #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.last-marker #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.compaction-required? #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.last-compaction #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.retry-iteration? #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.started-at #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.active-turn-id #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.updated-at #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.version #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.cached-rows #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.cached-w #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.cached-version #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal.state.session-key #
extensions/behaviors/companions/goal/state.fnl:3
fen.extensions.goal_headless #
Module neighborhood graph: DOT · SVG
fen.extensions.goal_headless.run #
[ctx]
extensions/adapters/presenters/goal_headless/init.fnl:88
fen.extensions.goal_headless.register #
[api]
extensions/adapters/presenters/goal_headless/init.fnl:104
fen.extensions.goal_headless._test #
extensions/adapters/presenters/goal_headless/init.fnl:117
fen.extensions.handoff #
Module neighborhood graph: DOT · SVG
fen.extensions.handoff.register #
extensions/behaviors/companions/handoff/init.fnl:152
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:134
fen.extensions.json #
Module neighborhood graph: DOT · SVG
fen.extensions.json.run #
(run ctx) -> exit-code
Step the agent once and write a structured JSON result blob. Returns a non-zero CLI exit code (1) when the turn failed or the output could not be written, and 0 otherwise, leaving the process exit to the CLI layer.
extensions/adapters/presenters/json/init.fnl:53
fen.extensions.json.register #
[api]
extensions/adapters/presenters/json/init.fnl:80
fen.extensions.mem #
Module neighborhood graph: DOT · SVG
fen.extensions.mem.report-rows #
(report-rows run-state opts ?api)
Build the memory report as a list of {:text :style} rows. Used by
extensions/behaviors/companions/mem/init.fnl:137
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:199
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:266
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:266
fen.extensions.mem._state #
table
Test and diagnostics alias for the persistent memory diagnostics state table.
extensions/behaviors/companions/mem/init.fnl:274
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.plan #
Module neighborhood graph: DOT · SVG
fen.extensions.plan.register #
extensions/behaviors/companions/plan/init.fnl:374
fen.extensions.plan.register! #
extensions/behaviors/companions/plan/init.fnl:375
fen.extensions.plan._state #
extensions/behaviors/companions/plan/init.fnl:376
fen.extensions.plan.state #
Module neighborhood graph: DOT · SVG
fen.extensions.plan.state.mode #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.idle #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.visible? #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.last-plan #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.last-goal #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.last-error #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.last-blocked #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.revision-count #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.run-state #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.active-turn-id #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.updated-at #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.version #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.cached-rows #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.cached-w #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.plan.state.cached-version #
extensions/behaviors/companions/plan/state.fnl:3
fen.extensions.print #
Module neighborhood graph: DOT · SVG
fen.extensions.print.run #
(run ctx) -> exit-code
Execute the one-shot print presenter by stepping the agent with the supplied prompt, printing final text, and returning a non-zero CLI exit code (1) when the turn fails so the CLI layer owns the process exit.
extensions/adapters/presenters/print/init.fnl:31
fen.extensions.print.register #
[api]
extensions/adapters/presenters/print/init.fnl:54
fen.extensions.profiler #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler.register #
[api]
extensions/behaviors/inspectors/profiler/init.fnl:18
fen.extensions.profiler.activity #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler.activity.enabled? #
[]
extensions/behaviors/inspectors/profiler/activity.fnl:8
fen.extensions.profiler.activity.span-begin! #
[name ?metadata]
extensions/behaviors/inspectors/profiler/activity.fnl:10
fen.extensions.profiler.activity.span-end! #
[token]
extensions/behaviors/inspectors/profiler/activity.fnl:13
fen.extensions.profiler.activity.activity! #
[name ?metadata]
extensions/behaviors/inspectors/profiler/activity.fnl:16
fen.extensions.profiler.activity.counter-add! #
[name ?amount]
extensions/behaviors/inspectors/profiler/activity.fnl:22
fen.extensions.profiler.commands #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler.commands.execute-tool #
(execute-tool args ctx) -> ToolResultMessage
Adapt profile-tool arguments to the profiler command implementation.
extensions/behaviors/inspectors/profiler/commands.fnl:125
fen.extensions.profiler.commands.register #
(register api) -> nil
Register /profile controls and a cheap profiler-state introspection snapshot.
extensions/behaviors/inspectors/profiler/commands.fnl:144
fen.extensions.profiler.export #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler.export.model-output-dir #
(model-output-dir output)
Confine an untrusted tool argument to the profile artifact root. Human
extensions/behaviors/inspectors/profiler/export.fnl:150
fen.extensions.profiler.export.default-output-dir #
[]
extensions/behaviors/inspectors/profiler/export.fnl:166
fen.extensions.profiler.export.save! #
(save! output-dir?) -> {dir, speedscope, folded, metadata}
Export the current bounded statistical capture as Speedscope JSON, folded stacks, and explicit metadata.
extensions/behaviors/inspectors/profiler/export.fnl:184
fen.extensions.profiler.export.snapshot #
[]
extensions/behaviors/inspectors/profiler/export.fnl:201
fen.extensions.profiler.state #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler.state.record-wall-gap! #
[gap]
extensions/behaviors/inspectors/profiler/state.fnl:181
fen.extensions.profiler.state.span-begin! #
[name ?metadata]
extensions/behaviors/inspectors/profiler/state.fnl:188
fen.extensions.profiler.state.span-end! #
[token]
extensions/behaviors/inspectors/profiler/state.fnl:206
fen.extensions.profiler.state.counter-add! #
[name ?amount]
extensions/behaviors/inspectors/profiler/state.fnl:217
fen.extensions.profiler.state.mark! #
[name]
extensions/behaviors/inspectors/profiler/state.fnl:230
fen.extensions.profiler.state.start! #
[opts]
extensions/behaviors/inspectors/profiler/state.fnl:251
fen.extensions.profiler.state.stop! #
[]
extensions/behaviors/inspectors/profiler/state.fnl:297
fen.extensions.profiler.state.reset! #
[]
extensions/behaviors/inspectors/profiler/state.fnl:312
fen.extensions.profiler.state.elapsed-wall-ms #
[]
extensions/behaviors/inspectors/profiler/state.fnl:317
fen.extensions.profiler.state.elapsed-cpu #
[]
extensions/behaviors/inspectors/profiler/state.fnl:322
fen.extensions.profiler_tool #
Module neighborhood graph: DOT · SVG
fen.extensions.profiler_tool.register #
[api]
extensions/behaviors/inspectors/profiler-tool/init.fnl:7
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:91
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:16
fen.extensions.provider_anthropic.anthropic_messages #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_anthropic.anthropic_messages.api #
keyword
Provider API family keyword used by registry metadata for the Anthropic Messages adapter.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:633
fen.extensions.provider_anthropic.anthropic_messages.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the Anthropic adapter.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:638
fen.extensions.provider_anthropic.anthropic_messages.default-base-url #
string
Default Anthropic Messages endpoint used when provider options do not override base-url.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:643
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:648
fen.extensions.provider_anthropic.anthropic_messages.convert-messages #
(convert-messages messages _system-prompt)
Canonical Messages → Anthropic MessageParam[]. The system prompt is NOT
extensions/adapters/providers/anthropic/anthropic_messages.fnl:98
fen.extensions.provider_anthropic.anthropic_messages.convert-tools #
(convert-tools tools)
Canonical Tool[] → Anthropic Tool[] (flat, with input_schema).
extensions/adapters/providers/anthropic/anthropic_messages.fnl:151
fen.extensions.provider_anthropic.anthropic_messages.map-stop-reason #
(map-stop-reason reason)
Anthropic stop_reason → canonical StopReason. Mirrors pi-mono
extensions/adapters/providers/anthropic/anthropic_messages.fnl:164
fen.extensions.provider_anthropic.anthropic_messages.parse-response #
(parse-response resp model)
Anthropic response → canonical AssistantMessage.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:187
fen.extensions.provider_anthropic.anthropic_messages.process-stream-event! #
(process-stream-event! state ev emit)
Consume one decoded Anthropic Messages stream event table.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:549
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:648
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:580
fen.extensions.provider_anthropic.anthropic_messages.finalize-stream #
(finalize-stream state parser parser-error model resp on-event)
Shared post-request handling for the streaming pipeline.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:600
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, options.tool-choice :none (tool_choice {type: none}), and optional thinking budget. Tool-less requests whose history contains tool blocks get inert stub tools with tool_choice none.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:284
fen.extensions.provider_anthropic.anthropic_messages.list-models #
string
Default anthropic-version header sent with Messages API requests.
extensions/adapters/providers/anthropic/anthropic_messages.fnl:648
fen.extensions.provider_anthropic.anthropic_messages.complete #
(complete model context options ?on-event ?yield-fn)
Single entry. Routes by ?on-event / ?yield-fn:
extensions/adapters/providers/anthropic/anthropic_messages.fnl:613
fen.extensions.provider_mock #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_mock.register #
[api]
extensions/adapters/providers/mock/init.fnl:18
fen.extensions.provider_mock.mock_provider #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_mock.mock_provider.api #
keyword
Provider API family keyword for the deterministic mock adapter.
extensions/adapters/providers/mock/mock_provider.fnl:183
fen.extensions.provider_mock.mock_provider.provider #
keyword
Provider owner keyword stamped on canonical assistant messages emitted by the mock adapter.
extensions/adapters/providers/mock/mock_provider.fnl:188
fen.extensions.provider_mock.mock_provider.default-model #
keyword
Provider owner keyword stamped on canonical assistant messages emitted by the mock adapter.
extensions/adapters/providers/mock/mock_provider.fnl:188
fen.extensions.provider_mock.mock_provider.mock #
keyword
Provider owner keyword stamped on canonical assistant messages emitted by the mock adapter.
extensions/adapters/providers/mock/mock_provider.fnl:188
fen.extensions.provider_mock.mock_provider.models #
keyword
Provider owner keyword stamped on canonical assistant messages emitted by the mock adapter.
extensions/adapters/providers/mock/mock_provider.fnl:188
fen.extensions.provider_mock.mock_provider.complete #
(complete model context options ?on-event ?yield-fn) -> AssistantMessage
Deterministic provider entry point. Builds a canonical AssistantMessage from the resolved mock script (or an echo default) and, when streaming, replays it through a local block-event synthesizer. When options.mock-record is a table, appends a snapshot of each outbound call (model, options, tool-choice, system-prompt, tools, copied messages) so tests can assert what the agent sent. Performs no network I/O.
extensions/adapters/providers/mock/mock_provider.fnl:157
fen.extensions.provider_mock.mock_provider.spec->assistant #
(spec->assistant spec model) -> AssistantMessage
Normalize a mock turn spec (string or table) into a canonical AssistantMessage; stop-reason defaults to :tool-use when the turn calls a tool, else :stop.
extensions/adapters/providers/mock/mock_provider.fnl:78
fen.extensions.provider_openai #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.register #
[api]
extensions/adapters/providers/openai/init.fnl:45
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)
Return fen's writable auth directory. Kept as the public name because
extensions/adapters/providers/openai/openai_codex_keychain.fnl:24
fen.extensions.provider_openai.openai_codex_keychain.default-auth-path #
(default-auth-path)
Return fen's writable auth.json path.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:29
fen.extensions.provider_openai.openai_codex_keychain.candidate-read-auth-paths #
(candidate-read-auth-paths)
Return auth.json paths checked for credentials. Fen only reads its
extensions/adapters/providers/openai/openai_codex_keychain.fnl:33
fen.extensions.provider_openai.openai_codex_keychain.load #
(load ?path)
Read one auth.json and return the decoded table. Returns {} if missing,
extensions/adapters/providers/openai/openai_codex_keychain.fnl:64
fen.extensions.provider_openai.openai_codex_keychain.get #
(get provider-id ?path)
Return a provider record. With an explicit path, read only that file.
extensions/adapters/providers/openai/openai_codex_keychain.fnl:80
fen.extensions.provider_openai.openai_codex_keychain.save #
(save data ?path)
Atomic write of the entire auth.json table. Creates the parent directory
extensions/adapters/providers/openai/openai_codex_keychain.fnl:85
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:116
fen.extensions.provider_openai.openai_codex_login #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_login.AUTHORIZE-URL #
string
ChatGPT OAuth authorization endpoint used by the manual Codex PKCE login flow.
extensions/adapters/providers/openai/openai_codex_login.fnl:234
fen.extensions.provider_openai.openai_codex_login.REDIRECT-URI #
string
Localhost redirect URI registered for the ChatGPT Codex OAuth client and shown in pasted callback URLs.
extensions/adapters/providers/openai/openai_codex_login.fnl:239
fen.extensions.provider_openai.openai_codex_login.SCOPE #
string
OAuth scope string requesting identity, email/profile, and offline refresh-token access.
extensions/adapters/providers/openai/openai_codex_login.fnl:244
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:249
fen.extensions.provider_openai.openai_codex_login.generate-pkce #
(generate-pkce)
Return a fresh PKCE pair: {:verifier ... :challenge ...} where
extensions/adapters/providers/openai/openai_codex_login.fnl:66
fen.extensions.provider_openai.openai_codex_login.build-authorize-url #
(build-authorize-url pkce state)
Compose the authorization URL the user opens in their browser.
extensions/adapters/providers/openai/openai_codex_login.fnl:75
fen.extensions.provider_openai.openai_codex_login.parse-authorization-input #
(parse-authorization-input input)
Accept the full callback URL the user pastes (e.g.
extensions/adapters/providers/openai/openai_codex_login.fnl:109
fen.extensions.provider_openai.openai_codex_login.extract-query-param #
(extract-query-param query key)
Lift key=value out of an &-separated query string. Returns the
extensions/adapters/providers/openai/openai_codex_login.fnl:90
fen.extensions.provider_openai.openai_codex_login.exchange-code! #
(exchange-code! code verifier)
POST to the token endpoint with grant_type=authorization_code.
extensions/adapters/providers/openai/openai_codex_login.fnl:133
fen.extensions.provider_openai.openai_codex_login.login! #
(login! ?path)
Run the full PKCE login flow. Prints the authorize URL, prompts for
extensions/adapters/providers/openai/openai_codex_login.fnl:191
fen.extensions.provider_openai.openai_codex_login.logout! #
(logout! ?path)
Remove the openai-codex record from auth.json. No-op (with a
extensions/adapters/providers/openai/openai_codex_login.fnl:217
fen.extensions.provider_openai.openai_codex_oauth #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_oauth.PROVIDER-ID #
keyword
Auth storage provider id used for openai-codex credential records in auth.json.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:164
fen.extensions.provider_openai.openai_codex_oauth.TOKEN-URL #
string
OpenAI OAuth token endpoint used for Codex PKCE exchange and refresh-token grants.
extensions/adapters/providers/openai/openai_codex_oauth.fnl:169
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:174
fen.extensions.provider_openai.openai_codex_oauth.decode-jwt #
(decode-jwt token)
Decode a JWT and return its payload as a Lua table. Does NOT verify
extensions/adapters/providers/openai/openai_codex_oauth.fnl:38
fen.extensions.provider_openai.openai_codex_oauth.extract-account-id #
(extract-account-id access-token)
Pull the chatgpt_account_id from the JWT payload's
extensions/adapters/providers/openai/openai_codex_oauth.fnl:48
fen.extensions.provider_openai.openai_codex_oauth.refresh! #
(refresh! refresh-token ?opts)
POST to the token endpoint with refresh_token grant. Returns the fresh
extensions/adapters/providers/openai/openai_codex_oauth.fnl:84
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:120
fen.extensions.provider_openai.openai_codex_oauth.configured? #
(configured? ?path)
Return true when auth.json contains a structurally usable openai-codex
extensions/adapters/providers/openai/openai_codex_oauth.fnl:145
fen.extensions.provider_openai.openai_codex_oauth.get-fresh-creds! #
(get-fresh-creds! ?path ?opts)
Read auth.json, refresh the openai-codex record if it's missing, expired,
extensions/adapters/providers/openai/openai_codex_oauth.fnl:152
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:71
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:61
fen.extensions.provider_openai.openai_codex_responses #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_codex_responses.api #
keyword
Provider API family keyword used by registry metadata for the ChatGPT Codex Responses adapter.
extensions/adapters/providers/openai/openai_codex_responses.fnl:339
fen.extensions.provider_openai.openai_codex_responses.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the Codex adapter.
extensions/adapters/providers/openai/openai_codex_responses.fnl:344
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:349
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:50
fen.extensions.provider_openai.openai_codex_responses.build-models-url #
(build-models-url base-url ?client-version) -> string
Normalize a ChatGPT backend base URL into the Codex model catalog endpoint.
extensions/adapters/providers/openai/openai_codex_responses.fnl:58
fen.extensions.provider_openai.openai_codex_responses.map-codex-event #
(map-codex-event ev)
Codex emits response.done and response.incomplete aliases for
extensions/adapters/providers/openai/openai_codex_responses.fnl:113
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:99
fen.extensions.provider_openai.openai_codex_responses.detect-user-agent #
(detect-user-agent)
Best-effort pi (linux ${release}; ${arch}). Falls back to pi (lua)
extensions/adapters/providers/openai/openai_codex_responses.fnl:78
fen.extensions.provider_openai.openai_codex_responses.merge-options #
(merge-options opts)
Set Codex-specific defaults onto the per-call options table without
extensions/adapters/providers/openai/openai_codex_responses.fnl:136
fen.extensions.provider_openai.openai_codex_responses.parse-models #
(parse-models decoded)
Keep only list-visible models supported by the Codex Responses API. Hidden
extensions/adapters/providers/openai/openai_codex_responses.fnl:155
fen.extensions.provider_openai.openai_codex_responses.append-pinned-models #
(append-pinned-models models catalog-models)
Append known Codex models absent from the authenticated catalog.
extensions/adapters/providers/openai/openai_codex_responses.fnl:170
fen.extensions.provider_openai.openai_codex_responses.pinned-models #
string
Default ChatGPT backend API root used by the Codex Responses adapter before appending /codex/responses.
extensions/adapters/providers/openai/openai_codex_responses.fnl:349
fen.extensions.provider_openai.openai_codex_responses.list-models #
(list-models opts) -> [{:id string}]
Fetch the authenticated ChatGPT/Codex model catalog.
extensions/adapters/providers/openai/openai_codex_responses.fnl:245
fen.extensions.provider_openai.openai_codex_responses.complete #
(complete model context options ?on-event ?yield-fn)
Single entry. Drives the same Codex SSE pipeline regardless of caller —
extensions/adapters/providers/openai/openai_codex_responses.fnl:272
fen.extensions.provider_openai.openai_completions #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_completions.api #
keyword
Provider API family keyword used by registry metadata for the Chat Completions adapter.
extensions/adapters/providers/openai/openai_completions.fnl:793
fen.extensions.provider_openai.openai_completions.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the Chat Completions adapter.
extensions/adapters/providers/openai/openai_completions.fnl:798
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:803
fen.extensions.provider_openai.openai_completions.build-url #
(build-url base-url)
Mirror pi-mono's models.json convention: baseUrl is the v1 root
extensions/adapters/providers/openai/openai_completions.fnl:48
fen.extensions.provider_openai.openai_completions.convert-messages #
(convert-messages messages system-prompt compat ?flavor)
Canonical Messages + optional system prompt → OpenAI ChatCompletionMessageParam[].
extensions/adapters/providers/openai/openai_completions.fnl:176
fen.extensions.provider_openai.openai_completions.convert-tools #
(convert-tools tools)
Canonical Tool[] → OpenAI tool-function[].
extensions/adapters/providers/openai/openai_completions.fnl:198
fen.extensions.provider_openai.openai_completions.map-stop-reason #
(map-stop-reason reason)
OpenAI finish_reason → canonical StopReason. Mirrors pi-mono
extensions/adapters/providers/openai/openai_completions.fnl:213
fen.extensions.provider_openai.openai_completions.parse-response #
(parse-response resp model ?flavor)
OpenAI response → canonical AssistantMessage.
extensions/adapters/providers/openai/openai_completions.fnl:323
fen.extensions.provider_openai.openai_completions.process-stream-chunk! #
(process-stream-chunk! state chunk emit)
Consume one decoded OpenAI ChatCompletionChunk-like table.
extensions/adapters/providers/openai/openai_completions.fnl:634
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:803
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:710
fen.extensions.provider_openai.openai_completions.finalize-stream #
(finalize-stream state parser parser-error model resp on-event)
Shared post-request handling for the streaming pipeline.
extensions/adapters/providers/openai/openai_completions.fnl:742
fen.extensions.provider_openai.openai_completions.build-body #
(build-body model context max-tokens compat options ?flavor)
Build the chat-completions request body. compat is an optional table of
extensions/adapters/providers/openai/openai_completions.fnl:417
fen.extensions.provider_openai.openai_completions.build-request-opts #
(build-request-opts model context options ?on-chunk ?flavor)
Assemble a fen.util.http opts table for a Chat Completions POST. When
extensions/adapters/providers/openai/openai_completions.fnl:450
fen.extensions.provider_openai.openai_completions.list-models #
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:803
fen.extensions.provider_openai.openai_completions.complete-with #
(complete-with flavor model context options ?on-event ?yield-fn)
complete for an OpenAI-compatible flavor (see OPENAI-FLAVOR). Adapters
extensions/adapters/providers/openai/openai_completions.fnl:756
fen.extensions.provider_openai.openai_completions.complete #
(complete model context options ?on-event ?yield-fn)
Single entry. Routes by ?on-event / ?yield-fn:
extensions/adapters/providers/openai/openai_completions.fnl:783
fen.extensions.provider_openai.openai_model_catalog #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_model_catalog.list-models #
extensions/adapters/providers/openai/openai_model_catalog.fnl:49
fen.extensions.provider_openai.openai_model_catalog.models-url #
extensions/adapters/providers/openai/openai_model_catalog.fnl:49
fen.extensions.provider_openai.openai_responses #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.openai_responses.api #
keyword
Provider API family keyword used by registry metadata for the OpenAI Responses adapter.
extensions/adapters/providers/openai/openai_responses.fnl:110
fen.extensions.provider_openai.openai_responses.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the Responses adapter.
extensions/adapters/providers/openai/openai_responses.fnl:115
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:120
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:43
fen.extensions.provider_openai.openai_responses.build-body #
(build-body model context max-tokens options)
Build a vanilla OpenAI Responses request body through the shared
extensions/adapters/providers/openai/openai_responses.fnl:62
fen.extensions.provider_openai.openai_responses.build-request-opts #
(build-request-opts model context options on-chunk)
Assemble a fen.util.http opts table for a vanilla OpenAI Responses POST via
extensions/adapters/providers/openai/openai_responses.fnl:69
fen.extensions.provider_openai.openai_responses.make-stream-pipeline #
(make-stream-pipeline model on-event event-mapper)
Delegate parser/reducer setup to the OpenAI-compatible shared helper.
extensions/adapters/providers/openai/openai_responses.fnl:76
fen.extensions.provider_openai.openai_responses.finalize-stream #
(finalize-stream state parser parser-error model resp on-event ?request-opts)
Delegate to the shared Responses finalizer with this module's API/provider
extensions/adapters/providers/openai/openai_responses.fnl:80
fen.extensions.provider_openai.openai_responses.merge-options #
(merge-options opts)
Return a copy of per-call options with vanilla Responses defaults applied.
extensions/adapters/providers/openai/openai_responses.fnl:51
fen.extensions.provider_openai.openai_responses.list-models #
string
Default OpenAI v1 API root used by the Responses adapter before appending /responses.
extensions/adapters/providers/openai/openai_responses.fnl:120
fen.extensions.provider_openai.openai_responses.complete #
(complete model context options ?on-event ?yield-fn)
Single entry. Always streams under the hood; transports differ —
extensions/adapters/providers/openai/openai_responses.fnl:92
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:1009
fen.extensions.provider_openai.openai_responses_shared.build-body #
(build-body model context max-tokens options ?id)
Build a Responses request body. The system prompt rides in instructions,
extensions/adapters/providers/openai/openai_responses_shared.fnl:1019
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:1099
fen.extensions.provider_openai.openai_responses_shared.make-stream-pipeline #
(make-stream-pipeline model on-event event-mapper)
Build a fresh (state parser parser-error) tuple for one streaming POST.
extensions/adapters/providers/openai/openai_responses_shared.fnl:1073
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:1132
fen.extensions.provider_openai.openai_responses_shared.convert-messages #
(convert-messages messages ?id)
Canonical Messages → Responses ResponseInput list. The system prompt
extensions/adapters/providers/openai/openai_responses_shared.fnl:400
fen.extensions.provider_openai.openai_responses_shared.convert-tools #
(convert-tools tools)
Canonical Tool[] → Responses tools[]. No function:{...} wrapper, unlike
extensions/adapters/providers/openai/openai_responses_shared.fnl:487
fen.extensions.provider_openai.openai_responses_shared.map-stop-reason #
(map-stop-reason status)
Responses API ResponseStatus → canonical StopReason.
extensions/adapters/providers/openai/openai_responses_shared.fnl:516
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:536
fen.extensions.provider_openai.openai_responses_shared.process-event! #
(process-event! state event emit)
Dispatch one decoded Responses event into the reducer state.
extensions/adapters/providers/openai/openai_responses_shared.fnl:940
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:987
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:562
fen.extensions.provider_openai.openai_responses_shared.write-failure-diagnostic! #
(write-failure-diagnostic! api provider model resp ?request-opts reason)
Persist a redacted provider failure diagnostic and return its path.
extensions/adapters/providers/openai/openai_responses_shared.fnl:242
fen.extensions.provider_openai.openai_responses_shared.failure-diagnostic #
(failure-diagnostic api provider model resp ?request-opts reason)
Build a JSON-serializable provider failure diagnostic. The default body
extensions/adapters/providers/openai/openai_responses_shared.fnl:216
fen.extensions.provider_openai.openai_responses_shared.attach-diagnostic! #
(attach-diagnostic! asst path)
Append a diagnostic file path to a provider error AssistantMessage.
extensions/adapters/providers/openai/openai_responses_shared.fnl:270
fen.extensions.provider_openai.openai_responses_shared.redact-headers #
(redact-headers headers)
Copy HTTP headers with credentials/account identifiers redacted.
extensions/adapters/providers/openai/openai_responses_shared.fnl:61
fen.extensions.provider_openai.openai_responses_shared.summarize-body #
(summarize-body body)
Summarize a Responses request body without prompt/tool-result text.
extensions/adapters/providers/openai/openai_responses_shared.fnl:153
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:1209
fen.extensions.provider_openai.openai_responses_shared.split-compound-id #
(split-compound-id id)
Tool call ids are stored canonically as call_id|item_id because the
extensions/adapters/providers/openai/openai_responses_shared.fnl:293
fen.extensions.provider_openai.openai_responses_shared.parse-streaming-json #
(parse-streaming-json s)
Best-effort parse: returns {} for nil/empty/invalid JSON during streaming.
extensions/adapters/providers/openai/openai_responses_shared.fnl:528
fen.extensions.provider_openai.usage #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.usage.parse #
[body]
extensions/adapters/providers/openai/usage.fnl:27
fen.extensions.provider_openai.usage.cache-path #
[]
extensions/adapters/providers/openai/usage.fnl:58
fen.extensions.provider_openai.usage.load-cache #
[key ?force]
extensions/adapters/providers/openai/usage.fnl:79
fen.extensions.provider_openai.usage.save-cache #
[]
extensions/adapters/providers/openai/usage.fnl:137
fen.extensions.provider_openai.usage.snapshot #
[]
extensions/adapters/providers/openai/usage.fnl:167
fen.extensions.provider_openai.usage.record-limit #
[details account-id ?yield]
extensions/adapters/providers/openai/usage.fnl:230
fen.extensions.provider_openai.usage.refresh #
[?yield]
extensions/adapters/providers/openai/usage.fnl:257
fen.extensions.provider_openai.usage.label #
[w]
extensions/adapters/providers/openai/usage.fnl:301
fen.extensions.provider_openai.usage.remaining #
[w now]
extensions/adapters/providers/openai/usage.fnl:309
fen.extensions.provider_openai.usage.style #
[remaining stale?]
extensions/adapters/providers/openai/usage.fnl:312
fen.extensions.provider_openai.usage.status #
[snapshot width now]
extensions/adapters/providers/openai/usage.fnl:318
fen.extensions.provider_openai.usage.relative #
[seconds]
extensions/adapters/providers/openai/usage.fnl:339
fen.extensions.provider_openai.usage.rows #
[snapshot width now]
extensions/adapters/providers/openai/usage.fnl:348
fen.extensions.provider_openai.usage.register #
[api]
extensions/adapters/providers/openai/usage.fnl:414
fen.extensions.provider_openai.usage_state #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openai.usage_state.windows #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.retrieved-at #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.attempted-at #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.failure #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.unavailable #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.account-key #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.file-sig #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.last-llm-provider #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.visible? #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openai.usage_state.refresh-co #
extensions/adapters/providers/openai/usage_state.fnl:2
fen.extensions.provider_openrouter #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openrouter.register #
[api]
extensions/adapters/providers/openrouter/init.fnl:22
fen.extensions.provider_openrouter.openrouter_completions #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_openrouter.openrouter_completions.api #
keyword
Provider API keyword (openrouter-completions); models.json providers with this api delegate to the OpenRouter adapter.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:305
fen.extensions.provider_openrouter.openrouter_completions.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the OpenRouter adapter.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:310
fen.extensions.provider_openrouter.openrouter_completions.default-base-url #
[{:id string}]
Curated tool-capable OpenRouter model ids; the first entry is the provider default.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:315
fen.extensions.provider_openrouter.openrouter_completions.models #
[{:id string}]
Curated tool-capable OpenRouter model ids; the first entry is the provider default.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:315
fen.extensions.provider_openrouter.openrouter_completions.reasoning-config #
(reasoning-config options) -> table|nil
Map fen thinking options to OpenRouter's normalized reasoning object; thinking-budget beats reasoning-effort beats thinking-level, only reasoning-effort none/off disables, and nil (including thinking-level off) leaves the model default.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:77
fen.extensions.provider_openrouter.openrouter_completions.cache-breakpoints? #
(cache-breakpoints? model) -> boolean
True for Anthropic and Google models, whose upstreams only prompt-cache at explicit cache_control breakpoints.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:106
fen.extensions.provider_openrouter.openrouter_completions.add-cache-breakpoints! #
(add-cache-breakpoints! messages) -> messages
Mark the system prompt and the latest user/tool message with ephemeral cache_control breakpoints (two of Anthropic's four).
extensions/adapters/providers/openrouter/openrouter_completions.fnl:136
fen.extensions.provider_openrouter.openrouter_completions.patch-headers #
(patch-headers headers opts streaming?) -> table
Add OpenRouter app attribution headers (HTTP-Referer, X-OpenRouter-Title, X-OpenRouter-Categories) to a Chat Completions request.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:158
fen.extensions.provider_openrouter.openrouter_completions.patch-body #
(patch-body body model context opts streaming?) -> table
Apply OpenRouter request policy to a Chat Completions body: reasoning object (omitted for models the live catalog marks as non-reasoning), require_parameters routing, sticky session_id, and cache_control breakpoints.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:169
fen.extensions.provider_openrouter.openrouter_completions.build-request-opts #
(build-request-opts model context options ?on-chunk) -> table
Assemble the fen.util.http opts for an OpenRouter Chat Completions POST (streaming when ?on-chunk is given).
extensions/adapters/providers/openrouter/openrouter_completions.fnl:209
fen.extensions.provider_openrouter.openrouter_completions.curate-models #
(curate-models decoded wanted declared?) -> [{:id string :context-window number? :reasoning? boolean?}]
Match wanted model ids against a decoded /models catalog in wanted order, enriched with context length and reasoning support; the curated list keeps only live ids, a declared (models.json) list keeps every id.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:251
fen.extensions.provider_openrouter.openrouter_completions.list-models #
(list-models opts) -> [{:id string :context-window number? :reasoning? boolean?}]
Fetch OpenRouter's /models catalog and return the configured ids: every id of a models.json override (opts.models), else the curated ids that are live.
extensions/adapters/providers/openrouter/openrouter_completions.fnl:275
fen.extensions.provider_openrouter.openrouter_completions.complete #
(complete model context options ?on-event ?yield-fn)
Streams when ?on-event is given, else a single POST; cooperative when
extensions/adapters/providers/openrouter/openrouter_completions.fnl:217
fen.extensions.provider_sakana #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_sakana.register #
[api]
extensions/adapters/providers/sakana/init.fnl:27
fen.extensions.provider_sakana.sakana_responses #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_sakana.sakana_responses.api #
keyword
Provider API family keyword (openai-responses) used by registry metadata for the Sakana adapter.
extensions/adapters/providers/sakana/sakana_responses.fnl:202
fen.extensions.provider_sakana.sakana_responses.provider #
keyword
Provider owner keyword used on canonical assistant messages emitted by the Sakana adapter.
extensions/adapters/providers/sakana/sakana_responses.fnl:207
fen.extensions.provider_sakana.sakana_responses.default-base-url #
string
Default Sakana API root used before appending /responses.
extensions/adapters/providers/sakana/sakana_responses.fnl:212
fen.extensions.provider_sakana.sakana_responses.build-url #
(build-url base-url) -> string
Normalize a Sakana base URL into the /responses endpoint while preserving already-qualified Responses URLs.
extensions/adapters/providers/sakana/sakana_responses.fnl:32
fen.extensions.provider_sakana.sakana_responses.build-models-url #
(build-models-url base-url) -> string
Normalize a Sakana base URL into the /models catalog endpoint.
extensions/adapters/providers/sakana/sakana_responses.fnl:40
fen.extensions.provider_sakana.sakana_responses.clamp-reasoning-effort #
(clamp-reasoning-effort effort)
Sakana rejects every reasoning effort except high and xhigh. Map
extensions/adapters/providers/sakana/sakana_responses.fnl:58
fen.extensions.provider_sakana.sakana_responses.request-headers #
(request-headers api-key) -> table
Build Sakana streaming request headers, adding an Authorization Bearer line only when an API key is present.
extensions/adapters/providers/sakana/sakana_responses.fnl:67
fen.extensions.provider_sakana.sakana_responses.parse-models #
(parse-models decoded)
Accept the standard OpenAI-compatible {data:[{id}]} shape, plus a tolerant
extensions/adapters/providers/sakana/sakana_responses.fnl:81
fen.extensions.provider_sakana.sakana_responses.list-models #
(list-models opts) -> [{:id string}]
Fetch Sakana's authenticated model catalog from /v1/models.
extensions/adapters/providers/sakana/sakana_responses.fnl:92
fen.extensions.provider_sakana.sakana_responses.merge-options #
(merge-options opts)
Return a copy of the per-call options with Sakana's constraints applied,
extensions/adapters/providers/sakana/sakana_responses.fnl:132
fen.extensions.provider_sakana.sakana_responses.complete #
(complete model context options ?on-event ?yield-fn)
Single entry. Always streams under the hood; blocking when no yield-fn is
extensions/adapters/providers/sakana/sakana_responses.fnl:150
fen.extensions.provider_shared #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_shared.register #
[_api]
extensions/adapters/providers/shared/init.fnl:11
fen.extensions.provider_shared.retry #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_shared.retry.DEFAULT-MAX-ATTEMPTS #
number
Default maximum number of provider HTTP attempts, including the initial try and transient retries.
extensions/adapters/providers/shared/retry.fnl:9
fen.extensions.provider_shared.retry.DEFAULT-BASE-DELAY-MS #
number
Default base delay in milliseconds used as the first exponential-backoff jitter cap.
extensions/adapters/providers/shared/retry.fnl:16
fen.extensions.provider_shared.retry.DEFAULT-MAX-DELAY-MS #
number
Default maximum jitter cap in milliseconds for provider retry backoff delays.
extensions/adapters/providers/shared/retry.fnl:23
fen.extensions.provider_shared.retry.transient? #
(transient? status err-message ?curl-code)
True when a provider HTTP/transport failure is worth retrying.
extensions/adapters/providers/shared/retry.fnl:64
fen.extensions.provider_shared.retry.mark-incomplete-stream #
(mark-incomplete-stream resp incomplete?)
Tag a clean 2xx streaming response that ended without a terminal event so
extensions/adapters/providers/shared/retry.fnl:162
fen.extensions.provider_shared.retry.options #
(options provider ?opts ?on-event)
Build with-retry options shared by provider adapters.
extensions/adapters/providers/shared/retry.fnl:177
fen.extensions.provider_shared.retry.parse-retry-after #
(parse-retry-after headers)
Return delay-ms from Retry-After/retry-after-ms headers, or nil.
extensions/adapters/providers/shared/retry.fnl:111
fen.extensions.provider_shared.retry.backoff-delay #
(backoff-delay attempt base-ms max-ms)
Exponential backoff with full jitter.
extensions/adapters/providers/shared/retry.fnl:124
fen.extensions.provider_shared.retry.with-retry #
(with-retry opts make-request ?yield!)
Run make-request with conservative retry on transient HTTP/transport errors.
extensions/adapters/providers/shared/retry.fnl:199
fen.extensions.provider_shared.streaming #
Module neighborhood graph: DOT · SVG
fen.extensions.provider_shared.streaming.make-stream-pipeline #
(make-stream-pipeline config)
Build a fresh (state parser parser-error) tuple.
extensions/adapters/providers/shared/streaming.fnl:32
fen.extensions.provider_shared.streaming.build-request-opts #
(build-request-opts spec model context options ?on-chunk)
Assemble a fen.util.http opts table for a provider POST.
extensions/adapters/providers/shared/streaming.fnl:46
fen.extensions.provider_shared.streaming.finalize-stream-state #
(finalize-stream-state config)
Shared reducer-state finalization for streaming providers.
extensions/adapters/providers/shared/streaming.fnl:67
fen.extensions.provider_shared.streaming.finalize-stream #
(finalize-stream config)
Shared post-request handling for streaming pipelines.
extensions/adapters/providers/shared/streaming.fnl:93
fen.extensions.provider_shared.streaming.complete-streaming #
(complete-streaming config)
Shared provider entry loop for adapters that always stream, even when the
extensions/adapters/providers/shared/streaming.fnl:133
fen.extensions.provider_shared.streaming.complete #
(complete config)
Shared provider entry loop.
extensions/adapters/providers/shared/streaming.fnl:169
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:148
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.rpc #
Module neighborhood graph: DOT · SVG
fen.extensions.rpc.forward! #
(forward! ch ev)
Forward a bus event when it is a wire display event type.
extensions/adapters/presenters/rpc/init.fnl:64
fen.extensions.rpc.init #
(init ctx)
Open the channel before startup events so agent-started is forwarded.
extensions/adapters/presenters/rpc/init.fnl:322
fen.extensions.rpc.shutdown #
[ctx]
extensions/adapters/presenters/rpc/init.fnl:332
fen.extensions.rpc.run #
(run ctx) -> exit-code
Serve one live wire-protocol run: emit ready, apply parent controls through the fen.util.wire_session table while stepping the agent cooperatively, and return 0 after exit done or 1 after any other exit status.
extensions/adapters/presenters/rpc/init.fnl:340
fen.extensions.rpc.register #
[api]
extensions/adapters/presenters/rpc/init.fnl:361
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 ?opts)
Pick a future session path under sessions-root(cwd), but do not create the
extensions/adapters/session-backends/jsonl/session.fnl:270
fen.extensions.session_jsonl.session.create #
(create cwd) -> Session|nil
Create a durable header-only session which can be addressed before its first turn.
extensions/adapters/session-backends/jsonl/session.fnl:306
fen.extensions.session_jsonl.session.open-existing #
(open-existing p ?yield-fn)
Open an existing session JSONL for append without writing a duplicate
extensions/adapters/session-backends/jsonl/session.fnl:658
fen.extensions.session_jsonl.session.append #
(append session msg)
Append one canonical AgentMessage as a :message entry.
extensions/adapters/session-backends/jsonl/session.fnl:350
fen.extensions.session_jsonl.session.append-entry #
(append-entry session entry)
Append one JSONL session entry. Missing :id, :parent-id, and :timestamp
extensions/adapters/session-backends/jsonl/session.fnl:319
fen.extensions.session_jsonl.session.latest-extension-state #
(latest-extension-state session extension ?yield-fn ?accept) -> entry|nil
Return the latest accepted extension-owned state entry from cooperatively cached session metadata, falling back to a disk scan for an older accepted entry when the cached latest one is rejected by ?accept, warning and ignoring malformed entries.
extensions/adapters/session-backends/jsonl/session.fnl:709
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:359
fen.extensions.session_jsonl.session.latest-for-cwd #
(latest-for-cwd cwd ?yield-fn)
Return the newest non-empty session path for cwd, or nil if none.
extensions/adapters/session-backends/jsonl/session.fnl:500
fen.extensions.session_jsonl.session.list-for-cwd #
(list-for-cwd cwd limit ?yield-fn)
Return recent session metadata records for cwd, newest first. Durable
extensions/adapters/session-backends/jsonl/session.fnl:556
fen.extensions.session_jsonl.session.get #
(get cwd id) -> SessionInfo|nil
Resolve only a complete session id in the requested cwd.
extensions/adapters/session-backends/jsonl/session.fnl:575
fen.extensions.session_jsonl.session.acquire-lock #
(acquire-lock SessionInfo) -> release-fn|nil
Atomically acquire a per-session mutation lock, reclaiming one left by a dead owner and returning nil when another process owns it.
extensions/adapters/session-backends/jsonl/session.fnl:643
fen.extensions.session_jsonl.session.header #
(header p ?yield-fn)
Read and decode the first JSONL header entry from p, or nil.
extensions/adapters/session-backends/jsonl/session.fnl:512
fen.extensions.session_jsonl.session.title #
(title p ?yield-fn)
Return a human title for a transcript: first user text, falling back to
extensions/adapters/session-backends/jsonl/session.fnl:534
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:492
fen.extensions.session_jsonl.session.find #
(find cwd target ?yield-fn)
Resolve a session target for cwd. Target may be nil/latest, a 0-based
extensions/adapters/session-backends/jsonl/session.fnl:668
fen.extensions.session_jsonl.session.doctor #
(doctor p ?repair? ?yield-fn)
Inspect a JSONL transcript without replaying it. With repair enabled, write
extensions/adapters/session-backends/jsonl/session.fnl:825
fen.extensions.session_jsonl.session.transcript #
(transcript path) -> [Message]
Return persisted canonical messages without applying replay compaction.
extensions/adapters/session-backends/jsonl/session.fnl:764
fen.extensions.session_jsonl.session.transcript-strict #
number
Current JSONL session format version written into new session headers.
extensions/adapters/session-backends/jsonl/session.fnl:1049
fen.extensions.session_jsonl.session.load #
(load path ?yield-fn ?strict?)
Read the JSONL at path and return replayable canonical messages. Header
extensions/adapters/session-backends/jsonl/session.fnl:777
fen.extensions.session_jsonl.session.load-strict #
number
Current JSONL session format version written into new session headers.
extensions/adapters/session-backends/jsonl/session.fnl:1049
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:1049
fen.extensions.session_jsonl.state #
Module neighborhood graph: DOT · SVG
fen.extensions.session_jsonl.state.record-cache #
extensions/adapters/session-backends/jsonl/state.fnl:12
fen.extensions.session_jsonl.state.cache-cap #
extensions/adapters/session-backends/jsonl/state.fnl:12
fen.extensions.session_jsonl.state.cache-clock #
extensions/adapters/session-backends/jsonl/state.fnl:12
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:530
fen.extensions.simplify #
Module neighborhood graph: DOT · SVG
fen.extensions.simplify.register #
extensions/behaviors/companions/simplify/init.fnl:267
fen.extensions.simplify.register! #
extensions/behaviors/companions/simplify/init.fnl:268
fen.extensions.simplify._state #
extensions/behaviors/companions/simplify/init.fnl:269
fen.extensions.simplify.state #
Module neighborhood graph: DOT · SVG
fen.extensions.simplify.state.status #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.idle #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.last-summary #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.last-error #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.last-base #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.run-state #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.active-turn-id #
extensions/behaviors/companions/simplify/state.fnl:3
fen.extensions.simplify.state.updated-at #
extensions/behaviors/companions/simplify/state.fnl:3
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:187
fen.extensions.skills.discover #
(discover extra-paths ?yield-fn)
Scan default roots plus explicit paths from --skill.
extensions/behaviors/companions/skills/init.fnl:320
fen.extensions.skills.system-prompt-section #
(system-prompt-section skills)
Render a compact catalogue of model-invokable skills. Full instructions
extensions/behaviors/companions/skills/init.fnl:334
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:346
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:353
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:359
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:365
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:372
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:379
fen.extensions.skills._discover-cache-key #
function
Test helper alias exposing the path-seam-derived discover cache key so tests can assert distinct keys under injected VFS identities.
extensions/behaviors/companions/skills/init.fnl:403
fen.extensions.skills.skills-text #
(skills-text skills ?filter)
Render discovered skills as a human-readable table for /skills list.
extensions/behaviors/companions/skills/init.fnl:448
fen.extensions.skills.skill-detail-lines #
[skill]
extensions/behaviors/companions/skills/init.fnl:511
fen.extensions.skills.register #
function
Registration entrypoint alias for installing the available-skills prompt fragment.
extensions/behaviors/companions/skills/init.fnl:803
fen.extensions.skills.register! #
function
Registration entrypoint alias for installing the available-skills prompt fragment.
extensions/behaviors/companions/skills/init.fnl:803
fen.extensions.skills.bundled #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.bundled.skills #
[]
extensions/behaviors/companions/skills/bundled.fnl:63
fen.extensions.skills.ignore #
Module neighborhood graph: DOT · SVG
fen.extensions.skills.ignore.with-dir #
(with-dir rules dir)
Return a fresh rule list = rules ++ ignore files found directly in dir.
extensions/behaviors/companions/skills/ignore.fnl:75
fen.extensions.skills.ignore.load-chain #
(load-chain root)
Collect ignore rules walking the ancestors of root root-to-leaf.
extensions/behaviors/companions/skills/ignore.fnl:81
fen.extensions.skills.ignore.match? #
(match? target is-dir? rules)
Last matching ignore rule wins. Negated rules re-include the path. The
extensions/behaviors/companions/skills/ignore.fnl:144
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:145
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.last-turn-latency #
(last-turn-latency messages)
Compact 'N.Ns (M.M tok/s)' for the latest assistant message that carries a
extensions/behaviors/inspectors/status/util.fnl:6
fen.extensions.status.util.runtime-version #
(runtime-version)
Return the build-stamped version string, or source/git fallback when
extensions/behaviors/inspectors/status/util.fnl:21
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:106
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:147
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:160
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:174
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:187
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:206
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:214
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:225
fen.extensions.stdio.register #
[api]
extensions/adapters/presenters/stdio/init.fnl:250
fen.extensions.steering #
Module neighborhood graph: DOT · SVG
fen.extensions.steering.register #
(register api) -> true
Register the steering introspect snapshot and the default late-order input handler that drives steering/follow-up queueing.
extensions/behaviors/kernel/steering/init.fnl:11
fen.extensions.steering.service #
Module neighborhood graph: DOT · SVG
fen.extensions.steering.service.queue-info #
(queue-info) -> {:steering-queued n :follow-up-queued n :steering-mode mode :follow-up-mode mode}
Current queue depths and drain modes, in the field names the status line consumes.
extensions/behaviors/kernel/steering/service.fnl:51
fen.extensions.steering.service.queue-snapshot #
(queue-snapshot) -> {:steering [line] :follow-up [line] :steering-mode mode :follow-up-mode mode}
Copied queue contents plus modes for UI rendering such as the /queue panel.
extensions/behaviors/kernel/steering/service.fnl:67
fen.extensions.steering.service.queue! #
(queue! kind text) -> {:ok true :queued true :queue kind}|{:ok false :error msg}
Append a line to the steering or follow-up queue, emitting the :queued event and refreshed status counts.
extensions/behaviors/kernel/steering/service.fnl:78
fen.extensions.steering.service.requeue! #
(requeue! text from to) -> {:ok true :queued true :queue kind}|{:ok false :error msg}
Move the most recent still-pending copy of a line from one queue to the end of the other, emitting :queued and refreshed status counts like queue!; fails when no copy is pending.
extensions/behaviors/kernel/steering/service.fnl:101
fen.extensions.steering.service.install-runtime! #
[runtime]
extensions/behaviors/kernel/steering/service.fnl:124
fen.extensions.steering.service.enqueue! #
(enqueue! kind text ?opts)
Public-runtime implementation behind api.enqueue. Follow-up idle-start is
extensions/behaviors/kernel/steering/service.fnl:134
fen.extensions.steering.service.start-idle-follow-up! #
(start-idle-follow-up!) -> boolean
At an interactive safe tick, start one requested idle follow-up through the runtime's normal user-turn submitter.
extensions/behaviors/kernel/steering/service.fnl:147
fen.extensions.steering.service.clear-queues! #
(clear-queues! ?kind) -> nil
Empty the named queue, or both when kind is nil or :all, and refresh status counts.
extensions/behaviors/kernel/steering/service.fnl:169
fen.extensions.steering.service.set-queue-mode! #
(set-queue-mode! kind mode) -> ok?
Set a queue's drain mode to :one-at-a-time or :all, rejecting unknown kinds and modes.
extensions/behaviors/kernel/steering/service.fnl:185
fen.extensions.steering.service.get-steering #
(get-steering) -> [line]
Drain the steering queue by its mode for injection at the agent's next safe boundary.
extensions/behaviors/kernel/steering/service.fnl:200
fen.extensions.steering.service.get-follow-up #
(get-follow-up) -> [line]
Drain the follow-up queue by its mode when the agent finishes a turn.
extensions/behaviors/kernel/steering/service.fnl:210
fen.extensions.steering.service.submit #
(submit line ctx)
Queueing decisions for non-slash input. The caller owns turn orchestration:
extensions/behaviors/kernel/steering/service.fnl:227
fen.extensions.steering.service.handle-input #
(handle-input input ctx)
Input-pipeline handler wrapping submit. input is
extensions/behaviors/kernel/steering/service.fnl:240
fen.extensions.steering.state #
Module neighborhood graph: DOT · SVG
fen.extensions.steering.state.steering-queue #
[string]
Pending steering lines injected into the running turn at the next safe boundary.
extensions/behaviors/kernel/steering/state.fnl:7
fen.extensions.steering.state.follow-up-queue #
[string]
Pending follow-up lines submitted as fresh user turns after the current turn completes.
extensions/behaviors/kernel/steering/state.fnl:13
fen.extensions.steering.state.steering-mode #
":one-at-a-time"|":all"
Drain mode for the steering queue - one line per boundary or the whole queue at once.
extensions/behaviors/kernel/steering/state.fnl:19
fen.extensions.steering.state.one-at-a-time #
extensions/behaviors/kernel/steering/state.fnl:31
fen.extensions.steering.state.follow-up-mode #
":one-at-a-time"|":all"
Drain mode for the follow-up queue - one line per turn end or the whole queue at once.
extensions/behaviors/kernel/steering/state.fnl:25
fen.extensions.steering.state.runtime #
extensions/behaviors/kernel/steering/state.fnl:31
fen.extensions.steering.state.idle-follow-up-start? #
extensions/behaviors/kernel/steering/state.fnl:31
fen.extensions.subagent #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.register #
[api]
extensions/behaviors/companions/subagent/init.fnl:2089
fen.extensions.subagent.bundled #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.bundled.entries #
[]
extensions/behaviors/companions/subagent/bundled.fnl:81
fen.extensions.subagent.bundled.get #
[name]
extensions/behaviors/companions/subagent/bundled.fnl:84
fen.extensions.subagent.channel #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.channel.open #
(open run control-path event-path) -> channel
Return parent channel state for RUN over the control and event files. The control file must already exist with private permissions.
extensions/behaviors/companions/subagent/channel.fnl:15
fen.extensions.subagent.channel.send! #
(send! channel type ?payload) -> seq|nil, reason
Stamp, validate, and append one control line with a strictly increasing seq; returns the seq, or nil plus a reason.
extensions/behaviors/companions/subagent/channel.fnl:34
fen.extensions.subagent.channel.poll #
(poll channel) -> [message], [error]
Read a bounded batch of child events, validate each against the wire schema and increasing seq, and advance the mirrored status. Returns the valid messages (a control-ack carries the answered control as :control) and per-line errors; a version mismatch, foreign run, or truncated file sets channel.error.
extensions/behaviors/companions/subagent/channel.fnl:81
fen.extensions.subagent.channel.idle? #
(idle? channel) -> boolean
True when the child is ready with every control acknowledged, so its task turn is done; a steer the child still holds queued there is reported dropped when the run closes.
extensions/behaviors/companions/subagent/channel.fnl:112
fen.extensions.subagent.channel.close! #
[ch]
extensions/behaviors/companions/subagent/channel.fnl:120
fen.extensions.subagent.discover #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.discover.roots #
(roots) -> [{:path :scope}]
Agent discovery roots in precedence order (project, user, bundled).
extensions/behaviors/companions/subagent/discover.fnl:27
fen.extensions.subagent.discover.find-agent #
(find-agent name) -> (values AgentConfig nil) | (values nil AgentError) | nil
Resolve an agent definition by filename, project roots winning over user roots, which win over bundled defaults. Returns cfg, an invalid-definition error for the highest-precedence present candidate, or nil for no matching file.
extensions/behaviors/companions/subagent/discover.fnl:136
fen.extensions.subagent.discover.list #
(list) -> [AgentConfig]
All discovered agents across roots, deduped by name (project > user > bundled). Used by tests and a future /agents command.
extensions/behaviors/companions/subagent/discover.fnl:167
fen.extensions.subagent.runs #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.runs.repeated-timeout-warning #
(repeated-timeout-warning task-fingerprint)
Return bounded retained-history telemetry for an identical launch.
extensions/behaviors/companions/subagent/runs.fnl:115
fen.extensions.subagent.runs.start! #
[opts]
extensions/behaviors/companions/subagent/runs.fnl:142
fen.extensions.subagent.runs.accumulate-usage! #
(accumulate-usage! id usage ?source)
Fold one provider usage report (an :llm-end turn) into a run's durable
extensions/behaviors/companions/subagent/runs.fnl:186
fen.extensions.subagent.runs.mark-first-artifact! #
(mark-first-artifact! id artifact)
Record the first useful artifact/progress signal for a run exactly once.
extensions/behaviors/companions/subagent/runs.fnl:208
fen.extensions.subagent.runs.finish! #
[id status ?details]
extensions/behaviors/companions/subagent/runs.fnl:219
fen.extensions.subagent.runs.active-count #
[]
extensions/behaviors/companions/subagent/runs.fnl:268
fen.extensions.subagent.runs.find #
[id]
extensions/behaviors/companions/subagent/runs.fnl:271
fen.extensions.subagent.runs.record #
(record id)
Return the private mutable run record for extension behavior.
extensions/behaviors/companions/subagent/runs.fnl:275
fen.extensions.subagent.runs.active-records #
(active-records)
Return private mutable records of active runs in launch order.
extensions/behaviors/companions/subagent/runs.fnl:279
fen.extensions.subagent.runs.attach-job! #
(attach-job! id)
Track an active run as a detached background job.
extensions/behaviors/companions/subagent/runs.fnl:287
fen.extensions.subagent.runs.job #
(job id)
Return the private mutable background job record for extension behavior.
extensions/behaviors/companions/subagent/runs.fnl:294
fen.extensions.subagent.runs.jobs #
(jobs)
Return private mutable background job records in launch order.
extensions/behaviors/companions/subagent/runs.fnl:298
fen.extensions.subagent.runs.append-event! #
[id ev]
extensions/behaviors/companions/subagent/runs.fnl:306
fen.extensions.subagent.runs.append-event-error! #
[id err]
extensions/behaviors/companions/subagent/runs.fnl:320
fen.extensions.subagent.runs.request-steer! #
(request-steer! id note ?source)
Queue a steering note for an active run; the run's driver sends it to the
extensions/behaviors/companions/subagent/runs.fnl:328
fen.extensions.subagent.runs.take-steering! #
[id]
extensions/behaviors/companions/subagent/runs.fnl:348
fen.extensions.subagent.runs.active-runs #
[]
extensions/behaviors/companions/subagent/runs.fnl:353
fen.extensions.subagent.runs.runs #
[]
extensions/behaviors/companions/subagent/runs.fnl:359
fen.extensions.subagent.runs.review-worktrees #
[]
extensions/behaviors/companions/subagent/runs.fnl:363
fen.extensions.subagent.runs.add-review-worktrees! #
[records]
extensions/behaviors/companions/subagent/runs.fnl:366
fen.extensions.subagent.runs.remove-review-worktree! #
[worktree-path]
extensions/behaviors/companions/subagent/runs.fnl:372
fen.extensions.subagent.runs.snapshot #
[]
extensions/behaviors/companions/subagent/runs.fnl:380
fen.extensions.subagent.runs.reconcile-background! #
(reconcile-background!)
Finish background runs whose job is no longer tracked. Blocking runs are
extensions/behaviors/companions/subagent/runs.fnl:390
fen.extensions.subagent.runs.remove! #
(remove! id)
Remove one inactive run record. Active runs must be cancelled first.
extensions/behaviors/companions/subagent/runs.fnl:406
fen.extensions.subagent.runs.clear! #
(clear!)
Clear run records after callers have reaped active jobs. Preserve the
extensions/behaviors/companions/subagent/runs.fnl:417
fen.extensions.subagent.runs.reset! #
(reset!)
Test/startup reset, including the process-lifetime id sequence.
extensions/behaviors/companions/subagent/runs.fnl:429
fen.extensions.subagent.runs.copy-run #
extensions/behaviors/companions/subagent/runs.fnl:435
fen.extensions.subagent.state #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.state.data #
extensions/behaviors/companions/subagent/state.fnl:8
fen.extensions.subagent.worktrees #
Module neighborhood graph: DOT · SVG
fen.extensions.subagent.worktrees.create #
(create cwd ref count) -> [ReviewWorktree], string|nil
Create detached sibling git worktrees for read-only review without changing the caller checkout.
extensions/behaviors/companions/subagent/worktrees.fnl:44
fen.extensions.subagent.worktrees.cleanup #
(cleanup record) -> boolean, string|nil
Remove one workflow-created detached review worktree only when its head and porcelain status are unchanged.
extensions/behaviors/companions/subagent/worktrees.fnl:92
fen.extensions.todo #
Module neighborhood graph: DOT · SVG
fen.extensions.todo.register #
extensions/behaviors/companions/todo/init.fnl:355
fen.extensions.todo.register! #
extensions/behaviors/companions/todo/init.fnl:356
fen.extensions.todo.execute #
extensions/behaviors/companions/todo/init.fnl:357
fen.extensions.todo.validate-items #
extensions/behaviors/companions/todo/init.fnl:358
fen.extensions.todo.copy-items #
extensions/behaviors/companions/todo/init.fnl:359
fen.extensions.todo.counts #
extensions/behaviors/companions/todo/init.fnl:360
fen.extensions.todo.summary-line #
extensions/behaviors/companions/todo/init.fnl:361
fen.extensions.todo.render-text #
extensions/behaviors/companions/todo/init.fnl:362
fen.extensions.todo.panel-spec #
extensions/behaviors/companions/todo/init.fnl:363
fen.extensions.todo.rebuild-from-messages! #
extensions/behaviors/companions/todo/init.fnl:364
fen.extensions.todo._state #
extensions/behaviors/companions/todo/init.fnl:365
fen.extensions.todo._test #
extensions/behaviors/companions/todo/init.fnl:366
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.mouse-enabled? #
(mouse-enabled?)
Mouse capture is on by default so the wheel scrolls the transcript.
extensions/adapters/presenters/tui/init.fnl:67
fen.extensions.tui.input-mode #
(input-mode)
INPUT_ESC always (bare Esc surfaces immediately; input.fnl synthesizes
extensions/adapters/presenters/tui/init.fnl:81
fen.extensions.tui.init! #
(init!)
Initialize termbox2 (gated by tb-initialized? — runs at most once per
extensions/adapters/presenters/tui/init.fnl:90
fen.extensions.tui.shutdown #
(shutdown) -> nil
Tear down termbox and bracketed paste mode when the TUI presenter exits.
extensions/adapters/presenters/tui/init.fnl:122
fen.extensions.tui.hard-refresh! #
(hard-refresh!)
Recover the screen after external terminal interference (another process
extensions/adapters/presenters/tui/init.fnl:137
fen.extensions.tui.suspend! #
(suspend!)
Suspend fen to the shell like any full-screen app. Raw mode disables ISIG,
extensions/adapters/presenters/tui/init.fnl:146
fen.extensions.tui.reset-conversation! #
(reset-conversation!)
Clear per-conversation TUI state for /new while preserving process/UI
extensions/adapters/presenters/tui/init.fnl:158
fen.extensions.tui.set-status-info #
(set-status-info info)
Optional: caller (main.fnl) can populate provider/model on the status
extensions/adapters/presenters/tui/init.fnl:209
fen.extensions.tui.input-meta #
(input-meta ?ev)
Diagnostics for an input-phase stall: which event was being handled and how
extensions/adapters/presenters/tui/init.fnl:265
fen.extensions.tui.warn-if-stalled! #
[phase start-ms ?get-turn ?ev ?start-cpu]
extensions/adapters/presenters/tui/init.fnl:327
fen.extensions.tui.peek-timeout-ms #
(peek-timeout-ms is-busy?)
Use a short poll while busy or resolving Esc/Alt, but sleep longer when the
extensions/adapters/presenters/tui/init.fnl:353
fen.extensions.tui.interrupted-syscall? #
(interrupted-syscall? err)
A signal (resize/job-control/SIGCHLD) can interrupt termbox's
extensions/adapters/presenters/tui/init.fnl:362
fen.extensions.tui.scroll-event? #
(scroll-event? ev) -> boolean
Return whether a termbox event moves the transcript viewport.
extensions/adapters/presenters/tui/init.fnl:382
fen.extensions.tui.guard-tick! #
(guard-tick! label f)
Run a cooperative per-tick worker without letting it terminate the TUI.
extensions/adapters/presenters/tui/init.fnl:394
fen.extensions.tui.tick-background! #
(tick-background!)
Advance workspace-local turns and retained subagent projections once.
extensions/adapters/presenters/tui/init.fnl:404
fen.extensions.tui.drain-scroll-burst! #
(drain-scroll-burst! first-event handle)
Handle FIRST-EVENT and coalesce an immediately queued scroll burst. The
extensions/adapters/presenters/tui/init.fnl:414
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:442
fen.extensions.tui.register #
[api]
extensions/adapters/presenters/tui/init.fnl:531
fen.extensions.tui.clipboard #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.clipboard.max-bytes #
number
Maximum pre-encode selection size copied via OSC 52 before the payload is refused, guarding slow terminals and terminal input buffers.
extensions/adapters/presenters/tui/clipboard.fnl:9
fen.extensions.tui.clipboard.osc52 #
(osc52 text)
Return the OSC 52 escape string that sets the system clipboard (selection
extensions/adapters/presenters/tui/clipboard.fnl:20
fen.extensions.tui.clipboard.write! #
(write! s)
Default writer: emit s to the terminal. init.fnl uses the same
extensions/adapters/presenters/tui/clipboard.fnl:29
fen.extensions.tui.clipboard.copy #
(copy text)
Copy text to the clipboard via OSC 52. Returns a result table:
extensions/adapters/presenters/tui/clipboard.fnl:36
fen.extensions.tui.completion #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.completion.ensure-defaults! #
(ensure-defaults!) -> nil
Backfill persistent completion-menu state fields after hot reloads or on first use.
extensions/adapters/presenters/tui/completion.fnl:13
fen.extensions.tui.completion.context #
(context buf cursor)
Return a context table describing what to complete at cursor, or nil.
extensions/adapters/presenters/tui/completion.fnl:30
fen.extensions.tui.completion.command-candidates #
(command-candidates prefix)
Return commands matching prefix.
extensions/adapters/presenters/tui/completion.fnl:86
fen.extensions.tui.completion.normalize-choice #
(normalize-choice choice)
Coerce one raw completer result into a menu choice.
extensions/adapters/presenters/tui/completion.fnl:109
fen.extensions.tui.completion.arg-candidates #
(arg-candidates command arg-prefix ctx) -> [Choice]
Ask a command for argument completions, normalize them, then fuzzy-filter and rank them by the typed word.
extensions/adapters/presenters/tui/completion.fnl:138
fen.extensions.tui.completion.candidates #
(candidates ctx completion-ctx) -> kind [Choice]
Resolve completion choices for a detected context, dispatching to command or argument candidates.
extensions/adapters/presenters/tui/completion.fnl:154
fen.extensions.tui.completion.invalidate! #
(invalidate!) -> nil
Force the next completion refresh to recompute candidates even when the input snapshot is unchanged.
extensions/adapters/presenters/tui/completion.fnl:169
fen.extensions.tui.completion.refresh! #
(refresh! ?ctx)
Recompute menu items from the live input buffer. Opens the menu when
extensions/adapters/presenters/tui/completion.fnl:179
fen.extensions.tui.completion.close! #
(close!) -> nil
Hide the completion menu and reset its selection without touching the input buffer.
extensions/adapters/presenters/tui/completion.fnl:217
fen.extensions.tui.completion.dismiss! #
(dismiss!)
Hide the menu for the current buffer/cursor snapshot. Unlike close!,
extensions/adapters/presenters/tui/completion.fnl:230
fen.extensions.tui.completion.active? #
(active?) -> boolean
Report whether the inline completion menu currently has selectable items.
extensions/adapters/presenters/tui/completion.fnl:241
fen.extensions.tui.completion.next! #
(next!) -> nil
Advance the completion selection to the next item, wrapping at the end.
extensions/adapters/presenters/tui/completion.fnl:257
fen.extensions.tui.completion.prev! #
(prev!) -> nil
Move the completion selection to the previous item, wrapping at the start.
extensions/adapters/presenters/tui/completion.fnl:264
fen.extensions.tui.completion.selected #
(selected) -> Choice|nil
Return the currently highlighted completion choice, or nil when the menu is empty.
extensions/adapters/presenters/tui/completion.fnl:271
fen.extensions.tui.completion.selected-exact-command? #
(selected-exact-command?)
Return true when the menu is highlighting the command name already
extensions/adapters/presenters/tui/completion.fnl:280
fen.extensions.tui.completion.commit! #
(commit! ?dismiss?)
Splice the selected candidate into the input buffer. When dismiss? is
extensions/adapters/presenters/tui/completion.fnl:312
fen.extensions.tui.completion.visible-window #
(visible-window count cursor max-rows) -> first item-h
Compute the scrolled slice of completion items that keeps the selected row on screen.
extensions/adapters/presenters/tui/completion.fnl:329
fen.extensions.tui.completion.rows #
(rows w) -> [PanelRow]
Build styled menu rows (bordered, scrolled, marked selection) for the above-input completion panel.
extensions/adapters/presenters/tui/completion.fnl:350
fen.extensions.tui.completion.panel-spec #
(panel-spec) -> PanelSpec
Build the :above-input panel spec that renders the live completion menu when active.
extensions/adapters/presenters/tui/completion.fnl:397
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:8
fen.extensions.tui.draw.fill-row #
(fill-row y x0 x1 ch fg bg)
Fill a row segment. Use one tb.print call instead of one set_cell call per
extensions/adapters/presenters/tui/draw.fnl:16
fen.extensions.tui.draw.utf8-prefix-cols #
(utf8-prefix-cols s cols)
Return a prefix of s containing at most cols UTF-8 codepoints. Still
extensions/adapters/presenters/tui/draw.fnl:27
fen.extensions.tui.draw.put-clipped #
(put-clipped x y fg bg s width-cap)
Print s starting at x,y but cap at width-cap columns. tb_print returns
extensions/adapters/presenters/tui/draw.fnl:55
fen.extensions.tui.ingest #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.ingest.append-event #
(append-event ev ?opts)
Ingest EV. With :transcript-only?, status side effects land in the
extensions/adapters/presenters/tui/ingest.fnl:299
fen.extensions.tui.input #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.input.input-prompt #
(input-prompt)
Return the active tab's editor label without changing main-session chrome.
extensions/adapters/presenters/tui/input.fnl:23
fen.extensions.tui.input.idle-hint #
(idle-hint width)
Single source for empty-input guidance; contextual suggestions extend here
extensions/adapters/presenters/tui/input.fnl:39
fen.extensions.tui.input.show-hint! #
(show-hint! ev)
A hint that lands after the user started typing is stale, so it is dropped
extensions/adapters/presenters/tui/input.fnl:55
fen.extensions.tui.input.clear-hint! #
(clear-hint!) -> nil
Dismiss the pending contextual hint so the default idle placeholder returns.
extensions/adapters/presenters/tui/input.fnl:70
fen.extensions.tui.input.ensure-defaults! #
(ensure-defaults!)
Backfill input-region state fields that may be missing on a live
extensions/adapters/presenters/tui/input.fnl:80
fen.extensions.tui.input.input-display-rows #
(input-display-rows buf width cursor ?prompt-width)
Return wrapped input display rows.
extensions/adapters/presenters/tui/input.fnl:100
fen.extensions.tui.input.cursor-display-pos #
(cursor-display-pos rows cursor)
Return (row-index-0, col) for cursor in wrapped input rows.
extensions/adapters/presenters/tui/input.fnl:157
fen.extensions.tui.input.input-rows #
(input-rows)
Number of rows the input area occupies, capped at INPUT-ROWS-MAX.
extensions/adapters/presenters/tui/input.fnl:167
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:177
fen.extensions.tui.input.refresh-completion! #
(refresh-completion!)
Recompute main-session completion, or close it outside main input mode.
extensions/adapters/presenters/tui/input.fnl:369
fen.extensions.tui.input.open-workspace-switcher! #
(open-workspace-switcher!)
Open the existing modal selector so popup focus remains single-owner.
extensions/adapters/presenters/tui/input.fnl:582
fen.extensions.tui.input.handle-key #
(handle-key ev on-submit on-cancel is-busy?)
Mutates state in response to a single key event. Returns true if the
extensions/adapters/presenters/tui/input.fnl:602
fen.extensions.tui.input.copy-selection! #
(copy-selection!)
Extract the currently selected transcript text and copy it via OSC 52.
extensions/adapters/presenters/tui/input.fnl:849
fen.extensions.tui.input.handle-mouse #
(handle-mouse ev)
Wheel up/down scrolls the transcript by MOUSE-WHEEL-LINES per notch.
extensions/adapters/presenters/tui/input.fnl:879
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:933
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:561
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:568
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:575
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:582
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:589
fen.extensions.tui.paint #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.paint.ensure-state-defaults! #
(ensure-state-defaults!)
Fill in state fields that may be missing on a live state table
extensions/adapters/presenters/tui/paint.fnl:52
fen.extensions.tui.paint.max-scroll #
(max-scroll)
Total wrapped line count minus the visible region. Used to clamp PgUp.
extensions/adapters/presenters/tui/paint.fnl:62
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:127
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:245
fen.extensions.tui.paint.paint-transcript #
(paint-transcript layout) -> nil
Paint the visible transcript viewport rows and its scrolled-position affordance into the reserved transcript region.
extensions/adapters/presenters/tui/paint.fnl:271
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:297
fen.extensions.tui.paint.invalidate! #
(invalidate!)
Mark the TUI as needing a repaint on the next presenter-loop pass.
extensions/adapters/presenters/tui/paint.fnl:307
fen.extensions.tui.paint.invalidate-full! #
(invalidate-full!)
Request a cache-clearing repaint. Used for resize/reload/display toggles
extensions/adapters/presenters/tui/paint.fnl:311
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:316
fen.extensions.tui.paint.advance-spinner-if-due! #
(advance-spinner-if-due!)
Advance the busy spinner at a low cadence measured in presenter-loop ticks.
extensions/adapters/presenters/tui/paint.fnl:326
fen.extensions.tui.paint.redraw-if-needed! #
(redraw-if-needed!)
Paint only when invalidated. force-redraw? first blank-presents and clears
extensions/adapters/presenters/tui/paint.fnl:341
fen.extensions.tui.paint.paint-frame! #
(paint-frame!)
Paint one full frame into termbox's back buffer without presenting it.
extensions/adapters/presenters/tui/paint.fnl:357
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:376
fen.extensions.tui.paint.clear-render-caches! #
(clear-render-caches!)
Drop cached rendered rows so a forced repaint or /reload recomputes all
extensions/adapters/presenters/tui/paint.fnl:386
fen.extensions.tui.paint.force-redraw! #
(force-redraw!)
Force a full terminal repaint. The blank present invalidates termbox2's
extensions/adapters/presenters/tui/paint.fnl:392
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:22
fen.extensions.tui.panels.busy.turn-elapsed #
(turn-elapsed)
Seconds since the current turn started, or empty string when idle.
extensions/adapters/presenters/tui/panels/busy.fnl:35
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:73
fen.extensions.tui.panels.busy.render #
(render ctx) -> [PresenterRow]
Render spinner, busy label, retry delay, elapsed time, and the next ctrl-c action for the active turn when it fits.
extensions/adapters/presenters/tui/panels/busy.fnl:81
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:99
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:10
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:62
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:73
fen.extensions.tui.panels.errors.has-errors? #
(has-errors?)
Cache the presence check by transcript identity and length. Transcript
extensions/adapters/presenters/tui/panels/errors.fnl:82
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:132
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:146
fen.extensions.tui.panels.status #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.status.ensure-defaults! #
(ensure-defaults!)
Backfill status-info fields that may be missing on a live state
extensions/adapters/presenters/tui/panels/status.fnl:24
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:107
fen.extensions.tui.panels.tabs #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.panels.tabs.height #
[_ctx]
extensions/adapters/presenters/tui/panels/tabs.fnl:64
fen.extensions.tui.panels.tabs.layout #
(layout width)
Build width-bounded tab segments and click regions from one model.
extensions/adapters/presenters/tui/panels/tabs.fnl:68
fen.extensions.tui.panels.tabs.action-at #
[x width]
extensions/adapters/presenters/tui/panels/tabs.fnl:105
fen.extensions.tui.panels.tabs.tab-at #
[x width]
extensions/adapters/presenters/tui/panels/tabs.fnl:113
fen.extensions.tui.panels.tabs.render #
[ctx]
extensions/adapters/presenters/tui/panels/tabs.fnl:117
fen.extensions.tui.panels.tabs.spec #
[]
extensions/adapters/presenters/tui/panels/tabs.fnl:121
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:14
fen.extensions.tui.panels.transcript.ensure-defaults! #
(ensure-defaults!)
Backfill transcript-region state fields that may be missing on a
extensions/adapters/presenters/tui/panels/transcript.fnl:21
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:46
fen.extensions.tui.panels.transcript.content- #
(content- content)
Concatenate text blocks of an AgentToolResult content list.
extensions/adapters/presenters/tui/panels/transcript.fnl:57
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:65
fen.extensions.tui.panels.transcript.count-lines #
(count-lines s)
Count \n-terminated lines plus a trailing partial line if present.
extensions/adapters/presenters/tui/panels/transcript.fnl:73
fen.extensions.tui.panels.transcript.lookup-tool-call #
(lookup-tool-call tool-call-id)
Walk back through state.transcript to find the matching :tool-call
extensions/adapters/presenters/tui/panels/transcript.fnl:111
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:142
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:198
fen.extensions.tui.panels.transcript.event-text #
(event-text ev)
Return an event's display text. Streaming rows keep delta chunks to avoid
extensions/adapters/presenters/tui/panels/transcript.fnl:243
fen.extensions.tui.panels.transcript.invalidate-layout-cache! #
(invalidate-layout-cache!)
Drop the transcript-wide row-count/index cache. Call when events are
extensions/adapters/presenters/tui/panels/transcript.fnl:384
fen.extensions.tui.panels.transcript.clear-event-render-cache! #
(clear-event-render-cache! ev)
Drop all cached transcript rows for one event. Streaming delta ingestion
extensions/adapters/presenters/tui/panels/transcript.fnl:389
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:417
fen.extensions.tui.panels.transcript.viewport-lines #
(viewport-lines width region-h)
Returns up to region-h display rows ending at the tail of the transcript.
extensions/adapters/presenters/tui/panels/transcript.fnl:549
fen.extensions.tui.panels.transcript.clamp-scroll-offset #
(clamp-scroll-offset candidate input-rows)
Clamp an upward scroll candidate. Near the live tail, count only enough
extensions/adapters/presenters/tui/panels/transcript.fnl:569
fen.extensions.tui.panels.transcript.scrollbar-thumb #
(scrollbar-thumb width region-h)
Return a zero-based thumb position and height for a REGION-H-row track.
extensions/adapters/presenters/tui/panels/transcript.fnl:582
fen.extensions.tui.panels.transcript.max-scroll #
(max-scroll input-rows)
Maximum useful scroll-offset given current state — total wrapped line
extensions/adapters/presenters/tui/panels/transcript.fnl:620
fen.extensions.tui.panels.transcript.jump-to-user-message! #
(jump-to-user-message! input-rows)
Jump to a user-authored message near the current transcript viewport.
extensions/adapters/presenters/tui/panels/transcript.fnl:633
fen.extensions.tui.panels.transcript.clear-render-caches! #
(clear-render-caches!)
Drop cached rendered rows so a forced repaint recomputes all transcript
extensions/adapters/presenters/tui/panels/transcript.fnl:686
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:7
fen.extensions.tui.redraw.invalidate! #
(invalidate!)
Mark the TUI as needing a repaint on the next presenter-loop pass.
extensions/adapters/presenters/tui/redraw.fnl:20
fen.extensions.tui.redraw.invalidate-full! #
(invalidate-full!)
Request a cache-clearing repaint. Used for resize/reload/display toggles
extensions/adapters/presenters/tui/redraw.fnl:25
fen.extensions.tui.select #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.select.filtered #
(filtered state) -> [Choice]
Return choices whose label or description fuzzy-match the current selector filter text, ranked best first.
extensions/adapters/presenters/tui/select.fnl:26
fen.extensions.tui.select.replace-choices! #
(replace-choices! state choices) -> SelectState
Replace choices in an open selector while preserving the highlighted label when possible.
extensions/adapters/presenters/tui/select.fnl:39
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:56
fen.extensions.tui.select.make-state #
(make-state opts) -> SelectState
Create selector state, initializing its filter from the optional opts.initial-query value.
extensions/adapters/presenters/tui/select.fnl:73
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:88
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:236
fen.extensions.tui.selection #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.selection.ensure-defaults! #
(ensure-defaults!)
Ensure the selection paint snapshot has a concrete table. state.selection
extensions/adapters/presenters/tui/selection.fnl:11
fen.extensions.tui.selection.row-cols #
(row-cols text) -> number
Return the display-column width of a row's plain text in UTF-8 codepoints.
extensions/adapters/presenters/tui/selection.fnl:33
fen.extensions.tui.selection.active? #
(active?) -> boolean
Whether a transcript selection is currently anchored.
extensions/adapters/presenters/tui/selection.fnl:54
fen.extensions.tui.selection.has-span? #
(has-span?)
A selection whose anchor and cursor are the same cell is a plain click,
extensions/adapters/presenters/tui/selection.fnl:64
fen.extensions.tui.selection.clear! #
(clear!) -> boolean
Drop any active selection, returning whether one was present so callers can decide to repaint.
extensions/adapters/presenters/tui/selection.fnl:73
fen.extensions.tui.selection.start! #
(start! x y) -> nil
Begin a selection with the anchor and cursor at screen cell (x, y).
extensions/adapters/presenters/tui/selection.fnl:83
fen.extensions.tui.selection.selectable-cell? #
(selectable-cell? x y snapshot)
True only when (x, y) is inside text recorded by paint-transcript.
extensions/adapters/presenters/tui/selection.fnl:101
fen.extensions.tui.selection.clamp-to-snapshot #
(clamp-to-snapshot x y snapshot)
Clamp drag/release coordinates to the currently painted transcript band.
extensions/adapters/presenters/tui/selection.fnl:111
fen.extensions.tui.selection.start-if-selectable! #
(start-if-selectable! x y) -> boolean
Begin a selection only when the mouse press lands on currently painted transcript text.
extensions/adapters/presenters/tui/selection.fnl:127
fen.extensions.tui.selection.update-clamped! #
(update-clamped! x y) -> boolean
Move the selection cursor after clamping to the visible transcript snapshot; return false when no snapshot exists.
extensions/adapters/presenters/tui/selection.fnl:139
fen.extensions.tui.selection.update! #
(update! x y) -> nil
Move the selection cursor to screen cell (x, y) during a drag.
extensions/adapters/presenters/tui/selection.fnl:152
fen.extensions.tui.selection.finish! #
(finish!) -> nil
Mark the in-progress drag complete while keeping the selection highlighted until cleared.
extensions/adapters/presenters/tui/selection.fnl:161
fen.extensions.tui.selection.normalized #
(normalized sel)
Return the selection ordered so start precedes end in reading order
extensions/adapters/presenters/tui/selection.fnl:170
fen.extensions.tui.selection.row-range #
(row-range sel y row-cols)
Inclusive [from, to] column range selected on screen row y. Middle rows
extensions/adapters/presenters/tui/selection.fnl:181
fen.extensions.tui.selection.row-highlight #
(row-highlight sel y text)
For painting: return (from-col, selected-substring) for screen row y
extensions/adapters/presenters/tui/selection.fnl:195
fen.extensions.tui.selection.begin-paint! #
(begin-paint!) -> nil
Reset the per-frame transcript paint snapshot before rows are recorded for later selection extraction.
extensions/adapters/presenters/tui/selection.fnl:207
fen.extensions.tui.selection.record-row! #
(record-row! y text) -> nil
Record the plain text painted at screen row y so a later copy can extract the selected substring.
extensions/adapters/presenters/tui/selection.fnl:215
fen.extensions.tui.selection.extract #
(extract sel snapshot)
Pure extraction: return the text covered by sel given a paint snapshot
extensions/adapters/presenters/tui/selection.fnl:230
fen.extensions.tui.selection.selected-text #
(selected-text) -> string
Return the currently selected transcript text using the live paint snapshot.
extensions/adapters/presenters/tui/selection.fnl:251
fen.extensions.tui.side_chat #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.side_chat.on-event! #
(on-event! id ev)
Ingest a side-agent event into only its workspace.
extensions/adapters/presenters/tui/side_chat.fnl:177
fen.extensions.tui.side_chat.submit! #
(submit! ws line ?opts)
Submit only to WS's private agent, optionally queueing an initial command.
extensions/adapters/presenters/tui/side_chat.fnl:213
fen.extensions.tui.side_chat.open! #
(open! runtime ?initial)
Open or focus the singleton btw workspace and optionally submit a turn.
extensions/adapters/presenters/tui/side_chat.fnl:252
fen.extensions.tui.side_chat.tick! #
(tick!)
Advance live side turns and drain cancelled turns without blocking the UI.
extensions/adapters/presenters/tui/side_chat.fnl:359
fen.extensions.tui.side_chat.reset! #
(reset!)
Clear volatile side-chat resources between isolated presenter tests.
extensions/adapters/presenters/tui/side_chat.fnl:371
fen.extensions.tui.side_chat.busy? #
[]
extensions/adapters/presenters/tui/side_chat.fnl:385
fen.extensions.tui.side_chat.use-last! #
(use-last! ?ws)
Replace the main input draft with the side agent's last assistant reply.
extensions/adapters/presenters/tui/side_chat.fnl:406
fen.extensions.tui.side_chat.request-cancel! #
(request-cancel! ws)
Request cooperative cancellation without discarding the side conversation.
extensions/adapters/presenters/tui/side_chat.fnl:424
fen.extensions.tui.side_chat.cancel! #
(cancel! ws)
Cancel one side conversation, reaping its coroutine before tab removal.
extensions/adapters/presenters/tui/side_chat.fnl:433
fen.extensions.tui.side_chat.WORKSPACE-ID #
extensions/adapters/presenters/tui/side_chat.fnl:459
fen.extensions.tui.side_chat.READ-ONLY-TOOLS #
extensions/adapters/presenters/tui/side_chat.fnl:460
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:3
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:9
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:15
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:21
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:27
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:33
fen.extensions.tui.state.paint-layout #
extensions/adapters/presenters/tui/state.fnl:243
fen.extensions.tui.state.workspaces #
[Workspace]
Persistent presenter-tab records, including metadata, input mode, activity, source identity, and per-tab view state.
extensions/adapters/presenters/tui/state.fnl:39
fen.extensions.tui.state.active-workspace-id #
string|keyword
Id of the workspace whose transcript, editor, selection, and render caches are projected through the legacy flat state fields.
extensions/adapters/presenters/tui/state.fnl:45
fen.extensions.tui.state.main-session #
extensions/adapters/presenters/tui/state.fnl:243
fen.extensions.tui.state.closed-subagent-workspaces #
table
Set of explicitly closed subagent tab ids so retained run events do not recreate hidden tabs.
extensions/adapters/presenters/tui/state.fnl:51
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:57
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:63
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:69
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:75
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:81
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:87
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:93
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:99
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:105
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:111
fen.extensions.tui.state.input-cursor #
number
Byte offset cursor position inside input-buf for terminal input editing.
extensions/adapters/presenters/tui/state.fnl:117
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:123
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:129
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:135
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:141
fen.extensions.tui.state.input-hint #
{:text string :key string}|nil
Pending contextual suggestion from a :hint event, shown as the empty main editor's placeholder until the draft is edited, Esc, or a conversation reset.
extensions/adapters/presenters/tui/state.fnl:225
fen.extensions.tui.state.input-hints-shown #
{string true}
Set of :hint keys already shown this process so one suggestion is never repeated.
extensions/adapters/presenters/tui/state.fnl:231
fen.extensions.tui.state.selection #
table|nil
Active transcript mouse selection ({anchor cursor dragging?}) in screen-cell coordinates, or nil when nothing is selected.
extensions/adapters/presenters/tui/state.fnl:165
fen.extensions.tui.state.selection-paint #
table|nil
Per-frame snapshot of plain transcript text keyed by screen row, filled during paint so selection copy can extract the visible selected text.
extensions/adapters/presenters/tui/state.fnl:171
fen.extensions.tui.state.copy-status #
table|nil
Transient copy-feedback record ({ok? bytes reason at-seconds}) surfaced in the status line after a selection copy attempt.
extensions/adapters/presenters/tui/state.fnl:177
fen.extensions.tui.state.history #
[string]
In-process prompt history ring containing submitted prompts for up/down navigation.
extensions/adapters/presenters/tui/state.fnl:147
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:153
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:159
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:183
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:189
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:195
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:201
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:207
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:213
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:219
fen.extensions.tui.state.last-stall-warn-ms #
extensions/adapters/presenters/tui/state.fnl:243
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:237
fen.extensions.tui.stories.init #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.stories.init.reset! #
(reset! ?opts)
Reset persistent TUI state fields used by story fixtures. This avoids the
extensions/adapters/presenters/tui/stories/init.fnl:32
fen.extensions.tui.stories.init.list #
(list) -> [StoryMetadata]
List discoverable TUI story names, descriptions, tags, and default dimensions.
extensions/adapters/presenters/tui/stories/init.fnl:197
fen.extensions.tui.stories.init.find #
(find name) -> Story|nil
Return a TUI story fixture by keyword/string name.
extensions/adapters/presenters/tui/stories/init.fnl:206
fen.extensions.tui.stories.init.setup! #
(setup! name ?opts)
Reset and seed a named story. Optional opts may override :cols/:rows.
extensions/adapters/presenters/tui/stories/init.fnl:218
fen.extensions.tui.workspaces #
Module neighborhood graph: DOT · SVG
fen.extensions.tui.workspaces.KINDS #
extensions/adapters/presenters/tui/workspaces.fnl:62
fen.extensions.tui.workspaces.kind-spec #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:64
fen.extensions.tui.workspaces.capabilities-for #
(capabilities-for ws)
Derive workspace authority from its kind and status in one place.
extensions/adapters/presenters/tui/workspaces.fnl:67
fen.extensions.tui.workspaces.input-mode #
(input-mode ws)
Display projection of the workspace's capabilities, which stay authoritative.
extensions/adapters/presenters/tui/workspaces.fnl:75
fen.extensions.tui.workspaces.closable? #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:85
fen.extensions.tui.workspaces.status? #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:89
fen.extensions.tui.workspaces.status-info #
(status-info ws)
Return the busy status model shown while WS is displayed.
extensions/adapters/presenters/tui/workspaces.fnl:93
fen.extensions.tui.workspaces.subagent? #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:103
fen.extensions.tui.workspaces.agent? #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:107
fen.extensions.tui.workspaces.sort-rank #
[ws]
extensions/adapters/presenters/tui/workspaces.fnl:111
fen.extensions.tui.workspaces.ensure! #
[]
extensions/adapters/presenters/tui/workspaces.fnl:191
fen.extensions.tui.workspaces.active #
[]
extensions/adapters/presenters/tui/workspaces.fnl:208
fen.extensions.tui.workspaces.find #
[id]
extensions/adapters/presenters/tui/workspaces.fnl:211
fen.extensions.tui.workspaces.allows? #
(allows? capability)
Return whether the active workspace grants CAPABILITY.
extensions/adapters/presenters/tui/workspaces.fnl:215
fen.extensions.tui.workspaces.accepts-input? #
[]
extensions/adapters/presenters/tui/workspaces.fnl:223
fen.extensions.tui.workspaces.cancel-active! #
(cancel-active!)
Request cancellation through the active workspace kind, if it owns a running turn.
extensions/adapters/presenters/tui/workspaces.fnl:226
fen.extensions.tui.workspaces.capture-active! #
[]
extensions/adapters/presenters/tui/workspaces.fnl:254
fen.extensions.tui.workspaces.activate! #
[id]
extensions/adapters/presenters/tui/workspaces.fnl:258
fen.extensions.tui.workspaces.create! #
(create! spec)
Create one presenter tab record without teaching core sessions about tabs.
extensions/adapters/presenters/tui/workspaces.fnl:272
fen.extensions.tui.workspaces.with-main! #
(with-main! f)
Run F against the main transcript without changing the tab being viewed.
extensions/adapters/presenters/tui/workspaces.fnl:286
fen.extensions.tui.workspaces.close! #
(close! id)
Close a presenter workspace according to its kind policy.
extensions/adapters/presenters/tui/workspaces.fnl:291
fen.extensions.tui.workspaces.next! #
[delta]
extensions/adapters/presenters/tui/workspaces.fnl:317
fen.extensions.tui.workspaces.switcher-choices #
(switcher-choices)
Return api.ui.select choices for the existing modal focus path.
extensions/adapters/presenters/tui/workspaces.fnl:328
fen.extensions.tui.workspaces.submit! #
(submit! line handlers)
Dispatch submission through the active kind's single policy entry.
extensions/adapters/presenters/tui/workspaces.fnl:341
fen.extensions.tui.workspaces.submit-steering! #
(submit-steering! line)
Route a subagent tab's steering draft through retained run state.
extensions/adapters/presenters/tui/workspaces.fnl:348
fen.extensions.tui.workspaces.active-status-info #
(active-status-info)
Return the busy status model for the displayed workspace.
extensions/adapters/presenters/tui/workspaces.fnl:399
fen.extensions.tui.workspaces.append-active! #
(append-active! ev)
Append one presenter-local row to the displayed workspace.
extensions/adapters/presenters/tui/workspaces.fnl:403
fen.extensions.tui.workspaces.append-to! #
(append-to! id ev)
Append one canonical event to a workspace without touching main state.
extensions/adapters/presenters/tui/workspaces.fnl:407
fen.extensions.tui.workspaces.refresh! #
(refresh! ws)
Refresh derived kind metadata after a workspace status transition.
extensions/adapters/presenters/tui/workspaces.fnl:419
fen.extensions.tui.workspaces.sort-workspaces! #
[]
extensions/adapters/presenters/tui/workspaces.fnl:549
fen.extensions.tui.workspaces.sync-subagents! #
(sync-subagents!)
Project bounded subagent event streams into read-only workspaces.
extensions/adapters/presenters/tui/workspaces.fnl:556
fen.extensions.tui.workspaces.list #
[]
extensions/adapters/presenters/tui/workspaces.fnl:597
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:69
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:78
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:87
fen.extensions.web.register #
[api]
extensions/adapters/presenters/web/init.fnl:96
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:75
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:119
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:193
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:70
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:77
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:236
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:67
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:249
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:257
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:273
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:289
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:312
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:337
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.args #
Module neighborhood graph: DOT · SVG
fen.util.args.nth-arg #
(nth-arg args n) -> string|nil
Extract the nth whitespace-delimited argument from a slash-command argument string.
packages/util/src/fen/util/args.fnl:5
fen.util.args.first-arg #
(first-arg args) -> string|nil
Extract the first whitespace-delimited argument from a slash-command argument string.
packages/util/src/fen/util/args.fnl:15
fen.util.args.rest-args #
(rest-args args) -> string
Return everything after the first whitespace-delimited argument, trimmed; nil and missing rest become "".
packages/util/src/fen/util/args.fnl:23
fen.util.base64 #
Module neighborhood graph: DOT · SVG
fen.util.base64.decode-standard #
(decode-standard s)
Decode a standard base64 string (with optional = padding) to its raw
packages/util/src/fen/util/base64.fnl:15
fen.util.base64.decode-url #
(decode-url s)
Decode a base64url string (no padding required, uses - and _)
packages/util/src/fen/util/base64.fnl:40
fen.util.base64.encode-standard #
(encode-standard bytes)
Encode a raw byte string as standard base64 with = padding.
packages/util/src/fen/util/base64.fnl:53
fen.util.base64.encode-url #
(encode-url bytes)
Encode a raw byte string as base64url: standard alphabet with +→-,
packages/util/src/fen/util/base64.fnl:85
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 via the injectable backend, used by reload-change diagnostics.
packages/util/src/fen/util/checksum/init.fnl:8
fen.util.checksum.module-path #
(module-path modname) -> string|nil
Resolve a module name to its active source file through the injectable backend so reload diagnostics can fingerprint it.
packages/util/src/fen/util/checksum/init.fnl:16
fen.util.checksum.module-fingerprint #
(module-fingerprint modname) -> table|nil
Return a module's fingerprint (version/etag) through the injectable backend; the default resolves and hashes the source file, returning nil when it has no discoverable source.
packages/util/src/fen/util/checksum/init.fnl:24
fen.util.checksum.backends.default #
Module neighborhood graph: DOT · SVG
fen.util.checksum.backends.default.file-fingerprint #
(file-fingerprint path) -> table|nil
Compute a small non-cryptographic checksum/size fingerprint for a file via io.open, used by reload-change diagnostics.
packages/util/src/fen/util/checksum/backends/default.fnl:3
fen.util.checksum.backends.default.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/backends/default.fnl:58
fen.util.checksum.backends.default.module-fingerprint #
(module-fingerprint modname) -> table|nil
Resolve and fingerprint a Lua module source file via searchpath+io.open, returning nil when the module has no discoverable source file.
packages/util/src/fen/util/checksum/backends/default.fnl:71
fen.util.clock #
Module neighborhood graph: DOT · SVG
fen.util.clock.monotonic-ms #
(monotonic-ms) -> number
Return a monotonic clock reading in milliseconds via the injectable clock backend.
packages/util/src/fen/util/clock/init.fnl:8
fen.util.clock.sleep-ms #
(sleep-ms ms) -> nil
Sleep for the given number of milliseconds via the injectable clock backend.
packages/util/src/fen/util/clock/init.fnl:16
fen.util.clock.backends.native #
Module neighborhood graph: DOT · SVG
fen.util.clock.backends.native.monotonic-ms #
(monotonic-ms) -> number
Return a monotonic millisecond reading from the fen_process native clock, erroring if it is unavailable.
packages/util/src/fen/util/clock/backends/native.fnl:7
fen.util.clock.backends.native.sleep-ms #
(sleep-ms ms) -> nil
Sleep for ms milliseconds using the fen_process native sleep.
packages/util/src/fen/util/clock/backends/native.fnl:16
fen.util.coroutines #
Module neighborhood graph: DOT · SVG
fen.util.coroutines.register-inheritable-hook! #
(register-inheritable-hook! hook on-create?) -> nil
Explicitly allow one debug hook to propagate to fen-owned cooperative child coroutines, optionally observing each child at creation.
packages/util/src/fen/util/coroutines.fnl:11
fen.util.coroutines.unregister-inheritable-hook! #
(unregister-inheritable-hook! hook) -> nil
Stop propagating a previously registered debug hook to new fen-owned cooperative coroutines.
packages/util/src/fen/util/coroutines.fnl:20
fen.util.coroutines.create #
(create f)
Create a coroutine, inheriting only debug hooks that opted into fen's
packages/util/src/fen/util/coroutines.fnl:28
fen.util.dev_overlay #
Module neighborhood graph: DOT · SVG
fen.util.dev_overlay.validate-worktree #
(validate-worktree worktree) -> OverlayRoots|nil, string|nil
Canonicalize a trusted development worktree and require its core, util, CLI, and extension source directories.
packages/util/src/fen/util/dev_overlay.fnl:25
fen.util.dev_overlay.switch-worktree! #
(switch-worktree! worktree) -> OverlayRoots|nil, string|nil
Validate and install a replaceable trusted worktree overlay for Lua/Fennel core modules and flat first-party extensions.
packages/util/src/fen/util/dev_overlay.fnl:75
fen.util.file_mutex #
Module neighborhood graph: DOT · SVG
fen.util.file_mutex.with-file #
(with-file path yield! fn-body) -> any
Run fn-body while holding the FIFO mutex for path's canonical filesystem spelling, releasing it even when fn-body throws.
packages/util/src/fen/util/file_mutex.fnl:143
fen.util.file_mutex.canonical-path #
(canonical-path path)
Resolve a path without forking for ordinary spellings; use readlink only
packages/util/src/fen/util/file_mutex.fnl:69
fen.util.file_mutex_state #
Module neighborhood graph: DOT · SVG
fen.util.file_mutex_state.locks #
packages/util/src/fen/util/file_mutex_state.fnl:3
fen.util.file_mutex_state.canonical-cache #
packages/util/src/fen/util/file_mutex_state.fnl:3
fen.util.file_mutex_state.canonical-cache-size #
packages/util/src/fen/util/file_mutex_state.fnl:3
fen.util.file_mutex_state.canonical-cache-cwd #
packages/util/src/fen/util/file_mutex_state.fnl:3
fen.util.flat_extensions #
Module neighborhood graph: DOT · SVG
fen.util.flat_extensions.build-map #
(build-map roots)
Walk each root recursively for manifest dirs and return a snake->dir map.
packages/util/src/fen/util/flat_extensions.fnl:117
fen.util.flat_extensions.resolve-fnl #
(resolve-fnl map modname)
Return the flat .fnl path for fen.extensions.<snake>[.<rest>] or nil.
packages/util/src/fen/util/flat_extensions.fnl:131
fen.util.flat_extensions.make-searcher #
(make-searcher fennel map)
Build a Lua package.searchers entry that resolves flat extensions.
packages/util/src/fen/util/flat_extensions.fnl:146
fen.util.flat_extensions.install! #
(install! opts)
Convenience installer. opts.roots is the list of extension roots to
packages/util/src/fen/util/flat_extensions.fnl:170
fen.util.frontmatter #
Module neighborhood graph: DOT · SVG
fen.util.frontmatter.parse #
(parse text) -> (values fields body) | nil
Parse leading --- frontmatter out of a string. Returns nil when
packages/util/src/fen/util/frontmatter.fnl:18
fen.util.frontmatter.parse-file #
(parse-file path ?with-body) -> (values fields body) | (values nil reason err)
Read path and parse its frontmatter line-by-line, stopping at the
packages/util/src/fen/util/frontmatter.fnl:59
fen.util.fuzzy #
Module neighborhood graph: DOT · SVG
fen.util.fuzzy.score #
(score query candidate) -> number|nil
Return a fuzzy-match score when all query characters appear in order within candidate; higher is better.
packages/util/src/fen/util/fuzzy.fnl:13
fen.util.fuzzy.edit-distance #
(edit-distance a b) -> number
Return case-insensitive edit distance between two values rendered as strings, counting one adjacent transposition as one typo.
packages/util/src/fen/util/fuzzy.fnl:59
fen.util.fuzzy.ranked #
(ranked query items text-fn ?opts) -> [item]
Return fuzzy matches sorted by descending score while preserving input order for equal scores; ?opts.min-score drops weak matches.
packages/util/src/fen/util/fuzzy.fnl:111
fen.util.headless_progress #
Module neighborhood graph: DOT · SVG
fen.util.headless_progress.make-handler #
[?opts]
packages/util/src/fen/util/headless_progress.fnl:46
fen.util.headless_progress.register #
[api]
packages/util/src/fen/util/headless_progress.fnl:103
fen.util.http #
Module neighborhood graph: DOT · SVG
fen.util.http.request #
(request opts)
Perform an HTTP request.
packages/util/src/fen/util/http/init.fnl:21
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:23
fen.util.http.backends.native.capabilities #
packages/util/src/fen/util/http/backends/native.fnl:36
fen.util.id #
Module neighborhood graph: DOT · SVG
fen.util.id.random-hex #
(random-hex n)
Return n random hexadecimal characters.
packages/util/src/fen/util/id.fnl:16
fen.util.id.uuidv7 #
(uuidv7)
Return a UUIDv7-shaped, time-sortable identifier string.
packages/util/src/fen/util/id.fnl:35
fen.util.json #
Module neighborhood graph: DOT · SVG
fen.util.json.encode #
(encode value) -> string
Encode a Lua value to JSON using the configured cjson instance shared by providers, sessions, and docs tooling.
packages/util/src/fen/util/json.fnl:22
fen.util.json.encode-deterministic #
(encode-deterministic value) -> string
Encode a Lua value to JSON with object keys sorted lexicographically for cache-friendly wire payloads.
packages/util/src/fen/util/json.fnl:37
fen.util.json.decode #
(decode text) -> any
Decode JSON text using cjson with empty-array metadata enabled so provider payload arrays round-trip safely.
packages/util/src/fen/util/json.fnl:27
fen.util.json.null #
cjson.null
Re-export cjson.null for callers that need to preserve explicit JSON null values in Lua tables.
packages/util/src/fen/util/json.fnl:32
fen.util.json.null? #
(null? value)
True iff value is the decoded JSON null sentinel (cjson.null). The
packages/util/src/fen/util/json.fnl:15
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:81
fen.util.json_schema #
Module neighborhood graph: DOT · SVG
fen.util.json_schema.validate #
(validate schema value) -> true|nil, [SchemaError]
Validate a JSON value against Fen's lightweight tool-schema subset.
packages/util/src/fen/util/json_schema.fnl:114
fen.util.json_schema.unsupported-keywords #
packages/util/src/fen/util/json_schema.fnl:126
fen.util.jsonl #
Module neighborhood graph: DOT · SVG
fen.util.jsonl.append! #
(append! holder p rec warn)
Append rec to p, retaining a flushed handle in holder across calls.
packages/util/src/fen/util/jsonl.fnl:12
fen.util.log #
Module neighborhood graph: DOT · SVG
fen.util.log.debug #
(debug msg) -> nil
Write a debug-level message when FEN_LOG enables verbose diagnostics; lands in the active log sink when one is open, otherwise stderr.
packages/util/src/fen/util/log.fnl:85
fen.util.log.info #
(info msg) -> nil
Write an info-level message when the configured log level allows normal diagnostics; lands in the active log sink when one is open, otherwise stderr.
packages/util/src/fen/util/log.fnl:90
fen.util.log.warn #
(warn msg) -> nil
Write a warning-level message for recoverable problems such as malformed config or extension failures; lands in the active log sink when one is open, otherwise stderr.
packages/util/src/fen/util/log.fnl:95
fen.util.log.error #
(error msg) -> nil
Write an error-level message for severe runtime failures that should always be visible; lands in the active log sink when one is open, otherwise stderr.
packages/util/src/fen/util/log.fnl:100
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:105
fen.util.log.enabled? #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:105
fen.util.log.set-level! #
(set-level! level) -> boolean
Set the active log threshold at runtime by name (:debug/:info/:warn/:error). Returns true when applied, false for an unknown level. Overrides the FEN_LOG default and persists across /reload; lets an embedded host set the level without env vars.
packages/util/src/fen/util/log.fnl:18
fen.util.log.cursor #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:105
fen.util.log.list-recent #
(timestamp) -> string
Return the current UTC time formatted as RFC3339/ISO8601 for diagnostic file output.
packages/util/src/fen/util/log.fnl:105
fen.util.log_sink #
Module neighborhood graph: DOT · SVG
fen.util.log_sink.handle #
packages/util/src/fen/util/log_sink.fnl:6
fen.util.log_sink.level #
packages/util/src/fen/util/log_sink.fnl:8
fen.util.log_sink.fallback #
packages/util/src/fen/util/log_sink.fnl:10
fen.util.log_sink.set-fallback! #
(set-fallback! writer) -> nil
Set the no-file-sink fallback writer, or nil to restore stderr routing. Embedded hosts and tests use this instead of mutating sink state directly.
packages/util/src/fen/util/log_sink.fnl:12
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:20
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:36
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:46
fen.util.log_sink.write-fallback #
(write-fallback line) -> nil
Emit line when no file sink is active. Uses the configured fallback writer when set, otherwise io.stderr when it exists; on a host with neither the line survives only in the recent ring.
packages/util/src/fen/util/log_sink.fnl:73
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:54
fen.util.panel #
Module neighborhood graph: DOT · SVG
fen.util.panel.dim #
(dim text) -> Row
Build a dim-styled panel row from text.
packages/util/src/fen/util/panel.fnl:5
fen.util.panel.heading #
(heading text) -> Row
Build an assistant-styled heading row from text.
packages/util/src/fen/util/panel.fnl:12
fen.util.panel.box-top #
(box-top w title) -> string
Render the titled top border of a panel box at width w.
packages/util/src/fen/util/panel.fnl:19
fen.util.panel.box-bottom #
(box-bottom w) -> string
Render the bottom border of a panel box at width w.
packages/util/src/fen/util/panel.fnl:30
fen.util.panel.box-side #
(box-side w text) -> string
Render one bordered content line, clipping and padding to width w.
packages/util/src/fen/util/panel.fnl:38
fen.util.panel.bordered-rows #
(bordered-rows w content title) -> [Row]
Frame styled content rows in a titled box at width w, one content row per line.
packages/util/src/fen/util/panel.fnl:51
fen.util.panel.invalidate-cache! #
(invalidate-cache! state) -> nil
Reset the base row-cache fields (cached-rows/at/w) on a panel state table.
packages/util/src/fen/util/panel.fnl:63
fen.util.panel.throttled-rows #
(throttled-rows state w title build-content) -> [Row]
Return the panel's framed rows, rebuilding at most once per second or when width changes; build-content is a thunk returning styled content rows.
packages/util/src/fen/util/panel.fnl:73
fen.util.panel_toggle #
Module neighborhood graph: DOT · SVG
fen.util.panel_toggle.install! #
(install! api opts)
opts requires :name, :command, :panel-spec, and persistent :state. Optional
packages/util/src/fen/util/panel_toggle.fnl:26
fen.util.path #
Module neighborhood graph: DOT · SVG
fen.util.path.getenv #
(getenv name) -> string|nil
Read an environment variable through the injectable VFS backend so hosts without OS env vars can supply values (e.g. the reload dev-overlay gate) by swapping the backend.
packages/util/src/fen/util/path/init.fnl:9
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/init.fnl:17
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/init.fnl:25
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/init.fnl:36
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/init.fnl:44
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/init.fnl:55
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/init.fnl:63
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/init.fnl:74
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/init.fnl:82
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/init.fnl:91
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/init.fnl:99
fen.util.path.basename #
(basename path) -> string
Return the final path component while tolerating a trailing slash.
packages/util/src/fen/util/path/init.fnl:110
fen.util.path.pwd-physical #
(pwd-physical dir) -> string|nil
Resolve a directory through the backend's physical pwd probe, returning its physical path or nil if the probe fails.
packages/util/src/fen/util/path/init.fnl:118
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/init.fnl:126
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/init.fnl:134
fen.util.path.file-exists? #
(file-exists? path) -> boolean
Return true only for regular files, delegating the stat probe to the injectable backend.
packages/util/src/fen/util/path/init.fnl:145
fen.util.path.dir-exists? #
(dir-exists? path) -> boolean
Return true only for directories, delegating the stat probe to the injectable backend.
packages/util/src/fen/util/path/init.fnl:153
fen.util.path.list-dir #
(list-dir dir ?yield-fn) -> [string]
Return immediate child names of dir (excluding . and ..), or [] for
packages/util/src/fen/util/path/init.fnl:161
fen.util.path.ancestors-root-to-leaf #
(ancestors-root-to-leaf start)
Return start's ancestor chain root-to-leaf, using its physical path so the
packages/util/src/fen/util/path/init.fnl:171
fen.util.path.backends.posix #
Module neighborhood graph: DOT · SVG
fen.util.path.backends.posix.getenv #
(getenv name) -> string|nil
Look up an environment variable through os.getenv for the default POSIX backend.
packages/util/src/fen/util/path/backends/posix.fnl:33
fen.util.path.backends.posix.stat #
(stat path)
Return the path's mode string or nil. Prefer lfs to avoid spawning
packages/util/src/fen/util/path/backends/posix.fnl:41
fen.util.path.backends.posix.list-dir #
(list-dir dir ?yield-fn)
Return dir's immediate child names, or [] for an absent/unreadable
packages/util/src/fen/util/path/backends/posix.fnl:51
fen.util.path.backends.posix.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/backends/posix.fnl:77
fen.util.process #
Module neighborhood graph: DOT · SVG
fen.util.process.read-pipe-coop #
(read-pipe-coop pipe yield-fn)
Drain a popen pipe to a string, yielding via yield-fn whenever the
packages/util/src/fen/util/process/init.fnl:22
fen.util.process.read-pipe-close #
(read-pipe-close pipe ?yield-fn)
Drain a popen pipe and close it in all paths. Cooperative callers can
packages/util/src/fen/util/process/init.fnl:52
fen.util.process.start-captured #
(start-captured opts)
Start a child described by :cmd or :argv. job:resume() performs one
packages/util/src/fen/util/process/init.fnl:128
fen.util.process.run-captured #
(run-captured opts ?yield-fn)
Run start-captured to completion. Without a yield function this retains the
packages/util/src/fen/util/process/init.fnl:346
fen.util.process.setenv! #
(setenv! name value)
Set an environment variable for this process, or unset it when value is nil.
packages/util/src/fen/util/process/init.fnl:68
fen.util.process.backends.posix #
Module neighborhood graph: DOT · SVG
fen.util.process.backends.posix.fileno #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.set_nonblock #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.read #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.close_fd #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.spawn #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.spawn_shell #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.wait_pid #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.kill_process_group #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.setenv #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.EAGAIN #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.EWOULDBLOCK #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.SIGTERM #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.process.backends.posix.SIGKILL #
packages/util/src/fen/util/process/backends/posix.fnl:7
fen.util.random #
Module neighborhood graph: DOT · SVG
fen.util.random.bytes #
(bytes n)
Return n cryptographically-random raw bytes as a Lua string. Errors
packages/util/src/fen/util/random/init.fnl:8
fen.util.random.backends.native #
Module neighborhood graph: DOT · SVG
fen.util.random.backends.native.bytes #
(bytes n) -> string
Return n cryptographically random raw bytes from the fen_random native binding.
packages/util/src/fen/util/random/backends/native.fnl:7
fen.util.redact #
Module neighborhood graph: DOT · SVG
fen.util.redact.sensitive-key? #
(sensitive-key? key)
Return true when key contains a case-insensitive secret-bearing name.
packages/util/src/fen/util/redact.fnl:17
fen.util.redact.scrub-string #
(scrub-string value)
Redact common credential shapes from an otherwise free-form string.
packages/util/src/fen/util/redact.fnl:30
fen.util.redact.sanitize #
(sanitize value ?depth)
Return JSON-friendly data while redacting credentials and message bodies.
packages/util/src/fen/util/redact.fnl:42
fen.util.search.bitap #
Module neighborhood graph: DOT · SVG
fen.util.search.bitap.compile #
[pattern ?opts]
packages/util/src/fen/util/search/bitap.fnl:14
fen.util.search.bitap.match #
[compiled raw-text ?opts]
packages/util/src/fen/util/search/bitap.fnl:104
fen.util.search.bitap.score #
[compiled raw-text]
packages/util/src/fen/util/search/bitap.fnl:112
fen.util.sha256 #
Module neighborhood graph: DOT · SVG
fen.util.sha256.digest #
(digest bytes)
Compute SHA-256 of bytes (a Lua string) and return the 32 raw bytes.
packages/util/src/fen/util/sha256.fnl:136
fen.util.sha256.hex-digest #
(hex-digest bytes)
Return the SHA-256 of bytes as a 64-char lowercase hex string.
packages/util/src/fen/util/sha256.fnl:155
fen.util.sse #
Module neighborhood graph: DOT · SVG
fen.util.sse.new-parser #
(new-parser on-event)
Create an incremental SSE parser.
packages/util/src/fen/util/sse.fnl:21
fen.util.sse.parse #
(parse raw)
Parse a complete SSE string into an array of event tables.
packages/util/src/fen/util/sse.fnl:88
fen.util.sse.json-events #
(json-events raw)
Parse a complete SSE string and JSON-decode each non-[DONE] data payload.
packages/util/src/fen/util/sse.fnl:96
fen.util.stream_chunks #
Module neighborhood graph: DOT · SVG
fen.util.stream_chunks.append! #
(append! rec value-key chunks-key delta) -> nil
Append a non-empty string delta to an internal chunk list without concatenating the accumulated value.
packages/util/src/fen/util/stream_chunks.fnl:8
fen.util.stream_chunks.value #
(value rec value-key chunks-key) -> string
Return the current logical string value, concatenating chunks only for this read.
packages/util/src/fen/util/stream_chunks.fnl:25
fen.util.stream_chunks.materialize! #
(materialize! rec value-key chunks-key) -> string
Concatenate any pending chunks into value-key, clear the chunk list, and return the materialized string.
packages/util/src/fen/util/stream_chunks.fnl:39
fen.util.stream_chunks.set! #
(set! rec value-key chunks-key value) -> string
Replace a streamed value with the final string and discard pending chunks.
packages/util/src/fen/util/stream_chunks.fnl:53
fen.util.subcommands #
Module neighborhood graph: DOT · SVG
fen.util.subcommands.help-lines #
(help-lines descriptor)
Render the help table for descriptor as a list of plain strings.
packages/util/src/fen/util/subcommands.fnl:68
fen.util.subcommands.help-text #
(help-text descriptor) -> string
Join the generated help lines for a subcommand descriptor into a single newline-delimited string.
packages/util/src/fen/util/subcommands.fnl:98
fen.util.subcommands.build #
(build spec)
Turn a declarative subcommand spec into command hooks.
packages/util/src/fen/util/subcommands.fnl:120
fen.util.text #
Module neighborhood graph: DOT · SVG
fen.util.text.DEFAULT-MAX-TOOL-RESULT-BYTES #
packages/util/src/fen/util/text.fnl:237
fen.util.text.MAX-SCAN-BYTES #
packages/util/src/fen/util/text.fnl:237
fen.util.text.default-tool-result-max-bytes #
packages/util/src/fen/util/text.fnl:237
fen.util.text.trim #
(trim s) -> string
Strip leading and trailing ASCII whitespace; nil becomes "".
packages/util/src/fen/util/text.fnl:8
fen.util.text.blank->nil #
(blank->nil s) -> string|nil
Return s when it is a non-empty string, else nil.
packages/util/src/fen/util/text.fnl:16
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:24
fen.util.text.truncate-line #
(truncate-line s n) -> string
Truncate a single-line string to an n-character display budget for ASCII-ish panel labels, using an ellipsis when clipped.
packages/util/src/fen/util/text.fnl:34
fen.util.text.utf8-prefix #
(utf8-prefix s limit)
Return a prefix of at most limit bytes without splitting a valid UTF-8 sequence.
packages/util/src/fen/util/text.fnl:168
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:104
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:187
fen.util.tokens #
Module neighborhood graph: DOT · SVG
fen.util.tokens.approx-tokens #
(approx-tokens s) -> number
Estimate token count from text length for status displays when provider-reported usage is unavailable.
packages/util/src/fen/util/tokens.fnl:11
fen.util.tokens.safe-json #
(safe-json v) -> string
JSON-encode a value for token estimation, falling back to tostring when encoding fails.
packages/util/src/fen/util/tokens.fnl:21
fen.util.tokens.content-tokens #
(content-tokens content) -> number
Estimate tokens for canonical message content, including text, thinking blocks, and tool-call names/arguments.
packages/util/src/fen/util/tokens.fnl:30
fen.util.tokens.message-tokens #
(message-tokens msg) -> number
Estimate tokens for one provider-context message including role and tool-result name metadata; persisted failed assistant turns count as zero because they are not replayed.
packages/util/src/fen/util/tokens.fnl:63
fen.util.tokens.rebuild-ledger #
(rebuild-ledger system-prompt messages ?tools ?active-tool-names) -> TokenLedger
Build a token ledger for the current system prompt, active tool schemas, and message table in one pass.
packages/util/src/fen/util/tokens.fnl:116
fen.util.tokens.rebuild-agent-ledger! #
(rebuild-agent-ledger! agent) -> TokenLedger
Recompute and attach the context-token ledger for an agent.
packages/util/src/fen/util/tokens.fnl:139
fen.util.tokens.note-message-appended! #
(note-message-appended! agent message index) -> TokenLedger|nil
Increment an agent's token ledger after append-message! grows agent.messages, falling back to lazy rebuild when the ledger is stale.
packages/util/src/fen/util/tokens.fnl:152
fen.util.tokens.estimated-context-tokens #
(estimated-context-tokens agent) -> number
Return an agent's approximate context tokens, using an incremental ledger when current and rebuilding once after direct message edits.
packages/util/src/fen/util/tokens.fnl:182
fen.util.tokens.context-token-info #
(context-token-info agent) -> {:tokens number :source keyword :estimated? boolean}
Prefer exact provider-reported context at the latest assistant boundary, otherwise return baseline plus subsequent messages or complete fallback estimate.
packages/util/src/fen/util/tokens.fnl:215
fen.util.tokens.usage-totals #
(usage-totals messages) -> Usage
Sum provider usage counters across assistant messages for status and session diagnostics.
packages/util/src/fen/util/tokens.fnl:245
fen.util.tokens.fmt-tokens #
(fmt-tokens n) -> string
Format a token count compactly with raw, k, or M suffixes for status output.
packages/util/src/fen/util/tokens.fnl:264
fen.util.tokens.format-token-summary #
(format-token-summary usage context ?estimated?) -> string
Build the one-line input/output/cache/context token summary shown by status UIs.
packages/util/src/fen/util/tokens.fnl:276
fen.util.turn_result #
Module neighborhood graph: DOT · SVG
fen.util.turn_result.last-assistant #
[messages]
packages/util/src/fen/util/turn_result.fnl:5
fen.util.turn_result.failed? #
[ok? messages]
packages/util/src/fen/util/turn_result.fnl:13
fen.util.turn_result.sum-usage #
[messages]
packages/util/src/fen/util/turn_result.fnl:18
fen.util.usage #
Module neighborhood graph: DOT · SVG
fen.util.usage.USAGE-FIELDS #
USAGE-FIELDS -> [keyword]
Canonical token fields in display order; total-tokens conventionally excludes cache tokens (input+output), matching provider adapters.
packages/util/src/fen/util/usage.fnl:5
fen.util.usage.canonical-usage #
(canonical-usage usage)
Extract canonical token fields from a provider usage table, tolerating both
packages/util/src/fen/util/usage.fnl:36
fen.util.usage.explicit-total? #
(explicit-total? usage) -> boolean
True when a usage table carries an explicit provider-reported total (not one derived from input+output).
packages/util/src/fen/util/usage.fnl:76
fen.util.usage.usage-provenance #
(usage-provenance usage ?source)
Per-field provenance for a usage table. Reported fields take ?source (default
packages/util/src/fen/util/usage.fnl:85
fen.util.usage.add-usage! #
(add-usage! totals usage) -> nil
Accumulate the numeric canonical fields of a provider usage report into a mutable totals table; does not derive total-tokens.
packages/util/src/fen/util/usage.fnl:98
fen.util.usage.ensure-total! #
(ensure-total! totals) -> totals
Derive total-tokens in place from input+output when absent; returns the totals table.
packages/util/src/fen/util/usage.fnl:110
fen.util.usage.usage-total #
(usage-total usage) -> number|nil
Total tokens for a usage table, preferring a reported total-tokens and otherwise deriving input+output; nil when unusable.
packages/util/src/fen/util/usage.fnl:121
fen.util.usage.copy-usage-acc #
(copy-usage-acc acc) -> acc|nil
Shallow-copy a run usage accumulator (totals/provenance plus scalar turns/source), or nil.
packages/util/src/fen/util/usage.fnl:132
fen.util.wire #
Module neighborhood graph: DOT · SVG
fen.util.wire.normalize #
(normalize ev ?meta)
Return a bounded canonical display event for EV.
packages/util/src/fen/util/wire.fnl:110
fen.util.wire.line-reader #
(line-reader path)
Return stateful reader state for tailing PATH with read-lines!:
packages/util/src/fen/util/wire.fnl:192
fen.util.wire.read-lines! #
(read-lines! reader)
Read the next bounded run of complete lines for READER, advancing it.
packages/util/src/fen/util/wire.fnl:198
fen.util.wire.close-reader! #
(close-reader! reader)
Close READER's file handle, if open.
packages/util/src/fen/util/wire.fnl:240
fen.util.wire.validate #
(validate msg direction)
Validate envelope MSG for DIRECTION (:event child->parent or :control
packages/util/src/fen/util/wire.fnl:397
fen.util.wire.message #
(message typ run seq ?payload)
Build an unvalidated envelope: ?payload fields plus :v :seq :type :run.
packages/util/src/fen/util/wire.fnl:437
fen.util.wire.encode #
(encode msg direction)
Validate MSG for DIRECTION and encode it as one JSONL line without the
packages/util/src/fen/util/wire.fnl:449
fen.util.wire.decode #
(decode line direction)
Decode and validate one JSONL LINE for DIRECTION. Returns the message, or
packages/util/src/fen/util/wire.fnl:466
fen.util.wire.sender #
(sender direction run)
Return sender state for DIRECTION on RUN: {:direction :run :seq}.
packages/util/src/fen/util/wire.fnl:482
fen.util.wire.next! #
(next! sender typ ?payload)
Stamp, validate, and encode the next message from SENDER. The sender's
packages/util/src/fen/util/wire.fnl:486
fen.util.wire.receiver #
(receiver direction)
Return receiver state for lines arriving in DIRECTION: {:direction :seq}.
packages/util/src/fen/util/wire.fnl:495
fen.util.wire.receive! #
(receive! receiver line)
Decode LINE for RECEIVER, also rejecting a seq that does not increase
packages/util/src/fen/util/wire.fnl:499
fen.util.wire.rejection-ack #
(rejection-ack rej)
Return the control-ack payload answering rejection REJ.
packages/util/src/fen/util/wire.fnl:518
fen.util.wire.event-type? #
(event-type? typ)
True when TYP is a child->parent wire event type.
packages/util/src/fen/util/wire.fnl:522
fen.util.wire.control-type? #
(control-type? typ)
True when TYP is a parent->child wire control type.
packages/util/src/fen/util/wire.fnl:526
fen.util.wire.VERSION #
packages/util/src/fen/util/wire.fnl:530
fen.util.wire.SCHEMAS #
packages/util/src/fen/util/wire.fnl:531
fen.util.wire.ENVELOPE-SCHEMA #
packages/util/src/fen/util/wire.fnl:532
fen.util.wire.EVENT-TYPES #
packages/util/src/fen/util/wire.fnl:533
fen.util.wire.CONTROL-TYPES #
packages/util/src/fen/util/wire.fnl:534
fen.util.wire.EVENT-PAYLOAD-BYTES #
packages/util/src/fen/util/wire.fnl:535
fen.util.wire.DRAIN-BYTE-BUDGET #
packages/util/src/fen/util/wire.fnl:536
fen.util.wire.DRAIN-EVENT-BUDGET #
packages/util/src/fen/util/wire.fnl:537
fen.util.wire.MAX-LINE-BYTES #
packages/util/src/fen/util/wire.fnl:538
fen.util.wire.MAX-SAFE-INTEGER #
packages/util/src/fen/util/wire.fnl:539
fen.util.wire_session #
Module neighborhood graph: DOT · SVG
fen.util.wire_session.decide #
(decide state control-type) -> {:status :action :next :reason}
Look up the transition for CONTROL-TYPE in STATE. Unknown states or controls are rejected; the returned entry is a copy.
packages/util/src/fen/util/wire_session.fnl:131
fen.util.wire_session.advance #
(advance state event) -> {:action :next}|nil
Look up the internal-event transition for EVENT in STATE, or nil when that event cannot occur there.
packages/util/src/fen/util/wire_session.fnl:143
fen.util.wire_session.terminal? #
(terminal? state) -> boolean
True for done, cancelled, failed, and timed-out; the terminal state is also the exit status.
packages/util/src/fen/util/wire_session.fnl:152
fen.util.wire_session.lifecycle-event? #
(lifecycle-event? type) -> boolean
True for the lifecycle wire events (ready, turn-started, turn-complete, control-ack, result, exit) that only the child's run loop emits.
packages/util/src/fen/util/wire_session.fnl:169
fen.util.wire_session.STATES #
[state]
Every run state in lifecycle order: starting, ready, running, closing, finalizing, then the terminal done, cancelled, failed, and timed-out.
packages/util/src/fen/util/wire_session.fnl:13
fen.util.wire_session.CONTROLS #
packages/util/src/fen/util/wire_session.fnl:178
fen.util.wire_session.TRANSITIONS #
{state {control {:status :action :next :reason}}}
The (state, control) table. :status is the control-ack status (accepted, applied, or rejected), :next the state after the control (absent when rejected), and :action what the child does.
packages/util/src/fen/util/wire_session.fnl:48
fen.util.wire_session.EVENTS #
{state {event {:action :next}}}
The (state, internal event) table for turn ends, the deadline, and fatal errors; a missing entry means the event cannot happen in that state.
packages/util/src/fen/util/wire_session.fnl:101
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)
Monkey-patch os.getenv for a test. resolver receives (name, original-getenv)
packages/testing/src/fen/testing/init.fnl:24
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:30
fen.testing.package-loaded-snapshot #
(package-loaded-snapshot names) -> table
Capture package.loaded entries so tests that stub modules can restore them reliably, including nil entries.
packages/testing/src/fen/testing/init.fnl:38
fen.testing.restore-package-loaded! #
(restore-package-loaded! snapshot) -> nil
Restore a package.loaded snapshot captured by package-loaded-snapshot.
packages/testing/src/fen/testing/init.fnl:51
fen.testing.with-package-loaded #
(with-package-loaded stubs thunk) -> any
Temporarily replace package.loaded entries while running a test thunk, then restore them even on failure.
packages/testing/src/fen/testing/init.fnl:61
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:77
fen.testing.stub-http! #
(stub-http! responder)
Replace fen.util.http's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:86
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:95
fen.testing.stub-log-fallback! #
(stub-log-fallback! writer) -> nil
Route no-sink log lines to writer for a test. Pair with restore-log-fallback! in after_each.
packages/testing/src/fen/testing/init.fnl:104
fen.testing.restore-log-fallback! #
(restore-log-fallback!) -> nil
Clear the test log fallback writer so later tests use stderr routing again.
packages/testing/src/fen/testing/init.fnl:113
fen.testing.stub-path-vfs! #
(stub-path-vfs! backend)
Replace fen.util.path's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:122
fen.testing.restore-path-vfs! #
(restore-path-vfs!) -> nil
Remove the stubbed path backend and cached frontend so later tests reload the default POSIX backend.
packages/testing/src/fen/testing/init.fnl:130
fen.testing.stub-clock! #
(stub-clock! backend)
Replace fen.util.clock's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:140
fen.testing.restore-clock! #
(restore-clock!) -> nil
Remove the stubbed clock backend and cached frontend so later tests reload the default native clock.
packages/testing/src/fen/testing/init.fnl:148
fen.testing.stub-process! #
(stub-process! backend)
Replace fen.util.process's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:158
fen.testing.restore-process! #
(restore-process!) -> nil
Remove the stubbed process backend and cached frontend so later tests reload the default POSIX subprocess backend.
packages/testing/src/fen/testing/init.fnl:167
fen.testing.stub-random! #
(stub-random! backend)
Replace fen.util.random's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:177
fen.testing.restore-random! #
(restore-random!) -> nil
Remove the stubbed random backend and cached frontend so later tests reload the default native CSPRNG.
packages/testing/src/fen/testing/init.fnl:184
fen.testing.stub-checksum! #
(stub-checksum! backend)
Replace fen.util.checksum's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:194
fen.testing.restore-checksum! #
(restore-checksum!) -> nil
Remove the stubbed checksum backend and cached frontend so later tests reload the default io.open/searchpath backend.
packages/testing/src/fen/testing/init.fnl:202
fen.testing.stub-storage! #
(stub-storage! backend)
Replace fen.core.storage's backend with a stub for the duration of a test.
packages/testing/src/fen/testing/init.fnl:212
fen.testing.restore-storage! #
(restore-storage!) -> nil
Remove the stubbed storage backend and cached frontend so later tests reload the default XDG-file backend.
packages/testing/src/fen/testing/init.fnl:221
fen.testing.stub-discover-enumeration! #
(stub-discover-enumeration! backend)
Replace fen.core.extensions.loader.discover's enumeration backend with a
packages/testing/src/fen/testing/init.fnl:231
fen.testing.restore-discover-enumeration! #
(restore-discover-enumeration!) -> nil
Remove the stubbed discovery backend and cached frontend so later tests reload the default POSIX enumeration.
packages/testing/src/fen/testing/init.fnl:240
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:250
fen.testing.rmtree #
(rmtree path)
Remove a temp directory tree created by make-tmpdir.
packages/testing/src/fen/testing/init.fnl:263
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:276
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:290
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:301
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:313
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:324
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:340
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:354
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:16
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:30
fen.testing.pty #
Module neighborhood graph: DOT · SVG
fen.testing.pty.spawn #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.read-until #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.drain #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.now #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.artifact-dir #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.ensure-dir #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.write-file #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.append-file #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.encode-json #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.cast-start #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.pty.cast-event #
packages/testing/src/fen/testing/pty.fnl:114
fen.testing.tui #
Module neighborhood graph: DOT · SVG
fen.testing.tui.install-termbox-stub! #
(install-termbox-stub! ?opts)
Install a safe termbox2 test double in package.loaded and return it.
packages/testing/src/fen/testing/tui.fnl:69
fen.testing.tui.screen-lines #
(screen-lines stub ?opts)
Return the current captured back-buffer lines for a capture-enabled stub.
packages/testing/src/fen/testing/tui.fnl:185
fen.testing.tui.presented-screen-lines #
(presented-screen-lines stub ?opts)
Return the last screen snapshot captured at tb.present, falling back to
packages/testing/src/fen/testing/tui.fnl:196
fen.testing.tui.screen-text #
(screen-text stub ?opts) -> string
Return captured screen lines joined with newlines for compact assertion diagnostics.
packages/testing/src/fen/testing/tui.fnl:205
fen.testing.tui.install-markdown-stub! #
(install-markdown-stub!)
Install a tiny markdown renderer for tests that only need wrapping/prefixes.
packages/testing/src/fen/testing/tui.fnl:213
fen.testing.tui.reset-state! #
(reset-state! ?opts)
Reset persistent TUI state fields used by logic/rendering tests.
packages/testing/src/fen/testing/tui.fnl:220
fen.testing.tui_latency #
Module neighborhood graph: DOT · SVG
fen.testing.tui_latency.stats #
[measurements]
packages/testing/src/fen/testing/tui_latency.fnl:14
fen.testing.tui_latency.seed! #
[n]
packages/testing/src/fen/testing/tui_latency.fnl:28
fen.testing.tui_latency.run #
(run opts)
Replay scheduled keys and bus events. Fake mode advances only waits/stalls;
packages/testing/src/fen/testing/tui_latency.fnl:49
Other (miscellaneous top-level modules) #
fen.cli_discovery #
Module neighborhood graph: DOT · SVG
fen.cli_discovery.list #
[kind opts]
packages/fen/src/fen/cli_discovery.fnl:108
fen.cli_discovery.show #
[kind name opts]
packages/fen/src/fen/cli_discovery.fnl:117
fen.cli_discovery.kinds #
[]
packages/fen/src/fen/cli_discovery.fnl:148
fen.cli_discovery.surfaces #
[]
packages/fen/src/fen/cli_discovery.fnl:159
fen.cli_discovery.render #
[payload json?]
packages/fen/src/fen/cli_discovery.fnl:163
fen.cli_flags #
Module neighborhood graph: DOT · SVG
fen.cli_flags.all #
[]
packages/fen/src/fen/cli_flags.fnl:444
fen.cli_flags.applies? #
[flag context]
packages/fen/src/fen/cli_flags.fnl:446
fen.cli_flags.find-any #
[name]
packages/fen/src/fen/cli_flags.fnl:458
fen.cli_flags.find #
[name context]
packages/fen/src/fen/cli_flags.fnl:466
fen.cli_flags.invalid-message #
[flag context]
packages/fen/src/fen/cli_flags.fnl:470
fen.cli_flags.label #
[flag]
packages/fen/src/fen/cli_flags.fnl:474
fen.cli_flags.help-entries #
[context]
packages/fen/src/fen/cli_flags.fnl:494
fen.cli_flags.render-options #
[context ?opts]
packages/fen/src/fen/cli_flags.fnl:513
fen.cli_flags.nearest-flag #
[name ?context]
packages/fen/src/fen/cli_flags.fnl:567
fen.cli_flags.unknown-message #
[name ?context]
packages/fen/src/fen/cli_flags.fnl:571
fen.cli_help #
Module neighborhood graph: DOT · SVG
fen.cli_help.for-subcommand #
[name]
packages/fen/src/fen/cli_help.fnl:316
fen.cli_help.top-level #
(top-level)
Short default top-level help.
packages/fen/src/fen/cli_help.fnl:319
fen.cli_help.top-level-all #
(top-level-all)
Exhaustive top-level help, including launcher internals and env-var minutiae.
packages/fen/src/fen/cli_help.fnl:323
fen.cli_help.help? #
[arg]
packages/fen/src/fen/cli_help.fnl:327
fen.cli_help.help-all? #
[arg]
packages/fen/src/fen/cli_help.fnl:330
fen.cli_help.write-top-level-help! #
(write-top-level-help! ?all?)
Write short (default) or exhaustive (?all? true) top-level help to stdout.
packages/fen/src/fen/cli_help.fnl:333
fen.cli_help.write-subcommand-help! #
[name]
packages/fen/src/fen/cli_help.fnl:338
fen.cli_parse #
Module neighborhood graph: DOT · SVG
fen.cli_parse.option-token? #
[token]
packages/fen/src/fen/cli_parse.fnl:5
fen.cli_parse.valid-choice? #
(valid-choice? flag value)
True when FLAG declares no :parse :choices list or VALUE is one of them.
packages/fen/src/fen/cli_parse.fnl:8
fen.cli_parse.consume! #
(consume! opts flag argv i)
Apply FLAG at argv index I. Returns next-index,error-message.
packages/fen/src/fen/cli_parse.fnl:50
fen.interactive #
Module neighborhood graph: DOT · SVG
fen.interactive.make-agent-from-opts #
(make-agent-from-opts resolve-provider-config opts on-event extra)
Resolve the provider config (re-reads models.json each call so /reload
packages/fen/src/fen/interactive.fnl:61
fen.interactive.run! #
(run! opts resolve-provider-config) -> exit-code|nil
Build the agent, session, and run-state, drive the active presenter's turn loop, and return its exit code (nil for presenters that exit through their own lifecycle).
packages/fen/src/fen/interactive.fnl:143
fen.interactive.submit-agent-turn! #
(submit-agent-turn! state line ?opts ?emit) -> table
Submit a turn through the current interactive turn helper.
packages/fen/src/fen/interactive.fnl:310
fen.interactive.pin-tools! #
(pin-tools! active-tool-names pinned agent-tools) -> nil
Seed the active-tool-names set with configured pinned tools that resolve to a registered tool, so their schemas appear without a preliminary tool_search.
packages/fen/src/fen/interactive.fnl:317
fen.prompt_source #
Module neighborhood graph: DOT · SVG
fen.prompt_source.count #
[opts inline]
packages/fen/src/fen/prompt_source.fnl:4
fen.prompt_source.read #
[opts inline]
packages/fen/src/fen/prompt_source.fnl:8
fen.provider_help #
Module neighborhood graph: DOT · SVG
fen.provider_help.render-index #
[]
packages/fen/src/fen/provider_help.fnl:138
fen.provider_help.render-provider #
[name]
packages/fen/src/fen/provider_help.fnl:168
fen.provider_help.known-provider? #
[name]
packages/fen/src/fen/provider_help.fnl:175
fen.provider_help.dispatch #
(dispatch argv)
Render the fen providers [name] subcommand. Returns (output exit-code).
packages/fen/src/fen/provider_help.fnl:189
fen.provider_help.missing-provider-message #
[provider-name key-var ?source]
packages/fen/src/fen/provider_help.fnl:204
fen.provider_help.unknown-provider-message #
[provider-name]
packages/fen/src/fen/provider_help.fnl:221
fen.reload_request #
Module neighborhood graph: DOT · SVG
fen.reload_request.enqueue! #
(enqueue! state request) -> ok?, request|error
Validate and append an agent-requested reload or explicitly scoped recovery request to one interactive run state's deferred queue.
packages/fen/src/fen/reload_request.fnl:11
fen.reload_request.drain! #
(drain! state execute!)
The presenter calls this after finishing a turn. state.busy? covers
packages/fen/src/fen/reload_request.fnl:43
fen.reload_request.command-line #
(command-line request) -> string
Convert one validated deferred request into the ordinary reload command line used by the interactive command dispatcher.
packages/fen/src/fen/reload_request.fnl:62
fen.run_state #
Module neighborhood graph: DOT · SVG
fen.run_state.make #
(make cfg) -> RunState
Build the interactive runtime state table and install it in cfg.state-box for reload-safe closures.
packages/fen/src/fen/run_state.fnl:15
fen.runtime #
Module neighborhood graph: DOT · SVG
fen.runtime.binary-path #
(binary-path) -> string|nil
Best-effort absolute path to fen's own executable. Prefers argv[0]
packages/fen/src/fen/runtime.fnl:36
fen.runtime_recovery #
Module neighborhood graph: DOT · SVG
fen.runtime_recovery.supported-scopes #
(supported-scopes) -> [keyword]
Return the small explicit set of runtime recovery scopes accepted by deferred reload requests.
packages/fen/src/fen/runtime_recovery.fnl:30
fen.runtime_recovery.recover! #
(recover! scope) -> RecoveryResult|nil, error
Reset only the declared registry buckets for scope and preserve session, UI table identity, logs, diagnostics, overlays, and other persistent extension state.
packages/fen/src/fen/runtime_recovery.fnl:37
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:40
fen.script_runner.eval-usage #
(eval-usage) -> string
Return command-line usage text for fen eval.
packages/fen/src/fen/script_runner.fnl:47
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:54
fen.script_runner.infer-eval-language #
(infer-eval-language code ?override) -> :lua|:fennel
Choose the eval language, using an explicit override before inferring Fennel from a leading ( or ;.
packages/fen/src/fen/script_runner.fnl:62
fen.script_runner.build-arg-table #
(build-arg-table argv script-index)
Map fen's argv into Lua's script convention: arg[0] is the script,
packages/fen/src/fen/script_runner.fnl:70
fen.script_runner.build-eval-arg-table #
(build-eval-arg-table argv code-index)
Map fen's argv for eval mode. arg[0] is a synthetic chunk name,
packages/fen/src/fen/script_runner.fnl:81
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:96
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:132
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:231
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:262
fen.session_cli #
Module neighborhood graph: DOT · SVG
fen.session_cli.run! #
[argv hooks]
packages/fen/src/fen/session_cli.fnl:161
fen.session_control #
Module neighborhood graph: DOT · SVG
fen.session_control.new #
[opts]
packages/fen/src/fen/session_control.fnl:57
fen.session_control.list #
[opts]
packages/fen/src/fen/session_control.fnl:69
fen.session_control.doctor #
[session-path opts]
packages/fen/src/fen/session_control.fnl:80
fen.session_control.show #
[session-id opts]
packages/fen/src/fen/session_control.fnl:90
fen.session_control.send #
[session-id prompt opts resolve-provider-config]
packages/fen/src/fen/session_control.fnl:246
fen.session_lifecycle #
Module neighborhood graph: DOT · SVG
fen.session_lifecycle.cwd #
(cwd)
Return the authoritative physical cwd used for session grouping.
packages/fen/src/fen/session_lifecycle.fnl:15
fen.session_lifecycle.resolve-backend #
(resolve-backend opts) -> SessionBackend
Resolve and mark the active session backend, while allowing --no-session to disable writes without disabling replay/discovery.
packages/fen/src/fen/session_lifecycle.fnl:20
fen.session_lifecycle.backend-info #
(backend-info backend session) -> SessionInfo|nil
Return backend-specific session info when available, else a generic info record.
packages/fen/src/fen/session_lifecycle.fnl:36
fen.session_lifecycle.close! #
(close! backend session) -> nil
Close the active session handle and clear cached session info.
packages/fen/src/fen/session_lifecycle.fnl:50
fen.session_lifecycle.open #
(open opts backend) -> Session|nil
Open a new transcript handle unless session writes are disabled.
packages/fen/src/fen/session_lifecycle.fnl:60
fen.session_lifecycle.start! #
(start! opts agent backend) -> session, replayed-count
Open or resume the active transcript and replay --continue messages into the agent.
packages/fen/src/fen/session_lifecycle.fnl:71
fen.session_lifecycle.make-flush #
(make-flush backend agent session initial-last-saved)
Returns a closure that appends any messages added since the last call.
packages/fen/src/fen/session_lifecycle.fnl:100
fen.session_lifecycle.install! #
(install! state)
Bridge :message-appended into the existing session flush closure.
packages/fen/src/fen/session_lifecycle.fnl:112
fen.session_lifecycle.uninstall! #
(uninstall!) -> nil
Remove the process-level session lifecycle event bridge.
packages/fen/src/fen/session_lifecycle.fnl:124
fen.tool_policy #
Module neighborhood graph: DOT · SVG
fen.tool_policy.conflict-error #
(conflict-error opts)
Return a CLI conflict message, if mutually exclusive tool flags coexist.
packages/fen/src/fen/tool_policy.fnl:14
fen.tool_policy.narrow #
(narrow candidates opts)
Return the subset of CANDIDATE tool names permitted under a parent's
packages/fen/src/fen/tool_policy.fnl:81
fen.tool_policy.apply #
(apply opts tools)
Return the policy-filtered tool list, or nil plus a configuration error.
packages/fen/src/fen/tool_policy.fnl:111
fen.tool_policy.restriction-info #
(restriction-info opts tools)
Return filtered-tool metadata for status and executor diagnostics.
packages/fen/src/fen/tool_policy.fnl:116
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:22
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:45
fen.turn_submit #
Module neighborhood graph: DOT · SVG
fen.turn_submit.submit! #
(submit! state line ?opts agent-step emit)
Submit text as a normal user turn, or queue/reject while busy.
packages/fen/src/fen/turn_submit.fnl:30
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:252
fen.update.arch- #
packages/fen/src/fen/update.fnl:275
fen.update.expected-hash #
packages/fen/src/fen/update.fnl:276
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:45
fen.version.version #
(version) -> string
Return the short source version string used by CLI/status displays.
packages/fen/src/fen/version.fnl:53
fen.version.format #
(format ?info) -> string
Format version metadata as the single-line fen --version display.
packages/fen/src/fen/version.fnl:61