Mental Model
Plugin → Tool → Run → Trace, defined once.
This page defines every load-bearing term once. Every other page in the docs uses these terms exactly as defined here.
Mermaid render failed: org.eclipse.elk.core.UnsupportedConfigurationException: Layout algorithm 'layered' not found for Root Node root
Plugins expose Tools. Skills teach the agent when to use them. Exec runs them. Functions and Apps make Exec reusable. Every call leaves a Trace.
The objects
| Term | Definition | Lives in |
|---|---|---|
| Workspace | Top-level isolation boundary. Owns its plugins, skills, functions, apps, traces, and members. | apps/api D1 |
| Plugin | A connected service Harbor knows how to talk to. Each plugin instance has a namespace (e.g. linearMcp). | plugin_sources table |
| Source | The technical instantiation of a Plugin in a workspace — has credentials, a state, and a set of Tools. (You'll see "plugin" in marketing copy; "source" in API responses.) | plugin_sources |
| Tool | A discoverable function exposed by a Source. Has an input schema, output schema, read/write hint. | plugin_tools |
| Skill | Agent-facing markdown that teaches an LLM when to use a tool (or set of tools) and how to wire the args. | workspace_skills |
| Exec | A one-off TypeScript run inside Harbor's cloud isolate. Triggered by hrbr exec or the MCP exec tool. | /plugins/execute |
| Function | A named, versioned, optionally scheduled piece of TypeScript. The reusable form of Exec. Wraps defineJob. (Marketing calls them "Functions"; the code says orbit_jobs.) | orbit_jobs |
| App | A Function exposed at a public URL with HTTP routes. deployApp. | orbit_apps |
| Run | One execution of an Exec, Function, App-handler, or Workflow. Has a status, duration, artifacts. | runs |
| Trace | The hierarchical record of a Run + every tool call it made. | runs + run_spans |
The verbs
How the objects connect to each other in practice — first the discovery
- invocation flow, then the authoring + publish flow.
Discovery → invocation
Mermaid render failed: org.eclipse.elk.core.UnsupportedConfigurationException: Layout algorithm 'layered' not found for Root Node root
Authoring → publish
Mermaid render failed: org.eclipse.elk.core.UnsupportedConfigurationException: Layout algorithm 'layered' not found for Root Node root
The two vocabularies
Harbor's user-facing word for some concepts differs from the code-name. Both are valid; use the user-facing name in your code/comments unless you're specifically calling out the API contract.
| User-facing (use this) | Code-name (see in SDK/API) |
|---|---|
| Plugin | source |
| Function | Orbit Job · defineJob |
| App | Orbit App · deployApp |
| Local MCP bridge | Cliff |
| CLI | Coast → hrbr |
| Hosted MCP server | Lighthouse |
Full table: Glossary.
What's not in the mental model
- "Workflows" — not a user concept. It's an execution lane inside
Exec/Functions triggered by
step.*calls. Never appears in the dashboard nav as a separate thing. - "Triggers" — not a user concept. Functions can be scheduled; Workflows can wait for events; Plugins can emit webhooks. Each is named for what it actually is, not unified under a "Triggers" word.
- "Sand" — internal name for the local-CLI bridge. Surfaced only in the For Agents → Connecting page.