@kognai/orchestrator-core 0.1.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 (144) hide show
  1. package/README.md +44 -0
  2. package/dist/index.d.ts +63 -0
  3. package/dist/index.js +175 -0
  4. package/dist/lib/aar-middleware.d.ts +6 -0
  5. package/dist/lib/aar-middleware.js +70 -0
  6. package/dist/lib/aar-types.d.ts +34 -0
  7. package/dist/lib/aar-types.js +4 -0
  8. package/dist/lib/acp-engine.d.ts +68 -0
  9. package/dist/lib/acp-engine.js +123 -0
  10. package/dist/lib/acp.d.ts +61 -0
  11. package/dist/lib/acp.js +425 -0
  12. package/dist/lib/agent-registry.d.ts +50 -0
  13. package/dist/lib/agent-registry.js +137 -0
  14. package/dist/lib/anthropic-direct.d.ts +27 -0
  15. package/dist/lib/anthropic-direct.js +109 -0
  16. package/dist/lib/asmr-extractor.d.ts +40 -0
  17. package/dist/lib/asmr-extractor.js +151 -0
  18. package/dist/lib/asmr-retrieval.d.ts +76 -0
  19. package/dist/lib/asmr-retrieval.js +311 -0
  20. package/dist/lib/asmr.d.ts +8 -0
  21. package/dist/lib/asmr.js +24 -0
  22. package/dist/lib/brainx-client.d.ts +72 -0
  23. package/dist/lib/brainx-client.js +200 -0
  24. package/dist/lib/brainx-embed.d.ts +14 -0
  25. package/dist/lib/brainx-embed.js +139 -0
  26. package/dist/lib/brainx-swarm-bridge.d.ts +93 -0
  27. package/dist/lib/brainx-swarm-bridge.js +242 -0
  28. package/dist/lib/byterover-client.d.ts +19 -0
  29. package/dist/lib/byterover-client.js +59 -0
  30. package/dist/lib/ceo-wallet.d.ts +37 -0
  31. package/dist/lib/ceo-wallet.js +176 -0
  32. package/dist/lib/chomsky-gate.d.ts +24 -0
  33. package/dist/lib/chomsky-gate.js +178 -0
  34. package/dist/lib/chomsky-runner.d.ts +29 -0
  35. package/dist/lib/chomsky-runner.js +157 -0
  36. package/dist/lib/citizen-score-contract.d.ts +72 -0
  37. package/dist/lib/citizen-score-contract.js +16 -0
  38. package/dist/lib/citizen-score-registry.d.ts +25 -0
  39. package/dist/lib/citizen-score-registry.js +65 -0
  40. package/dist/lib/citizenship.d.ts +103 -0
  41. package/dist/lib/citizenship.js +272 -0
  42. package/dist/lib/clawrouter-client.d.ts +37 -0
  43. package/dist/lib/clawrouter-client.js +148 -0
  44. package/dist/lib/code-asset-crystalliser.d.ts +41 -0
  45. package/dist/lib/code-asset-crystalliser.js +181 -0
  46. package/dist/lib/code-failure-logger.d.ts +27 -0
  47. package/dist/lib/code-failure-logger.js +42 -0
  48. package/dist/lib/cto-approval-gate.d.ts +45 -0
  49. package/dist/lib/cto-approval-gate.js +478 -0
  50. package/dist/lib/cto-gate-types.d.ts +28 -0
  51. package/dist/lib/cto-gate-types.js +8 -0
  52. package/dist/lib/decomposer-feedback.d.ts +54 -0
  53. package/dist/lib/decomposer-feedback.js +115 -0
  54. package/dist/lib/emotional-safety-gate.d.ts +48 -0
  55. package/dist/lib/emotional-safety-gate.js +97 -0
  56. package/dist/lib/engine-paths.d.ts +13 -0
  57. package/dist/lib/engine-paths.js +32 -0
  58. package/dist/lib/event-bus-listener.d.ts +8 -0
  59. package/dist/lib/event-bus-listener.js +144 -0
  60. package/dist/lib/event-bus-publisher.d.ts +25 -0
  61. package/dist/lib/event-bus-publisher.js +188 -0
  62. package/dist/lib/event-bus-types.d.ts +73 -0
  63. package/dist/lib/event-bus-types.js +23 -0
  64. package/dist/lib/failure-library.d.ts +178 -0
  65. package/dist/lib/failure-library.js +349 -0
  66. package/dist/lib/ksl/error-log.d.ts +28 -0
  67. package/dist/lib/ksl/error-log.js +43 -0
  68. package/dist/lib/ksl/index.d.ts +9 -0
  69. package/dist/lib/ksl/index.js +25 -0
  70. package/dist/lib/ksl/orchestrator-tap.d.ts +16 -0
  71. package/dist/lib/ksl/orchestrator-tap.js +85 -0
  72. package/dist/lib/ksl/record-writer.d.ts +46 -0
  73. package/dist/lib/ksl/record-writer.js +45 -0
  74. package/dist/lib/llm-cost-table.d.ts +36 -0
  75. package/dist/lib/llm-cost-table.js +90 -0
  76. package/dist/lib/local-model-router.d.ts +27 -0
  77. package/dist/lib/local-model-router.js +61 -0
  78. package/dist/lib/mc-client.d.ts +51 -0
  79. package/dist/lib/mc-client.js +249 -0
  80. package/dist/lib/model-router-contract.d.ts +91 -0
  81. package/dist/lib/model-router-contract.js +19 -0
  82. package/dist/lib/model-router-registry.d.ts +24 -0
  83. package/dist/lib/model-router-registry.js +52 -0
  84. package/dist/lib/model-router.d.ts +20 -0
  85. package/dist/lib/model-router.js +79 -0
  86. package/dist/lib/monotask-state-machine.d.ts +19 -0
  87. package/dist/lib/monotask-state-machine.js +131 -0
  88. package/dist/lib/neutral-prompt-checker.d.ts +22 -0
  89. package/dist/lib/neutral-prompt-checker.js +130 -0
  90. package/dist/lib/notion-direct.d.ts +92 -0
  91. package/dist/lib/notion-direct.js +381 -0
  92. package/dist/lib/ollama-client.d.ts +37 -0
  93. package/dist/lib/ollama-client.js +158 -0
  94. package/dist/lib/omel/credential-vault.d.ts +57 -0
  95. package/dist/lib/omel/credential-vault.js +324 -0
  96. package/dist/lib/omel/human-brake.d.ts +32 -0
  97. package/dist/lib/omel/human-brake.js +289 -0
  98. package/dist/lib/omel/index.d.ts +10 -0
  99. package/dist/lib/omel/index.js +26 -0
  100. package/dist/lib/omel/phantom-workspace.d.ts +31 -0
  101. package/dist/lib/omel/phantom-workspace.js +256 -0
  102. package/dist/lib/omel/wipe-witness.d.ts +75 -0
  103. package/dist/lib/omel/wipe-witness.js +398 -0
  104. package/dist/lib/orchestrate-engine.d.ts +25 -0
  105. package/dist/lib/orchestrate-engine.js +4436 -0
  106. package/dist/lib/perm-judge.d.ts +46 -0
  107. package/dist/lib/perm-judge.js +173 -0
  108. package/dist/lib/plumber/conformance.d.ts +54 -0
  109. package/dist/lib/plumber/conformance.js +121 -0
  110. package/dist/lib/plumber/index.d.ts +9 -0
  111. package/dist/lib/plumber/index.js +25 -0
  112. package/dist/lib/plumber/observer.d.ts +52 -0
  113. package/dist/lib/plumber/observer.js +180 -0
  114. package/dist/lib/plumber/types.d.ts +78 -0
  115. package/dist/lib/plumber/types.js +29 -0
  116. package/dist/lib/research-impl-gate.d.ts +16 -0
  117. package/dist/lib/research-impl-gate.js +105 -0
  118. package/dist/lib/sherlock-memory.d.ts +29 -0
  119. package/dist/lib/sherlock-memory.js +105 -0
  120. package/dist/lib/skill-crystalliser.d.ts +44 -0
  121. package/dist/lib/skill-crystalliser.js +60 -0
  122. package/dist/lib/sprint-runner-engine.d.ts +27 -0
  123. package/dist/lib/sprint-runner-engine.js +1042 -0
  124. package/dist/lib/sprint-state.d.ts +71 -0
  125. package/dist/lib/sprint-state.js +202 -0
  126. package/dist/lib/stuck-handler.d.ts +17 -0
  127. package/dist/lib/stuck-handler.js +249 -0
  128. package/dist/lib/task-contract-checker.d.ts +17 -0
  129. package/dist/lib/task-contract-checker.js +29 -0
  130. package/dist/lib/task-router/index.d.ts +17 -0
  131. package/dist/lib/task-router/index.js +52 -0
  132. package/dist/lib/task-router/router/generate-execution-id.d.ts +10 -0
  133. package/dist/lib/task-router/router/generate-execution-id.js +24 -0
  134. package/dist/lib/task-router/router/resolve-route.d.ts +2 -0
  135. package/dist/lib/task-router/router/resolve-route.js +49 -0
  136. package/dist/lib/task-router/types.d.ts +79 -0
  137. package/dist/lib/task-router/types.js +39 -0
  138. package/dist/lib/token-budget-validator.d.ts +44 -0
  139. package/dist/lib/token-budget-validator.js +84 -0
  140. package/dist/lib/trust-score-updater.d.ts +30 -0
  141. package/dist/lib/trust-score-updater.js +107 -0
  142. package/dist/lib/wallet-state.d.ts +26 -0
  143. package/dist/lib/wallet-state.js +85 -0
  144. package/package.json +27 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.publishEvent = publishEvent;
37
+ exports.publishTaskStarted = publishTaskStarted;
38
+ exports.publishTaskCompleted = publishTaskCompleted;
39
+ exports.publishTaskFailed = publishTaskFailed;
40
+ exports.publishBudgetWarning = publishBudgetWarning;
41
+ exports.publishBudgetFreeze = publishBudgetFreeze;
42
+ exports.publishSprintStarted = publishSprintStarted;
43
+ exports.publishSprintCompleted = publishSprintCompleted;
44
+ exports.publishAchiriChat = publishAchiriChat;
45
+ exports.publishAchiriVoice = publishAchiriVoice;
46
+ // TICKET-215 Phase 3b-3 Wave B: moved into @kognai/orchestrator-core verbatim.
47
+ // Publishes events to Supabase via raw HTTPS REST (NOT @supabase/supabase-js) —
48
+ // no path coupling, no external deps. Reads SUPABASE_URL/SERVICE_KEY from env;
49
+ // graceful no-op (events dropped) if unset.
50
+ const https = __importStar(require("https"));
51
+ // Config — reads from process.env; graceful no-op if missing
52
+ const SUPABASE_URL = process.env.SUPABASE_URL || '';
53
+ const SUPABASE_SERVICE_KEY = process.env.SUPABASE_SERVICE_KEY || '';
54
+ let _warnedMissing = false;
55
+ function checkConfig() {
56
+ if (!SUPABASE_URL || !SUPABASE_SERVICE_KEY) {
57
+ if (!_warnedMissing) {
58
+ process.stderr.write('[event-bus] SUPABASE_URL or SUPABASE_SERVICE_KEY not set — events will be dropped\n');
59
+ _warnedMissing = true;
60
+ }
61
+ return false;
62
+ }
63
+ return true;
64
+ }
65
+ async function publishEvent(event) {
66
+ if (!checkConfig())
67
+ return;
68
+ return new Promise((resolve) => {
69
+ const body = JSON.stringify(event);
70
+ const url = new URL(`${SUPABASE_URL}/rest/v1/kognai_events`);
71
+ const req = https.request({
72
+ hostname: url.hostname,
73
+ port: url.port || 443,
74
+ path: url.pathname,
75
+ method: 'POST',
76
+ headers: {
77
+ 'apikey': SUPABASE_SERVICE_KEY,
78
+ 'Authorization': `Bearer ${SUPABASE_SERVICE_KEY}`,
79
+ 'Content-Type': 'application/json',
80
+ 'Prefer': 'return=minimal',
81
+ 'Content-Length': Buffer.byteLength(body),
82
+ },
83
+ timeout: 5000,
84
+ }, () => resolve());
85
+ req.on('error', () => resolve());
86
+ req.on('timeout', () => { req.destroy(); resolve(); });
87
+ req.write(body);
88
+ req.end();
89
+ });
90
+ }
91
+ function publishTaskStarted(agentId, sprint, taskId, title) {
92
+ return publishEvent({
93
+ event_type: 'task.started',
94
+ agent_id: agentId,
95
+ sprint,
96
+ timestamp: new Date().toISOString(),
97
+ payload: { task_id: taskId, title, status: 'started' },
98
+ });
99
+ }
100
+ function publishTaskCompleted(agentId, sprint, taskId, title, costUsdc) {
101
+ return publishEvent({
102
+ event_type: 'task.completed',
103
+ agent_id: agentId,
104
+ sprint,
105
+ timestamp: new Date().toISOString(),
106
+ payload: { task_id: taskId, title, status: 'completed', costUsdc },
107
+ });
108
+ }
109
+ function publishTaskFailed(agentId, sprint, taskId, title, reason) {
110
+ return publishEvent({
111
+ event_type: 'task.failed',
112
+ agent_id: agentId,
113
+ sprint,
114
+ timestamp: new Date().toISOString(),
115
+ payload: { task_id: taskId, title, status: 'failed', reason },
116
+ });
117
+ }
118
+ function publishBudgetWarning(sprint, burnPct, spentUsdc, budgetUsdc) {
119
+ return publishEvent({
120
+ event_type: 'interrupt.budget.warning',
121
+ agent_id: 'bloomberg',
122
+ sprint,
123
+ timestamp: new Date().toISOString(),
124
+ payload: { burnPct, spentUsdc, budgetUsdc },
125
+ });
126
+ }
127
+ function publishBudgetFreeze(sprint, burnPct) {
128
+ return publishEvent({
129
+ event_type: 'interrupt.budget.freeze',
130
+ agent_id: 'bloomberg',
131
+ sprint,
132
+ timestamp: new Date().toISOString(),
133
+ payload: { burnPct, spentUsdc: 0, budgetUsdc: 0 },
134
+ });
135
+ }
136
+ function publishSprintStarted(sprint, taskCount) {
137
+ return publishEvent({
138
+ event_type: 'system.sprint.started',
139
+ agent_id: 'orchestrator',
140
+ sprint,
141
+ timestamp: new Date().toISOString(),
142
+ payload: { sprint, taskCount, completedCount: 0 },
143
+ });
144
+ }
145
+ function publishSprintCompleted(sprint, taskCount, completedCount) {
146
+ return publishEvent({
147
+ event_type: 'system.sprint.completed',
148
+ agent_id: 'orchestrator',
149
+ sprint,
150
+ timestamp: new Date().toISOString(),
151
+ payload: { sprint, taskCount, completedCount },
152
+ });
153
+ }
154
+ // Sprint 643: Achiri alpha monitoring
155
+ function publishAchiriChat(opts) {
156
+ return publishEvent({
157
+ event_type: 'achiri.chat',
158
+ agent_id: 'achiri',
159
+ sprint: 'alpha',
160
+ timestamp: new Date().toISOString(),
161
+ payload: {
162
+ user_id: opts.userId,
163
+ tier: opts.tier,
164
+ model: opts.model,
165
+ provider: opts.provider,
166
+ message_length: opts.messageLength,
167
+ response_time_ms: opts.responseTimeMs,
168
+ turns_in_memory: opts.turnsInMemory,
169
+ },
170
+ });
171
+ }
172
+ function publishAchiriVoice(opts) {
173
+ return publishEvent({
174
+ event_type: 'achiri.voice',
175
+ agent_id: 'achiri',
176
+ sprint: 'alpha',
177
+ timestamp: new Date().toISOString(),
178
+ payload: {
179
+ user_id: opts.userId,
180
+ tier: opts.tier,
181
+ model: opts.model,
182
+ provider: opts.provider,
183
+ message_length: 0,
184
+ response_time_ms: opts.responseTimeMs,
185
+ turns_in_memory: 0,
186
+ },
187
+ });
188
+ }
@@ -0,0 +1,73 @@
1
+ export type TaskEventType = 'task.queued' | 'task.started' | 'task.completed' | 'task.failed' | 'task.rejected';
2
+ export type AgentEventType = 'agent.available' | 'agent.busy' | 'agent.degraded';
3
+ export type DataEventType = 'data.research.complete' | 'data.frame.extracted' | 'data.caption.generated' | 'data.citizen_score';
4
+ export type InterruptEventType = 'interrupt.plumber.alert' | 'interrupt.budget.warning' | 'interrupt.budget.freeze';
5
+ export type SystemEventType = 'system.sprint.started' | 'system.sprint.completed' | 'system.heartbeat';
6
+ export type AchiriEventType = 'achiri.chat' | 'achiri.voice' | 'achiri.onboard';
7
+ export interface AchiriEventPayload {
8
+ user_id: string;
9
+ tier: string;
10
+ model: string;
11
+ provider: string;
12
+ message_length: number;
13
+ response_time_ms: number;
14
+ turns_in_memory: number;
15
+ [key: string]: unknown;
16
+ }
17
+ export type KognaiEventType = TaskEventType | AgentEventType | DataEventType | InterruptEventType | SystemEventType | AchiriEventType;
18
+ export interface TaskEventPayload {
19
+ task_id: string;
20
+ title: string;
21
+ status: string;
22
+ costUsdc?: number;
23
+ reason?: string;
24
+ [key: string]: unknown;
25
+ }
26
+ export interface BudgetEventPayload {
27
+ burnPct: number;
28
+ spentUsdc: number;
29
+ budgetUsdc: number;
30
+ [key: string]: unknown;
31
+ }
32
+ export interface SprintEventPayload {
33
+ sprint: string;
34
+ taskCount: number;
35
+ completedCount: number;
36
+ [key: string]: unknown;
37
+ }
38
+ export interface BaseEvent {
39
+ event_type: KognaiEventType;
40
+ agent_id: string;
41
+ sprint: string;
42
+ timestamp: string;
43
+ payload: Record<string, unknown>;
44
+ inserted_at?: string;
45
+ }
46
+ export interface TaskEvent extends BaseEvent {
47
+ event_type: TaskEventType;
48
+ payload: TaskEventPayload;
49
+ }
50
+ export interface AgentEvent extends BaseEvent {
51
+ event_type: AgentEventType;
52
+ payload: Record<string, unknown>;
53
+ }
54
+ export interface DataEvent extends BaseEvent {
55
+ event_type: DataEventType;
56
+ payload: Record<string, unknown>;
57
+ }
58
+ export interface InterruptEvent extends BaseEvent {
59
+ event_type: InterruptEventType;
60
+ payload: BudgetEventPayload | Record<string, unknown>;
61
+ }
62
+ export interface SystemEvent extends BaseEvent {
63
+ event_type: SystemEventType;
64
+ payload: SprintEventPayload | Record<string, unknown>;
65
+ }
66
+ export interface AchiriEvent extends BaseEvent {
67
+ event_type: AchiriEventType;
68
+ payload: AchiriEventPayload;
69
+ }
70
+ export type KognaiEvent = TaskEvent | AgentEvent | DataEvent | InterruptEvent | SystemEvent | AchiriEvent;
71
+ export declare function isTaskEvent(e: KognaiEvent): e is TaskEvent;
72
+ export declare function isInterruptEvent(e: KognaiEvent): e is InterruptEvent;
73
+ export declare function isSystemEvent(e: KognaiEvent): e is SystemEvent;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTaskEvent = isTaskEvent;
4
+ exports.isInterruptEvent = isInterruptEvent;
5
+ exports.isSystemEvent = isSystemEvent;
6
+ // Type guard functions
7
+ function isTaskEvent(e) {
8
+ return (e.event_type === 'task.queued' ||
9
+ e.event_type === 'task.started' ||
10
+ e.event_type === 'task.completed' ||
11
+ e.event_type === 'task.failed' ||
12
+ e.event_type === 'task.rejected');
13
+ }
14
+ function isInterruptEvent(e) {
15
+ return (e.event_type === 'interrupt.plumber.alert' ||
16
+ e.event_type === 'interrupt.budget.warning' ||
17
+ e.event_type === 'interrupt.budget.freeze');
18
+ }
19
+ function isSystemEvent(e) {
20
+ return (e.event_type === 'system.sprint.started' ||
21
+ e.event_type === 'system.sprint.completed' ||
22
+ e.event_type === 'system.heartbeat');
23
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Failure Library Consumer — TICKET-152 Gap 2.
3
+ *
4
+ * `code-failure-logger.ts` WRITES rejection records to
5
+ * `<root>/data/failure-library/code/fail-*.json`. Until now nothing READ them
6
+ * back, so a task could be rejected for the same reason on every attempt and the
7
+ * agent never saw its own history — e.g. `ksl_batch_runner` accumulated 75 failure
8
+ * records and still never converged. This module closes that loop.
9
+ *
10
+ * Three surfaces:
11
+ * 1. aggregateCodeFailures() — collapse the raw log into per-task summaries
12
+ * (how deep it stuck, what kind of failure, the
13
+ * recurring theme). The analytics view.
14
+ * 2. promoteLessons() — write a human/agent-readable LESSONS.md to the
15
+ * failure-library root. The promotion view; this
16
+ * is the `learnings_ref` decomposer-feedback points at.
17
+ * 3. retrieveTaskFailures() — retry-aware retrieval for ONE task: a compact
18
+ * "here is what your last N attempts were rejected
19
+ * for, do not repeat it" brief, ready to inject
20
+ * into the next attempt's prompt. The feedback view.
21
+ *
22
+ * Stdlib only: fs, path. Read failures degrade to empty results — a missing or
23
+ * corrupt library must never throw into a running sprint.
24
+ */
25
+ /** Raw on-disk shape written by code-failure-logger.ts. */
26
+ export interface RawCodeFailure {
27
+ entry_id: string;
28
+ task_id: string;
29
+ sprint_id: string;
30
+ agent_id: string;
31
+ attempt_num: number;
32
+ score: number;
33
+ model: string;
34
+ fail_type: string;
35
+ rejection_reason: string;
36
+ issues: Array<{
37
+ severity: string;
38
+ file: string;
39
+ description: string;
40
+ }>;
41
+ filed_at: string;
42
+ }
43
+ export interface TaskFailureSummary {
44
+ task_id: string;
45
+ total_failures: number;
46
+ /** Highest attempt_num seen — how many retries the task burned before giving up. */
47
+ max_attempt: number;
48
+ /** failType -> count. */
49
+ fail_types: Record<string, number>;
50
+ /** model -> count. */
51
+ models: Record<string, number>;
52
+ /** Coarse failure signature -> count (the actionable "recurring theme"). */
53
+ signatures: Record<string, number>;
54
+ sprint_ids: string[];
55
+ latest_score: number;
56
+ latest_reason: string;
57
+ latest_filed_at: string;
58
+ /** total_failures >= recurringThreshold — same task rejected over and over. */
59
+ recurring: boolean;
60
+ /** Exhausted retries without converging (deep attempt or chronic volume). */
61
+ no_converge: boolean;
62
+ }
63
+ export interface AggregateThresholds {
64
+ /** A task with >= this many total records is "recurring". */
65
+ recurring: number;
66
+ /** A task whose max_attempt >= this, OR total >= noConvergeVolume, never converged. */
67
+ noConvergeAttempt: number;
68
+ noConvergeVolume: number;
69
+ }
70
+ export declare const DEFAULT_THRESHOLDS: AggregateThresholds;
71
+ /**
72
+ * Common base both failure schemas project onto — TICKET-152 Gap 3, Option A.
73
+ * Contract: contracts/common/failure-entry-base-v1.json. The base itself is just
74
+ * {entry_id, filed_at} (the literal subset both schemas already carry, so the
75
+ * SCS-001 lock is preserved); the richer fields are the projection layer that
76
+ * lets one consumer read code-failure and SCS-001 records through one shape.
77
+ */
78
+ export interface FailureEntryBase {
79
+ entry_id: string;
80
+ filed_at: string;
81
+ subject_ref: string;
82
+ failure_class: string;
83
+ score: number | null;
84
+ filed_by: string;
85
+ }
86
+ /** Project a raw code-failure record onto FailureEntryBase (see contract conformance). */
87
+ export declare function projectCodeFailureToBase(e: RawCodeFailure): FailureEntryBase;
88
+ /**
89
+ * Read every fail-*.json under data/failure-library/code/. Corrupt or partial
90
+ * files are skipped, never thrown — the writer and readers run concurrently, so a
91
+ * half-written file is expected and must not break a read.
92
+ */
93
+ export declare function readAllCodeFailures(root?: string): RawCodeFailure[];
94
+ /**
95
+ * Reduce a rejection to a coarse, deterministic signature so recurring themes
96
+ * surface across attempts. No LLM — keyword heuristics over the reason + issues.
97
+ */
98
+ export declare function failureSignature(entry: RawCodeFailure): string;
99
+ /**
100
+ * Collapse the raw log into one summary per task_id, sorted most-failed first.
101
+ */
102
+ export declare function aggregateCodeFailures(root?: string, thresholds?: AggregateThresholds): TaskFailureSummary[];
103
+ export interface RetrievalOptions {
104
+ root?: string;
105
+ /** Cap how many prior attempts go into the brief (most recent first). */
106
+ maxAttempts?: number;
107
+ /** Truncate each rejection reason to keep the prompt budget bounded. */
108
+ maxReasonChars?: number;
109
+ /** Cap issue bullets carried per attempt. */
110
+ maxIssuesPerAttempt?: number;
111
+ }
112
+ export interface RetrievalResult {
113
+ task_id: string;
114
+ prior_attempts: number;
115
+ entries: RawCodeFailure[];
116
+ /** Recurring theme(s) across this task's failures, most frequent first. */
117
+ themes: string[];
118
+ /** Formatted block ready to prepend to a retry prompt; '' when no history. */
119
+ brief: string;
120
+ }
121
+ /**
122
+ * Retrieve everything the library knows about ONE task and synthesize a compact
123
+ * avoidance brief. This is the piece that was missing: call it before re-running a
124
+ * rejected task and prepend `.brief` to the agent's prompt so attempt N+1 can see
125
+ * why attempts 1..N were rejected.
126
+ */
127
+ export declare function retrieveTaskFailures(taskId: string, opts?: RetrievalOptions): RetrievalResult;
128
+ export interface AgentRetrievalOptions {
129
+ root?: string;
130
+ /** Look-back window in days (default 14). */
131
+ sinceDays?: number;
132
+ /** Cap entries carried in the result, most recent first. */
133
+ maxEntries?: number;
134
+ }
135
+ export interface AgentFailureWindow {
136
+ agent_id: string;
137
+ window_days: number;
138
+ total: number;
139
+ /** Failure signature -> count, most frequent first when read as entries. */
140
+ by_signature: Record<string, number>;
141
+ by_task: Array<{
142
+ task_id: string;
143
+ count: number;
144
+ }>;
145
+ /** The most frequent theme — where this agent should focus improvement. */
146
+ weakest_signature: string;
147
+ entries: RawCodeFailure[];
148
+ /** Improve-mode summary, ready to hand an agent reviewing its own log. */
149
+ brief: string;
150
+ }
151
+ /**
152
+ * "Failures attributed to agent_id X over the last N days." Powers SOP-GEN-013
153
+ * Improve-mode and the per-agent AIC curve in TICKET-110. `nowISO` is injected
154
+ * (callers pass new Date().toISOString()) to keep this deterministic/testable.
155
+ */
156
+ export declare function retrieveAgentFailures(agentId: string, nowISO: string, opts?: AgentRetrievalOptions): AgentFailureWindow;
157
+ export interface PromoteOptions {
158
+ root?: string;
159
+ thresholds?: AggregateThresholds;
160
+ /** Only promote tasks that are recurring or non-converging (default true). */
161
+ recurringOnly?: boolean;
162
+ }
163
+ /**
164
+ * Render LESSONS.md content from the aggregate. Pure (no I/O) so it's testable.
165
+ */
166
+ export declare function renderLessons(summaries: TaskFailureSummary[], generatedAt: string): string;
167
+ export interface PromoteResult {
168
+ path: string;
169
+ promoted: number;
170
+ totalTasks: number;
171
+ content: string;
172
+ }
173
+ /**
174
+ * Build the aggregate and write LESSONS.md to the failure-library root.
175
+ * `generatedAt` is injected (callers pass new Date().toISOString()) so this stays
176
+ * deterministic and testable.
177
+ */
178
+ export declare function promoteLessons(generatedAt: string, opts?: PromoteOptions): PromoteResult;