Dynamic packages

A dynamic package is an extension Oda writes and runs inside one chat. A package comes with up to two halves: a browser half that adds interface to DataMind Oda, and a host half that does the work behind it. This page covers running, approving, stopping and removing packages. Writing the halves is on The browser half of a dynamic package and The host half of a dynamic package; looking inside the extension runtime is on Inspect and manage extensions.

Run and approve a package

Everything starts from the plugins panel in the sidebar footer, above Settings.

  1. Open the panel and find the package's row.
  2. Choose Run to start its current version. Once you pick a different version, the same action reads Update and replaces the current version with that one.
  3. If the package has a browser half, it may ask for your decision before loading. The panel opens itself when a request arrives and offers Allow this version only, Allow future versions of this plugin or Decline.
  4. The package's own interface appears in the chat, inside the card of its latest run.

A few things to know while you work:

The plugins panel

The plugins panel sits above Settings in the sidebar footer, and it is part of Oda's developer surface: it appears while Developer tools is enabled. Its badge counts the packages that run plus the ones that wait for you, and highlights while an approval is pending. With nothing defined and nothing running, the panel keeps out of the way; open it and its list reads No plugins defined yet.

Open it to see every package the app knows, grouped under This session and Other sessions, with the current chat's packages first. Each row reports a status:

LabelWhat it means
ReadyThe package is defined and idle: nothing is running for it.
Awaiting approvalA run waits for a decision from you.
Client ready to activateThe package has a browser half that this page has not loaded. Run it again here to bring its interface into this page.
RunningThe package runs, whether or not its interface is loaded.
Run failedThe last run failed.
RemovedThe package was removed. Where the history still shows it, it stays greyed rather than disappearing.

A package with no browser half needs no page at all: it runs host-only and reads Running.

The panel also tells you what state the list itself is in:

Stop and remove a package

From a panel row you can end a package's run in two ways:

Both gestures leave a note in the chat, so the assistant knows what happened: that the package was stopped (its versions remain defined) or removed (it no longer exists). Declining tells the chat you rejected the request, and not to ask again unless you ask. A completed run is reported to the chat too.

The cards in the chat follow along:

The cards in the chat

Every step leaves a card that replays the same way later:

Versions and updates

A package can hold several versions.

Scope, trust and limits

Important

The sandbox is not a security boundary. Run only packages you trust, with the same trust you give commands you run in the terminal.

Questions, answered

Where do I manage a package once Oda has defined it?

In the plugins panel: it sits above Settings in the sidebar footer and carries run controls on every row. It lists what runs in this chat first, under This session, then everything else under Other sessions.

What do the labels in the plugins panel mean?

Ready means defined and idle; Awaiting approval means a run needs your decision; Client ready to activate means the browser half is not loaded in this page; Running covers both host-only runs and runs with the interface loaded; Run failed is a failed run; Removed marks a package that was removed but still shows in the history.

How do I approve a package that is waiting for me?

Open the plugins panel (it opens itself when a request arrives) and choose Allow this version only, Allow future versions of this plugin or Decline. Any open window can answer, and the first answer wins. Declining tells the chat you rejected the request.

What is the difference between Stop and Remove?

Stop ends the run and keeps the package defined, ready to run again. Remove stops it and forgets the package and its versions. Both leave a note in the chat so the assistant knows what happened.

Why does a package show Client ready to activate?

The package has a browser half that the page you are looking at has not loaded. That is normal after a page reload, or when the run was carried out from another window. Open the panel in this window and choose Run to load it back into this page.

Can someone approve a package from another window?

Yes, by design. A request is window-wide: every open window sees it, any of them can answer, and the first answer wins. Once it is answered, the other windows' buttons drop away.

Do packages survive a restart, or reach my other chats?

No. A package belongs to the chat that defined it and lives only in the running app: other chats do not see it, and restarting Oda clears it. When a package is needed again, it is defined and run again; the old chat keeps its cards.

How long can a package wait or run?

There is no timeout on a package that waits: one that needs a page suspends until a page answers, and an unattended run stays waiting until the asking turn is cancelled. The only time bound is the host half's first synchronous step, five seconds by default; code that awaits is not cut off by it.

Is it safe to run a package that Oda wrote?

Only if you trust what it does. The sandbox keeps a package away from Oda's internals but is not a security boundary; treat a package like commands you run in the terminal, and run only packages you are comfortable executing.

What happens if an update fails?

The package keeps running its current version. The version that failed stays recorded as the next version, and the transition stays in the Version picker so you can retry or roll back.