@claudexor/cli 3.17.2 → 3.20.1

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 (146) hide show
  1. package/dist/account-catalog.d.ts +3 -5
  2. package/dist/account-catalog.d.ts.map +1 -1
  3. package/dist/account-catalog.js +21 -7
  4. package/dist/account-catalog.js.map +1 -1
  5. package/dist/accounts-projection.d.ts +4 -1
  6. package/dist/accounts-projection.d.ts.map +1 -1
  7. package/dist/accounts-projection.js +18 -4
  8. package/dist/accounts-projection.js.map +1 -1
  9. package/dist/accounts-services.d.ts +2 -1
  10. package/dist/accounts-services.d.ts.map +1 -1
  11. package/dist/accounts-services.js +38 -10
  12. package/dist/accounts-services.js.map +1 -1
  13. package/dist/acp-surface-runner.d.ts.map +1 -1
  14. package/dist/acp-surface-runner.js +2 -0
  15. package/dist/acp-surface-runner.js.map +1 -1
  16. package/dist/claude-oauth-credential.d.ts +16 -0
  17. package/dist/claude-oauth-credential.d.ts.map +1 -0
  18. package/dist/claude-oauth-credential.js +82 -0
  19. package/dist/claude-oauth-credential.js.map +1 -0
  20. package/dist/claude-oauth-usage.d.ts +5 -30
  21. package/dist/claude-oauth-usage.d.ts.map +1 -1
  22. package/dist/claude-oauth-usage.js +98 -104
  23. package/dist/claude-oauth-usage.js.map +1 -1
  24. package/dist/claudexord.d.ts.map +1 -1
  25. package/dist/claudexord.js +1 -1
  26. package/dist/claudexord.js.map +1 -1
  27. package/dist/codex-quota-source.d.ts +6 -2
  28. package/dist/codex-quota-source.d.ts.map +1 -1
  29. package/dist/codex-quota-source.js +58 -94
  30. package/dist/codex-quota-source.js.map +1 -1
  31. package/dist/control-services.d.ts +12 -3
  32. package/dist/control-services.d.ts.map +1 -1
  33. package/dist/control-services.js +15 -20
  34. package/dist/control-services.js.map +1 -1
  35. package/dist/credential-commands.d.ts.map +1 -1
  36. package/dist/credential-commands.js +10 -4
  37. package/dist/credential-commands.js.map +1 -1
  38. package/dist/daemon-agent-runner.d.ts.map +1 -1
  39. package/dist/daemon-agent-runner.js +2 -6
  40. package/dist/daemon-agent-runner.js.map +1 -1
  41. package/dist/gc-receipt-notes.d.ts +14 -0
  42. package/dist/gc-receipt-notes.d.ts.map +1 -0
  43. package/dist/gc-receipt-notes.js +28 -0
  44. package/dist/gc-receipt-notes.js.map +1 -0
  45. package/dist/harness-command-specs.d.ts +1 -1
  46. package/dist/harness-command-specs.d.ts.map +1 -1
  47. package/dist/harness-command-specs.js +8 -1
  48. package/dist/harness-command-specs.js.map +1 -1
  49. package/dist/harness-install-proof.d.ts.map +1 -1
  50. package/dist/harness-install-proof.js +14 -18
  51. package/dist/harness-install-proof.js.map +1 -1
  52. package/dist/harness-install-recipes.d.ts +2 -1
  53. package/dist/harness-install-recipes.d.ts.map +1 -1
  54. package/dist/harness-install-recipes.js +12 -9
  55. package/dist/harness-install-recipes.js.map +1 -1
  56. package/dist/harness-installer.d.ts +1 -1
  57. package/dist/harness-installer.d.ts.map +1 -1
  58. package/dist/harness-installer.js +8 -9
  59. package/dist/harness-installer.js.map +1 -1
  60. package/dist/live.d.ts.map +1 -1
  61. package/dist/live.js +4 -1
  62. package/dist/live.js.map +1 -1
  63. package/dist/mcp-daemon-unavailable.d.ts +2 -0
  64. package/dist/mcp-daemon-unavailable.d.ts.map +1 -1
  65. package/dist/mcp-daemon-unavailable.js +5 -3
  66. package/dist/mcp-daemon-unavailable.js.map +1 -1
  67. package/dist/mcp-journal-recovery.d.ts +3 -0
  68. package/dist/mcp-journal-recovery.d.ts.map +1 -0
  69. package/dist/mcp-journal-recovery.js +40 -0
  70. package/dist/mcp-journal-recovery.js.map +1 -0
  71. package/dist/mcp-run-projections.d.ts +7 -1
  72. package/dist/mcp-run-projections.d.ts.map +1 -1
  73. package/dist/mcp-runner.d.ts.map +1 -1
  74. package/dist/mcp-runner.js +8 -36
  75. package/dist/mcp-runner.js.map +1 -1
  76. package/dist/mcp-thread-query.d.ts +3 -0
  77. package/dist/mcp-thread-query.d.ts.map +1 -0
  78. package/dist/mcp-thread-query.js +94 -0
  79. package/dist/mcp-thread-query.js.map +1 -0
  80. package/dist/model-account-evidence.d.ts +18 -0
  81. package/dist/model-account-evidence.d.ts.map +1 -0
  82. package/dist/model-account-evidence.js +71 -0
  83. package/dist/model-account-evidence.js.map +1 -0
  84. package/dist/model-services.d.ts.map +1 -1
  85. package/dist/model-services.js +77 -83
  86. package/dist/model-services.js.map +1 -1
  87. package/dist/native-login.d.ts +8 -1
  88. package/dist/native-login.d.ts.map +1 -1
  89. package/dist/native-login.js +25 -6
  90. package/dist/native-login.js.map +1 -1
  91. package/dist/ops-commands.d.ts.map +1 -1
  92. package/dist/ops-commands.js +22 -25
  93. package/dist/ops-commands.js.map +1 -1
  94. package/dist/plugins.d.ts.map +1 -1
  95. package/dist/plugins.js +4 -3
  96. package/dist/plugins.js.map +1 -1
  97. package/dist/quota-refresh-diagnostics.d.ts +33 -0
  98. package/dist/quota-refresh-diagnostics.d.ts.map +1 -0
  99. package/dist/quota-refresh-diagnostics.js +9 -0
  100. package/dist/quota-refresh-diagnostics.js.map +1 -0
  101. package/dist/quota-refreshers.d.ts +5 -4
  102. package/dist/quota-refreshers.d.ts.map +1 -1
  103. package/dist/quota-refreshers.js +11 -4
  104. package/dist/quota-refreshers.js.map +1 -1
  105. package/dist/quota-services.d.ts +4 -2
  106. package/dist/quota-services.d.ts.map +1 -1
  107. package/dist/registry.d.ts +1 -1
  108. package/dist/registry.d.ts.map +1 -1
  109. package/dist/registry.js +3 -1
  110. package/dist/registry.js.map +1 -1
  111. package/dist/retention-service.d.ts +7 -1
  112. package/dist/retention-service.d.ts.map +1 -1
  113. package/dist/retention-service.js +84 -5
  114. package/dist/retention-service.js.map +1 -1
  115. package/dist/run-orchestrator.d.ts +0 -6
  116. package/dist/run-orchestrator.d.ts.map +1 -1
  117. package/dist/run-orchestrator.js +41 -10
  118. package/dist/run-orchestrator.js.map +1 -1
  119. package/dist/setup-jobs.js +6 -6
  120. package/dist/setup-jobs.js.map +1 -1
  121. package/dist/setup-login-capability.d.ts.map +1 -1
  122. package/dist/setup-login-capability.js +6 -2
  123. package/dist/setup-login-capability.js.map +1 -1
  124. package/dist/setup-login-child-lifecycle.d.ts.map +1 -1
  125. package/dist/setup-login-child-lifecycle.js +16 -4
  126. package/dist/setup-login-child-lifecycle.js.map +1 -1
  127. package/dist/setup-login-fallback.d.ts +54 -0
  128. package/dist/setup-login-fallback.d.ts.map +1 -0
  129. package/dist/setup-login-fallback.js +95 -0
  130. package/dist/setup-login-fallback.js.map +1 -0
  131. package/dist/setup-login-inline.d.ts +8 -46
  132. package/dist/setup-login-inline.d.ts.map +1 -1
  133. package/dist/setup-login-inline.js +79 -104
  134. package/dist/setup-login-inline.js.map +1 -1
  135. package/dist/setup-login-input-prompt.d.ts +7 -0
  136. package/dist/setup-login-input-prompt.d.ts.map +1 -0
  137. package/dist/setup-login-input-prompt.js +27 -0
  138. package/dist/setup-login-input-prompt.js.map +1 -0
  139. package/dist/setup-login-runner.d.ts.map +1 -1
  140. package/dist/setup-login-runner.js +15 -11
  141. package/dist/setup-login-runner.js.map +1 -1
  142. package/dist/thread-purge.d.ts +52 -0
  143. package/dist/thread-purge.d.ts.map +1 -0
  144. package/dist/thread-purge.js +27 -0
  145. package/dist/thread-purge.js.map +1 -0
  146. package/package.json +25 -24
@@ -1 +1 @@
1
- {"version":3,"file":"quota-refreshers.d.ts","sourceRoot":"","sources":["../src/quota-refreshers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;;;;gDAI4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;CACnD;AAED;;;;;qBAKqB;AACrB,eAAO,MAAM,6BAA6B;qBAC9B,kBAAkB;qBAAU,OAAO;;;qBACnC,mBAAmB;qBAAU,QAAQ;;;qBAErC,oBAAoB;qBACpB,QAAQ;+BACE,iBAAiB;;qBAE3B,mBAAmB;qBAAU,KAAK;;EACY,CAAC;AAE3D,wBAAgB,eAAe,IAAI,oBAAoB,EAAE,CAExD"}
1
+ {"version":3,"file":"quota-refreshers.d.ts","sourceRoot":"","sources":["../src/quota-refreshers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B;;;;gDAI4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,CAChB,KAAK,CAAC,EAAE,iBAAiB,EACzB,UAAU,CAAC,EAAE,mBAAmB,KAC7B,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;CAClD;AAED;;;;;qBAKqB;AACrB,eAAO,MAAM,6BAA6B;qBAE9B,kBAAkB;qBAClB,OAAO;+BACG,iBAAiB,eAAe,mBAAmB;;qBAG7D,mBAAmB;qBAAU,QAAQ;;;qBAErC,oBAAoB;qBACpB,QAAQ;+BACE,iBAAiB,eAAe,mBAAmB;;qBAG7D,mBAAmB;qBAAU,KAAK;;EACY,CAAC;AAE3D,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,oBAAoB,EAAE,CAKxF"}
@@ -9,16 +9,23 @@ import { refreshAgyQuota } from "./agy-quota-source.js";
9
9
  * re-presents a token it remembers as rejected); the others take no options
10
10
  * from the cycle. */
11
11
  export const QUOTA_REFRESHER_REGISTRATIONS = [
12
- { source: "codex_app_server", vendor: "codex", refresh: () => refreshCodexQuota() },
12
+ {
13
+ source: "codex_app_server",
14
+ vendor: "codex",
15
+ refresh: (cycle, diagnostic) => refreshCodexQuota({ diagnostic, foreground: cycle?.foreground }),
16
+ },
13
17
  { source: "claude_statusline", vendor: "claude", refresh: () => refreshClaudeStatuslineQuota() },
14
18
  {
15
19
  source: "claude_oauth_usage",
16
20
  vendor: "claude",
17
- refresh: (cycle) => refreshClaudeOauthUsageQuota({}, cycle),
21
+ refresh: (cycle, diagnostic) => refreshClaudeOauthUsageQuota(diagnostic ? { diagnostic } : {}, cycle),
18
22
  },
19
23
  { source: "agy_command_usage", vendor: "agy", refresh: () => refreshAgyQuota() },
20
24
  ];
21
- export function quotaRefreshers() {
22
- return QUOTA_REFRESHER_REGISTRATIONS.map(({ vendor, refresh }) => ({ vendor, refresh }));
25
+ export function quotaRefreshers(diagnostic) {
26
+ return QUOTA_REFRESHER_REGISTRATIONS.map(({ vendor, refresh }) => ({
27
+ vendor,
28
+ refresh: (cycle) => refresh(cycle, diagnostic),
29
+ }));
23
30
  }
24
31
  //# sourceMappingURL=quota-refreshers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quota-refreshers.js","sourceRoot":"","sources":["../src/quota-refreshers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAaxD;;;;;qBAKqB;AACrB,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE,EAAE;IACnF,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,4BAA4B,EAAE,EAAE;IAChG;QACE,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,4BAA4B,CAAC,EAAE,EAAE,KAAK,CAAC;KAChF;IACD,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE;CACxB,CAAC;AAE3D,MAAM,UAAU,eAAe;IAC7B,OAAO,6BAA6B,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC"}
1
+ {"version":3,"file":"quota-refreshers.js","sourceRoot":"","sources":["../src/quota-refreshers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiBxD;;;;;qBAKqB;AACrB,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C;QACE,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,CAAC,KAAyB,EAAE,UAAgC,EAAE,EAAE,CACvE,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;KACnE;IACD,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,4BAA4B,EAAE,EAAE;IAChG;QACE,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,CAAC,KAAyB,EAAE,UAAgC,EAAE,EAAE,CACvE,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC;KACxE;IACD,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE;CACxB,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,UAAgC;IAC9D,OAAO,6BAA6B,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM;QACN,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -24,9 +24,10 @@ export declare function quotaControlServices(quotaRegistry: () => QuotaRegistry)
24
24
  resets_at: string | null;
25
25
  cooldown_until: string | null;
26
26
  }[];
27
- source: "agy_command_usage" | "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout" | "cursor_rate_limit";
27
+ source: "agy_command_usage" | "claude_api_retry" | "claude_oauth_usage" | "claude_rate_limit_event" | "claude_statusline" | "codex_app_server" | "codex_app_server_event" | "codex_rollout" | "cursor_rate_limit";
28
28
  observed_at: string;
29
29
  freshness: "fresh" | "stale" | "unknown";
30
+ snapshot_id?: string | undefined;
30
31
  availability?: {
31
32
  state: "available" | "cooldown" | "exhausted";
32
33
  blocking_constraints: string[];
@@ -74,9 +75,10 @@ export declare function quotaControlServices(quotaRegistry: () => QuotaRegistry)
74
75
  resets_at: string | null;
75
76
  cooldown_until: string | null;
76
77
  }[];
77
- source: "agy_command_usage" | "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout" | "cursor_rate_limit";
78
+ source: "agy_command_usage" | "claude_api_retry" | "claude_oauth_usage" | "claude_rate_limit_event" | "claude_statusline" | "codex_app_server" | "codex_app_server_event" | "codex_rollout" | "cursor_rate_limit";
78
79
  observed_at: string;
79
80
  freshness: "fresh" | "stale" | "unknown";
81
+ snapshot_id?: string | undefined;
80
82
  availability?: {
81
83
  state: "available" | "cooldown" | "exhausted";
82
84
  blocking_constraints: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"quota-services.d.ts","sourceRoot":"","sources":["../src/quota-services.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,aAAa;IAEnE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACL,YAAY,WAAiB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvC"}
1
+ {"version":3,"file":"quota-services.d.ts","sourceRoot":"","sources":["../src/quota-services.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;;;4EAI4E;AAC5E,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,aAAa;IAEnE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACL,YAAY,WAAiB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvC"}
@@ -7,7 +7,7 @@ export interface RegistryOptions {
7
7
  includeFakes?: boolean;
8
8
  }
9
9
  /**
10
- * Build the adapter registry. All six real adapters are always registered;
10
+ * Build the adapter registry. All real adapters are always registered;
11
11
  * the gateway only selects doctor-OK non-fake harnesses by default. Fakes are
12
12
  * registered for explicit `--harness`. An `openrouter` raw-API instance is the
13
13
  * direct-API path for explicitly requested auxiliary models when its key exists.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,eAAe,EAErB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mCAAmC,EACnC,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQpD,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,eAAe,CAwBzE;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,eAAoB,GAAG,cAAc,CAEvE;AAED;;kFAEkF;AAClF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,4BAA4B,CAAC;IACvC,OAAO,EAAE,qBAAqB,CAAC;CAChC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,EACpB,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAwD5B;AAUD,iFAAiF;AACjF,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,EACpB,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,GAClC,OAAO,CAAC,4BAA4B,CAAC,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAO1F;AAED,oFAAoF;AACpF,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,4BAA4B,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAGrE;AAED,mGAAmG;AACnG,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,GACA,OAAO,CAAC,mCAAmC,CAAC,CA+E9C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,eAAe,EAErB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mCAAmC,EACnC,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASpD,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,eAAe,CAyBzE;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,eAAoB,GAAG,cAAc,CAEvE;AAED;;kFAEkF;AAClF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,4BAA4B,CAAC;IACvC,OAAO,EAAE,qBAAqB,CAAC;CAChC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,EACpB,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAwD5B;AAUD,iFAAiF;AACjF,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,EACpB,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,GAClC,OAAO,CAAC,4BAA4B,CAAC,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAO1F;AAED,oFAAoF;AACpF,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,YAAY,UAAQ,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,4BAA4B,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAGrE;AAED,mGAAmG;AACnG,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,qBAAqB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,GACA,OAAO,CAAC,mCAAmC,CAAC,CA+E9C"}
package/dist/registry.js CHANGED
@@ -2,6 +2,7 @@ import { hasModelInventoryForRoute, validateModel, } from "@claudexor/core";
2
2
  import { ControlHarnessAccountModelsResponse, } from "@claudexor/schema";
3
3
  import { HarnessGateway } from "@claudexor/gateway";
4
4
  import { createAgyAdapter } from "@claudexor/harness-agy";
5
+ import { copilot, createAcpAdapter } from "@claudexor/harness-acp";
5
6
  import { createClaudeAdapter } from "@claudexor/harness-claude";
6
7
  import { createCodexAdapter } from "@claudexor/harness-codex";
7
8
  import { createCursorAdapter } from "@claudexor/harness-cursor";
@@ -10,7 +11,7 @@ import { createOpenCodeAdapter } from "@claudexor/harness-opencode";
10
11
  import { createRawApiAdapter } from "@claudexor/harness-raw-api";
11
12
  import { catalogProfiles, enumerateAccountCatalogs, } from "./account-catalog.js";
12
13
  /**
13
- * Build the adapter registry. All six real adapters are always registered;
14
+ * Build the adapter registry. All real adapters are always registered;
14
15
  * the gateway only selects doctor-OK non-fake harnesses by default. Fakes are
15
16
  * registered for explicit `--harness`. An `openrouter` raw-API instance is the
16
17
  * direct-API path for explicitly requested auxiliary models when its key exists.
@@ -20,6 +21,7 @@ export function buildRegistry(opts = {}) {
20
21
  for (const adapter of [
21
22
  createCodexAdapter(),
22
23
  createAgyAdapter(),
24
+ createAcpAdapter(copilot),
23
25
  createClaudeAdapter(),
24
26
  createCursorAdapter(),
25
27
  createOpenCodeAdapter(),
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ProjectPartitions, ProjectStore } from "@claudexor/daemon";
2
- import type { ControlGcReceipt, ControlGcRequest } from "@claudexor/schema";
2
+ import type { ControlGcReceipt, ControlGcRequest, Thread } from "@claudexor/schema";
3
3
  export interface RetentionRunnerDeps {
4
4
  projects: () => ProjectStore;
5
5
  threads: ProjectPartitions;
@@ -7,7 +7,13 @@ export interface RetentionRunnerDeps {
7
7
  runId?: string;
8
8
  state: string;
9
9
  finishedAt?: string;
10
+ params?: unknown;
10
11
  }>>;
12
+ /** The ONE thread purge owner (thread-purge.ts): journals the purge, then
13
+ * deletes the isolated worktree/branch and every lane home of the thread. */
14
+ purgeThread: (id: string) => Promise<unknown>;
15
+ /** Whether a directory that owner deletes is still on disk for the thread. */
16
+ hasPurgeLeftovers: (thread: Thread) => boolean;
11
17
  }
12
18
  export type RetentionRunner = (request: ControlGcRequest) => Promise<ControlGcReceipt>;
13
19
  export declare function createRetentionRunner(deps: RetentionRunnerDeps): RetentionRunner;
@@ -1 +1 @@
1
- {"version":3,"file":"retention-service.d.ts","sourceRoot":"","sources":["../src/retention-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQ5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,YAAY,CAAC;IAC7B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC1F;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAqHhF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,IAAI,CAkBN"}
1
+ {"version":3,"file":"retention-service.d.ts","sourceRoot":"","sources":["../src/retention-service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAYpF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,YAAY,CAAC;IAC7B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CACvB,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAChF,CAAC;IACF;iFAC6E;IAC7E,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,8EAA8E;IAC9E,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAwEvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAmIhF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,IAAI,CAoBN"}
@@ -3,15 +3,77 @@
3
3
  * control-api retention pass to the daemon's live truth — the project
4
4
  * registry, thread lineage references, and journal-projected job records —
5
5
  * and schedules the bounded startup maintenance pass. `claudexor gc` and the
6
- * control route are thin callers of the runner built here.
6
+ * control route are thin callers of the runner built here. The same pass
7
+ * purges expired trash (a trashed thread past `purge_after`) through the one
8
+ * thread purge owner, so trash cannot outlive its restore window forever, and
9
+ * through the same owner finishes every purge whose directory cleanup failed
10
+ * after the purge was journaled.
7
11
  */
8
12
  import { join } from "node:path";
9
13
  import { ArtifactStore } from "@claudexor/artifact-store";
10
- import { runRetentionPass } from "@claudexor/control-api";
14
+ import { findActiveThreadRun, runRetentionPass, } from "@claudexor/control-api";
11
15
  import { loadConfig } from "@claudexor/config";
12
16
  import { claudexorOwnedRoot, noProjectRepoRoot, userConfigDir } from "@claudexor/util";
13
17
  import { sweepOrphanLanes } from "@claudexor/workspace";
14
18
  import { logLine } from "./daemon-lifecycle.js";
19
+ /** Trashed threads whose restore window (`purge_after`) has ended. */
20
+ function expiredTrashThreads(threads, now) {
21
+ return threads.filter((thread) => thread.state === "trashed" &&
22
+ thread.purge_after !== null &&
23
+ Date.parse(thread.purge_after) <= now);
24
+ }
25
+ /**
26
+ * Finish purges whose directory cleanup failed after the journal commit: a
27
+ * purged thread is hidden from every listing, so without this pass its
28
+ * isolated worktree (and any lane home) would stay on disk forever. The owner
29
+ * journals nothing new for an already purged thread and deletes what is left;
30
+ * a cleanup that fails again is disclosed and retried by the next pass. The
31
+ * thread is never made restorable again. Dry-run only lists them.
32
+ */
33
+ async function finishPurgeLeftovers(deps, dryRun) {
34
+ const finished = [];
35
+ const errors = [];
36
+ for (const thread of deps.threads.listPurgedThreads()) {
37
+ if (!deps.hasPurgeLeftovers(thread))
38
+ continue;
39
+ try {
40
+ if (!dryRun)
41
+ await deps.purgeThread(thread.id);
42
+ finished.push(thread.id);
43
+ }
44
+ catch (error) {
45
+ errors.push(`purged thread ${thread.id} cleanup: ${error instanceof Error ? error.message : String(error)}`);
46
+ }
47
+ }
48
+ return { finished, errors };
49
+ }
50
+ /**
51
+ * Purge expired trash through the one purge owner. A thread with a queued or
52
+ * running turn is kept for a later pass (the purge route answers 409
53
+ * `thread_busy` for the same reason); dry-run only lists what it would purge.
54
+ * A purge that fails after its journal commit is finished by the NEXT pass's
55
+ * `finishPurgeLeftovers` (this pass only discloses the error).
56
+ */
57
+ async function purgeExpiredTrash(deps, jobs, dryRun) {
58
+ const purged = [];
59
+ const errors = [];
60
+ for (const thread of expiredTrashThreads(deps.threads.listThreads(), Date.now())) {
61
+ const active = findActiveThreadRun(jobs, thread.id);
62
+ if (active) {
63
+ errors.push(`expired trash thread ${thread.id} kept: a turn is still ${active.state}`);
64
+ continue;
65
+ }
66
+ try {
67
+ if (!dryRun)
68
+ await deps.purgeThread(thread.id);
69
+ purged.push(thread.id);
70
+ }
71
+ catch (error) {
72
+ errors.push(`expired trash thread ${thread.id}: ${error instanceof Error ? error.message : String(error)}`);
73
+ }
74
+ }
75
+ return { purged, errors };
76
+ }
15
77
  export function createRetentionRunner(deps) {
16
78
  const noProjectRoot = noProjectRepoRoot();
17
79
  // Serialize passes (review sol #7): the startup pass and any concurrent
@@ -24,12 +86,21 @@ export function createRetentionRunner(deps) {
24
86
  // reference set spans EVERY non-purged thread's full run lineage.
25
87
  const retention = loadConfig(noProjectRoot).global.retention;
26
88
  const jobs = await deps.daemonJobs();
89
+ // Purges left unfinished by an earlier failure, then expired trash, both
90
+ // FIRST, so the runs only expired trash referenced become ordinary
91
+ // unreferenced candidates of this same pass. A dry run purges nothing, so
92
+ // its reference set skips the would-be-purged threads to preview the same.
93
+ const leftovers = await finishPurgeLeftovers(deps, request.dry_run);
94
+ const trash = await purgeExpiredTrash(deps, jobs, request.dry_run);
95
+ const previewPurged = new Set(request.dry_run ? trash.purged : []);
27
96
  const records = jobs
28
97
  .filter((job) => Boolean(job.runId))
29
98
  .map((job) => ({ runId: job.runId, state: job.state, finishedAt: job.finishedAt }));
30
99
  const referencedRunIds = () => {
31
100
  const referenced = new Set();
32
101
  for (const thread of deps.threads.listThreads()) {
102
+ if (previewPurged.has(thread.id))
103
+ continue;
33
104
  for (const id of thread.run_ids)
34
105
  referenced.add(id);
35
106
  if (thread.head_run_id)
@@ -94,7 +165,7 @@ export function createRetentionRunner(deps) {
94
165
  }
95
166
  }
96
167
  }
97
- return runRetentionPass({
168
+ const receipt = await runRetentionPass({
98
169
  runsMaxAgeDays: retention.runs_max_age_days,
99
170
  reviewsMaxAgeDays: retention.reviews_max_age_days,
100
171
  keepLastRunsPerProject: retention.keep_last_runs_per_project,
@@ -114,6 +185,12 @@ export function createRetentionRunner(deps) {
114
185
  dataRoot: claudexorOwnedRoot(),
115
186
  dataRootMode: claudexorOwnedRoot() === userConfigDir() ? "override" : "default",
116
187
  });
188
+ receipt.errors.unshift(...leftovers.errors, ...trash.errors);
189
+ if (request.trash_purge_report) {
190
+ receipt.purged_threads = trash.purged;
191
+ receipt.purge_leftovers = leftovers.finished;
192
+ }
193
+ return receipt;
117
194
  };
118
195
  return (request) => {
119
196
  const chained = (inFlight ?? Promise.resolve()).then(() => runOnce(request), () => runOnce(request));
@@ -133,8 +210,10 @@ export function scheduleStartupRetention(runner, opts) {
133
210
  const timer = setTimeout(() => {
134
211
  if (opts.shuttingDown())
135
212
  return;
136
- void runner({ dry_run: false }).then((receipt) => logLine(opts.logPath, `retention: freed ${receipt.freed_bytes} bytes (${receipt.deleted_runs.length} runs, ` +
137
- `${receipt.deleted_reviews.length} reviews, ${receipt.errors.length} errors)`), (error) => logLine(opts.logPath, `retention FAILED: ${error instanceof Error ? error.message : String(error)}`));
213
+ void runner({ dry_run: false, trash_purge_report: true }).then((receipt) => logLine(opts.logPath, `retention: freed ${receipt.freed_bytes} bytes (${receipt.deleted_runs.length} runs, ` +
214
+ `${receipt.deleted_reviews.length} reviews, ` +
215
+ `${receipt.purged_threads?.length ?? 0} expired trash threads, ` +
216
+ `${receipt.purge_leftovers?.length ?? 0} finished purges, ${receipt.errors.length} errors)`), (error) => logLine(opts.logPath, `retention FAILED: ${error instanceof Error ? error.message : String(error)}`));
138
217
  }, opts.delayMs ?? 60_000);
139
218
  timer.unref?.();
140
219
  }
@@ -1 +1 @@
1
- {"version":3,"file":"retention-service.js","sourceRoot":"","sources":["../src/retention-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAUhD,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC1C,wEAAwE;IACxE,sEAAsE;IACtE,oEAAoE;IACpE,2DAA2D;IAC3D,IAAI,QAAQ,GAAqC,IAAI,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAyB,EAA6B,EAAE;QAC7E,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI;aACjB,MAAM,CAAC,CAAC,GAAG,EAAgE,EAAE,CAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CACnB;aACA,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,gBAAgB,GAAG,GAAgB,EAAE;YACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO;oBAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpD,IAAI,MAAM,CAAC,WAAW;oBAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpD,KAAK,MAAM,EAAE,IAAI;wBACf,IAAI,CAAC,MAAM;wBACX,IAAI,CAAC,aAAa;wBAClB,IAAI,CAAC,mBAAmB;wBACxB,IAAI,CAAC,WAAW;qBACjB,EAAE,CAAC;wBACF,IAAI,EAAE;4BAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;QACF,iEAAiE;QACjE,sEAAsE;QACtE,wEAAwE;QACxE,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,YAAY;QACZ,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG;YACZ,GAAG,IAAI,GAAG,CAAC;gBACT,GAAG,IAAI;qBACJ,QAAQ,EAAE;qBACV,IAAI,EAAE;qBACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3C,aAAa;aACd,CAAC;SACH,CAAC;QACF,MAAM,UAAU,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI;YACJ,OAAO,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;YAC1C,8DAA8D;YAC9D,4BAA4B;YAC5B,UAAU,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC;SAChF,CAAC,CAAC,CAAC;QACJ,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAuB,CAAC;YACzD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,aAAa,CAAC;gBAChD,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC,GAAG,CACpF,MAAM,CAAC,EAAE,CACV,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;gBACnE,CAAC;gBAAC,MAAM,CAAC;oBACP,iEAAiE;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,gBAAgB,CACrB;YACE,cAAc,EAAE,SAAS,CAAC,iBAAiB;YAC3C,iBAAiB,EAAE,SAAS,CAAC,oBAAoB;YACjD,sBAAsB,EAAE,SAAS,CAAC,0BAA0B;SAC7D,EACD,OAAO,EACP;YACE,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;YACtB,gBAAgB;YAChB,+DAA+D;YAC/D,oEAAoE;YACpE,qEAAqE;YACrE,+DAA+D;YAC/D,qEAAqE;YACrE,mEAAmE;YACnE,sEAAsE;YACtE,sEAAsE;YACtE,iDAAiD;YACjD,QAAQ,EAAE,kBAAkB,EAAE;YAC9B,YAAY,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;SAChF,CACF,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAClD,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EACtB,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CACvB,CAAC;QACF,QAAQ,GAAG,OAAO,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1B,IAAI,QAAQ,KAAK,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAuB,EACvB,IAAwE;IAExE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,OAAO;QAChC,KAAK,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CACL,IAAI,CAAC,OAAO,EACZ,oBAAoB,OAAO,CAAC,WAAW,WAAW,OAAO,CAAC,YAAY,CAAC,MAAM,SAAS;YACpF,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,CAChF,EACH,CAAC,KAAc,EAAE,EAAE,CACjB,OAAO,CACL,IAAI,CAAC,OAAO,EACZ,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9E,CACJ,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IAC3B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"retention-service.js","sourceRoot":"","sources":["../src/retention-service.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,6 @@ import { CredentialUnusableLedger, PreProgressRefusalLedger, type QuotaRegistry
9
9
  import { Orchestrator } from "@claudexor/orchestrator";
10
10
  import type { normalizeRunStartRequest } from "@claudexor/control-api";
11
11
  import type { RuntimeConcurrencyCaps } from "@claudexor/schema";
12
- /**
13
- * Daemon-lifetime typed `credential_unusable` evidence (A7): in-memory and
14
- * bounded by design — the poller re-derives vendor rejections within a cycle
15
- * after a restart, and a restart usually follows the re-login that heals a
16
- * dead credential. `claudexord` clears it on credential-generation changes.
17
- */
18
12
  export declare const credentialUnusableLedger: CredentialUnusableLedger;
19
13
  /**
20
14
  * Daemon-lifetime pre-progress refusal observations (#363): in-memory and
@@ -1 +1 @@
1
- {"version":3,"file":"run-orchestrator.d.ts","sourceRoot":"","sources":["../src/run-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,0BAAiC,CAAC;AAEvE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,0BAAiC,CAAC;AAEvE,KAAK,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC/C,yBAAyB,EAAE,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;IACzE,UAAU,EAAE,MAAM,aAAa,CAAC;IAChC;6EACyE;IACzE,qBAAqB,CAAC,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAClE,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD,GAAG,YAAY,CA4Bf"}
1
+ {"version":3,"file":"run-orchestrator.d.ts","sourceRoot":"","sources":["../src/run-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,wBAAwB,EAExB,wBAAwB,EAExB,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAqC,MAAM,yBAAyB,CAAC;AAC1F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAUhE,eAAO,MAAM,wBAAwB,0BAIpC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,0BAIpC,CAAC;AAEF,KAAK,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,CAAC,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;IAC/C,yBAAyB,EAAE,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;IACzE,UAAU,EAAE,MAAM,aAAa,CAAC;IAChC;6EACyE;IACzE,qBAAqB,CAAC,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;IAClE,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD,GAAG,YAAY,CA8Df"}
@@ -5,23 +5,25 @@
5
5
  * feeds the unusable-credential ledger's success-clearing, and the same deps
6
6
  * boundary that injects quota snapshots injects the ledger's observations.
7
7
  */
8
- import { CredentialUnusableLedger, PreProgressRefusalLedger, } from "@claudexor/daemon";
9
- import { Orchestrator } from "@claudexor/orchestrator";
8
+ import { CredentialUnusableLedger, CredentialGeneration, PreProgressRefusalLedger, logPath, } from "@claudexor/daemon";
9
+ import { Orchestrator, createCredentialExecutionObserver } from "@claudexor/orchestrator";
10
10
  import { buildRegistry } from "./registry.js";
11
+ import { logLine } from "./daemon-lifecycle.js";
11
12
  /**
12
13
  * Daemon-lifetime typed `credential_unusable` evidence (A7): in-memory and
13
14
  * bounded by design — the poller re-derives vendor rejections within a cycle
14
15
  * after a restart, and a restart usually follows the re-login that heals a
15
16
  * dead credential. `claudexord` clears it on credential-generation changes.
16
17
  */
17
- export const credentialUnusableLedger = new CredentialUnusableLedger();
18
+ const credentialGeneration = new CredentialGeneration();
19
+ export const credentialUnusableLedger = new CredentialUnusableLedger(undefined, undefined, credentialGeneration);
18
20
  /**
19
21
  * Daemon-lifetime pre-progress refusal observations (#363): in-memory and
20
22
  * bounded like the unusable ledger, cleared at the same credential-generation
21
23
  * call sites. Agent Runs produce them and every unpinned pool choice (runs,
22
24
  * reviewers, the Accounts `next_up` projection) reads them.
23
25
  */
24
- export const preProgressRefusalLedger = new PreProgressRefusalLedger();
26
+ export const preProgressRefusalLedger = new PreProgressRefusalLedger(undefined, undefined, credentialGeneration);
25
27
  export function buildRunOrchestrator(args) {
26
28
  const { p, quotaStore } = args;
27
29
  return new Orchestrator({
@@ -34,14 +36,43 @@ export function buildRunOrchestrator(args) {
34
36
  // poller reports a vendor rejecting a profile's credential, and run
35
37
  // admission is the surface that has to act on it.
36
38
  quotaAbsences: () => quotaStore().read().absences,
37
- quotaEventSink: (harnessId, event) => {
38
- quotaStore().ingest(harnessId, event);
39
- // The same stream is the ledger's success telemetry: served tokens on a
40
- // subject clear its stale dead-credential verdicts (clearing contract).
41
- credentialUnusableLedger.observeEvent(harnessId, event);
39
+ credentialObserverFactory: (subject) => {
40
+ const binding = credentialUnusableLedger.bind(subject);
41
+ const observer = createCredentialExecutionObserver(credentialUnusableLedger, binding);
42
+ const maintain = (operation) => {
43
+ try {
44
+ operation();
45
+ }
46
+ catch (error) {
47
+ logLine(logPath(), `account observation failed (${subject.harnessId}/${subject.profileId ?? "default"}): ${String(error)}`);
48
+ }
49
+ };
50
+ return {
51
+ observe: (event) => maintain(() => {
52
+ observer.observe(event);
53
+ // Numeric quota and cooldown observations remain useful while
54
+ // sessions run across managed login changes. Authentication proof
55
+ // has its separate generation/order authority in the observer.
56
+ const sameProfile = event.credential_profile_id === undefined ||
57
+ event.credential_profile_id === subject.profileId;
58
+ const sameRoute = subject.route === null ||
59
+ event.credential_route === undefined ||
60
+ event.credential_route === subject.route;
61
+ if (sameProfile && sameRoute) {
62
+ quotaStore().ingest(subject.harnessId, {
63
+ ...event,
64
+ ...(subject.profileId !== null ? { credential_profile_id: subject.profileId } : {}),
65
+ ...(event.credential_route === undefined && subject.route !== null
66
+ ? { credential_route: subject.route }
67
+ : {}),
68
+ });
69
+ }
70
+ }),
71
+ finish: () => maintain(() => observer.finish()),
72
+ };
42
73
  },
43
74
  credentialUnusable: () => credentialUnusableLedger.live(),
44
- recordCredentialUnusable: (obs) => credentialUnusableLedger.record(obs),
75
+ credentialEvidence: credentialUnusableLedger,
45
76
  preProgressRefusals: preProgressRefusalLedger,
46
77
  reviewerPanel: p.reviewerPanel,
47
78
  reviewerModels: p.reviewerModels && typeof p.reviewerModels === "object" ? p.reviewerModels : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"run-orchestrator.js","sourceRoot":"","sources":["../src/run-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAIvE,MAAM,UAAU,oBAAoB,CAAC,IAQpC;IACC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC/B,OAAO,IAAI,YAAY,CAAC;QACtB,QAAQ,EAAE,aAAa,EAAE;QACzB,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;QACzD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,SAAS;QACnD,qEAAqE;QACrE,oEAAoE;QACpE,kDAAkD;QAClD,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ;QACjD,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;YACnC,UAAU,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACtC,wEAAwE;YACxE,wEAAwE;YACxE,wBAAwB,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE;QACzD,wBAAwB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG,CAAC;QACvE,mBAAmB,EAAE,wBAAwB;QAC7C,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,cAAc,EACZ,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;QACzF,eAAe,EACb,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QAC5F,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;KACpD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"run-orchestrator.js","sourceRoot":"","sources":["../src/run-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -697,20 +697,19 @@ export function createSetupJobManager(opts = {}) {
697
697
  function startObservableLogin(job, spec, profileConfigDir) {
698
698
  const deviceCode = spec.loginMode === "device_code";
699
699
  const clientPty = job.transport === "client_pty";
700
- // Daemon-hosted modes never touch Terminal and run on any posix platform;
701
- // only the legacy Terminal handoff (codex browser_redirect) is macOS-only.
700
+ // Only legacy Terminal handoff is macOS-only; daemon-hosted flows are portable.
702
701
  const daemonHosted = deviceCode || isUrlDisclosureLoginMode(spec.loginMode);
703
702
  if (!daemonHosted && job.transport !== "client_pty" && platform !== "darwin") {
704
703
  return finish(job.jobId, "failed", "launch_failed", `Terminal-handoff login is macOS-only. Run it yourself, then recheck Harness Doctor: ${spec.displayCommand}`, {}, spec.displayCommand);
705
704
  }
706
705
  try {
706
+ if (spec.launchAdvisory)
707
+ spec = { ...spec, displayCommand: `${spec.displayCommand} (${spec.launchAdvisory})` };
707
708
  const paths = store.paths(job.jobId);
708
709
  const executionId = randomUUID();
709
710
  const executable = captureExecutableEvidence(spec.binary);
710
711
  const authorizedCommandDigest = commandDigest(executable, spec.args);
711
- // A vendor window shorter than ours governs: counting past the moment it
712
- // gave up would promise a login that is already over — and it cannot be
713
- // extended either, which the job says out loud so no surface offers to.
712
+ // A shorter vendor-owned window governs and cannot be extended by the UI.
714
713
  const vendorCapped = (spec.loginWindowMs ?? Infinity) < loginTimeoutMs;
715
714
  const { loginDeadlineAt, permitDeadlineAt, permitWaitMs } = setupLoginDeadlines(now(), Math.min(loginTimeoutMs, spec.loginWindowMs ?? loginTimeoutMs), launcherTimeoutMs, job.transport);
716
715
  // The store this login must land in, resolved by the DAEMON (whose
@@ -734,6 +733,7 @@ export function createSetupJobManager(opts = {}) {
734
733
  jobDir: paths.dir,
735
734
  binary: executable.realpath,
736
735
  args: [...spec.args],
736
+ ...(spec.interpreter ? { interpreter: spec.interpreter } : {}),
737
737
  cwd: paths.dir,
738
738
  ...(targetConfigDir ? { profileConfigDir: targetConfigDir } : {}),
739
739
  // These fields describe DAEMON-owned disclosure/control only. A
@@ -1012,7 +1012,7 @@ export function createSetupJobManager(opts = {}) {
1012
1012
  log(jobId, `created ${harness} ${action}${profileBinding ? ` for profile "${profileBinding.profileId}"` : ""}`);
1013
1013
  const spec = NativeLogin.nativeLoginSpec(harness, undefined, request.loginFlow);
1014
1014
  if (!spec)
1015
- return finish(jobId, "not_supported", "not_supported", `${harness} native login is unavailable; install the vendor CLI first.`);
1015
+ return finish(jobId, "not_supported", "not_supported", `${harness} native login is unavailable; ${NativeLogin.nativeLoginUnavailableDetail(harness) ?? "install the vendor CLI first"}.`);
1016
1016
  return startObservableLogin(base, spec, profileBinding?.configDir);
1017
1017
  },
1018
1018
  list(filter) {