@evermore.work/server 2026.518.0-canary.1 → 2026.520.0-canary.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/dev-server-status.d.ts +6 -0
- package/dist/dev-server-status.d.ts.map +1 -1
- package/dist/dev-server-status.js +16 -1
- package/dist/dev-server-status.js.map +1 -1
- package/dist/middleware/board-mutation-guard.d.ts.map +1 -1
- package/dist/middleware/board-mutation-guard.js +5 -2
- package/dist/middleware/board-mutation-guard.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +29 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +94 -1
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +75 -0
- package/dist/routes/plugins.js.map +1 -1
- package/dist/routes/secrets.d.ts.map +1 -1
- package/dist/routes/secrets.js +37 -10
- package/dist/routes/secrets.js.map +1 -1
- package/dist/secrets/aws-secrets-manager-provider.d.ts.map +1 -1
- package/dist/secrets/aws-secrets-manager-provider.js +216 -0
- package/dist/secrets/aws-secrets-manager-provider.js.map +1 -1
- package/dist/secrets/types.d.ts +8 -1
- package/dist/secrets/types.d.ts.map +1 -1
- package/dist/secrets/types.js.map +1 -1
- package/dist/services/heartbeat.d.ts +1 -0
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +13 -13
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/plugin-capability-validator.d.ts.map +1 -1
- package/dist/services/plugin-capability-validator.js +1 -0
- package/dist/services/plugin-capability-validator.js.map +1 -1
- package/dist/services/plugin-environment-driver.js +2 -2
- package/dist/services/plugin-environment-driver.js.map +1 -1
- package/dist/services/plugin-host-services.d.ts.map +1 -1
- package/dist/services/plugin-host-services.js +49 -0
- package/dist/services/plugin-host-services.js.map +1 -1
- package/dist/services/plugin-registry.d.ts +8 -8
- package/dist/services/productivity-review.js +3 -3
- package/dist/services/productivity-review.js.map +1 -1
- package/dist/services/recovery/model-profile-hint.d.ts +15 -2
- package/dist/services/recovery/model-profile-hint.d.ts.map +1 -1
- package/dist/services/recovery/model-profile-hint.js +28 -3
- package/dist/services/recovery/model-profile-hint.js.map +1 -1
- package/dist/services/recovery/model-profile-hint.test.d.ts +2 -0
- package/dist/services/recovery/model-profile-hint.test.d.ts.map +1 -0
- package/dist/services/recovery/model-profile-hint.test.js +38 -0
- package/dist/services/recovery/model-profile-hint.test.js.map +1 -0
- package/dist/services/recovery/run-liveness-continuations.js +2 -2
- package/dist/services/recovery/run-liveness-continuations.js.map +1 -1
- package/dist/services/recovery/service.d.ts +1 -0
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +32 -17
- package/dist/services/recovery/service.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.js +4 -4
- package/dist/services/recovery/successful-run-handoff.js.map +1 -1
- package/dist/services/recovery/successful-run-handoff.test.js +6 -0
- package/dist/services/recovery/successful-run-handoff.test.js.map +1 -1
- package/dist/services/secrets.d.ts +26 -1
- package/dist/services/secrets.d.ts.map +1 -1
- package/dist/services/secrets.js +53 -1
- package/dist/services/secrets.js.map +1 -1
- package/package.json +15 -15
- package/ui-dist/assets/{_basePickBy-CqWMcapU.js → _basePickBy-ur36FGgu.js} +1 -1
- package/ui-dist/assets/{_baseUniq-CtXUWMY8.js → _baseUniq-DOtXUkii.js} +1 -1
- package/ui-dist/assets/{arc-C1XjRaNf.js → arc-CgvHLduO.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-VXUJARFQ-CCeWA90x.js → architectureDiagram-VXUJARFQ-C9P1idjU.js} +1 -1
- package/ui-dist/assets/{blockDiagram-VD42YOAC-DfCY6om4.js → blockDiagram-VD42YOAC-CAMu_DcH.js} +1 -1
- package/ui-dist/assets/{c4Diagram-YG6GDRKO-BGrul0up.js → c4Diagram-YG6GDRKO-BbUtuYGo.js} +1 -1
- package/ui-dist/assets/channel-DKyh0X3p.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-d9TTQhTl.js → chunk-4BX2VUAB-CTrEBNY1.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-C7jwF-m3.js → chunk-55IACEB6-CIe1wGln.js} +1 -1
- package/ui-dist/assets/{chunk-B4BG7PRW-lsfcegaU.js → chunk-B4BG7PRW-B8p6GPTa.js} +1 -1
- package/ui-dist/assets/{chunk-DI55MBZ5-B6Sn2B-l.js → chunk-DI55MBZ5-D_q_KdSN.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-d-DUqf0y.js → chunk-FMBD7UC4-pn3dIZ5Z.js} +1 -1
- package/ui-dist/assets/{chunk-QN33PNHL-CZF3jISb.js → chunk-QN33PNHL-DjVHgBi3.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-DsaPyy1F.js → chunk-QZHKN3VN-BmX_FU-9.js} +1 -1
- package/ui-dist/assets/{chunk-TZMSLE5B-BmiOAEkf.js → chunk-TZMSLE5B-BsS-f8EW.js} +1 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-Dn8GiEC1.js +1 -0
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-Dn8GiEC1.js +1 -0
- package/ui-dist/assets/clone-CgBtIqNi.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-Z7JQMhqR.js → cose-bilkent-S5V4N54A-Rrh2YWZD.js} +1 -1
- package/ui-dist/assets/{dagre-6UL2VRFP-BOezmgTi.js → dagre-6UL2VRFP-BYlLrV1l.js} +1 -1
- package/ui-dist/assets/{diagram-PSM6KHXK-Bi3xQylZ.js → diagram-PSM6KHXK-CGmUzDUl.js} +1 -1
- package/ui-dist/assets/{diagram-QEK2KX5R-D5xUfRKy.js → diagram-QEK2KX5R-WaFjpU2E.js} +1 -1
- package/ui-dist/assets/{diagram-S2PKOQOG-Cs742jKm.js → diagram-S2PKOQOG-CrTMNqtq.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q2GNP2WA-D4voueCw.js → erDiagram-Q2GNP2WA-Dm3faCdS.js} +1 -1
- package/ui-dist/assets/{flowDiagram-NV44I4VS-CU8ncxLE.js → flowDiagram-NV44I4VS-B4Q5YtnD.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-JELNMOA3-D_ppL0-H.js → ganttDiagram-JELNMOA3-DwbA62qK.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-DbcI4Yg7.js → gitGraphDiagram-V2S2FVAM-D9qrL3NH.js} +1 -1
- package/ui-dist/assets/{graph-C6Xbwedt.js → graph-DFXafxQf.js} +1 -1
- package/ui-dist/assets/{index-DvA5N6JH.js → index-2l4kaSnK.js} +1 -1
- package/ui-dist/assets/{index-Byew81VK.js → index-36xStgzi.js} +1 -1
- package/ui-dist/assets/{index-D9xQ3bUB.js → index-AdFQqp3g.js} +1 -1
- package/ui-dist/assets/{index-CKA2c7F8.js → index-B7P1n35S.js} +1 -1
- package/ui-dist/assets/{index-C9271z7J.js → index-B9TjE7C1.js} +1 -1
- package/ui-dist/assets/{index-DnZdiDv2.js → index-BLMvao6K.js} +1 -1
- package/ui-dist/assets/{index-DlWHuNOg.js → index-BTcY-hP2.js} +1 -1
- package/ui-dist/assets/{index-C6ZkE1Ht.js → index-Bu_Yw-rq.js} +1 -1
- package/ui-dist/assets/{index-Dbt26HjH.js → index-Bv-NIGkH.js} +1 -1
- package/ui-dist/assets/{index-Dz05lp4r.js → index-C6epqsMd.js} +1 -1
- package/ui-dist/assets/{index-Dftcrj43.js → index-CGQCTx4q.js} +1 -1
- package/ui-dist/assets/index-Chy178EJ.css +1 -0
- package/ui-dist/assets/{index-DSAXt971.js → index-CoHgnjUU.js} +1 -1
- package/ui-dist/assets/{index-DgQjhgdA.js → index-D0AW6Ex4.js} +1 -1
- package/ui-dist/assets/{index-7jgl9bxD.js → index-DKDHGw8g.js} +1 -1
- package/ui-dist/assets/{index-DWSXKoZc.js → index-DONP_c_6.js} +1 -1
- package/ui-dist/assets/{index-U9vA4wEM.js → index-D_YO6Ibe.js} +1 -1
- package/ui-dist/assets/{index-DqHXftYp.js → index-DbI_ounN.js} +1 -1
- package/ui-dist/assets/{index-CRlZz7hL.js → index-Dh6pW3kR.js} +1 -1
- package/ui-dist/assets/{index-BMoirXsY.js → index-DqUoy5Xt.js} +1 -1
- package/ui-dist/assets/{index-STXLWsTQ.js → index-DrFHxroW.js} +167 -170
- package/ui-dist/assets/{index-CqTES4fn.js → index-KfGo4tR4.js} +1 -1
- package/ui-dist/assets/{index-CbwP7jIY.js → index-SDl3zIIz.js} +1 -1
- package/ui-dist/assets/{index-2xIzoXjY.js → index-Wd0d_e7x.js} +1 -1
- package/ui-dist/assets/{infoDiagram-HS3SLOUP-DKJbdqb7.js → infoDiagram-HS3SLOUP-BpSoPdCX.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-CWmIi8cd.js → journeyDiagram-XKPGCS4Q-CteiGqXX.js} +1 -1
- package/ui-dist/assets/{kanban-definition-3W4ZIXB7-B3q1bO5h.js → kanban-definition-3W4ZIXB7-bxXoEdtx.js} +1 -1
- package/ui-dist/assets/{layout-D5BmO8lB.js → layout-C73CcCuC.js} +1 -1
- package/ui-dist/assets/{linear-DyH8N0l1.js → linear-CxlfBvt7.js} +1 -1
- package/ui-dist/assets/{mermaid.core-BbPNdvQf.js → mermaid.core-Fg3ZO6QO.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-VGOIOE7T-CoaXwazv.js → mindmap-definition-VGOIOE7T-nu_pvWep.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ADFJNKIX-BGfmYX-N.js → pieDiagram-ADFJNKIX-BOA6WgQP.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-DAyRfIdk.js → quadrantDiagram-AYHSOK5B-Dxy0YFqG.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-DaLL5SEP.js → requirementDiagram-UZGBJVZJ-Di4nW5Aa.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-D8Dh0Tnc.js → sankeyDiagram-TZEHDZUN-DZQ4EGbS.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-WL72ISMW-Cy6bb3Jm.js → sequenceDiagram-WL72ISMW-Bi6X93SR.js} +1 -1
- package/ui-dist/assets/{stateDiagram-FKZM4ZOC-iatgt-rZ.js → stateDiagram-FKZM4ZOC-7FE9LR7S.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-DNlLaaUR.js +1 -0
- package/ui-dist/assets/{timeline-definition-IT6M3QCI-oMHUv8mk.js → timeline-definition-IT6M3QCI-BHt5ey38.js} +1 -1
- package/ui-dist/assets/{treemap-GDKQZRPO-BKN_7nXQ.js → treemap-GDKQZRPO-BgLxlWZU.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-PRI3JC2R-D4bKshmY.js → xychartDiagram-PRI3JC2R-yLw6fryP.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/channel-ChYSBygj.js +0 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-C7XPxf1M.js +0 -1
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-C7XPxf1M.js +0 -1
- package/ui-dist/assets/clone-BjVNMY9x.js +0 -1
- package/ui-dist/assets/index-y1iMp6V0.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-B-gV_soZ.js +0 -1
|
@@ -19,6 +19,12 @@ export type DevServerHealthStatus = {
|
|
|
19
19
|
waitingForIdle: boolean;
|
|
20
20
|
lastRestartAt: string | null;
|
|
21
21
|
};
|
|
22
|
+
export type DevServerRestartRequest = {
|
|
23
|
+
requestedAt: string;
|
|
24
|
+
reason: "manual_restart_now";
|
|
25
|
+
};
|
|
26
|
+
export declare function getDevServerRestartRequestFilePath(env?: NodeJS.ProcessEnv): string | null;
|
|
27
|
+
export declare function writeDevServerRestartRequest(request: DevServerRestartRequest, env?: NodeJS.ProcessEnv): boolean;
|
|
22
28
|
export declare function readPersistedDevServerStatus(env?: NodeJS.ProcessEnv): PersistedDevServerStatus | null;
|
|
23
29
|
export declare function toDevServerHealthStatus(persisted: PersistedDevServerStatus, opts: {
|
|
24
30
|
autoRestartEnabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-status.d.ts","sourceRoot":"","sources":["../src/dev-server-status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-server-status.d.ts","sourceRoot":"","sources":["../src/dev-server-status.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,wCAAwC,GAAG,IAAI,CAAC;IACnG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEF,wBAAgB,kCAAkC,CAChD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,uBAAuB,EAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAOT;AAgBD,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,wBAAwB,GAAG,IAAI,CAiCjC;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,wBAAwB,EACnC,IAAI,EAAE;IAAE,kBAAkB,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5D,qBAAqB,CA0BvB"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
const MAX_PERSISTED_DEV_SERVER_STATUS_BYTES = 64 * 1024;
|
|
4
|
+
export function getDevServerRestartRequestFilePath(env = process.env) {
|
|
5
|
+
const statusFilePath = env.EVERMORE_DEV_SERVER_STATUS_FILE?.trim();
|
|
6
|
+
if (!statusFilePath)
|
|
7
|
+
return null;
|
|
8
|
+
return path.join(path.dirname(statusFilePath), "dev-server-restart-request.json");
|
|
9
|
+
}
|
|
10
|
+
export function writeDevServerRestartRequest(request, env = process.env) {
|
|
11
|
+
const filePath = getDevServerRestartRequestFilePath(env);
|
|
12
|
+
if (!filePath)
|
|
13
|
+
return false;
|
|
14
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
15
|
+
writeFileSync(filePath, `${JSON.stringify(request, null, 2)}\n`, "utf8");
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
3
18
|
function normalizeStringArray(value) {
|
|
4
19
|
if (!Array.isArray(value))
|
|
5
20
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-status.js","sourceRoot":"","sources":["../src/dev-server-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-server-status.js","sourceRoot":"","sources":["../src/dev-server-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-mutation-guard.d.ts","sourceRoot":"","sources":["../../src/middleware/board-mutation-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,SAAS,CAAC;AA8CvD,wBAAgB,kBAAkB,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"board-mutation-guard.d.ts","sourceRoot":"","sources":["../../src/middleware/board-mutation-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,SAAS,CAAC;AA8CvD,wBAAgB,kBAAkB,IAAI,cAAc,CA+BnD"}
|
|
@@ -51,9 +51,12 @@ export function boardMutationGuard() {
|
|
|
51
51
|
next();
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
|
-
// Local-trusted mode
|
|
54
|
+
// Local-trusted mode, board bearer keys, and trusted Cloud tenant calls are
|
|
55
|
+
// not browser-session requests.
|
|
55
56
|
// In these modes, origin/referer headers can be absent; do not block those mutations.
|
|
56
|
-
if (req.actor.source === "local_implicit"
|
|
57
|
+
if (req.actor.source === "local_implicit"
|
|
58
|
+
|| req.actor.source === "board_key"
|
|
59
|
+
|| req.actor.source === "cloud_tenant") {
|
|
57
60
|
next();
|
|
58
61
|
return;
|
|
59
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-mutation-guard.js","sourceRoot":"","sources":["../../src/middleware/board-mutation-guard.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AACzD,MAAM,mBAAmB,GAAG;IAC1B,uBAAuB;IACvB,uBAAuB;CACxB,CAAC;AAEF,SAAS,WAAW,CAAC,KAAyB;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAY;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5E,MAAM,IAAI,GAAG,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACzD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,qEAAqE;IACrE,mEAAmE;IACnE,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAY;IACjD,MAAM,cAAc,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,IAAI,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"board-mutation-guard.js","sourceRoot":"","sources":["../../src/middleware/board-mutation-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAyBhF,wBAAgB,YAAY,CAC1B,EAAE,CAAC,EAAE,EAAE,EACP,IAAI,GAAE;IACJ,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,sBAAsB,EAAE,OAAO,CAAC;CAMjC,
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAyBhF,wBAAgB,YAAY,CAC1B,EAAE,CAAC,EAAE,EAAE,EACP,IAAI,GAAE;IACJ,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,sBAAsB,EAAE,OAAO,CAAC;CAMjC,8CA4IF"}
|
package/dist/routes/health.js
CHANGED
|
@@ -2,7 +2,7 @@ import { timingSafeEqual } from "node:crypto";
|
|
|
2
2
|
import { Router } from "express";
|
|
3
3
|
import { and, count, eq, gt, inArray, isNull, sql } from "drizzle-orm";
|
|
4
4
|
import { heartbeatRuns, instanceUserRoles, invites } from "@evermore.work/db";
|
|
5
|
-
import { readPersistedDevServerStatus, toDevServerHealthStatus } from "../dev-server-status.js";
|
|
5
|
+
import { readPersistedDevServerStatus, toDevServerHealthStatus, writeDevServerRestartRequest } from "../dev-server-status.js";
|
|
6
6
|
import { logger } from "../middleware/logger.js";
|
|
7
7
|
import { instanceSettingsService } from "../services/instance-settings.js";
|
|
8
8
|
import { serverVersion } from "../version.js";
|
|
@@ -29,6 +29,34 @@ export function healthRoutes(db, opts = {
|
|
|
29
29
|
companyDeletionEnabled: true,
|
|
30
30
|
}) {
|
|
31
31
|
const router = Router();
|
|
32
|
+
router.post("/dev-server/restart", async (req, res) => {
|
|
33
|
+
const actorType = "actor" in req ? req.actor?.type : null;
|
|
34
|
+
if (opts.deploymentMode === "authenticated" && actorType !== "board") {
|
|
35
|
+
res.status(403).json({ error: "board_access_required" });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const persistedDevServerStatus = readPersistedDevServerStatus();
|
|
39
|
+
if (!persistedDevServerStatus) {
|
|
40
|
+
res.status(404).json({ error: "dev_server_supervisor_unavailable" });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const restartRequired = persistedDevServerStatus.dirty ||
|
|
44
|
+
persistedDevServerStatus.changedPathCount > 0 ||
|
|
45
|
+
persistedDevServerStatus.pendingMigrations.length > 0;
|
|
46
|
+
if (!restartRequired) {
|
|
47
|
+
res.status(409).json({ error: "restart_not_required" });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const written = writeDevServerRestartRequest({
|
|
51
|
+
requestedAt: new Date().toISOString(),
|
|
52
|
+
reason: "manual_restart_now",
|
|
53
|
+
});
|
|
54
|
+
if (!written) {
|
|
55
|
+
res.status(404).json({ error: "dev_server_supervisor_unavailable" });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
res.status(202).json({ status: "restart_requested" });
|
|
59
|
+
});
|
|
32
60
|
router.get("/", async (req, res) => {
|
|
33
61
|
const actorType = "actor" in req ? req.actor?.type : null;
|
|
34
62
|
const exposeFullDetails = shouldExposeFullHealthDetails(actorType, opts.deploymentMode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAU5C,OAAO,EA8BL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAI3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA8C1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,0CAA0C,CAAC;AASlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAgBhF,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtF,CAAC;AAirBF,wBAAgB,WAAW,CACzB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE;IACJ,qBAAqB,CAAC,EAAE;QACtB,0BAA0B,CAAC,KAAK,CAAC,EAAE;YACjC,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,GAAG,CAAC,EAAE,IAAI,CAAC;SACZ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CACtC,8CAikJP"}
|
package/dist/routes/issues.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Router } from "express";
|
|
|
3
3
|
import multer from "multer";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { and, desc, eq, inArray, notInArray } from "drizzle-orm";
|
|
6
|
-
import { activityLog, executionWorkspaces, issueExecutionDecisions, issueRelations, issues as issueRows, projectWorkspaces, } from "@evermore.work/db";
|
|
6
|
+
import { activityLog, executionWorkspaces, heartbeatRuns, issueExecutionDecisions, issueRelations, issues as issueRows, projectWorkspaces, } from "@evermore.work/db";
|
|
7
7
|
import { addIssueCommentSchema, acceptIssueThreadInteractionSchema, cancelIssueThreadInteractionSchema, companySearchQuerySchema, createIssueAttachmentMetadataSchema, createIssueThreadInteractionSchema, createIssueWorkProductSchema, createIssueLabelSchema, checkoutIssueSchema, createChildIssueSchema, createIssueSchema, resolveCreateIssueStatusDefault, resolveIssueRecoveryActionSchema, feedbackTargetTypeSchema, feedbackTraceStatusSchema, feedbackVoteValueSchema, upsertIssueFeedbackVoteSchema, linkIssueApprovalSchema, issueDocumentKeySchema, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY, rejectIssueThreadInteractionSchema, restoreIssueDocumentRevisionSchema, respondIssueThreadInteractionSchema, updateIssueWorkProductSchema, upsertIssueDocumentSchema, updateIssueSchema, getClosedIsolatedExecutionWorkspaceMessage, isClosedIsolatedExecutionWorkspace, normalizeIssueIdentifier as normalizeIssueReferenceIdentifier, } from "@evermore.work/shared";
|
|
8
8
|
import { trackAgentTaskCompleted } from "@evermore.work/shared/telemetry";
|
|
9
9
|
import { getTelemetryClient } from "../telemetry.js";
|
|
@@ -939,6 +939,79 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
939
939
|
}
|
|
940
940
|
return true;
|
|
941
941
|
}
|
|
942
|
+
function isStatusOnlyCheapRecoveryContext(contextSnapshot) {
|
|
943
|
+
if (!contextSnapshot || typeof contextSnapshot !== "object" || Array.isArray(contextSnapshot))
|
|
944
|
+
return false;
|
|
945
|
+
const context = contextSnapshot;
|
|
946
|
+
return context.modelProfile === "cheap" &&
|
|
947
|
+
context.recoveryIntent === "status_only" &&
|
|
948
|
+
context.allowDeliverableWork === false &&
|
|
949
|
+
context.allowDocumentUpdates === false &&
|
|
950
|
+
context.resumeRequiresNormalModel === true;
|
|
951
|
+
}
|
|
952
|
+
function requestsCheapIssueAssigneeModelProfile(input) {
|
|
953
|
+
const overrides = input.assigneeAdapterOverrides;
|
|
954
|
+
return !!overrides &&
|
|
955
|
+
typeof overrides === "object" &&
|
|
956
|
+
!Array.isArray(overrides) &&
|
|
957
|
+
overrides.modelProfile === "cheap";
|
|
958
|
+
}
|
|
959
|
+
async function loadActorRunContext(req, companyId) {
|
|
960
|
+
if (req.actor.type !== "agent")
|
|
961
|
+
return null;
|
|
962
|
+
const runId = req.actor.runId?.trim();
|
|
963
|
+
if (!runId)
|
|
964
|
+
return null;
|
|
965
|
+
const run = await db
|
|
966
|
+
.select({
|
|
967
|
+
id: heartbeatRuns.id,
|
|
968
|
+
companyId: heartbeatRuns.companyId,
|
|
969
|
+
agentId: heartbeatRuns.agentId,
|
|
970
|
+
contextSnapshot: heartbeatRuns.contextSnapshot,
|
|
971
|
+
})
|
|
972
|
+
.from(heartbeatRuns)
|
|
973
|
+
.where(eq(heartbeatRuns.id, runId))
|
|
974
|
+
.then((rows) => rows[0] ?? null);
|
|
975
|
+
if (!run || run.companyId !== companyId || run.agentId !== req.actor.agentId)
|
|
976
|
+
return null;
|
|
977
|
+
return run;
|
|
978
|
+
}
|
|
979
|
+
async function assertCheapRecoveryIssueAssigneeProfileAllowed(req, res, issue, input) {
|
|
980
|
+
if (!requestsCheapIssueAssigneeModelProfile(input))
|
|
981
|
+
return true;
|
|
982
|
+
const run = await loadActorRunContext(req, issue.companyId);
|
|
983
|
+
if (!run || !isStatusOnlyCheapRecoveryContext(run.contextSnapshot))
|
|
984
|
+
return true;
|
|
985
|
+
res.status(403).json({
|
|
986
|
+
error: "Cheap status-only recovery runs cannot assign downstream issue work to the cheap model profile",
|
|
987
|
+
details: {
|
|
988
|
+
issueId: issue.id ?? null,
|
|
989
|
+
runId: run.id,
|
|
990
|
+
modelProfile: "cheap",
|
|
991
|
+
recoveryIntent: "status_only",
|
|
992
|
+
resumeRequiresNormalModel: true,
|
|
993
|
+
},
|
|
994
|
+
});
|
|
995
|
+
return false;
|
|
996
|
+
}
|
|
997
|
+
async function assertDeliverableMutationAllowedByRunContext(req, res, issue) {
|
|
998
|
+
const run = await loadActorRunContext(req, issue.companyId);
|
|
999
|
+
if (!run)
|
|
1000
|
+
return true;
|
|
1001
|
+
if (!isStatusOnlyCheapRecoveryContext(run.contextSnapshot))
|
|
1002
|
+
return true;
|
|
1003
|
+
res.status(403).json({
|
|
1004
|
+
error: "Cheap status-only recovery runs cannot update issue documents, plans, or deliverable artifacts",
|
|
1005
|
+
details: {
|
|
1006
|
+
issueId: issue.id,
|
|
1007
|
+
runId: run.id,
|
|
1008
|
+
modelProfile: "cheap",
|
|
1009
|
+
recoveryIntent: "status_only",
|
|
1010
|
+
resumeRequiresNormalModel: true,
|
|
1011
|
+
},
|
|
1012
|
+
});
|
|
1013
|
+
return false;
|
|
1014
|
+
}
|
|
942
1015
|
function assertStructuredCommentFieldsAllowed(req, res, input) {
|
|
943
1016
|
const hasStructuredFields = input.presentation !== undefined || input.metadata !== undefined;
|
|
944
1017
|
if (!hasStructuredFields)
|
|
@@ -1765,6 +1838,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
1765
1838
|
assertCompanyAccess(req, issue.companyId);
|
|
1766
1839
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
1767
1840
|
return;
|
|
1841
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
1842
|
+
return;
|
|
1768
1843
|
const keyParsed = issueDocumentKeySchema.safeParse(String(req.params.key ?? "").trim().toLowerCase());
|
|
1769
1844
|
if (!keyParsed.success) {
|
|
1770
1845
|
res.status(400).json({ error: "Invalid document key", details: keyParsed.error.issues });
|
|
@@ -1947,6 +2022,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
1947
2022
|
assertCompanyAccess(req, issue.companyId);
|
|
1948
2023
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
1949
2024
|
return;
|
|
2025
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
2026
|
+
return;
|
|
1950
2027
|
const keyParsed = issueDocumentKeySchema.safeParse(String(req.params.key ?? "").trim().toLowerCase());
|
|
1951
2028
|
if (!keyParsed.success) {
|
|
1952
2029
|
res.status(400).json({ error: "Invalid document key", details: keyParsed.error.issues });
|
|
@@ -2091,6 +2168,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2091
2168
|
assertCompanyAccess(req, issue.companyId);
|
|
2092
2169
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
2093
2170
|
return;
|
|
2171
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
2172
|
+
return;
|
|
2094
2173
|
const product = await workProductsSvc.createForIssue(issue.id, issue.companyId, {
|
|
2095
2174
|
...req.body,
|
|
2096
2175
|
projectId: req.body.projectId ?? issue.projectId ?? null,
|
|
@@ -2134,6 +2213,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2134
2213
|
}
|
|
2135
2214
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
2136
2215
|
return;
|
|
2216
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
2217
|
+
return;
|
|
2137
2218
|
const product = await workProductsSvc.update(id, req.body);
|
|
2138
2219
|
if (!product) {
|
|
2139
2220
|
res.status(404).json({ error: "Work product not found" });
|
|
@@ -2174,6 +2255,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2174
2255
|
}
|
|
2175
2256
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
2176
2257
|
return;
|
|
2258
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
2259
|
+
return;
|
|
2177
2260
|
const removed = await workProductsSvc.remove(id);
|
|
2178
2261
|
if (!removed) {
|
|
2179
2262
|
res.status(404).json({ error: "Work product not found" });
|
|
@@ -2397,6 +2480,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2397
2480
|
const companyId = req.params.companyId;
|
|
2398
2481
|
assertCompanyAccess(req, companyId);
|
|
2399
2482
|
assertNoAgentHostWorkspaceCommandMutation(req, collectIssueWorkspaceCommandPaths(req.body));
|
|
2483
|
+
if (!(await assertCheapRecoveryIssueAssigneeProfileAllowed(req, res, { companyId }, req.body)))
|
|
2484
|
+
return;
|
|
2400
2485
|
if (req.body.assigneeAgentId || req.body.assigneeUserId) {
|
|
2401
2486
|
await assertCanAssignTasks(req, companyId);
|
|
2402
2487
|
}
|
|
@@ -2480,6 +2565,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2480
2565
|
}
|
|
2481
2566
|
assertCompanyAccess(req, parent.companyId);
|
|
2482
2567
|
assertNoAgentHostWorkspaceCommandMutation(req, collectIssueWorkspaceCommandPaths(req.body));
|
|
2568
|
+
if (!(await assertCheapRecoveryIssueAssigneeProfileAllowed(req, res, parent, req.body)))
|
|
2569
|
+
return;
|
|
2483
2570
|
if (req.body.assigneeAgentId || req.body.assigneeUserId) {
|
|
2484
2571
|
await assertCanAssignTasks(req, parent.companyId);
|
|
2485
2572
|
}
|
|
@@ -2611,6 +2698,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2611
2698
|
assertNoAgentHostWorkspaceCommandMutation(req, collectIssueWorkspaceCommandPaths(req.body));
|
|
2612
2699
|
if (!(await assertAgentIssueMutationAllowed(req, res, existing)))
|
|
2613
2700
|
return;
|
|
2701
|
+
if (!(await assertCheapRecoveryIssueAssigneeProfileAllowed(req, res, existing, req.body)))
|
|
2702
|
+
return;
|
|
2614
2703
|
const actor = getActorInfo(req);
|
|
2615
2704
|
const isClosed = isClosedIssueStatus(existing.status);
|
|
2616
2705
|
const isBlocked = existing.status === "blocked";
|
|
@@ -4410,6 +4499,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
4410
4499
|
}
|
|
4411
4500
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
4412
4501
|
return;
|
|
4502
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
4503
|
+
return;
|
|
4413
4504
|
const company = await companiesSvc.getById(companyId);
|
|
4414
4505
|
const attachmentMaxBytes = normalizeIssueAttachmentMaxBytes(company?.attachmentMaxBytes);
|
|
4415
4506
|
try {
|
|
@@ -4519,6 +4610,8 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
4519
4610
|
}
|
|
4520
4611
|
if (!(await assertAgentIssueMutationAllowed(req, res, issue)))
|
|
4521
4612
|
return;
|
|
4613
|
+
if (!(await assertDeliverableMutationAllowedByRunContext(req, res, issue)))
|
|
4614
|
+
return;
|
|
4522
4615
|
try {
|
|
4523
4616
|
await storage.deleteObject(attachment.companyId, attachment.objectKey);
|
|
4524
4617
|
}
|