claude-code-infinite 1.0.11 → 1.0.14
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 +214 -47
- package/dist/cc-request.d.ts +94 -0
- package/dist/cc-request.d.ts.map +1 -0
- package/dist/cc-request.js +194 -0
- package/dist/cc-request.js.map +1 -0
- package/dist/claude-env.d.ts +30 -0
- package/dist/claude-env.d.ts.map +1 -0
- package/dist/claude-env.js +55 -0
- package/dist/claude-env.js.map +1 -0
- package/dist/cli-args.d.ts +32 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +72 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-lifecycle.d.ts +17 -0
- package/dist/cli-lifecycle.d.ts.map +1 -0
- package/dist/cli-lifecycle.js +30 -0
- package/dist/cli-lifecycle.js.map +1 -0
- package/dist/cli-main.d.ts +15 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +464 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.js +13 -178
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -3
- package/dist/config.js.map +1 -1
- package/dist/count-tokens.d.ts +78 -0
- package/dist/count-tokens.d.ts.map +1 -0
- package/dist/count-tokens.js +277 -0
- package/dist/count-tokens.js.map +1 -0
- package/dist/final-index.d.ts +10 -0
- package/dist/final-index.d.ts.map +1 -0
- package/dist/final-index.js +37 -0
- package/dist/final-index.js.map +1 -0
- package/dist/hooks.d.ts +239 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +618 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/memtree-fetch.d.ts +24 -0
- package/dist/memtree-fetch.d.ts.map +1 -0
- package/dist/memtree-fetch.js +121 -0
- package/dist/memtree-fetch.js.map +1 -0
- package/dist/memtree-finder.d.ts +99 -0
- package/dist/memtree-finder.d.ts.map +1 -0
- package/dist/memtree-finder.js +235 -0
- package/dist/memtree-finder.js.map +1 -0
- package/dist/memtree-links.d.ts +16 -0
- package/dist/memtree-links.d.ts.map +1 -0
- package/dist/memtree-links.js +66 -0
- package/dist/memtree-links.js.map +1 -0
- package/dist/memtree-mcp-config.d.ts +28 -0
- package/dist/memtree-mcp-config.d.ts.map +1 -0
- package/dist/memtree-mcp-config.js +121 -0
- package/dist/memtree-mcp-config.js.map +1 -0
- package/dist/memtree-mcp.d.ts +265 -0
- package/dist/memtree-mcp.d.ts.map +1 -0
- package/dist/memtree-mcp.js +667 -0
- package/dist/memtree-mcp.js.map +1 -0
- package/dist/memtree-newest.d.ts +74 -0
- package/dist/memtree-newest.d.ts.map +1 -0
- package/dist/memtree-newest.js +217 -0
- package/dist/memtree-newest.js.map +1 -0
- package/dist/memtree-tools.d.ts +105 -0
- package/dist/memtree-tools.d.ts.map +1 -0
- package/dist/memtree-tools.js +408 -0
- package/dist/memtree-tools.js.map +1 -0
- package/dist/memtree.d.ts +398 -0
- package/dist/memtree.d.ts.map +1 -0
- package/dist/memtree.js +1231 -0
- package/dist/memtree.js.map +1 -0
- package/dist/notices.d.ts +177 -0
- package/dist/notices.d.ts.map +1 -0
- package/dist/notices.js +469 -0
- package/dist/notices.js.map +1 -0
- package/dist/payment-gate.d.ts +53 -0
- package/dist/payment-gate.d.ts.map +1 -0
- package/dist/payment-gate.js +97 -0
- package/dist/payment-gate.js.map +1 -0
- package/dist/project-meta.d.ts +15 -0
- package/dist/project-meta.d.ts.map +1 -0
- package/dist/project-meta.js +80 -0
- package/dist/project-meta.js.map +1 -0
- package/dist/prompt-accounting.d.ts +12 -0
- package/dist/prompt-accounting.d.ts.map +1 -0
- package/dist/prompt-accounting.js +70 -0
- package/dist/prompt-accounting.js.map +1 -0
- package/dist/proxy.d.ts +197 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +4247 -0
- package/dist/proxy.js.map +1 -0
- package/dist/reqlog.d.ts +419 -0
- package/dist/reqlog.d.ts.map +1 -0
- package/dist/reqlog.js +146 -0
- package/dist/reqlog.js.map +1 -0
- package/dist/request-sizing.d.ts +52 -0
- package/dist/request-sizing.d.ts.map +1 -0
- package/dist/request-sizing.js +92 -0
- package/dist/request-sizing.js.map +1 -0
- package/dist/resume-repair-file.d.ts +17 -0
- package/dist/resume-repair-file.d.ts.map +1 -0
- package/dist/resume-repair-file.js +100 -0
- package/dist/resume-repair-file.js.map +1 -0
- package/dist/resume-repair.d.ts +27 -0
- package/dist/resume-repair.d.ts.map +1 -0
- package/dist/resume-repair.js +198 -0
- package/dist/resume-repair.js.map +1 -0
- package/dist/route-cache.d.ts +5 -0
- package/dist/route-cache.d.ts.map +1 -0
- package/dist/route-cache.js +63 -0
- package/dist/route-cache.js.map +1 -0
- package/dist/route-fallback.d.ts +29 -0
- package/dist/route-fallback.d.ts.map +1 -0
- package/dist/route-fallback.js +49 -0
- package/dist/route-fallback.js.map +1 -0
- package/dist/route-identity.d.ts +6 -0
- package/dist/route-identity.d.ts.map +1 -0
- package/dist/route-identity.js +100 -0
- package/dist/route-identity.js.map +1 -0
- package/dist/transcript-usage.d.ts +57 -0
- package/dist/transcript-usage.d.ts.map +1 -0
- package/dist/transcript-usage.js +570 -0
- package/dist/transcript-usage.js.map +1 -0
- package/dist/turns.d.ts +73 -0
- package/dist/turns.d.ts.map +1 -0
- package/dist/turns.js +298 -0
- package/dist/turns.js.map +1 -0
- package/dist/update-check.d.ts +38 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +67 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +6 -2
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display-only Claude Code hook support for MemTree notices.
|
|
3
|
+
*
|
|
4
|
+
* Notices must never be represented as Anthropic assistant content: Claude
|
|
5
|
+
* Code can reuse that content for hidden requests such as away recaps. Modern
|
|
6
|
+
* Claude Code releases provide MessageDisplay, whose output changes only the
|
|
7
|
+
* rendered delta. Stop's top-level systemMessage is the fallback for turns
|
|
8
|
+
* that never render text (for example, a tool-only response).
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import os from "node:os";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
export const MESSAGE_DISPLAY_MIN_VERSION = "2.1.166";
|
|
14
|
+
/** Trailer labels; kept here so hooks.ts stays free of notices.ts imports. */
|
|
15
|
+
export const TRAILER_LABEL = "• MemTree ·";
|
|
16
|
+
/** Label on a line that carries a MemTree page link. */
|
|
17
|
+
export const LINK_LABEL = "• MemTree";
|
|
18
|
+
/**
|
|
19
|
+
* A MemTree link notice: the label (and note, if any) on the first line and
|
|
20
|
+
* the URL alone, indented, on the next, so a long URL wraps on its own
|
|
21
|
+
* rather than dragging the label or note onto a second line. Label and note
|
|
22
|
+
* come pre-styled; the URL stays bare for the terminal's linkifier.
|
|
23
|
+
*/
|
|
24
|
+
export function linkLines(label, url, note) {
|
|
25
|
+
return `${label}${note ? ` · ${note}` : ""}\n ${url}`;
|
|
26
|
+
}
|
|
27
|
+
export const DEFAULT_NOTICE_TTL_MS = 60 * 60 * 1000;
|
|
28
|
+
const ANSI_GREEN = "\x1b[32m";
|
|
29
|
+
const ANSI_YELLOW = "\x1b[33m";
|
|
30
|
+
const ANSI_DEFAULT_FOREGROUND = "\x1b[39m";
|
|
31
|
+
const ANSI_DIM = "\x1b[2m";
|
|
32
|
+
const ANSI_NORMAL_INTENSITY = "\x1b[22m";
|
|
33
|
+
const STARTUP_NOTICE_FILE = "startup-notice.json";
|
|
34
|
+
const RESUME_RELAY_FILE = "resume-link.mjs";
|
|
35
|
+
/**
|
|
36
|
+
* `/memtree`: list the MemTree commands. The link label reads `/memtree` as a
|
|
37
|
+
* hint, and typing it exactly must not dead-end in "Unknown command".
|
|
38
|
+
*/
|
|
39
|
+
export const MEMTREE_HELP_COMMAND = "memtree";
|
|
40
|
+
/** The session plugin's name, which prefixes its commands in Claude Code's menu. */
|
|
41
|
+
export const SESSION_PLUGIN_NAME = "ccc";
|
|
42
|
+
/** `/memtree-view`: print this session's MemTree page link. */
|
|
43
|
+
export const MEMTREE_VIEW_COMMAND = "memtree-view";
|
|
44
|
+
/**
|
|
45
|
+
* `/memtree-compact [tokens|off]`: compact this session on its next message
|
|
46
|
+
* and keep that compressed history until the budget is reached again.
|
|
47
|
+
*/
|
|
48
|
+
export const MEMTREE_COMPACT_COMMAND = "memtree-compact";
|
|
49
|
+
const UNAVAILABLE_BODY = "Reply with exactly this one line and nothing else: \"MemTree is not reachable right now; try again in a moment.\"\n";
|
|
50
|
+
/**
|
|
51
|
+
* Listed in the slash-command menu. The proxy answers each one from the
|
|
52
|
+
* UserPromptSubmit hook and blocks it, so no model turn runs; a body only
|
|
53
|
+
* runs if that hook could not answer (proxy gone).
|
|
54
|
+
*/
|
|
55
|
+
const SESSION_COMMANDS = {
|
|
56
|
+
[MEMTREE_HELP_COMMAND]: "---\ndescription: List the MemTree commands (/memtree-view, /memtree-compact)\n---\n" + UNAVAILABLE_BODY,
|
|
57
|
+
[MEMTREE_VIEW_COMMAND]: "---\ndescription: Show the link to this session's MemTree page\n---\n" + UNAVAILABLE_BODY,
|
|
58
|
+
[MEMTREE_COMPACT_COMMAND]: "---\ndescription: Compact this session with MemTree now and keep the compressed history (optional token target, or off)\n" +
|
|
59
|
+
"argument-hint: [tokens | off]\n---\n" + UNAVAILABLE_BODY,
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* The arguments of a submitted `/<name>` (bare or `/ccc:`-qualified), or
|
|
63
|
+
* undefined when the prompt is not that command.
|
|
64
|
+
*/
|
|
65
|
+
export function sessionCommandArgs(prompt, name) {
|
|
66
|
+
// Bare `/memtree-view` or this plugin's own `/ccc:memtree-view`; another
|
|
67
|
+
// plugin's command of the same name is not ours to answer.
|
|
68
|
+
const match = new RegExp(`^/(?:${SESSION_PLUGIN_NAME}:)?${name}(?:\\s+(.*))?$`, "s").exec(prompt.trim());
|
|
69
|
+
return match ? (match[1] ?? "").trim() : undefined;
|
|
70
|
+
}
|
|
71
|
+
export function isMemtreeViewCommand(prompt) {
|
|
72
|
+
return sessionCommandArgs(prompt, MEMTREE_VIEW_COMMAND) !== undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Relays the SessionStart hook input (stdin) to the proxy's hook URL (argv)
|
|
76
|
+
* and prints the proxy's JSON answer, if any. Always exits 0 with no output
|
|
77
|
+
* on failure: a missing link must never surface as a hook error.
|
|
78
|
+
*/
|
|
79
|
+
const RESUME_RELAY_SOURCE = `let input = "";
|
|
80
|
+
process.stdin.on("data", (c) => (input += c));
|
|
81
|
+
process.stdin.on("end", async () => {
|
|
82
|
+
try {
|
|
83
|
+
const res = await fetch(process.argv[2], {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: { "content-type": "application/json" },
|
|
86
|
+
body: input,
|
|
87
|
+
signal: AbortSignal.timeout(4000),
|
|
88
|
+
});
|
|
89
|
+
if (res.status === 200) process.stdout.write(await res.text());
|
|
90
|
+
} catch {}
|
|
91
|
+
});
|
|
92
|
+
`;
|
|
93
|
+
/** Respect explicit monochrome settings and Node's platform color detection. */
|
|
94
|
+
export function terminalSupportsColor(env = process.env, stream = process.stdout) {
|
|
95
|
+
if (Object.prototype.hasOwnProperty.call(env, "NO_COLOR"))
|
|
96
|
+
return false;
|
|
97
|
+
if (env.TERM?.toLowerCase() === "dumb")
|
|
98
|
+
return false;
|
|
99
|
+
try {
|
|
100
|
+
if (typeof stream.hasColors === "function") {
|
|
101
|
+
return stream.hasColors(8, env);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Unknown/custom stream: Claude Code itself still handles standard SGR.
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/** Evaluated in the proxy's terminal, not the hook relay's piped stdout. */
|
|
110
|
+
export function terminalSupportsHyperlinks(env = process.env, stream = process.stdout) {
|
|
111
|
+
if (stream.isTTY !== true || Object.prototype.hasOwnProperty.call(env, "NO_COLOR"))
|
|
112
|
+
return false;
|
|
113
|
+
if (env.TERM === "dumb" || /^(screen|tmux)(-|$)/.test(env.TERM ?? ""))
|
|
114
|
+
return false;
|
|
115
|
+
if (env.TERMINAL_EMULATOR === "JetBrains-JediTerm")
|
|
116
|
+
return true;
|
|
117
|
+
// Terminals with OSC 8 support that identify themselves in the environment.
|
|
118
|
+
if (["ghostty", "WezTerm", "vscode"].includes(env.TERM_PROGRAM ?? ""))
|
|
119
|
+
return true;
|
|
120
|
+
if (env.TERM === "xterm-kitty" || env.TERM === "xterm-ghostty")
|
|
121
|
+
return true;
|
|
122
|
+
if (env.WT_SESSION)
|
|
123
|
+
return true; // Windows Terminal
|
|
124
|
+
if (env.TERM_PROGRAM === "iTerm.app") {
|
|
125
|
+
const match = /^(\d+)\.(\d+)/.exec(env.TERM_PROGRAM_VERSION ?? "");
|
|
126
|
+
return !!match && (Number(match[1]) > 3 || (Number(match[1]) === 3 && Number(match[2]) >= 1));
|
|
127
|
+
}
|
|
128
|
+
// Apple Terminal and unknown terminals retain a plain, detectable URL.
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Single-session delivery queue. Claude Code serializes main-thread turns, so
|
|
133
|
+
* one replaceable pending notice is sufficient. A new user request clears any
|
|
134
|
+
* stale notice; tool-result requests deliberately do not.
|
|
135
|
+
*/
|
|
136
|
+
export class NoticeDeliveryQueue {
|
|
137
|
+
ttlMs;
|
|
138
|
+
now;
|
|
139
|
+
color;
|
|
140
|
+
pending = null;
|
|
141
|
+
link = null;
|
|
142
|
+
/** Key of the last link shown; the same key is not repeated. */
|
|
143
|
+
delivered = new Map();
|
|
144
|
+
trailer = null;
|
|
145
|
+
trailerPlacement = "message";
|
|
146
|
+
/** Key of the last trailer shown; a different key is announced as new. */
|
|
147
|
+
constructor(ttlMs = DEFAULT_NOTICE_TTL_MS, now = Date.now, color = terminalSupportsColor()) {
|
|
148
|
+
this.ttlMs = ttlMs;
|
|
149
|
+
this.now = now;
|
|
150
|
+
this.color = color;
|
|
151
|
+
}
|
|
152
|
+
/** Replace stale delivery state when a new main human prompt is submitted. */
|
|
153
|
+
clearForUserRequest() {
|
|
154
|
+
this.pending = null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Install the per-session link that rides the success line, shown once per
|
|
158
|
+
* change: `<success text> · <link>`. Unlike prefix/suffix notices it is
|
|
159
|
+
* not per-prompt; it describes the conversation's current state whenever a
|
|
160
|
+
* success line is next shown.
|
|
161
|
+
*/
|
|
162
|
+
setLink(resolve) {
|
|
163
|
+
this.link = resolve;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The link line for a resumed session, shown by the SessionStart hook
|
|
167
|
+
* before any new turn. Marks the key as shown, so the next trailer under a
|
|
168
|
+
* message renders dim (unchanged) rather than green (new).
|
|
169
|
+
*/
|
|
170
|
+
resumeLine(link, sessionId) {
|
|
171
|
+
this.deliveryFor(sessionId).trailer = link.key;
|
|
172
|
+
this.deliveryFor(sessionId).trailerUrl = link.link;
|
|
173
|
+
this.deliveryFor(sessionId).link = link.key;
|
|
174
|
+
return this.linkNotice(this.styleSuccess(LINK_LABEL), link);
|
|
175
|
+
}
|
|
176
|
+
/** Whether the next success line would carry a link not shown before. */
|
|
177
|
+
linkPending(sessionId) {
|
|
178
|
+
return this.resolveLink(sessionId) !== undefined;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Install the trailer: the newest link for the session, shown after every
|
|
182
|
+
* message (or on every Stop), the first time under a new `key` marked as
|
|
183
|
+
* new. Not once-per-key like the success-line link: the point is that the
|
|
184
|
+
* link is always at the bottom of the screen.
|
|
185
|
+
*/
|
|
186
|
+
setTrailer(resolve, placement = "message") {
|
|
187
|
+
this.trailer = resolve;
|
|
188
|
+
this.trailerPlacement = placement;
|
|
189
|
+
}
|
|
190
|
+
queuePrefix(text, onDelivered, promptId) {
|
|
191
|
+
this.pending = {
|
|
192
|
+
createdAt: this.now(),
|
|
193
|
+
promptId,
|
|
194
|
+
prefix: { text, onDelivered },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
queueSuffix(text, onDelivered, promptId) {
|
|
198
|
+
this.pending = {
|
|
199
|
+
createdAt: this.now(),
|
|
200
|
+
promptId,
|
|
201
|
+
suffix: { text, onDelivered },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Claim eligible notice parts atomically for one hook invocation. Subagent
|
|
206
|
+
* hooks share the plugin but must never consume the main turn's notice.
|
|
207
|
+
*/
|
|
208
|
+
claim(input) {
|
|
209
|
+
if (input.agent_id !== undefined)
|
|
210
|
+
return null;
|
|
211
|
+
if (input.hook_event_name === "MessageDisplay") {
|
|
212
|
+
return this.claimForDisplay(input);
|
|
213
|
+
}
|
|
214
|
+
if (input.hook_event_name !== "Stop")
|
|
215
|
+
return null;
|
|
216
|
+
const pending = this.freshPending();
|
|
217
|
+
const matched = pending && this.promptMatches(pending, input.prompt_id) ? pending : null;
|
|
218
|
+
const prefix = matched?.prefix;
|
|
219
|
+
const suffix = matched?.suffix;
|
|
220
|
+
// Mark the success link before considering a same-key turn trailer.
|
|
221
|
+
const success = prefix ? this.renderSuccess(prefix, input.session_id) : undefined;
|
|
222
|
+
// Stop is the turn's last hook: the trailer lands here when the turn
|
|
223
|
+
// rendered no message to carry it ("message"), or always ("stop").
|
|
224
|
+
const trailerDue = this.trailerPlacement !== "message" || !this.deliveryFor(input.session_id).shown;
|
|
225
|
+
const trailer = trailerDue ? this.renderTrailer(input.session_id) : undefined;
|
|
226
|
+
this.deliveryFor(input.session_id).shown = false;
|
|
227
|
+
delete this.deliveryFor(input.session_id).successPage;
|
|
228
|
+
if (!prefix && !suffix && trailer === undefined)
|
|
229
|
+
return null;
|
|
230
|
+
if (prefix || suffix)
|
|
231
|
+
this.pending = null;
|
|
232
|
+
markDelivered(prefix);
|
|
233
|
+
markDelivered(suffix);
|
|
234
|
+
const lines = [];
|
|
235
|
+
if (success !== undefined)
|
|
236
|
+
lines.push(success);
|
|
237
|
+
if (suffix)
|
|
238
|
+
lines.push(this.styleWarning(resolveNoticeText(suffix)));
|
|
239
|
+
if (trailer !== undefined)
|
|
240
|
+
lines.push(trailer);
|
|
241
|
+
return {
|
|
242
|
+
systemMessage: lines.join("\n"),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
claimForDisplay(input) {
|
|
246
|
+
const pending = this.freshPending();
|
|
247
|
+
const matched = pending && this.promptMatches(pending, input.prompt_id) ? pending : null;
|
|
248
|
+
const prefix = matched && input.index === 0 ? matched.prefix : undefined;
|
|
249
|
+
const suffix = matched && input.final ? matched.suffix : undefined;
|
|
250
|
+
const trailer = input.final && this.trailerPlacement === "message"
|
|
251
|
+
? this.renderTrailer(input.session_id)
|
|
252
|
+
: undefined;
|
|
253
|
+
if (trailer !== undefined)
|
|
254
|
+
this.deliveryFor(input.session_id).shown = true;
|
|
255
|
+
if (!prefix && !suffix && trailer === undefined)
|
|
256
|
+
return null;
|
|
257
|
+
// Remove before callbacks or response construction so a reentrant/parallel
|
|
258
|
+
// Stop hook cannot deliver the same notice a second time.
|
|
259
|
+
if (prefix)
|
|
260
|
+
delete matched.prefix;
|
|
261
|
+
if (suffix)
|
|
262
|
+
delete matched.suffix;
|
|
263
|
+
if (matched)
|
|
264
|
+
this.dropIfEmpty(matched);
|
|
265
|
+
markDelivered(prefix);
|
|
266
|
+
markDelivered(suffix);
|
|
267
|
+
let displayContent = input.delta;
|
|
268
|
+
if (prefix) {
|
|
269
|
+
// MessageDisplay exposes text rather than a structured style token.
|
|
270
|
+
// Standard named-color SGR is interpreted by Claude Code on every
|
|
271
|
+
// supported terminal (and stripped cleanly in monochrome/NO_COLOR).
|
|
272
|
+
// Reset foreground only so surrounding renderer styles are preserved.
|
|
273
|
+
const styled = this.renderSuccess(prefix, input.session_id);
|
|
274
|
+
// A blank line under the link keeps the answer from crowding it.
|
|
275
|
+
const gap = styled.includes("\n") && displayContent ? "\n" : "";
|
|
276
|
+
displayContent = `${styled}\n${gap}${displayContent}`;
|
|
277
|
+
}
|
|
278
|
+
if (suffix) {
|
|
279
|
+
const separator = displayContent && !displayContent.endsWith("\n") ? "\n" : "";
|
|
280
|
+
const styled = this.styleWarning(resolveNoticeText(suffix));
|
|
281
|
+
displayContent = `${displayContent}${separator}${styled}`;
|
|
282
|
+
}
|
|
283
|
+
if (trailer !== undefined) {
|
|
284
|
+
// A blank line keeps the trailer apart from the answer above it.
|
|
285
|
+
const separator = displayContent && !displayContent.endsWith("\n") ? "\n" : "";
|
|
286
|
+
displayContent = `${displayContent}${separator}\n${trailer}`;
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
hookSpecificOutput: {
|
|
290
|
+
hookEventName: "MessageDisplay",
|
|
291
|
+
displayContent,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
promptMatches(pending, promptId) {
|
|
296
|
+
return (pending.promptId === undefined ||
|
|
297
|
+
promptId === undefined ||
|
|
298
|
+
pending.promptId === promptId);
|
|
299
|
+
}
|
|
300
|
+
styleSuccess(text) {
|
|
301
|
+
return this.style(text, ANSI_GREEN);
|
|
302
|
+
}
|
|
303
|
+
/** Warnings get the same own-line treatment as success, in yellow. */
|
|
304
|
+
styleWarning(text) {
|
|
305
|
+
return this.style(text, ANSI_YELLOW);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* The success line with the session's current MemTree page on its own
|
|
309
|
+
* indented line below it (`✓ … optimized · ~813k → 408k tokens` then
|
|
310
|
+
* ` <link>`), every time the line is shown. The URL stays bare for the
|
|
311
|
+
* terminal's linkifier. Marks the key shown, so the end-of-turn trailer
|
|
312
|
+
* does not repeat the same link.
|
|
313
|
+
*/
|
|
314
|
+
renderSuccess(prefix, sessionId) {
|
|
315
|
+
const text = resolveNoticeText(prefix);
|
|
316
|
+
const link = this.currentLink(sessionId);
|
|
317
|
+
if (link === undefined)
|
|
318
|
+
return this.styleSuccess(text);
|
|
319
|
+
this.deliveryFor(sessionId).link = link.key;
|
|
320
|
+
this.deliveryFor(sessionId).successPage = noticePageIdentity(link.link);
|
|
321
|
+
this.deliveryFor(sessionId).trailer = link.key;
|
|
322
|
+
this.deliveryFor(sessionId).trailerUrl = link.link;
|
|
323
|
+
return `${this.styleSuccess(text)}\n ${link.link}`;
|
|
324
|
+
}
|
|
325
|
+
/** The session's current link, shown or not. Resolver failures never break a hook. */
|
|
326
|
+
currentLink(sessionId) {
|
|
327
|
+
if (!this.link)
|
|
328
|
+
return undefined;
|
|
329
|
+
try {
|
|
330
|
+
const link = this.link(sessionId);
|
|
331
|
+
return link?.link && link.key ? link : undefined;
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** The link if its key changed since last shown, without marking it. Resolver failures never break a hook. */
|
|
338
|
+
resolveLink(sessionId) {
|
|
339
|
+
if (!this.link)
|
|
340
|
+
return undefined;
|
|
341
|
+
let link;
|
|
342
|
+
try {
|
|
343
|
+
link = this.link(sessionId);
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
return link?.link && link.key && link.key !== this.deliveryFor(sessionId).link ? link : undefined;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* The trailer line for this session, or undefined when there is no link.
|
|
352
|
+
* The first time a key is seen the label says so in green; afterwards the
|
|
353
|
+
* label is dim. The URL stays bare either way (linkifier-safe). Rendering
|
|
354
|
+
* marks the key as seen. Resolver failures never break a hook.
|
|
355
|
+
*/
|
|
356
|
+
renderTrailer(sessionId) {
|
|
357
|
+
if (!this.trailer)
|
|
358
|
+
return undefined;
|
|
359
|
+
let link;
|
|
360
|
+
try {
|
|
361
|
+
link = this.trailer(sessionId);
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
return undefined;
|
|
365
|
+
}
|
|
366
|
+
if (!link?.link || !link.key)
|
|
367
|
+
return undefined;
|
|
368
|
+
const delivered = this.deliveryFor(sessionId);
|
|
369
|
+
if (this.trailerPlacement === "turn" && delivered.successPage === noticePageIdentity(link.link))
|
|
370
|
+
return undefined;
|
|
371
|
+
const isNew = link.key !== delivered.trailer && link.link !== delivered.trailerUrl;
|
|
372
|
+
// "turn": one line per user turn, and only when the index changed.
|
|
373
|
+
if (this.trailerPlacement === "turn" && !isNew)
|
|
374
|
+
return undefined;
|
|
375
|
+
this.deliveryFor(sessionId).trailer = link.key;
|
|
376
|
+
this.deliveryFor(sessionId).trailerUrl = link.link;
|
|
377
|
+
const label = isNew ? this.styleSuccess(LINK_LABEL) : this.styleDim(LINK_LABEL);
|
|
378
|
+
return this.linkNotice(label, link);
|
|
379
|
+
}
|
|
380
|
+
/** The link notice with its note dim. */
|
|
381
|
+
linkNotice(label, link) {
|
|
382
|
+
return linkLines(label, link.link, link.note && this.styleDim(link.note));
|
|
383
|
+
}
|
|
384
|
+
styleDim(text) {
|
|
385
|
+
return this.color ? `${ANSI_DIM}${text}${ANSI_NORMAL_INTENSITY}` : text;
|
|
386
|
+
}
|
|
387
|
+
deliveryFor(sessionId) {
|
|
388
|
+
const state = this.delivered.get(sessionId) ?? { shown: false };
|
|
389
|
+
this.delivered.delete(sessionId);
|
|
390
|
+
this.delivered.set(sessionId, state);
|
|
391
|
+
if (this.delivered.size > 64)
|
|
392
|
+
this.delivered.delete(this.delivered.keys().next().value);
|
|
393
|
+
return state;
|
|
394
|
+
}
|
|
395
|
+
style(text, sgr) {
|
|
396
|
+
return this.color ? `${sgr}${text}${ANSI_DEFAULT_FOREGROUND}` : text;
|
|
397
|
+
}
|
|
398
|
+
freshPending() {
|
|
399
|
+
if (!this.pending)
|
|
400
|
+
return null;
|
|
401
|
+
if (this.now() - this.pending.createdAt > this.ttlMs) {
|
|
402
|
+
this.pending = null;
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
return this.pending;
|
|
406
|
+
}
|
|
407
|
+
dropIfEmpty(pending) {
|
|
408
|
+
if (!pending.prefix && !pending.suffix && this.pending === pending) {
|
|
409
|
+
this.pending = null;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/** Compare the short and pinned spellings only within a turn's success/Stop pair. */
|
|
414
|
+
function noticePageIdentity(link) {
|
|
415
|
+
try {
|
|
416
|
+
const url = new URL(link);
|
|
417
|
+
const match = /^\/(?:m|usage\/memtree)\/([0-9a-f]{12}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:-v[13]-(?:own|served))?$/.exec(url.pathname);
|
|
418
|
+
if (match)
|
|
419
|
+
return `${url.origin}/${match[1].replace(/-/g, "").slice(0, 12)}`;
|
|
420
|
+
}
|
|
421
|
+
catch { /* Non-page links compare literally. */ }
|
|
422
|
+
return link;
|
|
423
|
+
}
|
|
424
|
+
function resolveNoticeText(part) {
|
|
425
|
+
try {
|
|
426
|
+
return typeof part.text === "function" ? part.text() : part.text;
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// A late metrics formatter must never break the display hook.
|
|
430
|
+
return "";
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
function markDelivered(part) {
|
|
434
|
+
if (!part?.onDelivered)
|
|
435
|
+
return;
|
|
436
|
+
try {
|
|
437
|
+
part.onDelivered();
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
// UI delivery succeeded; accounting callbacks must not break the hook.
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/** Strictly validate the subset of Claude hook input that delivery relies on. */
|
|
444
|
+
export function parseNoticeHookInput(value) {
|
|
445
|
+
if (!value || typeof value !== "object")
|
|
446
|
+
return null;
|
|
447
|
+
const input = value;
|
|
448
|
+
if (typeof input.session_id !== "string" || input.session_id.length === 0) {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
if (input.agent_id !== undefined && typeof input.agent_id !== "string") {
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
if (input.prompt_id !== undefined && typeof input.prompt_id !== "string") {
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
if (input.hook_event_name === "MessageDisplay") {
|
|
458
|
+
if (typeof input.turn_id !== "string" ||
|
|
459
|
+
typeof input.message_id !== "string" ||
|
|
460
|
+
!Number.isInteger(input.index) ||
|
|
461
|
+
input.index < 0 ||
|
|
462
|
+
typeof input.final !== "boolean" ||
|
|
463
|
+
typeof input.delta !== "string") {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
return input;
|
|
467
|
+
}
|
|
468
|
+
if (input.hook_event_name === "Stop") {
|
|
469
|
+
if (input.stop_hook_active !== undefined &&
|
|
470
|
+
typeof input.stop_hook_active !== "boolean") {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
return input;
|
|
474
|
+
}
|
|
475
|
+
if (input.hook_event_name === "SessionStart") {
|
|
476
|
+
if (input.source !== undefined && typeof input.source !== "string")
|
|
477
|
+
return null;
|
|
478
|
+
return input;
|
|
479
|
+
}
|
|
480
|
+
if (input.hook_event_name === "UserPromptSubmit") {
|
|
481
|
+
if (typeof input.prompt !== "string")
|
|
482
|
+
return null;
|
|
483
|
+
return input;
|
|
484
|
+
}
|
|
485
|
+
if (input.hook_event_name === "SubagentStart" ||
|
|
486
|
+
input.hook_event_name === "SubagentStop") {
|
|
487
|
+
if (typeof input.agent_id !== "string" || input.agent_id.length === 0) {
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
if (input.agent_type !== undefined && typeof input.agent_type !== "string") {
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
return input;
|
|
494
|
+
}
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
/** Prepend the repeatable global option without disturbing any user argv. */
|
|
498
|
+
export function withSessionNoticePluginArgs(args, pluginDir) {
|
|
499
|
+
return ["--plugin-dir", pluginDir, ...args];
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Build a minimal session-only plugin. --plugin-dir is repeatable, unlike
|
|
503
|
+
* --settings (where Claude keeps only the final occurrence), so this composes
|
|
504
|
+
* with all user settings and hooks.
|
|
505
|
+
*/
|
|
506
|
+
export function createSessionNoticePlugin(hookUrl, opts = {}) {
|
|
507
|
+
const url = new URL(hookUrl);
|
|
508
|
+
if (url.protocol !== "http:" || url.hostname !== "127.0.0.1") {
|
|
509
|
+
throw new Error("notice hook URL must use randomized localhost HTTP endpoint");
|
|
510
|
+
}
|
|
511
|
+
const dir = fs.mkdtempSync(path.join(opts.tempRoot ?? os.tmpdir(), "ccc-notice-plugin-"));
|
|
512
|
+
const manifestDir = path.join(dir, ".claude-plugin");
|
|
513
|
+
const hooksDir = path.join(dir, "hooks");
|
|
514
|
+
const commandsDir = path.join(dir, "commands");
|
|
515
|
+
fs.mkdirSync(manifestDir, { recursive: true });
|
|
516
|
+
fs.mkdirSync(hooksDir, { recursive: true });
|
|
517
|
+
// Listed in the slash-command menu; the proxy answers it from the
|
|
518
|
+
// UserPromptSubmit hook (see MEMTREE_VIEW_COMMAND) before any model turn.
|
|
519
|
+
// The body only runs if that hook could not answer (proxy gone).
|
|
520
|
+
fs.mkdirSync(commandsDir, { recursive: true });
|
|
521
|
+
for (const [name, source] of Object.entries(SESSION_COMMANDS)) {
|
|
522
|
+
fs.writeFileSync(path.join(commandsDir, `${name}.md`), source, { mode: 0o600 });
|
|
523
|
+
}
|
|
524
|
+
const hook = { type: "http", url: hookUrl, timeout: 5 };
|
|
525
|
+
const hooks = {
|
|
526
|
+
Stop: [{ hooks: [hook] }],
|
|
527
|
+
UserPromptSubmit: [{ hooks: [hook] }],
|
|
528
|
+
SubagentStart: [{ hooks: [hook] }],
|
|
529
|
+
SubagentStop: [{ hooks: [hook] }],
|
|
530
|
+
};
|
|
531
|
+
if (opts.messageDisplay !== false) {
|
|
532
|
+
hooks.MessageDisplay = [{ hooks: [hook] }];
|
|
533
|
+
}
|
|
534
|
+
if (opts.startupMessage) {
|
|
535
|
+
// SessionStart accepts only `command`/`mcp_tool` hooks — never `http` —
|
|
536
|
+
// so the banner is baked into a static file the command simply cats. It
|
|
537
|
+
// must NOT be `echo`'d: sh and zsh expand backslash escapes, turning the
|
|
538
|
+
// JSON's \n into a raw newline and silently corrupting the payload.
|
|
539
|
+
fs.writeFileSync(path.join(hooksDir, STARTUP_NOTICE_FILE), JSON.stringify({ systemMessage: opts.startupMessage }), { mode: 0o600 });
|
|
540
|
+
hooks.SessionStart = [
|
|
541
|
+
...(hooks.SessionStart ?? []),
|
|
542
|
+
{
|
|
543
|
+
// A compaction continues the same conversation; only real session
|
|
544
|
+
// starts (fresh, --resume, /clear) re-show the banner.
|
|
545
|
+
matcher: "startup|resume|clear",
|
|
546
|
+
hooks: [
|
|
547
|
+
{
|
|
548
|
+
type: "command",
|
|
549
|
+
command: `cat ${singleQuoteForShell(path.join(hooksDir, STARTUP_NOTICE_FILE))}`,
|
|
550
|
+
timeout: 5,
|
|
551
|
+
},
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
];
|
|
555
|
+
}
|
|
556
|
+
if (opts.resumeLink) {
|
|
557
|
+
const relay = path.join(hooksDir, RESUME_RELAY_FILE);
|
|
558
|
+
fs.writeFileSync(relay, RESUME_RELAY_SOURCE, { mode: 0o600 });
|
|
559
|
+
hooks.SessionStart = [
|
|
560
|
+
...(hooks.SessionStart ?? []),
|
|
561
|
+
{
|
|
562
|
+
// Every session start that could already have a page. A fresh or
|
|
563
|
+
// cleared session has none yet, so in practice this answers resumes;
|
|
564
|
+
// compaction continues the same session and needs no line.
|
|
565
|
+
matcher: "startup|resume|clear|fork",
|
|
566
|
+
hooks: [
|
|
567
|
+
{
|
|
568
|
+
type: "command",
|
|
569
|
+
command: [process.execPath, relay, hookUrl]
|
|
570
|
+
.map(singleQuoteForShell)
|
|
571
|
+
.join(" "),
|
|
572
|
+
timeout: 5,
|
|
573
|
+
},
|
|
574
|
+
],
|
|
575
|
+
},
|
|
576
|
+
];
|
|
577
|
+
}
|
|
578
|
+
fs.writeFileSync(path.join(manifestDir, "plugin.json"), JSON.stringify({
|
|
579
|
+
// Claude Code lists plugin commands as `/<name>:<command>`, so this
|
|
580
|
+
// short name is what users see: `/ccc:memtree`, `/ccc:memtree-view`, …
|
|
581
|
+
name: SESSION_PLUGIN_NAME,
|
|
582
|
+
version: "1.0.0",
|
|
583
|
+
description: "Session-only display hooks for Claude Code Infinite",
|
|
584
|
+
}), { mode: 0o600 });
|
|
585
|
+
fs.writeFileSync(path.join(hooksDir, "hooks.json"), JSON.stringify({ description: "Display MemTree state", hooks }), { mode: 0o600 });
|
|
586
|
+
let closed = false;
|
|
587
|
+
return {
|
|
588
|
+
dir,
|
|
589
|
+
close() {
|
|
590
|
+
if (closed)
|
|
591
|
+
return;
|
|
592
|
+
closed = true;
|
|
593
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
594
|
+
},
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* POSIX single-quoting: everything inside is literal, and an embedded quote is
|
|
599
|
+
* spliced in as '\''. The mkdtemp path is ours, but quoting keeps a hostile
|
|
600
|
+
* TMPDIR from turning the hook command into arbitrary shell.
|
|
601
|
+
*/
|
|
602
|
+
function singleQuoteForShell(text) {
|
|
603
|
+
return `'${text.replace(/'/g, `'\\''`)}'`;
|
|
604
|
+
}
|
|
605
|
+
/** Return true only for known Claude versions that support MessageDisplay. */
|
|
606
|
+
export function supportsMessageDisplay(versionOutput) {
|
|
607
|
+
const match = versionOutput.match(/\b(\d+)\.(\d+)\.(\d+)\b/);
|
|
608
|
+
if (!match)
|
|
609
|
+
return false;
|
|
610
|
+
const current = match.slice(1, 4).map(Number);
|
|
611
|
+
const minimum = MESSAGE_DISPLAY_MIN_VERSION.split(".").map(Number);
|
|
612
|
+
for (let i = 0; i < 3; i++) {
|
|
613
|
+
if (current[i] !== minimum[i])
|
|
614
|
+
return current[i] > minimum[i];
|
|
615
|
+
}
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
export { startProxy } from "./proxy.js";
|
|
2
|
+
export type { ProxyOptions, RunningProxy } from "./proxy.js";
|
|
3
|
+
export { checkCompressedHistory, didMemtreeCompress, MemtreeClient, MIN_RETAINED_HISTORY_CHARS, normalizeMessagesForMemtree, rawPromptTokenCount, serverFlattenedMessages, } from "./memtree.js";
|
|
4
|
+
export type { MemtreeOptions, CompressResult, CompressedHistoryCheck, } from "./memtree.js";
|
|
5
|
+
export { isNonToolUserMessage, isToolResultUserMessage, isAwaySummaryUserMessage, isLocalBashCommandTurn, AWAY_SUMMARY_PROMPT_PREFIX, lastNonSystemMessage, userMessageText, hasEarlierNonToolUserMessage, stripCcSystemReminders, messagesWithSystem, contextLimitForModel, } from "./turns.js";
|
|
6
|
+
export type { Message } from "./turns.js";
|
|
7
|
+
export { NOTICE_OPEN, NOTICE_CLOSE, COMPRESSED_NOTICE, MODEL_HIDDEN_NOTICE, DEGRADED_NOTICE, PAYMENT_REQUIRED_NOTICE, SLOW_FIRST_TOKEN_NOTICE, STARTUP_NOTICE, startupNoticeText, sanitizeNoticeDetail, wrapNotice, exciseKnownLegacyNoticeSpans, stripNoticeBlocks, stripNoticeSystem, SseNoticeRewriter, fabricatedPrelude, insertNoticeBeforeResponseContent, appendNoticeToJsonBody, } from "./notices.js";
|
|
8
|
+
export { NoticeDeliveryQueue, parseNoticeHookInput, createSessionNoticePlugin, supportsMessageDisplay, terminalSupportsColor, withSessionNoticePluginArgs, MESSAGE_DISPLAY_MIN_VERSION, } from "./hooks.js";
|
|
9
|
+
export type { NoticeHookInput, NoticeHookOutput, SessionNoticePlugin, } from "./hooks.js";
|
|
1
10
|
export { getOAuthToken, isTokenExpired } from "./keychain.js";
|
|
2
11
|
export type { ClaudeOAuthToken, KeychainCredentials } from "./keychain.js";
|
|
3
12
|
//# sourceMappingURL=index.d.ts.map
|