@cat-factory/contracts 0.6.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 (166) hide show
  1. package/LICENSE +21 -0
  2. package/dist/accounts.d.ts +103 -0
  3. package/dist/accounts.d.ts.map +1 -0
  4. package/dist/accounts.js +102 -0
  5. package/dist/accounts.js.map +1 -0
  6. package/dist/agent-config.d.ts +77 -0
  7. package/dist/agent-config.d.ts.map +1 -0
  8. package/dist/agent-config.js +78 -0
  9. package/dist/agent-config.js.map +1 -0
  10. package/dist/api-keys.d.ts +44 -0
  11. package/dist/api-keys.d.ts.map +1 -0
  12. package/dist/api-keys.js +49 -0
  13. package/dist/api-keys.js.map +1 -0
  14. package/dist/auth.d.ts +24 -0
  15. package/dist/auth.d.ts.map +1 -0
  16. package/dist/auth.js +15 -0
  17. package/dist/auth.js.map +1 -0
  18. package/dist/board-scan.d.ts +89 -0
  19. package/dist/board-scan.d.ts.map +1 -0
  20. package/dist/board-scan.js +122 -0
  21. package/dist/board-scan.js.map +1 -0
  22. package/dist/bootstrap.d.ts +168 -0
  23. package/dist/bootstrap.d.ts.map +1 -0
  24. package/dist/bootstrap.js +148 -0
  25. package/dist/bootstrap.js.map +1 -0
  26. package/dist/clarity.d.ts +75 -0
  27. package/dist/clarity.d.ts.map +1 -0
  28. package/dist/clarity.js +66 -0
  29. package/dist/clarity.js.map +1 -0
  30. package/dist/companion.d.ts +32 -0
  31. package/dist/companion.d.ts.map +1 -0
  32. package/dist/companion.js +43 -0
  33. package/dist/companion.js.map +1 -0
  34. package/dist/consensus.d.ts +195 -0
  35. package/dist/consensus.d.ts.map +1 -0
  36. package/dist/consensus.js +164 -0
  37. package/dist/consensus.js.map +1 -0
  38. package/dist/documents.d.ts +197 -0
  39. package/dist/documents.d.ts.map +1 -0
  40. package/dist/documents.js +161 -0
  41. package/dist/documents.js.map +1 -0
  42. package/dist/entities.d.ts +1691 -0
  43. package/dist/entities.d.ts.map +1 -0
  44. package/dist/entities.js +853 -0
  45. package/dist/entities.js.map +1 -0
  46. package/dist/environments.d.ts +426 -0
  47. package/dist/environments.d.ts.map +1 -0
  48. package/dist/environments.js +190 -0
  49. package/dist/environments.js.map +1 -0
  50. package/dist/events.d.ts +98 -0
  51. package/dist/events.d.ts.map +1 -0
  52. package/dist/events.js +2 -0
  53. package/dist/events.js.map +1 -0
  54. package/dist/fragment-library.d.ts +123 -0
  55. package/dist/fragment-library.d.ts.map +1 -0
  56. package/dist/fragment-library.js +88 -0
  57. package/dist/fragment-library.js.map +1 -0
  58. package/dist/github.d.ts +215 -0
  59. package/dist/github.d.ts.map +1 -0
  60. package/dist/github.js +204 -0
  61. package/dist/github.js.map +1 -0
  62. package/dist/index.d.ts +41 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +41 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/iteration-cap.d.ts +17 -0
  67. package/dist/iteration-cap.d.ts.map +1 -0
  68. package/dist/iteration-cap.js +25 -0
  69. package/dist/iteration-cap.js.map +1 -0
  70. package/dist/localModels.d.ts +54 -0
  71. package/dist/localModels.d.ts.map +1 -0
  72. package/dist/localModels.js +79 -0
  73. package/dist/localModels.js.map +1 -0
  74. package/dist/merge.d.ts +106 -0
  75. package/dist/merge.d.ts.map +1 -0
  76. package/dist/merge.js +129 -0
  77. package/dist/merge.js.map +1 -0
  78. package/dist/model-defaults.d.ts +23 -0
  79. package/dist/model-defaults.d.ts.map +1 -0
  80. package/dist/model-defaults.js +34 -0
  81. package/dist/model-defaults.js.map +1 -0
  82. package/dist/notifications.d.ts +136 -0
  83. package/dist/notifications.d.ts.map +1 -0
  84. package/dist/notifications.js +125 -0
  85. package/dist/notifications.js.map +1 -0
  86. package/dist/observability.d.ts +271 -0
  87. package/dist/observability.d.ts.map +1 -0
  88. package/dist/observability.js +152 -0
  89. package/dist/observability.js.map +1 -0
  90. package/dist/personal-subscriptions.d.ts +66 -0
  91. package/dist/personal-subscriptions.d.ts.map +1 -0
  92. package/dist/personal-subscriptions.js +70 -0
  93. package/dist/personal-subscriptions.js.map +1 -0
  94. package/dist/primitives.d.ts +57 -0
  95. package/dist/primitives.d.ts.map +1 -0
  96. package/dist/primitives.js +66 -0
  97. package/dist/primitives.js.map +1 -0
  98. package/dist/provisioning.d.ts +46 -0
  99. package/dist/provisioning.d.ts.map +1 -0
  100. package/dist/provisioning.js +107 -0
  101. package/dist/provisioning.js.map +1 -0
  102. package/dist/recurring.d.ts +117 -0
  103. package/dist/recurring.d.ts.map +1 -0
  104. package/dist/recurring.js +99 -0
  105. package/dist/recurring.js.map +1 -0
  106. package/dist/release.d.ts +60 -0
  107. package/dist/release.d.ts.map +1 -0
  108. package/dist/release.js +75 -0
  109. package/dist/release.js.map +1 -0
  110. package/dist/requests.d.ts +451 -0
  111. package/dist/requests.d.ts.map +1 -0
  112. package/dist/requests.js +231 -0
  113. package/dist/requests.js.map +1 -0
  114. package/dist/requirements.d.ts +127 -0
  115. package/dist/requirements.d.ts.map +1 -0
  116. package/dist/requirements.js +137 -0
  117. package/dist/requirements.js.map +1 -0
  118. package/dist/runners.d.ts +387 -0
  119. package/dist/runners.d.ts.map +1 -0
  120. package/dist/runners.js +117 -0
  121. package/dist/runners.js.map +1 -0
  122. package/dist/sandbox.d.ts +300 -0
  123. package/dist/sandbox.d.ts.map +1 -0
  124. package/dist/sandbox.js +243 -0
  125. package/dist/sandbox.js.map +1 -0
  126. package/dist/service-fragment-defaults.d.ts +16 -0
  127. package/dist/service-fragment-defaults.d.ts.map +1 -0
  128. package/dist/service-fragment-defaults.js +23 -0
  129. package/dist/service-fragment-defaults.js.map +1 -0
  130. package/dist/services.d.ts +81 -0
  131. package/dist/services.d.ts.map +1 -0
  132. package/dist/services.js +77 -0
  133. package/dist/services.js.map +1 -0
  134. package/dist/slack.d.ts +104 -0
  135. package/dist/slack.d.ts.map +1 -0
  136. package/dist/slack.js +98 -0
  137. package/dist/slack.js.map +1 -0
  138. package/dist/snapshot.d.ts +522 -0
  139. package/dist/snapshot.d.ts.map +1 -0
  140. package/dist/snapshot.js +104 -0
  141. package/dist/snapshot.js.map +1 -0
  142. package/dist/spec.d.ts +174 -0
  143. package/dist/spec.d.ts.map +1 -0
  144. package/dist/spec.js +173 -0
  145. package/dist/spec.js.map +1 -0
  146. package/dist/tasks.d.ts +150 -0
  147. package/dist/tasks.d.ts.map +1 -0
  148. package/dist/tasks.js +146 -0
  149. package/dist/tasks.js.map +1 -0
  150. package/dist/testing.d.ts +67 -0
  151. package/dist/testing.d.ts.map +1 -0
  152. package/dist/testing.js +64 -0
  153. package/dist/testing.js.map +1 -0
  154. package/dist/tracker.d.ts +18 -0
  155. package/dist/tracker.d.ts.map +1 -0
  156. package/dist/tracker.js +24 -0
  157. package/dist/tracker.js.map +1 -0
  158. package/dist/vendor-credentials.d.ts +37 -0
  159. package/dist/vendor-credentials.d.ts.map +1 -0
  160. package/dist/vendor-credentials.js +40 -0
  161. package/dist/vendor-credentials.js.map +1 -0
  162. package/dist/workspace-settings.d.ts +36 -0
  163. package/dist/workspace-settings.d.ts.map +1 -0
  164. package/dist/workspace-settings.js +41 -0
  165. package/dist/workspace-settings.js.map +1 -0
  166. package/package.json +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localModels.d.ts","sourceRoot":"","sources":["../src/localModels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAe5B,oFAAoF;AACpF,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAA;AAC1F,eAAO,MAAM,iBAAiB,4FAA4B,CAAA;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMpE,CAAA;AAED,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAM3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;IAInC,kEAAkE;;IAElE,oFAAoF;;;;aAIpF,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAO/E,qFAAqF;AACrF,eAAO,MAAM,8BAA8B;;;;IAIzC,oFAAoF;;;aAGpF,CAAA;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,8BAA8B,CAAC,CAAA;AAEhG,iFAAiF;AACjF,eAAO,MAAM,4BAA4B;;;;aAIvC,CAAA;AACF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAE5F,2DAA2D;AAC3D,eAAO,MAAM,kCAAkC;;IAE7C,6DAA6D;;IAE7D,+DAA+D;;aAE/D,CAAA;AACF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,kCAAkC,CAAC,CAAA"}
@@ -0,0 +1,79 @@
1
+ import * as v from 'valibot';
2
+ // ---------------------------------------------------------------------------
3
+ // Locally-run model wire contracts. A developer running cat-factory in local
4
+ // (or self-hosted Node) mode can point agents at an LLM running on their OWN
5
+ // machine — Ollama, LM Studio, llama.cpp's `llama-server`, vLLM, or any other
6
+ // OpenAI-compatible server. All expose the OpenAI `/v1/chat/completions` +
7
+ // `/v1/models` shape, so a "runner" is just a provider id + a base URL.
8
+ //
9
+ // Endpoints are configured PER USER (a runner lives on a person's machine, so
10
+ // `localhost:11434` means something different for each member) and stored in the
11
+ // DB. At run time the LLM proxy / inline model provider resolve the base URL +
12
+ // optional key by the RUN INITIATOR — exactly like personal subscriptions.
13
+ // ---------------------------------------------------------------------------
14
+ /** The supported local runner types. The runner type IS the `ModelRef.provider`. */
15
+ export const LOCAL_RUNNERS = ['ollama', 'lmstudio', 'llamacpp', 'vllm', 'custom'];
16
+ export const localRunnerSchema = v.picklist(LOCAL_RUNNERS);
17
+ /** Whether a provider id is one of the local runner types. */
18
+ export function isLocalRunner(provider) {
19
+ return LOCAL_RUNNERS.includes(provider);
20
+ }
21
+ /** Default base URL per runner, for UI prefill. `custom` has none (user supplies it). */
22
+ export const LOCAL_RUNNER_DEFAULTS = {
23
+ ollama: 'http://localhost:11434/v1',
24
+ lmstudio: 'http://localhost:1234/v1',
25
+ llamacpp: 'http://localhost:8080/v1',
26
+ vllm: 'http://localhost:8000/v1',
27
+ custom: null,
28
+ };
29
+ /** Short display label per runner, shown in the picker as the provider label. */
30
+ export const LOCAL_RUNNER_LABELS = {
31
+ ollama: 'Ollama',
32
+ lmstudio: 'LM Studio',
33
+ llamacpp: 'llama.cpp',
34
+ vllm: 'vLLM',
35
+ custom: 'Custom',
36
+ };
37
+ /**
38
+ * A user's configured local runner endpoint, as returned to the SPA. The API key is
39
+ * write-only (never returned); `hasApiKey` reports whether one is stored.
40
+ */
41
+ export const localModelEndpointSchema = v.object({
42
+ provider: localRunnerSchema,
43
+ label: v.string(),
44
+ baseUrl: v.string(),
45
+ /** Whether a (write-only) API key is stored for this endpoint. */
46
+ hasApiKey: v.boolean(),
47
+ /** The model ids the user has enabled from this runner (surfaced in the picker). */
48
+ models: v.array(v.string()),
49
+ createdAt: v.number(),
50
+ updatedAt: v.number(),
51
+ });
52
+ const baseUrlSchema = v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(300), v.url());
53
+ const labelSchema = v.pipe(v.string(), v.trim(), v.maxLength(60));
54
+ const apiKeySchema = v.pipe(v.string(), v.maxLength(400));
55
+ const modelIdSchema = v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(200));
56
+ /** Create or replace the signed-in user's endpoint for a runner (one per runner). */
57
+ export const upsertLocalModelEndpointSchema = v.object({
58
+ provider: localRunnerSchema,
59
+ label: v.optional(labelSchema),
60
+ baseUrl: baseUrlSchema,
61
+ /** Optional bearer key (most local runners ignore it); stored encrypted at rest. */
62
+ apiKey: v.optional(apiKeySchema),
63
+ models: v.array(modelIdSchema),
64
+ });
65
+ /** Probe a runner endpoint for reachability + the models it currently serves. */
66
+ export const testLocalModelEndpointSchema = v.object({
67
+ provider: localRunnerSchema,
68
+ baseUrl: baseUrlSchema,
69
+ apiKey: v.optional(apiKeySchema),
70
+ });
71
+ /** The result of probing a runner endpoint's `/models`. */
72
+ export const localModelEndpointTestResultSchema = v.object({
73
+ reachable: v.boolean(),
74
+ /** Model ids the runner reports (empty when unreachable). */
75
+ models: v.array(v.string()),
76
+ /** Human-readable failure reason when `reachable` is false. */
77
+ error: v.optional(v.string()),
78
+ });
79
+ //# sourceMappingURL=localModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localModels.js","sourceRoot":"","sources":["../src/localModels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import * as v from 'valibot';
2
+ /**
3
+ * A `merger` agent's structured assessment of a pull request. Each axis is scored
4
+ * 0..1 (higher = more complex / riskier / higher blast-radius); `rationale` is the
5
+ * agent's prose justification, surfaced to a human when the PR needs review.
6
+ */
7
+ /**
8
+ * The severity threshold a task tolerates from the requirements reviewer before it stops
9
+ * for a human. Mirrors the review item severities (`low`/`medium`/`high`) plus `none`,
10
+ * which tolerates nothing. Ordered none < low < medium < high.
11
+ */
12
+ export declare const requirementConcernLevelSchema: v.PicklistSchema<["none", "low", "medium", "high"], undefined>;
13
+ export type RequirementConcernLevel = v.InferOutput<typeof requirementConcernLevelSchema>;
14
+ /** Rank of a {@link RequirementConcernLevel} for "at or below" comparisons. */
15
+ export declare const REQUIREMENT_CONCERN_RANK: Record<RequirementConcernLevel, number>;
16
+ export declare const mergeAssessmentSchema: v.ObjectSchema<{
17
+ /** How intricate the change is (size, coupling, subtlety). */
18
+ readonly complexity: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
19
+ /** Likelihood the change breaks something (test coverage, fragility). */
20
+ readonly risk: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
21
+ /** Blast radius if it does break (how much/who it affects). */
22
+ readonly impact: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
23
+ /** The agent's plain-prose justification for the scores + a merge recommendation. */
24
+ readonly rationale: v.StringSchema<undefined>;
25
+ }, undefined>;
26
+ export type MergeAssessment = v.InferOutput<typeof mergeAssessmentSchema>;
27
+ /**
28
+ * A named, per-workspace merge policy: the upper bounds (0..1) a PR's assessment
29
+ * must stay within to auto-merge, plus the CI-fixer attempt budget. Exactly one
30
+ * preset per workspace is the default (`isDefault`), used by any task that has not
31
+ * picked one explicitly.
32
+ */
33
+ export declare const mergeThresholdPresetSchema: v.ObjectSchema<{
34
+ readonly id: v.StringSchema<undefined>;
35
+ readonly name: v.StringSchema<undefined>;
36
+ /** Auto-merge only when the assessment's complexity is at or below this. */
37
+ readonly maxComplexity: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
38
+ /** Auto-merge only when the assessment's risk is at or below this. */
39
+ readonly maxRisk: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
40
+ /** Auto-merge only when the assessment's impact is at or below this. */
41
+ readonly maxImpact: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
42
+ /** How many times the `ci-fixer` agent may try to turn CI green before giving up. */
43
+ readonly ciMaxAttempts: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
44
+ /**
45
+ * How many reviewer passes the iterative requirements-review loop may run before it
46
+ * stops on its own and asks the human to pick (extra round / proceed anyway / reset the
47
+ * task). One reviewer pass = one iteration; the initial review counts as iteration 1.
48
+ */
49
+ readonly maxRequirementIterations: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
50
+ /**
51
+ * The highest finding severity the requirements review tolerates WITHOUT stopping. When
52
+ * every outstanding finding from a reviewer pass is at or below this level, the findings
53
+ * are recorded but the run does NOT pause for human approval — the incorporation
54
+ * companion is skipped and the next pipeline step runs automatically. `none` (the
55
+ * default) tolerates nothing, so any finding pauses for a human; `high` tolerates
56
+ * everything. Severity order: none < low < medium < high.
57
+ */
58
+ readonly maxRequirementConcernAllowed: v.PicklistSchema<["none", "low", "medium", "high"], undefined>;
59
+ /**
60
+ * How long (minutes) the post-release-health gate watches the deployed release's
61
+ * Datadog monitors/SLOs before declaring it healthy and advancing.
62
+ */
63
+ readonly releaseWatchWindowMinutes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>]>;
64
+ /**
65
+ * How many `on-call` investigations the post-release-health gate may dispatch while
66
+ * watching before it gives up and raises a notification. The on-call agent investigates
67
+ * rather than fixing prod, so 1 is the sensible default.
68
+ */
69
+ readonly releaseMaxAttempts: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
70
+ /** The workspace's fallback preset, used by tasks that pick none. Exactly one is true. */
71
+ readonly isDefault: v.BooleanSchema<undefined>;
72
+ readonly createdAt: v.NumberSchema<undefined>;
73
+ }, undefined>;
74
+ export type MergeThresholdPreset = v.InferOutput<typeof mergeThresholdPresetSchema>;
75
+ /** Create a new merge threshold preset in a workspace. */
76
+ export declare const createMergePresetSchema: v.ObjectSchema<{
77
+ readonly name: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 60, undefined>]>;
78
+ readonly maxComplexity: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
79
+ readonly maxRisk: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
80
+ readonly maxImpact: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
81
+ readonly ciMaxAttempts: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 50, undefined>]>;
82
+ readonly maxRequirementIterations: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 20, undefined>]>;
83
+ readonly maxRequirementConcernAllowed: v.PicklistSchema<["none", "low", "medium", "high"], undefined>;
84
+ readonly releaseWatchWindowMinutes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 720, undefined>]>, 30>;
85
+ readonly releaseMaxAttempts: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 10, undefined>]>, 1>;
86
+ /** Make this the workspace default (demotes the previous default). */
87
+ readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
88
+ }, undefined>;
89
+ export type CreateMergePresetInput = v.InferOutput<typeof createMergePresetSchema>;
90
+ /** Patch an existing merge threshold preset (all fields optional). */
91
+ export declare const updateMergePresetSchema: v.ObjectSchema<{
92
+ readonly name: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 60, undefined>]>, undefined>;
93
+ readonly maxComplexity: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>, undefined>;
94
+ readonly maxRisk: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>, undefined>;
95
+ readonly maxImpact: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>, undefined>;
96
+ readonly ciMaxAttempts: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 50, undefined>]>, undefined>;
97
+ readonly maxRequirementIterations: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 20, undefined>]>, undefined>;
98
+ readonly maxRequirementConcernAllowed: v.OptionalSchema<v.PicklistSchema<["none", "low", "medium", "high"], undefined>, undefined>;
99
+ readonly releaseWatchWindowMinutes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 720, undefined>]>, undefined>;
100
+ readonly releaseMaxAttempts: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 10, undefined>]>, undefined>;
101
+ readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
102
+ }, undefined>;
103
+ export type UpdateMergePresetInput = v.InferOutput<typeof updateMergePresetSchema>;
104
+ /** Parse-or-throw an assessment payload an agent returned (the engine validates it). */
105
+ export declare function parseMergeAssessment(value: unknown): MergeAssessment;
106
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAiB5B;;;;GAIG;AACH;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,gEAAgD,CAAA;AAC1F,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,6BAA6B,CAAC,CAAA;AAEzF,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAK5E,CAAA;AAED,eAAO,MAAM,qBAAqB;IAChC,8DAA8D;;IAE9D,yEAAyE;;IAEzE,+DAA+D;;IAE/D,qFAAqF;;aAErF,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;IAGrC,4EAA4E;;IAE5E,sEAAsE;;IAEtE,wEAAwE;;IAExE,qFAAqF;;IAErF;;;;OAIG;;IAEH;;;;;;;OAOG;;IAEH;;;OAGG;;IAEH;;;;OAIG;;IAEH,0FAA0F;;;aAG1F,CAAA;AACF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAWnF,0DAA0D;AAC1D,eAAO,MAAM,uBAAuB;;;;;;;;;;IAUlC,sEAAsE;;aAEtE,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAElF,sEAAsE;AACtE,eAAO,MAAM,uBAAuB;;;;;;;;;;;aAWlC,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAElF,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAEpE"}
package/dist/merge.js ADDED
@@ -0,0 +1,129 @@
1
+ import * as v from 'valibot';
2
+ // ---------------------------------------------------------------------------
3
+ // Merge-policy wire contracts. After a pipeline's implementation work is done
4
+ // and CI is green, a `merger` agent assesses the pull request along three axes —
5
+ // complexity, risk and impact (each scored 0..1) — and the engine compares those
6
+ // scores against the task's resolved *merge threshold preset*. If every score is
7
+ // at or below its configured ceiling the PR is merged automatically; otherwise a
8
+ // `merge_review` notification is raised for a human to act on.
9
+ //
10
+ // Presets are authored per workspace (a small library of named policies, e.g.
11
+ // "Cautious", "Trusted") and one is selected per task; a task with no explicit
12
+ // selection resolves to the workspace's default preset. The preset also carries
13
+ // the CI-fixer attempt budget (how many times the `ci-fixer` agent may try to get
14
+ // CI green before the run gives up).
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * A `merger` agent's structured assessment of a pull request. Each axis is scored
18
+ * 0..1 (higher = more complex / riskier / higher blast-radius); `rationale` is the
19
+ * agent's prose justification, surfaced to a human when the PR needs review.
20
+ */
21
+ /**
22
+ * The severity threshold a task tolerates from the requirements reviewer before it stops
23
+ * for a human. Mirrors the review item severities (`low`/`medium`/`high`) plus `none`,
24
+ * which tolerates nothing. Ordered none < low < medium < high.
25
+ */
26
+ export const requirementConcernLevelSchema = v.picklist(['none', 'low', 'medium', 'high']);
27
+ /** Rank of a {@link RequirementConcernLevel} for "at or below" comparisons. */
28
+ export const REQUIREMENT_CONCERN_RANK = {
29
+ none: 0,
30
+ low: 1,
31
+ medium: 2,
32
+ high: 3,
33
+ };
34
+ export const mergeAssessmentSchema = v.object({
35
+ /** How intricate the change is (size, coupling, subtlety). */
36
+ complexity: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
37
+ /** Likelihood the change breaks something (test coverage, fragility). */
38
+ risk: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
39
+ /** Blast radius if it does break (how much/who it affects). */
40
+ impact: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
41
+ /** The agent's plain-prose justification for the scores + a merge recommendation. */
42
+ rationale: v.string(),
43
+ });
44
+ /**
45
+ * A named, per-workspace merge policy: the upper bounds (0..1) a PR's assessment
46
+ * must stay within to auto-merge, plus the CI-fixer attempt budget. Exactly one
47
+ * preset per workspace is the default (`isDefault`), used by any task that has not
48
+ * picked one explicitly.
49
+ */
50
+ export const mergeThresholdPresetSchema = v.object({
51
+ id: v.string(),
52
+ name: v.string(),
53
+ /** Auto-merge only when the assessment's complexity is at or below this. */
54
+ maxComplexity: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
55
+ /** Auto-merge only when the assessment's risk is at or below this. */
56
+ maxRisk: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
57
+ /** Auto-merge only when the assessment's impact is at or below this. */
58
+ maxImpact: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
59
+ /** How many times the `ci-fixer` agent may try to turn CI green before giving up. */
60
+ ciMaxAttempts: v.pipe(v.number(), v.integer(), v.minValue(0)),
61
+ /**
62
+ * How many reviewer passes the iterative requirements-review loop may run before it
63
+ * stops on its own and asks the human to pick (extra round / proceed anyway / reset the
64
+ * task). One reviewer pass = one iteration; the initial review counts as iteration 1.
65
+ */
66
+ maxRequirementIterations: v.pipe(v.number(), v.integer(), v.minValue(1)),
67
+ /**
68
+ * The highest finding severity the requirements review tolerates WITHOUT stopping. When
69
+ * every outstanding finding from a reviewer pass is at or below this level, the findings
70
+ * are recorded but the run does NOT pause for human approval — the incorporation
71
+ * companion is skipped and the next pipeline step runs automatically. `none` (the
72
+ * default) tolerates nothing, so any finding pauses for a human; `high` tolerates
73
+ * everything. Severity order: none < low < medium < high.
74
+ */
75
+ maxRequirementConcernAllowed: requirementConcernLevelSchema,
76
+ /**
77
+ * How long (minutes) the post-release-health gate watches the deployed release's
78
+ * Datadog monitors/SLOs before declaring it healthy and advancing.
79
+ */
80
+ releaseWatchWindowMinutes: v.pipe(v.number(), v.integer(), v.minValue(1)),
81
+ /**
82
+ * How many `on-call` investigations the post-release-health gate may dispatch while
83
+ * watching before it gives up and raises a notification. The on-call agent investigates
84
+ * rather than fixing prod, so 1 is the sensible default.
85
+ */
86
+ releaseMaxAttempts: v.pipe(v.number(), v.integer(), v.minValue(0)),
87
+ /** The workspace's fallback preset, used by tasks that pick none. Exactly one is true. */
88
+ isDefault: v.boolean(),
89
+ createdAt: v.number(),
90
+ });
91
+ // ---- Request bodies -------------------------------------------------------
92
+ const presetNameSchema = v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(60));
93
+ const scoreSchema = v.pipe(v.number(), v.minValue(0), v.maxValue(1));
94
+ const attemptsSchema = v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(50));
95
+ const iterationsSchema = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(20));
96
+ const releaseWindowSchema = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(720));
97
+ const releaseAttemptsSchema = v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(10));
98
+ /** Create a new merge threshold preset in a workspace. */
99
+ export const createMergePresetSchema = v.object({
100
+ name: presetNameSchema,
101
+ maxComplexity: scoreSchema,
102
+ maxRisk: scoreSchema,
103
+ maxImpact: scoreSchema,
104
+ ciMaxAttempts: attemptsSchema,
105
+ maxRequirementIterations: iterationsSchema,
106
+ maxRequirementConcernAllowed: requirementConcernLevelSchema,
107
+ releaseWatchWindowMinutes: v.optional(releaseWindowSchema, 30),
108
+ releaseMaxAttempts: v.optional(releaseAttemptsSchema, 1),
109
+ /** Make this the workspace default (demotes the previous default). */
110
+ isDefault: v.optional(v.boolean(), false),
111
+ });
112
+ /** Patch an existing merge threshold preset (all fields optional). */
113
+ export const updateMergePresetSchema = v.object({
114
+ name: v.optional(presetNameSchema),
115
+ maxComplexity: v.optional(scoreSchema),
116
+ maxRisk: v.optional(scoreSchema),
117
+ maxImpact: v.optional(scoreSchema),
118
+ ciMaxAttempts: v.optional(attemptsSchema),
119
+ maxRequirementIterations: v.optional(iterationsSchema),
120
+ maxRequirementConcernAllowed: v.optional(requirementConcernLevelSchema),
121
+ releaseWatchWindowMinutes: v.optional(releaseWindowSchema),
122
+ releaseMaxAttempts: v.optional(releaseAttemptsSchema),
123
+ isDefault: v.optional(v.boolean()),
124
+ });
125
+ /** Parse-or-throw an assessment payload an agent returned (the engine validates it). */
126
+ export function parseMergeAssessment(value) {
127
+ return v.parse(mergeAssessmentSchema, value);
128
+ }
129
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as v from 'valibot';
2
+ /**
3
+ * A workspace's per-agent-kind default models: a map from agent kind to the model
4
+ * catalog id it should default to. A kind absent from the map falls back to the
5
+ * env routing for that kind. Sent on the wire as the workspace's full selection.
6
+ */
7
+ export declare const modelDefaultsSchema: v.ObjectSchema<{
8
+ readonly defaults: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
9
+ }, undefined>;
10
+ export type ModelDefaults = v.InferOutput<typeof modelDefaultsSchema>;
11
+ /**
12
+ * Replace a workspace's per-kind default models. Sending the full map replaces it
13
+ * wholesale (a kind omitted is cleared). Keys (agent kinds) and values (model ids)
14
+ * are both trimmed and must be non-empty — agent kinds are an open set (custom
15
+ * agents are allowed), so keys aren't checked against a closed list, and model ids
16
+ * aren't validated against the catalog here (an unresolvable id simply falls back
17
+ * to the env routing at run time).
18
+ */
19
+ export declare const setModelDefaultsSchema: v.ObjectSchema<{
20
+ readonly defaults: v.RecordSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>, undefined>;
21
+ }, undefined>;
22
+ export type SetModelDefaultsInput = v.InferOutput<typeof setModelDefaultsSchema>;
23
+ //# sourceMappingURL=model-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-defaults.d.ts","sourceRoot":"","sources":["../src/model-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAe5B;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;aAE9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAIrE;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;;aAKjC,CAAA;AACF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA"}
@@ -0,0 +1,34 @@
1
+ import * as v from 'valibot';
2
+ // ---------------------------------------------------------------------------
3
+ // Per-workspace, per-agent-kind default model selection. A workspace can choose
4
+ // which model is the default for each agent kind (e.g. point `architect` at a
5
+ // strong model and `tester` at a cheap one), overriding the env-driven
6
+ // `AGENT_routing` for that workspace at runtime. The map is keyed by agent kind
7
+ // and valued by a model catalog id (the `ModelOption.id` from `GET /models`).
8
+ //
9
+ // Resolution precedence at run time is: a block's explicitly pinned model wins,
10
+ // else this workspace per-kind default, else the env routing for the kind, else
11
+ // the env default. So this map only fills the gap between "no per-task pin" and
12
+ // "the deployment-wide routing".
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * A workspace's per-agent-kind default models: a map from agent kind to the model
16
+ * catalog id it should default to. A kind absent from the map falls back to the
17
+ * env routing for that kind. Sent on the wire as the workspace's full selection.
18
+ */
19
+ export const modelDefaultsSchema = v.object({
20
+ defaults: v.record(v.string(), v.string()),
21
+ });
22
+ // ---- Request bodies -------------------------------------------------------
23
+ /**
24
+ * Replace a workspace's per-kind default models. Sending the full map replaces it
25
+ * wholesale (a kind omitted is cleared). Keys (agent kinds) and values (model ids)
26
+ * are both trimmed and must be non-empty — agent kinds are an open set (custom
27
+ * agents are allowed), so keys aren't checked against a closed list, and model ids
28
+ * aren't validated against the catalog here (an unresolvable id simply falls back
29
+ * to the env routing at run time).
30
+ */
31
+ export const setModelDefaultsSchema = v.object({
32
+ defaults: v.record(v.pipe(v.string(), v.trim(), v.minLength(1)), v.pipe(v.string(), v.trim(), v.minLength(1))),
33
+ });
34
+ //# sourceMappingURL=model-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-defaults.js","sourceRoot":"","sources":["../src/model-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,uEAAuE;AACvE,gFAAgF;AAChF,8EAA8E;AAC9E,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAChF,iCAAiC;AACjC,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CAC3C,CAAC,CAAA;AAGF,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAChB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC5C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAC7C;CACF,CAAC,CAAA"}
@@ -0,0 +1,136 @@
1
+ import * as v from 'valibot';
2
+ /**
3
+ * The kind of human-actionable event a notification represents. A closed set so
4
+ * the frontend can switch on it to render the right action; extending it is a
5
+ * one-line change here plus a handler in the worker's `act` route.
6
+ */
7
+ export declare const notificationTypeSchema: v.PicklistSchema<["merge_review", "pipeline_complete", "ci_failed", "test_failed", "requirement_review", "clarity_review", "release_regression", "decision_required"], undefined>;
8
+ export type NotificationType = v.InferOutput<typeof notificationTypeSchema>;
9
+ /**
10
+ * Lifecycle of a notification: `open` until a human engages, terminal `acted`
11
+ * once its action ran (merged, confirmed, retried…), or `dismissed` when waved
12
+ * off. Only `open` notifications surface on the board.
13
+ */
14
+ export declare const notificationStatusSchema: v.PicklistSchema<["open", "acted", "dismissed"], undefined>;
15
+ export type NotificationStatus = v.InferOutput<typeof notificationStatusSchema>;
16
+ /**
17
+ * How urgently a notification is rendered. A notification starts `normal` (the
18
+ * inbox's usual per-type color) and is escalated to `urgent` (red) by the periodic
19
+ * sweep once it has been waiting for a human longer than the workspace's
20
+ * `waitingEscalationMinutes` threshold. This is the run-timing signal that replaced
21
+ * the old hard "decision timeout" auto-fail: runs now wait indefinitely, and the
22
+ * notification colour — not a killed run — conveys that a human is overdue.
23
+ */
24
+ export declare const notificationSeveritySchema: v.PicklistSchema<["normal", "urgent"], undefined>;
25
+ export type NotificationSeverity = v.InferOutput<typeof notificationSeveritySchema>;
26
+ /**
27
+ * Optional structured detail a notification carries for rendering its card —
28
+ * e.g. a `merge_review` carries the agent's assessment + the PR it concerns. Kept
29
+ * deliberately small and additive so new notification types can attach their own
30
+ * context without a schema migration.
31
+ */
32
+ export declare const notificationPayloadSchema: v.ObjectSchema<{
33
+ /** The `merger` agent's assessment, on a `merge_review`. */
34
+ readonly assessment: v.OptionalSchema<v.ObjectSchema<{
35
+ readonly complexity: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
36
+ readonly risk: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
37
+ readonly impact: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
38
+ readonly rationale: v.StringSchema<undefined>;
39
+ }, undefined>, undefined>;
40
+ /** Web URL of the PR the notification concerns, when one is known. */
41
+ readonly prUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
42
+ /** The pipeline run that raised it, for display ("from the Full build run"). */
43
+ readonly pipelineName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
44
+ /** Number of open findings, on a `requirement_review`. */
45
+ readonly findingCount: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
46
+ /** The `on-call` agent's assessment, on a `release_regression`. */
47
+ readonly onCallAssessment: v.OptionalSchema<v.ObjectSchema<{
48
+ readonly culpritConfidence: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
49
+ readonly recommendation: v.PicklistSchema<["revert", "hold", "monitor"], undefined>;
50
+ readonly rationale: v.StringSchema<undefined>;
51
+ readonly evidence: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, readonly []>;
52
+ }, undefined>, undefined>;
53
+ /** The monitors/SLOs that regressed, on a `release_regression`. */
54
+ readonly releaseSignals: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
55
+ readonly kind: v.PicklistSchema<["monitor", "slo"], undefined>;
56
+ readonly id: v.StringSchema<undefined>;
57
+ readonly name: v.StringSchema<undefined>;
58
+ readonly state: v.PicklistSchema<["ok", "warn", "alert", "no_data"], undefined>;
59
+ readonly detail: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
60
+ }, undefined>, undefined>, undefined>;
61
+ /** Web URL of a proposed revert PR the human can open/merge, when known. */
62
+ readonly revertUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
63
+ /**
64
+ * Internal user id (`usr_*`) of the member this notification is directed at — the
65
+ * task's responsible product person on a `requirement_review`. The inbox highlights
66
+ * it as "for you"; the notification stays workspace-visible to everyone.
67
+ */
68
+ readonly targetUserId: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
69
+ }, undefined>;
70
+ export type NotificationPayload = v.InferOutput<typeof notificationPayloadSchema>;
71
+ /** A human-actionable item surfaced on the board. */
72
+ export declare const notificationSchema: v.ObjectSchema<{
73
+ readonly id: v.StringSchema<undefined>;
74
+ readonly type: v.PicklistSchema<["merge_review", "pipeline_complete", "ci_failed", "test_failed", "requirement_review", "clarity_review", "release_regression", "decision_required"], undefined>;
75
+ readonly status: v.PicklistSchema<["open", "acted", "dismissed"], undefined>;
76
+ /**
77
+ * Render urgency (see {@link notificationSeveritySchema}). Absent ⇒ `normal`. Flipped
78
+ * to `urgent` by the escalation sweep once it has waited past the workspace threshold.
79
+ */
80
+ readonly severity: v.OptionalSchema<v.PicklistSchema<["normal", "urgent"], undefined>, undefined>;
81
+ /** The block (task/frame) the notification is about; null for workspace-wide. */
82
+ readonly blockId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
83
+ /** The execution run that raised it, when applicable. */
84
+ readonly executionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
85
+ /** Short headline shown on the card. */
86
+ readonly title: v.StringSchema<undefined>;
87
+ /** Longer prose body / context. */
88
+ readonly body: v.StringSchema<undefined>;
89
+ /** Optional structured detail for rendering (see {@link notificationPayloadSchema}). */
90
+ readonly payload: v.OptionalSchema<v.NullableSchema<v.ObjectSchema<{
91
+ /** The `merger` agent's assessment, on a `merge_review`. */
92
+ readonly assessment: v.OptionalSchema<v.ObjectSchema<{
93
+ readonly complexity: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
94
+ readonly risk: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
95
+ readonly impact: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
96
+ readonly rationale: v.StringSchema<undefined>;
97
+ }, undefined>, undefined>;
98
+ /** Web URL of the PR the notification concerns, when one is known. */
99
+ readonly prUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
100
+ /** The pipeline run that raised it, for display ("from the Full build run"). */
101
+ readonly pipelineName: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
102
+ /** Number of open findings, on a `requirement_review`. */
103
+ readonly findingCount: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
104
+ /** The `on-call` agent's assessment, on a `release_regression`. */
105
+ readonly onCallAssessment: v.OptionalSchema<v.ObjectSchema<{
106
+ readonly culpritConfidence: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 1, undefined>]>;
107
+ readonly recommendation: v.PicklistSchema<["revert", "hold", "monitor"], undefined>;
108
+ readonly rationale: v.StringSchema<undefined>;
109
+ readonly evidence: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, readonly []>;
110
+ }, undefined>, undefined>;
111
+ /** The monitors/SLOs that regressed, on a `release_regression`. */
112
+ readonly releaseSignals: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
113
+ readonly kind: v.PicklistSchema<["monitor", "slo"], undefined>;
114
+ readonly id: v.StringSchema<undefined>;
115
+ readonly name: v.StringSchema<undefined>;
116
+ readonly state: v.PicklistSchema<["ok", "warn", "alert", "no_data"], undefined>;
117
+ readonly detail: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
118
+ }, undefined>, undefined>, undefined>;
119
+ /** Web URL of a proposed revert PR the human can open/merge, when known. */
120
+ readonly revertUrl: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
121
+ /**
122
+ * Internal user id (`usr_*`) of the member this notification is directed at — the
123
+ * task's responsible product person on a `requirement_review`. The inbox highlights
124
+ * it as "for you"; the notification stays workspace-visible to everyone.
125
+ */
126
+ readonly targetUserId: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
127
+ }, undefined>, undefined>, undefined>;
128
+ readonly createdAt: v.NumberSchema<undefined>;
129
+ /** When it left `open` (acted/dismissed); null while open. */
130
+ readonly resolvedAt: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
131
+ }, undefined>;
132
+ export type Notification = v.InferOutput<typeof notificationSchema>;
133
+ /** How a human resolved a notification from its card. */
134
+ export declare const resolveNotificationActionSchema: v.PicklistSchema<["act", "dismiss"], undefined>;
135
+ export type ResolveNotificationAction = v.InferOutput<typeof resolveNotificationActionSchema>;
136
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAyC5B;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mLASjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,6DAA6C,CAAA;AAClF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,mDAAmC,CAAA;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAEnF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;IACpC,4DAA4D;;;;;;;IAE5D,sEAAsE;;IAEtE,gFAAgF;;IAEhF,0DAA0D;;IAE1D,mEAAmE;;;;;;;IAEnE,mEAAmE;;;;;;;;IAEnE,4EAA4E;;IAE5E;;;;OAIG;;aAEH,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAEjF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB;;;;IAI7B;;;OAGG;;IAEH,iFAAiF;;IAEjF,yDAAyD;;IAEzD,wCAAwC;;IAExC,mCAAmC;;IAEnC,wFAAwF;;QAzCxF,4DAA4D;;;;;;;QAE5D,sEAAsE;;QAEtE,gFAAgF;;QAEhF,0DAA0D;;QAE1D,mEAAmE;;;;;;;QAEnE,mEAAmE;;;;;;;;QAEnE,4EAA4E;;QAE5E;;;;WAIG;;;;IA0BH,8DAA8D;;aAE9D,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAInE,yDAAyD;AACzD,eAAO,MAAM,+BAA+B,iDAAiC,CAAA;AAC7E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,+BAA+B,CAAC,CAAA"}