10. Old (0.4) → new (1.0) quick map
Condensed from spec section 13, Tables C and D. "keep" = same name and meaning; "move" = same capability under a new name or shape; "split"/"merge" as stated; "delete" = no successor.
10.1 Server: BbPluginApi → PluginContext and the manifest
Today (backend-contract.ts) |
New home | Status |
|---|---|---|
bb.pluginId, bb.log |
ctx.pluginId (+ ctx.generation), ctx.log |
keep |
bb.settings.define(descriptors) |
manifest contributes.settings + ctx.preferences.define(key, schema, {scope: "profile", default}); read with kernel/preferences.get |
move |
bb.storage.kv, bb.storage.database(), bb.storage.migrate() |
ctx.storage.kv, ctx.storage.openDatabase(migrations) / database() / migrate() |
keep |
bb.http.route(method, path, handler, {auth}) |
a kind: "custom" method on a defineService ({ http(req, ctx) }) at /api/v1/<plugin>/<service>/<method>; auth: operator | machine | none |
move |
bb.rpc.register(contract, handlers) |
defineService + ctx.provide(def, handlers) |
move |
bb.realtime.publish(channel, payload) |
defineEvent({ name, payload, wire: { to: ["client"], key } }) + ctx.realtime.declare(def) / ctx.realtime.publish(name, payload) |
move |
bb.background.service(name, { start }) |
definePlugin({ background: { [name]: defineBackgroundService(...) } }); runs in a separate background worker |
keep |
bb.background.schedule(name, cron, fn) |
no kernel cron; a timer inside start(signal) with sleep(ms, signal); durable schedules are the automations plugin's |
plugin |
bb.cli.register({...run(argv)}) |
deleted; the CLI is derived from defineService (§8) |
delete |
bb.agents.configure(fn), contributeInstructions(fn) |
ctx.agents.configure({ tools?, instructions?, skills?, env? }) over threads/agent-config (declare uses: {"threads/agent-config": "^1.0.0"}) |
move |
bb.agents.registerTool({...execute}) |
a mutation method with expose: { tool: true }; result gains ui?: { renderer, payload } |
move |
bb.providers.register(declaration) / experimental_registerProvider |
manifest contributes.providers[] + ctx.provide(providerHooks, hooks, providerFacts(decl)) |
move |
bb.ui.requestInput(request) |
interaction.request command brokered by providers/interactions; kind declared in contributes.interactionKinds |
move |
bb.ui.registerMentionProvider({...}) |
provide on the threads/mentions multi contract |
move |
bb.events.on("thread.created" | "thread.idle" | …) |
ctx.commands.after("thread.create" | "thread.archive" | "thread.delete") + ctx.events.on("kernel/thread-head.changed") |
split |
bb.status.needsConfiguration(message) |
ctx.status.needsConfiguration(message) |
keep |
bb.server.loopbackBaseUrl |
ctx.server.baseUrl |
move |
bb.hosts.experimental_client({contract}) |
ctx.hostClient(contract, name) (wired at dc07292bf; D15 described 6f3d4592f) |
move |
bb.hosts.ensureSharedPortTunnel, declareSharedPorts |
the connect plugin's own services |
plugin |
bb.sdk |
ctx.inject(sdk) — the generated client over an in-process transport |
keep |
bb.onDispose(hook) |
ctx.effect(() => disposer); disposal runs effects LIFO |
move |
| — | ctx.provide/inject/tryInject/watch/candidates/facts, ctx.commands.before/after, ctx.events.emit, ctx.preferences, ctx.secrets, RootRef |
new |
10.2 Host tier
Today (host-contract.ts) |
New home |
|---|---|
experimental_defineHostEntry({ contract, handlers, experimental_signals }) |
defineHostEntry({ roles, signals, dispose }); commands derived from the rpc roles |
ctx.experimental_paths / emitSignal / watch / retainWorker |
RoleContext.paths / emitSignal / watch (no-op today) / retain |
client.experimental_onWorkerExit / onSignal |
HostClient.onExit / onSignal |
experimental_createHostEntryHarness |
fakeRoleContext (§9) |
10.3 Provider bridge
| Today | New home |
|---|---|
experimental_defineProviderBridge, experimental_providerBridge |
defineBridge + runBridge (§7) |
experimental_buildBridgeToolCallContent |
bridge-kit toolContentSchema content blocks |
BRIDGE_REQUEST_METHODS.experimentalProvider{Health,Usage,InstallationStatus,InstallationRun} |
provider/health, provider/usage, provider/installation/status, provider/installation/run |
| bridge protocol v2 + old-tree grammar 3 | protocol v3: thread/delta with explicit scope, snake_case kinds, Presentation {label, icon, title?, detail?, suppress?, tint?} |
acpLaunchSpec, customAcpAgents, ACP tier |
deleted; bridgeOptions.launch on the declaration |
10.4 App: app.slots.* → app.slots.register (names from §5)
| Today | New slot / API | Status |
|---|---|---|
slots.homepageSection |
compose.sections (list, pane) |
move |
slots.settingsSection |
settings.plugin:<pluginId> (keyed, root); contributes.settings alone yields the declarative form |
move |
slots.navPanel (+ experimental_fixedTabs, experimental_sidebarAccessory, headerContent) |
app.pages.register + sidebar.nav + page.header.center:<pageId> + app.tabs.register + threadList.row.trailing |
split |
slots.threadPanelAction |
panel.launcher (host thread) + panel.tab:plugin-panel |
split |
slots.experimental_newThreadPanelAction |
panel.launcher (host compose) |
merge |
slots.pendingInteraction |
interaction.renderer:<pluginId>/<rendererId> (keyed, thread) |
move |
slots.sidebarFooterAction |
sidebar.footer (list, root) |
move |
slots.experimental_threadList |
sidebar.body (single, root; Original passed) |
move |
slots.experimental_threadHeaderAction |
thread.header.actions (list, pane) |
move |
slots.fileOpener |
files.opener:<ext> (keyed, pane, * fallback); pin in kernel/pins |
move |
slots.experimental_sourceCodeRenderer / experimental_diffRenderer |
source.renderer / diff.renderer (single, root) |
move |
slots.messageDirective |
markdown.extension (list, root) |
move |
slots.messageAction |
message.action (list, thread) |
move |
slots.experimental_providerIcon |
provider.icon:<providerId> |
move |
composer.customize({ actions, banners, plusMenu, richText }) |
composer.actions, composer.stack, composer.plusMenu, composer.typeahead.source |
split |
contentScripts.register |
app.contentScript (list, root) |
keep |
Targets marked spec in §5 are not built in the Stage 2 slice: settings.plugin, panel.launcher, panel.tab:plugin-panel, files.opener, page.header.center. A migrating author waits for those slots or targets root, sidebar.*, thread.*, and timeline.* today.
10.5 App hooks and components
| Today | New | Status |
|---|---|---|
definePluginApp(setup) |
definePluginApp({ setup(app, config) }) |
keep |
useRpc<Contract>() |
useService(def | "<pluginId>/<service>") |
move |
useRealtime(channel, handler) |
defineQuery({ invalidateOn: [{ name, key }] }); raw events through ctx.events.on |
move |
useRealtimeConnectionState() |
useConnection (spec) — as built, the kernel reloads on a lost socket |
move |
useSettings() |
usePreference(ref) |
merge |
useBbContext() |
usePane() / slot props carry threadId, paneId |
move |
useBbNavigate() |
useNavigation().open / openPath; kernel-ui/layout.dock.addTab |
move |
experimental_useAppPanel, experimental_useFixedTabTarget |
app.tabs.register + TabProps.state |
move |
useComposer(), useComposerView() |
same names (spec 09 §3.14) — not in the built slice yet | keep |
experimental_useSidebarThreads/Actions/PullRequest/Split |
threads/threads.sidebar/update/archive/pin/read/delete… + navigation.open |
move |
ThreadChat, Markdown, experimental_UrlLink/FileLink/SourceCode/Diff/NewThreadComposer |
@bb/ui exports (ThreadChat, Markdown, UrlLink, FileLink, SourceCode, Diff, NewThreadComposer) |
move |
__bbPluginRuntime shim table |
deleted; native import map | delete |
| — | app.commands.register/handle, app.preferences.define, defineQuery/defineMutation/defineRowStore, app.panes.register, app.tabs.register, useToasts, ui-shell/dialogs.open |
new |