Kernel introduction

The kernel (isofind-kernel.js) hosts the contribution registry, the command system, keybindings, layered settings and the event bus. It exposes a single facade, window.IsoFind. The other modules (workbench, workflows, dashboard, connectors) attach their own namespace to it.

Two structural constraints

ConstraintWhat it means for a contributor
Classic script, not an ES module The application loads about a hundred global scripts in a meaningful order. A module would be deferred and would run after them, too late for the core to register itself at load time.
Multi-page navigation Every sidebar link destroys the document. The registry is rebuilt on each load. A contribution must be cheap to rebuild, and any panel with heavy state must serialise that state rather than keep it in memory.

What the kernel provides

FeatureAccessPage
Command palette Ctrl + Shift + P Commands and palette
Docked panels, three zones View › Panel: ..., or All panels... Panel catalogue
Named layouts Ctrl + Shift + L Layouts and shortcuts
Remappable keyboard shortcuts Ctrl + Shift + K, or Help › Shortcuts Layouts and shortcuts
Dashboard widgets Home page, and the Dashboard panel Layouts and shortcuts
Workflow engine Workflows panel Workflows and tasks
Local AI assistant Assistant panel Local AI assistant

The window.IsoFind facade

Provided by the kernel

MemberRole
K.contribute(type, entry)Generic registration. Returns a disposal token. The type is not a closed list.
K.get(type, id)A registry entry, or null.
K.list(type, filter)The entries of a registry, filtered.
K.releaseSource(source)Removes everything a source registered, whatever the type.
K.whenShellReady(fn)Calls fn once the workbench is mounted, immediately if it already is.
K.commandsregister, execute, override, get, isAvailable, list(opts)
K.keybindingsbind(combo, id), unbindAll(combo), list()
K.contextget, set, all(), onChange(fn)
K.eventson, emit, emitBlocking (cancellable hook)
K.settingsdeclare, get, set(id, v, layer), onChange, declared()
K.securitygetZone, setZone, setCapabilityProvider, setActivator
K.resolveTitle(t)Resolves a bilingual title, or a key from translations.js.
K.currentLang()fr or en.
K.Disposable, K.DisposableStoreThe disposal token and its aggregate.

Added by the modules

MemberInstalled byAvailable
K.shellshell-dock.jsOnly after shell.ready
K.workflowsworkflow-engine.jsAt load time
K.toolstool-schema.jsAt load time
K.connectorsconnector-registry.jsAt load time
K.dashboarddashboard-registry.jsAt load time
K.editorseditor-registry.jsAt load time
K.notebooksnotebook-kernels.jsAt load time
K.log(source, msg)panel-journal.jsTest for its presence before calling
K.shell does not exist when scripts load: the workbench installs itself on DOM ready, because it needs .app-layout. A panel that tests K.shell at load time finds it missing and disappears with no message. Always go through K.whenShellReady().

Load order

// boot.js, 'shell' group ['/static/js/kernel/isofind-kernel.js', 'shell'], ['/static/js/kernel/core-commands.js', 'shell'], ['/static/js/kernel/command-palette.js', 'shell'], ['/static/js/kernel/shell-dock.js', 'shell'], ['/static/js/kernel/panel-journal.js', 'shell'], ['/static/js/kernel/shell-layouts.js', 'shell'], ['/static/js/kernel/shell-keybindings.js', 'shell'], ['/static/js/kernel/workflow-engine.js', 'shell'], ['/static/js/kernel/workflow-tasks.js', 'shell'], ['/static/js/kernel/tool-schema.js', 'shell'], ['/static/js/kernel/connector-registry.js','shell'], ['/static/js/kernel/agent-manager.js', 'shell'],

The relative order of panels does not matter: they hook onto shell.ready, not onto their rank. On the backend, kernel_wiring.py mounts each module independently; a missing module logs a warning and leaves the rest working.

Zones and capabilities

On security the kernel carries no policy of its own: it asks the host before every dispatch. Policy stays with the host, which alone knows the PKI, the consent granted at install time and the developer mode. The kernel refuses a dispatch when the host says no, which guarantees there is no side channel.

ZoneContext keyEffect
distribution kernel.zone Default. Commands declared zone: 'local' are refused.
local Developer mode. Every command is executable.
The core (source: 'core') is exempt from the capability check, since it is the application's own code. Every other source must prove its capability against the provider installed by the host. With no provider, no capability is granted.

Command, task, panel

CommandTaskPanel
May open a modalYesNoNot applicable
ParametersFree-form objectentrees / sorties schemaNone
Chainable in a workflowNoYesNo
Exposed to the AI assistantNoYes, automaticallyNo
Visible in the paletteYesNoThrough <id>.toggle, created for you
RegistrationK.commands.registerK.workflows.declarerTacheK.shell.registerPanel
Domain commands (prefix app.*: app.outils.isofImport, app.donnees.importCSV...) open modals and cannot be automated. To make an operation chainable, declare it as a task. See Workflows and tasks.

Troubleshooting

SymptomCause and check
A panel does not appear, with no message. The file tests K.shell at load time and returns. Use K.whenShellReady().
A command is missing from the palette. The when predicate, the zone, or the capability. K.commands.isAvailable(id) settles it.
A panel is empty after navigation. Its state is held in memory instead of ctx.saveState().
A plugin contribution is ignored at load time. The identifier belongs to another source. The kernel logs a warning and returns an inert token.
No docks on a given page. The page has no .app-layout. The workbench refuses to install itself.