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.
- package/README.md +40 -40
- package/dist/agents/improve.agent.d.ts +42 -1
- package/dist/agents/improve.agent.js +102 -7
- package/dist/agents/improve.agent.js.map +1 -1
- package/dist/agents/run.agent.d.ts +0 -1
- package/dist/agents/run.agent.js +10 -7
- package/dist/agents/run.agent.js.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.js +51 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/eval.d.ts +2 -0
- package/dist/commands/eval.js +47 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/improve.js +83 -5
- package/dist/commands/improve.js.map +1 -1
- package/dist/commands/init.js +17 -27
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.js +63 -0
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -0
- package/dist/commands/logs.js +23 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/relay.js +250 -124
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/run.js +21 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/schedule.js +7 -1
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/status.js +9 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/agent-runner.d.ts +5 -1
- package/dist/lib/agent-runner.js +41 -1
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/lib/audit.d.ts +7 -0
- package/dist/lib/audit.js +63 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/callbacks.d.ts +12 -1
- package/dist/lib/callbacks.js +147 -19
- package/dist/lib/callbacks.js.map +1 -1
- package/dist/lib/command-ops/doctor-ops.js +41 -6
- package/dist/lib/command-ops/doctor-ops.js.map +1 -1
- package/dist/lib/command-ops/eval-ops.d.ts +7 -0
- package/dist/lib/command-ops/eval-ops.js +111 -0
- package/dist/lib/command-ops/eval-ops.js.map +1 -0
- package/dist/lib/command-ops/improve-ops.d.ts +14 -1
- package/dist/lib/command-ops/improve-ops.js +369 -17
- package/dist/lib/command-ops/improve-ops.js.map +1 -1
- package/dist/lib/command-ops/run-ops.d.ts +8 -1
- package/dist/lib/command-ops/run-ops.js +25 -4
- package/dist/lib/command-ops/run-ops.js.map +1 -1
- package/dist/lib/command-ops/secrets-migration-ops.js +1 -1
- package/dist/lib/command-ops/secrets-migration-ops.js.map +1 -1
- package/dist/lib/command-ops/status-ops.d.ts +1 -0
- package/dist/lib/command-ops/status-ops.js +19 -7
- package/dist/lib/command-ops/status-ops.js.map +1 -1
- package/dist/lib/config.js +3 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/cron.d.ts +1 -1
- package/dist/lib/cron.js +2 -2
- package/dist/lib/cron.js.map +1 -1
- package/dist/lib/global-config.js +1 -1
- package/dist/lib/global-config.js.map +1 -1
- package/dist/lib/observation.d.ts +60 -2
- package/dist/lib/observation.js +261 -13
- package/dist/lib/observation.js.map +1 -1
- package/dist/lib/registry.d.ts +0 -1
- package/dist/lib/registry.js +1 -1
- package/dist/lib/registry.js.map +1 -1
- package/dist/lib/relay/admin.d.ts +29 -0
- package/dist/lib/relay/admin.js +176 -0
- package/dist/lib/relay/admin.js.map +1 -0
- package/dist/lib/relay/bindings.d.ts +8 -0
- package/dist/lib/relay/bindings.js +50 -0
- package/dist/lib/relay/bindings.js.map +1 -0
- package/dist/lib/relay/config.d.ts +3 -3
- package/dist/lib/relay/config.js +18 -10
- package/dist/lib/relay/config.js.map +1 -1
- package/dist/lib/relay/context.d.ts +31 -0
- package/dist/lib/relay/context.js +118 -0
- package/dist/lib/relay/context.js.map +1 -0
- package/dist/lib/relay/db.d.ts +38 -0
- package/dist/lib/relay/db.js +252 -0
- package/dist/lib/relay/db.js.map +1 -0
- package/dist/lib/relay/executor.d.ts +2 -0
- package/dist/lib/relay/executor.js +108 -0
- package/dist/lib/relay/executor.js.map +1 -0
- package/dist/lib/relay/feedback.d.ts +29 -0
- package/dist/lib/relay/feedback.js +142 -0
- package/dist/lib/relay/feedback.js.map +1 -0
- package/dist/lib/relay/notifier.d.ts +30 -0
- package/dist/lib/relay/notifier.js +78 -0
- package/dist/lib/relay/notifier.js.map +1 -0
- package/dist/lib/relay/notify.d.ts +3 -4
- package/dist/lib/relay/notify.js +43 -159
- package/dist/lib/relay/notify.js.map +1 -1
- package/dist/lib/relay/platform.d.ts +52 -0
- package/dist/lib/relay/platform.js +5 -0
- package/dist/lib/relay/platform.js.map +1 -0
- package/dist/lib/relay/platforms/slack.d.ts +37 -0
- package/dist/lib/relay/platforms/slack.js +240 -0
- package/dist/lib/relay/platforms/slack.js.map +1 -0
- package/dist/lib/relay/platforms/telegram.d.ts +29 -0
- package/dist/lib/relay/platforms/telegram.js +193 -0
- package/dist/lib/relay/platforms/telegram.js.map +1 -0
- package/dist/lib/relay/poster.d.ts +24 -0
- package/dist/lib/relay/poster.js +136 -0
- package/dist/lib/relay/poster.js.map +1 -0
- package/dist/lib/relay/queue.d.ts +18 -0
- package/dist/lib/relay/queue.js +85 -0
- package/dist/lib/relay/queue.js.map +1 -0
- package/dist/lib/relay/router.d.ts +25 -2
- package/dist/lib/relay/router.js +259 -168
- package/dist/lib/relay/router.js.map +1 -1
- package/dist/lib/relay/service.d.ts +31 -7
- package/dist/lib/relay/service.js +281 -200
- package/dist/lib/relay/service.js.map +1 -1
- package/dist/lib/relay/types.d.ts +189 -34
- package/dist/lib/relay/types.js +68 -28
- package/dist/lib/relay/types.js.map +1 -1
- package/dist/lib/sandbox.d.ts +9 -1
- package/dist/lib/sandbox.js +17 -2
- package/dist/lib/sandbox.js.map +1 -1
- package/dist/lib/schedule.d.ts +4 -5
- package/dist/lib/schedule.js +7 -8
- package/dist/lib/schedule.js.map +1 -1
- package/dist/lib/secrets.js +11 -1
- package/dist/lib/secrets.js.map +1 -1
- package/dist/lib/types.d.ts +80 -0
- package/dist/lib/types.js +9 -1
- package/dist/lib/types.js.map +1 -1
- package/package.json +18 -18
- package/prompts/improve.yaml +114 -6
- package/prompts/relay.yaml +29 -0
- package/prompts/run.yaml +36 -2
- package/template/CLAUDE.md +34 -5
- package/template/RUNBOOK.md +5 -5
- package/template/evals/sample.json +16 -0
- package/template/memory/MEMORY.md +6 -0
- package/template/memory/procedures/.gitkeep +0 -0
- package/template/schedule.yaml +1 -1
- package/template/workflows/daily_feedback.ts +78 -2
- package/template/workflows/project_review.ts +51 -2
- package/prompts/relay-chat.yaml +0 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,kCAAkC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACpG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAE3C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,4 +7,8 @@ import type { AgentConfig, AgentResult } from './types.js';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const SYSTEM_ENV_PASSTHROUGH: readonly ["PATH", "LANG", "LC_ALL", "TERM", "TMPDIR", "TMP", "TEMP", "CLAUDE_CONFIG_DIR", "HOME", "USER", "LOGNAME", "SHELL", "XDG_RUNTIME_DIR", "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME", "USERPROFILE", "USERNAME", "APPDATA", "LOCALAPPDATA", "HOMEDRIVE", "HOMEPATH", "SystemRoot", "COMSPEC", "PATHEXT"];
|
|
9
9
|
export declare function buildRuntimeEnv(policyEnv: Record<string, string> | undefined): Record<string, string>;
|
|
10
|
-
export
|
|
10
|
+
export interface RunAgentOptions {
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
tracing?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function runAgent(config: AgentConfig, onText?: (text: string) => void, options?: RunAgentOptions): Promise<AgentResult>;
|
package/dist/lib/agent-runner.js
CHANGED
|
@@ -29,7 +29,17 @@ export function buildRuntimeEnv(policyEnv) {
|
|
|
29
29
|
}
|
|
30
30
|
return { ...base, ...policyEnv };
|
|
31
31
|
}
|
|
32
|
-
export async function runAgent(config, onText) {
|
|
32
|
+
export async function runAgent(config, onText, options) {
|
|
33
|
+
const { timeoutMs, tracing } = options ?? {};
|
|
34
|
+
if (timeoutMs && timeoutMs > 0) {
|
|
35
|
+
return Promise.race([
|
|
36
|
+
runAgentCore(config, onText, tracing),
|
|
37
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Run timed out after ${Math.round(timeoutMs / 1000)}s`)), timeoutMs)),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
return runAgentCore(config, onText, tracing);
|
|
41
|
+
}
|
|
42
|
+
async function runAgentCore(config, onText, tracing) {
|
|
33
43
|
const start = Date.now();
|
|
34
44
|
let resultText = '';
|
|
35
45
|
let structuredOutput = undefined;
|
|
@@ -41,6 +51,7 @@ export async function runAgent(config, onText) {
|
|
|
41
51
|
let cacheReadTokens = 0;
|
|
42
52
|
let cacheCreationTokens = 0;
|
|
43
53
|
let model;
|
|
54
|
+
const spans = [];
|
|
44
55
|
const runtimeEnv = config.env ? buildRuntimeEnv(config.env) : undefined;
|
|
45
56
|
try {
|
|
46
57
|
const q = query({
|
|
@@ -66,6 +77,9 @@ export async function runAgent(config, onText) {
|
|
|
66
77
|
});
|
|
67
78
|
for await (const message of q) {
|
|
68
79
|
const msg = message;
|
|
80
|
+
if (tracing) {
|
|
81
|
+
spans.push(buildSpan(msg, start));
|
|
82
|
+
}
|
|
69
83
|
if (msg.type === 'assistant') {
|
|
70
84
|
const text = typeof msg.content === 'string'
|
|
71
85
|
? msg.content
|
|
@@ -128,6 +142,32 @@ export async function runAgent(config, onText) {
|
|
|
128
142
|
...(cacheReadTokens > 0 && { cacheReadTokens }),
|
|
129
143
|
...(cacheCreationTokens > 0 && { cacheCreationTokens }),
|
|
130
144
|
...(model && { model }),
|
|
145
|
+
...(tracing && spans.length > 0 && { spans }),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function buildSpan(msg, runStartMs) {
|
|
149
|
+
const now = new Date();
|
|
150
|
+
const span = {
|
|
151
|
+
type: msg.type,
|
|
152
|
+
timestamp: now.toISOString(),
|
|
131
153
|
};
|
|
154
|
+
if (msg.tool_name) {
|
|
155
|
+
span.toolName = msg.tool_name;
|
|
156
|
+
}
|
|
157
|
+
if (msg.usage) {
|
|
158
|
+
span.tokens = {
|
|
159
|
+
input: msg.usage.input_tokens,
|
|
160
|
+
output: msg.usage.output_tokens,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (msg.total_cost_usd) {
|
|
164
|
+
span.costUsd = msg.total_cost_usd;
|
|
165
|
+
}
|
|
166
|
+
if (msg.type === 'result') {
|
|
167
|
+
span.durationMs = Date.now() - runStartMs;
|
|
168
|
+
if (msg.error)
|
|
169
|
+
span.message = msg.error.slice(0, 200);
|
|
170
|
+
}
|
|
171
|
+
return span;
|
|
132
172
|
}
|
|
133
173
|
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuditEntry } from './types.js';
|
|
2
|
+
export declare function writeAuditEntry(project: string, entry: AuditEntry): void;
|
|
3
|
+
export declare function readAuditEntries(project: string, options?: {
|
|
4
|
+
days?: number;
|
|
5
|
+
workflow?: string;
|
|
6
|
+
}): AuditEntry[];
|
|
7
|
+
export declare function formatAuditCSV(entries: AuditEntry[]): string;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { existsSync, readFileSync, mkdirSync, readdirSync, appendFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getProjectDir } from './config.js';
|
|
4
|
+
export function writeAuditEntry(project, entry) {
|
|
5
|
+
const auditDir = join(getProjectDir(project), 'logs', 'audit');
|
|
6
|
+
mkdirSync(auditDir, { recursive: true });
|
|
7
|
+
const dateStr = entry.timestamp.split('T')[0];
|
|
8
|
+
const filePath = join(auditDir, `${dateStr}.jsonl`);
|
|
9
|
+
const line = JSON.stringify(entry) + '\n';
|
|
10
|
+
// Append to daily JSONL file
|
|
11
|
+
appendFileSync(filePath, line, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
export function readAuditEntries(project, options) {
|
|
14
|
+
const auditDir = join(getProjectDir(project), 'logs', 'audit');
|
|
15
|
+
if (!existsSync(auditDir))
|
|
16
|
+
return [];
|
|
17
|
+
const days = options?.days ?? 30;
|
|
18
|
+
const cutoff = new Date();
|
|
19
|
+
cutoff.setDate(cutoff.getDate() - days);
|
|
20
|
+
const files = readdirSync(auditDir)
|
|
21
|
+
.filter(f => f.endsWith('.jsonl'))
|
|
22
|
+
.sort()
|
|
23
|
+
.reverse();
|
|
24
|
+
const entries = [];
|
|
25
|
+
for (const file of files) {
|
|
26
|
+
// Quick date check from filename (YYYY-MM-DD.jsonl)
|
|
27
|
+
const fileDate = file.replace('.jsonl', '');
|
|
28
|
+
if (new Date(fileDate) < cutoff)
|
|
29
|
+
break;
|
|
30
|
+
const lines = readFileSync(join(auditDir, file), 'utf8')
|
|
31
|
+
.split('\n')
|
|
32
|
+
.filter(l => l.trim());
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
try {
|
|
35
|
+
const entry = JSON.parse(line);
|
|
36
|
+
if (options?.workflow && entry.workflow !== options.workflow)
|
|
37
|
+
continue;
|
|
38
|
+
entries.push(entry);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Skip corrupt lines
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return entries;
|
|
46
|
+
}
|
|
47
|
+
export function formatAuditCSV(entries) {
|
|
48
|
+
const header = 'timestamp,project,workflow,triggeredBy,runId,success,costUsd,durationMs,model,toolInvocations';
|
|
49
|
+
const rows = entries.map(e => [
|
|
50
|
+
e.timestamp,
|
|
51
|
+
e.project,
|
|
52
|
+
e.workflow,
|
|
53
|
+
e.triggeredBy,
|
|
54
|
+
e.runId,
|
|
55
|
+
e.success,
|
|
56
|
+
e.costUsd.toFixed(4),
|
|
57
|
+
e.durationMs,
|
|
58
|
+
e.model ?? '',
|
|
59
|
+
`"${e.toolInvocations.join(';')}"`,
|
|
60
|
+
].join(','));
|
|
61
|
+
return [header, ...rows].join('\n');
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/callbacks.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
import type { CanUseToolResult } from './types.js';
|
|
2
|
-
|
|
2
|
+
import type { SandboxOptions } from './sandbox.js';
|
|
3
|
+
/** Check if content appears to contain secrets/credentials. */
|
|
4
|
+
export declare function containsPotentialSecrets(content: string): string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Multi-stage output sanitization for relay mode.
|
|
7
|
+
* Stage 1: Redact known secret patterns.
|
|
8
|
+
* Stage 2: Redact literal env values from project environment.
|
|
9
|
+
* Stage 3: Truncate to length cap.
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizeAgentOutput(text: string, projectEnv: Record<string, string>): string;
|
|
12
|
+
export declare function pathEnforcementCallback(projectDir: string, additionalDirs?: string[], sandboxOptions?: SandboxOptions): (toolName: string, input: unknown) => Promise<CanUseToolResult>;
|
|
13
|
+
export declare function feedbackPathEnforcementCallback(projectDir: string, additionalDirs?: string[]): (toolName: string, input: unknown) => Promise<CanUseToolResult>;
|
|
3
14
|
export declare function projectSetupCallback(projectDir: string, policiesDir: string): (toolName: string, input: unknown) => Promise<CanUseToolResult>;
|
package/dist/lib/callbacks.js
CHANGED
|
@@ -1,21 +1,90 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
1
|
+
import { resolve, basename } from 'node:path';
|
|
2
2
|
import { bashCommandEscapesDir } from './bash-security.js';
|
|
3
3
|
import { wrapInSandbox } from './sandbox.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
// Files that feedback agents must never write to
|
|
5
|
+
const FEEDBACK_DENIED_FILES = [
|
|
6
|
+
'.mcp.json',
|
|
7
|
+
'.claude/settings.json',
|
|
8
|
+
'.claude/settings.local.json',
|
|
9
|
+
];
|
|
10
|
+
// Patterns that indicate potential secrets in file content
|
|
11
|
+
const SECRETS_PATTERNS = [
|
|
12
|
+
/(?:sk|pk|api|key|token|secret|password|auth)[-_]?[a-zA-Z0-9]{20,}/i,
|
|
13
|
+
/AIza[0-9A-Za-z_-]{35}/, // Google API key
|
|
14
|
+
/ghp_[0-9a-zA-Z]{36}/, // GitHub PAT
|
|
15
|
+
/(?:AKIA|ASIA)[0-9A-Z]{16}/, // AWS access key
|
|
16
|
+
/xox[bporas]-[0-9a-zA-Z-]{10,}/, // Slack token
|
|
17
|
+
/-----BEGIN (?:RSA |EC )?PRIVATE KEY-----/, // Private key PEM
|
|
18
|
+
/sk-ant-[a-zA-Z0-9_-]{20,}/, // Anthropic API key
|
|
19
|
+
/eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+/, // JWT token
|
|
20
|
+
/[a-z]+:\/\/[^:]+:[^@]+@[^\s]+/, // Connection strings with credentials
|
|
21
|
+
/xapp-[0-9a-zA-Z-]{10,}/, // Slack app-level token
|
|
22
|
+
/(?:[A-Za-z0-9+/]{4}){10,}(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)/, // Base64 blocks >40 chars (requires padding suffix)
|
|
23
|
+
];
|
|
24
|
+
/** Check if content appears to contain secrets/credentials. */
|
|
25
|
+
export function containsPotentialSecrets(content) {
|
|
26
|
+
for (const pattern of SECRETS_PATTERNS) {
|
|
27
|
+
const match = content.match(pattern);
|
|
28
|
+
if (match) {
|
|
29
|
+
return `Potential secret detected: ${match[0].slice(0, 8)}...`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const MAX_OUTPUT_LENGTH = 40_000;
|
|
35
|
+
/**
|
|
36
|
+
* Multi-stage output sanitization for relay mode.
|
|
37
|
+
* Stage 1: Redact known secret patterns.
|
|
38
|
+
* Stage 2: Redact literal env values from project environment.
|
|
39
|
+
* Stage 3: Truncate to length cap.
|
|
40
|
+
*/
|
|
41
|
+
export function sanitizeAgentOutput(text, projectEnv) {
|
|
42
|
+
let sanitized = text;
|
|
43
|
+
// Stage 1: Redact known secret patterns
|
|
44
|
+
for (const pattern of SECRETS_PATTERNS) {
|
|
45
|
+
sanitized = sanitized.replace(new RegExp(pattern.source, pattern.flags + (pattern.flags.includes('g') ? '' : 'g')), '[REDACTED]');
|
|
46
|
+
}
|
|
47
|
+
// Stage 2: Redact literal env values (only values >3 chars to avoid false positives)
|
|
48
|
+
for (const [key, value] of Object.entries(projectEnv)) {
|
|
49
|
+
if (value.length > 3) {
|
|
50
|
+
// Escape special regex chars in the value for safe replacement
|
|
51
|
+
const escaped = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
52
|
+
sanitized = sanitized.replace(new RegExp(escaped, 'g'), `[ENV:${key}]`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Stage 3: Length cap
|
|
56
|
+
if (sanitized.length > MAX_OUTPUT_LENGTH) {
|
|
57
|
+
sanitized = sanitized.slice(0, MAX_OUTPUT_LENGTH) + '\n[Output truncated]';
|
|
58
|
+
}
|
|
59
|
+
return sanitized;
|
|
60
|
+
}
|
|
61
|
+
/** Returns a function that checks whether a path is inside resolvedDir or any of the additionalDirs. */
|
|
62
|
+
function createPathChecker(resolvedDir, additionalDirs) {
|
|
63
|
+
const prefix = resolvedDir + '/';
|
|
64
|
+
return (filePath) => {
|
|
9
65
|
const resolved = resolve(filePath);
|
|
10
|
-
if (resolved ===
|
|
66
|
+
if (resolved === resolvedDir || resolved.startsWith(prefix))
|
|
11
67
|
return true;
|
|
12
|
-
for (const dir of
|
|
68
|
+
for (const dir of additionalDirs) {
|
|
13
69
|
const dirPrefix = dir + '/';
|
|
14
70
|
if (resolved === dir || resolved.startsWith(dirPrefix))
|
|
15
71
|
return true;
|
|
16
72
|
}
|
|
17
73
|
return false;
|
|
18
|
-
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Returns a function that checks whether a path matches any of the denied relative file paths. */
|
|
77
|
+
function createDeniedPathChecker(projectDir, deniedFiles) {
|
|
78
|
+
const deniedPaths = deniedFiles.map((f) => resolve(projectDir, f));
|
|
79
|
+
return (filePath) => {
|
|
80
|
+
const resolved = resolve(filePath);
|
|
81
|
+
return deniedPaths.some((denied) => resolved === denied);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function pathEnforcementCallback(projectDir, additionalDirs = [], sandboxOptions) {
|
|
85
|
+
const resolvedProjectDir = resolve(projectDir);
|
|
86
|
+
const resolvedAdditionalDirs = additionalDirs.map(d => resolve(d));
|
|
87
|
+
const isAllowedPath = createPathChecker(resolvedProjectDir, resolvedAdditionalDirs);
|
|
19
88
|
return async (toolName, input) => {
|
|
20
89
|
// Enforce Read/Write/Edit to project directory + additional directories
|
|
21
90
|
if (['Read', 'Write', 'Edit'].includes(toolName)) {
|
|
@@ -24,6 +93,72 @@ export function pathEnforcementCallback(projectDir, additionalDirs = []) {
|
|
|
24
93
|
return { behavior: 'deny', message: `File access restricted to project directory: ${resolvedProjectDir}` };
|
|
25
94
|
}
|
|
26
95
|
}
|
|
96
|
+
// Output guardrails: check Write/Edit content for secrets
|
|
97
|
+
if (['Write', 'Edit'].includes(toolName)) {
|
|
98
|
+
const content = input?.content
|
|
99
|
+
?? input?.new_string
|
|
100
|
+
?? '';
|
|
101
|
+
const leak = containsPotentialSecrets(content);
|
|
102
|
+
if (leak) {
|
|
103
|
+
return { behavior: 'deny', message: `Output guardrail: ${leak}. Do not write secrets to files.` };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Enforce Glob/Grep path restrictions
|
|
107
|
+
if (['Glob', 'Grep'].includes(toolName)) {
|
|
108
|
+
const searchPath = input?.path;
|
|
109
|
+
if (searchPath && !isAllowedPath(searchPath)) {
|
|
110
|
+
return { behavior: 'deny', message: `Search restricted to project directory: ${resolvedProjectDir}` };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Enforce Bash commands stay within project directory
|
|
114
|
+
if (toolName === 'Bash') {
|
|
115
|
+
const command = input?.command;
|
|
116
|
+
if (command) {
|
|
117
|
+
if (bashCommandEscapesDir(command, resolvedProjectDir)) {
|
|
118
|
+
return { behavior: 'deny', message: `Bash command references paths outside project directory: ${resolvedProjectDir}` };
|
|
119
|
+
}
|
|
120
|
+
const wrapped = wrapInSandbox(command, resolvedProjectDir, resolvedAdditionalDirs, sandboxOptions);
|
|
121
|
+
if (wrapped !== command) {
|
|
122
|
+
return { behavior: 'allow', updatedInput: { ...input, command: wrapped } };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { behavior: 'allow', updatedInput: input };
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function feedbackPathEnforcementCallback(projectDir, additionalDirs = []) {
|
|
130
|
+
const resolvedProjectDir = resolve(projectDir);
|
|
131
|
+
const resolvedAdditionalDirs = additionalDirs.map(d => resolve(d));
|
|
132
|
+
const isAllowedPath = createPathChecker(resolvedProjectDir, resolvedAdditionalDirs);
|
|
133
|
+
const isDeniedForWrite = createDeniedPathChecker(projectDir, FEEDBACK_DENIED_FILES);
|
|
134
|
+
return async (toolName, input) => {
|
|
135
|
+
// For Write/Edit: check deny list first, then allowed path, then secrets
|
|
136
|
+
if (['Write', 'Edit'].includes(toolName)) {
|
|
137
|
+
const filePath = input?.file_path;
|
|
138
|
+
if (filePath) {
|
|
139
|
+
if (isDeniedForWrite(filePath)) {
|
|
140
|
+
return { behavior: 'deny', message: `Feedback agents cannot modify ${basename(filePath)}. Write recommendations to memory/ instead.` };
|
|
141
|
+
}
|
|
142
|
+
if (!isAllowedPath(filePath)) {
|
|
143
|
+
return { behavior: 'deny', message: `File access restricted to project directory: ${resolvedProjectDir}` };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Output guardrails: check content for secrets
|
|
147
|
+
const content = input?.content
|
|
148
|
+
?? input?.new_string
|
|
149
|
+
?? '';
|
|
150
|
+
const leak = containsPotentialSecrets(content);
|
|
151
|
+
if (leak) {
|
|
152
|
+
return { behavior: 'deny', message: `Output guardrail: ${leak}. Do not write secrets to files.` };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Read is allowed for all project files (no deny list for reads)
|
|
156
|
+
if (toolName === 'Read') {
|
|
157
|
+
const filePath = input?.file_path;
|
|
158
|
+
if (filePath && !isAllowedPath(filePath)) {
|
|
159
|
+
return { behavior: 'deny', message: `File access restricted to project directory: ${resolvedProjectDir}` };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
27
162
|
// Enforce Glob/Grep path restrictions
|
|
28
163
|
if (['Glob', 'Grep'].includes(toolName)) {
|
|
29
164
|
const searchPath = input?.path;
|
|
@@ -49,19 +184,12 @@ export function pathEnforcementCallback(projectDir, additionalDirs = []) {
|
|
|
49
184
|
}
|
|
50
185
|
export function projectSetupCallback(projectDir, policiesDir) {
|
|
51
186
|
const resolvedProject = resolve(projectDir);
|
|
52
|
-
const
|
|
53
|
-
const projectPrefix = resolvedProject + '/';
|
|
54
|
-
const policiesPrefix = resolvedPolicies + '/';
|
|
187
|
+
const isAllowedPath = createPathChecker(resolvedProject, [resolve(policiesDir)]);
|
|
55
188
|
return async (toolName, input) => {
|
|
56
189
|
if (['Write', 'Edit'].includes(toolName)) {
|
|
57
190
|
const filePath = input?.file_path;
|
|
58
|
-
if (filePath) {
|
|
59
|
-
|
|
60
|
-
const inProject = resolved === resolvedProject || resolved.startsWith(projectPrefix);
|
|
61
|
-
const inPolicies = resolved === resolvedPolicies || resolved.startsWith(policiesPrefix);
|
|
62
|
-
if (!inProject && !inPolicies) {
|
|
63
|
-
return { behavior: 'deny', message: `Write restricted to project and policies directories` };
|
|
64
|
-
}
|
|
191
|
+
if (filePath && !isAllowedPath(filePath)) {
|
|
192
|
+
return { behavior: 'deny', message: `Write restricted to project and policies directories` };
|
|
65
193
|
}
|
|
66
194
|
}
|
|
67
195
|
// Restrict Bash commands to project directory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/lib/callbacks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/lib/callbacks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,iDAAiD;AACjD,MAAM,qBAAqB,GAAG;IAC5B,WAAW;IACX,uBAAuB;IACvB,6BAA6B;CAC9B,CAAC;AAEF,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG;IACvB,oEAAoE;IACpE,uBAAuB,EAAwB,iBAAiB;IAChE,qBAAqB,EAA2B,aAAa;IAC7D,2BAA2B,EAAqB,iBAAiB;IACjE,+BAA+B,EAAiB,cAAc;IAC9D,0CAA0C,EAAO,kBAAkB;IACnE,2BAA2B,EAAqB,oBAAoB;IACpE,sCAAsC,EAAS,YAAY;IAC3D,+BAA+B,EAAiB,sCAAsC;IACtF,wBAAwB,EAAwB,wBAAwB;IACxE,mEAAmE,EAAE,oDAAoD;CAC1H,CAAC;AAEF,+DAA+D;AAC/D,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,8BAA8B,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,UAAkC;IAClF,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,wCAAwC;IACxC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACpI,CAAC;IAED,qFAAqF;IACrF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,+DAA+D;YAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7D,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,SAAS,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACzC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,sBAAsB,CAAC;IAC7E,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wGAAwG;AACxG,SAAS,iBAAiB,CAAC,WAAmB,EAAE,cAAwB;IACtE,MAAM,MAAM,GAAG,WAAW,GAAG,GAAG,CAAC;IACjC,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACzE,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC;YAC5B,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAS,uBAAuB,CAAC,UAAkB,EAAE,WAAqB;IACxE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,QAAgB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,UAAkB,EAClB,iBAA2B,EAAE,EAC7B,cAA+B;IAE/B,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,sBAAsB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IAEpF,OAAO,KAAK,EAAE,QAAgB,EAAE,KAAc,EAA6B,EAAE;QAC3E,wEAAwE;QACxE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAI,KAAiC,EAAE,SAA+B,CAAC;YACrF,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gDAAgD,kBAAkB,EAAE,EAAE,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,OAAO,GAAI,KAAiC,EAAE,OAAiB;mBAC/D,KAAiC,EAAE,UAAoB;mBACxD,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,IAAI,kCAAkC,EAAE,CAAC;YACpG,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,UAAU,GAAI,KAAiC,EAAE,IAA0B,CAAC;YAClF,IAAI,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,kBAAkB,EAAE,EAAE,CAAC;YACxG,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAI,KAAiC,EAAE,OAA6B,CAAC;YAClF,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;oBACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,4DAA4D,kBAAkB,EAAE,EAAE,CAAC;gBACzH,CAAC;gBACD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,cAAc,CAAC,CAAC;gBACnG,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;oBACxB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAI,KAAiC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC1G,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,UAAkB,EAClB,iBAA2B,EAAE;IAE7B,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,sBAAsB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAEpF,OAAO,KAAK,EAAE,QAAgB,EAAE,KAAc,EAA6B,EAAE;QAC3E,yEAAyE;QACzE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAI,KAAiC,EAAE,SAA+B,CAAC;YACrF,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iCAAiC,QAAQ,CAAC,QAAQ,CAAC,6CAA6C,EAAE,CAAC;gBACzI,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gDAAgD,kBAAkB,EAAE,EAAE,CAAC;gBAC7G,CAAC;YACH,CAAC;YACD,+CAA+C;YAC/C,MAAM,OAAO,GAAI,KAAiC,EAAE,OAAiB;mBAC/D,KAAiC,EAAE,UAAoB;mBACxD,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,IAAI,kCAAkC,EAAE,CAAC;YACpG,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAI,KAAiC,EAAE,SAA+B,CAAC;YACrF,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gDAAgD,kBAAkB,EAAE,EAAE,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,UAAU,GAAI,KAAiC,EAAE,IAA0B,CAAC;YAClF,IAAI,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,kBAAkB,EAAE,EAAE,CAAC;YACxG,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAI,KAAiC,EAAE,OAA6B,CAAC;YAClF,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;oBACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,4DAA4D,kBAAkB,EAAE,EAAE,CAAC;gBACzH,CAAC;gBACD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;gBACnF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;oBACxB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAI,KAAiC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC1G,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,WAAmB;IAEnB,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,iBAAiB,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO,KAAK,EAAE,QAAgB,EAAE,KAAc,EAA6B,EAAE;QAC3E,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAI,KAAiC,EAAE,SAA+B,CAAC;YACrF,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC;YAC/F,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAI,KAAiC,EAAE,OAA6B,CAAC;YAClF,IAAI,OAAO,IAAI,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,CAAC;gBAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,4DAA4D,eAAe,EAAE,EAAE,CAAC;YACtH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { existsSync, accessSync, constants } from 'node:fs';
|
|
1
|
+
import { existsSync, accessSync, constants, readdirSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { getConfigRoot } from '../config.js';
|
|
3
|
+
import { getConfigRoot, SHARED_DOCS_DIR } from '../config.js';
|
|
4
4
|
import { getGlobalConfigPath } from '../global-config.js';
|
|
5
5
|
import { getRegisteredProjects } from '../registry.js';
|
|
6
6
|
import { loadPolicy, resetPolicyCache } from '../policy.js';
|
|
@@ -48,15 +48,15 @@ export function runDoctorChecks() {
|
|
|
48
48
|
return checks;
|
|
49
49
|
}
|
|
50
50
|
// 3. Workspace marker exists
|
|
51
|
-
const markerPath = join(configRoot, '
|
|
51
|
+
const markerPath = join(configRoot, 'pilotlynx.yaml');
|
|
52
52
|
if (existsSync(markerPath)) {
|
|
53
|
-
checks.push({ name: 'Workspace marker', status: 'pass', message: '
|
|
53
|
+
checks.push({ name: 'Workspace marker', status: 'pass', message: 'pilotlynx.yaml found' });
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
56
|
checks.push({
|
|
57
57
|
name: 'Workspace marker',
|
|
58
58
|
status: 'fail',
|
|
59
|
-
message: '
|
|
59
|
+
message: 'pilotlynx.yaml not found in config root',
|
|
60
60
|
suggestion: 'Config root may be corrupt. Re-run `pilotlynx init`.',
|
|
61
61
|
});
|
|
62
62
|
}
|
|
@@ -78,7 +78,7 @@ export function runDoctorChecks() {
|
|
|
78
78
|
const projects = getRegisteredProjects();
|
|
79
79
|
const missing = [];
|
|
80
80
|
for (const [name, entry] of Object.entries(projects)) {
|
|
81
|
-
if (!existsSync(entry.
|
|
81
|
+
if (!existsSync(entry.path)) {
|
|
82
82
|
missing.push(name);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
@@ -192,6 +192,41 @@ export function runDoctorChecks() {
|
|
|
192
192
|
suggestion: 'Run `pilotlynx init` or copy the bundled template to pilotlynx/template/.',
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
|
+
// 10. Expired shared patterns
|
|
196
|
+
try {
|
|
197
|
+
const patternsDir = join(SHARED_DOCS_DIR(), 'patterns');
|
|
198
|
+
if (existsSync(patternsDir)) {
|
|
199
|
+
const now = new Date();
|
|
200
|
+
const files = readdirSync(patternsDir).filter((f) => f.endsWith('.json'));
|
|
201
|
+
let expiredCount = 0;
|
|
202
|
+
for (const file of files) {
|
|
203
|
+
try {
|
|
204
|
+
const content = readFileSync(join(patternsDir, file), 'utf8');
|
|
205
|
+
const pattern = JSON.parse(content);
|
|
206
|
+
if (new Date(pattern.expiresAt) < now) {
|
|
207
|
+
expiredCount++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Skip corrupt files
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (expiredCount === 0) {
|
|
215
|
+
checks.push({ name: 'Shared patterns', status: 'pass', message: 'No expired patterns' });
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
checks.push({
|
|
219
|
+
name: 'Shared patterns',
|
|
220
|
+
status: 'warn',
|
|
221
|
+
message: `${expiredCount} expired pattern(s) found`,
|
|
222
|
+
suggestion: 'Expired patterns are filtered from reads but still occupy disk. Run improve to regenerate or manually remove them.',
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Non-fatal — skip if patterns dir is inaccessible
|
|
229
|
+
}
|
|
195
230
|
return checks;
|
|
196
231
|
}
|
|
197
232
|
//# sourceMappingURL=doctor-ops.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-ops.js","sourceRoot":"","sources":["../../../src/lib/command-ops/doctor-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-ops.js","sourceRoot":"","sources":["../../../src/lib/command-ops/doctor-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAYrD,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,0CAA0C;IAC1C,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAC/C,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,sEAAsE;SACnF,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,aAAa,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iBAAiB,UAAU,EAAE;gBACtC,UAAU,EAAE,8BAA8B;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,+BAA+B;YACxC,UAAU,EAAE,6CAA6C;SAC1D,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6BAA6B;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC7F,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yCAAyC;YAClD,UAAU,EAAE,sDAAsD;SACnE,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,+BAA+B;YACxC,UAAU,EAAE,UAAU,OAAO,kDAAkD;SAChF,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,KAAK,8BAA8B;aAChD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrD,UAAU,EAAE,oFAAoF;aACjG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACtF,UAAU,EAAE,wCAAwC;SACrD,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACxF,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,gBAAgB,EAAE,CAAC;YACnB,UAAU,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC3E,UAAU,EAAE,oDAAoD;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,sEAAsE;SACnF,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAClF,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,gBAAgB,EAAE,CAAC;YACnB,UAAU,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC3E,UAAU,EAAE,iDAAiD;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,iEAAiE;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,IAAI,uBAAuB,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,eAAe;gBACxB,UAAU,EAAE,oFAAoF;aACjG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yBAAyB;YAClC,UAAU,EAAE,+CAA+C;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,0BAA0B;YACnC,UAAU,EAAE,2EAA2E;SACxF,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;oBACrD,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC;wBACtC,YAAY,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;YACD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,iBAAiB;oBACvB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,GAAG,YAAY,2BAA2B;oBACnD,UAAU,EAAE,oHAAoH;iBACjI,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|