@agentclientprotocol/claude-agent-acp 0.88.1-preview.6 → 0.89.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/acp-agent.d.ts +26 -1
  2. package/dist/acp-agent.d.ts.map +1 -1
  3. package/dist/acp-agent.js +91 -17
  4. package/dist/air-extension.d.ts +23 -0
  5. package/dist/air-extension.d.ts.map +1 -1
  6. package/dist/air-extension.js +23 -0
  7. package/dist/diff.d.ts +2 -0
  8. package/dist/diff.d.ts.map +1 -1
  9. package/dist/diff.js +37 -1
  10. package/dist/mcp-command.d.ts.map +1 -1
  11. package/dist/mcp-command.js +5 -0
  12. package/dist/session-index/activity.d.ts +56 -0
  13. package/dist/session-index/activity.d.ts.map +1 -0
  14. package/dist/session-index/activity.js +96 -0
  15. package/dist/session-index/archive-title.d.ts +52 -0
  16. package/dist/session-index/archive-title.d.ts.map +1 -0
  17. package/dist/session-index/archive-title.js +77 -0
  18. package/dist/session-index/connection.d.ts +152 -0
  19. package/dist/session-index/connection.d.ts.map +1 -0
  20. package/dist/session-index/connection.js +310 -0
  21. package/dist/session-index/dir-listing.d.ts +30 -0
  22. package/dist/session-index/dir-listing.d.ts.map +1 -0
  23. package/dist/session-index/dir-listing.js +110 -0
  24. package/dist/session-index/explicit-title.d.ts +34 -0
  25. package/dist/session-index/explicit-title.d.ts.map +1 -0
  26. package/dist/session-index/explicit-title.js +65 -0
  27. package/dist/session-index/first-prompt.d.ts +37 -0
  28. package/dist/session-index/first-prompt.d.ts.map +1 -0
  29. package/dist/session-index/first-prompt.js +195 -0
  30. package/dist/session-index/list-subscriptions.d.ts +190 -0
  31. package/dist/session-index/list-subscriptions.d.ts.map +1 -0
  32. package/dist/session-index/list-subscriptions.js +1163 -0
  33. package/dist/session-index/live-registry.d.ts +72 -0
  34. package/dist/session-index/live-registry.d.ts.map +1 -0
  35. package/dist/session-index/live-registry.js +240 -0
  36. package/dist/session-index/project-dirs.d.ts +45 -0
  37. package/dist/session-index/project-dirs.d.ts.map +1 -0
  38. package/dist/session-index/project-dirs.js +122 -0
  39. package/dist/session-index/service.d.ts +158 -0
  40. package/dist/session-index/service.d.ts.map +1 -0
  41. package/dist/session-index/service.js +546 -0
  42. package/dist/session-index/session-index.d.ts +201 -0
  43. package/dist/session-index/session-index.d.ts.map +1 -0
  44. package/dist/session-index/session-index.js +740 -0
  45. package/dist/session-index/session-info.d.ts +16 -0
  46. package/dist/session-index/session-info.d.ts.map +1 -0
  47. package/dist/session-index/session-info.js +51 -0
  48. package/dist/session-index/transcript-scan.d.ts +137 -0
  49. package/dist/session-index/transcript-scan.d.ts.map +1 -0
  50. package/dist/session-index/transcript-scan.js +545 -0
  51. package/dist/session-index/worktrees.d.ts +25 -0
  52. package/dist/session-index/worktrees.d.ts.map +1 -0
  53. package/dist/session-index/worktrees.js +128 -0
  54. package/dist/session-titles.d.ts +21 -0
  55. package/dist/session-titles.d.ts.map +1 -1
  56. package/dist/session-titles.js +101 -5
  57. package/dist/utils.d.ts +31 -0
  58. package/dist/utils.d.ts.map +1 -1
  59. package/dist/utils.js +60 -2
  60. package/package.json +1 -1
@@ -0,0 +1,195 @@
1
+ /**
2
+ * The first prompt of a transcript, extracted the way the SDK does for a
3
+ * session title (its `rf`, `ti` and `jP` in `@anthropic-ai/claude-agent-sdk`).
4
+ * Used when the SDK `getSessionInfo` read another copy of the session.
5
+ *
6
+ * - Only main-chain user records count: no tool result, meta or compact
7
+ * summary record.
8
+ * - Each text (the string content, or every text block) is expanded from its
9
+ * `<pasted_content>` blocks and flattened to one line.
10
+ * - A slash command (`<command-name>/init</command-name>`) is only a fallback
11
+ * while a real prompt may follow; `<bash-input>x</bash-input>` is `! x`;
12
+ * a text that starts with another tag or with an interrupt marker is
13
+ * skipped.
14
+ * - A prompt longer than 200 characters is cut and gets an ellipsis.
15
+ * - Without any text, an image or a document prompt is `Image` or `Document`.
16
+ */
17
+ const MAX_PROMPT_LENGTH = 200;
18
+ const COMMAND_NAME = /<command-name>(.*?)<\/command-name>/;
19
+ const BASH_INPUT = /<bash-input>([\s\S]*?)<\/bash-input>/;
20
+ const SKIPPED_TEXT = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
21
+ const PASTED_OPEN = '<pasted_content id="';
22
+ function isPastedId(value) {
23
+ return /^[0-9a-f]{4}$/.test(value);
24
+ }
25
+ /** `text` with each `<pasted_content id="xxxx">` block replaced by its body. */
26
+ function expandPastedContent(text) {
27
+ const parts = [];
28
+ let done = 0;
29
+ let from = 0;
30
+ let expanded = false;
31
+ for (;;) {
32
+ const open = text.indexOf(PASTED_OPEN, from);
33
+ if (open === -1)
34
+ break;
35
+ const idStart = open + PASTED_OPEN.length;
36
+ const id = text.slice(idStart, idStart + 4);
37
+ if (!isPastedId(id) || !text.startsWith('">\n', idStart + 4)) {
38
+ from = idStart;
39
+ continue;
40
+ }
41
+ const bodyStart = idStart + 4 + 3;
42
+ const close = `</pasted_content id="${id}">`;
43
+ const closeAt = text.indexOf(`\n${close}`, bodyStart - 1) + 1;
44
+ if (closeAt === 0)
45
+ break;
46
+ let start = open;
47
+ for (let i = 0; i < 2 && start > done && text[start - 1] === "\n"; i++)
48
+ start--;
49
+ if (start > done)
50
+ parts.push(text.slice(done, start));
51
+ done = closeAt + close.length;
52
+ for (let i = 0; i < 2 && text[done] === "\n"; i++)
53
+ done++;
54
+ parts.push(text.slice(bodyStart, closeAt - 1));
55
+ expanded = true;
56
+ from = done;
57
+ }
58
+ if (!expanded)
59
+ return text;
60
+ if (done < text.length)
61
+ parts.push(text.slice(done));
62
+ return parts.join("");
63
+ }
64
+ /** At most `length` UTF-16 units, without a split surrogate pair. */
65
+ function cut(text, length) {
66
+ if (text.length <= length)
67
+ return text;
68
+ const head = text.slice(0, length);
69
+ const last = head.charCodeAt(length - 1);
70
+ return last >= 0xd800 && last <= 0xdbff ? head.slice(0, -1) : head;
71
+ }
72
+ /**
73
+ * The prompt of one user record, or undefined when it has none. A slash
74
+ * command is recorded in `state.commandFallback` instead.
75
+ */
76
+ export function promptOf(entry, state) {
77
+ if (entry.type !== "user")
78
+ return undefined;
79
+ if (entry.isMeta === true || entry.isCompactSummary === true)
80
+ return undefined;
81
+ const message = entry.message;
82
+ if (!message)
83
+ return undefined;
84
+ const content = message.content;
85
+ const texts = [];
86
+ if (typeof content === "string") {
87
+ texts.push(content);
88
+ }
89
+ else if (Array.isArray(content)) {
90
+ for (const block of content) {
91
+ if (!block || typeof block !== "object")
92
+ continue;
93
+ const { type, text } = block;
94
+ if (type === "tool_result")
95
+ return undefined;
96
+ if (type === "text" && typeof text === "string")
97
+ texts.push(text);
98
+ }
99
+ }
100
+ for (const raw of texts) {
101
+ let text = expandPastedContent(raw).replaceAll("\n", " ").trim();
102
+ if (!text)
103
+ continue;
104
+ const command = COMMAND_NAME.exec(text);
105
+ if (command) {
106
+ if (!state.commandFallback)
107
+ state.commandFallback = command[1];
108
+ continue;
109
+ }
110
+ const bash = BASH_INPUT.exec(text);
111
+ if (bash)
112
+ return `! ${bash[1].trim()}`;
113
+ if (SKIPPED_TEXT.test(text))
114
+ continue;
115
+ if (text.length > MAX_PROMPT_LENGTH)
116
+ text = `${cut(text, MAX_PROMPT_LENGTH).trim()}…`;
117
+ return text;
118
+ }
119
+ return undefined;
120
+ }
121
+ /**
122
+ * Whether a user record is a prompt the user sent: one with prompt text
123
+ * ({@link promptOf}), or one with an image or a document, which the SDK
124
+ * titles `Image` or `Document` when it has no prompt text. A tool result, a meta or compact summary
125
+ * record, an interrupt and a slash command are none.
126
+ */
127
+ export function isUserPrompt(entry) {
128
+ if (promptOf(entry, { commandFallback: "" }) !== undefined)
129
+ return true;
130
+ if (entry.type !== "user" || entry.isMeta === true || entry.isCompactSummary === true) {
131
+ return false;
132
+ }
133
+ const content = entry.message?.content;
134
+ if (!Array.isArray(content))
135
+ return false;
136
+ let media = false;
137
+ for (const block of content) {
138
+ if (!block || typeof block !== "object")
139
+ continue;
140
+ const { type } = block;
141
+ if (type === "tool_result")
142
+ return false;
143
+ if (type === "image" || type === "document")
144
+ media = true;
145
+ }
146
+ return media;
147
+ }
148
+ function isUserLine(line) {
149
+ return line.includes('"type":"user"') || line.includes('"type": "user"');
150
+ }
151
+ /** The first prompt of the head, else the first slash command, else "". */
152
+ export function firstPrompt(head) {
153
+ const state = { commandFallback: "" };
154
+ for (const line of head.split("\n")) {
155
+ if (!isUserLine(line))
156
+ continue;
157
+ if (line.includes('"tool_result"'))
158
+ continue;
159
+ if (line.includes('"isMeta":true') || line.includes('"isMeta": true'))
160
+ continue;
161
+ if (line.includes('"isCompactSummary":true') || line.includes('"isCompactSummary": true')) {
162
+ continue;
163
+ }
164
+ let entry;
165
+ try {
166
+ entry = JSON.parse(line);
167
+ }
168
+ catch {
169
+ continue;
170
+ }
171
+ if (!entry || typeof entry !== "object")
172
+ continue;
173
+ const prompt = promptOf(entry, state);
174
+ if (prompt !== undefined)
175
+ return prompt;
176
+ }
177
+ return state.commandFallback;
178
+ }
179
+ /** `Image` or `Document` for a first user record that holds one, else "". */
180
+ export function mediaPrompt(head) {
181
+ for (const line of head.split("\n")) {
182
+ if (!isUserLine(line))
183
+ continue;
184
+ if (line.includes('"tool_result"'))
185
+ continue;
186
+ if (line.includes('"isMeta":true') || line.includes('"isMeta": true'))
187
+ continue;
188
+ if (line.includes('"type":"image"') || line.includes('"type": "image"'))
189
+ return "Image";
190
+ if (line.includes('"type":"document"') || line.includes('"type": "document"')) {
191
+ return "Document";
192
+ }
193
+ }
194
+ return "";
195
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * `_session/list/subscribe`: pushes the changed rows of a cwd's session list
3
+ * to a `sessionIndex` client.
4
+ *
5
+ * A subscription covers the sessions of its cwd and of the same subdirectory
6
+ * in every linked worktree (the `includeWorktrees` scope of the list), in any
7
+ * archive state. All subscriptions of one cwd share one {@link ScopeWatch}:
8
+ * a non-recursive `fs.watch` on each project directory of the scope, the
9
+ * stats of its transcripts, and the row of each session read since. The
10
+ * registry and the projects root are watched once per connection.
11
+ *
12
+ * Subscribe reads no row: it opens the watchers, stats the transcripts and
13
+ * reads the registry. A row is read on the first
14
+ * event of its session and sent unconditionally; later rows are compared
15
+ * with it.
16
+ *
17
+ * - A transcript event names the file: only that file is stat'ed and, when
18
+ * it changed, its metadata read again (the index's metadata cache and tail
19
+ * scan).
20
+ * - A registry event names the record: only that record is read, and only
21
+ * the sessions whose record changed get their `state` recomputed.
22
+ * - A session this connection runs reports its SDK state at once.
23
+ *
24
+ * Events are coalesced: 150 ms after the last one, at most 1 s after the
25
+ * first. Each subscription compares a recomputed row with the last row it
26
+ * sent; a change of `updatedAt` alone is no change. A session is sent at most
27
+ * once a second per subscription. A rescan every 10 s stats the scope again
28
+ * and reads the transcripts whose stat changed (or whose last read
29
+ * failed), which covers events `fs.watch` missed;
30
+ * the state of a live session ages from the metadata the index holds.
31
+ *
32
+ * Delivery is best effort: there is no resync and no sequence number; the
33
+ * client also reads the list now and then.
34
+ */
35
+ import { type SessionInfo } from "@agentclientprotocol/sdk";
36
+ import type { OwnSessionState } from "./activity.js";
37
+ import { type LiveSessionRegistry } from "./live-registry.js";
38
+ import { type SessionIndex } from "./session-index.js";
39
+ export declare const LIST_SUBSCRIBE_METHOD = "_session/list/subscribe";
40
+ export declare const LIST_UNSUBSCRIBE_METHOD = "_session/list/unsubscribe";
41
+ export declare const LIST_CHANGES_METHOD = "_session/list/changes";
42
+ /** Subscriptions per connection. */
43
+ export declare const MAX_SUBSCRIPTIONS = 128;
44
+ export type ListSubscribeRequest = {
45
+ cwd: string;
46
+ };
47
+ export type ListSubscribeResponse = {
48
+ subscriptionId: string;
49
+ };
50
+ export type ListUnsubscribeRequest = {
51
+ subscriptionId: string;
52
+ };
53
+ export type ListChanges = {
54
+ subscriptionId: string;
55
+ sessions: SessionInfo[];
56
+ removed: string[];
57
+ };
58
+ /** `{ cwd }`: an absolute path. Other parameters are ignored. */
59
+ export declare function parseListSubscribeRequest(value: unknown): ListSubscribeRequest;
60
+ /** `{ subscriptionId }`. */
61
+ export declare function parseListUnsubscribeRequest(value: unknown): ListUnsubscribeRequest;
62
+ export type ListSubscriptionDeps = {
63
+ index: Pick<SessionIndex, "listedPaths" | "projectDirs" | "enumerateFiles" | "rowsOf" | "cachedRowsOf" | "continuedIn" | "isRead">;
64
+ registry: Pick<LiveSessionRegistry, "readFiles">;
65
+ /** What this connection knows of a session it runs. */
66
+ own: (sessionId: string) => OwnSessionState | undefined;
67
+ notify: (changes: ListChanges) => Promise<void>;
68
+ logError: (message: string, error: unknown) => void;
69
+ now?: () => number;
70
+ debounceMs?: number;
71
+ maxWaitMs?: number;
72
+ rescanMs?: number;
73
+ minSessionIntervalMs?: number;
74
+ };
75
+ export declare class ListSubscriptions {
76
+ private readonly deps;
77
+ private readonly subscriptions;
78
+ /** Sessions whose row shows this connection's SDK state: the rescan
79
+ * presents them again, in case a change of it was not reported. */
80
+ private readonly ownShown;
81
+ private readonly watches;
82
+ private readonly shared;
83
+ /** The directory each shared watcher watches (see {@link dirIdentity}). */
84
+ private readonly sharedIdentity;
85
+ /** The nearest existing ancestor of each shared directory that does not
86
+ * exist yet, watched for its creation. */
87
+ private readonly ancestors;
88
+ private rescanTimer?;
89
+ /** The live records by registry file name. */
90
+ private liveFiles;
91
+ private live;
92
+ private registryLoaded?;
93
+ private registryNames;
94
+ private registryFull;
95
+ private registryDebounce?;
96
+ private registryMaxWait?;
97
+ private registryWorking?;
98
+ private disposed;
99
+ /** Orders subscriptions and session births (see {@link ScopeWatch.born}). */
100
+ private seq;
101
+ private readonly now;
102
+ private readonly debounceMs;
103
+ private readonly maxWaitMs;
104
+ private readonly rescanMs;
105
+ private readonly minIntervalMs;
106
+ constructor(deps: ListSubscriptionDeps);
107
+ /** Subscribes to the sessions of `cwd`. Changes are tracked from the
108
+ * return on. Reads no row (see {@link createWatch}). */
109
+ subscribe(cwd: string): Promise<ListSubscribeResponse>;
110
+ /** Idempotent: an unknown id is no error. */
111
+ unsubscribe(subscriptionId: string): void;
112
+ /** A session this connection runs changed its state, turn end or cost. */
113
+ ownSessionChanged(id: string): void;
114
+ dispose(): void;
115
+ /** The open watchers and armed timers, for tests and diagnostics. */
116
+ openHandles(): {
117
+ watches: number;
118
+ watchers: number;
119
+ timers: number;
120
+ };
121
+ private createWatch;
122
+ private closeWatch;
123
+ /** The registry and the projects root, watched once for all cwds, and the
124
+ * rescan. */
125
+ private ensureShared;
126
+ /** Watches the nearest existing ancestor of each of `missing` (a config
127
+ * directory without `projects` or `sessions` yet): any event there checks
128
+ * again. */
129
+ private watchAncestors;
130
+ private stopShared;
131
+ private rescanAll;
132
+ private onTranscriptEvent;
133
+ /** A project directory that a scope lacked may have been created. */
134
+ private onProjectsRootEvent;
135
+ private onRegistryEvent;
136
+ /**
137
+ * Runs the work of `watch`: `debounced` after the quiet period, `now` at
138
+ * once, and `states` at once for the recomputed states only, leaving the
139
+ * transcript events to their quiet period (a registry that changes every
140
+ * 200 ms then does not read the transcripts that often).
141
+ */
142
+ private schedule;
143
+ private clearWatchTimers;
144
+ private scheduleRegistry;
145
+ private registryWork;
146
+ /** Reads the changed registry records (all with `full`) and returns the
147
+ * ids of the sessions whose record changed. */
148
+ private readRegistry;
149
+ private onLiveChanged;
150
+ /** Reads the scope paths and watches their project directories. */
151
+ private refreshDirs;
152
+ private setFiles;
153
+ /** `known`: the sessions with a transcript before; another one is born. */
154
+ private putFile;
155
+ private dropFile;
156
+ private present;
157
+ /** Runs one pass of the pending work of `watch`, one at a time. `files`:
158
+ * the transcript events and the rescan too, not only the states. */
159
+ private work;
160
+ private pass;
161
+ /** Records which session each transcript is continued in, by the metadata
162
+ * the index holds now (a list read it): kept when the index evicts it.
163
+ * Reads nothing. */
164
+ private learnSuccessors;
165
+ /**
166
+ * The rows of the live sessions of the scope without a row here (and not
167
+ * in `except`), from the metadata the index holds (a list read them), not
168
+ * from their transcripts; one it holds nothing for the client did not
169
+ * list. Reads no transcript: a continued one only checks its successor.
170
+ */
171
+ private liveSeeds;
172
+ /** The transcripts of a session the watch knows. */
173
+ private filesOf;
174
+ /**
175
+ * Which of `ids`, without a row read here, may have had a row in the scope
176
+ * before: those that the metadata the index holds for their earlier
177
+ * transcripts (a list read them) gives a row, and those it gives no answer
178
+ * for (unknown: a removal is sent once). Not a session without a
179
+ * transcript before, nor one known to have had no row (another path of
180
+ * the project directory, a hidden session). Reads no transcript.
181
+ */
182
+ private shownBefore;
183
+ /** Sends the pending sessions of `subscription` that differ from what it
184
+ * last sent (a session never sent differs), each at most once per
185
+ * interval, in one notification. */
186
+ private deliver;
187
+ /** Drops send times older than the interval: they hold nothing back. */
188
+ private forgetOldSends;
189
+ }
190
+ //# sourceMappingURL=list-subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-subscriptions.d.ts","sourceRoot":"","sources":["../../src/session-index/list-subscriptions.ts"],"names":[],"mappings":"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"}