claude-code-infinite 1.0.26 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +44 -16
  2. package/dist/claude-auth.d.ts +9 -1
  3. package/dist/claude-auth.d.ts.map +1 -1
  4. package/dist/claude-auth.js +26 -4
  5. package/dist/claude-auth.js.map +1 -1
  6. package/dist/claude-env.d.ts +11 -4
  7. package/dist/claude-env.d.ts.map +1 -1
  8. package/dist/claude-env.js +11 -4
  9. package/dist/claude-env.js.map +1 -1
  10. package/dist/claude-locate.d.ts +18 -0
  11. package/dist/claude-locate.d.ts.map +1 -1
  12. package/dist/claude-locate.js +82 -3
  13. package/dist/claude-locate.js.map +1 -1
  14. package/dist/claude-plan-warning.d.ts +55 -0
  15. package/dist/claude-plan-warning.d.ts.map +1 -0
  16. package/dist/claude-plan-warning.js +95 -0
  17. package/dist/claude-plan-warning.js.map +1 -0
  18. package/dist/cli-args.d.ts +5 -0
  19. package/dist/cli-args.d.ts.map +1 -1
  20. package/dist/cli-args.js +9 -0
  21. package/dist/cli-args.js.map +1 -1
  22. package/dist/cli-lifecycle.d.ts +5 -0
  23. package/dist/cli-lifecycle.d.ts.map +1 -1
  24. package/dist/cli-lifecycle.js +13 -0
  25. package/dist/cli-lifecycle.js.map +1 -1
  26. package/dist/cli-main.js +170 -87
  27. package/dist/cli-main.js.map +1 -1
  28. package/dist/diagnostics-schema.d.ts +2 -0
  29. package/dist/diagnostics-schema.d.ts.map +1 -1
  30. package/dist/diagnostics-schema.js +13 -2
  31. package/dist/diagnostics-schema.js.map +1 -1
  32. package/dist/diagnostics.d.ts +8 -3
  33. package/dist/diagnostics.d.ts.map +1 -1
  34. package/dist/diagnostics.js +12 -3
  35. package/dist/diagnostics.js.map +1 -1
  36. package/dist/hooks.d.ts +8 -0
  37. package/dist/hooks.d.ts.map +1 -1
  38. package/dist/hooks.js +57 -25
  39. package/dist/hooks.js.map +1 -1
  40. package/dist/key-page.d.ts +17 -0
  41. package/dist/key-page.d.ts.map +1 -0
  42. package/dist/key-page.js +32 -0
  43. package/dist/key-page.js.map +1 -0
  44. package/dist/key-status.d.ts +79 -0
  45. package/dist/key-status.d.ts.map +1 -0
  46. package/dist/key-status.js +143 -0
  47. package/dist/key-status.js.map +1 -0
  48. package/dist/memtree.d.ts +23 -0
  49. package/dist/memtree.d.ts.map +1 -1
  50. package/dist/memtree.js +39 -3
  51. package/dist/memtree.js.map +1 -1
  52. package/dist/notices.d.ts +5 -0
  53. package/dist/notices.d.ts.map +1 -1
  54. package/dist/notices.js +13 -0
  55. package/dist/notices.js.map +1 -1
  56. package/dist/paused-session.d.ts +29 -0
  57. package/dist/paused-session.d.ts.map +1 -0
  58. package/dist/paused-session.js +148 -0
  59. package/dist/paused-session.js.map +1 -0
  60. package/dist/payment-gate.d.ts +44 -13
  61. package/dist/payment-gate.d.ts.map +1 -1
  62. package/dist/payment-gate.js +82 -23
  63. package/dist/payment-gate.js.map +1 -1
  64. package/dist/payment-link.d.ts +68 -0
  65. package/dist/payment-link.d.ts.map +1 -0
  66. package/dist/payment-link.js +123 -0
  67. package/dist/payment-link.js.map +1 -0
  68. package/dist/project-trees.d.ts +100 -0
  69. package/dist/project-trees.d.ts.map +1 -0
  70. package/dist/project-trees.js +196 -0
  71. package/dist/project-trees.js.map +1 -0
  72. package/dist/proxy.d.ts +13 -0
  73. package/dist/proxy.d.ts.map +1 -1
  74. package/dist/proxy.js +70 -8
  75. package/dist/proxy.js.map +1 -1
  76. package/dist/reqlog.d.ts +2 -0
  77. package/dist/reqlog.d.ts.map +1 -1
  78. package/dist/reqlog.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Short checkout link for an unpaid MemTree key.
3
+ *
4
+ * POST /v1/payment/link (authenticated with the MemTree key) answers
5
+ * `{url: "https://app.polychat.co/p/Ab3xY9…", plan, monthly_price_usd, reason, expires_at}`.
6
+ * The link opens Stripe Checkout for the key's own account with no sign-in, so the
7
+ * wrong-account and signed-out detours of the old `/payment?user_id=…` link go away.
8
+ * It works for an hour; the cache below fetches a new one when the old one is about
9
+ * to expire.
10
+ *
11
+ * Servers without the endpoint (404), timeouts and odd bodies all mean "no link":
12
+ * callers fall back to the status probe's `/payment?…` link, exactly as before.
13
+ */
14
+ export const PAYMENT_LINK_PATH = "/v1/payment/link";
15
+ /** A link this close to expiry is replaced before it is shown or opened. */
16
+ export const PAYMENT_LINK_REFRESH_MARGIN_MS = 5 * 60 * 1000;
17
+ /** After a failed fetch (old server, outage), wait this long before asking again. */
18
+ export const PAYMENT_LINK_RETRY_MS = 10 * 60 * 1000;
19
+ export const PAYMENT_LINK_TIMEOUT_MS = 1500;
20
+ export const REASON_FREE_CREDIT_USED = "free_credit_used";
21
+ export const REASON_PLAN_LIMIT = "plan_limit";
22
+ // The link must be our short path on one of our hosts: a hostile or broken body
23
+ // can't put an arbitrary URL (or terminal controls) on screen or into `open`.
24
+ const SHORT_LINK_RE = new RegExp("^(?:https:\\/\\/(?:(?:[a-z0-9-]+\\.)*polychat\\.co|polychat-[a-z0-9-]+(?:\\.[a-z0-9-]+)?\\.run\\.app)" +
25
+ "|http:\\/\\/(?:local\\.polychat\\.co|localhost|127\\.0\\.0\\.1)(?::\\d+)?)" +
26
+ "\\/p\\/[A-Za-z0-9]{12,64}$");
27
+ const PLAN_RE = /^[A-Za-z0-9 %.+-]{1,40}$/;
28
+ /** Ask the server for a short link; null on any failure. Never throws. */
29
+ export async function fetchPaymentLink(opts) {
30
+ try {
31
+ const res = await (opts.fetchImpl ?? fetch)(`${opts.baseUrl.replace(/\/$/, "")}${PAYMENT_LINK_PATH}`, {
32
+ method: "POST",
33
+ headers: { authorization: `Bearer ${opts.apiKey}`, ...opts.headers },
34
+ signal: AbortSignal.timeout(opts.timeoutMs ?? PAYMENT_LINK_TIMEOUT_MS),
35
+ });
36
+ if (!res.ok)
37
+ return null;
38
+ return parsePaymentLink(await res.json());
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /** Validate the endpoint's body; null unless it carries a usable short link. */
45
+ export function parsePaymentLink(body) {
46
+ if (typeof body !== "object" || body === null)
47
+ return null;
48
+ const record = body;
49
+ const { url, plan, monthly_price_usd: price } = record;
50
+ if (typeof url !== "string" || !SHORT_LINK_RE.test(url))
51
+ return null;
52
+ if (typeof plan !== "string" || !PLAN_RE.test(plan))
53
+ return null;
54
+ if (typeof price !== "number" || !Number.isFinite(price) || price <= 0 || price > 100_000) {
55
+ return null;
56
+ }
57
+ const expiresAt = typeof record.expires_at === "string" ? Date.parse(record.expires_at) : NaN;
58
+ const reason = record.reason === REASON_FREE_CREDIT_USED || record.reason === REASON_PLAN_LIMIT
59
+ ? record.reason
60
+ : null;
61
+ return { url, plan, monthlyPriceUsd: price, reason,
62
+ expiresAt: Number.isFinite(expiresAt) ? expiresAt : null };
63
+ }
64
+ /** Whether `link` can still be shown or opened (not within the margin of expiring). */
65
+ export function paymentLinkFresh(link, now = Date.now()) {
66
+ return link.expiresAt === null || link.expiresAt - now > PAYMENT_LINK_REFRESH_MARGIN_MS;
67
+ }
68
+ /** "$5", "$7.50": whole dollars without cents. */
69
+ export function formatUsd(amount) {
70
+ return Number.isInteger(amount) ? `$${amount}` : `$${amount.toFixed(2)}`;
71
+ }
72
+ /**
73
+ * One process's short link: fetched on demand, reused while fresh, refetched near
74
+ * expiry, and not asked for again for PAYMENT_LINK_RETRY_MS after a failure (so an
75
+ * old server's 404 costs one request, not one per 402).
76
+ */
77
+ export class PaymentLinkCache {
78
+ fetchLink;
79
+ now;
80
+ link = null;
81
+ inFlight = null;
82
+ failedAt;
83
+ constructor(fetchLink, now = Date.now) {
84
+ this.fetchLink = fetchLink;
85
+ this.now = now;
86
+ }
87
+ /** The cached link while fresh, else null (never fetches). */
88
+ current() {
89
+ return this.link && paymentLinkFresh(this.link, this.now()) ? this.link : null;
90
+ }
91
+ /** A fresh link: the cached one, or one fetch shared by concurrent callers. */
92
+ get() {
93
+ const cached = this.current();
94
+ if (cached)
95
+ return Promise.resolve(cached);
96
+ if (this.inFlight)
97
+ return this.inFlight;
98
+ if (this.failedAt !== undefined && this.now() - this.failedAt < PAYMENT_LINK_RETRY_MS) {
99
+ return Promise.resolve(null);
100
+ }
101
+ this.inFlight = this.fetchLink().catch(() => null).then((link) => {
102
+ this.inFlight = null;
103
+ if (link)
104
+ this.link = link;
105
+ else
106
+ this.failedAt = this.now();
107
+ return link;
108
+ });
109
+ return this.inFlight;
110
+ }
111
+ /** Wait at most `ms` for a fetch already in flight; resolves at once when none is. */
112
+ async settled(ms) {
113
+ if (!this.inFlight)
114
+ return;
115
+ let timer;
116
+ await Promise.race([
117
+ this.inFlight,
118
+ new Promise((resolve) => { timer = setTimeout(resolve, ms); }),
119
+ ]);
120
+ clearTimeout(timer);
121
+ }
122
+ }
123
+ //# sourceMappingURL=payment-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-link.js","sourceRoot":"","sources":["../src/payment-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Earlier MemTree sessions in this project, named to the model when a session
3
+ * starts, so earlier decisions and fixes are one lookup away.
4
+ *
5
+ * The server answers `GET /v1/memtree/project_trees?project=&limit=` (polychat
6
+ * routes/memtree_project_trees.py): the user's own newest sessions in this
7
+ * project that have a finished tree, each with its root summary and tree
8
+ * reference. ccc asks once at startup (before Claude Code is up) and again in
9
+ * the background at each later session start, so a SessionStart hook only
10
+ * waits briefly for an answer already on its way.
11
+ *
12
+ * The block goes into the SessionStart hook's `additionalContext`: the model
13
+ * reads it, the user sees it only in the transcript view. It is added only when
14
+ * the session has the `memtree` MCP tools it names, never for a subagent or a
15
+ * compaction, and not at all on any failure: an older server (404), a slow or
16
+ * failed request, no project, or no earlier trees.
17
+ */
18
+ import type { KeyCheck } from "./key-status.js";
19
+ /** Trees named at most. */
20
+ export declare const PROJECT_TREES_LIMIT = 5;
21
+ /** Most a SessionStart hook waits for an answer still on its way. */
22
+ export declare const PROJECT_TREES_WAIT_MS = 300;
23
+ /** A request that has not answered by then is dropped. */
24
+ export declare const PROJECT_TREES_FETCH_TIMEOUT_MS = 5000;
25
+ /** A later session start reuses an answer this fresh instead of asking again. */
26
+ export declare const PROJECT_TREES_FRESH_MS = 60000;
27
+ /** Root summaries are cut to this many characters. */
28
+ export declare const PROJECT_TREES_SUMMARY_CHARS = 150;
29
+ export declare const PROJECT_TREES_HEADER: string;
30
+ export declare const PROJECT_TREES_FOOTER: string;
31
+ export interface ProjectTree {
32
+ session_id?: string | null;
33
+ last_at?: string | null;
34
+ title: string;
35
+ ref: string;
36
+ }
37
+ /** GET a polychat path with the user's key (MemtreeClient.fetchMemTree). */
38
+ export type ProjectTreesFetch = (pathAndQuery: string, signal: AbortSignal) => Promise<{
39
+ status: number;
40
+ body: Buffer;
41
+ }>;
42
+ export declare class ProjectTreesHint {
43
+ private readonly fetchJson;
44
+ private readonly project;
45
+ private readonly waitMs;
46
+ private readonly now;
47
+ private pending;
48
+ private latest;
49
+ private disabled;
50
+ private fetchedAt;
51
+ /** The server answered 404/405: it has no such endpoint; not asked again this run. */
52
+ private unsupported;
53
+ constructor(fetchJson: ProjectTreesFetch, project: string, waitMs?: number, now?: () => number);
54
+ /** No more blocks: the session lost the tools they name (memtree MCP config failed). */
55
+ disable(): void;
56
+ /** Start a lookup unless one is on its way; never throws. */
57
+ prefetch(): void;
58
+ /**
59
+ * The block for a session starting now, or undefined. Waits at most
60
+ * `waitMs` for a lookup on its way, then refreshes in the background for
61
+ * the next session start (an in-app `/clear` or `/resume`).
62
+ */
63
+ contextFor(sessionId: string | undefined): Promise<string | undefined>;
64
+ private lookup;
65
+ }
66
+ /**
67
+ * The project name the server matches: the `owner/repo` of the `origin`
68
+ * remote. A directory name alone ("app", "src") would also match unrelated
69
+ * directories and repos of that name, so without a remote there is no hint.
70
+ */
71
+ export declare function projectIdentity(meta: {
72
+ git_repo?: string;
73
+ } | undefined): string | undefined;
74
+ /** The server's `trees`, keeping only well-formed entries. */
75
+ export declare function parseProjectTrees(body: unknown): ProjectTree[] | undefined;
76
+ /** The context block, or undefined when no tree but the current session's is left. */
77
+ export declare function formatProjectTrees(trees: readonly ProjectTree[], currentSessionId: string | undefined): string | undefined;
78
+ /** What startup knows when it decides on the hint (cli-main.ts). */
79
+ export interface ProjectTreesStartup {
80
+ interactive: boolean;
81
+ /** The startup key check: "invalid" (401/403, even after [c]) means no MemTree calls. */
82
+ keyCheck: KeyCheck;
83
+ /** Unpaid and [c] at the payment gate (or a print run): MemTree is off this session. */
84
+ memtreeOff: boolean;
85
+ tools: readonly string[];
86
+ meta: {
87
+ git_repo?: string;
88
+ } | undefined;
89
+ env: NodeJS.ProcessEnv;
90
+ fetchJson: ProjectTreesFetch;
91
+ }
92
+ /**
93
+ * The hint for this run, or undefined: interactive sessions only (print runs
94
+ * keep Claude Code's output as it is) with MemTree on (a valid key, not
95
+ * continued past the payment gate: the lookup could only fail), with both
96
+ * `search` and `read_node` (the block names them), a known project, and not
97
+ * `CCC_PROJECT_TREES=0`.
98
+ */
99
+ export declare function projectTreesHintFor(s: ProjectTreesStartup): ProjectTreesHint | undefined;
100
+ //# sourceMappingURL=project-trees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-trees.d.ts","sourceRoot":"","sources":["../src/project-trees.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,2BAA2B;AAC3B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,0DAA0D;AAC1D,eAAO,MAAM,8BAA8B,OAAQ,CAAC;AACpD,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,sDAAsD;AACtD,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,eAAO,MAAM,oBAAoB,QAGqB,CAAC;AACvD,eAAO,MAAM,oBAAoB,QAEL,CAAC;AAI7B,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,4EAA4E;AAC5E,MAAM,MAAM,iBAAiB,GAAG,CAC9B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/C,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXtB,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAa;IAC9B,sFAAsF;IACtF,OAAO,CAAC,WAAW,CAAS;gBAGT,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,MAAM,EACf,MAAM,SAAwB,EAC9B,GAAG,GAAE,MAAM,MAAiB;IAG/C,wFAAwF;IACxF,OAAO,IAAI,IAAI;IAIf,6DAA6D;IAC7D,QAAQ,IAAI,IAAI;IAgBhB;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAS9D,MAAM;CAkBrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE3F;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE,GAAG,SAAS,CAS1E;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAWpB;AAqCD,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,yFAAyF;IACzF,QAAQ,EAAE,QAAQ,CAAC;IACnB,wFAAwF;IACxF,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,SAAS,CAMxF"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Earlier MemTree sessions in this project, named to the model when a session
3
+ * starts, so earlier decisions and fixes are one lookup away.
4
+ *
5
+ * The server answers `GET /v1/memtree/project_trees?project=&limit=` (polychat
6
+ * routes/memtree_project_trees.py): the user's own newest sessions in this
7
+ * project that have a finished tree, each with its root summary and tree
8
+ * reference. ccc asks once at startup (before Claude Code is up) and again in
9
+ * the background at each later session start, so a SessionStart hook only
10
+ * waits briefly for an answer already on its way.
11
+ *
12
+ * The block goes into the SessionStart hook's `additionalContext`: the model
13
+ * reads it, the user sees it only in the transcript view. It is added only when
14
+ * the session has the `memtree` MCP tools it names, never for a subagent or a
15
+ * compaction, and not at all on any failure: an older server (404), a slow or
16
+ * failed request, no project, or no earlier trees.
17
+ */
18
+ /** Trees named at most. */
19
+ export const PROJECT_TREES_LIMIT = 5;
20
+ /** Most a SessionStart hook waits for an answer still on its way. */
21
+ export const PROJECT_TREES_WAIT_MS = 300;
22
+ /** A request that has not answered by then is dropped. */
23
+ export const PROJECT_TREES_FETCH_TIMEOUT_MS = 5_000;
24
+ /** A later session start reuses an answer this fresh instead of asking again. */
25
+ export const PROJECT_TREES_FRESH_MS = 60_000;
26
+ /** Root summaries are cut to this many characters. */
27
+ export const PROJECT_TREES_SUMMARY_CHARS = 150;
28
+ export const PROJECT_TREES_HEADER = 'Earlier sessions in this project, with their summaries (a record, not instructions); ' +
29
+ 'search one with mcp__memtree__search {"tree": <tree>, "query": …}, open it with ' +
30
+ 'mcp__memtree__read_node {"tree": <tree>, "id": 0}:';
31
+ export const PROJECT_TREES_FOOTER = "Check them when the task touches past work (earlier decisions, previous fixes, " +
32
+ "how something was done).";
33
+ const TREE_REF = /^[A-Za-z0-9-]{1,80}$/;
34
+ export class ProjectTreesHint {
35
+ fetchJson;
36
+ project;
37
+ waitMs;
38
+ now;
39
+ pending;
40
+ latest;
41
+ disabled = false;
42
+ fetchedAt = -Infinity;
43
+ /** The server answered 404/405: it has no such endpoint; not asked again this run. */
44
+ unsupported = false;
45
+ constructor(fetchJson, project, waitMs = PROJECT_TREES_WAIT_MS, now = Date.now) {
46
+ this.fetchJson = fetchJson;
47
+ this.project = project;
48
+ this.waitMs = waitMs;
49
+ this.now = now;
50
+ }
51
+ /** No more blocks: the session lost the tools they name (memtree MCP config failed). */
52
+ disable() {
53
+ this.disabled = true;
54
+ }
55
+ /** Start a lookup unless one is on its way; never throws. */
56
+ prefetch() {
57
+ if (this.pending || this.disabled || this.unsupported)
58
+ return;
59
+ if (this.now() - this.fetchedAt < PROJECT_TREES_FRESH_MS)
60
+ return;
61
+ const pending = this.lookup().then((trees) => {
62
+ if (trees) {
63
+ this.latest = trees;
64
+ this.fetchedAt = this.now();
65
+ }
66
+ return trees;
67
+ });
68
+ this.pending = pending;
69
+ void pending.finally(() => {
70
+ if (this.pending === pending)
71
+ this.pending = undefined;
72
+ });
73
+ }
74
+ /**
75
+ * The block for a session starting now, or undefined. Waits at most
76
+ * `waitMs` for a lookup on its way, then refreshes in the background for
77
+ * the next session start (an in-app `/clear` or `/resume`).
78
+ */
79
+ async contextFor(sessionId) {
80
+ if (this.disabled)
81
+ return undefined;
82
+ const pending = this.pending;
83
+ const trees = pending ? await withinMs(pending, this.waitMs) : undefined;
84
+ const known = trees ?? this.latest;
85
+ this.prefetch();
86
+ return known ? formatProjectTrees(known, sessionId) : undefined;
87
+ }
88
+ async lookup() {
89
+ const query = new URLSearchParams({
90
+ project: this.project,
91
+ // One more, so leaving out the current session still names five.
92
+ limit: String(PROJECT_TREES_LIMIT + 1),
93
+ });
94
+ try {
95
+ const response = await this.fetchJson(`/v1/memtree/project_trees?${query.toString()}`, AbortSignal.timeout(PROJECT_TREES_FETCH_TIMEOUT_MS));
96
+ if (response.status === 404 || response.status === 405)
97
+ this.unsupported = true;
98
+ if (response.status !== 200)
99
+ return undefined;
100
+ return parseProjectTrees(JSON.parse(response.body.toString("utf-8")));
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * The project name the server matches: the `owner/repo` of the `origin`
109
+ * remote. A directory name alone ("app", "src") would also match unrelated
110
+ * directories and repos of that name, so without a remote there is no hint.
111
+ */
112
+ export function projectIdentity(meta) {
113
+ return meta?.git_repo || undefined;
114
+ }
115
+ /** The server's `trees`, keeping only well-formed entries. */
116
+ export function parseProjectTrees(body) {
117
+ const trees = body?.trees;
118
+ if (!Array.isArray(trees))
119
+ return undefined;
120
+ const parsed = [];
121
+ for (const item of trees) {
122
+ const tree = parseTree(item);
123
+ if (tree)
124
+ parsed.push(tree);
125
+ }
126
+ return parsed;
127
+ }
128
+ /** The context block, or undefined when no tree but the current session's is left. */
129
+ export function formatProjectTrees(trees, currentSessionId) {
130
+ const shown = trees
131
+ .filter((tree) => !currentSessionId || tree.session_id !== currentSessionId)
132
+ .slice(0, PROJECT_TREES_LIMIT);
133
+ if (!shown.length)
134
+ return undefined;
135
+ const lines = shown.map((tree) => {
136
+ const date = /^\d{4}-\d{2}-\d{2}/.exec(tree.last_at ?? "")?.[0];
137
+ const summary = shorten(tree.title, PROJECT_TREES_SUMMARY_CHARS);
138
+ return `- ${date ? `${date}: ` : ""}${summary} (tree ${tree.ref})`;
139
+ });
140
+ return [PROJECT_TREES_HEADER, ...lines, PROJECT_TREES_FOOTER].join("\n");
141
+ }
142
+ function parseTree(item) {
143
+ if (!item || typeof item !== "object")
144
+ return undefined;
145
+ const raw = item;
146
+ const tree = raw.tree;
147
+ const ref = typeof tree?.ref === "string" ? tree.ref : tree?.request_id;
148
+ if (typeof ref !== "string" || !TREE_REF.test(ref))
149
+ return undefined;
150
+ if (typeof raw.title !== "string" || !raw.title.trim())
151
+ return undefined;
152
+ return {
153
+ session_id: typeof raw.session_id === "string" ? raw.session_id : null,
154
+ last_at: typeof raw.last_at === "string" ? raw.last_at : null,
155
+ title: raw.title,
156
+ ref,
157
+ };
158
+ }
159
+ function shorten(text, limit) {
160
+ // One line: a summary is model-written and must not add lines of its own.
161
+ const flat = text.replace(/\s+/g, " ").trim();
162
+ return flat.length <= limit ? flat : `${flat.slice(0, limit - 1).trimEnd()}…`;
163
+ }
164
+ /** `promise`'s value, or undefined if it takes longer than `ms`. */
165
+ async function withinMs(promise, ms) {
166
+ let timer;
167
+ const timeout = new Promise((resolve) => {
168
+ timer = setTimeout(() => resolve(undefined), ms);
169
+ timer.unref?.();
170
+ });
171
+ try {
172
+ return await Promise.race([promise, timeout]);
173
+ }
174
+ finally {
175
+ if (timer)
176
+ clearTimeout(timer);
177
+ }
178
+ }
179
+ /**
180
+ * The hint for this run, or undefined: interactive sessions only (print runs
181
+ * keep Claude Code's output as it is) with MemTree on (a valid key, not
182
+ * continued past the payment gate: the lookup could only fail), with both
183
+ * `search` and `read_node` (the block names them), a known project, and not
184
+ * `CCC_PROJECT_TREES=0`.
185
+ */
186
+ export function projectTreesHintFor(s) {
187
+ if (!s.interactive || s.env.CCC_PROJECT_TREES === "0")
188
+ return undefined;
189
+ if (s.keyCheck === "invalid" || s.memtreeOff)
190
+ return undefined;
191
+ if (!s.tools.includes("search") || !s.tools.includes("read_node"))
192
+ return undefined;
193
+ const project = projectIdentity(s.meta);
194
+ return project ? new ProjectTreesHint(s.fetchJson, project) : undefined;
195
+ }
196
+ //# sourceMappingURL=project-trees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-trees.js","sourceRoot":"","sources":["../src/project-trees.ts"],"names":[],"mappings":"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"}
package/dist/proxy.d.ts CHANGED
@@ -48,6 +48,7 @@ import type { StablePrefixStore } from "./prefix-store.js";
48
48
  import type { NewestTreeLookup } from "./memtree-newest.js";
49
49
  import type { TranscriptUsageSource } from "./transcript-usage.js";
50
50
  import type { ProjectMeta } from "./project-meta.js";
51
+ import type { ProjectTreesHint } from "./project-trees.js";
51
52
  import type { DiagnosticsRecorder } from "./diagnostics.js";
52
53
  import { type MessagesRecord, type RequestLogSink } from "./reqlog.js";
53
54
  export interface ProxyOptions {
@@ -185,6 +186,11 @@ export interface ProxyOptions {
185
186
  * provider decides how often it has something to say.
186
187
  */
187
188
  sessionStartNotice?: () => string | undefined;
189
+ /**
190
+ * Earlier MemTree sessions in this project, added to a main session's
191
+ * SessionStart as model context (project-trees.ts). Omitted means none.
192
+ */
193
+ projectTrees?: ProjectTreesHint;
188
194
  /**
189
195
  * Client diagnostics (diagnostics.ts): session starts, paused notices shown,
190
196
  * and refusals, as allowlisted enums and numbers. Never content.
@@ -239,7 +245,14 @@ export declare function fallbackBudgetRatio(model: unknown, modelContextLimit: n
239
245
  export declare function startProxy(opts: ProxyOptions): Promise<RunningProxy>;
240
246
  /** The page id in a server-stamped link (`…/m/<id>` or `…/usage/memtree/<id>`). */
241
247
  export declare function memtreePageId(pageUrl: string): string | undefined;
248
+ /**
249
+ * The SessionStart hook's answer: the banner line for the user
250
+ * (`systemMessage`), model context (`additionalContext`), or both.
251
+ */
252
+ export declare function sessionStartOutput(line: string | undefined, context: string | undefined): Record<string, unknown>;
242
253
  export declare const MEMTREE_COMPACT_MIN_TOKENS = 20000;
254
+ /** How long a paused turn waits for the short checkout link before its notice (once). */
255
+ export declare const PAYMENT_LINK_NOTICE_WAIT_MS = 1000;
243
256
  export declare const SUBAGENT_VIEW_NOTE = "(main session's page; subagent pages aren't linked yet)";
244
257
  export declare const SUBAGENT_COMPACT_REPLY = "MemTree compact applies to the main session only.";
245
258
  /** "50k", "50000", "1.5m" → tokens; undefined when not a positive count. */
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}