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: BbPluginApiPluginContext 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