TenantAtlas/apps/platform/.pnpm-store/v10/files/2e/da0ab891571af23d29b5aa1ec3e43d82a77e809e3745f5183c92c421ad7040e2ddd946873fc134d3ea481360dd158610cf432619a2684ff726fad5e34d255d
ahmido 1fec9c6f9d
Some checks failed
Main Confidence / confidence (push) Failing after 45s
feat: compress governance operator outcomes (#253)
## Summary
- introduce surface-aware compressed governance outcomes and reuse the shared truth/explanation seams for operator-first summaries
- apply the compressed outcome hierarchy across baseline, evidence, review, review-pack, canonical review/evidence, and artifact-oriented operation-run surfaces
- expand spec 214 fixtures and Pest coverage, and fix tenant-panel route assertions by generating explicit tenant-panel URLs in the affected Filament tests

## Validation
- `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent`
- focused governance compression suite from `specs/214-governance-outcome-compression/quickstart.md` passed (`68` tests, `445` assertions)
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/InventoryItemResourceTest.php tests/Feature/Filament/BackupSetUiEnforcementTest.php tests/Feature/Filament/RestoreRunUiEnforcementTest.php` passed (`18` tests, `81` assertions)

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #253
2026-04-19 12:30:36 +00:00

48 lines
1.9 KiB
Plaintext

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.KillOnSignal = void 0;
const operators_1 = require("rxjs/operators");
const SIGNALS = ['SIGINT', 'SIGTERM', 'SIGHUP'];
/**
* Watches the main concurrently process for signals and sends the same signal down to each spawned
* command.
*/
class KillOnSignal {
process;
abortController;
constructor({ process, abortController, }) {
this.process = process;
this.abortController = abortController;
}
handle(commands) {
let caughtSignal;
const signalListener = (signal) => {
caughtSignal = signal;
this.abortController?.abort();
commands.forEach((command) => command.kill(signal));
};
SIGNALS.forEach((signal) => this.process.on(signal, signalListener));
return {
commands: commands.map((command) => {
const closeStream = command.close.pipe((0, operators_1.map)((exitInfo) => {
const exitCode = caughtSignal === 'SIGINT' ? 0 : exitInfo.exitCode;
return { ...exitInfo, exitCode };
}));
// Return a proxy so that mutations happen on the original Command object.
// If either `Object.assign()` or `Object.create()` were used, it'd be hard to
// reflect the mutations on Command objects referenced by previous flow controllers.
return new Proxy(command, {
get(target, prop) {
return prop === 'close' ? closeStream : target[prop];
},
});
}),
onFinish: () => {
// Avoids MaxListenersExceededWarning when running programmatically
SIGNALS.forEach((signal) => this.process.off(signal, signalListener));
},
};
}
}
exports.KillOnSignal = KillOnSignal;