@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.
Files changed (139) hide show
  1. package/dist/dev-server-status.d.ts +6 -0
  2. package/dist/dev-server-status.d.ts.map +1 -1
  3. package/dist/dev-server-status.js +16 -1
  4. package/dist/dev-server-status.js.map +1 -1
  5. package/dist/middleware/board-mutation-guard.d.ts.map +1 -1
  6. package/dist/middleware/board-mutation-guard.js +5 -2
  7. package/dist/middleware/board-mutation-guard.js.map +1 -1
  8. package/dist/routes/health.d.ts.map +1 -1
  9. package/dist/routes/health.js +29 -1
  10. package/dist/routes/health.js.map +1 -1
  11. package/dist/routes/issues.d.ts.map +1 -1
  12. package/dist/routes/issues.js +94 -1
  13. package/dist/routes/issues.js.map +1 -1
  14. package/dist/routes/plugins.d.ts.map +1 -1
  15. package/dist/routes/plugins.js +75 -0
  16. package/dist/routes/plugins.js.map +1 -1
  17. package/dist/routes/secrets.d.ts.map +1 -1
  18. package/dist/routes/secrets.js +37 -10
  19. package/dist/routes/secrets.js.map +1 -1
  20. package/dist/secrets/aws-secrets-manager-provider.d.ts.map +1 -1
  21. package/dist/secrets/aws-secrets-manager-provider.js +216 -0
  22. package/dist/secrets/aws-secrets-manager-provider.js.map +1 -1
  23. package/dist/secrets/types.d.ts +8 -1
  24. package/dist/secrets/types.d.ts.map +1 -1
  25. package/dist/secrets/types.js.map +1 -1
  26. package/dist/services/heartbeat.d.ts +1 -0
  27. package/dist/services/heartbeat.d.ts.map +1 -1
  28. package/dist/services/heartbeat.js +13 -13
  29. package/dist/services/heartbeat.js.map +1 -1
  30. package/dist/services/plugin-capability-validator.d.ts.map +1 -1
  31. package/dist/services/plugin-capability-validator.js +1 -0
  32. package/dist/services/plugin-capability-validator.js.map +1 -1
  33. package/dist/services/plugin-environment-driver.js +2 -2
  34. package/dist/services/plugin-environment-driver.js.map +1 -1
  35. package/dist/services/plugin-host-services.d.ts.map +1 -1
  36. package/dist/services/plugin-host-services.js +49 -0
  37. package/dist/services/plugin-host-services.js.map +1 -1
  38. package/dist/services/plugin-registry.d.ts +8 -8
  39. package/dist/services/productivity-review.js +3 -3
  40. package/dist/services/productivity-review.js.map +1 -1
  41. package/dist/services/recovery/model-profile-hint.d.ts +15 -2
  42. package/dist/services/recovery/model-profile-hint.d.ts.map +1 -1
  43. package/dist/services/recovery/model-profile-hint.js +28 -3
  44. package/dist/services/recovery/model-profile-hint.js.map +1 -1
  45. package/dist/services/recovery/model-profile-hint.test.d.ts +2 -0
  46. package/dist/services/recovery/model-profile-hint.test.d.ts.map +1 -0
  47. package/dist/services/recovery/model-profile-hint.test.js +38 -0
  48. package/dist/services/recovery/model-profile-hint.test.js.map +1 -0
  49. package/dist/services/recovery/run-liveness-continuations.js +2 -2
  50. package/dist/services/recovery/run-liveness-continuations.js.map +1 -1
  51. package/dist/services/recovery/service.d.ts +1 -0
  52. package/dist/services/recovery/service.d.ts.map +1 -1
  53. package/dist/services/recovery/service.js +32 -17
  54. package/dist/services/recovery/service.js.map +1 -1
  55. package/dist/services/recovery/successful-run-handoff.js +4 -4
  56. package/dist/services/recovery/successful-run-handoff.js.map +1 -1
  57. package/dist/services/recovery/successful-run-handoff.test.js +6 -0
  58. package/dist/services/recovery/successful-run-handoff.test.js.map +1 -1
  59. package/dist/services/secrets.d.ts +26 -1
  60. package/dist/services/secrets.d.ts.map +1 -1
  61. package/dist/services/secrets.js +53 -1
  62. package/dist/services/secrets.js.map +1 -1
  63. package/package.json +15 -15
  64. package/ui-dist/assets/{_basePickBy-CqWMcapU.js → _basePickBy-ur36FGgu.js} +1 -1
  65. package/ui-dist/assets/{_baseUniq-CtXUWMY8.js → _baseUniq-DOtXUkii.js} +1 -1
  66. package/ui-dist/assets/{arc-C1XjRaNf.js → arc-CgvHLduO.js} +1 -1
  67. package/ui-dist/assets/{architectureDiagram-VXUJARFQ-CCeWA90x.js → architectureDiagram-VXUJARFQ-C9P1idjU.js} +1 -1
  68. package/ui-dist/assets/{blockDiagram-VD42YOAC-DfCY6om4.js → blockDiagram-VD42YOAC-CAMu_DcH.js} +1 -1
  69. package/ui-dist/assets/{c4Diagram-YG6GDRKO-BGrul0up.js → c4Diagram-YG6GDRKO-BbUtuYGo.js} +1 -1
  70. package/ui-dist/assets/channel-DKyh0X3p.js +1 -0
  71. package/ui-dist/assets/{chunk-4BX2VUAB-d9TTQhTl.js → chunk-4BX2VUAB-CTrEBNY1.js} +1 -1
  72. package/ui-dist/assets/{chunk-55IACEB6-C7jwF-m3.js → chunk-55IACEB6-CIe1wGln.js} +1 -1
  73. package/ui-dist/assets/{chunk-B4BG7PRW-lsfcegaU.js → chunk-B4BG7PRW-B8p6GPTa.js} +1 -1
  74. package/ui-dist/assets/{chunk-DI55MBZ5-B6Sn2B-l.js → chunk-DI55MBZ5-D_q_KdSN.js} +1 -1
  75. package/ui-dist/assets/{chunk-FMBD7UC4-d-DUqf0y.js → chunk-FMBD7UC4-pn3dIZ5Z.js} +1 -1
  76. package/ui-dist/assets/{chunk-QN33PNHL-CZF3jISb.js → chunk-QN33PNHL-DjVHgBi3.js} +1 -1
  77. package/ui-dist/assets/{chunk-QZHKN3VN-DsaPyy1F.js → chunk-QZHKN3VN-BmX_FU-9.js} +1 -1
  78. package/ui-dist/assets/{chunk-TZMSLE5B-BmiOAEkf.js → chunk-TZMSLE5B-BsS-f8EW.js} +1 -1
  79. package/ui-dist/assets/classDiagram-2ON5EDUG-Dn8GiEC1.js +1 -0
  80. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-Dn8GiEC1.js +1 -0
  81. package/ui-dist/assets/clone-CgBtIqNi.js +1 -0
  82. package/ui-dist/assets/{cose-bilkent-S5V4N54A-Z7JQMhqR.js → cose-bilkent-S5V4N54A-Rrh2YWZD.js} +1 -1
  83. package/ui-dist/assets/{dagre-6UL2VRFP-BOezmgTi.js → dagre-6UL2VRFP-BYlLrV1l.js} +1 -1
  84. package/ui-dist/assets/{diagram-PSM6KHXK-Bi3xQylZ.js → diagram-PSM6KHXK-CGmUzDUl.js} +1 -1
  85. package/ui-dist/assets/{diagram-QEK2KX5R-D5xUfRKy.js → diagram-QEK2KX5R-WaFjpU2E.js} +1 -1
  86. package/ui-dist/assets/{diagram-S2PKOQOG-Cs742jKm.js → diagram-S2PKOQOG-CrTMNqtq.js} +1 -1
  87. package/ui-dist/assets/{erDiagram-Q2GNP2WA-D4voueCw.js → erDiagram-Q2GNP2WA-Dm3faCdS.js} +1 -1
  88. package/ui-dist/assets/{flowDiagram-NV44I4VS-CU8ncxLE.js → flowDiagram-NV44I4VS-B4Q5YtnD.js} +1 -1
  89. package/ui-dist/assets/{ganttDiagram-JELNMOA3-D_ppL0-H.js → ganttDiagram-JELNMOA3-DwbA62qK.js} +1 -1
  90. package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-DbcI4Yg7.js → gitGraphDiagram-V2S2FVAM-D9qrL3NH.js} +1 -1
  91. package/ui-dist/assets/{graph-C6Xbwedt.js → graph-DFXafxQf.js} +1 -1
  92. package/ui-dist/assets/{index-DvA5N6JH.js → index-2l4kaSnK.js} +1 -1
  93. package/ui-dist/assets/{index-Byew81VK.js → index-36xStgzi.js} +1 -1
  94. package/ui-dist/assets/{index-D9xQ3bUB.js → index-AdFQqp3g.js} +1 -1
  95. package/ui-dist/assets/{index-CKA2c7F8.js → index-B7P1n35S.js} +1 -1
  96. package/ui-dist/assets/{index-C9271z7J.js → index-B9TjE7C1.js} +1 -1
  97. package/ui-dist/assets/{index-DnZdiDv2.js → index-BLMvao6K.js} +1 -1
  98. package/ui-dist/assets/{index-DlWHuNOg.js → index-BTcY-hP2.js} +1 -1
  99. package/ui-dist/assets/{index-C6ZkE1Ht.js → index-Bu_Yw-rq.js} +1 -1
  100. package/ui-dist/assets/{index-Dbt26HjH.js → index-Bv-NIGkH.js} +1 -1
  101. package/ui-dist/assets/{index-Dz05lp4r.js → index-C6epqsMd.js} +1 -1
  102. package/ui-dist/assets/{index-Dftcrj43.js → index-CGQCTx4q.js} +1 -1
  103. package/ui-dist/assets/index-Chy178EJ.css +1 -0
  104. package/ui-dist/assets/{index-DSAXt971.js → index-CoHgnjUU.js} +1 -1
  105. package/ui-dist/assets/{index-DgQjhgdA.js → index-D0AW6Ex4.js} +1 -1
  106. package/ui-dist/assets/{index-7jgl9bxD.js → index-DKDHGw8g.js} +1 -1
  107. package/ui-dist/assets/{index-DWSXKoZc.js → index-DONP_c_6.js} +1 -1
  108. package/ui-dist/assets/{index-U9vA4wEM.js → index-D_YO6Ibe.js} +1 -1
  109. package/ui-dist/assets/{index-DqHXftYp.js → index-DbI_ounN.js} +1 -1
  110. package/ui-dist/assets/{index-CRlZz7hL.js → index-Dh6pW3kR.js} +1 -1
  111. package/ui-dist/assets/{index-BMoirXsY.js → index-DqUoy5Xt.js} +1 -1
  112. package/ui-dist/assets/{index-STXLWsTQ.js → index-DrFHxroW.js} +167 -170
  113. package/ui-dist/assets/{index-CqTES4fn.js → index-KfGo4tR4.js} +1 -1
  114. package/ui-dist/assets/{index-CbwP7jIY.js → index-SDl3zIIz.js} +1 -1
  115. package/ui-dist/assets/{index-2xIzoXjY.js → index-Wd0d_e7x.js} +1 -1
  116. package/ui-dist/assets/{infoDiagram-HS3SLOUP-DKJbdqb7.js → infoDiagram-HS3SLOUP-BpSoPdCX.js} +1 -1
  117. package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-CWmIi8cd.js → journeyDiagram-XKPGCS4Q-CteiGqXX.js} +1 -1
  118. package/ui-dist/assets/{kanban-definition-3W4ZIXB7-B3q1bO5h.js → kanban-definition-3W4ZIXB7-bxXoEdtx.js} +1 -1
  119. package/ui-dist/assets/{layout-D5BmO8lB.js → layout-C73CcCuC.js} +1 -1
  120. package/ui-dist/assets/{linear-DyH8N0l1.js → linear-CxlfBvt7.js} +1 -1
  121. package/ui-dist/assets/{mermaid.core-BbPNdvQf.js → mermaid.core-Fg3ZO6QO.js} +4 -4
  122. package/ui-dist/assets/{mindmap-definition-VGOIOE7T-CoaXwazv.js → mindmap-definition-VGOIOE7T-nu_pvWep.js} +1 -1
  123. package/ui-dist/assets/{pieDiagram-ADFJNKIX-BGfmYX-N.js → pieDiagram-ADFJNKIX-BOA6WgQP.js} +1 -1
  124. package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-DAyRfIdk.js → quadrantDiagram-AYHSOK5B-Dxy0YFqG.js} +1 -1
  125. package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-DaLL5SEP.js → requirementDiagram-UZGBJVZJ-Di4nW5Aa.js} +1 -1
  126. package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-D8Dh0Tnc.js → sankeyDiagram-TZEHDZUN-DZQ4EGbS.js} +1 -1
  127. package/ui-dist/assets/{sequenceDiagram-WL72ISMW-Cy6bb3Jm.js → sequenceDiagram-WL72ISMW-Bi6X93SR.js} +1 -1
  128. package/ui-dist/assets/{stateDiagram-FKZM4ZOC-iatgt-rZ.js → stateDiagram-FKZM4ZOC-7FE9LR7S.js} +1 -1
  129. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-DNlLaaUR.js +1 -0
  130. package/ui-dist/assets/{timeline-definition-IT6M3QCI-oMHUv8mk.js → timeline-definition-IT6M3QCI-BHt5ey38.js} +1 -1
  131. package/ui-dist/assets/{treemap-GDKQZRPO-BKN_7nXQ.js → treemap-GDKQZRPO-BgLxlWZU.js} +1 -1
  132. package/ui-dist/assets/{xychartDiagram-PRI3JC2R-D4bKshmY.js → xychartDiagram-PRI3JC2R-yLw6fryP.js} +1 -1
  133. package/ui-dist/index.html +2 -2
  134. package/ui-dist/assets/channel-ChYSBygj.js +0 -1
  135. package/ui-dist/assets/classDiagram-2ON5EDUG-C7XPxf1M.js +0 -1
  136. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-C7XPxf1M.js +0 -1
  137. package/ui-dist/assets/clone-BjVNMY9x.js +0 -1
  138. package/ui-dist/assets/index-y1iMp6V0.css +0 -1
  139. 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":"AAIA,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;AAgBF,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
+ {"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":"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"}
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,CA0BnD"}
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 and board bearer keys are not browser-session requests.
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" || req.actor.source === "board_key") {
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":"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"}
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,8CA0GF"}
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"}
@@ -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":"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"}
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;AAS5C,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,8CAs+IP"}
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"}
@@ -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
  }