Skip to content

Package lifecycle integration

Omega Lisp packages and Matrix-3 packages have separate manifests: manifest.json (Omega) vs matrix.json (Matrix). They cover different concerns, but the metadata model is parallel — once you know one, you can read the other.

Side-by-side: a Lisp package vs a Matrix package

Omega package — packages/agents/

json
// manifest.json
{
  "name": "agents",
  "version": "0.1.0",
  "description": "Agent delegation with amb-based selection",
  "entry": "lib/agents.lisp",
  "exports": ["agents"],
  "effects": ["agent.spawn.op", "agent.run.op"],
  "requires": []
}
lisp
;; lib/agents.lisp
(define-package "agents"
  :description "Agent delegation with amb-based selection"
  :exports '(agents)
  :effects '(agent.spawn.op agent.run.op)
  :requires '()
  :version "0.1.0"
)

The two MUST stay in sync. The define-package form is the in-language declaration; manifest.json is the load-time metadata used by the package loader.

Matrix package — projects/matrix-3/packages/agents/

json
// matrix.json
{
  "name": "@open-matrix/agents",
  "version": "0.1.7",
  "namespace": "system.agents",
  "tier": 1,
  "root": { "type": "AgentsRoot", "export": "AgentsRoot" },
  "components": [
    { "type": "MemoryActor", "mount": "memory", "surface": "headless" },
    { "type": "EmbeddingService", "mount": "embeddings", "surface": "headless" }
  ],
  "exports": ["memory", "embeddings"],
  "storage": { "sqlite": { ... } },
  "permissions": { "fsPolicy": "project-readwrite", ... }
}

How the lifecycles compare

StageOmegaMatrix
Buildpnpm --filter @omega/<name> buildpnpm --filter @open-matrix/<name> build
Install(require '<name>) at REPL or in another packagematrix install <name> then matrix up <name>
Discover:packages, :doc, :apropossystem.registry.list, system.catalog.search
Mountimplicit on require (binds exports into caller's env)runtime mounts components at declared mounts via system.runtimes.start
Unmountdrop the bindingmatrix down <runtime-id> or system.runtimes.stop

Cross-package references

When an Omega Lisp package wants to invoke a Matrix actor (e.g. system.registry), the path is:

  1. The host Matrix actor for the Omega session knows the bus context.
  2. Omega's (effect matrix.invoke.op target op payload) (via the wired EffectBackend) calls RequestReply.execute.
  3. The result is an Omega value the caller can use.

When a Matrix package wants to call an Omega routine, the path is:

  1. The Matrix actor invokes system.agents $eval with the source.
  2. The session's OmegaSandbox evaluates and returns.

Neither model imports the other's package directly. The bridge is always the bus or the sandbox.

Versioning

Omega packages use version in manifest.json and the :version keyword in define-package. Bumps are manual; there's no auto-published registry.

Matrix packages use version in matrix.json and package.json. The tier field (in matrix.json) is a separate organizing concept (tier: 1 for system actors).

See also

Source: projects/omega-lisp/packages/agents/lib/agents.lisp (canonical Lisp manifest), projects/matrix-3/packages/agents/matrix.json (canonical Matrix manifest), projects/omega-lisp/src/core/modules/compileModule.ts (manifest consumer).