From the north-star (#613) orchestrator-chat-connector decision: make the orchestrator's chat channel a pluggable, user-chosen connector (tmux | discord | matrix peers) and add Matrix (local homeserver) — starting with the small uniform abstraction so connectors drop in without touching fleet core. Phase 1 (this PR — design + scaffold): - src/fleet/connectors/types.ts: OrchestratorConnector interface (send / subscribe / health per the Lead's spec) + message/config types; thread-aware via optional threadId so Matrix threads + the future first-party Mosaic Discord plugin fit without an interface change. DEFAULT_CONNECTOR_KIND=tmux. - src/fleet/connectors/registry.ts: extensible factory registry; resolveConnectorKind defaults tmux (back-compat); createConnector throws ConnectorNotImplementedError until Phase 2 registers factories. - roster.schema.json: optional connector block (tmux|discord|matrix; matrix homeserver/user/room). Secrets via env (gateway pattern), never the roster. - docs/fleet/f4-matrix-connector.md: interface, config, Matrix client-server API mapping, Conduit-default local homeserver, phasing, back-compat. Self-contained connectors/ module — NO fleet.ts changes, so independent of the in-flight stacked fleet-config PR (#615). Verified: 7 connector tests green; tsc/eslint/prettier/sanitize clean; schema valid JSON. Refs #616, #613 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EsgTQzV5YUGk1JtCLP4B83
148 lines
3.7 KiB
JSON
148 lines
3.7 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://mosaicstack.dev/schemas/fleet-roster.schema.json",
|
|
"title": "Mosaic Fleet Roster",
|
|
"type": "object",
|
|
"required": ["version", "transport", "agents"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"version": {
|
|
"const": 1
|
|
},
|
|
"transport": {
|
|
"const": "tmux"
|
|
},
|
|
"tmux": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"socket_name": {
|
|
"type": "string",
|
|
"default": "mosaic-factory"
|
|
},
|
|
"socketName": {
|
|
"type": "string",
|
|
"default": "mosaic-factory"
|
|
},
|
|
"holder_session": {
|
|
"type": "string",
|
|
"default": "_holder"
|
|
},
|
|
"holderSession": {
|
|
"type": "string",
|
|
"default": "_holder"
|
|
}
|
|
}
|
|
},
|
|
"defaults": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"working_directory": {
|
|
"type": "string",
|
|
"default": "~/src"
|
|
},
|
|
"workingDirectory": {
|
|
"type": "string",
|
|
"default": "~/src"
|
|
}
|
|
}
|
|
},
|
|
"runtimes": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"reset_command": {
|
|
"type": "string"
|
|
},
|
|
"resetCommand": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"agents": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name", "runtime"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"pattern": "^[A-Za-z0-9_.-]+$"
|
|
},
|
|
"runtime": {
|
|
"type": "string"
|
|
},
|
|
"class": {
|
|
"type": "string"
|
|
},
|
|
"working_directory": {
|
|
"type": "string"
|
|
},
|
|
"workingDirectory": {
|
|
"type": "string"
|
|
},
|
|
"model_hint": {
|
|
"type": "string"
|
|
},
|
|
"modelHint": {
|
|
"type": "string"
|
|
},
|
|
"persistent_persona": {
|
|
"oneOf": [{ "type": "boolean" }, { "type": "string" }]
|
|
},
|
|
"persistentPersona": {
|
|
"oneOf": [{ "type": "boolean" }, { "type": "string" }]
|
|
},
|
|
"reset_between_tasks": {
|
|
"type": "boolean"
|
|
},
|
|
"resetBetweenTasks": {
|
|
"type": "boolean"
|
|
},
|
|
"kickstart_template": {
|
|
"type": "string"
|
|
},
|
|
"kickstartTemplate": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"connector": {
|
|
"description": "Orchestrator chat connector (F4). Optional — absent means tmux (back-compat). Secrets (access/bot tokens) come from the environment, never this file.",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["kind"],
|
|
"properties": {
|
|
"kind": {
|
|
"enum": ["tmux", "discord", "matrix"]
|
|
},
|
|
"matrix": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["homeserver_url", "user_id", "room_id"],
|
|
"properties": {
|
|
"homeserver_url": { "type": "string" },
|
|
"user_id": { "type": "string" },
|
|
"room_id": { "type": "string" }
|
|
}
|
|
},
|
|
"discord": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": ["channel_id"],
|
|
"properties": {
|
|
"channel_id": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|