pilotlynx 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +40 -40
  2. package/dist/agents/improve.agent.d.ts +42 -1
  3. package/dist/agents/improve.agent.js +102 -7
  4. package/dist/agents/improve.agent.js.map +1 -1
  5. package/dist/agents/run.agent.d.ts +0 -1
  6. package/dist/agents/run.agent.js +10 -7
  7. package/dist/agents/run.agent.js.map +1 -1
  8. package/dist/cli.js +8 -3
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/audit.d.ts +2 -0
  11. package/dist/commands/audit.js +51 -0
  12. package/dist/commands/audit.js.map +1 -0
  13. package/dist/commands/eval.d.ts +2 -0
  14. package/dist/commands/eval.js +47 -0
  15. package/dist/commands/eval.js.map +1 -0
  16. package/dist/commands/improve.js +83 -5
  17. package/dist/commands/improve.js.map +1 -1
  18. package/dist/commands/init.js +17 -27
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/insights.js +63 -0
  21. package/dist/commands/insights.js.map +1 -1
  22. package/dist/commands/logs.d.ts +1 -0
  23. package/dist/commands/logs.js +23 -1
  24. package/dist/commands/logs.js.map +1 -1
  25. package/dist/commands/relay.js +250 -124
  26. package/dist/commands/relay.js.map +1 -1
  27. package/dist/commands/run.js +21 -2
  28. package/dist/commands/run.js.map +1 -1
  29. package/dist/commands/schedule.js +7 -1
  30. package/dist/commands/schedule.js.map +1 -1
  31. package/dist/commands/status.js +9 -2
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/lib/agent-runner.d.ts +5 -1
  34. package/dist/lib/agent-runner.js +41 -1
  35. package/dist/lib/agent-runner.js.map +1 -1
  36. package/dist/lib/audit.d.ts +7 -0
  37. package/dist/lib/audit.js +63 -0
  38. package/dist/lib/audit.js.map +1 -0
  39. package/dist/lib/callbacks.d.ts +12 -1
  40. package/dist/lib/callbacks.js +147 -19
  41. package/dist/lib/callbacks.js.map +1 -1
  42. package/dist/lib/command-ops/doctor-ops.js +41 -6
  43. package/dist/lib/command-ops/doctor-ops.js.map +1 -1
  44. package/dist/lib/command-ops/eval-ops.d.ts +7 -0
  45. package/dist/lib/command-ops/eval-ops.js +111 -0
  46. package/dist/lib/command-ops/eval-ops.js.map +1 -0
  47. package/dist/lib/command-ops/improve-ops.d.ts +14 -1
  48. package/dist/lib/command-ops/improve-ops.js +369 -17
  49. package/dist/lib/command-ops/improve-ops.js.map +1 -1
  50. package/dist/lib/command-ops/run-ops.d.ts +8 -1
  51. package/dist/lib/command-ops/run-ops.js +25 -4
  52. package/dist/lib/command-ops/run-ops.js.map +1 -1
  53. package/dist/lib/command-ops/secrets-migration-ops.js +1 -1
  54. package/dist/lib/command-ops/secrets-migration-ops.js.map +1 -1
  55. package/dist/lib/command-ops/status-ops.d.ts +1 -0
  56. package/dist/lib/command-ops/status-ops.js +19 -7
  57. package/dist/lib/command-ops/status-ops.js.map +1 -1
  58. package/dist/lib/config.js +3 -3
  59. package/dist/lib/config.js.map +1 -1
  60. package/dist/lib/cron.d.ts +1 -1
  61. package/dist/lib/cron.js +2 -2
  62. package/dist/lib/cron.js.map +1 -1
  63. package/dist/lib/global-config.js +1 -1
  64. package/dist/lib/global-config.js.map +1 -1
  65. package/dist/lib/observation.d.ts +60 -2
  66. package/dist/lib/observation.js +261 -13
  67. package/dist/lib/observation.js.map +1 -1
  68. package/dist/lib/registry.d.ts +0 -1
  69. package/dist/lib/registry.js +1 -1
  70. package/dist/lib/registry.js.map +1 -1
  71. package/dist/lib/relay/admin.d.ts +29 -0
  72. package/dist/lib/relay/admin.js +176 -0
  73. package/dist/lib/relay/admin.js.map +1 -0
  74. package/dist/lib/relay/bindings.d.ts +8 -0
  75. package/dist/lib/relay/bindings.js +50 -0
  76. package/dist/lib/relay/bindings.js.map +1 -0
  77. package/dist/lib/relay/config.d.ts +3 -3
  78. package/dist/lib/relay/config.js +18 -10
  79. package/dist/lib/relay/config.js.map +1 -1
  80. package/dist/lib/relay/context.d.ts +31 -0
  81. package/dist/lib/relay/context.js +118 -0
  82. package/dist/lib/relay/context.js.map +1 -0
  83. package/dist/lib/relay/db.d.ts +38 -0
  84. package/dist/lib/relay/db.js +252 -0
  85. package/dist/lib/relay/db.js.map +1 -0
  86. package/dist/lib/relay/executor.d.ts +2 -0
  87. package/dist/lib/relay/executor.js +108 -0
  88. package/dist/lib/relay/executor.js.map +1 -0
  89. package/dist/lib/relay/feedback.d.ts +29 -0
  90. package/dist/lib/relay/feedback.js +142 -0
  91. package/dist/lib/relay/feedback.js.map +1 -0
  92. package/dist/lib/relay/notifier.d.ts +30 -0
  93. package/dist/lib/relay/notifier.js +78 -0
  94. package/dist/lib/relay/notifier.js.map +1 -0
  95. package/dist/lib/relay/notify.d.ts +3 -4
  96. package/dist/lib/relay/notify.js +43 -159
  97. package/dist/lib/relay/notify.js.map +1 -1
  98. package/dist/lib/relay/platform.d.ts +52 -0
  99. package/dist/lib/relay/platform.js +5 -0
  100. package/dist/lib/relay/platform.js.map +1 -0
  101. package/dist/lib/relay/platforms/slack.d.ts +37 -0
  102. package/dist/lib/relay/platforms/slack.js +240 -0
  103. package/dist/lib/relay/platforms/slack.js.map +1 -0
  104. package/dist/lib/relay/platforms/telegram.d.ts +29 -0
  105. package/dist/lib/relay/platforms/telegram.js +193 -0
  106. package/dist/lib/relay/platforms/telegram.js.map +1 -0
  107. package/dist/lib/relay/poster.d.ts +24 -0
  108. package/dist/lib/relay/poster.js +136 -0
  109. package/dist/lib/relay/poster.js.map +1 -0
  110. package/dist/lib/relay/queue.d.ts +18 -0
  111. package/dist/lib/relay/queue.js +85 -0
  112. package/dist/lib/relay/queue.js.map +1 -0
  113. package/dist/lib/relay/router.d.ts +25 -2
  114. package/dist/lib/relay/router.js +259 -168
  115. package/dist/lib/relay/router.js.map +1 -1
  116. package/dist/lib/relay/service.d.ts +31 -7
  117. package/dist/lib/relay/service.js +281 -200
  118. package/dist/lib/relay/service.js.map +1 -1
  119. package/dist/lib/relay/types.d.ts +189 -34
  120. package/dist/lib/relay/types.js +68 -28
  121. package/dist/lib/relay/types.js.map +1 -1
  122. package/dist/lib/sandbox.d.ts +9 -1
  123. package/dist/lib/sandbox.js +17 -2
  124. package/dist/lib/sandbox.js.map +1 -1
  125. package/dist/lib/schedule.d.ts +4 -5
  126. package/dist/lib/schedule.js +7 -8
  127. package/dist/lib/schedule.js.map +1 -1
  128. package/dist/lib/secrets.js +11 -1
  129. package/dist/lib/secrets.js.map +1 -1
  130. package/dist/lib/types.d.ts +80 -0
  131. package/dist/lib/types.js +9 -1
  132. package/dist/lib/types.js.map +1 -1
  133. package/package.json +18 -18
  134. package/prompts/improve.yaml +114 -6
  135. package/prompts/relay.yaml +29 -0
  136. package/prompts/run.yaml +36 -2
  137. package/template/CLAUDE.md +34 -5
  138. package/template/RUNBOOK.md +5 -5
  139. package/template/evals/sample.json +16 -0
  140. package/template/memory/MEMORY.md +6 -0
  141. package/template/memory/procedures/.gitkeep +0 -0
  142. package/template/schedule.yaml +1 -1
  143. package/template/workflows/daily_feedback.ts +78 -2
  144. package/template/workflows/project_review.ts +51 -2
  145. package/prompts/relay-chat.yaml +0 -24
@@ -1,6 +1,103 @@
1
- import { readdirSync, readFileSync, writeFileSync, existsSync, mkdirSync, appendFileSync } from 'node:fs';
1
+ import { readdirSync, readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { getProjectDir, INSIGHTS_DIR } from './config.js';
3
+ import { getProjectDir, INSIGHTS_DIR, SHARED_DOCS_DIR } from './config.js';
4
+ export function getLogStatistics(project, days) {
5
+ const logs = getRecentLogs(project, days);
6
+ if (logs.length === 0) {
7
+ return {
8
+ totalRuns: 0,
9
+ successCount: 0,
10
+ failureCount: 0,
11
+ failureRate: 0,
12
+ avgCostUsd: 0,
13
+ totalCostUsd: 0,
14
+ avgTurns: 0,
15
+ avgDurationMs: 0,
16
+ topWorkflows: [],
17
+ topErrors: [],
18
+ };
19
+ }
20
+ const successCount = logs.filter((l) => l.success).length;
21
+ const failureCount = logs.length - successCount;
22
+ const totalCostUsd = logs.reduce((sum, l) => sum + (l.costUsd ?? 0), 0);
23
+ const avgTurns = logs.reduce((sum, l) => sum + (l.numTurns ?? 0), 0) / logs.length;
24
+ // Compute average duration from startedAt/completedAt
25
+ const durations = logs.map((l) => {
26
+ const start = new Date(l.startedAt).getTime();
27
+ const end = new Date(l.completedAt).getTime();
28
+ return end - start;
29
+ });
30
+ const avgDurationMs = durations.reduce((sum, d) => sum + d, 0) / durations.length;
31
+ // Workflow breakdown
32
+ const workflowMap = new Map();
33
+ for (const log of logs) {
34
+ const entry = workflowMap.get(log.workflow) ?? { total: 0, failures: 0 };
35
+ entry.total++;
36
+ if (!log.success)
37
+ entry.failures++;
38
+ workflowMap.set(log.workflow, entry);
39
+ }
40
+ const topWorkflows = [...workflowMap.entries()]
41
+ .map(([workflow, { total, failures }]) => ({
42
+ workflow,
43
+ count: total,
44
+ failureRate: total > 0 ? failures / total : 0,
45
+ }))
46
+ .sort((a, b) => b.count - a.count)
47
+ .slice(0, 5);
48
+ // Top error messages (deduplicated)
49
+ const errors = logs
50
+ .filter((l) => !l.success && l.error)
51
+ .map((l) => l.error);
52
+ const errorCounts = new Map();
53
+ for (const err of errors) {
54
+ const key = err.slice(0, 100); // Truncate for dedup
55
+ errorCounts.set(key, (errorCounts.get(key) ?? 0) + 1);
56
+ }
57
+ const topErrors = [...errorCounts.entries()]
58
+ .sort((a, b) => b[1] - a[1])
59
+ .slice(0, 5)
60
+ .map(([err, count]) => `${err} (×${count})`);
61
+ return {
62
+ totalRuns: logs.length,
63
+ successCount,
64
+ failureCount,
65
+ failureRate: failureCount / logs.length,
66
+ avgCostUsd: totalCostUsd / logs.length,
67
+ totalCostUsd,
68
+ avgTurns,
69
+ avgDurationMs,
70
+ topWorkflows,
71
+ topErrors,
72
+ };
73
+ }
74
+ // ── Health Score ──
75
+ export function getHealthScore(project) {
76
+ const logs7d = getRecentLogs(project, 7);
77
+ const logs30d = getRecentLogs(project, 30);
78
+ const successRate7d = logs7d.length > 0 ? logs7d.filter((l) => l.success).length / logs7d.length : 0;
79
+ const successRate30d = logs30d.length > 0 ? logs30d.filter((l) => l.success).length / logs30d.length : 0;
80
+ const avgCost7d = logs7d.length > 0 ? logs7d.reduce((sum, l) => sum + (l.costUsd ?? 0), 0) / logs7d.length : 0;
81
+ const avgCost30d = logs30d.length > 0 ? logs30d.reduce((sum, l) => sum + (l.costUsd ?? 0), 0) / logs30d.length : 0;
82
+ // Trend: compare 7d rate vs 30d rate
83
+ let trend;
84
+ const diff = successRate7d - successRate30d;
85
+ if (diff > 0.05) {
86
+ trend = 'improving';
87
+ }
88
+ else if (diff < -0.05) {
89
+ trend = 'declining';
90
+ }
91
+ else {
92
+ trend = 'stable';
93
+ }
94
+ // Score = weighted combination: 60% success rate, 25% cost efficiency, 15% trend
95
+ const costEfficiency = avgCost30d > 0 ? Math.min(1, avgCost30d / Math.max(avgCost7d, 0.0001)) : 1;
96
+ const trendBonus = trend === 'improving' ? 0.1 : trend === 'declining' ? -0.1 : 0;
97
+ const score = Math.max(0, Math.min(100, (successRate7d * 60 + costEfficiency * 25 + (0.5 + trendBonus) * 15)));
98
+ return { score, trend, successRate7d, successRate30d, avgCost7d, avgCost30d };
99
+ }
100
+ // ── Log Reading ──
4
101
  export function getRecentLogs(project, days) {
5
102
  const logsDir = join(getProjectDir(project), 'logs');
6
103
  if (!existsSync(logsDir))
@@ -24,25 +121,176 @@ export function getRecentLogs(project, days) {
24
121
  }
25
122
  }
26
123
  if (corruptCount > 0) {
27
- console.warn(`[plynx] Warning: ${corruptCount} log entr${corruptCount === 1 ? 'y' : 'ies'} in "${project}" could not be parsed`);
124
+ console.warn(`[pilotlynx] Warning: ${corruptCount} log entr${corruptCount === 1 ? 'y' : 'ies'} in "${project}" could not be parsed`);
28
125
  }
29
126
  records.sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime());
30
127
  return records;
31
128
  }
32
- export function writeInsight(content) {
129
+ // ── Log Rotation ──
130
+ export function pruneOldLogs(project, olderThanDays) {
131
+ const logsDir = join(getProjectDir(project), 'logs');
132
+ if (!existsSync(logsDir))
133
+ return 0;
134
+ const cutoff = new Date();
135
+ cutoff.setDate(cutoff.getDate() - olderThanDays);
136
+ let pruned = 0;
137
+ const files = readdirSync(logsDir).filter((f) => f.endsWith('.json'));
138
+ for (const file of files) {
139
+ try {
140
+ const content = readFileSync(join(logsDir, file), 'utf8');
141
+ const record = JSON.parse(content);
142
+ if (new Date(record.startedAt).getTime() < cutoff.getTime()) {
143
+ unlinkSync(join(logsDir, file));
144
+ pruned++;
145
+ }
146
+ }
147
+ catch { /* skip corrupt files */ }
148
+ }
149
+ return pruned;
150
+ }
151
+ export function writeStructuredInsights(insights) {
152
+ if (insights.length === 0)
153
+ return;
33
154
  const dir = INSIGHTS_DIR();
34
155
  mkdirSync(dir, { recursive: true });
35
156
  const now = new Date();
36
- const y = now.getFullYear();
37
- const mo = String(now.getMonth() + 1).padStart(2, '0');
38
- const d = String(now.getDate()).padStart(2, '0');
39
- const filename = `${y}-${mo}-${d}.md`;
40
- const filePath = join(dir, filename);
41
- if (existsSync(filePath)) {
42
- appendFileSync(filePath, `\n${content}`, 'utf8');
157
+ const dateStr = formatDate(now);
158
+ const jsonPath = join(dir, `${dateStr}.json`);
159
+ let existing = [];
160
+ if (existsSync(jsonPath)) {
161
+ try {
162
+ existing = JSON.parse(readFileSync(jsonPath, 'utf8'));
163
+ }
164
+ catch {
165
+ // Corrupt file, overwrite
166
+ }
43
167
  }
44
- else {
45
- writeFileSync(filePath, content, 'utf8');
168
+ const merged = [...existing, ...insights];
169
+ writeFileSync(jsonPath, JSON.stringify(merged, null, 2), 'utf8');
170
+ }
171
+ export function readRecentInsights(count) {
172
+ const dir = INSIGHTS_DIR();
173
+ if (!existsSync(dir))
174
+ return [];
175
+ const files = readdirSync(dir)
176
+ .filter((f) => f.endsWith('.json'))
177
+ .sort()
178
+ .reverse()
179
+ .slice(0, count);
180
+ const insights = [];
181
+ for (const file of files) {
182
+ try {
183
+ const content = readFileSync(join(dir, file), 'utf8');
184
+ const parsed = JSON.parse(content);
185
+ insights.push(...parsed);
186
+ }
187
+ catch {
188
+ // Skip corrupt files
189
+ }
46
190
  }
191
+ return insights;
192
+ }
193
+ export function writeSharedPattern(name, pattern) {
194
+ const dir = join(SHARED_DOCS_DIR(), 'patterns');
195
+ mkdirSync(dir, { recursive: true });
196
+ const filename = `${sanitizeName(name)}.json`;
197
+ writeFileSync(join(dir, filename), JSON.stringify(pattern, null, 2), 'utf8');
198
+ // Also write human-readable markdown
199
+ const mdFilename = `${sanitizeName(name)}.md`;
200
+ const markdown = `# ${name}\n\n${pattern.content}\n\n- Observations: ${pattern.observations}\n- Applies to: ${pattern.applicableTo.join(', ')}\n- Confidence: ${pattern.confidence}\n- Expires: ${pattern.expiresAt}\n`;
201
+ writeFileSync(join(dir, mdFilename), markdown, 'utf8');
202
+ }
203
+ export function readSharedPatterns() {
204
+ const dir = join(SHARED_DOCS_DIR(), 'patterns');
205
+ if (!existsSync(dir))
206
+ return [];
207
+ const files = readdirSync(dir).filter((f) => f.endsWith('.json'));
208
+ const patterns = [];
209
+ const now = new Date();
210
+ for (const file of files) {
211
+ try {
212
+ const content = readFileSync(join(dir, file), 'utf8');
213
+ const pattern = JSON.parse(content);
214
+ if (new Date(pattern.expiresAt) >= now) {
215
+ patterns.push(pattern);
216
+ }
217
+ }
218
+ catch {
219
+ // Skip corrupt files
220
+ }
221
+ }
222
+ return patterns;
223
+ }
224
+ export function writeAntiPattern(name, antiPattern) {
225
+ const dir = join(SHARED_DOCS_DIR(), 'anti-patterns');
226
+ mkdirSync(dir, { recursive: true });
227
+ const filename = `${sanitizeName(name)}.json`;
228
+ writeFileSync(join(dir, filename), JSON.stringify(antiPattern, null, 2), 'utf8');
229
+ const mdFilename = `${sanitizeName(name)}.md`;
230
+ const markdown = `# Anti-Pattern: ${name}\n\n**Pattern:** ${antiPattern.pattern}\n\n**Why it's harmful:** ${antiPattern.reason}\n\n**Evidence:** ${antiPattern.evidence}\n\n**Applies to:** ${antiPattern.applicableTo.join(', ')}\n`;
231
+ writeFileSync(join(dir, mdFilename), markdown, 'utf8');
232
+ }
233
+ export function readAntiPatterns() {
234
+ const dir = join(SHARED_DOCS_DIR(), 'anti-patterns');
235
+ if (!existsSync(dir))
236
+ return [];
237
+ const files = readdirSync(dir).filter((f) => f.endsWith('.json'));
238
+ const patterns = [];
239
+ for (const file of files) {
240
+ try {
241
+ const content = readFileSync(join(dir, file), 'utf8');
242
+ patterns.push(JSON.parse(content));
243
+ }
244
+ catch {
245
+ // Skip corrupt files
246
+ }
247
+ }
248
+ return patterns;
249
+ }
250
+ export function writeFeedbackLog(entries) {
251
+ if (entries.length === 0)
252
+ return;
253
+ const dir = INSIGHTS_DIR();
254
+ mkdirSync(dir, { recursive: true });
255
+ const logPath = join(dir, 'feedback-log.json');
256
+ let existing = [];
257
+ if (existsSync(logPath)) {
258
+ try {
259
+ existing = JSON.parse(readFileSync(logPath, 'utf8'));
260
+ }
261
+ catch {
262
+ // Corrupt file, overwrite
263
+ }
264
+ }
265
+ const merged = [...existing, ...entries];
266
+ // Keep only last 500 entries to prevent unbounded growth
267
+ const trimmed = merged.slice(-500);
268
+ writeFileSync(logPath, JSON.stringify(trimmed, null, 2), 'utf8');
269
+ }
270
+ export function readFeedbackLog() {
271
+ const logPath = join(INSIGHTS_DIR(), 'feedback-log.json');
272
+ if (!existsSync(logPath))
273
+ return [];
274
+ try {
275
+ return JSON.parse(readFileSync(logPath, 'utf8'));
276
+ }
277
+ catch {
278
+ return [];
279
+ }
280
+ }
281
+ // ── Helpers ──
282
+ function formatDate(date) {
283
+ const y = date.getFullYear();
284
+ const mo = String(date.getMonth() + 1).padStart(2, '0');
285
+ const d = String(date.getDate()).padStart(2, '0');
286
+ return `${y}-${mo}-${d}`;
287
+ }
288
+ function sanitizeName(name) {
289
+ return name
290
+ .toLowerCase()
291
+ .replace(/[^a-z0-9-]/g, '-')
292
+ .replace(/-+/g, '-')
293
+ .replace(/^-|-$/g, '')
294
+ .slice(0, 60);
47
295
  }
48
296
  //# sourceMappingURL=observation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation.js","sourceRoot":"","sources":["../../src/lib/observation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAY;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAChD,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CACV,oBAAoB,YAAY,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,OAAO,uBAAuB,CACnH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAC5E,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAErC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,cAAc,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../../src/lib/observation.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,4 @@ export declare function resolveProjectPath(name: string): string;
8
8
  export declare function isRegistered(name: string): boolean;
9
9
  export declare function getRegisteredProjects(): Record<string, {
10
10
  path: string;
11
- absolutePath: string;
12
11
  }>;
@@ -70,7 +70,7 @@ export function getRegisteredProjects() {
70
70
  const registry = loadRegistry();
71
71
  const result = {};
72
72
  for (const [name, entry] of Object.entries(registry.projects)) {
73
- result[name] = { path: entry.path, absolutePath: entry.path };
73
+ result[name] = { path: entry.path };
74
74
  }
75
75
  return result;
76
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { RelayConfig } from './types.js';
3
+ interface AdminContext {
4
+ db: Database.Database;
5
+ platform: string;
6
+ channelId: string;
7
+ userId: string;
8
+ config: RelayConfig;
9
+ getQueueDepth?: (project: string) => number;
10
+ getActiveCount?: () => number;
11
+ startedAt?: Date;
12
+ }
13
+ /**
14
+ * Parse a text string into an admin command.
15
+ * Matches: /pilotlynx-<cmd>, /pilotlynx <cmd>, !<cmd>, or bare <cmd> for known commands.
16
+ */
17
+ export declare function parseCommand(text: string): {
18
+ command: string;
19
+ args: string;
20
+ } | null;
21
+ /**
22
+ * Check whether a user is an admin on the given platform.
23
+ */
24
+ export declare function isAdmin(config: RelayConfig, platform: string, userId: string): boolean;
25
+ /**
26
+ * Execute an admin command and return the response text.
27
+ */
28
+ export declare function handleAdminCommand(ctx: AdminContext, command: string, args: string): Promise<string>;
29
+ export {};
@@ -0,0 +1,176 @@
1
+ // ── Admin Command Handler ──
2
+ // Handles relay admin commands from Slack slash commands and text-based commands.
3
+ import { listProjects } from '../project.js';
4
+ import { lookupBinding, saveBinding, removeBinding } from './bindings.js';
5
+ const KNOWN_COMMANDS = new Set([
6
+ 'bind', 'unbind', 'where', 'projects', 'status', 'help', 'cost', 'cancel', 'new',
7
+ ]);
8
+ const ADMIN_ONLY = new Set(['bind', 'unbind', 'projects']);
9
+ /**
10
+ * Parse a text string into an admin command.
11
+ * Matches: /pilotlynx-<cmd>, /pilotlynx <cmd>, !<cmd>, or bare <cmd> for known commands.
12
+ */
13
+ export function parseCommand(text) {
14
+ const trimmed = text.trim();
15
+ // /pilotlynx-<command> [args]
16
+ const slashDash = trimmed.match(/^\/pilotlynx-(\S+)\s*(.*)?$/i);
17
+ if (slashDash) {
18
+ const cmd = slashDash[1].toLowerCase();
19
+ if (KNOWN_COMMANDS.has(cmd))
20
+ return { command: cmd, args: (slashDash[2] ?? '').trim() };
21
+ }
22
+ // /pilotlynx <command> [args]
23
+ const slashSpace = trimmed.match(/^\/pilotlynx\s+(\S+)\s*(.*)?$/i);
24
+ if (slashSpace) {
25
+ const cmd = slashSpace[1].toLowerCase();
26
+ if (KNOWN_COMMANDS.has(cmd))
27
+ return { command: cmd, args: (slashSpace[2] ?? '').trim() };
28
+ }
29
+ // !<command> [args]
30
+ const bang = trimmed.match(/^!(\S+)\s*(.*)?$/);
31
+ if (bang) {
32
+ const cmd = bang[1].toLowerCase();
33
+ if (KNOWN_COMMANDS.has(cmd))
34
+ return { command: cmd, args: (bang[2] ?? '').trim() };
35
+ }
36
+ // bare <command> [args] — only if the first word is a known command
37
+ const bare = trimmed.match(/^(\S+)\s*(.*)?$/);
38
+ if (bare) {
39
+ const cmd = bare[1].toLowerCase();
40
+ if (KNOWN_COMMANDS.has(cmd))
41
+ return { command: cmd, args: (bare[2] ?? '').trim() };
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Check whether a user is an admin on the given platform.
47
+ */
48
+ export function isAdmin(config, platform, userId) {
49
+ const admins = config.admins[platform];
50
+ if (!admins)
51
+ return false;
52
+ return admins.includes(userId);
53
+ }
54
+ /**
55
+ * Execute an admin command and return the response text.
56
+ */
57
+ export async function handleAdminCommand(ctx, command, args) {
58
+ if (ADMIN_ONLY.has(command) && !isAdmin(ctx.config, ctx.platform, ctx.userId)) {
59
+ return 'Permission denied. This command requires admin access.';
60
+ }
61
+ switch (command) {
62
+ case 'bind':
63
+ return handleBind(ctx, args);
64
+ case 'unbind':
65
+ return handleUnbind(ctx);
66
+ case 'where':
67
+ return handleWhere(ctx);
68
+ case 'projects':
69
+ return handleProjects();
70
+ case 'status':
71
+ return handleStatus(ctx);
72
+ case 'help':
73
+ return handleHelp();
74
+ case 'cost':
75
+ return handleCost(ctx);
76
+ case 'cancel':
77
+ return 'Cancellation requested.';
78
+ case 'new':
79
+ return 'Starting fresh context.';
80
+ default:
81
+ return `Unknown command: ${command}. Type "help" for available commands.`;
82
+ }
83
+ }
84
+ function handleBind(ctx, args) {
85
+ const project = args.trim();
86
+ if (!project)
87
+ return 'Usage: bind <project>';
88
+ const all = listProjects();
89
+ if (!all.includes(project)) {
90
+ return `Project "${project}" not found. Registered projects: ${all.join(', ') || '(none)'}`;
91
+ }
92
+ saveBinding(ctx.db, ctx.platform, ctx.channelId, project, ctx.userId);
93
+ return `Channel bound to project *${project}*.`;
94
+ }
95
+ function handleUnbind(ctx) {
96
+ removeBinding(ctx.db, ctx.platform, ctx.channelId);
97
+ return 'Channel binding removed.';
98
+ }
99
+ function handleWhere(ctx) {
100
+ const project = lookupBinding(ctx.db, ctx.platform, ctx.channelId);
101
+ if (!project)
102
+ return 'This channel is not bound to any project.';
103
+ return `This channel is bound to *${project}*.`;
104
+ }
105
+ function handleProjects() {
106
+ const all = listProjects();
107
+ if (all.length === 0)
108
+ return 'No registered projects.';
109
+ return `Registered projects:\n${all.map((p) => ` - ${p}`).join('\n')}`;
110
+ }
111
+ function handleStatus(ctx) {
112
+ const uptime = ctx.startedAt
113
+ ? formatUptime(Date.now() - ctx.startedAt.getTime())
114
+ : 'unknown';
115
+ const active = ctx.getActiveCount?.() ?? 0;
116
+ const lines = [
117
+ `Relay status:`,
118
+ ` Uptime: ${uptime}`,
119
+ ` Active runs: ${active}`,
120
+ ];
121
+ if (ctx.getQueueDepth) {
122
+ const project = lookupBinding(ctx.db, ctx.platform, ctx.channelId);
123
+ if (project) {
124
+ const depth = ctx.getQueueDepth(project);
125
+ lines.push(` Queue depth (${project}): ${depth}`);
126
+ }
127
+ }
128
+ return lines.join('\n');
129
+ }
130
+ function handleHelp() {
131
+ return [
132
+ 'PilotLynx Relay Commands:',
133
+ ' bind <project> - Bind this channel to a project (admin)',
134
+ ' unbind - Remove channel binding (admin)',
135
+ ' where - Show current binding',
136
+ ' projects - List registered projects (admin)',
137
+ ' status - Show relay status',
138
+ ' cost - Show cost stats for bound project',
139
+ ' cancel - Cancel the active run',
140
+ ' new - Start a fresh conversation context',
141
+ ' help - Show this help text',
142
+ ].join('\n');
143
+ }
144
+ function handleCost(ctx) {
145
+ const project = lookupBinding(ctx.db, ctx.platform, ctx.channelId);
146
+ if (!project)
147
+ return 'This channel is not bound to a project. Use "bind <project>" first.';
148
+ const row = ctx.db
149
+ .prepare(`SELECT COUNT(*) as runs, COALESCE(SUM(cost_usd), 0) as total_cost,
150
+ COALESCE(SUM(input_tokens), 0) as total_input,
151
+ COALESCE(SUM(output_tokens), 0) as total_output
152
+ FROM relay_runs WHERE project = ?`)
153
+ .get(project);
154
+ if (!row || row.runs === 0)
155
+ return `No runs recorded for *${project}*.`;
156
+ return [
157
+ `Cost stats for *${project}*:`,
158
+ ` Total runs: ${row.runs}`,
159
+ ` Total cost: $${row.total_cost.toFixed(4)}`,
160
+ ` Total tokens: ${row.total_input + row.total_output} (${row.total_input} in / ${row.total_output} out)`,
161
+ ].join('\n');
162
+ }
163
+ function formatUptime(ms) {
164
+ const secs = Math.floor(ms / 1000);
165
+ const mins = Math.floor(secs / 60);
166
+ const hrs = Math.floor(mins / 60);
167
+ const days = Math.floor(hrs / 24);
168
+ if (days > 0)
169
+ return `${days}d ${hrs % 24}h`;
170
+ if (hrs > 0)
171
+ return `${hrs}h ${mins % 60}m`;
172
+ if (mins > 0)
173
+ return `${mins}m ${secs % 60}s`;
174
+ return `${secs}s`;
175
+ }
176
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/lib/relay/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { BindingRecord } from './types.js';
3
+ export declare function saveBinding(db: Database.Database, platform: string, channelId: string, project: string, userId: string): void;
4
+ export declare function removeBinding(db: Database.Database, platform: string, channelId: string): boolean;
5
+ export declare function lookupBinding(db: Database.Database, platform: string, channelId: string): string | null;
6
+ export declare function getBindingsForPlatform(db: Database.Database, platform: string): BindingRecord[];
7
+ export declare function getAllBindings(db: Database.Database): BindingRecord[];
8
+ export declare function getChannelForProject(db: Database.Database, platform: string, project: string): string | null;
@@ -0,0 +1,50 @@
1
+ export function saveBinding(db, platform, channelId, project, userId) {
2
+ db.prepare(`
3
+ INSERT OR REPLACE INTO bindings (platform, channel_id, project, bound_by, bound_at)
4
+ VALUES (?, ?, ?, ?, ?)
5
+ `).run(platform, channelId, project, userId, new Date().toISOString());
6
+ }
7
+ export function removeBinding(db, platform, channelId) {
8
+ const result = db.prepare(`
9
+ DELETE FROM bindings WHERE platform = ? AND channel_id = ?
10
+ `).run(platform, channelId);
11
+ return result.changes > 0;
12
+ }
13
+ export function lookupBinding(db, platform, channelId) {
14
+ const row = db.prepare(`
15
+ SELECT project FROM bindings WHERE platform = ? AND channel_id = ?
16
+ `).get(platform, channelId);
17
+ return row?.project ?? null;
18
+ }
19
+ export function getBindingsForPlatform(db, platform) {
20
+ const rows = db.prepare(`
21
+ SELECT platform, channel_id, project, bound_by, bound_at, config_json
22
+ FROM bindings WHERE platform = ?
23
+ `).all(platform);
24
+ return rows.map(toBindingRecord);
25
+ }
26
+ export function getAllBindings(db) {
27
+ const rows = db.prepare(`
28
+ SELECT platform, channel_id, project, bound_by, bound_at, config_json
29
+ FROM bindings
30
+ `).all();
31
+ return rows.map(toBindingRecord);
32
+ }
33
+ export function getChannelForProject(db, platform, project) {
34
+ const row = db.prepare(`
35
+ SELECT channel_id FROM bindings WHERE platform = ? AND project = ?
36
+ `).get(platform, project);
37
+ return row?.channel_id ?? null;
38
+ }
39
+ // ── Helpers ──
40
+ function toBindingRecord(r) {
41
+ return {
42
+ platform: r.platform,
43
+ channelId: r.channel_id,
44
+ project: r.project,
45
+ boundBy: r.bound_by,
46
+ boundAt: r.bound_at,
47
+ configJson: r.config_json ?? undefined,
48
+ };
49
+ }
50
+ //# sourceMappingURL=bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../../src/lib/relay/bindings.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,QAAgB,EAChB,SAAiB,EACjB,OAAe,EACf,MAAc;IAEd,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEzB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAqB,EACrB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEtB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAoC,CAAC;IAC/D,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,QAAgB;IAEhB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAOb,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAqB;IAClD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC,GAAG,EAOJ,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,EAAqB,EACrB,QAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEtB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAuC,CAAC;IAChE,OAAO,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,gBAAgB;AAEhB,SAAS,eAAe,CAAC,CAOxB;IACC,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,UAAU,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;KACvC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { RelayConfig } from './types.js';
1
+ import type { WebhookConfig, RelayConfig } from './types.js';
2
+ export declare function loadWebhookConfig(): WebhookConfig | null;
2
3
  export declare function resetRelayConfigCache(): void;
3
- export declare function getRelayDir(): string;
4
4
  export declare function loadRelayConfig(): RelayConfig | null;
5
- export declare function getTelegramToken(): string | undefined;
5
+ export declare function getRelayDbPath(): string;