@claudexor/control-api 3.1.1 → 3.2.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 (120) hide show
  1. package/dist/authorization.d.ts +3 -0
  2. package/dist/authorization.d.ts.map +1 -0
  3. package/dist/authorization.js +15 -0
  4. package/dist/authorization.js.map +1 -0
  5. package/dist/binary-response.d.ts +5 -0
  6. package/dist/binary-response.d.ts.map +1 -0
  7. package/dist/binary-response.js +31 -0
  8. package/dist/binary-response.js.map +1 -0
  9. package/dist/budget-valuation.d.ts +23 -0
  10. package/dist/budget-valuation.d.ts.map +1 -0
  11. package/dist/budget-valuation.js +90 -0
  12. package/dist/budget-valuation.js.map +1 -0
  13. package/dist/catalog-query.d.ts +310 -0
  14. package/dist/catalog-query.d.ts.map +1 -0
  15. package/dist/catalog-query.js +36 -0
  16. package/dist/catalog-query.js.map +1 -0
  17. package/dist/daemon-server.d.ts +33 -79
  18. package/dist/daemon-server.d.ts.map +1 -1
  19. package/dist/daemon-server.js +175 -281
  20. package/dist/daemon-server.js.map +1 -1
  21. package/dist/decision-accept-risk.d.ts +36 -0
  22. package/dist/decision-accept-risk.d.ts.map +1 -0
  23. package/dist/decision-accept-risk.js +79 -0
  24. package/dist/decision-accept-risk.js.map +1 -0
  25. package/dist/decision-rerun.d.ts +2 -1
  26. package/dist/decision-rerun.d.ts.map +1 -1
  27. package/dist/decision-rerun.js +79 -48
  28. package/dist/decision-rerun.js.map +1 -1
  29. package/dist/delegation-control.d.ts +23 -0
  30. package/dist/delegation-control.d.ts.map +1 -0
  31. package/dist/delegation-control.js +81 -0
  32. package/dist/delegation-control.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/maintenance-routes.d.ts +2 -2
  38. package/dist/maintenance-routes.d.ts.map +1 -1
  39. package/dist/maintenance-routes.js +11 -10
  40. package/dist/maintenance-routes.js.map +1 -1
  41. package/dist/operation-catalog.d.ts +9 -9
  42. package/dist/operation-catalog.d.ts.map +1 -1
  43. package/dist/operation-catalog.js +22 -79
  44. package/dist/operation-catalog.js.map +1 -1
  45. package/dist/operation-draft.d.ts +3 -0
  46. package/dist/operation-draft.d.ts.map +1 -0
  47. package/dist/operation-draft.js +2 -0
  48. package/dist/operation-draft.js.map +1 -0
  49. package/dist/operation-parameters.d.ts.map +1 -1
  50. package/dist/operation-summaries.d.ts +3 -0
  51. package/dist/operation-summaries.d.ts.map +1 -0
  52. package/dist/operation-summaries.js +75 -0
  53. package/dist/operation-summaries.js.map +1 -0
  54. package/dist/primary-output.d.ts +3 -3
  55. package/dist/primary-output.d.ts.map +1 -1
  56. package/dist/primary-output.js +70 -19
  57. package/dist/primary-output.js.map +1 -1
  58. package/dist/problem-response.d.ts.map +1 -1
  59. package/dist/problem-response.js +14 -9
  60. package/dist/problem-response.js.map +1 -1
  61. package/dist/project-routes.d.ts +21 -13
  62. package/dist/project-routes.d.ts.map +1 -1
  63. package/dist/project-routes.js +80 -34
  64. package/dist/project-routes.js.map +1 -1
  65. package/dist/remote-operation-descriptors.d.ts +36 -0
  66. package/dist/remote-operation-descriptors.d.ts.map +1 -0
  67. package/dist/remote-operation-descriptors.js +35 -0
  68. package/dist/remote-operation-descriptors.js.map +1 -0
  69. package/dist/resource-routes.d.ts +4 -3
  70. package/dist/resource-routes.d.ts.map +1 -1
  71. package/dist/resource-routes.js +63 -39
  72. package/dist/resource-routes.js.map +1 -1
  73. package/dist/route-stages.d.ts +15 -0
  74. package/dist/route-stages.d.ts.map +1 -0
  75. package/dist/route-stages.js +24 -0
  76. package/dist/route-stages.js.map +1 -0
  77. package/dist/run-facts-projection.d.ts +35 -0
  78. package/dist/run-facts-projection.d.ts.map +1 -0
  79. package/dist/run-facts-projection.js +133 -0
  80. package/dist/run-facts-projection.js.map +1 -0
  81. package/dist/run-list-fingerprint.d.ts +7 -0
  82. package/dist/run-list-fingerprint.d.ts.map +1 -0
  83. package/dist/run-list-fingerprint.js +68 -0
  84. package/dist/run-list-fingerprint.js.map +1 -0
  85. package/dist/run-record.d.ts +53 -0
  86. package/dist/run-record.d.ts.map +1 -0
  87. package/dist/run-record.js +61 -0
  88. package/dist/run-record.js.map +1 -0
  89. package/dist/run-retry-routes.d.ts +3 -2
  90. package/dist/run-retry-routes.d.ts.map +1 -1
  91. package/dist/run-retry-routes.js +129 -48
  92. package/dist/run-retry-routes.js.map +1 -1
  93. package/dist/run-start.d.ts +13 -1
  94. package/dist/run-start.d.ts.map +1 -1
  95. package/dist/run-start.js +90 -18
  96. package/dist/run-start.js.map +1 -1
  97. package/dist/run-timeline.d.ts.map +1 -1
  98. package/dist/run-timeline.js +17 -9
  99. package/dist/run-timeline.js.map +1 -1
  100. package/dist/thread-lifecycle-routes.d.ts +1 -1
  101. package/dist/thread-lifecycle-routes.d.ts.map +1 -1
  102. package/dist/thread-lifecycle-routes.js +3 -4
  103. package/dist/thread-lifecycle-routes.js.map +1 -1
  104. package/dist/thread-mutation.d.ts +6 -0
  105. package/dist/thread-mutation.d.ts.map +1 -1
  106. package/dist/thread-mutation.js +23 -0
  107. package/dist/thread-mutation.js.map +1 -1
  108. package/dist/thread-projection.d.ts +6 -1
  109. package/dist/thread-projection.d.ts.map +1 -1
  110. package/dist/thread-projection.js +28 -1
  111. package/dist/thread-projection.js.map +1 -1
  112. package/dist/thread-recovery.d.ts +54 -0
  113. package/dist/thread-recovery.d.ts.map +1 -0
  114. package/dist/thread-recovery.js +71 -0
  115. package/dist/thread-recovery.js.map +1 -0
  116. package/dist/thread-turn-routes.d.ts +22 -8
  117. package/dist/thread-turn-routes.d.ts.map +1 -1
  118. package/dist/thread-turn-routes.js +73 -49
  119. package/dist/thread-turn-routes.js.map +1 -1
  120. package/package.json +6 -6
@@ -0,0 +1,3 @@
1
+ /** Parse the HTTP Bearer credential without overlapping regular-expression quantifiers. */
2
+ export declare function bearerCredential(header: string | undefined): string | undefined;
3
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAS/E"}
@@ -0,0 +1,15 @@
1
+ const BEARER_SCHEME = "bearer";
2
+ /** Parse the HTTP Bearer credential without overlapping regular-expression quantifiers. */
3
+ export function bearerCredential(header) {
4
+ if (!header || header.slice(0, BEARER_SCHEME.length).toLowerCase() !== BEARER_SCHEME) {
5
+ return undefined;
6
+ }
7
+ let cursor = BEARER_SCHEME.length;
8
+ if (header[cursor] !== " " && header[cursor] !== "\t")
9
+ return undefined;
10
+ while (header[cursor] === " " || header[cursor] === "\t")
11
+ cursor += 1;
12
+ const credential = header.slice(cursor).trim();
13
+ return credential || undefined;
14
+ }
15
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IACzD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,aAAa,EAAE,CAAC;QACrF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACxE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ServerResponse } from "node:http";
2
+ /** RFC 6266/RFC 5987 filename projection with an ASCII compatibility fallback. */
3
+ export declare function inlineContentDisposition(fileName: string): string;
4
+ export declare function writeBinaryResponse(response: ServerResponse, status: number, body: Buffer, contentType: string, fileName: string): void;
5
+ //# sourceMappingURL=binary-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-response.d.ts","sourceRoot":"","sources":["../src/binary-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBjE;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,IAAI,CAiBN"}
@@ -0,0 +1,31 @@
1
+ /** RFC 6266/RFC 5987 filename projection with an ASCII compatibility fallback. */
2
+ export function inlineContentDisposition(fileName) {
3
+ const validUtf8 = Buffer.from(fileName, "utf8")
4
+ .toString("utf8")
5
+ .normalize("NFC")
6
+ .replace(/[\u0000-\u001f\u007f]/g, "_");
7
+ const bounded = [...validUtf8].slice(0, 180).join("") || "remote-file";
8
+ const fallback = [...bounded]
9
+ .map((character) => (/^[A-Za-z0-9._ -]$/.test(character) ? character : "_"))
10
+ .join("")
11
+ .slice(0, 180) || "remote-file";
12
+ const encoded = encodeURIComponent(bounded).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
13
+ return `inline; filename="${fallback}"; filename*=UTF-8''${encoded}`;
14
+ }
15
+ export function writeBinaryResponse(response, status, body, contentType, fileName) {
16
+ if (!Buffer.isBuffer(body) ||
17
+ typeof contentType !== "string" ||
18
+ contentType.length === 0 ||
19
+ typeof fileName !== "string" ||
20
+ fileName.length === 0) {
21
+ throw new TypeError("binary response is invalid");
22
+ }
23
+ response.writeHead(status, {
24
+ "content-type": contentType,
25
+ "content-length": body.length,
26
+ "content-disposition": inlineContentDisposition(fileName),
27
+ "cache-control": "private, no-store",
28
+ });
29
+ response.end(body);
30
+ }
31
+ //# sourceMappingURL=binary-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-response.js","sourceRoot":"","sources":["../src/binary-response.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5C,QAAQ,CAAC,MAAM,CAAC;SAChB,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC;IACvE,MAAM,QAAQ,GACZ,CAAC,GAAG,OAAO,CAAC;SACT,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3E,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,aAAa,CAAC;IACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,CACjD,UAAU,EACV,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CACxE,CAAC;IACF,OAAO,qBAAqB,QAAQ,uBAAuB,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAwB,EACxB,MAAc,EACd,IAAY,EACZ,WAAmB,EACnB,QAAgB;IAEhB,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,OAAO,WAAW,KAAK,QAAQ;QAC/B,WAAW,CAAC,MAAM,KAAK,CAAC;QACxB,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,CAAC,MAAM,KAAK,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IACD,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,WAAW;QAC3B,gBAAgB,EAAE,IAAI,CAAC,MAAM;QAC7B,qBAAqB,EAAE,wBAAwB,CAAC,QAAQ,CAAC;QACzD,eAAe,EAAE,mBAAmB;KACrC,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pure subscription-VALUATION fold over a run's events (QA-023c/QA-017b),
3
+ * independent of the cash truth. The owner-locked ledger settles native-
4
+ * subscription work to cash $0 while accumulating its token valuation on
5
+ * `budget.cash.valuation_usd` (last-wins, cumulative). An UNKNOWN valuation (no
6
+ * usage ever reported — e.g. a Cursor draft) stays NULL and is never coerced to
7
+ * a fake $0. The legacy fallback for runs predating budget.cash is the summed
8
+ * `budget.observation` spend.
9
+ */
10
+ export declare function budgetValuationFromEvents(events: Record<string, unknown>[]): {
11
+ valuationUsd: number | null;
12
+ valuationKnowledge: "exact" | "estimated" | "unknown";
13
+ };
14
+ export declare function normalizeLegacyBudgetComponents(budget: {
15
+ estimated?: boolean;
16
+ spend_usd?: number | null;
17
+ valuation_usd?: number | null;
18
+ valuation_knowledge?: "exact" | "estimated" | "unknown";
19
+ } | null, events: Record<string, unknown>[], folded: ReturnType<typeof budgetValuationFromEvents>): typeof folded & {
20
+ cashEstimated: boolean;
21
+ };
22
+ export declare function cashEstimatedFromLedgerEvent(payload: Record<string, unknown>): boolean;
23
+ //# sourceMappingURL=budget-valuation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-valuation.d.ts","sourceRoot":"","sources":["../src/budget-valuation.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;CACvD,CAuCA;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;CACzD,GAAG,IAAI,EACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACjC,MAAM,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,GACnD,OAAO,MAAM,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CA4B5C;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAStF"}
@@ -0,0 +1,90 @@
1
+ import { eventPayload } from "./run-timeline.js";
2
+ /**
3
+ * Pure subscription-VALUATION fold over a run's events (QA-023c/QA-017b),
4
+ * independent of the cash truth. The owner-locked ledger settles native-
5
+ * subscription work to cash $0 while accumulating its token valuation on
6
+ * `budget.cash.valuation_usd` (last-wins, cumulative). An UNKNOWN valuation (no
7
+ * usage ever reported — e.g. a Cursor draft) stays NULL and is never coerced to
8
+ * a fake $0. The legacy fallback for runs predating budget.cash is the summed
9
+ * `budget.observation` spend.
10
+ */
11
+ export function budgetValuationFromEvents(events) {
12
+ let valuationUsd = null;
13
+ let valuationKnowledge = "unknown";
14
+ let sawLedgerValuation = false;
15
+ let observation = 0;
16
+ let sawObservation = false;
17
+ for (const ev of events) {
18
+ const payload = eventPayload(ev);
19
+ if (ev["type"] === "budget.cash") {
20
+ const val = payload["valuation_usd"];
21
+ if (typeof val === "number" && Number.isFinite(val)) {
22
+ sawLedgerValuation = true;
23
+ const knowledge = payload["valuation_knowledge"];
24
+ if (knowledge === "exact" || knowledge === "estimated" || knowledge === "unknown") {
25
+ valuationKnowledge = knowledge;
26
+ valuationUsd = knowledge === "unknown" ? null : val;
27
+ }
28
+ else {
29
+ // Legacy budget.cash had no valuation-specific knowledge. A positive
30
+ // token valuation is safely estimated; zero alone cannot prove that
31
+ // valuation evidence existed.
32
+ valuationKnowledge = val > 0 ? "estimated" : "unknown";
33
+ valuationUsd = val > 0 ? val : null;
34
+ }
35
+ }
36
+ continue;
37
+ }
38
+ if (ev["type"] === "budget.observation" && payload["kind"] === "spend") {
39
+ const usd = payload["usd"];
40
+ if (typeof usd === "number" && Number.isFinite(usd)) {
41
+ observation += usd;
42
+ sawObservation = true;
43
+ }
44
+ }
45
+ }
46
+ if (!sawLedgerValuation && sawObservation) {
47
+ valuationUsd = observation;
48
+ valuationKnowledge = "estimated";
49
+ }
50
+ return { valuationUsd, valuationKnowledge };
51
+ }
52
+ export function normalizeLegacyBudgetComponents(budget, events, folded) {
53
+ let cashEstimated = budget?.estimated ?? false;
54
+ let { valuationUsd, valuationKnowledge } = folded;
55
+ const knowledge = budget?.valuation_knowledge;
56
+ const valuation = budget?.valuation_usd;
57
+ const componentAwareEvent = events.some((event) => {
58
+ if (event["type"] !== "budget.cash")
59
+ return false;
60
+ const value = eventPayload(event)["valuation_knowledge"];
61
+ return value === "exact" || value === "estimated" || value === "unknown";
62
+ });
63
+ if (knowledge && typeof valuation === "number" && Number.isFinite(valuation)) {
64
+ valuationKnowledge = knowledge;
65
+ valuationUsd = knowledge === "unknown" ? null : valuation;
66
+ }
67
+ else if (valuationUsd === null && typeof valuation === "number" && valuation > 0) {
68
+ valuationUsd = valuation;
69
+ valuationKnowledge = "estimated";
70
+ }
71
+ if (knowledge === undefined &&
72
+ !componentAwareEvent &&
73
+ cashEstimated &&
74
+ budget?.spend_usd === 0 &&
75
+ typeof valuation === "number" &&
76
+ valuation > 0) {
77
+ cashEstimated = false;
78
+ }
79
+ return { valuationUsd, valuationKnowledge, cashEstimated };
80
+ }
81
+ export function cashEstimatedFromLedgerEvent(payload) {
82
+ const estimated = payload["estimated"] === true;
83
+ const legacyExactZero = payload["valuation_knowledge"] === undefined &&
84
+ estimated &&
85
+ payload["cash_spend_usd"] === 0 &&
86
+ typeof payload["valuation_usd"] === "number" &&
87
+ payload["valuation_usd"] > 0;
88
+ return estimated && !legacyExactZero;
89
+ }
90
+ //# sourceMappingURL=budget-valuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-valuation.js","sourceRoot":"","sources":["../src/budget-valuation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ export interface HarnessListQuery {
2
+ fresh?: boolean;
3
+ includeFakes?: boolean;
4
+ harnessIds?: string[];
5
+ }
6
+ export declare function parseHarnessListQuery(url: URL): HarnessListQuery;
7
+ export declare function parseCredentialProfilesSnapshotQuery(url: URL): {
8
+ input: {
9
+ snapshot: boolean;
10
+ };
11
+ schema: import("zod/v3").ZodObject<{
12
+ profiles: import("zod/v3").ZodArray<import("zod/v3").ZodObject<{
13
+ profile: import("zod/v3").ZodEffects<import("zod/v3").ZodObject<{
14
+ profile_id: import("zod/v3").ZodString;
15
+ harness_id: import("zod/v3").ZodString;
16
+ display_name: import("zod/v3").ZodString;
17
+ credential_kind: import("zod/v3").ZodEnum<["config_dir_login", "oauth_token", "api_key"]>;
18
+ isolation_locator: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodString>>;
19
+ secret_ref: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodString>>;
20
+ enabled: import("zod/v3").ZodDefault<import("zod/v3").ZodBoolean>;
21
+ created_at: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodString>>;
22
+ }, "strict", import("zod/v3").ZodTypeAny, {
23
+ profile_id: string;
24
+ harness_id: string;
25
+ display_name: string;
26
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
27
+ isolation_locator: string | null;
28
+ secret_ref: string | null;
29
+ enabled: boolean;
30
+ created_at: string | null;
31
+ }, {
32
+ profile_id: string;
33
+ harness_id: string;
34
+ display_name: string;
35
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
36
+ isolation_locator?: string | null | undefined;
37
+ secret_ref?: string | null | undefined;
38
+ enabled?: boolean | undefined;
39
+ created_at?: string | null | undefined;
40
+ }>, {
41
+ profile_id: string;
42
+ harness_id: string;
43
+ display_name: string;
44
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
45
+ isolation_locator: string | null;
46
+ secret_ref: string | null;
47
+ enabled: boolean;
48
+ created_at: string | null;
49
+ }, {
50
+ profile_id: string;
51
+ harness_id: string;
52
+ display_name: string;
53
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
54
+ isolation_locator?: string | null | undefined;
55
+ secret_ref?: string | null | undefined;
56
+ enabled?: boolean | undefined;
57
+ created_at?: string | null | undefined;
58
+ }>;
59
+ status: import("zod/v3").ZodObject<{
60
+ profile_id: import("zod/v3").ZodString;
61
+ harness_id: import("zod/v3").ZodString;
62
+ availability: import("zod/v3").ZodEnum<["available", "unavailable", "unknown"]>;
63
+ verification: import("zod/v3").ZodEnum<["passed", "failed", "not_run"]>;
64
+ detail: import("zod/v3").ZodOptional<import("zod/v3").ZodString>;
65
+ last_verified_at: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodString>>;
66
+ }, "strict", import("zod/v3").ZodTypeAny, {
67
+ profile_id: string;
68
+ harness_id: string;
69
+ availability: "available" | "unavailable" | "unknown";
70
+ verification: "failed" | "not_run" | "passed";
71
+ detail?: string | undefined;
72
+ last_verified_at: string | null;
73
+ }, {
74
+ profile_id: string;
75
+ harness_id: string;
76
+ availability: "available" | "unavailable" | "unknown";
77
+ verification: "failed" | "not_run" | "passed";
78
+ detail?: string | undefined;
79
+ last_verified_at?: string | null | undefined;
80
+ }>;
81
+ identity: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodObject<{
82
+ email: import("zod/v3").ZodOptional<import("zod/v3").ZodString>;
83
+ plan: import("zod/v3").ZodOptional<import("zod/v3").ZodString>;
84
+ }, "strict", import("zod/v3").ZodTypeAny, {
85
+ email?: string | undefined;
86
+ plan?: string | undefined;
87
+ }, {
88
+ email?: string | undefined;
89
+ plan?: string | undefined;
90
+ }>>>;
91
+ }, "strict", import("zod/v3").ZodTypeAny, {
92
+ profile: {
93
+ profile_id: string;
94
+ harness_id: string;
95
+ display_name: string;
96
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
97
+ isolation_locator: string | null;
98
+ secret_ref: string | null;
99
+ enabled: boolean;
100
+ created_at: string | null;
101
+ };
102
+ status: {
103
+ profile_id: string;
104
+ harness_id: string;
105
+ availability: "available" | "unavailable" | "unknown";
106
+ verification: "failed" | "not_run" | "passed";
107
+ detail?: string | undefined;
108
+ last_verified_at: string | null;
109
+ };
110
+ identity: {
111
+ email?: string | undefined;
112
+ plan?: string | undefined;
113
+ } | null;
114
+ }, {
115
+ profile: {
116
+ profile_id: string;
117
+ harness_id: string;
118
+ display_name: string;
119
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
120
+ isolation_locator?: string | null | undefined;
121
+ secret_ref?: string | null | undefined;
122
+ enabled?: boolean | undefined;
123
+ created_at?: string | null | undefined;
124
+ };
125
+ status: {
126
+ profile_id: string;
127
+ harness_id: string;
128
+ availability: "available" | "unavailable" | "unknown";
129
+ verification: "failed" | "not_run" | "passed";
130
+ detail?: string | undefined;
131
+ last_verified_at?: string | null | undefined;
132
+ };
133
+ identity?: {
134
+ email?: string | undefined;
135
+ plan?: string | undefined;
136
+ } | null | undefined;
137
+ }>, "many">;
138
+ harnessAccounts: import("zod/v3").ZodDefault<import("zod/v3").ZodArray<import("zod/v3").ZodObject<{
139
+ harness_id: import("zod/v3").ZodString;
140
+ native_credentials_enabled: import("zod/v3").ZodBoolean;
141
+ native_login_detected: import("zod/v3").ZodBoolean;
142
+ identity: import("zod/v3").ZodDefault<import("zod/v3").ZodNullable<import("zod/v3").ZodObject<{
143
+ email: import("zod/v3").ZodOptional<import("zod/v3").ZodString>;
144
+ plan: import("zod/v3").ZodOptional<import("zod/v3").ZodString>;
145
+ }, "strict", import("zod/v3").ZodTypeAny, {
146
+ email?: string | undefined;
147
+ plan?: string | undefined;
148
+ }, {
149
+ email?: string | undefined;
150
+ plan?: string | undefined;
151
+ }>>>;
152
+ next_up: import("zod/v3").ZodDiscriminatedUnion<"kind", [import("zod/v3").ZodObject<{
153
+ kind: import("zod/v3").ZodLiteral<"profile">;
154
+ profileId: import("zod/v3").ZodString;
155
+ }, "strict", import("zod/v3").ZodTypeAny, {
156
+ kind: "profile";
157
+ profileId: string;
158
+ }, {
159
+ kind: "profile";
160
+ profileId: string;
161
+ }>, import("zod/v3").ZodObject<{
162
+ kind: import("zod/v3").ZodLiteral<"native">;
163
+ route: import("zod/v3").ZodOptional<import("zod/v3").ZodEnum<["local_session", "api_key"]>>;
164
+ }, "strict", import("zod/v3").ZodTypeAny, {
165
+ kind: "native";
166
+ route?: "api_key" | "local_session" | undefined;
167
+ }, {
168
+ kind: "native";
169
+ route?: "api_key" | "local_session" | undefined;
170
+ }>, import("zod/v3").ZodObject<{
171
+ kind: import("zod/v3").ZodLiteral<"none">;
172
+ reason: import("zod/v3").ZodString;
173
+ }, "strict", import("zod/v3").ZodTypeAny, {
174
+ kind: "none";
175
+ reason: string;
176
+ }, {
177
+ kind: "none";
178
+ reason: string;
179
+ }>]>;
180
+ }, "strict", import("zod/v3").ZodTypeAny, {
181
+ harness_id: string;
182
+ native_credentials_enabled: boolean;
183
+ native_login_detected: boolean;
184
+ identity: {
185
+ email?: string | undefined;
186
+ plan?: string | undefined;
187
+ } | null;
188
+ next_up: {
189
+ kind: "profile";
190
+ profileId: string;
191
+ } | {
192
+ kind: "native";
193
+ route?: "api_key" | "local_session" | undefined;
194
+ } | {
195
+ kind: "none";
196
+ reason: string;
197
+ };
198
+ }, {
199
+ harness_id: string;
200
+ native_credentials_enabled: boolean;
201
+ native_login_detected: boolean;
202
+ identity?: {
203
+ email?: string | undefined;
204
+ plan?: string | undefined;
205
+ } | null | undefined;
206
+ next_up: {
207
+ kind: "profile";
208
+ profileId: string;
209
+ } | {
210
+ kind: "native";
211
+ route?: "api_key" | "local_session" | undefined;
212
+ } | {
213
+ kind: "none";
214
+ reason: string;
215
+ };
216
+ }>, "many">>;
217
+ }, "strict", import("zod/v3").ZodTypeAny, {
218
+ profiles: {
219
+ profile: {
220
+ profile_id: string;
221
+ harness_id: string;
222
+ display_name: string;
223
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
224
+ isolation_locator: string | null;
225
+ secret_ref: string | null;
226
+ enabled: boolean;
227
+ created_at: string | null;
228
+ };
229
+ status: {
230
+ profile_id: string;
231
+ harness_id: string;
232
+ availability: "available" | "unavailable" | "unknown";
233
+ verification: "failed" | "not_run" | "passed";
234
+ detail?: string | undefined;
235
+ last_verified_at: string | null;
236
+ };
237
+ identity: {
238
+ email?: string | undefined;
239
+ plan?: string | undefined;
240
+ } | null;
241
+ }[];
242
+ harnessAccounts: {
243
+ harness_id: string;
244
+ native_credentials_enabled: boolean;
245
+ native_login_detected: boolean;
246
+ identity: {
247
+ email?: string | undefined;
248
+ plan?: string | undefined;
249
+ } | null;
250
+ next_up: {
251
+ kind: "profile";
252
+ profileId: string;
253
+ } | {
254
+ kind: "native";
255
+ route?: "api_key" | "local_session" | undefined;
256
+ } | {
257
+ kind: "none";
258
+ reason: string;
259
+ };
260
+ }[];
261
+ }, {
262
+ profiles: {
263
+ profile: {
264
+ profile_id: string;
265
+ harness_id: string;
266
+ display_name: string;
267
+ credential_kind: "api_key" | "config_dir_login" | "oauth_token";
268
+ isolation_locator?: string | null | undefined;
269
+ secret_ref?: string | null | undefined;
270
+ enabled?: boolean | undefined;
271
+ created_at?: string | null | undefined;
272
+ };
273
+ status: {
274
+ profile_id: string;
275
+ harness_id: string;
276
+ availability: "available" | "unavailable" | "unknown";
277
+ verification: "failed" | "not_run" | "passed";
278
+ detail?: string | undefined;
279
+ last_verified_at?: string | null | undefined;
280
+ };
281
+ identity?: {
282
+ email?: string | undefined;
283
+ plan?: string | undefined;
284
+ } | null | undefined;
285
+ }[];
286
+ harnessAccounts?: {
287
+ harness_id: string;
288
+ native_credentials_enabled: boolean;
289
+ native_login_detected: boolean;
290
+ identity?: {
291
+ email?: string | undefined;
292
+ plan?: string | undefined;
293
+ } | null | undefined;
294
+ next_up: {
295
+ kind: "profile";
296
+ profileId: string;
297
+ } | {
298
+ kind: "native";
299
+ route?: "api_key" | "local_session" | undefined;
300
+ } | {
301
+ kind: "none";
302
+ reason: string;
303
+ };
304
+ }[] | undefined;
305
+ }>;
306
+ };
307
+ export declare function parseRunApplicabilityQuery(url: URL): {
308
+ repoRoot: string;
309
+ };
310
+ //# sourceMappingURL=catalog-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-query.d.ts","sourceRoot":"","sources":["../src/catalog-query.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,gBAAgB,CAchE;AAED,wBAAgB,oCAAoC,CAAC,GAAG,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS5D;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOzE"}
@@ -0,0 +1,36 @@
1
+ import { assertOnlyQueryParams, optionalBooleanQuery, singleQuery } from "./query.js";
2
+ import { ControlCredentialProfilesResponse, ControlCredentialProfilesSnapshotResponse, } from "@claudexor/schema";
3
+ export function parseHarnessListQuery(url) {
4
+ assertOnlyQueryParams(url, ["fresh", "all", "harness"]);
5
+ const fresh = optionalBooleanQuery(url, "fresh");
6
+ const includeFakes = optionalBooleanQuery(url, "all");
7
+ const harnessValues = url.searchParams.getAll("harness");
8
+ if (harnessValues.some((id) => id.trim().length === 0)) {
9
+ throw new Error("harness query parameters must be non-empty");
10
+ }
11
+ const harnessIds = harnessValues.map((id) => id.trim());
12
+ return {
13
+ ...(fresh === undefined ? {} : { fresh }),
14
+ ...(includeFakes === undefined ? {} : { includeFakes }),
15
+ ...(harnessIds.length === 0 ? {} : { harnessIds }),
16
+ };
17
+ }
18
+ export function parseCredentialProfilesSnapshotQuery(url) {
19
+ assertOnlyQueryParams(url, ["snapshot"]);
20
+ const snapshot = optionalBooleanQuery(url, "snapshot") ?? false;
21
+ return {
22
+ input: { snapshot },
23
+ schema: snapshot
24
+ ? ControlCredentialProfilesSnapshotResponse
25
+ : ControlCredentialProfilesResponse,
26
+ };
27
+ }
28
+ export function parseRunApplicabilityQuery(url) {
29
+ assertOnlyQueryParams(url, ["repoRoot"]);
30
+ const repoRoot = singleQuery(url, "repoRoot");
31
+ if (repoRoot === undefined || repoRoot.trim().length === 0) {
32
+ throw new Error("repoRoot query parameter is required");
33
+ }
34
+ return { repoRoot };
35
+ }
36
+ //# sourceMappingURL=catalog-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-query.js","sourceRoot":"","sources":["../src/catalog-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EACL,iCAAiC,EACjC,yCAAyC,GAC1C,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,UAAU,qBAAqB,CAAC,GAAQ;IAC5C,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACL,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,GAAQ;IAC3D,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC;IAChE,OAAO;QACL,KAAK,EAAE,EAAE,QAAQ,EAAE;QACnB,MAAM,EAAE,QAAQ;YACd,CAAC,CAAC,yCAAyC;YAC3C,CAAC,CAAC,iCAAiC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAQ;IACjD,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}