@sema-agent/sdk 0.0.75 → 0.0.76

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 (171) hide show
  1. package/dist/client.d.ts +48 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +55 -2
  4. package/dist/client.js.map +1 -1
  5. package/dist/control-client.d.ts +21 -0
  6. package/dist/control-client.d.ts.map +1 -1
  7. package/dist/control-client.js +42 -1
  8. package/dist/control-client.js.map +1 -1
  9. package/dist/control-types.d.ts +108 -0
  10. package/dist/control-types.d.ts.map +1 -1
  11. package/dist/control-types.js +15 -0
  12. package/dist/control-types.js.map +1 -1
  13. package/dist/errors.d.ts +88 -2
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js +105 -8
  16. package/dist/errors.js.map +1 -1
  17. package/dist/events.d.ts +154 -16
  18. package/dist/events.d.ts.map +1 -1
  19. package/dist/events.js +1 -0
  20. package/dist/events.js.map +1 -1
  21. package/dist/health.d.ts +44 -0
  22. package/dist/health.d.ts.map +1 -1
  23. package/dist/health.js +32 -0
  24. package/dist/health.js.map +1 -1
  25. package/dist/idempotency.d.ts +8 -0
  26. package/dist/idempotency.d.ts.map +1 -1
  27. package/dist/idempotency.js +8 -0
  28. package/dist/idempotency.js.map +1 -1
  29. package/dist/index.d.ts +19 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +13 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/resources/approvals.d.ts +43 -0
  34. package/dist/resources/approvals.d.ts.map +1 -1
  35. package/dist/resources/approvals.js +23 -3
  36. package/dist/resources/approvals.js.map +1 -1
  37. package/dist/resources/assistant.d.ts +23 -0
  38. package/dist/resources/assistant.d.ts.map +1 -1
  39. package/dist/resources/assistant.js +22 -0
  40. package/dist/resources/assistant.js.map +1 -1
  41. package/dist/resources/control/auth-providers.d.ts +17 -0
  42. package/dist/resources/control/auth-providers.d.ts.map +1 -1
  43. package/dist/resources/control/auth-providers.js +6 -0
  44. package/dist/resources/control/auth-providers.js.map +1 -1
  45. package/dist/resources/control/config.d.ts +22 -0
  46. package/dist/resources/control/config.d.ts.map +1 -1
  47. package/dist/resources/control/config.js +12 -0
  48. package/dist/resources/control/config.js.map +1 -1
  49. package/dist/resources/control/fleet.d.ts +15 -0
  50. package/dist/resources/control/fleet.d.ts.map +1 -1
  51. package/dist/resources/control/fleet.js +8 -0
  52. package/dist/resources/control/fleet.js.map +1 -1
  53. package/dist/resources/control/images.d.ts +20 -0
  54. package/dist/resources/control/images.d.ts.map +1 -1
  55. package/dist/resources/control/images.js +10 -0
  56. package/dist/resources/control/images.js.map +1 -1
  57. package/dist/resources/control/lifecycle.d.ts +8 -0
  58. package/dist/resources/control/lifecycle.d.ts.map +1 -1
  59. package/dist/resources/control/lifecycle.js +3 -0
  60. package/dist/resources/control/lifecycle.js.map +1 -1
  61. package/dist/resources/control/publish.d.ts +12 -0
  62. package/dist/resources/control/publish.d.ts.map +1 -1
  63. package/dist/resources/control/publish.js +6 -0
  64. package/dist/resources/control/publish.js.map +1 -1
  65. package/dist/resources/control/secrets.d.ts +28 -0
  66. package/dist/resources/control/secrets.d.ts.map +1 -1
  67. package/dist/resources/control/secrets.js +16 -0
  68. package/dist/resources/control/secrets.js.map +1 -1
  69. package/dist/resources/control/users.d.ts +22 -0
  70. package/dist/resources/control/users.d.ts.map +1 -1
  71. package/dist/resources/control/users.js +12 -0
  72. package/dist/resources/control/users.js.map +1 -1
  73. package/dist/resources/control/versioning.d.ts +12 -0
  74. package/dist/resources/control/versioning.d.ts.map +1 -1
  75. package/dist/resources/control/versioning.js +6 -0
  76. package/dist/resources/control/versioning.js.map +1 -1
  77. package/dist/resources/control/workers.d.ts +14 -0
  78. package/dist/resources/control/workers.d.ts.map +1 -1
  79. package/dist/resources/control/workers.js +7 -0
  80. package/dist/resources/control/workers.js.map +1 -1
  81. package/dist/resources/elicitations.d.ts +43 -0
  82. package/dist/resources/elicitations.d.ts.map +1 -1
  83. package/dist/resources/elicitations.js +8 -0
  84. package/dist/resources/elicitations.js.map +1 -1
  85. package/dist/resources/fleet.d.ts +90 -0
  86. package/dist/resources/fleet.d.ts.map +1 -1
  87. package/dist/resources/fleet.js +27 -4
  88. package/dist/resources/fleet.js.map +1 -1
  89. package/dist/resources/images.d.ts +34 -0
  90. package/dist/resources/images.d.ts.map +1 -1
  91. package/dist/resources/images.js +29 -3
  92. package/dist/resources/images.js.map +1 -1
  93. package/dist/resources/leader.d.ts +10 -0
  94. package/dist/resources/leader.d.ts.map +1 -1
  95. package/dist/resources/leader.js +4 -0
  96. package/dist/resources/leader.js.map +1 -1
  97. package/dist/resources/memory.d.ts +37 -0
  98. package/dist/resources/memory.d.ts.map +1 -1
  99. package/dist/resources/memory.js +28 -0
  100. package/dist/resources/memory.js.map +1 -1
  101. package/dist/resources/models.d.ts +12 -0
  102. package/dist/resources/models.d.ts.map +1 -1
  103. package/dist/resources/models.js +4 -0
  104. package/dist/resources/models.js.map +1 -1
  105. package/dist/resources/ops.d.ts +16 -0
  106. package/dist/resources/ops.d.ts.map +1 -1
  107. package/dist/resources/ops.js +6 -0
  108. package/dist/resources/ops.js.map +1 -1
  109. package/dist/resources/policy.d.ts +8 -0
  110. package/dist/resources/policy.d.ts.map +1 -1
  111. package/dist/resources/policy.js +1 -0
  112. package/dist/resources/policy.js.map +1 -1
  113. package/dist/resources/questions.d.ts +57 -0
  114. package/dist/resources/questions.d.ts.map +1 -1
  115. package/dist/resources/questions.js +9 -0
  116. package/dist/resources/questions.js.map +1 -1
  117. package/dist/resources/runs.d.ts +143 -0
  118. package/dist/resources/runs.d.ts.map +1 -1
  119. package/dist/resources/runs.js +129 -2
  120. package/dist/resources/runs.js.map +1 -1
  121. package/dist/resources/session-sync.d.ts +61 -0
  122. package/dist/resources/session-sync.d.ts.map +1 -1
  123. package/dist/resources/session-sync.js +54 -1
  124. package/dist/resources/session-sync.js.map +1 -1
  125. package/dist/resources/sessions.d.ts +74 -0
  126. package/dist/resources/sessions.d.ts.map +1 -1
  127. package/dist/resources/sessions.js +64 -2
  128. package/dist/resources/sessions.js.map +1 -1
  129. package/dist/resources/side-query.d.ts +18 -0
  130. package/dist/resources/side-query.d.ts.map +1 -1
  131. package/dist/resources/side-query.js +1 -0
  132. package/dist/resources/side-query.js.map +1 -1
  133. package/dist/resources/tasks.d.ts +19 -0
  134. package/dist/resources/tasks.d.ts.map +1 -1
  135. package/dist/resources/tasks.js +21 -2
  136. package/dist/resources/tasks.js.map +1 -1
  137. package/dist/resources/tool-approvals.d.ts +53 -0
  138. package/dist/resources/tool-approvals.d.ts.map +1 -1
  139. package/dist/resources/tool-approvals.js +10 -0
  140. package/dist/resources/tool-approvals.js.map +1 -1
  141. package/dist/resources/trace.d.ts +23 -0
  142. package/dist/resources/trace.d.ts.map +1 -1
  143. package/dist/resources/trace.js +27 -2
  144. package/dist/resources/trace.js.map +1 -1
  145. package/dist/resources/usage.d.ts +21 -0
  146. package/dist/resources/usage.d.ts.map +1 -1
  147. package/dist/resources/usage.js +8 -0
  148. package/dist/resources/usage.js.map +1 -1
  149. package/dist/resources/workflows.d.ts +48 -0
  150. package/dist/resources/workflows.d.ts.map +1 -1
  151. package/dist/resources/workflows.js +40 -3
  152. package/dist/resources/workflows.js.map +1 -1
  153. package/dist/settings.d.ts +90 -0
  154. package/dist/settings.d.ts.map +1 -1
  155. package/dist/settings.js +24 -0
  156. package/dist/settings.js.map +1 -1
  157. package/dist/sse.d.ts +36 -0
  158. package/dist/sse.d.ts.map +1 -1
  159. package/dist/sse.js +53 -8
  160. package/dist/sse.js.map +1 -1
  161. package/dist/sync.d.ts +56 -0
  162. package/dist/sync.d.ts.map +1 -1
  163. package/dist/sync.js +48 -4
  164. package/dist/sync.js.map +1 -1
  165. package/dist/transport.d.ts +32 -0
  166. package/dist/transport.d.ts.map +1 -1
  167. package/dist/transport.js +40 -8
  168. package/dist/transport.js.map +1 -1
  169. package/dist/types.d.ts +691 -1
  170. package/dist/types.d.ts.map +1 -1
  171. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../src/resources/assistant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../src/resources/assistant.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,31 @@
1
+ /** control.authProviders — login auth-provider config (Gitea / OAuth2 quick-login). Backend: sema-registry
2
+ * GET/POST/DELETE /api/config/auth/providers. admin-only.
3
+ *
4
+ * 🔴 SECRET BOUNDARY (iron law, registry-enforced AND mirrored here): the client_secret VALUE is never stored,
5
+ * returned, or logged — only its env-NAME (`clientSecretEnv`). upsert() takes a `clientSecretEnv` NAME (the
6
+ * registry rejects a value-shaped string with the env-NAME regex); the result echoes the NON-secret record
7
+ * plus the registry-derived `secretPresent` boolean (is the env in place?) — never the value.
8
+ *
9
+ * Local accounts remain a permanent fallback independent of these rows, so a misconfigured provider can't lock
10
+ * the admin out. `type: "oidc"` is rejected by the registry today (discovery not yet implemented) → 400
11
+ * ControlValidationError; this SDK's upsert type admits only the supported "gitea"|"oauth2". */
1
12
  import type { Transport } from "../../transport.js";
2
13
  import type { AuthProvidersResult, AuthProviderUpsert, AuthProviderUpsertResult } from "../../control-types.js";
3
14
  export declare class ControlAuthProvidersResource {
4
15
  private readonly t;
5
16
  constructor(t: Transport);
17
+ /** GET /api/config/auth/providers → all providers (each NON-secret config + the derived `secretPresent`).
18
+ * admin. */
6
19
  list(opts?: {
7
20
  signal?: AbortSignal;
8
21
  }): Promise<AuthProvidersResult>;
22
+ /** POST /api/config/auth/providers → upsert one provider. 🔴 `clientSecretEnv` is an ENV-NAME (never a value);
23
+ * the registry validates it lives in the provider-secret namespace and rejects a platform secret (anti-exfil)
24
+ * → 400 ControlValidationError. A bad field → 400. admin. NOT submit-class (an upsert is idempotent on `id`). */
9
25
  upsert(provider: AuthProviderUpsert, opts?: {
10
26
  signal?: AbortSignal;
11
27
  }): Promise<AuthProviderUpsertResult>;
28
+ /** DELETE /api/config/auth/providers?id=<id> → remove a provider. admin. */
12
29
  delete(id: string, opts?: {
13
30
  signal?: AbortSignal;
14
31
  }): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"auth-providers.d.ts","sourceRoot":"","sources":["../../../src/resources/control/auth-providers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEhH,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAInC,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOnE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAKxG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;CAGjF"}
1
+ {"version":3,"file":"auth-providers.d.ts","sourceRoot":"","sources":["../../../src/resources/control/auth-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iGAUiG;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEhH,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;iBACa;IACP,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIzE;;sHAEkH;IAC5G,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAI9G,4EAA4E;IACtE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;CAGjF"}
@@ -3,12 +3,18 @@ export class ControlAuthProvidersResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** GET /api/config/auth/providers → all providers (each NON-secret config + the derived `secretPresent`).
7
+ * admin. */
6
8
  async list(opts) {
7
9
  return this.t.request({ method: "GET", path: "/api/config/auth/providers", signal: opts?.signal });
8
10
  }
11
+ /** POST /api/config/auth/providers → upsert one provider. 🔴 `clientSecretEnv` is an ENV-NAME (never a value);
12
+ * the registry validates it lives in the provider-secret namespace and rejects a platform secret (anti-exfil)
13
+ * → 400 ControlValidationError. A bad field → 400. admin. NOT submit-class (an upsert is idempotent on `id`). */
9
14
  async upsert(provider, opts) {
10
15
  return this.t.request({ method: "POST", path: "/api/config/auth/providers", body: provider, signal: opts?.signal });
11
16
  }
17
+ /** DELETE /api/config/auth/providers?id=<id> → remove a provider. admin. */
12
18
  async delete(id, opts) {
13
19
  return this.t.request({ method: "DELETE", path: `/api/config/auth/providers?id=${encodeURIComponent(id)}`, signal: opts?.signal });
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-providers.js","sourceRoot":"","sources":["../../../src/resources/control/auth-providers.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,4BAA4B;IACV;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAI7C,KAAK,CAAC,IAAI,CAAC,IAA+B;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrG,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,QAA4B,EAAE,IAA+B;QACxE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAA+B;QACtD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,iCAAiC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrI,CAAC;CACF"}
1
+ {"version":3,"file":"auth-providers.js","sourceRoot":"","sources":["../../../src/resources/control/auth-providers.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,4BAA4B;IACV;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;iBACa;IACb,KAAK,CAAC,IAAI,CAAC,IAA+B;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrG,CAAC;IAED;;sHAEkH;IAClH,KAAK,CAAC,MAAM,CAAC,QAA4B,EAAE,IAA+B;QACxE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAA+B;QACtD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,iCAAiC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrI,CAAC;CACF"}
@@ -1,28 +1,50 @@
1
+ /** control.config — config DOMAIN CRUD + atomic batch + schema introspection + portable export.
2
+ * Backend: sema-registry GET/PUT /api/config/[domain], POST /api/config/batch, GET /api/config/schema,
3
+ * GET /api/config/export. This is where the CLI's裸-HTTP fleet.ts (export/batch/PUT) lands inside the SDK.
4
+ *
5
+ * 🔴 The SDK does NOT interpret per-domain values, NOR re-derive the per-domain write-role table
6
+ * (domainWriteRole drifts with the registry). It sends the write; a too-low role lands as a typed 403
7
+ * (ControlForbiddenError). Validation 400 / CAS 409 are surfaced typed (ControlValidationError /
8
+ * ControlConflictError), never auto-retried. */
1
9
  import type { Transport } from "../../transport.js";
2
10
  import type { ConfigDomain, DomainRead, PutResult, BatchChange, BatchResult, SchemaAll, SchemaOne, ExportResult } from "../../control-types.js";
3
11
  export declare class ControlConfigResource {
4
12
  private readonly t;
5
13
  constructor(t: Transport);
14
+ /** GET /api/config/[domain] → the domain value + global version (echo `version` as a put() `baseVersion`
15
+ * for true optimistic locking). viewer+. */
6
16
  get(domain: ConfigDomain, opts?: {
7
17
  signal?: AbortSignal;
8
18
  }): Promise<DomainRead>;
19
+ /** PUT /api/config/[domain] — write one domain. `baseVersion` (from a prior get()) makes the write a CAS:
20
+ * a write racing ANY config change since that read is rejected 409 (ControlConflictError). editor+ (some
21
+ * domains publisher+ → 403 ControlForbiddenError). NOT submit-class: a non-idempotent PUT is never retried.
22
+ * Returns droppedKeys/autoPlaced so a "success" that dropped fields isn't a silent false-success. */
9
23
  put(domain: ConfigDomain, body: {
10
24
  value: unknown;
11
25
  summary?: string;
12
26
  baseVersion?: number;
13
27
  signal?: AbortSignal;
14
28
  }): Promise<PutResult>;
29
+ /** POST /api/config/batch — atomic multi-domain write (validated whole, applied all-or-nothing, version
30
+ * bumps once). editor+ (publisher-only domains in the batch → 403). NOT submit-class (no idempotency key:
31
+ * a batch is a CAS write, re-running could clobber). A bad/forbidden domain → 400 ControlValidationError. */
15
32
  batch(body: {
16
33
  changes: BatchChange[];
17
34
  summary?: string;
18
35
  signal?: AbortSignal;
19
36
  }): Promise<BatchResult>;
37
+ /** GET /api/config/schema → every domain's JSON Schema (Draft-07). viewer+. */
20
38
  schema(opts?: {
21
39
  signal?: AbortSignal;
22
40
  }): Promise<SchemaAll>;
41
+ /** GET /api/config/schema?domain=<d> → one domain's JSON Schema. */
23
42
  schema(domain: ConfigDomain, opts?: {
24
43
  signal?: AbortSignal;
25
44
  }): Promise<SchemaOne>;
45
+ /** GET /api/config/export → portable config bundle (env-NAME refs only, never secret VALUES). `?published`
46
+ * exports the last published snapshot (409 ControlConflictError if nothing was ever published) instead of
47
+ * the live draft. editor+. */
26
48
  export(opts?: {
27
49
  published?: boolean;
28
50
  signal?: AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/resources/control/config.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAClG,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAInC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ/E,GAAG,CACP,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACrF,OAAO,CAAC,SAAS,CAAC;IAQf,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAMrG,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAE3D,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAcjF,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAI1F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/resources/control/config.ts"],"names":[],"mappings":"AAAA;;;;;;;oDAOoD;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAClG,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;iDAC6C;IACvC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrF;;;0GAGsG;IAChG,GAAG,CACP,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACrF,OAAO,CAAC,SAAS,CAAC;IAKrB;;kHAE8G;IACxG,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAK3G,+EAA+E;IACzE,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IACjE,oEAAoE;IAC9D,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAWvF;;mCAE+B;IACzB,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAI1F"}
@@ -3,13 +3,22 @@ export class ControlConfigResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** GET /api/config/[domain] → the domain value + global version (echo `version` as a put() `baseVersion`
7
+ * for true optimistic locking). viewer+. */
6
8
  async get(domain, opts) {
7
9
  return this.t.request({ method: "GET", path: `/api/config/${encodeURIComponent(domain)}`, signal: opts?.signal });
8
10
  }
11
+ /** PUT /api/config/[domain] — write one domain. `baseVersion` (from a prior get()) makes the write a CAS:
12
+ * a write racing ANY config change since that read is rejected 409 (ControlConflictError). editor+ (some
13
+ * domains publisher+ → 403 ControlForbiddenError). NOT submit-class: a non-idempotent PUT is never retried.
14
+ * Returns droppedKeys/autoPlaced so a "success" that dropped fields isn't a silent false-success. */
9
15
  async put(domain, body) {
10
16
  const { signal, ...rest } = body;
11
17
  return this.t.request({ method: "PUT", path: `/api/config/${encodeURIComponent(domain)}`, body: rest, signal });
12
18
  }
19
+ /** POST /api/config/batch — atomic multi-domain write (validated whole, applied all-or-nothing, version
20
+ * bumps once). editor+ (publisher-only domains in the batch → 403). NOT submit-class (no idempotency key:
21
+ * a batch is a CAS write, re-running could clobber). A bad/forbidden domain → 400 ControlValidationError. */
13
22
  async batch(body) {
14
23
  const { signal, ...rest } = body;
15
24
  return this.t.request({ method: "POST", path: "/api/config/batch", body: rest, signal });
@@ -20,6 +29,9 @@ export class ControlConfigResource {
20
29
  const qs = domain ? `?domain=${encodeURIComponent(domain)}` : "";
21
30
  return this.t.request({ method: "GET", path: `/api/config/schema${qs}`, signal });
22
31
  }
32
+ /** GET /api/config/export → portable config bundle (env-NAME refs only, never secret VALUES). `?published`
33
+ * exports the last published snapshot (409 ControlConflictError if nothing was ever published) instead of
34
+ * the live draft. editor+. */
23
35
  async export(opts) {
24
36
  const qs = opts?.published ? "?published" : "";
25
37
  return this.t.request({ method: "GET", path: `/api/config/export${qs}`, signal: opts?.signal });
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/resources/control/config.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAI7C,KAAK,CAAC,GAAG,CAAC,MAAoB,EAAE,IAA+B;QAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpH,CAAC;IAMD,KAAK,CAAC,GAAG,CACP,MAAoB,EACpB,IAAsF;QAEtF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC;IAKD,KAAK,CAAC,KAAK,CAAC,IAAwE;QAClF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IAMD,KAAK,CAAC,MAAM,CACV,CAA2C,EAC3C,CAA4B;QAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAKD,KAAK,CAAC,MAAM,CAAC,IAAoD;QAC/D,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;CACF"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/resources/control/config.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;iDAC6C;IAC7C,KAAK,CAAC,GAAG,CAAC,MAAoB,EAAE,IAA+B;QAC7D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpH,CAAC;IAED;;;0GAGsG;IACtG,KAAK,CAAC,GAAG,CACP,MAAoB,EACpB,IAAsF;QAEtF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC;IAED;;kHAE8G;IAC9G,KAAK,CAAC,KAAK,CAAC,IAAwE;QAClF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IAMD,KAAK,CAAC,MAAM,CACV,CAA2C,EAC3C,CAA4B;QAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAED;;mCAE+B;IAC/B,KAAK,CAAC,MAAM,CAAC,IAAoD;QAC/D,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;CACF"}
@@ -1,29 +1,44 @@
1
+ /** control.fleet — the operations dashboard's read + scheduling actions (多主机调度).
2
+ * Backend: sema-registry GET /api/config/fleet, GET /api/config/fleet/metrics, GET/POST
3
+ * /api/config/placement, GET/POST /api/config/rebalance, GET/POST /api/config/reschedule.
4
+ *
5
+ * GET previews (snapshot/metrics/*Plan) are viewer+ and cheap-to-poll. The *apply POSTs are editor+ and are
6
+ * CAS writes over the workers domain: a concurrent workers edit → 409 ControlConflictError (the move set is
7
+ * never clobbered). The SDK previews/applies the registry's plans; it does NOT compute scheduling itself. */
1
8
  import type { Transport } from "../../transport.js";
2
9
  import type { FleetSnapshot, FleetMetrics, SchedulePlan, ScheduleApplyResult } from "../../control-types.js";
3
10
  export declare class ControlFleetResource {
4
11
  private readonly t;
5
12
  constructor(t: Transport);
13
+ /** GET /api/config/fleet → live FleetSnapshot (desired ⊕ status ⊕ lifecycle + derived signals). viewer+. */
6
14
  snapshot(opts?: {
7
15
  signal?: AbortSignal;
8
16
  }): Promise<FleetSnapshot>;
17
+ /** GET /api/config/fleet/metrics → { worker → MetricsSummary } + per-worker scrape errors. viewer+. */
9
18
  metrics(opts?: {
10
19
  signal?: AbortSignal;
11
20
  }): Promise<FleetMetrics>;
21
+ /** GET /api/config/placement → placement plan preview (auto workers ↔ hosts). viewer+. */
12
22
  placementPlan(opts?: {
13
23
  signal?: AbortSignal;
14
24
  }): Promise<SchedulePlan>;
25
+ /** POST /api/config/placement → apply the placement plan (rewrite auto workers' host, one CAS write). editor+. */
15
26
  applyPlacement(opts?: {
16
27
  signal?: AbortSignal;
17
28
  }): Promise<ScheduleApplyResult>;
29
+ /** GET /api/config/rebalance → rebalance plan preview (even out load off over-loaded hosts). viewer+. */
18
30
  rebalancePlan(opts?: {
19
31
  signal?: AbortSignal;
20
32
  }): Promise<SchedulePlan>;
33
+ /** POST /api/config/rebalance → apply the rebalance moves (CAS-safe). editor+. */
21
34
  applyRebalance(opts?: {
22
35
  signal?: AbortSignal;
23
36
  }): Promise<ScheduleApplyResult>;
37
+ /** GET /api/config/reschedule → failover plan preview (evacuate auto workers off silent/dead hosts). viewer+. */
24
38
  reschedulePlan(opts?: {
25
39
  signal?: AbortSignal;
26
40
  }): Promise<SchedulePlan>;
41
+ /** POST /api/config/reschedule → apply the evacuations (operator one-click; CAS-safe). editor+. */
27
42
  applyReschedule(opts?: {
28
43
  signal?: AbortSignal;
29
44
  }): Promise<ScheduleApplyResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../src/resources/control/fleet.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7G,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAGnC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAKjE,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/D,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAKrE,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK7E,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAKrE,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK7E,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAKtE,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGrF"}
1
+ {"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../src/resources/control/fleet.ts"],"names":[],"mappings":"AAAA;;;;;;8GAM8G;AAC9G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7G,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,4GAA4G;IACtG,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAIvE,uGAAuG;IACjG,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrE,0FAA0F;IACpF,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAI3E,kHAAkH;IAC5G,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAInF,yGAAyG;IACnG,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAI3E,kFAAkF;IAC5E,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAInF,iHAAiH;IAC3G,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAI5E,mGAAmG;IAC7F,eAAe,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGrF"}
@@ -3,27 +3,35 @@ export class ControlFleetResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** GET /api/config/fleet → live FleetSnapshot (desired ⊕ status ⊕ lifecycle + derived signals). viewer+. */
6
7
  async snapshot(opts) {
7
8
  return this.t.request({ method: "GET", path: "/api/config/fleet", signal: opts?.signal });
8
9
  }
10
+ /** GET /api/config/fleet/metrics → { worker → MetricsSummary } + per-worker scrape errors. viewer+. */
9
11
  async metrics(opts) {
10
12
  return this.t.request({ method: "GET", path: "/api/config/fleet/metrics", signal: opts?.signal });
11
13
  }
14
+ /** GET /api/config/placement → placement plan preview (auto workers ↔ hosts). viewer+. */
12
15
  async placementPlan(opts) {
13
16
  return this.t.request({ method: "GET", path: "/api/config/placement", signal: opts?.signal });
14
17
  }
18
+ /** POST /api/config/placement → apply the placement plan (rewrite auto workers' host, one CAS write). editor+. */
15
19
  async applyPlacement(opts) {
16
20
  return this.t.request({ method: "POST", path: "/api/config/placement", body: {}, signal: opts?.signal });
17
21
  }
22
+ /** GET /api/config/rebalance → rebalance plan preview (even out load off over-loaded hosts). viewer+. */
18
23
  async rebalancePlan(opts) {
19
24
  return this.t.request({ method: "GET", path: "/api/config/rebalance", signal: opts?.signal });
20
25
  }
26
+ /** POST /api/config/rebalance → apply the rebalance moves (CAS-safe). editor+. */
21
27
  async applyRebalance(opts) {
22
28
  return this.t.request({ method: "POST", path: "/api/config/rebalance", body: {}, signal: opts?.signal });
23
29
  }
30
+ /** GET /api/config/reschedule → failover plan preview (evacuate auto workers off silent/dead hosts). viewer+. */
24
31
  async reschedulePlan(opts) {
25
32
  return this.t.request({ method: "GET", path: "/api/config/reschedule", signal: opts?.signal });
26
33
  }
34
+ /** POST /api/config/reschedule → apply the evacuations (operator one-click; CAS-safe). editor+. */
27
35
  async applyReschedule(opts) {
28
36
  return this.t.request({ method: "POST", path: "/api/config/reschedule", body: {}, signal: opts?.signal });
29
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/resources/control/fleet.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAG7C,KAAK,CAAC,QAAQ,CAAC,IAA+B;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IAGD,KAAK,CAAC,OAAO,CAAC,IAA+B;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpG,CAAC;IAGD,KAAK,CAAC,aAAa,CAAC,IAA+B;QACjD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC;IAGD,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IAGD,KAAK,CAAC,aAAa,CAAC,IAA+B;QACjD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC;IAGD,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IAGD,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IAGD,KAAK,CAAC,eAAe,CAAC,IAA+B;QACnD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;CACF"}
1
+ {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/resources/control/fleet.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C,4GAA4G;IAC5G,KAAK,CAAC,QAAQ,CAAC,IAA+B;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,uGAAuG;IACvG,KAAK,CAAC,OAAO,CAAC,IAA+B;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,0FAA0F;IAC1F,KAAK,CAAC,aAAa,CAAC,IAA+B;QACjD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,kHAAkH;IAClH,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,yGAAyG;IACzG,KAAK,CAAC,aAAa,CAAC,IAA+B;QACjD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,iHAAiH;IACjH,KAAK,CAAC,cAAc,CAAC,IAA+B;QAClD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,mGAAmG;IACnG,KAAK,CAAC,eAAe,CAAC,IAA+B;QACnD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;CACF"}
@@ -1,17 +1,37 @@
1
+ /** control.images — the shared sandbox-image pool, read + resolve. Backend: sema-registry GET
2
+ * /api/config/images, GET /api/config/images/:profile, GET /api/config/images/digests/:digest,
3
+ * POST /api/config/images/select. The registry is a BFF RELAY in front of the worker's /v1/images: it reaches
4
+ * the worker with its OWN server-side IMAGE_API_TOKEN (never echoed) and zod-validates every relayed row.
5
+ *
6
+ * 🔴 All four are gated by the EDITOR Bearer (the SAME registry token) — NOT the service pull token. list/get/
7
+ * byDigest are read-only (viewer-shaped, editor+ here). select() is a PURE resolution PREVIEW: it resolves a
8
+ * profile/bands → a concrete `ref` (repo@digest) to bind onto a worker; it builds nothing. The registry
9
+ * 503s when the upstream image API is unconfigured (surfaced as a ControlError) and 409s when no image
10
+ * satisfies the selection (ControlConflictError). */
1
11
  import type { Transport } from "../../transport.js";
2
12
  import type { ControlImageList, ControlImageEntry, ImageListQuery, ImageSelectQuery, ImageSelectResolution } from "../../control-types.js";
3
13
  export declare class ControlImagesResource {
4
14
  private readonly t;
5
15
  constructor(t: Transport);
16
+ /** GET /api/config/images[?status=&profile=&capability=&visibility=&latest=&limit=&cursor=] → a page of image
17
+ * rows. Only the documented list params are forwarded; `nextCursor` (when present) feeds the next call. editor+. */
6
18
  list(query?: ImageListQuery, opts?: {
7
19
  signal?: AbortSignal;
8
20
  }): Promise<ControlImageList>;
21
+ /** GET /api/config/images/:profile → the latest published entry for a profile (404 → ControlNotFoundError).
22
+ * The registry unwraps the upstream `{ image }` envelope; this returns the bare entry. editor+. */
9
23
  get(profile: string, opts?: {
10
24
  signal?: AbortSignal;
11
25
  }): Promise<ControlImageEntry>;
26
+ /** GET /api/config/images/digests/:digest → one entry by its immutable digest (`sha256:<64 hex>`; the drift
27
+ * lookup). 404 → ControlNotFoundError; a malformed digest → 400 ControlValidationError. editor+. */
12
28
  byDigest(digest: string, opts?: {
13
29
  signal?: AbortSignal;
14
30
  }): Promise<ControlImageEntry>;
31
+ /** POST /api/config/images/select → resolve a profile/bands to a concrete pull `ref` (repo@digest) for binding
32
+ * onto a worker. PURE resolution + visibility/capability admission — builds NOTHING. One of `profile`/`bands`
33
+ * is required. No image satisfies the selection → 409 ControlConflictError. NOT submit-class (idempotent,
34
+ * read-shaped resolution — re-running just re-resolves; no client idempotency key). editor+. */
15
35
  select(body: ImageSelectQuery & {
16
36
  signal?: AbortSignal;
17
37
  }): Promise<ImageSelectResolution>;
@@ -1 +1 @@
1
- {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../../src/resources/control/images.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAInC,IAAI,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAaxF,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAMjF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQrF,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAIhG"}
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../../src/resources/control/images.ts"],"names":[],"mappings":"AAAA;;;;;;;;;yDASyD;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;yHACqH;IAC/G,IAAI,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAW9F;wGACoG;IAC9F,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIvF;yGACqG;IAC/F,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI3F;;;qGAGiG;IAC3F,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAIhG"}
@@ -3,6 +3,8 @@ export class ControlImagesResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** GET /api/config/images[?status=&profile=&capability=&visibility=&latest=&limit=&cursor=] → a page of image
7
+ * rows. Only the documented list params are forwarded; `nextCursor` (when present) feeds the next call. editor+. */
6
8
  async list(query, opts) {
7
9
  const q = new URLSearchParams();
8
10
  if (query) {
@@ -14,12 +16,20 @@ export class ControlImagesResource {
14
16
  const qs = q.toString();
15
17
  return this.t.request({ method: "GET", path: `/api/config/images${qs ? `?${qs}` : ""}`, signal: opts?.signal });
16
18
  }
19
+ /** GET /api/config/images/:profile → the latest published entry for a profile (404 → ControlNotFoundError).
20
+ * The registry unwraps the upstream `{ image }` envelope; this returns the bare entry. editor+. */
17
21
  async get(profile, opts) {
18
22
  return this.t.request({ method: "GET", path: `/api/config/images/${encodeURIComponent(profile)}`, signal: opts?.signal });
19
23
  }
24
+ /** GET /api/config/images/digests/:digest → one entry by its immutable digest (`sha256:<64 hex>`; the drift
25
+ * lookup). 404 → ControlNotFoundError; a malformed digest → 400 ControlValidationError. editor+. */
20
26
  async byDigest(digest, opts) {
21
27
  return this.t.request({ method: "GET", path: `/api/config/images/digests/${encodeURIComponent(digest)}`, signal: opts?.signal });
22
28
  }
29
+ /** POST /api/config/images/select → resolve a profile/bands to a concrete pull `ref` (repo@digest) for binding
30
+ * onto a worker. PURE resolution + visibility/capability admission — builds NOTHING. One of `profile`/`bands`
31
+ * is required. No image satisfies the selection → 409 ControlConflictError. NOT submit-class (idempotent,
32
+ * read-shaped resolution — re-running just re-resolves; no client idempotency key). editor+. */
23
33
  async select(body) {
24
34
  const { signal, ...rest } = body;
25
35
  return this.t.request({ method: "POST", path: "/api/config/images/select", body: rest, signal });
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sourceRoot":"","sources":["../../../src/resources/control/images.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAI7C,KAAK,CAAC,IAAI,CAAC,KAAsB,EAAE,IAA+B;QAChE,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;oBAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC;IAID,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,IAA+B;QACxD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5H,CAAC;IAID,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAA+B;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnI,CAAC;IAMD,KAAK,CAAC,MAAM,CAAC,IAAiD;QAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;CACF"}
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../../src/resources/control/images.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;yHACqH;IACrH,KAAK,CAAC,IAAI,CAAC,KAAsB,EAAE,IAA+B;QAChE,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;oBAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC;IAED;wGACoG;IACpG,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,IAA+B;QACxD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5H,CAAC;IAED;yGACqG;IACrG,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAA+B;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,8BAA8B,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnI,CAAC;IAED;;;qGAGiG;IACjG,KAAK,CAAC,MAAM,CAAC,IAAiD;QAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;CACF"}
@@ -1,12 +1,20 @@
1
+ /** control.lifecycle — fleet lifecycle ops: cascade-delete an owner's workers, run one sweep pass.
2
+ * Backend: sema-registry POST /api/config/lifecycle/cascade-owner, POST /api/config/lifecycle/sweep.
3
+ *
4
+ * Both are editor+. cascadeOwner removes ALL workers owned by a decommissioned owner (atomic). sweep runs one
5
+ * lifecycle pass (TTL expiry / idle detection / failover / status GC); `?dryRun` previews (writes/logs nothing). */
1
6
  import type { Transport } from "../../transport.js";
2
7
  import type { CascadeOwnerResult, SweepResult } from "../../control-types.js";
3
8
  export declare class ControlLifecycleResource {
4
9
  private readonly t;
5
10
  constructor(t: Transport);
11
+ /** POST /api/config/lifecycle/cascade-owner {owner} → remove all workers that owner owns. editor+. NOT
12
+ * submit-class (a CAS-guarded atomic removal; re-running just removes nothing more). */
6
13
  cascadeOwner(body: {
7
14
  owner: string;
8
15
  signal?: AbortSignal;
9
16
  }): Promise<CascadeOwnerResult>;
17
+ /** POST /api/config/lifecycle/sweep[?dryRun=1] → one sweep pass (or a preview). editor+. */
10
18
  sweep(opts?: {
11
19
  dryRun?: boolean;
12
20
  signal?: AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/resources/control/lifecycle.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE9E,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAInC,YAAY,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAMxF,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAIrF"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/resources/control/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;qHAIqH;AACrH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE9E,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;6FACyF;IACnF,YAAY,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAK9F,4FAA4F;IACtF,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAIrF"}
@@ -3,10 +3,13 @@ export class ControlLifecycleResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** POST /api/config/lifecycle/cascade-owner {owner} → remove all workers that owner owns. editor+. NOT
7
+ * submit-class (a CAS-guarded atomic removal; re-running just removes nothing more). */
6
8
  async cascadeOwner(body) {
7
9
  const { signal, ...rest } = body;
8
10
  return this.t.request({ method: "POST", path: "/api/config/lifecycle/cascade-owner", body: rest, signal });
9
11
  }
12
+ /** POST /api/config/lifecycle/sweep[?dryRun=1] → one sweep pass (or a preview). editor+. */
10
13
  async sweep(opts) {
11
14
  const qs = opts?.dryRun ? "?dryRun=1" : "";
12
15
  return this.t.request({ method: "POST", path: `/api/config/lifecycle/sweep${qs}`, body: {}, signal: opts?.signal });
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/resources/control/lifecycle.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAI7C,KAAK,CAAC,YAAY,CAAC,IAA6C;QAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7G,CAAC;IAGD,KAAK,CAAC,KAAK,CAAC,IAAiD;QAC3D,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;CACF"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/resources/control/lifecycle.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;6FACyF;IACzF,KAAK,CAAC,YAAY,CAAC,IAA6C;QAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,KAAK,CAAC,IAAiD;QAC3D,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;CACF"}
@@ -1,18 +1,30 @@
1
+ /** control.publish — the draft→production publish gate + optional N-approver approval workflow.
2
+ * Backend: sema-registry POST/GET/DELETE /api/config/publish, POST /api/config/publish/approve.
3
+ *
4
+ * request()/approve()/cancel() are publisher+ (admin token ⊇ publisher); state() is viewer+. Separation of
5
+ * duties is enforced SERVER-SIDE: the requester may not approve their own request (403 ControlForbiddenError),
6
+ * and a draft that moved since the request invalidates pending approvals (409 ControlConflictError). */
1
7
  import type { Transport } from "../../transport.js";
2
8
  import type { PublishState, PublishResult, ApprovePublishResult, CancelPublishResult } from "../../control-types.js";
3
9
  export declare class ControlPublishResource {
4
10
  private readonly t;
5
11
  constructor(t: Transport);
12
+ /** GET /api/config/publish → gate state { published, pending, approvalsRequired }. viewer+. */
6
13
  state(opts?: {
7
14
  signal?: AbortSignal;
8
15
  }): Promise<PublishState>;
16
+ /** POST /api/config/publish {summary?} → publish immediately (approvals=0) OR open a pending request (N>0).
17
+ * publisher+. NOT submit-class (re-POSTing would open a duplicate request → the route 409s anyway). */
9
18
  request(body?: {
10
19
  summary?: string;
11
20
  signal?: AbortSignal;
12
21
  }): Promise<PublishResult>;
22
+ /** POST /api/config/publish/approve → record one approval; the Nth publishes. publisher+, NOT the requester
23
+ * (403 ControlForbiddenError). Atomic server-side. Draft moved since the request → 409 ControlConflictError. */
13
24
  approve(opts?: {
14
25
  signal?: AbortSignal;
15
26
  }): Promise<ApprovePublishResult>;
27
+ /** DELETE /api/config/publish → cancel the pending request (requester or admin only). publisher+. */
16
28
  cancel(opts?: {
17
29
  signal?: AbortSignal;
18
30
  }): Promise<CancelPublishResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/resources/control/publish.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAErH,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAGnC,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAM7D,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAOlF,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAKvE,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAG5E"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/resources/control/publish.ts"],"names":[],"mappings":"AAAA;;;;;yGAKyG;AACzG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAErH,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC,+FAA+F;IACzF,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAInE;4GACwG;IAClG,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAKxF;qHACiH;IAC3G,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI7E,qGAAqG;IAC/F,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAG5E"}
@@ -3,16 +3,22 @@ export class ControlPublishResource {
3
3
  constructor(t) {
4
4
  this.t = t;
5
5
  }
6
+ /** GET /api/config/publish → gate state { published, pending, approvalsRequired }. viewer+. */
6
7
  async state(opts) {
7
8
  return this.t.request({ method: "GET", path: "/api/config/publish", signal: opts?.signal });
8
9
  }
10
+ /** POST /api/config/publish {summary?} → publish immediately (approvals=0) OR open a pending request (N>0).
11
+ * publisher+. NOT submit-class (re-POSTing would open a duplicate request → the route 409s anyway). */
9
12
  async request(body) {
10
13
  const { signal, ...rest } = body ?? {};
11
14
  return this.t.request({ method: "POST", path: "/api/config/publish", body: rest, signal });
12
15
  }
16
+ /** POST /api/config/publish/approve → record one approval; the Nth publishes. publisher+, NOT the requester
17
+ * (403 ControlForbiddenError). Atomic server-side. Draft moved since the request → 409 ControlConflictError. */
13
18
  async approve(opts) {
14
19
  return this.t.request({ method: "POST", path: "/api/config/publish/approve", body: {}, signal: opts?.signal });
15
20
  }
21
+ /** DELETE /api/config/publish → cancel the pending request (requester or admin only). publisher+. */
16
22
  async cancel(opts) {
17
23
  return this.t.request({ method: "DELETE", path: "/api/config/publish", signal: opts?.signal });
18
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/resources/control/publish.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAG7C,KAAK,CAAC,KAAK,CAAC,IAA+B;QACzC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAID,KAAK,CAAC,OAAO,CAAC,IAAiD;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAID,KAAK,CAAC,OAAO,CAAC,IAA+B;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjH,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,IAA+B;QAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;CACF"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/resources/control/publish.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,sBAAsB;IACJ;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C,+FAA+F;IAC/F,KAAK,CAAC,KAAK,CAAC,IAA+B;QACzC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED;4GACwG;IACxG,KAAK,CAAC,OAAO,CAAC,IAAiD;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED;qHACiH;IACjH,KAAK,CAAC,OAAO,CAAC,IAA+B;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,qGAAqG;IACrG,KAAK,CAAC,MAAM,CAAC,IAA+B;QAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,CAAC;CACF"}
@@ -1,25 +1,53 @@
1
+ /** control.secrets — worker app-secret write-through + inventory + batch-rotate + reclaim. Backend: sema-registry
2
+ * GET/POST /api/config/secrets, DELETE /api/config/secrets/<name>, POST /api/config/secrets/<name>/rotate,
3
+ * GET /api/config/secrets/refs.
4
+ *
5
+ * 🔴 INVARIANT I1 (registry-enforced AND mirrored here): a secret VALUE is never persisted, returned, logged, or
6
+ * audited — only the NAME. There is NO value-read endpoint by design. The SDK upholds it structurally:
7
+ * - set() sends the value ONCE (in the request body) and the result type carries NO value field.
8
+ * - The value is NEVER placed in a URL/query/log; the result echoes only the name + advisory next-steps.
9
+ * - inventory()/rotate()/delete()/refs() touch NAMES only.
10
+ *
11
+ * inventory/set/rotate/delete are publisher+ (injecting/recreating credentials). refs() is admin. A name a
12
+ * worker references → 409 on delete unless force (ControlConflictError); a write colliding with a DIFFERENT
13
+ * existing value → 409 unless overwrite. */
1
14
  import type { Transport } from "../../transport.js";
2
15
  import type { SecretInventory, SecretWriteResult, SecretRotateResult, SecretDeleteResult, SecretRefsResult } from "../../control-types.js";
3
16
  export declare class ControlSecretsResource {
4
17
  private readonly t;
5
18
  constructor(t: Transport);
19
+ /** GET /api/config/secrets[?orphans=true] → the env-NAMEs in the secret source (NEVER values), each tagged
20
+ * referenced/orphan. `orphans` returns only the unreferenced (reclaimable) ones. publisher+. */
6
21
  inventory(opts?: {
7
22
  orphans?: boolean;
8
23
  signal?: AbortSignal;
9
24
  }): Promise<SecretInventory>;
25
+ /** POST /api/config/secrets {name, value} → write-through ONE secret value to the orchestrator secret source.
26
+ * 🔴 The `value` goes up in the body ONCE and is NEVER returned/logged (I1) — the result carries only `name`
27
+ * + advisory next-steps. A collision with a DIFFERENT existing value → 409 ControlConflictError unless
28
+ * `overwrite`. publisher+. NOT submit-class (no idempotency key — a re-PUT of the same name/value is a
29
+ * server-side no-op; a key would not change the value-overwrite semantics). */
10
30
  set(body: {
11
31
  name: string;
12
32
  value: string;
13
33
  overwrite?: boolean;
14
34
  signal?: AbortSignal;
15
35
  }): Promise<SecretWriteResult>;
36
+ /** POST /api/config/secrets/<name>/rotate → draft a recreate of EVERY worker referencing this env-NAME (one
37
+ * atomic draft; publish to apply). `workers:[]` (200) when nothing references it — not an error. A name
38
+ * referenced by nobody → 404 ControlNotFoundError (likely a typo). publisher+. */
16
39
  rotate(name: string, opts?: {
17
40
  signal?: AbortSignal;
18
41
  }): Promise<SecretRotateResult>;
42
+ /** DELETE /api/config/secrets/<name>[?force=true] → reclaim an orphan name from the secret source.
43
+ * `removed:false` is an idempotent no-op (the name wasn't present). A name a worker references → 409
44
+ * ControlConflictError unless `force`. publisher+. */
19
45
  delete(name: string, opts?: {
20
46
  force?: boolean;
21
47
  signal?: AbortSignal;
22
48
  }): Promise<SecretDeleteResult>;
49
+ /** GET /api/config/secrets/refs → every env-NAME the effective config references, grouped by name with where
50
+ * it's used (audit which env vars each host/service must provide). NAMES only, never values. admin. */
23
51
  refs(opts?: {
24
52
  signal?: AbortSignal;
25
53
  }): Promise<SecretRefsResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAInC,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAUvF,GAAG,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUjH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOlF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAOnG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAGvE"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/resources/control/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;6CAY6C;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAC7F,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;qGACiG;IAC3F,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAK7F;;;;oFAIgF;IAC1E,GAAG,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOvH;;uFAEmF;IAC7E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIxF;;2DAEuD;IACjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKzG;4GACwG;IAClG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAGvE"}