mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
feat(region-routing): unified per-family routing cards + region-scoped family→channel routing (#87)
* feat(region-routing): P1 tagging + region_routes primitive + read/write API + preview launcher - config.py: add Coverage.region_tagging (bool=False); add RegionRouteMatrix dataclass (enabled, cells) above NotificationsConfig; add region_routes field to NotificationsConfig; add explicit hydration branch for region_routes in _dict_to_dataclass mirroring destinations pattern. - coverage_area.py: add MonitoringArea.name (str|None=None, frozen); update areas_from_config to preserve name; refactor inline geom extraction from classify_event_areas into shared _event_geom_json helper; add matching_area_names(geom_json, areas)->list[str] (additive, all named matches, config-order, deduped; gate unchanged); add event_region_names convenience wrapper. - coverage_filter.py: add region_tagging ctor kwarg; stamp event.region/ regions before the gate when region_tagging=True and areas non-empty and not event.regions (never clobbers satpass preset). - pipeline/__init__.py: wire region_tagging into CoverageFilter construction. - notification_routes.py: add GET /notifications/regions (named coverage area names, config-order, deduped); GET /notifications/region-routing (matrix as JSON); POST /notifications/region-routing (explicit RMW — only region_routes changes, toggles/rules/destinations survive). - scripts/preview_dashboard.py: mesh-free launcher — dashboard API only, no mesh connector, no broadcast loop; vite runs separately. All 87 coverage tests pass; 300 total pass; 6 pre-existing failures unchanged (adapter config count mismatch + MeshCore EventType.NEW_CONTACT). * feat(region-routing): manual region x family matrix editor page Adds RegionRoutingMatrix.tsx — a plain editor over the region_routes config primitive. Rows = families (via useFamilies()), cols = regions (from GET /api/notifications/regions). Each cell exposes MT channel (ChannelPicker single + includeDisabled), MC channel name (text input), min_severity select (routine/priority/critical/immediate), and an enabled checkbox. Only cells where MT or MC is set are included in the sparse POST payload. Master enable toggle maps to top-level enabled. MT budget guard warns when more than 7 distinct MT indices are in use. Sticky family column; horizontal scroll for wide region sets. Registers route /region-routing in App.tsx and adds "Region Routing" nav entry (Map icon) under the Meshtastic section in Layout.tsx, immediately after Routing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(region-routing): regions endpoint reads saved (disk) coverage so routing columns are dynamic without a bot restart; preview reloads config after writes * feat(routing): unify MT/MC routing into per-family cards; region routing as an in-card expand; remove rules/destinations UI + standalone page * refactor(routing): move Meshtastic Routing from /notifications to /meshtastic/routing (mirror /meshcore/routing); redirect legacy path * feat(region-routing): dispatcher honors region_routes matrix (authoritative-on-match, per-region cooldown, per-channel dedup); non-matrix path unchanged Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(region-routing): matrix dedup key must match boot-restore 2-tuple form (prevents restart re-broadcast flood); regression test --------- Co-authored-by: Matt Johnson <mj@k7zvx.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
ceb95fb80e
commit
2c46c9104d
8638 changed files with 1589821 additions and 2380 deletions
16
work/dashboard-frontend/node_modules/util-deprecate/History.md
generated
vendored
Normal file
16
work/dashboard-frontend/node_modules/util-deprecate/History.md
generated
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
|
||||
1.0.2 / 2015-10-07
|
||||
==================
|
||||
|
||||
* use try/catch when checking `localStorage` (#3, @kumavis)
|
||||
|
||||
1.0.1 / 2014-11-25
|
||||
==================
|
||||
|
||||
* browser: use `console.warn()` for deprecation calls
|
||||
* browser: more jsdocs
|
||||
|
||||
1.0.0 / 2014-04-30
|
||||
==================
|
||||
|
||||
* initial commit
|
||||
24
work/dashboard-frontend/node_modules/util-deprecate/LICENSE
generated
vendored
Normal file
24
work/dashboard-frontend/node_modules/util-deprecate/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
53
work/dashboard-frontend/node_modules/util-deprecate/README.md
generated
vendored
Normal file
53
work/dashboard-frontend/node_modules/util-deprecate/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
util-deprecate
|
||||
==============
|
||||
### The Node.js `util.deprecate()` function with browser support
|
||||
|
||||
In Node.js, this module simply re-exports the `util.deprecate()` function.
|
||||
|
||||
In the web browser (i.e. via browserify), a browser-specific implementation
|
||||
of the `util.deprecate()` function is used.
|
||||
|
||||
|
||||
## API
|
||||
|
||||
A `deprecate()` function is the only thing exposed by this module.
|
||||
|
||||
``` javascript
|
||||
// setup:
|
||||
exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
|
||||
|
||||
|
||||
// users see:
|
||||
foo();
|
||||
// foo() is deprecated, use bar() instead
|
||||
foo();
|
||||
foo();
|
||||
```
|
||||
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
67
work/dashboard-frontend/node_modules/util-deprecate/browser.js
generated
vendored
Normal file
67
work/dashboard-frontend/node_modules/util-deprecate/browser.js
generated
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
/**
|
||||
* Module exports.
|
||||
*/
|
||||
|
||||
module.exports = deprecate;
|
||||
|
||||
/**
|
||||
* Mark that a method should not be used.
|
||||
* Returns a modified function which warns once by default.
|
||||
*
|
||||
* If `localStorage.noDeprecation = true` is set, then it is a no-op.
|
||||
*
|
||||
* If `localStorage.throwDeprecation = true` is set, then deprecated functions
|
||||
* will throw an Error when invoked.
|
||||
*
|
||||
* If `localStorage.traceDeprecation = true` is set, then deprecated functions
|
||||
* will invoke `console.trace()` instead of `console.error()`.
|
||||
*
|
||||
* @param {Function} fn - the function to deprecate
|
||||
* @param {String} msg - the string to print to the console when `fn` is invoked
|
||||
* @returns {Function} a new "deprecated" version of `fn`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function deprecate (fn, msg) {
|
||||
if (config('noDeprecation')) {
|
||||
return fn;
|
||||
}
|
||||
|
||||
var warned = false;
|
||||
function deprecated() {
|
||||
if (!warned) {
|
||||
if (config('throwDeprecation')) {
|
||||
throw new Error(msg);
|
||||
} else if (config('traceDeprecation')) {
|
||||
console.trace(msg);
|
||||
} else {
|
||||
console.warn(msg);
|
||||
}
|
||||
warned = true;
|
||||
}
|
||||
return fn.apply(this, arguments);
|
||||
}
|
||||
|
||||
return deprecated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks `localStorage` for boolean values for the given `name`.
|
||||
*
|
||||
* @param {String} name
|
||||
* @returns {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function config (name) {
|
||||
// accessing global.localStorage can trigger a DOMException in sandboxed iframes
|
||||
try {
|
||||
if (!global.localStorage) return false;
|
||||
} catch (_) {
|
||||
return false;
|
||||
}
|
||||
var val = global.localStorage[name];
|
||||
if (null == val) return false;
|
||||
return String(val).toLowerCase() === 'true';
|
||||
}
|
||||
6
work/dashboard-frontend/node_modules/util-deprecate/node.js
generated
vendored
Normal file
6
work/dashboard-frontend/node_modules/util-deprecate/node.js
generated
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
/**
|
||||
* For Node.js, simply re-export the core `util.deprecate` function.
|
||||
*/
|
||||
|
||||
module.exports = require('util').deprecate;
|
||||
27
work/dashboard-frontend/node_modules/util-deprecate/package.json
generated
vendored
Normal file
27
work/dashboard-frontend/node_modules/util-deprecate/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"name": "util-deprecate",
|
||||
"version": "1.0.2",
|
||||
"description": "The Node.js `util.deprecate()` function with browser support",
|
||||
"main": "node.js",
|
||||
"browser": "browser.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/TooTallNate/util-deprecate.git"
|
||||
},
|
||||
"keywords": [
|
||||
"util",
|
||||
"deprecate",
|
||||
"browserify",
|
||||
"browser",
|
||||
"node"
|
||||
],
|
||||
"author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/TooTallNate/util-deprecate/issues"
|
||||
},
|
||||
"homepage": "https://github.com/TooTallNate/util-deprecate"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue