+
+
+
diff --git a/src/plugins/comps/components/comps.scss b/src/plugins/comps/components/comps.scss
new file mode 100644
index 00000000000..3003c577d6e
--- /dev/null
+++ b/src/plugins/comps/components/comps.scss
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ * Open MCT, Copyright (c) 2014-2024, United States Government
+ * as represented by the Administrator of the National Aeronautics and Space
+ * Administration. All rights reserved.
+ *
+ * Open MCT is licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * Open MCT includes source code licensed under additional open source
+ * licenses. See the Open Source Licenses file (LICENSES.md) included with
+ * this source code distribution or the Licensing information page available
+ * at runtime from the About dialog for additional information.
+ *****************************************************************************/
+@mixin expressionMsg($fg, $bg) {
+ $op: 0.4;
+ color: rgba($fg, $op * 1.5);
+ background: rgba($bg, $op);
+}
+
+.c-comps {
+ display: flex;
+ flex-direction: column;
+ gap: $interiorMarginLg;
+
+ .is-editing & {
+ padding: $interiorMargin;
+ }
+
+ &__output {
+ display: flex;
+ align-items: baseline;
+ gap: $interiorMargin;
+
+ &-label {
+ flex: 0 0 auto;
+ text-transform: uppercase;
+ }
+
+ &-value {
+ flex: 0 1 auto;
+ }
+ }
+
+ &__section,
+ &__refs {
+ display: flex;
+ flex-direction: column;
+ gap: $interiorMarginSm;
+ }
+
+ &__ref {
+ @include discreteItem();
+ display: grid;
+ gap: $interiorMargin;
+ grid-template-columns: max-content max-content min-content 1fr;
+ padding: $interiorMargin;
+ line-height: 170%; // Aligns text with controls like selects
+ }
+
+ &__path-and-field {
+ align-items: start;
+ display: flex;
+ gap: $interiorMargin;
+ }
+
+ &__expression {
+ *[class*=value] {
+ font-family: monospace;
+ //font-size: 1.1em;
+ resize: vertical; // Only applies to textarea
+ }
+ div[class*=value] {
+ padding: $interiorMargin;
+ }
+ }
+
+ &__expression-msg {
+ @include expressionMsg($colorOkFg, $colorOk);
+ border-radius: $basicCr;
+ display: flex; // Creates hanging indent from :before icon
+ padding: $interiorMarginSm $interiorMarginLg $interiorMarginSm $interiorMargin;
+ //text-wrap: normal;
+ max-width: max-content;
+
+ &:before {
+ content: $glyph-icon-check;
+ font-family: symbolsfont;
+ margin-right: $interiorMarginSm;
+ }
+
+ &.--bad {
+ @include expressionMsg($colorErrorFg, $colorError);
+
+ &:before {
+ content: $glyph-icon-alert-triangle;
+ }
+ }
+ }
+
+ .--em {
+ color: $colorBodyFgEm;
+ //font-weight: bold;
+ }
+}
diff --git a/src/plugins/comps/plugin.js b/src/plugins/comps/plugin.js
new file mode 100644
index 00000000000..19c16769541
--- /dev/null
+++ b/src/plugins/comps/plugin.js
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * Open MCT, Copyright (c) 2014-2024, United States Government
+ * as represented by the Administrator of the National Aeronautics and Space
+ * Administration. All rights reserved.
+ *
+ * Open MCT is licensed under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ * Open MCT includes source code licensed under additional open source
+ * licenses. See the Open Source Licenses file (LICENSES.md) included with
+ * this source code distribution or the Licensing information page available
+ * at runtime from the About dialog for additional information.
+ *****************************************************************************/
+import CompsInspectorViewProvider from './CompsInspectorViewProvider.js';
+import CompsMetadataProvider from './CompsMetadataProvider.js';
+import CompsTelemetryProvider from './CompsTelemetryProvider.js';
+import CompsViewProvider from './CompsViewProvider.js';
+
+export default function CompsPlugin() {
+ const compsManagerPool = {};
+
+ return function install(openmct) {
+ openmct.types.addType('comps', {
+ name: 'Derived Telemetry',
+ key: 'comps',
+ description:
+ 'Add one or more telemetry end points, apply a mathematical operation to them, and output the result as new telemetry.',
+ creatable: true,
+ cssClass: 'icon-derived-telemetry',
+ initialize: function (domainObject) {
+ domainObject.configuration = {
+ comps: {
+ expression: '',
+ parameters: []
+ }
+ };
+ domainObject.composition = [];
+ domainObject.telemetry = {};
+ }
+ });
+ openmct.composition.addPolicy((parent, child) => {
+ if (parent.type === 'comps' && !openmct.telemetry.isTelemetryObject(child)) {
+ return false;
+ }
+ return true;
+ });
+ openmct.telemetry.addProvider(new CompsMetadataProvider(openmct, compsManagerPool));
+ openmct.telemetry.addProvider(new CompsTelemetryProvider(openmct, compsManagerPool));
+ openmct.objectViews.addProvider(new CompsViewProvider(openmct, compsManagerPool));
+ openmct.inspectorViews.addProvider(new CompsInspectorViewProvider(openmct, compsManagerPool));
+ };
+}
diff --git a/src/plugins/condition/components/ConditionSet.vue b/src/plugins/condition/components/ConditionSet.vue
index bdefc5ff5ce..cb473c10b9f 100644
--- a/src/plugins/condition/components/ConditionSet.vue
+++ b/src/plugins/condition/components/ConditionSet.vue
@@ -23,9 +23,9 @@