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.
Everything starts from the plugins panel in the sidebar footer, above Settings.
A few things to know while you work:
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:
| Label | What it means |
|---|---|
| Ready | The package is defined and idle: nothing is running for it. |
| Awaiting approval | A run waits for a decision from you. |
| Client ready to activate | The package has a browser half that this page has not loaded. Run it again here to bring its interface into this page. |
| Running | The package runs, whether or not its interface is loaded. |
| Run failed | The last run failed. |
| Removed | The 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:
Reading…, never an early empty list.No plugins defined yet.Reading the plugin inventory failed: followed by the reason, and keeps the rows it already had.{count} running.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:
A newer run card is available below, and its status reads Newer run available.This package no longer exists.Every step leaves a card that replays the same way later:
(no purpose given), and the card points to the panel for run controls.A package can hold several versions.
Current: names the version in use, and Next: names the version on its way.The sandbox is not a security boundary. Run only packages you trust, with the same trust you give commands you run in the terminal.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.