mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
* 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>
86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
import Container, { ContainerProps } from './container.js'
|
||
import Document from './document.js'
|
||
import { ProcessOptions } from './postcss.js'
|
||
import Result from './result.js'
|
||
|
||
declare namespace Root {
|
||
export interface RootRaws extends Record<string, any> {
|
||
/**
|
||
* The space symbols after the last child to the end of file.
|
||
*/
|
||
after?: string
|
||
|
||
/**
|
||
* Non-CSS code after `Root`, when `Root` is inside `Document`.
|
||
*
|
||
* **Experimental:** some aspects of this node could change within minor
|
||
* or patch version releases.
|
||
*/
|
||
codeAfter?: string
|
||
|
||
/**
|
||
* Non-CSS code before `Root`, when `Root` is inside `Document`.
|
||
*
|
||
* **Experimental:** some aspects of this node could change within minor
|
||
* or patch version releases.
|
||
*/
|
||
codeBefore?: string
|
||
|
||
/**
|
||
* Is the last child has an (optional) semicolon.
|
||
*/
|
||
semicolon?: boolean
|
||
}
|
||
|
||
export interface RootProps extends ContainerProps {
|
||
/**
|
||
* Information used to generate byte-to-byte equal node string
|
||
* as it was in the origin input.
|
||
* */
|
||
raws?: RootRaws
|
||
}
|
||
|
||
export { Root_ as default }
|
||
}
|
||
|
||
/**
|
||
* Represents a CSS file and contains all its parsed nodes.
|
||
*
|
||
* ```js
|
||
* const root = postcss.parse('a{color:black} b{z-index:2}')
|
||
* root.type //=> 'root'
|
||
* root.nodes.length //=> 2
|
||
* ```
|
||
*/
|
||
declare class Root_ extends Container {
|
||
nodes: NonNullable<Container['nodes']>
|
||
parent: Document | undefined
|
||
raws: Root.RootRaws
|
||
type: 'root'
|
||
|
||
constructor(defaults?: Root.RootProps)
|
||
|
||
assign(overrides: object | Root.RootProps): this
|
||
clone(overrides?: Partial<Root.RootProps>): this
|
||
cloneAfter(overrides?: Partial<Root.RootProps>): this
|
||
cloneBefore(overrides?: Partial<Root.RootProps>): this
|
||
|
||
/**
|
||
* Returns a `Result` instance representing the root’s CSS.
|
||
*
|
||
* ```js
|
||
* const root1 = postcss.parse(css1, { from: 'a.css' })
|
||
* const root2 = postcss.parse(css2, { from: 'b.css' })
|
||
* root1.append(root2)
|
||
* const result = root1.toResult({ to: 'all.css', map: true })
|
||
* ```
|
||
*
|
||
* @param options Options.
|
||
* @return Result with current root’s CSS.
|
||
*/
|
||
toResult(options?: ProcessOptions): Result
|
||
}
|
||
|
||
declare class Root extends Root_ {}
|
||
|
||
export = Root
|