@claudexor/control-api 3.20.1 → 3.23.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 (114) hide show
  1. package/dist/artifact-serve-routes.d.ts +7 -4
  2. package/dist/artifact-serve-routes.d.ts.map +1 -1
  3. package/dist/artifact-serve-routes.js +35 -7
  4. package/dist/artifact-serve-routes.js.map +1 -1
  5. package/dist/command-reads.d.ts +5 -0
  6. package/dist/command-reads.d.ts.map +1 -0
  7. package/dist/command-reads.js +18 -0
  8. package/dist/command-reads.js.map +1 -0
  9. package/dist/control-protocol.d.ts.map +1 -1
  10. package/dist/control-protocol.js +3 -1
  11. package/dist/control-protocol.js.map +1 -1
  12. package/dist/daemon-server.d.ts +1 -0
  13. package/dist/daemon-server.d.ts.map +1 -1
  14. package/dist/daemon-server.js +75 -109
  15. package/dist/daemon-server.js.map +1 -1
  16. package/dist/daemon-status-routes.d.ts +7 -0
  17. package/dist/daemon-status-routes.d.ts.map +1 -0
  18. package/dist/daemon-status-routes.js +16 -0
  19. package/dist/daemon-status-routes.js.map +1 -0
  20. package/dist/decision-rerun.js +1 -1
  21. package/dist/decision-rerun.js.map +1 -1
  22. package/dist/operation-catalog.d.ts.map +1 -1
  23. package/dist/operation-catalog.js +1 -0
  24. package/dist/operation-catalog.js.map +1 -1
  25. package/dist/operation-summaries.d.ts.map +1 -1
  26. package/dist/operation-summaries.js +1 -0
  27. package/dist/operation-summaries.js.map +1 -1
  28. package/dist/project-routes.d.ts +6 -1
  29. package/dist/project-routes.d.ts.map +1 -1
  30. package/dist/project-routes.js +18 -3
  31. package/dist/project-routes.js.map +1 -1
  32. package/dist/remote-operation-descriptors.d.ts +8 -0
  33. package/dist/remote-operation-descriptors.d.ts.map +1 -1
  34. package/dist/remote-operation-descriptors.js +4 -0
  35. package/dist/remote-operation-descriptors.js.map +1 -1
  36. package/dist/retention.d.ts.map +1 -1
  37. package/dist/retention.js +4 -1
  38. package/dist/retention.js.map +1 -1
  39. package/dist/run-apply-routes.d.ts.map +1 -1
  40. package/dist/run-apply-routes.js +6 -10
  41. package/dist/run-apply-routes.js.map +1 -1
  42. package/dist/run-audit.d.ts +5 -0
  43. package/dist/run-audit.d.ts.map +1 -0
  44. package/dist/run-audit.js +18 -0
  45. package/dist/run-audit.js.map +1 -0
  46. package/dist/run-continuation-projection.d.ts +7 -0
  47. package/dist/run-continuation-projection.d.ts.map +1 -0
  48. package/dist/run-continuation-projection.js +135 -0
  49. package/dist/run-continuation-projection.js.map +1 -0
  50. package/dist/run-continuation-start.d.ts +13 -0
  51. package/dist/run-continuation-start.d.ts.map +1 -0
  52. package/dist/run-continuation-start.js +62 -0
  53. package/dist/run-continuation-start.js.map +1 -0
  54. package/dist/run-delivery-state.d.ts.map +1 -1
  55. package/dist/run-delivery-state.js +6 -0
  56. package/dist/run-delivery-state.js.map +1 -1
  57. package/dist/run-discard.d.ts +10 -0
  58. package/dist/run-discard.d.ts.map +1 -0
  59. package/dist/run-discard.js +47 -0
  60. package/dist/run-discard.js.map +1 -0
  61. package/dist/run-exact-patch.d.ts +25 -0
  62. package/dist/run-exact-patch.d.ts.map +1 -0
  63. package/dist/run-exact-patch.js +55 -0
  64. package/dist/run-exact-patch.js.map +1 -0
  65. package/dist/run-execution-root.d.ts +22 -0
  66. package/dist/run-execution-root.d.ts.map +1 -0
  67. package/dist/run-execution-root.js +23 -0
  68. package/dist/run-execution-root.js.map +1 -0
  69. package/dist/run-list-fingerprint.d.ts.map +1 -1
  70. package/dist/run-list-fingerprint.js +7 -0
  71. package/dist/run-list-fingerprint.js.map +1 -1
  72. package/dist/run-list.d.ts +3 -57
  73. package/dist/run-list.d.ts.map +1 -1
  74. package/dist/run-list.js +2 -67
  75. package/dist/run-list.js.map +1 -1
  76. package/dist/run-record.d.ts +4 -3
  77. package/dist/run-record.d.ts.map +1 -1
  78. package/dist/run-record.js.map +1 -1
  79. package/dist/run-retry-routes.js +11 -2
  80. package/dist/run-retry-routes.js.map +1 -1
  81. package/dist/run-start.d.ts +12 -3
  82. package/dist/run-start.d.ts.map +1 -1
  83. package/dist/run-start.js +25 -25
  84. package/dist/run-start.js.map +1 -1
  85. package/dist/thread-create-route.d.ts +16 -0
  86. package/dist/thread-create-route.d.ts.map +1 -0
  87. package/dist/thread-create-route.js +83 -0
  88. package/dist/thread-create-route.js.map +1 -0
  89. package/dist/thread-delegated-execution.d.ts +19 -0
  90. package/dist/thread-delegated-execution.d.ts.map +1 -0
  91. package/dist/thread-delegated-execution.js +27 -0
  92. package/dist/thread-delegated-execution.js.map +1 -0
  93. package/dist/thread-lifecycle-routes.d.ts +2 -1
  94. package/dist/thread-lifecycle-routes.d.ts.map +1 -1
  95. package/dist/thread-lifecycle-routes.js +12 -3
  96. package/dist/thread-lifecycle-routes.js.map +1 -1
  97. package/dist/thread-mutation.d.ts +2 -4
  98. package/dist/thread-mutation.d.ts.map +1 -1
  99. package/dist/thread-mutation.js +1 -1
  100. package/dist/thread-mutation.js.map +1 -1
  101. package/dist/thread-projection.d.ts.map +1 -1
  102. package/dist/thread-projection.js +1 -0
  103. package/dist/thread-projection.js.map +1 -1
  104. package/dist/thread-recovery.js +1 -1
  105. package/dist/thread-recovery.js.map +1 -1
  106. package/dist/thread-turn-problems.d.ts +39 -0
  107. package/dist/thread-turn-problems.d.ts.map +1 -0
  108. package/dist/thread-turn-problems.js +86 -0
  109. package/dist/thread-turn-problems.js.map +1 -0
  110. package/dist/thread-turn-routes.d.ts +2 -25
  111. package/dist/thread-turn-routes.d.ts.map +1 -1
  112. package/dist/thread-turn-routes.js +19 -90
  113. package/dist/thread-turn-routes.js.map +1 -1
  114. package/package.json +7 -7
@@ -0,0 +1,62 @@
1
+ /**
2
+ * `continueFrom` on POST /v2/runs (INTERFACES §1): the HTTP half of the run
3
+ * chain. The daemon's enqueue RPC owns the atomic one-successor claim; this
4
+ * module resolves what a continuation inherits BEFORE ordinary request
5
+ * defaults fill it, and answers the same admission verdict with its typed
6
+ * context (the chain `head`), preserved by the daemon socket as well.
7
+ */
8
+ import { continuationPredecessor, continuationRefusal, continuationRefusalError, continuedRunOf, } from "@claudexor/schema";
9
+ import { paramsRecord } from "./run-record.js";
10
+ /** What a continuation needs to find its carrier and workspace: the work's
11
+ * kind, project and execution tree, harness and model. Nothing else is
12
+ * inherited implicitly. Either explicit key replaces its whole related group. */
13
+ const INHERITED_GROUPS = [
14
+ ["mode"],
15
+ ["scope"],
16
+ ["execution"],
17
+ ["harnesses", "primaryHarness"],
18
+ ["model", "models"],
19
+ ];
20
+ /**
21
+ * Fill the omitted inheritable keys of a raw `continueFrom` body from the
22
+ * predecessor's accepted request, and name the predecessor by its run id
23
+ * (a job id is accepted too). Runs on the RAW body, before the request schema
24
+ * injects defaults — an omitted scope must not become "no project". An
25
+ * unknown predecessor is left untouched: admission refuses it typed.
26
+ */
27
+ export async function resolveContinuationBody(daemon, body) {
28
+ if (body && typeof body === "object" && "continueModelInherited" in body) {
29
+ throw Object.assign(new Error("continueModelInherited is server-owned"), { status: 400 });
30
+ }
31
+ const from = continuedRunOf(body);
32
+ if (from === null || !body || typeof body !== "object" || Array.isArray(body))
33
+ return body;
34
+ const predecessor = continuationPredecessor(from, await daemon.list({ id: from }));
35
+ if (!predecessor?.runId)
36
+ return body;
37
+ const raw = body;
38
+ const inherited = paramsRecord(predecessor);
39
+ const resolved = { ...raw, continueFrom: predecessor.runId };
40
+ for (const group of INHERITED_GROUPS) {
41
+ if (group.some((key) => key in raw))
42
+ continue;
43
+ for (const key of group) {
44
+ if (inherited[key] !== undefined)
45
+ resolved[key] = inherited[key];
46
+ }
47
+ }
48
+ // Preserve caller intent through durable request normalization and settings defaults.
49
+ resolved["continueModelInherited"] = !("model" in raw || "models" in raw);
50
+ return resolved;
51
+ }
52
+ /** Throw the typed admission refusal (with its context) for a continuation
53
+ * that may not start now; ordinary requests pass untouched. */
54
+ export async function assertContinuationAdmissible(daemon, request) {
55
+ const from = continuedRunOf(request);
56
+ if (from === null)
57
+ return;
58
+ const refusal = continuationRefusal(request, await daemon.list({ continuationChainOf: from }));
59
+ if (refusal)
60
+ throw continuationRefusalError(refusal);
61
+ }
62
+ //# sourceMappingURL=run-continuation-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-continuation-start.js","sourceRoot":"","sources":["../src/run-continuation-start.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAA2B,MAAM,iBAAiB,CAAC;AAExE;;iFAEiF;AACjF,MAAM,gBAAgB,GAAG;IACvB,CAAC,MAAM,CAAC;IACR,CAAC,OAAO,CAAC;IACT,CAAC,WAAW,CAAC;IACb,CAAC,WAAW,EAAE,gBAAgB,CAAC;IAC/B,CAAC,OAAO,EAAE,QAAQ,CAAC;CACX,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAwC,EACxC,IAAa;IAEb,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,wBAAwB,IAAI,IAAI,EAAE,CAAC;QACzE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3F,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,WAAW,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAA4B,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;IACtF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;YAAE,SAAS;QAC9C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,sFAAsF;IACtF,QAAQ,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;+DAC+D;AAC/D,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAwC,EACxC,OAAgB;IAEhB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/F,IAAI,OAAO;QAAE,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;AACvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-delivery-state.d.ts","sourceRoot":"","sources":["../src/run-delivery-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,mBAAmB,CAAC;AAIpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAwDvE;AAED;;6BAE6B;AAC7B,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAE/E;AAED;;;;;;2EAM2E;AAC3E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,EAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,QAAQ,UAAQ,GACf,IAAI,CAiCN"}
1
+ {"version":3,"file":"run-delivery-state.d.ts","sourceRoot":"","sources":["../src/run-delivery-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAe,MAAM,mBAAmB,CAAC;AAKpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAGzE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAwDvE;AAED;;6BAE6B;AAC7B,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAE/E;AAED;;;;;;2EAM2E;AAC3E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,EAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,QAAQ,UAAQ,GACf,IAAI,CAqCN"}
@@ -3,6 +3,7 @@ import { join } from "node:path";
3
3
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
4
  import { ControlRunResult, RunDeliveryState, WorkProduct } from "@claudexor/schema";
5
5
  import { nowIso } from "@claudexor/util";
6
+ import { releaseRetainedEnvelope, retainedEnvelopeOfRun } from "@claudexor/workspace";
6
7
  import { safeArtifactRoot } from "./artifact-paths.js";
7
8
  import { safeReadStructuredArtifact } from "./run-artifact-read.js";
8
9
  /** Revert targets the tree recorded at execution, even if its thread moved later. */
@@ -102,6 +103,11 @@ export function markRunApplyState(rec, state, appliedPaths, required = false) {
102
103
  const tmp = `${dsPath}.tmp-${process.pid}`;
103
104
  writeFileSync(tmp, stringifyYaml(next), "utf8");
104
105
  renameSync(tmp, dsPath);
106
+ // Applying a kept stopped run's result is its disposition (A9): the
107
+ // envelope retained for continueFrom is released, never kept twice.
108
+ const kept = state === "applied" && rec.runId ? retainedEnvelopeOfRun(root, rec.runId) : null;
109
+ if (kept)
110
+ void releaseRetainedEnvelope(kept).catch(() => { });
105
111
  }
106
112
  catch (error) {
107
113
  if (required)
@@ -1 +1 @@
1
- {"version":3,"file":"run-delivery-state.js","sourceRoot":"","sources":["../src/run-delivery-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,qFAAqF;AACrF,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,MAAM,EAAE,GAAG,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;IACnF,OAAO,OAAO,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAoB;IACnD,MAAM,EAAE,GAAG,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAA4B,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACpC,MAAM,IAAI,GACR,OAAO,KAAK,OAAO;QACnB,OAAO,KAAK,OAAO;QACnB,OAAO,KAAK,QAAQ;QACpB,OAAO,KAAK,MAAM;QAClB,OAAO,KAAK,QAAQ;QAClB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CACiD,CAAC;IAC5E,MAAM,QAAQ,GACZ,EAAE,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ;QAChC,CAAC,CAAC;YACE,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9D,SAAS,EAAE,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC/D;QACH,CAAC,CAAC,IAAI,CAAC;IACX,gEAAgE;IAChE,4EAA4E;IAC5E,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;IAClE,MAAM,UAAU,GACd,aAAa,KAAK,SAAS;QAC3B,aAAa,KAAK,wBAAwB;QAC1C,aAAa,KAAK,UAAU;QAC5B,aAAa,KAAK,WAAW;QAC3B,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,aAAa,CAAC;IACpB,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,MAAM,WAAW,GACf,QAAQ,EAAE,WAAW;QACrB,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,cAAc,GAClB,QAAQ,EAAE,cAAc;QACxB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,UAAU,GACd,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,wBAAwB,CAAC;QACrE,cAAc,KAAK,IAAI,CAAC;IAC1B,OAAO,gBAAgB,CAAC,KAAK,CAAC;QAC5B,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;QACtE,UAAU;QACV,UAAU;QACV,WAAW;QACX,cAAc;QACd,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED;;6BAE6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,GAAoB;IACpD,OAAO,0BAA0B,CAAC,GAAG,EAAE,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;2EAM2E;AAC3E,MAAM,UAAU,iBAAiB,CAC/B,GAAoB,EACpB,KAA2D,EAC3D,YAAuB,EACvB,QAAQ,GAAG,KAAK;IAEhB,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;YAC7B,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;YACpF,CAAC,CAAC,IAAI,CAAC;QACT,yEAAyE;QACzE,+CAA+C;QAC/C,MAAM,EAAE,GAAG,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAA4B,CAAC;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC;YAClC,YAAY,EAAE,YAAY,IAAI,IAAI,EAAE,YAAY;YAChD,WAAW,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW;YACjE,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC;YACzE,cAAc,EACZ,IAAI,EAAE,cAAc;gBACpB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClF,WAAW,EACT,IAAI,EAAE,WAAW;gBACjB,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC7E,CAAC,CAAC;QACH,+EAA+E;QAC/E,MAAM,GAAG,GAAG,GAAG,MAAM,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3C,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC1B,wEAAwE;IAC1E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"run-delivery-state.js","sourceRoot":"","sources":["../src/run-delivery-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The `discard` decision (POST /v2/runs/:id/decision): explicitly give up a
3
+ * terminal run's result that is still held for the operator — a pending
4
+ * copied-files result (INV-111) or a stopped run's isolated envelope retained
5
+ * for `continueFrom` (A9). Direct effects already in place are never undone.
6
+ */
7
+ import { ControlRunDecisionResponse } from "@claudexor/schema";
8
+ import type { DaemonRunRecord } from "./run-record.js";
9
+ export declare function discardRunResult(rec: DaemonRunRecord): Promise<ControlRunDecisionResponse>;
10
+ //# sourceMappingURL=run-discard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-discard.d.ts","sourceRoot":"","sources":["../src/run-discard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAK/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA0ChG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The `discard` decision (POST /v2/runs/:id/decision): explicitly give up a
3
+ * terminal run's result that is still held for the operator — a pending
4
+ * copied-files result (INV-111) or a stopped run's isolated envelope retained
5
+ * for `continueFrom` (A9). Direct effects already in place are never undone.
6
+ */
7
+ import { ControlRunDecisionResponse } from "@claudexor/schema";
8
+ import { releaseRetainedEnvelope, retainedEnvelopeOfRun } from "@claudexor/workspace";
9
+ import { readFilesWorkProduct } from "./files-work-product.js";
10
+ import { appendRunAuditEvent } from "./run-audit.js";
11
+ import { controlRunResult, markRunApplyState } from "./run-delivery-state.js";
12
+ import { TERMINAL_STATES } from "./sse-shared.js";
13
+ export async function discardRunResult(rec) {
14
+ const retained = TERMINAL_STATES.has(rec.state) && rec.runDir && rec.runId
15
+ ? retainedEnvelopeOfRun(rec.runDir, rec.runId)
16
+ : null;
17
+ if (retained) {
18
+ await releaseRetainedEnvelope(retained);
19
+ appendRunAuditEvent(rec, "control.applied", {
20
+ decision: "discard",
21
+ retained_envelope: retained.envelope.worktree_path,
22
+ });
23
+ return ControlRunDecisionResponse.parse({
24
+ accepted: true,
25
+ status: "discarded",
26
+ message: "Stopped work discarded; its kept envelope was removed. A continuation starts from the project base.",
27
+ });
28
+ }
29
+ const files = readFilesWorkProduct(rec);
30
+ const state = controlRunResult(rec).applyState;
31
+ if (!TERMINAL_STATES.has(rec.state) ||
32
+ !files ||
33
+ files.manifest.isolation !== "envelope" ||
34
+ (state !== "not_applied" && state !== "discarded"))
35
+ throw Object.assign(new Error("Only an unapplied copied files result or a kept stopped run can be discarded; direct effects remain in place"), { status: 409 });
36
+ markRunApplyState(rec, "discarded", undefined, true);
37
+ appendRunAuditEvent(rec, "control.applied", {
38
+ decision: "discard",
39
+ manifest_sha256: files.manifestSha256,
40
+ });
41
+ return ControlRunDecisionResponse.parse({
42
+ accepted: true,
43
+ status: "discarded",
44
+ message: "Pending file application discarded; retained result follows normal retention.",
45
+ });
46
+ }
47
+ //# sourceMappingURL=run-discard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-discard.js","sourceRoot":"","sources":["../src/run-discard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAoB;IACzD,MAAM,QAAQ,GACZ,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK;QACvD,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACxC,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE;YAC1C,QAAQ,EAAE,SAAS;YACnB,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa;SACnD,CAAC,CAAC;QACH,OAAO,0BAA0B,CAAC,KAAK,CAAC;YACtC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,WAAW;YACnB,OAAO,EACL,qGAAqG;SACxG,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IAC/C,IACE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,CAAC,KAAK;QACN,KAAK,CAAC,QAAQ,CAAC,SAAS,KAAK,UAAU;QACvC,CAAC,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,CAAC;QAElD,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CACP,8GAA8G,CAC/G,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IACJ,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACrD,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE;QAC1C,QAAQ,EAAE,SAAS;QACnB,eAAe,EAAE,KAAK,CAAC,cAAc;KACtC,CAAC,CAAC;IACH,OAAO,0BAA0B,CAAC,KAAK,CAAC;QACtC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,+EAA+E;KACzF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { DaemonRunRecord } from "./run-record.js";
2
+ /**
3
+ * The ONE interpretation point for a run's saved patch (INV-062).
4
+ *
5
+ * `final/patch.diff` is byte-exact unless the work product says
6
+ * `persisted_patch: redacted`; then it is a display-only copy with secret-like
7
+ * strings hidden and every consumer that applies, checks, hashes or binds a
8
+ * decision to "the patch" must read the private exact patch object instead.
9
+ * `unavailable` means that object is missing or corrupt: `patch` then still
10
+ * holds the saved copy for display, and nothing may be applied from it.
11
+ */
12
+ export declare function resolveRunPatch(rec: DaemonRunRecord, projectRoot: string | null): {
13
+ patch: string | null;
14
+ unavailable: boolean;
15
+ };
16
+ /** Exact patch for a mutating or digest-binding route. An unavailable exact
17
+ * object is a typed 409 raised before any tree is touched. */
18
+ export declare function readExactRunPatch(rec: DaemonRunRecord, projectRoot: string | null): string | null;
19
+ /** Digest a recorded operator decision must equal; null when there is no exact
20
+ * patch to bind to (no artifact, or its exact bytes are unavailable). */
21
+ export declare function runPatchDigest(rec: DaemonRunRecord, projectRoot: string | null): string | null;
22
+ /** A blob-only finding is invisible to a text scan of the patch, so the `pr`
23
+ * publishing refusal reads the run's own disclosure for it. */
24
+ export declare function runPatchHasSecretLikeBinary(rec: DaemonRunRecord): boolean;
25
+ //# sourceMappingURL=run-exact-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-exact-patch.d.ts","sourceRoot":"","sources":["../src/run-exact-patch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAWhD;AAED;8DAC8D;AAC9D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CASjG;AAED;yEACyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG9F;AAED;+DAC+D;AAC/D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAIzE"}
@@ -0,0 +1,55 @@
1
+ import { EXACT_PATCH_UNAVAILABLE_MESSAGE } from "@claudexor/delivery";
2
+ import { WorkProduct } from "@claudexor/schema";
3
+ import { sha256 } from "@claudexor/util";
4
+ import { PATCH_EXACT_BYTES_UNAVAILABLE, resolveExactPatch } from "@claudexor/workspace";
5
+ import { readRawTextArtifact, safeReadStructuredArtifact } from "./run-artifact-read.js";
6
+ import { recordedExecutionRoot } from "./run-delivery-state.js";
7
+ /**
8
+ * The ONE interpretation point for a run's saved patch (INV-062).
9
+ *
10
+ * `final/patch.diff` is byte-exact unless the work product says
11
+ * `persisted_patch: redacted`; then it is a display-only copy with secret-like
12
+ * strings hidden and every consumer that applies, checks, hashes or binds a
13
+ * decision to "the patch" must read the private exact patch object instead.
14
+ * `unavailable` means that object is missing or corrupt: `patch` then still
15
+ * holds the saved copy for display, and nothing may be applied from it.
16
+ */
17
+ export function resolveRunPatch(rec, projectRoot) {
18
+ const saved = readRawTextArtifact(rec, "final/patch.diff");
19
+ if (saved === null)
20
+ return { patch: null, unavailable: false };
21
+ const exact = resolveExactPatch({
22
+ savedCopy: saved,
23
+ meta: safeReadStructuredArtifact(rec, "final/work_product.yaml", WorkProduct)?.meta,
24
+ roots: [projectRoot, recordedExecutionRoot(rec)],
25
+ });
26
+ return exact.ok
27
+ ? { patch: exact.patch, unavailable: false }
28
+ : { patch: saved, unavailable: true };
29
+ }
30
+ /** Exact patch for a mutating or digest-binding route. An unavailable exact
31
+ * object is a typed 409 raised before any tree is touched. */
32
+ export function readExactRunPatch(rec, projectRoot) {
33
+ const resolved = resolveRunPatch(rec, projectRoot);
34
+ if (resolved.unavailable) {
35
+ throw Object.assign(new Error(EXACT_PATCH_UNAVAILABLE_MESSAGE), {
36
+ status: 409,
37
+ code: PATCH_EXACT_BYTES_UNAVAILABLE,
38
+ });
39
+ }
40
+ return resolved.patch;
41
+ }
42
+ /** Digest a recorded operator decision must equal; null when there is no exact
43
+ * patch to bind to (no artifact, or its exact bytes are unavailable). */
44
+ export function runPatchDigest(rec, projectRoot) {
45
+ const resolved = resolveRunPatch(rec, projectRoot);
46
+ return resolved.patch !== null && !resolved.unavailable ? sha256(resolved.patch) : null;
47
+ }
48
+ /** A blob-only finding is invisible to a text scan of the patch, so the `pr`
49
+ * publishing refusal reads the run's own disclosure for it. */
50
+ export function runPatchHasSecretLikeBinary(rec) {
51
+ const meta = safeReadStructuredArtifact(rec, "final/work_product.yaml", WorkProduct)?.meta;
52
+ const finding = meta?.["secret_like"];
53
+ return Array.isArray(finding?.binary_paths) && finding.binary_paths.length > 0;
54
+ }
55
+ //# sourceMappingURL=run-exact-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-exact-patch.js","sourceRoot":"","sources":["../src/run-exact-patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAoB,EACpB,WAA0B;IAE1B,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAC9B,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,EAAE,WAAW,CAAC,EAAE,IAAI;QACnF,KAAK,EAAE,CAAC,WAAW,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;KACjD,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,EAAE;QACb,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;QAC5C,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;8DAC8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,GAAoB,EAAE,WAA0B;IAChF,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,EAAE;YAC9D,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,6BAA6B;SACpC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,cAAc,CAAC,GAAoB,EAAE,WAA0B;IAC7E,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1F,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,2BAA2B,CAAC,GAAoB;IAC9D,MAAM,IAAI,GAAG,0BAA0B,CAAC,GAAG,EAAE,yBAAyB,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,aAAa,CAA2C,CAAC;IAChF,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Where a run's files live, kept apart from the stable project it is
3
+ * identified by (INV-072/INV-073). A delegated run records its caller-owned
4
+ * `execution.workspaceRoot`; every reader of that run's files resolves there
5
+ * and never substitutes the project's same-named files.
6
+ */
7
+ import type { DaemonRunRecord } from "./daemon-server.js";
8
+ /** The caller-owned execution address a delegated run recorded in its params. */
9
+ export declare function runExecutionWorkspaceRoot(rec: DaemonRunRecord): string | null;
10
+ /** The tree a run's file references resolve in: its recorded caller-owned
11
+ * workspace, otherwise its project root; null without a project. */
12
+ export declare function runExecutionRoot(rec: DaemonRunRecord, projectRoot: string | null): string | null;
13
+ /** A run's stable project identity (null without project scope) and optional
14
+ * caller-owned workspace override. Run identity remains bound without an override. */
15
+ export interface RunWorkspaceBinding {
16
+ projectRoot: string | null;
17
+ workspaceRoot: string | null;
18
+ }
19
+ /** Every run-addressed project file read verifies the run's project identity,
20
+ * including ordinary runs whose files live in their project. */
21
+ export declare function runWorkspaceBinding(rec: DaemonRunRecord): RunWorkspaceBinding;
22
+ //# sourceMappingURL=run-execution-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-execution-root.d.ts","sourceRoot":"","sources":["../src/run-execution-root.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAK7E;AAED;qEACqE;AACrE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEhG;AAED;uFACuF;AACvF,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;iEACiE;AACjE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,mBAAmB,CAQ7E"}
@@ -0,0 +1,23 @@
1
+ /** The caller-owned execution address a delegated run recorded in its params. */
2
+ export function runExecutionWorkspaceRoot(rec) {
3
+ const execution = rec.params
4
+ ?.execution;
5
+ const root = execution?.workspaceRoot;
6
+ return typeof root === "string" && root.trim() ? root : null;
7
+ }
8
+ /** The tree a run's file references resolve in: its recorded caller-owned
9
+ * workspace, otherwise its project root; null without a project. */
10
+ export function runExecutionRoot(rec, projectRoot) {
11
+ return projectRoot === null ? null : (runExecutionWorkspaceRoot(rec) ?? projectRoot);
12
+ }
13
+ /** Every run-addressed project file read verifies the run's project identity,
14
+ * including ordinary runs whose files live in their project. */
15
+ export function runWorkspaceBinding(rec) {
16
+ const workspaceRoot = runExecutionWorkspaceRoot(rec);
17
+ const scope = rec.params?.scope;
18
+ const projectRoot = scope?.kind === "project" && typeof scope.root === "string" && scope.root.trim()
19
+ ? scope.root
20
+ : null;
21
+ return { projectRoot, workspaceRoot };
22
+ }
23
+ //# sourceMappingURL=run-execution-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-execution-root.js","sourceRoot":"","sources":["../src/run-execution-root.ts"],"names":[],"mappings":"AAQA,iFAAiF;AACjF,MAAM,UAAU,yBAAyB,CAAC,GAAoB;IAC5D,MAAM,SAAS,GAAI,GAAG,CAAC,MAAkE;QACvF,EAAE,SAAS,CAAC;IACd,MAAM,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC;IACtC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;qEACqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,GAAoB,EAAE,WAA0B;IAC/E,OAAO,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC;AACvF,CAAC;AASD;iEACiE;AACjE,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,MAAM,aAAa,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAI,GAAG,CAAC,MAAqE,EAAE,KAAK,CAAC;IAChG,MAAM,WAAW,GACf,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QAC9E,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AACxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-list-fingerprint.d.ts","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,wBAAgB,oCAAoC,IAAI,MAAM,CAE7D;AAED,wBAAgB,yCAAyC,IAAI,IAAI,CAEhE;AAED;4EAC4E;AAC5E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAyC/D"}
1
+ {"version":3,"file":"run-list-fingerprint.d.ts","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,wBAAgB,oCAAoC,IAAI,MAAM,CAE7D;AAED,wBAAgB,yCAAyC,IAAI,IAAI,CAEhE;AAED;4EAC4E;AAC5E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CA+C/D"}
@@ -1,5 +1,6 @@
1
1
  import { statSync } from "node:fs";
2
2
  import { sha256 } from "@claudexor/util";
3
+ import { RETAINED_ENVELOPE_POINTER, readContinuationSources, retainedEnvelopeInChain, } from "@claudexor/workspace";
3
4
  import { safeArtifactPath } from "./artifact-paths.js";
4
5
  import { TERMINAL_STATES } from "./sse-shared.js";
5
6
  /** Number of artifact-path probes performed by the run-list fingerprinter. */
@@ -38,6 +39,12 @@ export function summaryFingerprint(rec) {
38
39
  ...identity,
39
40
  fileIdentity("final/delivery_state.yaml"),
40
41
  fileIdentity("tombstone.yaml"),
42
+ // A9 custody: retention, adoption and release move this pointer.
43
+ fileIdentity(RETAINED_ENVELOPE_POINTER),
44
+ // An unadopted ancestor can be released after this head reached terminal.
45
+ rec.runDir
46
+ ? (retainedEnvelopeInChain(readContinuationSources(rec.runDir))?.envelope.id ?? "")
47
+ : "",
41
48
  ].join("|");
42
49
  }
43
50
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"run-list-fingerprint.js","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,8EAA8E;AAC9E,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,oCAAoC;IAClD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,yCAAyC;IACvD,qBAAqB,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,GAAoB;IACrD,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE;QAC3C,qBAAqB,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5F,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,OAAO;YACL,GAAG,QAAQ;YACX,YAAY,CAAC,2BAA2B,CAAC;YACzC,YAAY,CAAC,gBAAgB,CAAC;SAC/B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,QAAQ;QACX,YAAY,CAAC,cAAc,CAAC;QAC5B,YAAY,CAAC,2BAA2B,CAAC;QACzC,YAAY,CAAC,sBAAsB,CAAC;QACpC,YAAY,CAAC,sBAAsB,CAAC;QACpC,YAAY,CAAC,oBAAoB,CAAC;QAClC,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,iBAAiB,CAAC;QAC/B,YAAY,CAAC,eAAe,CAAC;QAC7B,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,iBAAiB,CAAC;QAC/B,YAAY,CAAC,kBAAkB,CAAC;QAChC,YAAY,CAAC,yBAAyB,CAAC;QACvC,YAAY,CAAC,2BAA2B,CAAC;KAC1C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,uBAAuB,CAAC;IACjC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"run-list-fingerprint.js","sourceRoot":"","sources":["../src/run-list-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -1,33 +1,6 @@
1
- /**
2
- * GET /v2/runs pagination + cache-bounding helpers (QA-052).
3
- *
4
- * The route used to map EVERY retained daemon record on every call, silently
5
- * ignore `limit`/`state`/`cursor`, and clear its whole summary cache past a
6
- * guard. This module owns the honest, bounded server half:
7
- * - a strict typed query (limit / state / opaque keyset cursor);
8
- * - deterministic newest-first `(createdAt desc, id desc)` ordering;
9
- * - keyset paging that survives concurrent inserts/prunes (walks the set once,
10
- * no duplicates or omissions), so projection work is bounded by page size
11
- * rather than total retained records;
12
- * - an LRU-bounded map primitive so the summary cache evicts its oldest entry
13
- * instead of a wholesale clear-and-rehydrate thrash.
14
- */
15
- import { ControlRunState } from "@claudexor/schema";
16
- /** Only the record fields keyset ordering + cursors depend on (structural). */
17
- export interface RunListRecord {
18
- id: string;
19
- state: string;
20
- createdAt?: string;
21
- }
22
- export interface RunListCursor {
23
- createdAt: string;
24
- id: string;
25
- }
26
- export interface RunListQuery {
27
- limit: number;
28
- state: ControlRunState | null;
29
- cursor: RunListCursor | null;
30
- }
1
+ import { type RunListQuery } from "@claudexor/schema";
2
+ export { selectRunListPage } from "@claudexor/schema";
3
+ export type { RunListQuery } from "@claudexor/schema";
31
4
  /**
32
5
  * Parse + validate the GET /v2/runs query. Unknown params are refused (strict
33
6
  * doctrine, matching sibling routes that call `assertOnlyQueryParams`); a typoed
@@ -35,33 +8,6 @@ export interface RunListQuery {
35
8
  * 400 instead of being silently ignored.
36
9
  */
37
10
  export declare function parseRunListQuery(url: URL): RunListQuery;
38
- /** Newest-first deterministic order: `(createdAt desc, id desc)`. Records with
39
- * no `createdAt` sort last (empty string) with `id` as the stable tiebreak, so
40
- * the traversal is total and duplicate-free even across foreign record shapes. */
41
- export declare function orderRunRecords<T extends RunListRecord>(records: readonly T[]): T[];
42
- /**
43
- * Index of the first record strictly after `cursor` within an already-ordered
44
- * list. Comparison-based (not id-equality) so a cursor whose record was pruned
45
- * between pages still resumes at the correct neighbor — no duplicate, no gap.
46
- */
47
- export declare function indexAfterCursor(ordered: readonly RunListRecord[], cursor: RunListCursor): number;
48
- export declare function encodeRunCursor(rec: RunListRecord): string;
49
- /** Strict opaque-cursor decode: base64url alphabet only, exactly one separator,
50
- * non-empty id. Anything else is a typed 400 (never a silent full-list fall
51
- * back), mirroring the QA-061 run-event cursor contract. */
52
- export declare function decodeRunCursor(raw: string): RunListCursor;
53
- /**
54
- * Select one bounded page from the raw daemon records: order newest-first,
55
- * apply the optional `state` filter, then keyset-slice by cursor + limit. All of
56
- * it happens on the raw records BEFORE any summary is materialized, so the
57
- * caller only fingerprints/projects the returned page — work bounded by page
58
- * size, not total retained records (QA-052).
59
- */
60
- export declare function selectRunListPage<T extends RunListRecord>(records: readonly T[], query: RunListQuery): {
61
- page: T[];
62
- hasMore: boolean;
63
- nextCursor: string | null;
64
- };
65
11
  /** Move an existing key to the most-recently-used position and read it. */
66
12
  export declare function lruGet<K, V>(map: Map<K, V>, key: K): V | undefined;
67
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"run-list.d.ts","sourceRoot":"","sources":["../src/run-list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC9B;AAcD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,CAoCxD;AAED;;kFAEkF;AAClF,wBAAgB,eAAe,CAAC,CAAC,SAAS,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAQnF;AAUD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAIjG;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED;;4DAE4D;AAC5D,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAiB1D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACvD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,KAAK,EAAE,YAAY,GAClB;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQ5D;AAED,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAOlE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQhF"}
1
+ {"version":3,"file":"run-list.d.ts","sourceRoot":"","sources":["../src/run-list.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAsBtD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY,CAoCxD;AAED,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAOlE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQhF"}
package/dist/run-list.js CHANGED
@@ -14,6 +14,8 @@
14
14
  */
15
15
  import { ControlRunState } from "@claudexor/schema";
16
16
  import { assertOnlyQueryParams, singleQuery } from "./query.js";
17
+ import { decodeRunCursor } from "@claudexor/schema";
18
+ export { selectRunListPage } from "@claudexor/schema";
17
19
  /** Default page size when the caller sends no `limit` — newest-first, so the
18
20
  * default page always contains every active (queued/running) run a thread-first
19
21
  * client needs to discover without downloading all terminal history. */
@@ -61,73 +63,6 @@ export function parseRunListQuery(url) {
61
63
  const cursor = cursorRaw === undefined ? null : decodeRunCursor(cursorRaw);
62
64
  return { limit, state, cursor };
63
65
  }
64
- /** Newest-first deterministic order: `(createdAt desc, id desc)`. Records with
65
- * no `createdAt` sort last (empty string) with `id` as the stable tiebreak, so
66
- * the traversal is total and duplicate-free even across foreign record shapes. */
67
- export function orderRunRecords(records) {
68
- return [...records].sort((a, b) => {
69
- const ac = a.createdAt ?? "";
70
- const bc = b.createdAt ?? "";
71
- if (ac !== bc)
72
- return ac < bc ? 1 : -1;
73
- if (a.id !== b.id)
74
- return a.id < b.id ? 1 : -1;
75
- return 0;
76
- });
77
- }
78
- /** True when `rec` sorts strictly AFTER the cursor key in newest-first order
79
- * (i.e. is older, or same instant with a smaller id). */
80
- function recordSortsAfterCursor(rec, cursor) {
81
- const rc = rec.createdAt ?? "";
82
- if (rc !== cursor.createdAt)
83
- return rc < cursor.createdAt;
84
- return rec.id < cursor.id;
85
- }
86
- /**
87
- * Index of the first record strictly after `cursor` within an already-ordered
88
- * list. Comparison-based (not id-equality) so a cursor whose record was pruned
89
- * between pages still resumes at the correct neighbor — no duplicate, no gap.
90
- */
91
- export function indexAfterCursor(ordered, cursor) {
92
- let i = 0;
93
- while (i < ordered.length && !recordSortsAfterCursor(ordered[i], cursor))
94
- i++;
95
- return i;
96
- }
97
- export function encodeRunCursor(rec) {
98
- return Buffer.from(`${rec.createdAt ?? ""}\0${rec.id}`, "utf8").toString("base64url");
99
- }
100
- /** Strict opaque-cursor decode: base64url alphabet only, exactly one separator,
101
- * non-empty id. Anything else is a typed 400 (never a silent full-list fall
102
- * back), mirroring the QA-061 run-event cursor contract. */
103
- export function decodeRunCursor(raw) {
104
- if (!/^[A-Za-z0-9_-]+$/.test(raw)) {
105
- throw invalidRunListQuery("cursor is malformed; refetch the run list and resume from its nextCursor", "invalid_run_list_cursor");
106
- }
107
- const decoded = Buffer.from(raw, "base64url").toString("utf8");
108
- const sep = decoded.indexOf("\0");
109
- const id = sep < 0 ? "" : decoded.slice(sep + 1);
110
- if (sep < 0 || id.length === 0 || id.includes("\0")) {
111
- throw invalidRunListQuery("cursor is malformed; refetch the run list and resume from its nextCursor", "invalid_run_list_cursor");
112
- }
113
- return { createdAt: decoded.slice(0, sep), id };
114
- }
115
- /**
116
- * Select one bounded page from the raw daemon records: order newest-first,
117
- * apply the optional `state` filter, then keyset-slice by cursor + limit. All of
118
- * it happens on the raw records BEFORE any summary is materialized, so the
119
- * caller only fingerprints/projects the returned page — work bounded by page
120
- * size, not total retained records (QA-052).
121
- */
122
- export function selectRunListPage(records, query) {
123
- const ordered = orderRunRecords(records);
124
- const filtered = query.state ? ordered.filter((r) => r.state === query.state) : ordered;
125
- const start = query.cursor ? indexAfterCursor(filtered, query.cursor) : 0;
126
- const page = filtered.slice(start, start + query.limit);
127
- const hasMore = start + page.length < filtered.length;
128
- const tail = page[page.length - 1];
129
- return { page, hasMore, nextCursor: hasMore && tail ? encodeRunCursor(tail) : null };
130
- }
131
66
  /** Move an existing key to the most-recently-used position and read it. */
132
67
  export function lruGet(map, key) {
133
68
  const value = map.get(key);
@@ -1 +1 @@
1
- {"version":3,"file":"run-list.js","sourceRoot":"","sources":["../src/run-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-list.js","sourceRoot":"","sources":["../src/run-list.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { CancelReasonCode, CommandListQuery } from "@claudexor/schema";
2
2
  export interface DaemonRunRecord {
3
+ promptPreview?: string;
3
4
  id: string;
4
5
  state: string;
5
6
  runId?: string;
@@ -17,6 +18,7 @@ export interface DaemonRunRecord {
17
18
  finishedAt?: string;
18
19
  }
19
20
  export interface DaemonFacadeClient {
21
+ health?(): Promise<unknown>;
20
22
  enqueue(params: unknown, options?: {
21
23
  idempotencyKey?: string;
22
24
  clientId?: string;
@@ -34,9 +36,8 @@ export interface DaemonFacadeClient {
34
36
  idempotencyRequest?: unknown;
35
37
  }): Promise<DaemonRunRecord | null>;
36
38
  status(id: string): Promise<DaemonRunRecord>;
37
- /** Addressed read (`{id}` XOR `{delegatedFromRunId}`) so the daemon selects
38
- * before it projects; omitted, it returns the whole retained product list. */
39
- list(query?: CommandListQuery): Promise<DaemonRunRecord[]>;
39
+ /** Required addressed selection before projection. */
40
+ list(query: CommandListQuery): Promise<DaemonRunRecord[]>;
40
41
  cancel(id: string, reasonCode?: CancelReasonCode): Promise<unknown>;
41
42
  fenceDelegationParent?(runId: string): Promise<unknown>;
42
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5D,YAAY,CAAC,CACX,MAAM,EAAE,OAAO,EACf,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GACA,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C;kFAC8E;IAC9E,IAAI,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,qBAAqB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,aAAa,GAAG,sBAAsB,CAAC;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI7E;AAED;;wEAEwE;AACxE,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,GAC/B,eAAe,EAAE,CAuBnB"}
1
+ {"version":3,"file":"run-record.d.ts","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CACL,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5D,YAAY,CAAC,CACX,MAAM,EAAE,OAAO,EACf,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GACA,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,sDAAsD;IACtD,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,qBAAqB,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,aAAa,GAAG,sBAAsB,CAAC;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI7E;AAED;;wEAEwE;AACxE,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,eAAe,EAAE,GAC/B,eAAe,EAAE,CAuBnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-record.js","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAuDtD,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACxF,CAAC,CAAE,MAAM,CAAC,MAAkC;QAC5C,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,IAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,SAAS;YACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"run-record.js","sourceRoot":"","sources":["../src/run-record.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAwDtD,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,OAAO,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACxF,CAAC,CAAE,MAAM,CAAC,MAAkC;QAC5C,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,+BAA+B,CAC7C,WAAmB,EACnB,IAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,SAAS;YACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}