Files
stack/scripts/common.sh
T
jason.woltje 9bd4f1c405 feat(agents): agent seats - per-agent SOUL, role, definitions dir (#36)
- agents/<name>/ holds agent.json (strictly validated: version, name,
  role?, capabilities?, workspace?, session?) + SOUL.md (persona prose)
- agent.sh: definition loading (quote-safe node defaults file), runtime
  SOUL copy to dataRoot/agents/<name>/, MOSAIC_AGENT_SOUL_FILE ->
  loader fills the SOUL slot from the seat's persona (contract SOUL =
  default persona; governance never overridden)
- seat.json written once at instantiation (seatVersion, name, role, at)
- identity section gains agent role; compose passthrough for role+SOUL
- live user context (M14) + seat SOUL compose the full persona:
  governance -> persona -> identity -> user -> mission
- RELEASE -> 0.0.10; packaged and health-gated activated
- example seat committed: agents/researcher

Closes #36
2026-09-03 11:56:38 -05:00

61 lines
2.6 KiB
Bash
Executable File

# Shared helpers for the Mosaic host scripts. Not a documented entry point.
POC_ROOT_MARKER=".mosaic-poc-root"
# Load and validate the Mosaic configuration (config.json), exporting
# MOSAIC_DATA_ROOT, MOSAIC_PROVIDER, and MOSAIC_MODEL.
#
# Fails closed: a missing or invalid configuration aborts the calling
# script before any container or filesystem mutation. Run paths never
# auto-bootstrap; use scripts/bootstrap.sh explicitly.
load_config() {
local config_env
if ! config_env="$(node scripts/mosaic-config.mjs env)"; then
echo "common: configuration load failed" >&2
exit 1
fi
eval "$config_env"
export MOSAIC_DATA_ROOT MOSAIC_PROVIDER MOSAIC_MODEL MOSAIC_ADAPTER
MOSAIC_DEV_DIR="$MOSAIC_DATA_ROOT"
}
# Resolve the release identity: RELEASE is the single source of the
# release version (stays 0.0.X until declared stable); the image tag
# derives from it plus the pinned pi dependency version.
load_release() {
local release pi_version
release="$(tr -d '[:space:]' < RELEASE)"
if ! printf '%s' "$release" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "common: RELEASE must be a semver-ish version, got: '$release'" >&2
exit 1
fi
pi_version="$(node -p "require('./package.json').dependencies['@earendil-works/pi-coding-agent']")"
export MOSAIC_RELEASE="$release"
export MOSAIC_IMAGE_TAG="mosaic-poc-agent:${pi_version}-r${release}"
}
# Ensure the configured runtime data directory exists and carries this
# project's ownership marker. The marker is what scripts/reset.sh requires
# before it will delete anything.
bootstrap_runtime_dir() {
if [ -d "$MOSAIC_DEV_DIR" ]; then
if [ ! -w "$MOSAIC_DEV_DIR" ] || [ ! -x "$MOSAIC_DEV_DIR" ]; then
echo "bootstrap: $MOSAIC_DEV_DIR exists but is not writable by $(id -un)" >&2
echo "bootstrap: a root-owned directory here is usually leftover from a" >&2
echo "bootstrap: Docker-created mount source; remove it and rerun." >&2
exit 1
fi
else
mkdir -p "$MOSAIC_DEV_DIR"
echo "bootstrap: created $MOSAIC_DEV_DIR"
fi
touch "$MOSAIC_DEV_DIR/$POC_ROOT_MARKER"
# Live user context layer (M14): seeded once, owned by the user from
# then on; dispatched to every agent launch without rebuilds.
mkdir -p "$MOSAIC_DEV_DIR/user"
if [ ! -f "$MOSAIC_DEV_DIR/user/USER.md" ]; then
printf '# User\n\nDescribe yourself, your machine, and your preferences here.\nThis file is dispatched to every Mosaic agent launch.\n' \
> "$MOSAIC_DEV_DIR/user/USER.md"
fi
}