@codyswann/lisa 2.275.0 → 2.277.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/ui-cmd.d.ts +3 -0
- package/dist/cli/ui-cmd.d.ts.map +1 -1
- package/dist/cli/ui-cmd.js +11 -2
- package/dist/cli/ui-cmd.js.map +1 -1
- package/dist/cli/ui-health.d.ts +18 -0
- package/dist/cli/ui-health.d.ts.map +1 -0
- package/dist/cli/ui-health.js +140 -0
- package/dist/cli/ui-health.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +15 -3
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +30 -0
- package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +30 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +30 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-setup-automations/SKILL.md +30 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +30 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-setup-automations/SKILL.md +30 -0
- package/ui/README.md +18 -10
- package/ui/index.html +316 -96
package/dist/cli/ui-cmd.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as http from "node:http";
|
|
|
2
2
|
import { type JsonObject } from "../sync/json-path.js";
|
|
3
3
|
import { type RemoteEnvironmentStatus } from "./remote-environment.js";
|
|
4
4
|
import { type StatusProbe } from "./ui-status.js";
|
|
5
|
+
import { type UiHealthDependencies } from "./ui-health.js";
|
|
5
6
|
export { createGithubAuthProbe, runProbe, type GitRemoteReader, type GithubAuthCheck, type ProbeResult, type StatusProbe, } from "./ui-status.js";
|
|
6
7
|
export { createGithubRepoProbe } from "./ui-github-repo.js";
|
|
7
8
|
export { createEnabledPluginsProbe, buildEnabledPluginsValue, listMarketplacePluginsFromDisk, type EnabledPluginRow, type EnabledPluginsValue, type MarketplacePlugin, } from "./ui-enabled-plugins.js";
|
|
@@ -24,6 +25,8 @@ export interface UiCmdOptions {
|
|
|
24
25
|
export interface UiRuntimeDependencies {
|
|
25
26
|
/** Status probes exposed by GET /api/status. */
|
|
26
27
|
readonly probes?: readonly StatusProbe[];
|
|
28
|
+
/** Health storage and execution boundaries exposed by /api/health. */
|
|
29
|
+
readonly health?: Partial<UiHealthDependencies>;
|
|
27
30
|
}
|
|
28
31
|
/**
|
|
29
32
|
* Locate the packaged `ui/index.html` by walking up from this module until a
|
package/dist/cli/ui-cmd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-cmd.d.ts","sourceRoot":"","sources":["../../src/cli/ui-cmd.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ui-cmd.d.ts","sourceRoot":"","sources":["../../src/cli/ui-cmd.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,6CAA6C;AAC7C,eAAO,MAAM,eAAe,OAAO,CAAC;AAKpC,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,sDAAsD;AACtD,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACjD;AAYD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUnD;AAmBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,iBAAiB,GAAE,uBAIlB,GACA,MAAM,CAQR;AAuKD;;;;;;GAMG;AACH,wBAAsB,KAAK,CACzB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE,YAAiB,EAC1B,YAAY,GAAE,qBAA0B,GACvC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CA4CtB"}
|
package/dist/cli/ui-cmd.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* `window.LISA_LIVE_CONFIG`, which the page uses to hydrate its controls.
|
|
8
8
|
* @module cli/ui-cmd
|
|
9
9
|
*/
|
|
10
|
+
/* eslint-disable max-lines -- the central UI route registry stays auditable in one module */
|
|
10
11
|
import { existsSync } from "node:fs";
|
|
11
12
|
import { readFile } from "node:fs/promises";
|
|
12
13
|
import * as http from "node:http";
|
|
@@ -27,6 +28,7 @@ import { createEnabledPluginsProbe } from "./ui-enabled-plugins.js";
|
|
|
27
28
|
import { createAutomationsProbe } from "./ui-automations.js";
|
|
28
29
|
import { createObservabilityProviderProbes } from "./ui-observability-providers.js";
|
|
29
30
|
import { serveConfigWrite } from "./ui-config-write.js";
|
|
31
|
+
import { createUiHealthHandler, } from "./ui-health.js";
|
|
30
32
|
export { createGithubAuthProbe, runProbe, } from "./ui-status.js";
|
|
31
33
|
export { createGithubRepoProbe } from "./ui-github-repo.js";
|
|
32
34
|
export { createEnabledPluginsProbe, buildEnabledPluginsValue, listMarketplacePluginsFromDisk, } from "./ui-enabled-plugins.js";
|
|
@@ -202,10 +204,12 @@ function isLoopbackHost(host) {
|
|
|
202
204
|
* @param page - Hydrated settings console HTML
|
|
203
205
|
* @param probes - Live-status probes registered for this server
|
|
204
206
|
* @param destDir - Project root served by this UI process
|
|
207
|
+
* @param healthDependencies - Injectable Health v1 storage/run boundaries
|
|
205
208
|
* @returns Loopback HTTP request handler
|
|
206
209
|
*/
|
|
207
|
-
function createUiRequestHandler(page, probes, destDir) {
|
|
210
|
+
function createUiRequestHandler(page, probes, destDir, healthDependencies = {}) {
|
|
208
211
|
const readSnapshot = createStatusSnapshotReader(probes);
|
|
212
|
+
const serveHealth = createUiHealthHandler(destDir, healthDependencies);
|
|
209
213
|
validateStatusProbes(probes);
|
|
210
214
|
return (request, response) => {
|
|
211
215
|
if (!isLoopbackHost(request.headers.host)) {
|
|
@@ -227,6 +231,10 @@ function createUiRequestHandler(page, probes, destDir) {
|
|
|
227
231
|
serveConfigWrite(request, response, destDir);
|
|
228
232
|
return;
|
|
229
233
|
}
|
|
234
|
+
if (pathname === "/api/health") {
|
|
235
|
+
serveHealth(request, response);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
230
238
|
if (pathname === "/" || pathname === "/index.html") {
|
|
231
239
|
response.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
232
240
|
response.end(page);
|
|
@@ -270,7 +278,7 @@ export async function runUi(targetPath, options = {}, dependencies = {}) {
|
|
|
270
278
|
...createObservabilityProviderProbes(),
|
|
271
279
|
createAutomationsProbe({ cwd: destDir }),
|
|
272
280
|
];
|
|
273
|
-
const server = http.createServer(createUiRequestHandler(page, probes, destDir));
|
|
281
|
+
const server = http.createServer(createUiRequestHandler(page, probes, destDir, dependencies.health));
|
|
274
282
|
await new Promise(resolve => {
|
|
275
283
|
server.listen(port, "127.0.0.1", resolve);
|
|
276
284
|
});
|
|
@@ -281,4 +289,5 @@ export async function runUi(targetPath, options = {}, dependencies = {}) {
|
|
|
281
289
|
console.log("Press Ctrl+C to stop.");
|
|
282
290
|
return server;
|
|
283
291
|
}
|
|
292
|
+
/* eslint-enable max-lines -- restore repository default */
|
|
284
293
|
//# sourceMappingURL=ui-cmd.js.map
|
package/dist/cli/ui-cmd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-cmd.js","sourceRoot":"","sources":["../../src/cli/ui-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,wBAAwB,GAEzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,QAAQ,GAKT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,GAI/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAGzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GAKzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,iBAAiB,GAAG,iCAAiC,CAAC;AAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-cmd.js","sourceRoot":"","sources":["../../src/cli/ui-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Same-origin Health v1 endpoint for `lisa ui`. */
|
|
2
|
+
import * as http from "node:http";
|
|
3
|
+
import { readLatestHealthResult, runPersistedHealth } from "../health/index.js";
|
|
4
|
+
/** Health boundaries injectable by endpoint and browser tests. */
|
|
5
|
+
export interface UiHealthDependencies {
|
|
6
|
+
readonly readLatest: typeof readLatestHealthResult;
|
|
7
|
+
readonly runPersisted: typeof runPersistedHealth;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build one project-bound Health endpoint with a coalesced run boundary.
|
|
11
|
+
* The closure is the only place the UI server's resolved project directory is
|
|
12
|
+
* retained; request data can never select another target.
|
|
13
|
+
* @param destDir - Server-bound project root
|
|
14
|
+
* @param dependencies - Optional Health storage/run boundaries
|
|
15
|
+
* @returns Bound Health request handler
|
|
16
|
+
*/
|
|
17
|
+
export declare function createUiHealthHandler(destDir: string, dependencies?: Partial<UiHealthDependencies>): (request: http.IncomingMessage, response: http.ServerResponse) => void;
|
|
18
|
+
//# sourceMappingURL=ui-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-health.d.ts","sourceRoot":"","sources":["../../src/cli/ui-health.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAM5B,kEAAkE;AAClE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,sBAAsB,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,OAAO,kBAAkB,CAAC;CAClD;AA6ED;;;;;;;GAOG;AAEH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC/C,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,CAwFxE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { readLatestHealthResult, runPersistedHealth, serializeHealthResult, } from "../health/index.js";
|
|
2
|
+
const JSON_CONTENT_TYPE = "application/json; charset=utf-8";
|
|
3
|
+
const NO_STORE = "no-store";
|
|
4
|
+
const TEXT_CONTENT_TYPE = "text/plain; charset=utf-8";
|
|
5
|
+
const DEFAULT_DEPENDENCIES = {
|
|
6
|
+
readLatest: readLatestHealthResult,
|
|
7
|
+
runPersisted: runPersistedHealth,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Restrict origins to the exact loopback authority advertised by `lisa ui`.
|
|
11
|
+
* @param origin - Incoming Origin header
|
|
12
|
+
* @param host - Incoming Host header
|
|
13
|
+
* @returns Whether origin exactly matches the loopback listener
|
|
14
|
+
*/
|
|
15
|
+
function isExpectedLoopbackOrigin(origin, host) {
|
|
16
|
+
if (origin === undefined || host === undefined)
|
|
17
|
+
return false;
|
|
18
|
+
try {
|
|
19
|
+
const parsed = new URL(origin);
|
|
20
|
+
return (origin === parsed.origin &&
|
|
21
|
+
parsed.protocol === "http:" &&
|
|
22
|
+
parsed.host === host &&
|
|
23
|
+
isLoopbackHost(parsed.host));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Match the config writer's accepted 127.0.0.1 authority shape.
|
|
31
|
+
* @param host - URL authority to inspect
|
|
32
|
+
* @returns Whether the authority is valid loopback
|
|
33
|
+
*/
|
|
34
|
+
function isLoopbackHost(host) {
|
|
35
|
+
if (host === "127.0.0.1")
|
|
36
|
+
return true;
|
|
37
|
+
const prefix = "127.0.0.1:";
|
|
38
|
+
if (!host.startsWith(prefix))
|
|
39
|
+
return false;
|
|
40
|
+
const portText = host.slice(prefix.length);
|
|
41
|
+
const digitsOnly = Array.from(portText).every(character => character >= "0" && character <= "9");
|
|
42
|
+
const port = Number(portText);
|
|
43
|
+
return (portText.length > 0 &&
|
|
44
|
+
portText.length <= 5 &&
|
|
45
|
+
digitsOnly &&
|
|
46
|
+
port > 0 &&
|
|
47
|
+
port <= 65_535);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Write a no-store response without leaking runtime or filesystem details.
|
|
51
|
+
* @param response - HTTP response
|
|
52
|
+
* @param status - HTTP status code
|
|
53
|
+
* @param body - Response payload
|
|
54
|
+
* @param contentType - Response media type
|
|
55
|
+
* @param headers - Additional response headers
|
|
56
|
+
*/
|
|
57
|
+
function reply(response, status, body, contentType = JSON_CONTENT_TYPE, headers = {}) {
|
|
58
|
+
response.writeHead(status, {
|
|
59
|
+
"cache-control": NO_STORE,
|
|
60
|
+
"content-type": contentType,
|
|
61
|
+
...headers,
|
|
62
|
+
});
|
|
63
|
+
response.end(body);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build one project-bound Health endpoint with a coalesced run boundary.
|
|
67
|
+
* The closure is the only place the UI server's resolved project directory is
|
|
68
|
+
* retained; request data can never select another target.
|
|
69
|
+
* @param destDir - Server-bound project root
|
|
70
|
+
* @param dependencies - Optional Health storage/run boundaries
|
|
71
|
+
* @returns Bound Health request handler
|
|
72
|
+
*/
|
|
73
|
+
// eslint-disable-next-line max-lines-per-function -- route branches and single-flight state remain colocated
|
|
74
|
+
export function createUiHealthHandler(destDir, dependencies = {}) {
|
|
75
|
+
const deps = { ...DEFAULT_DEPENDENCIES, ...dependencies };
|
|
76
|
+
// eslint-disable-next-line functional/no-let -- one server-local single-flight is cleared after settlement
|
|
77
|
+
let inFlight;
|
|
78
|
+
/**
|
|
79
|
+
* Return the active deterministic run, starting one when none is pending.
|
|
80
|
+
* @returns The active persisted Health run
|
|
81
|
+
*/
|
|
82
|
+
const runOnce = () => {
|
|
83
|
+
if (inFlight === undefined) {
|
|
84
|
+
const pending = deps.runPersisted(destDir);
|
|
85
|
+
inFlight = pending;
|
|
86
|
+
/** Release this run only when it is still the active single-flight. */
|
|
87
|
+
const clear = () => {
|
|
88
|
+
if (inFlight === pending)
|
|
89
|
+
inFlight = undefined;
|
|
90
|
+
};
|
|
91
|
+
void pending.then(clear, clear);
|
|
92
|
+
}
|
|
93
|
+
return inFlight;
|
|
94
|
+
};
|
|
95
|
+
return (request, response) => {
|
|
96
|
+
if (request.method === "HEAD") {
|
|
97
|
+
reply(response, 200, "");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (request.method === "GET") {
|
|
101
|
+
void deps
|
|
102
|
+
.readLatest(destDir)
|
|
103
|
+
.then(outcome => {
|
|
104
|
+
if (outcome.status === "available") {
|
|
105
|
+
reply(response, 200, serializeHealthResult(outcome.result));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (outcome.status === "never-run") {
|
|
109
|
+
reply(response, 404, JSON.stringify({ error: "No Lisa health result is available" }));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
reply(response, 500, JSON.stringify({ error: "Unable to read Lisa health" }));
|
|
113
|
+
})
|
|
114
|
+
.catch(() => {
|
|
115
|
+
reply(response, 500, JSON.stringify({ error: "Unable to read Lisa health" }));
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (request.method === "POST") {
|
|
120
|
+
if (!isExpectedLoopbackOrigin(request.headers.origin, request.headers.host)) {
|
|
121
|
+
reply(response, 403, JSON.stringify({
|
|
122
|
+
error: "Health runs require the same Lisa console origin",
|
|
123
|
+
}));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
void runOnce()
|
|
127
|
+
.then(completed => {
|
|
128
|
+
reply(response, 200, completed.serialized);
|
|
129
|
+
})
|
|
130
|
+
.catch(() => {
|
|
131
|
+
reply(response, 500, JSON.stringify({ error: "Unable to run Lisa health" }));
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
reply(response, 405, "Method not allowed", TEXT_CONTENT_TYPE, {
|
|
136
|
+
allow: "GET, HEAD, POST",
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=ui-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-health.js","sourceRoot":"","sources":["../../src/cli/ui-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsgEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsgEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAwkMjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -512,7 +512,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
512
512
|
"plugins/src/base/skills/lisa-security-zap-scan/SKILL.md": "a5189442dbf970cc49fd089ab03c386c8a205b856e09501f6ad1966321e7e4b5",
|
|
513
513
|
"plugins/src/base/skills/lisa-sentry-access/SKILL.md": "ecaf49b42bbf399781a3ebd0b1595e5a8ac44422537832e0442b2f184da0c83c",
|
|
514
514
|
"plugins/src/base/skills/lisa-setup-atlassian/SKILL.md": "3820aecb57d184fde1cfa988e7e1402d8f2a766a0b3ffbb576de5a6a72b3d5c5",
|
|
515
|
-
"plugins/src/base/skills/lisa-setup-automations/SKILL.md": "
|
|
515
|
+
"plugins/src/base/skills/lisa-setup-automations/SKILL.md": "d4d2deb758691fb636c7a742c96a2db8c70d13494aa0e0f96bc715fe4005f693",
|
|
516
516
|
"plugins/src/base/skills/lisa-setup-confluence/SKILL.md": "e92d762dbdaeae671c3e52dfe8e10d40a10b606b5e050589181a3898649faedc",
|
|
517
517
|
"plugins/src/base/skills/lisa-setup-github-repo/SKILL.md": "b9b223a5ffad2f88e3fde5831b60fea9bdc2c981750c49d03bb046d43772a0d3",
|
|
518
518
|
"plugins/src/base/skills/lisa-setup-github/SKILL.md": "75435e81130abd21c678d302b7a220da95a19868d122ca93168278628b200666",
|
|
@@ -1025,8 +1025,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1025
1025
|
"typescript/merge/.claude/settings.json": "8cc0b88780f4cbca5effa196a4e272953f835e7dc46572a31ab1e74130bb5e48",
|
|
1026
1026
|
"typescript/merge/.oxlintrc.json": "4debc093acfd263eb81ae15894073ebf098513204f45f40b83fb8fa5353fa1f8",
|
|
1027
1027
|
"typescript/package-lisa/package.lisa.json": "7e99286c549c79b1c02c07a4313dcfe5b41b4ebb80a6fbbb8741dd74dc5f454d",
|
|
1028
|
-
"ui/README.md": "
|
|
1029
|
-
"ui/index.html": "
|
|
1028
|
+
"ui/README.md": "deeb35e767ea5dd2883268835ea3ad21cbad9fa63ec8d8ff5e200f0e2a7d2751",
|
|
1029
|
+
"ui/index.html": "8dcbeda2160ce6c443382613a2319fe6253ffe2c0cdeea567034400cdea91152",
|
|
1030
1030
|
});
|
|
1031
1031
|
/** Exact paths tracked by the public Lisa repository at generation time. */
|
|
1032
1032
|
export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
@@ -1269,6 +1269,14 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
1269
1269
|
"eslint.ignore.config.json": true,
|
|
1270
1270
|
"eslint.slow.config.ts": true,
|
|
1271
1271
|
"eslint.thresholds.json": true,
|
|
1272
|
+
"evidence/1529/browser-drift.png": true,
|
|
1273
|
+
"evidence/1529/browser-failure.png": true,
|
|
1274
|
+
"evidence/1529/browser-in-band.png": true,
|
|
1275
|
+
"evidence/1529/cli-output.json": true,
|
|
1276
|
+
"evidence/1529/comment.md": true,
|
|
1277
|
+
"evidence/1529/failure-transcript.txt": true,
|
|
1278
|
+
"evidence/1529/playwright-output.log": true,
|
|
1279
|
+
"evidence/1529/verdict.json": true,
|
|
1272
1280
|
"evidence/1537/authenticated-real-values.png": true,
|
|
1273
1281
|
"evidence/1537/probe-failure-degrades-not-fabricates.png": true,
|
|
1274
1282
|
"evidence/1537/unauthenticated-unknown-states.png": true,
|
|
@@ -6280,6 +6288,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6280
6288
|
"src/cli/ui-github-repo-gh.ts": true,
|
|
6281
6289
|
"src/cli/ui-github-repo-map.ts": true,
|
|
6282
6290
|
"src/cli/ui-github-repo.ts": true,
|
|
6291
|
+
"src/cli/ui-health.ts": true,
|
|
6283
6292
|
"src/cli/ui-lisa-version.ts": true,
|
|
6284
6293
|
"src/cli/ui-observability-checks.ts": true,
|
|
6285
6294
|
"src/cli/ui-observability-providers.ts": true,
|
|
@@ -6468,6 +6477,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6468
6477
|
"tests/e2e/ui-ci-quality-jobs.spec.ts": true,
|
|
6469
6478
|
"tests/e2e/ui-deploy-pipeline.spec.ts": true,
|
|
6470
6479
|
"tests/e2e/ui-github-repo-panel.spec.ts": true,
|
|
6480
|
+
"tests/e2e/ui-health.spec.ts": true,
|
|
6471
6481
|
"tests/e2e/ui-live-status.spec.ts": true,
|
|
6472
6482
|
"tests/e2e/ui-observability-providers.spec.ts": true,
|
|
6473
6483
|
"tests/e2e/ui-plugins.spec.ts": true,
|
|
@@ -6566,6 +6576,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6566
6576
|
"tests/unit/cli/ui-github-repo-map.test.ts": true,
|
|
6567
6577
|
"tests/unit/cli/ui-github-repo.test.ts": true,
|
|
6568
6578
|
"tests/unit/cli/ui-health-schedule-write.test.ts": true,
|
|
6579
|
+
"tests/unit/cli/ui-health.test.ts": true,
|
|
6569
6580
|
"tests/unit/cli/ui-lisa-version-probe.test.ts": true,
|
|
6570
6581
|
"tests/unit/cli/ui-observability-providers-probe.test.ts": true,
|
|
6571
6582
|
"tests/unit/cli/ui-status-contract.test.ts": true,
|
|
@@ -6870,6 +6881,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6870
6881
|
"tests/unit/strategies/repo-scope-claim.test.ts": true,
|
|
6871
6882
|
"tests/unit/strategies/rework-triage-skill.test.ts": true,
|
|
6872
6883
|
"tests/unit/strategies/security-two-bucket-contract.test.ts": true,
|
|
6884
|
+
"tests/unit/strategies/setup-automations-readiness-warning.test.ts": true,
|
|
6873
6885
|
"tests/unit/strategies/setup-confluence-verified-parent.test.ts": true,
|
|
6874
6886
|
"tests/unit/strategies/setup-github-prd-verified-label.test.ts": true,
|
|
6875
6887
|
"tests/unit/strategies/setup-github-project-verification.test.ts": true,
|