claudelink 1.4.3 → 1.5.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 +34 -1
- package/dist/arm-compact.d.ts +2 -0
- package/dist/arm-compact.js +182 -0
- package/dist/arm-compact.js.map +1 -0
- package/dist/cli.js +145 -0
- package/dist/cli.js.map +1 -1
- package/dist/compact-analyzer.d.ts +67 -0
- package/dist/compact-analyzer.js +309 -0
- package/dist/compact-analyzer.js.map +1 -0
- package/dist/compact-decision.d.ts +19 -0
- package/dist/compact-decision.js +47 -0
- package/dist/compact-decision.js.map +1 -0
- package/dist/compact-executor.d.ts +27 -0
- package/dist/compact-executor.js +160 -0
- package/dist/compact-executor.js.map +1 -0
- package/dist/context-watcher-settings.d.ts +21 -0
- package/dist/context-watcher-settings.js +176 -0
- package/dist/context-watcher-settings.js.map +1 -0
- package/dist/context-watcher.d.ts +70 -0
- package/dist/context-watcher.js +1005 -0
- package/dist/context-watcher.js.map +1 -0
- package/dist/db.d.ts +22 -1
- package/dist/db.js +184 -5
- package/dist/db.js.map +1 -1
- package/dist/hooks/stop-hook.js +30 -1
- package/dist/hooks/stop-hook.js.map +1 -1
- package/dist/index.js +144 -12
- package/dist/index.js.map +1 -1
- package/dist/manual-decision.d.ts +23 -0
- package/dist/manual-decision.js +67 -0
- package/dist/manual-decision.js.map +1 -0
- package/dist/prompt-clear.d.ts +8 -0
- package/dist/prompt-clear.js +33 -0
- package/dist/prompt-clear.js.map +1 -0
- package/dist/recovery-watcher.d.ts +6 -0
- package/dist/recovery-watcher.js +20 -0
- package/dist/recovery-watcher.js.map +1 -1
- package/dist/role-collision.d.ts +6 -0
- package/dist/role-collision.js +51 -0
- package/dist/role-collision.js.map +1 -0
- package/dist/ui-server.d.ts +4 -0
- package/dist/ui-server.js +899 -20
- package/dist/ui-server.js.map +1 -1
- package/dist/usage-reader.d.ts +79 -0
- package/dist/usage-reader.js +553 -0
- package/dist/usage-reader.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Persistent settings for the context-hygiene watcher. Stored as JSON at
|
|
3
|
+
// ~/.claudelink/context-watcher.json. Parallel to recovery-watcher-settings.ts.
|
|
4
|
+
//
|
|
5
|
+
// The watcher monitors each live agent's CURRENT context occupancy (read from
|
|
6
|
+
// its Claude Code transcript) and, at a threshold, nudges /compact into that
|
|
7
|
+
// terminal so the agent stops re-reading a huge context every turn.
|
|
8
|
+
//
|
|
9
|
+
// SAFETY: mode defaults to "observe" — detect + log + project savings, NEVER
|
|
10
|
+
// inject. "inject" mode (types /compact into live terminals) is founder-gated
|
|
11
|
+
// and additionally idle-gated at dispatch time. enabled defaults to false.
|
|
12
|
+
//
|
|
13
|
+
// Defaults are CONSERVATIVE and PROVISIONAL — thresholdTokens / compactBaseline
|
|
14
|
+
// align to the team's token/context protocol (dev-03) once it lands.
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.readContextWatcherSettings = readContextWatcherSettings;
|
|
20
|
+
exports.writeContextWatcherSettings = writeContextWatcherSettings;
|
|
21
|
+
const fs_1 = __importDefault(require("fs"));
|
|
22
|
+
const path_1 = __importDefault(require("path"));
|
|
23
|
+
const os_1 = __importDefault(require("os"));
|
|
24
|
+
// Settings location: defaults to ~/.claudelink/context-watcher.json. Honors
|
|
25
|
+
// CLAUDELINK_CONTEXT_WATCHER_SETTINGS env var override so tests can run
|
|
26
|
+
// against a temp file without disturbing the live fleet's config.
|
|
27
|
+
// Evaluated on each call (not cached at module load) so tests can set the
|
|
28
|
+
// env var AFTER importing the module.
|
|
29
|
+
function settingsPath() {
|
|
30
|
+
return (process.env.CLAUDELINK_CONTEXT_WATCHER_SETTINGS ||
|
|
31
|
+
path_1.default.join(os_1.default.homedir(), ".claudelink", "context-watcher.json"));
|
|
32
|
+
}
|
|
33
|
+
const DEFAULTS = {
|
|
34
|
+
enabled: false,
|
|
35
|
+
mode: "observe",
|
|
36
|
+
intervalSec: 120,
|
|
37
|
+
contextOccupancyThreshold: 0.5,
|
|
38
|
+
dollarPerTurnThreshold: 0.27,
|
|
39
|
+
handshakeOverheadTokens: 5000,
|
|
40
|
+
activeWindowMin: 15,
|
|
41
|
+
thresholdTokens: 200000,
|
|
42
|
+
compactBaselineTokens: 60000,
|
|
43
|
+
cooldownMin: 30,
|
|
44
|
+
message: "/compact",
|
|
45
|
+
askMessage: "Context check (automated): you're at high context occupancy and currently idle. If this is a good moment to /compact, FIRST update your HANDOVER.md / artifacts so nothing is lost, THEN call signal_checkpoint with safe_to_clear=true and your handoff_path to consent — I'll /compact you on the next check. If you're mid-something-heavy, call signal_checkpoint with safe_to_clear=false and a one-line note and I'll hold off.",
|
|
46
|
+
consentFreshMin: 15,
|
|
47
|
+
injectAllowlist: [], // fail-closed: empty = arm nobody
|
|
48
|
+
oneShot: true,
|
|
49
|
+
activeSince: null,
|
|
50
|
+
};
|
|
51
|
+
function cleanAllowlist(v) {
|
|
52
|
+
if (!Array.isArray(v))
|
|
53
|
+
return [];
|
|
54
|
+
// Trim whitespace + drop empties + dedupe. Without trim, `["dev", "dev "]`
|
|
55
|
+
// would pass two distinct entries through and the gate's role-includes check
|
|
56
|
+
// would treat "dev " and "dev" as different roles — a footgun if the
|
|
57
|
+
// operator pastes a list with a stray space. Dedupe is belt-and-braces.
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const x of v) {
|
|
61
|
+
if (typeof x !== "string")
|
|
62
|
+
continue;
|
|
63
|
+
const trimmed = x.trim();
|
|
64
|
+
if (trimmed.length === 0)
|
|
65
|
+
continue;
|
|
66
|
+
if (seen.has(trimmed))
|
|
67
|
+
continue;
|
|
68
|
+
seen.add(trimmed);
|
|
69
|
+
out.push(trimmed);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function clampInt(n, lo, hi, dflt) {
|
|
74
|
+
if (Number.isNaN(n))
|
|
75
|
+
return dflt;
|
|
76
|
+
return Math.max(lo, Math.min(hi, Math.floor(n)));
|
|
77
|
+
}
|
|
78
|
+
// Fractional [0,1]-style threshold, clamped to a sensible operational range.
|
|
79
|
+
// Lower bound 0.10 prevents a typo (0.05) from arming the whole fleet at 10K
|
|
80
|
+
// tokens; upper bound 0.95 keeps any nonzero fire latitude on a model whose
|
|
81
|
+
// window we mis-estimate.
|
|
82
|
+
function clampFrac(n, lo, hi, dflt) {
|
|
83
|
+
if (!Number.isFinite(n))
|
|
84
|
+
return dflt;
|
|
85
|
+
return Math.max(lo, Math.min(hi, n));
|
|
86
|
+
}
|
|
87
|
+
function readContextWatcherSettings() {
|
|
88
|
+
const SETTINGS_PATH = settingsPath();
|
|
89
|
+
try {
|
|
90
|
+
const raw = fs_1.default.readFileSync(SETTINGS_PATH, "utf8");
|
|
91
|
+
const parsed = JSON.parse(raw);
|
|
92
|
+
return {
|
|
93
|
+
enabled: Boolean(parsed.enabled),
|
|
94
|
+
mode: parsed.mode === "inject" ? "inject" : "observe",
|
|
95
|
+
intervalSec: clampInt(Number(parsed.intervalSec), 30, 600, DEFAULTS.intervalSec),
|
|
96
|
+
contextOccupancyThreshold: clampFrac(Number(parsed.contextOccupancyThreshold), 0.1, 0.95, DEFAULTS.contextOccupancyThreshold),
|
|
97
|
+
dollarPerTurnThreshold: Number.isFinite(Number(parsed.dollarPerTurnThreshold)) && Number(parsed.dollarPerTurnThreshold) > 0
|
|
98
|
+
? Math.max(0.01, Math.min(10, Number(parsed.dollarPerTurnThreshold)))
|
|
99
|
+
: DEFAULTS.dollarPerTurnThreshold,
|
|
100
|
+
handshakeOverheadTokens: clampInt(Number(parsed.handshakeOverheadTokens), 0, 50000, DEFAULTS.handshakeOverheadTokens),
|
|
101
|
+
activeWindowMin: clampInt(Number(parsed.activeWindowMin), 1, 240, DEFAULTS.activeWindowMin),
|
|
102
|
+
thresholdTokens: clampInt(Number(parsed.thresholdTokens), 20000, 1000000, DEFAULTS.thresholdTokens),
|
|
103
|
+
compactBaselineTokens: clampInt(Number(parsed.compactBaselineTokens), 5000, 200000, DEFAULTS.compactBaselineTokens),
|
|
104
|
+
cooldownMin: clampInt(Number(parsed.cooldownMin), 5, 240, DEFAULTS.cooldownMin),
|
|
105
|
+
message: typeof parsed.message === "string" && parsed.message.length > 0
|
|
106
|
+
? parsed.message
|
|
107
|
+
: DEFAULTS.message,
|
|
108
|
+
askMessage: typeof parsed.askMessage === "string" && parsed.askMessage.length > 0
|
|
109
|
+
? parsed.askMessage
|
|
110
|
+
: DEFAULTS.askMessage,
|
|
111
|
+
consentFreshMin: clampInt(Number(parsed.consentFreshMin), 1, 120, DEFAULTS.consentFreshMin),
|
|
112
|
+
injectAllowlist: cleanAllowlist(parsed.injectAllowlist),
|
|
113
|
+
oneShot: parsed.oneShot === undefined ? DEFAULTS.oneShot : Boolean(parsed.oneShot),
|
|
114
|
+
activeSince: typeof parsed.activeSince === "string" && parsed.activeSince.length > 0
|
|
115
|
+
? parsed.activeSince
|
|
116
|
+
: null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return { ...DEFAULTS };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function writeContextWatcherSettings(partial) {
|
|
124
|
+
const current = readContextWatcherSettings();
|
|
125
|
+
const merged = {
|
|
126
|
+
enabled: partial.enabled !== undefined ? Boolean(partial.enabled) : current.enabled,
|
|
127
|
+
mode: partial.mode === "inject" || partial.mode === "observe" ? partial.mode : current.mode,
|
|
128
|
+
intervalSec: partial.intervalSec !== undefined
|
|
129
|
+
? clampInt(Number(partial.intervalSec), 30, 600, current.intervalSec)
|
|
130
|
+
: current.intervalSec,
|
|
131
|
+
contextOccupancyThreshold: partial.contextOccupancyThreshold !== undefined
|
|
132
|
+
? clampFrac(Number(partial.contextOccupancyThreshold), 0.1, 0.95, current.contextOccupancyThreshold)
|
|
133
|
+
: current.contextOccupancyThreshold,
|
|
134
|
+
dollarPerTurnThreshold: partial.dollarPerTurnThreshold !== undefined && Number(partial.dollarPerTurnThreshold) > 0
|
|
135
|
+
? Math.max(0.01, Math.min(10, Number(partial.dollarPerTurnThreshold)))
|
|
136
|
+
: current.dollarPerTurnThreshold,
|
|
137
|
+
handshakeOverheadTokens: partial.handshakeOverheadTokens !== undefined
|
|
138
|
+
? clampInt(Number(partial.handshakeOverheadTokens), 0, 50000, current.handshakeOverheadTokens)
|
|
139
|
+
: current.handshakeOverheadTokens,
|
|
140
|
+
activeWindowMin: partial.activeWindowMin !== undefined
|
|
141
|
+
? clampInt(Number(partial.activeWindowMin), 1, 240, current.activeWindowMin)
|
|
142
|
+
: current.activeWindowMin,
|
|
143
|
+
thresholdTokens: partial.thresholdTokens !== undefined
|
|
144
|
+
? clampInt(Number(partial.thresholdTokens), 20000, 1000000, current.thresholdTokens)
|
|
145
|
+
: current.thresholdTokens,
|
|
146
|
+
compactBaselineTokens: partial.compactBaselineTokens !== undefined
|
|
147
|
+
? clampInt(Number(partial.compactBaselineTokens), 5000, 200000, current.compactBaselineTokens)
|
|
148
|
+
: current.compactBaselineTokens,
|
|
149
|
+
cooldownMin: partial.cooldownMin !== undefined
|
|
150
|
+
? clampInt(Number(partial.cooldownMin), 5, 240, current.cooldownMin)
|
|
151
|
+
: current.cooldownMin,
|
|
152
|
+
message: partial.message !== undefined && typeof partial.message === "string" && partial.message.length > 0
|
|
153
|
+
? partial.message
|
|
154
|
+
: current.message,
|
|
155
|
+
askMessage: partial.askMessage !== undefined && typeof partial.askMessage === "string" && partial.askMessage.length > 0
|
|
156
|
+
? partial.askMessage
|
|
157
|
+
: current.askMessage,
|
|
158
|
+
consentFreshMin: partial.consentFreshMin !== undefined
|
|
159
|
+
? clampInt(Number(partial.consentFreshMin), 1, 120, current.consentFreshMin)
|
|
160
|
+
: current.consentFreshMin,
|
|
161
|
+
injectAllowlist: partial.injectAllowlist !== undefined ? cleanAllowlist(partial.injectAllowlist) : current.injectAllowlist,
|
|
162
|
+
oneShot: partial.oneShot !== undefined ? Boolean(partial.oneShot) : current.oneShot,
|
|
163
|
+
activeSince: partial.activeSince !== undefined
|
|
164
|
+
? (typeof partial.activeSince === "string" && partial.activeSince.length > 0 ? partial.activeSince : null)
|
|
165
|
+
: current.activeSince,
|
|
166
|
+
};
|
|
167
|
+
const SETTINGS_PATH = settingsPath();
|
|
168
|
+
const dir = path_1.default.dirname(SETTINGS_PATH);
|
|
169
|
+
if (!fs_1.default.existsSync(dir))
|
|
170
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
171
|
+
const tmp = SETTINGS_PATH + ".tmp";
|
|
172
|
+
fs_1.default.writeFileSync(tmp, JSON.stringify(merged, null, 2));
|
|
173
|
+
fs_1.default.renameSync(tmp, SETTINGS_PATH);
|
|
174
|
+
return merged;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=context-watcher-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-watcher-settings.js","sourceRoot":"","sources":["../src/context-watcher-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { WatcherMode } from "./context-watcher-settings.js";
|
|
2
|
+
export interface GateStatusFields {
|
|
3
|
+
role: string;
|
|
4
|
+
agent_id: string;
|
|
5
|
+
mode: WatcherMode;
|
|
6
|
+
decision: string;
|
|
7
|
+
reason?: string;
|
|
8
|
+
context?: number;
|
|
9
|
+
occupancy_pct?: number;
|
|
10
|
+
model?: string;
|
|
11
|
+
per_turn_usd?: number;
|
|
12
|
+
turns_per_hr?: number;
|
|
13
|
+
progressing?: boolean;
|
|
14
|
+
signal_age_min?: number | null;
|
|
15
|
+
signal_age_turns?: number;
|
|
16
|
+
safe_to_clear?: 0 | 1;
|
|
17
|
+
economic_gate?: boolean;
|
|
18
|
+
ambiguous?: boolean;
|
|
19
|
+
allowlisted?: boolean;
|
|
20
|
+
idle?: boolean;
|
|
21
|
+
fresh_consent?: boolean;
|
|
22
|
+
handoff_ok?: boolean;
|
|
23
|
+
net_saved_usd?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function formatGateStatus(f: GateStatusFields): string;
|
|
26
|
+
interface TurnEconomics {
|
|
27
|
+
contextTokens: number;
|
|
28
|
+
model: string;
|
|
29
|
+
lastTurnTs: number;
|
|
30
|
+
turnsPerHour: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function latestTurnEconomics(file: string): Promise<TurnEconomics | null>;
|
|
33
|
+
export interface CompactOpportunity {
|
|
34
|
+
windowDays: number;
|
|
35
|
+
thresholdTokens: number;
|
|
36
|
+
compactBaselineTokens: number;
|
|
37
|
+
flaggedTurns: number;
|
|
38
|
+
excessTokensUpperBound: number;
|
|
39
|
+
estUsdUpperBound: number;
|
|
40
|
+
perProject: {
|
|
41
|
+
label: string;
|
|
42
|
+
roles: string[];
|
|
43
|
+
flaggedTurns: number;
|
|
44
|
+
excessTokens: number;
|
|
45
|
+
}[];
|
|
46
|
+
}
|
|
47
|
+
interface AgentRef {
|
|
48
|
+
role: string;
|
|
49
|
+
pid: number;
|
|
50
|
+
}
|
|
51
|
+
export declare function projectCompactOpportunity(agents: AgentRef[], windowDays?: number, thresholdTokens?: number, compactBaselineTokens?: number): Promise<CompactOpportunity>;
|
|
52
|
+
export declare function armGate(file: string, checkpointTs: number | null): Promise<{
|
|
53
|
+
idle: boolean;
|
|
54
|
+
turnsSinceSignal: number;
|
|
55
|
+
detail: string;
|
|
56
|
+
latestType: string;
|
|
57
|
+
ageSec: number;
|
|
58
|
+
}>;
|
|
59
|
+
export interface ContextWatcherHandle {
|
|
60
|
+
reschedule: () => void;
|
|
61
|
+
stop: () => void;
|
|
62
|
+
tickNow: () => Promise<{
|
|
63
|
+
checked: number;
|
|
64
|
+
flagged: number;
|
|
65
|
+
wouldNudge: number;
|
|
66
|
+
injected: number;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
export declare function startContextWatcher(): ContextWatcherHandle;
|
|
70
|
+
export {};
|