@jamesaphoenix/tx-cli 0.4.3
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.
- package/dist/cli-exit.d.ts +15 -0
- package/dist/cli-exit.d.ts.map +1 -0
- package/dist/cli-exit.js +18 -0
- package/dist/cli-exit.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +349 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/attempt.d.ts +9 -0
- package/dist/commands/attempt.d.ts.map +1 -0
- package/dist/commands/attempt.js +93 -0
- package/dist/commands/attempt.js.map +1 -0
- package/dist/commands/bulk.d.ts +8 -0
- package/dist/commands/bulk.d.ts.map +1 -0
- package/dist/commands/bulk.js +168 -0
- package/dist/commands/bulk.js.map +1 -0
- package/dist/commands/claim.d.ts +39 -0
- package/dist/commands/claim.d.ts.map +1 -0
- package/dist/commands/claim.js +96 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/compact.d.ts +17 -0
- package/dist/commands/compact.d.ts.map +1 -0
- package/dist/commands/compact.js +167 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/coordinator.d.ts +12 -0
- package/dist/commands/coordinator.d.ts.map +1 -0
- package/dist/commands/coordinator.js +124 -0
- package/dist/commands/coordinator.js.map +1 -0
- package/dist/commands/cycle.d.ts +12 -0
- package/dist/commands/cycle.d.ts.map +1 -0
- package/dist/commands/cycle.js +109 -0
- package/dist/commands/cycle.js.map +1 -0
- package/dist/commands/daemon.d.ts +16 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +635 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/dashboard.d.ts +12 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +105 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/dashboard.test.d.ts +2 -0
- package/dist/commands/dashboard.test.d.ts.map +1 -0
- package/dist/commands/dashboard.test.js +99 -0
- package/dist/commands/dashboard.test.js.map +1 -0
- package/dist/commands/dep.d.ts +9 -0
- package/dist/commands/dep.d.ts.map +1 -0
- package/dist/commands/dep.js +50 -0
- package/dist/commands/dep.js.map +1 -0
- package/dist/commands/doc.d.ts +10 -0
- package/dist/commands/doc.d.ts.map +1 -0
- package/dist/commands/doc.js +397 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +168 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/graph.d.ts +58 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +441 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/hierarchy.d.ts +9 -0
- package/dist/commands/hierarchy.d.ts.map +1 -0
- package/dist/commands/hierarchy.js +68 -0
- package/dist/commands/hierarchy.js.map +1 -0
- package/dist/commands/hooks.d.ts +56 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +365 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/invariant.d.ts +9 -0
- package/dist/commands/invariant.d.ts.map +1 -0
- package/dist/commands/invariant.js +126 -0
- package/dist/commands/invariant.js.map +1 -0
- package/dist/commands/learning.d.ts +16 -0
- package/dist/commands/learning.d.ts.map +1 -0
- package/dist/commands/learning.js +362 -0
- package/dist/commands/learning.js.map +1 -0
- package/dist/commands/migrate.d.ts +9 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +56 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/orchestrator.d.ts +11 -0
- package/dist/commands/orchestrator.d.ts.map +1 -0
- package/dist/commands/orchestrator.js +129 -0
- package/dist/commands/orchestrator.js.map +1 -0
- package/dist/commands/stats.d.ts +8 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +128 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync-platform.d.ts +12 -0
- package/dist/commands/sync-platform.d.ts.map +1 -0
- package/dist/commands/sync-platform.js +74 -0
- package/dist/commands/sync-platform.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +128 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/task.d.ts +15 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +233 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/test.d.ts +16 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +112 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/trace.d.ts +39 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +620 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +94 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/worker.d.ts +10 -0
- package/dist/commands/worker.d.ts.map +1 -0
- package/dist/commands/worker.js +204 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/help.d.ts +3 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +1366 -0
- package/dist/help.js.map +1 -0
- package/dist/output.d.ts +12 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +76 -0
- package/dist/output.js.map +1 -0
- package/dist/tx +0 -0
- package/dist/utils/parse.d.ts +45 -0
- package/dist/utils/parse.d.ts.map +1 -0
- package/dist/utils/parse.js +79 -0
- package/dist/utils/parse.js.map +1 -0
- package/dist/utils/parse.test.d.ts +2 -0
- package/dist/utils/parse.test.d.ts.map +1 -0
- package/dist/utils/parse.test.js +140 -0
- package/dist/utils/parse.test.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning commands: learning:add, learning:search, learning:recent, learning:helpful, context, learn, recall
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
6
|
+
import { resolve, dirname } from "node:path";
|
|
7
|
+
import { pathToFileURL } from "node:url";
|
|
8
|
+
import { LearningService, FileLearningService, RetrieverService, TaskService, RetrievalError } from "@jamesaphoenix/tx-core";
|
|
9
|
+
import { LEARNING_SOURCE_TYPES } from "@jamesaphoenix/tx-types";
|
|
10
|
+
import { toJson, formatContextMarkdown } from "../output.js";
|
|
11
|
+
import { commandHelp } from "../help.js";
|
|
12
|
+
import { flag, opt, parseIntOpt, parseFloatOpt, parseTaskId } from "../utils/parse.js";
|
|
13
|
+
export const learningAdd = (pos, flags) => Effect.gen(function* () {
|
|
14
|
+
const content = pos[0];
|
|
15
|
+
if (!content) {
|
|
16
|
+
console.error("Usage: tx learning:add <content> [-c category] [--source-ref ref] [--json]");
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const sourceTypeArg = opt(flags, "source-type");
|
|
20
|
+
let sourceType = "manual";
|
|
21
|
+
if (sourceTypeArg) {
|
|
22
|
+
if (!LEARNING_SOURCE_TYPES.includes(sourceTypeArg)) {
|
|
23
|
+
console.error(`Error: Invalid --source-type "${sourceTypeArg}". Valid types: ${LEARNING_SOURCE_TYPES.join(", ")}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
sourceType = sourceTypeArg;
|
|
27
|
+
}
|
|
28
|
+
const svc = yield* LearningService;
|
|
29
|
+
const learning = yield* svc.create({
|
|
30
|
+
content,
|
|
31
|
+
category: opt(flags, "category", "c") ?? undefined,
|
|
32
|
+
sourceRef: opt(flags, "source-ref") ?? undefined,
|
|
33
|
+
sourceType
|
|
34
|
+
});
|
|
35
|
+
if (flag(flags, "json")) {
|
|
36
|
+
console.log(toJson(learning));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log(`Created learning: #${learning.id}`);
|
|
40
|
+
console.log(` Content: ${learning.content.slice(0, 80)}${learning.content.length > 80 ? "..." : ""}`);
|
|
41
|
+
if (learning.category)
|
|
42
|
+
console.log(` Category: ${learning.category}`);
|
|
43
|
+
if (learning.sourceRef)
|
|
44
|
+
console.log(` Source: ${learning.sourceRef}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
export const learningSearch = (pos, flags) => Effect.gen(function* () {
|
|
48
|
+
const query = pos[0];
|
|
49
|
+
if (!query) {
|
|
50
|
+
console.error("Usage: tx learning:search <query> [-n limit] [--json]");
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const svc = yield* LearningService;
|
|
54
|
+
const limit = parseIntOpt(flags, "limit", "limit", "n") ?? 10;
|
|
55
|
+
const minScore = parseFloatOpt(flags, "min-score", "min-score") ?? 0.3;
|
|
56
|
+
const results = yield* svc.search({ query, limit, minScore });
|
|
57
|
+
if (flag(flags, "json")) {
|
|
58
|
+
console.log(toJson(results));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (results.length === 0) {
|
|
62
|
+
console.log("No learnings found");
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(`${results.length} learning(s) found:`);
|
|
66
|
+
for (const r of results) {
|
|
67
|
+
const score = (r.relevanceScore * 100).toFixed(0);
|
|
68
|
+
const category = r.category ? ` [${r.category}]` : "";
|
|
69
|
+
console.log(` #${r.id} (${score}%)${category} ${r.content.slice(0, 60)}${r.content.length > 60 ? "..." : ""}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
export const learningRecent = (_pos, flags) => Effect.gen(function* () {
|
|
75
|
+
const svc = yield* LearningService;
|
|
76
|
+
const limit = parseIntOpt(flags, "limit", "limit", "n") ?? 10;
|
|
77
|
+
const learnings = yield* svc.getRecent(limit);
|
|
78
|
+
if (flag(flags, "json")) {
|
|
79
|
+
console.log(toJson(learnings));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
if (learnings.length === 0) {
|
|
83
|
+
console.log("No learnings found");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(`${learnings.length} recent learning(s):`);
|
|
87
|
+
for (const l of learnings) {
|
|
88
|
+
const category = l.category ? ` [${l.category}]` : "";
|
|
89
|
+
const source = l.sourceType !== "manual" ? ` (${l.sourceType})` : "";
|
|
90
|
+
console.log(` #${l.id}${category}${source} ${l.content.slice(0, 60)}${l.content.length > 60 ? "..." : ""}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
export const learningHelpful = (pos, flags) => Effect.gen(function* () {
|
|
96
|
+
const idStr = pos[0];
|
|
97
|
+
if (!idStr) {
|
|
98
|
+
console.error("Usage: tx learning:helpful <id> [--score 0.8] [--json]");
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const id = parseInt(idStr, 10);
|
|
102
|
+
if (isNaN(id)) {
|
|
103
|
+
console.error("Error: Learning ID must be a number");
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const svc = yield* LearningService;
|
|
107
|
+
const score = parseFloatOpt(flags, "score", "score") ?? 1.0;
|
|
108
|
+
yield* svc.updateOutcome(id, score);
|
|
109
|
+
const learning = yield* svc.get(id);
|
|
110
|
+
if (flag(flags, "json")) {
|
|
111
|
+
console.log(toJson({ success: true, learning }));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(`Recorded helpfulness for learning #${id}`);
|
|
115
|
+
console.log(` Score: ${(score * 100).toFixed(0)}%`);
|
|
116
|
+
console.log(` Content: ${learning.content.slice(0, 60)}${learning.content.length > 60 ? "..." : ""}`);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Load a custom retriever module from a file path.
|
|
121
|
+
* The module should export a default Layer that provides RetrieverService.
|
|
122
|
+
*/
|
|
123
|
+
const loadCustomRetriever = (retrieverPath) => Effect.gen(function* () {
|
|
124
|
+
const absolutePath = resolve(process.cwd(), retrieverPath);
|
|
125
|
+
if (!existsSync(absolutePath)) {
|
|
126
|
+
console.error(`Error: Retriever module not found: ${absolutePath}`);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
// Dynamic import of the custom retriever module
|
|
130
|
+
const moduleUrl = pathToFileURL(absolutePath).href;
|
|
131
|
+
const retrieverModule = yield* Effect.tryPromise({
|
|
132
|
+
try: async () => {
|
|
133
|
+
const mod = await import(moduleUrl);
|
|
134
|
+
return mod.default;
|
|
135
|
+
},
|
|
136
|
+
catch: (e) => new RetrievalError({ reason: `Failed to load retriever module: ${String(e)}` })
|
|
137
|
+
});
|
|
138
|
+
return retrieverModule;
|
|
139
|
+
});
|
|
140
|
+
export const context = (pos, flags) => Effect.gen(function* () {
|
|
141
|
+
const rawTaskId = pos[0];
|
|
142
|
+
if (!rawTaskId) {
|
|
143
|
+
console.error("Usage: tx context <task-id> [--json] [--inject] [--retriever <path>]");
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
const taskId = parseTaskId(rawTaskId);
|
|
147
|
+
const retrieverPath = opt(flags, "retriever");
|
|
148
|
+
// If custom retriever is specified, load it and use it for direct search
|
|
149
|
+
if (retrieverPath) {
|
|
150
|
+
const customRetrieverLayer = yield* loadCustomRetriever(retrieverPath);
|
|
151
|
+
const taskSvc = yield* TaskService;
|
|
152
|
+
const startTime = Date.now();
|
|
153
|
+
// Get task to build search query
|
|
154
|
+
const task = yield* taskSvc.get(taskId);
|
|
155
|
+
// Build search query from task content
|
|
156
|
+
const searchQuery = `${task.title} ${task.description}`.trim();
|
|
157
|
+
// Build retrieval options
|
|
158
|
+
const retrievalOptions = {
|
|
159
|
+
limit: 10,
|
|
160
|
+
minScore: 0.05
|
|
161
|
+
};
|
|
162
|
+
// Use custom retriever for search
|
|
163
|
+
const searchEffect = Effect.gen(function* () {
|
|
164
|
+
const retriever = yield* RetrieverService;
|
|
165
|
+
return yield* retriever.search(searchQuery, retrievalOptions);
|
|
166
|
+
});
|
|
167
|
+
const learnings = yield* Effect.provide(searchEffect, customRetrieverLayer);
|
|
168
|
+
const result = {
|
|
169
|
+
taskId,
|
|
170
|
+
taskTitle: task.title,
|
|
171
|
+
learnings,
|
|
172
|
+
searchQuery,
|
|
173
|
+
searchDuration: Date.now() - startTime
|
|
174
|
+
};
|
|
175
|
+
if (flag(flags, "inject")) {
|
|
176
|
+
const contextMd = formatContextMarkdown(result);
|
|
177
|
+
const contextPath = resolve(process.cwd(), ".tx", "context.md");
|
|
178
|
+
mkdirSync(dirname(contextPath), { recursive: true });
|
|
179
|
+
writeFileSync(contextPath, contextMd);
|
|
180
|
+
console.log(`Wrote ${result.learnings.length} learning(s) to ${contextPath} (custom retriever)`);
|
|
181
|
+
}
|
|
182
|
+
else if (flag(flags, "json")) {
|
|
183
|
+
console.log(toJson(result));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(`Context for: ${result.taskId} - ${result.taskTitle} (custom retriever)`);
|
|
187
|
+
console.log(` Search query: ${result.searchQuery.slice(0, 50)}...`);
|
|
188
|
+
console.log(` Search duration: ${result.searchDuration}ms`);
|
|
189
|
+
console.log(` ${result.learnings.length} relevant learning(s):`);
|
|
190
|
+
for (const l of result.learnings) {
|
|
191
|
+
const score = (l.relevanceScore * 100).toFixed(0);
|
|
192
|
+
console.log(` #${l.id} (${score}%) ${l.content}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Default path: use LearningService with built-in retriever
|
|
198
|
+
const svc = yield* LearningService;
|
|
199
|
+
const result = yield* svc.getContextForTask(taskId);
|
|
200
|
+
if (flag(flags, "inject")) {
|
|
201
|
+
// Write to .tx/context.md for injection
|
|
202
|
+
const contextMd = formatContextMarkdown(result);
|
|
203
|
+
const contextPath = resolve(process.cwd(), ".tx", "context.md");
|
|
204
|
+
mkdirSync(dirname(contextPath), { recursive: true });
|
|
205
|
+
writeFileSync(contextPath, contextMd);
|
|
206
|
+
console.log(`Wrote ${result.learnings.length} learning(s) to ${contextPath}`);
|
|
207
|
+
}
|
|
208
|
+
else if (flag(flags, "json")) {
|
|
209
|
+
console.log(toJson(result));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
console.log(`Context for: ${result.taskId} - ${result.taskTitle}`);
|
|
213
|
+
console.log(` Search query: ${result.searchQuery.slice(0, 50)}...`);
|
|
214
|
+
console.log(` Search duration: ${result.searchDuration}ms`);
|
|
215
|
+
console.log(` ${result.learnings.length} relevant learning(s):`);
|
|
216
|
+
for (const l of result.learnings) {
|
|
217
|
+
const score = (l.relevanceScore * 100).toFixed(0);
|
|
218
|
+
console.log(` #${l.id} (${score}%) ${l.content}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
export const learn = (pos, flags) => Effect.gen(function* () {
|
|
223
|
+
const pattern = pos[0];
|
|
224
|
+
const note = pos[1];
|
|
225
|
+
if (!pattern || !note) {
|
|
226
|
+
console.error("Usage: tx learn <path> <note> [--task <id>] [--json]");
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
const svc = yield* FileLearningService;
|
|
230
|
+
const learning = yield* svc.create({
|
|
231
|
+
filePattern: pattern,
|
|
232
|
+
note,
|
|
233
|
+
taskId: opt(flags, "task") ?? undefined
|
|
234
|
+
});
|
|
235
|
+
if (flag(flags, "json")) {
|
|
236
|
+
console.log(toJson(learning));
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
console.log(`Created file learning: #${learning.id}`);
|
|
240
|
+
console.log(` Pattern: ${learning.filePattern}`);
|
|
241
|
+
console.log(` Note: ${learning.note.slice(0, 80)}${learning.note.length > 80 ? "..." : ""}`);
|
|
242
|
+
if (learning.taskId)
|
|
243
|
+
console.log(` Task: ${learning.taskId}`);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
export const recall = (pos, flags) => Effect.gen(function* () {
|
|
247
|
+
const path = pos[0];
|
|
248
|
+
const svc = yield* FileLearningService;
|
|
249
|
+
if (path) {
|
|
250
|
+
// Recall learnings for specific path
|
|
251
|
+
const learnings = yield* svc.recall(path);
|
|
252
|
+
if (flag(flags, "json")) {
|
|
253
|
+
console.log(toJson(learnings));
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
if (learnings.length === 0) {
|
|
257
|
+
console.log(`No learnings found for: ${path}`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.log(`${learnings.length} learning(s) for ${path}:`);
|
|
261
|
+
for (const l of learnings) {
|
|
262
|
+
const taskInfo = l.taskId ? ` [${l.taskId}]` : "";
|
|
263
|
+
console.log(` #${l.id}${taskInfo} (${l.filePattern})`);
|
|
264
|
+
console.log(` ${l.note}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// List all learnings
|
|
271
|
+
const learnings = yield* svc.getAll();
|
|
272
|
+
if (flag(flags, "json")) {
|
|
273
|
+
console.log(toJson(learnings));
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
if (learnings.length === 0) {
|
|
277
|
+
console.log("No file learnings found");
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.log(`${learnings.length} file learning(s):`);
|
|
281
|
+
for (const l of learnings) {
|
|
282
|
+
const taskInfo = l.taskId ? ` [${l.taskId}]` : "";
|
|
283
|
+
console.log(` #${l.id}${taskInfo} ${l.filePattern}`);
|
|
284
|
+
console.log(` ${l.note.slice(0, 60)}${l.note.length > 60 ? "..." : ""}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
const VALID_EMBEDDERS = ["auto", "openai", "local", "noop"];
|
|
291
|
+
export const learningEmbed = (_pos, flags) => Effect.gen(function* () {
|
|
292
|
+
// Parse --embedder flag (overrides TX_EMBEDDER env var)
|
|
293
|
+
const embedderArg = opt(flags, "embedder");
|
|
294
|
+
let selectedEmbedder = "auto";
|
|
295
|
+
if (embedderArg) {
|
|
296
|
+
const normalized = embedderArg.toLowerCase().trim();
|
|
297
|
+
if (!VALID_EMBEDDERS.includes(normalized)) {
|
|
298
|
+
console.error(`Error: Invalid --embedder value "${embedderArg}"`);
|
|
299
|
+
console.error(`Valid values: ${VALID_EMBEDDERS.join(", ")}`);
|
|
300
|
+
process.exit(1);
|
|
301
|
+
}
|
|
302
|
+
selectedEmbedder = normalized;
|
|
303
|
+
// Set environment variable for EmbeddingServiceAuto to pick up
|
|
304
|
+
if (selectedEmbedder !== "auto") {
|
|
305
|
+
process.env.TX_EMBEDDER = selectedEmbedder;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const svc = yield* LearningService;
|
|
309
|
+
// Status check doesn't require embeddings to be enabled
|
|
310
|
+
if (flag(flags, "status")) {
|
|
311
|
+
const status = yield* svc.embeddingStatus();
|
|
312
|
+
if (flag(flags, "json")) {
|
|
313
|
+
console.log(toJson({ ...status, embedder: selectedEmbedder }));
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
console.log("Embedding Status:");
|
|
317
|
+
console.log(` Embedder: ${selectedEmbedder}`);
|
|
318
|
+
console.log(` Total learnings: ${status.total}`);
|
|
319
|
+
console.log(` With embeddings: ${status.withEmbeddings}`);
|
|
320
|
+
console.log(` Without embeddings: ${status.withoutEmbeddings}`);
|
|
321
|
+
console.log(` Coverage: ${status.coveragePercent.toFixed(1)}%`);
|
|
322
|
+
}
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
// Check if embeddings are enabled
|
|
326
|
+
if (process.env.TX_EMBEDDINGS !== "1") {
|
|
327
|
+
console.error("Error: Embeddings not enabled. Set TX_EMBEDDINGS=1 to enable.");
|
|
328
|
+
console.error("Example: TX_EMBEDDINGS=1 tx learning:embed");
|
|
329
|
+
process.exit(1);
|
|
330
|
+
}
|
|
331
|
+
const forceAll = flag(flags, "all");
|
|
332
|
+
const result = yield* svc.embedAll(forceAll);
|
|
333
|
+
if (flag(flags, "json")) {
|
|
334
|
+
console.log(toJson({ ...result, embedder: selectedEmbedder }));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
console.log("Embedding complete:");
|
|
338
|
+
console.log(` Embedder: ${selectedEmbedder}`);
|
|
339
|
+
console.log(` Processed: ${result.processed}`);
|
|
340
|
+
console.log(` Skipped: ${result.skipped}`);
|
|
341
|
+
console.log(` Failed: ${result.failed}`);
|
|
342
|
+
console.log(` Total: ${result.total}`);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
// Help command handler for learning subcommands
|
|
346
|
+
export const learningHelp = (subcommand) => Effect.sync(() => {
|
|
347
|
+
const helpKey = `learning:${subcommand}`;
|
|
348
|
+
if (commandHelp[helpKey]) {
|
|
349
|
+
console.log(commandHelp[helpKey]);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
console.log("Learning commands:");
|
|
353
|
+
console.log(" tx learning:add <content> Add a learning");
|
|
354
|
+
console.log(" tx learning:search <query> Search learnings");
|
|
355
|
+
console.log(" tx learning:recent List recent learnings");
|
|
356
|
+
console.log(" tx learning:helpful <id> Record helpfulness");
|
|
357
|
+
console.log(" tx learning:embed Compute embeddings for learnings");
|
|
358
|
+
console.log("");
|
|
359
|
+
console.log("Run 'tx learning:<command> --help' for command-specific help.");
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
//# sourceMappingURL=learning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/commands/learning.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAc,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAElG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CACzD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAA;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;IAC/C,IAAI,UAAU,GAAuB,QAAQ,CAAA;IAC7C,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAE,qBAA2C,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1E,OAAO,CAAC,KAAK,CAAC,iCAAiC,aAAa,mBAAmB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,UAAU,GAAG,aAAmC,CAAA;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,OAAO;QACP,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,SAAS;QAClD,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,SAAS;QAChD,UAAU;KACX,CAAC,CAAA;IAEF,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtG,IAAI,QAAQ,CAAC,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtE,IAAI,QAAQ,CAAC,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;IACxE,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,GAAG,CAAA;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAE7D,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAA;YACnD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAc,EAAE,KAAY,EAAE,EAAE,CAC7D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;IAE7D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE7C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAChC,CAAC;SAAM,CAAC;QACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,sBAAsB,CAAC,CAAA;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACrD,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACpE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAC9G,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CAC7D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC9B,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAClC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,GAAG,CAAA;IAE3D,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEnC,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACxG,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,aAAqB,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAA;IAE1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAA;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,gDAAgD;IAChD,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAA;IAClD,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAC/C,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;YACnC,OAAO,GAAG,CAAC,OAAwC,CAAA;QACrD,CAAC;QACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,oCAAoC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;KAC9F,CAAC,CAAA;IAEF,OAAO,eAAe,CAAA;AACxB,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACxB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;IAErC,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAE7C,yEAAyE;IACzE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;QACtE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAE5B,iCAAiC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEvC,uCAAuC;QACvC,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;QAE9D,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG;YACvB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI;SACf,CAAA;QAED,kCAAkC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAA;YACzC,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAA;QAE3E,MAAM,MAAM,GAAG;YACb,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,SAAS;YACT,WAAW;YACX,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACvC,CAAA;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;YAC/D,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,MAAM,mBAAmB,WAAW,qBAAqB,CAAC,CAAA;QAClG,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,SAAS,qBAAqB,CAAC,CAAA;YACrF,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;YACpE,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,IAAI,CAAC,CAAA;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,wBAAwB,CAAC,CAAA;YACjE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QACD,OAAM;IACR,CAAC;IAED,4DAA4D;IAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAElC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAEnD,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1B,wCAAwC;QACxC,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;QAC/D,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,SAAS,CAAC,MAAM,mBAAmB,WAAW,EAAE,CAAC,CAAA;IAC/E,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,IAAI,CAAC,CAAA;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,wBAAwB,CAAC,CAAA;QACjE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YACjD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACnB,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAA;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,WAAW,EAAE,OAAO;QACpB,IAAI;QACJ,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,SAAS;KACxC,CAAC,CAAA;IAEF,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7F,IAAI,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAChE,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,KAAY,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAA;IAEtC,IAAI,IAAI,EAAE,CAAC;QACT,qCAAqC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEzC,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,oBAAoB,IAAI,GAAG,CAAC,CAAA;gBAC3D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;oBACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAA;oBACvD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAA;QAErC,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,oBAAoB,CAAC,CAAA;gBACpD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;oBACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;oBACrD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AAGpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,KAAY,EAAE,EAAE,CAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,wDAAwD;IACxD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAC1C,IAAI,gBAAgB,GAAiB,MAAM,CAAA;IAE3C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;QACnD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAA0B,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,oCAAoC,WAAW,GAAG,CAAC,CAAA;YACjE,OAAO,CAAC,KAAK,CAAC,iBAAiB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,gBAAgB,GAAG,UAA0B,CAAA;QAC7C,+DAA+D;QAC/D,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,gBAAgB,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IAElC,wDAAwD;IACxD,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA;QAE3C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAA;YAC9C,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACjD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;YAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAClE,CAAC;QACD,OAAM;IACR,CAAC;IAED,kCAAkC;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAC9E,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE5C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAA;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAClC,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,EAAE,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IACzC,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,MAAM,OAAO,GAAG,YAAY,UAAU,EAAE,CAAA;IACxC,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;QAC7D,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QAC/D,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;QACjE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAA;QAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate commands: status
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { MigrationService } from "@jamesaphoenix/tx-core";
|
|
6
|
+
type Flags = Record<string, string | boolean>;
|
|
7
|
+
export declare const migrate: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, MigrationService>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAIzD,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;AAM7C,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,0FAgD/C,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate commands: status
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { MigrationService } from "@jamesaphoenix/tx-core";
|
|
6
|
+
import { toJson } from "../output.js";
|
|
7
|
+
import { commandHelp } from "../help.js";
|
|
8
|
+
function flag(flags, ...names) {
|
|
9
|
+
return names.some(n => flags[n] === true);
|
|
10
|
+
}
|
|
11
|
+
export const migrate = (pos, flags) => Effect.gen(function* () {
|
|
12
|
+
const subcommand = pos[0];
|
|
13
|
+
if (!subcommand || subcommand === "help") {
|
|
14
|
+
console.log(commandHelp["migrate"]);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// Check for --help on subcommand
|
|
18
|
+
if (flag(flags, "help", "h")) {
|
|
19
|
+
const helpKey = `migrate ${subcommand}`;
|
|
20
|
+
if (commandHelp[helpKey]) {
|
|
21
|
+
console.log(commandHelp[helpKey]);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const migrationSvc = yield* MigrationService;
|
|
26
|
+
if (subcommand === "status") {
|
|
27
|
+
const status = yield* migrationSvc.getStatus();
|
|
28
|
+
if (flag(flags, "json")) {
|
|
29
|
+
console.log(toJson(status));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(`Migration Status:`);
|
|
33
|
+
console.log(` Current version: ${status.currentVersion}`);
|
|
34
|
+
console.log(` Latest version: ${status.latestVersion}`);
|
|
35
|
+
console.log(` Pending migrations: ${status.pendingCount}`);
|
|
36
|
+
if (status.appliedMigrations.length > 0) {
|
|
37
|
+
console.log(`\nApplied migrations:`);
|
|
38
|
+
for (const m of status.appliedMigrations) {
|
|
39
|
+
console.log(` v${m.version} - applied ${m.appliedAt.toISOString()}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (status.pendingMigrations.length > 0) {
|
|
43
|
+
console.log(`\nPending migrations:`);
|
|
44
|
+
for (const m of status.pendingMigrations) {
|
|
45
|
+
console.log(` v${m.version} - ${m.description}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.error(`Unknown migrate subcommand: ${subcommand}`);
|
|
52
|
+
console.error(`Run 'tx migrate --help' for usage information`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator commands: start, stop, status, reconcile
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for managing the worker orchestration system (PRD-018).
|
|
5
|
+
*/
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
import { OrchestratorService } from "@jamesaphoenix/tx-core";
|
|
8
|
+
type Flags = Record<string, string | boolean>;
|
|
9
|
+
export declare const orchestrator: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").OrchestratorError, OrchestratorService>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/commands/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAA2B,MAAM,wBAAwB,CAAA;AAIrF,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;AAc7C,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,kJAiHpD,CAAA"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator commands: start, stop, status, reconcile
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for managing the worker orchestration system (PRD-018).
|
|
5
|
+
*/
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
import { OrchestratorService } from "@jamesaphoenix/tx-core";
|
|
8
|
+
import { toJson } from "../output.js";
|
|
9
|
+
import { commandHelp } from "../help.js";
|
|
10
|
+
function flag(flags, ...names) {
|
|
11
|
+
return names.some(n => flags[n] === true);
|
|
12
|
+
}
|
|
13
|
+
function opt(flags, ...names) {
|
|
14
|
+
for (const n of names) {
|
|
15
|
+
const v = flags[n];
|
|
16
|
+
if (typeof v === "string")
|
|
17
|
+
return v;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
export const orchestrator = (pos, flags) => Effect.gen(function* () {
|
|
22
|
+
const subcommand = pos[0];
|
|
23
|
+
if (!subcommand || subcommand === "help") {
|
|
24
|
+
console.log(commandHelp["orchestrator"]);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Check for --help on subcommand
|
|
28
|
+
if (flag(flags, "help", "h")) {
|
|
29
|
+
const helpKey = `orchestrator ${subcommand}`;
|
|
30
|
+
if (commandHelp[helpKey]) {
|
|
31
|
+
console.log(commandHelp[helpKey]);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const svc = yield* OrchestratorService;
|
|
36
|
+
if (subcommand === "start") {
|
|
37
|
+
// Parse options
|
|
38
|
+
const workersOpt = opt(flags, "workers", "w");
|
|
39
|
+
const workers = workersOpt ? parseInt(workersOpt, 10) : undefined;
|
|
40
|
+
const isDaemon = flag(flags, "daemon", "d");
|
|
41
|
+
// Build config
|
|
42
|
+
const config = workers !== undefined
|
|
43
|
+
? { workerPoolSize: workers }
|
|
44
|
+
: {};
|
|
45
|
+
// Start orchestrator
|
|
46
|
+
yield* svc.start(config);
|
|
47
|
+
// Get updated status
|
|
48
|
+
const state = yield* svc.status();
|
|
49
|
+
if (flag(flags, "json")) {
|
|
50
|
+
console.log(toJson({
|
|
51
|
+
action: "started",
|
|
52
|
+
status: state.status,
|
|
53
|
+
pid: state.pid,
|
|
54
|
+
workerPoolSize: state.workerPoolSize,
|
|
55
|
+
daemon: isDaemon
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log("Orchestrator started");
|
|
60
|
+
console.log(` Status: ${state.status}`);
|
|
61
|
+
console.log(` PID: ${state.pid}`);
|
|
62
|
+
console.log(` Worker pool size: ${state.workerPoolSize}`);
|
|
63
|
+
if (isDaemon) {
|
|
64
|
+
console.log(" Mode: daemon (background)");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (subcommand === "stop") {
|
|
69
|
+
const graceful = flag(flags, "graceful", "g");
|
|
70
|
+
yield* svc.stop(graceful);
|
|
71
|
+
const state = yield* svc.status();
|
|
72
|
+
if (flag(flags, "json")) {
|
|
73
|
+
console.log(toJson({
|
|
74
|
+
action: "stopped",
|
|
75
|
+
status: state.status,
|
|
76
|
+
graceful
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log("Orchestrator stopped");
|
|
81
|
+
if (graceful) {
|
|
82
|
+
console.log(" Mode: graceful (waited for workers to finish)");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else if (subcommand === "status") {
|
|
87
|
+
const state = yield* svc.status();
|
|
88
|
+
if (flag(flags, "json")) {
|
|
89
|
+
console.log(toJson(state));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log("Orchestrator Status:");
|
|
93
|
+
console.log(` Status: ${state.status}`);
|
|
94
|
+
if (state.pid) {
|
|
95
|
+
console.log(` PID: ${state.pid}`);
|
|
96
|
+
}
|
|
97
|
+
if (state.startedAt) {
|
|
98
|
+
console.log(` Started: ${state.startedAt.toISOString()}`);
|
|
99
|
+
}
|
|
100
|
+
console.log(` Worker pool size: ${state.workerPoolSize}`);
|
|
101
|
+
console.log(` Heartbeat interval: ${state.heartbeatIntervalSeconds}s`);
|
|
102
|
+
console.log(` Lease duration: ${state.leaseDurationMinutes}m`);
|
|
103
|
+
console.log(` Reconcile interval: ${state.reconcileIntervalSeconds}s`);
|
|
104
|
+
if (state.lastReconcileAt) {
|
|
105
|
+
console.log(` Last reconcile: ${state.lastReconcileAt.toISOString()}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (subcommand === "reconcile") {
|
|
110
|
+
const result = yield* svc.reconcile();
|
|
111
|
+
if (flag(flags, "json")) {
|
|
112
|
+
console.log(toJson(result));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log("Reconciliation completed");
|
|
116
|
+
console.log(` Dead workers found: ${result.deadWorkersFound}`);
|
|
117
|
+
console.log(` Expired claims released: ${result.expiredClaimsReleased}`);
|
|
118
|
+
console.log(` Orphaned tasks recovered: ${result.orphanedTasksRecovered}`);
|
|
119
|
+
console.log(` Stale states fixed: ${result.staleStatesFixed}`);
|
|
120
|
+
console.log(` Time: ${result.reconcileTime}ms`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.error(`Unknown orchestrator subcommand: ${subcommand}`);
|
|
125
|
+
console.error(`Run 'tx orchestrator --help' for usage information`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/commands/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats command: Queue metrics and health overview
|
|
3
|
+
*/
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { SqliteClient } from "@jamesaphoenix/tx-core";
|
|
6
|
+
import { type Flags } from "../utils/parse.js";
|
|
7
|
+
export declare const stats: (_pos: string[], flags: Flags) => Effect.Effect<void, never, SqliteClient>;
|
|
8
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,OAAO,EAAE,KAAK,KAAK,EAAQ,MAAM,mBAAmB,CAAA;AAuBpD,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,6CAqG9C,CAAA"}
|