gipity 1.0.264 → 1.0.306
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/dist/__tests__/capture-transcript.test.d.ts +1 -0
- package/dist/__tests__/capture-transcript.test.js +92 -0
- package/dist/__tests__/capture-transcript.test.js.map +1 -0
- package/dist/__tests__/cli-smoke.test.js +5 -5
- package/dist/__tests__/cli-smoke.test.js.map +1 -1
- package/dist/__tests__/prompts.test.d.ts +1 -0
- package/dist/__tests__/prompts.test.js +129 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- package/dist/__tests__/push-cas.test.d.ts +1 -0
- package/dist/__tests__/push-cas.test.js +133 -0
- package/dist/__tests__/push-cas.test.js.map +1 -0
- package/dist/__tests__/sync-apply.test.d.ts +1 -0
- package/dist/__tests__/sync-apply.test.js +457 -0
- package/dist/__tests__/sync-apply.test.js.map +1 -0
- package/dist/__tests__/sync-lock.test.d.ts +1 -0
- package/dist/__tests__/sync-lock.test.js +105 -0
- package/dist/__tests__/sync-lock.test.js.map +1 -0
- package/dist/__tests__/sync.test.js +115 -151
- package/dist/__tests__/sync.test.js.map +1 -1
- package/dist/adopt-cwd.d.ts +66 -0
- package/dist/adopt-cwd.js +255 -0
- package/dist/adopt-cwd.js.map +1 -0
- package/dist/api.d.ts +11 -1
- package/dist/api.js +46 -3
- package/dist/api.js.map +1 -1
- package/dist/capture/sources/claude-code.d.ts +78 -0
- package/dist/capture/sources/claude-code.js +158 -0
- package/dist/capture/sources/claude-code.js.map +1 -0
- package/dist/commands/chat.js +8 -8
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/claude.js +265 -129
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/init.js +34 -59
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/location.js +1 -1
- package/dist/commands/location.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/page-inspect.js +36 -25
- package/dist/commands/page-inspect.js.map +1 -1
- package/dist/commands/page-screenshot.d.ts +2 -0
- package/dist/commands/page-screenshot.js +212 -0
- package/dist/commands/page-screenshot.js.map +1 -0
- package/dist/commands/project.js +71 -12
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/relay.js +1 -1
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/scaffold.js +19 -13
- package/dist/commands/scaffold.js.map +1 -1
- package/dist/commands/sync.js +15 -24
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/uninstall.js +1 -1
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/helpers/sync.d.ts +4 -2
- package/dist/helpers/sync.js +13 -7
- package/dist/helpers/sync.js.map +1 -1
- package/dist/hooks/capture-runner.d.ts +24 -0
- package/dist/hooks/capture-runner.js +233 -0
- package/dist/hooks/capture-runner.js.map +1 -0
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/project-setup.d.ts +21 -0
- package/dist/project-setup.js +42 -0
- package/dist/project-setup.js.map +1 -0
- package/dist/prompts.d.ts +7 -0
- package/dist/prompts.js +25 -2
- package/dist/prompts.js.map +1 -1
- package/dist/relay/daemon.d.ts +8 -8
- package/dist/relay/daemon.js +23 -61
- package/dist/relay/daemon.js.map +1 -1
- package/dist/relay/device-http.d.ts +9 -0
- package/dist/relay/device-http.js +58 -0
- package/dist/relay/device-http.js.map +1 -0
- package/dist/relay/onboarding.js +3 -2
- package/dist/relay/onboarding.js.map +1 -1
- package/dist/setup.d.ts +8 -0
- package/dist/setup.js +55 -16
- package/dist/setup.js.map +1 -1
- package/dist/sync.d.ts +55 -37
- package/dist/sync.js +628 -445
- package/dist/sync.js.map +1 -1
- package/dist/updater/bootstrap.d.ts +6 -1
- package/dist/updater/bootstrap.js +21 -13
- package/dist/updater/bootstrap.js.map +1 -1
- package/dist/updater/shim.js +12 -1
- package/dist/updater/shim.js.map +1 -1
- package/dist/upload.d.ts +13 -2
- package/dist/upload.js +59 -6
- package/dist/upload.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for adopting the current working directory as a Gipity
|
|
3
|
+
* project. Used by both `gipity init` and `gipity claude`'s "Use this
|
|
4
|
+
* directory" picker option.
|
|
5
|
+
*
|
|
6
|
+
* The whole flow:
|
|
7
|
+
* 1. `scanForAdoption(cwd)` — bound the size to keep us from sucking in a
|
|
8
|
+
* huge monorepo or someone's $HOME by accident.
|
|
9
|
+
* 2. `adoptCurrentDir(...)` — find-or-create a server project keyed by the
|
|
10
|
+
* cwd's slugified basename, then `finalizeLocalProject` to write
|
|
11
|
+
* `.gipity.json`, sync, and install hooks/skills/gitignore.
|
|
12
|
+
*/
|
|
13
|
+
import { readdirSync, statSync } from 'fs';
|
|
14
|
+
import { join, resolve, sep } from 'path';
|
|
15
|
+
import { homedir } from 'os';
|
|
16
|
+
import { get, post, ApiError } from './api.js';
|
|
17
|
+
import { isSyncIgnored } from './setup.js';
|
|
18
|
+
import { finalizeLocalProject } from './project-setup.js';
|
|
19
|
+
import { getProjectsRoot } from './relay/paths.js';
|
|
20
|
+
import * as relayState from './relay/state.js';
|
|
21
|
+
const EASY_FILES = 200;
|
|
22
|
+
const EASY_BYTES = 100 * 1024 * 1024; // 100 MB
|
|
23
|
+
const REFUSE_FILES = 2000;
|
|
24
|
+
const REFUSE_BYTES = 1024 * 1024 * 1024; // 1 GB
|
|
25
|
+
/** Walk `cwd` (respecting `isSyncIgnored`) and bucket by file count + size.
|
|
26
|
+
* Bails out early once we cross either refuse threshold so a 1M-file dir
|
|
27
|
+
* doesn't take seconds to count. */
|
|
28
|
+
export function scanForAdoption(cwd) {
|
|
29
|
+
let files = 0;
|
|
30
|
+
let bytes = 0;
|
|
31
|
+
let truncated = false;
|
|
32
|
+
const walk = (dir) => {
|
|
33
|
+
if (truncated)
|
|
34
|
+
return;
|
|
35
|
+
let entries;
|
|
36
|
+
try {
|
|
37
|
+
entries = readdirSync(dir);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const name of entries) {
|
|
43
|
+
if (truncated)
|
|
44
|
+
return;
|
|
45
|
+
if (isSyncIgnored(name))
|
|
46
|
+
continue;
|
|
47
|
+
const full = join(dir, name);
|
|
48
|
+
let st;
|
|
49
|
+
try {
|
|
50
|
+
st = statSync(full);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (st.isDirectory()) {
|
|
56
|
+
walk(full);
|
|
57
|
+
}
|
|
58
|
+
else if (st.isFile()) {
|
|
59
|
+
files++;
|
|
60
|
+
bytes += st.size;
|
|
61
|
+
if (files > REFUSE_FILES || bytes > REFUSE_BYTES) {
|
|
62
|
+
truncated = true;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
walk(cwd);
|
|
69
|
+
let tier;
|
|
70
|
+
if (truncated || files > REFUSE_FILES || bytes > REFUSE_BYTES)
|
|
71
|
+
tier = 'refuse';
|
|
72
|
+
else if (files > EASY_FILES || bytes > EASY_BYTES)
|
|
73
|
+
tier = 'moderate';
|
|
74
|
+
else
|
|
75
|
+
tier = 'easy';
|
|
76
|
+
return { tier, files, bytes, truncated };
|
|
77
|
+
}
|
|
78
|
+
/** Treat cwd as "empty" if it has no entries that aren't sync-ignored
|
|
79
|
+
* (dotfiles, node_modules, .git, etc.). When true, the picker should still
|
|
80
|
+
* offer the "what would you like to build?" prompt so Claude can scaffold
|
|
81
|
+
* in place. */
|
|
82
|
+
export function isLikelyEmpty(cwd) {
|
|
83
|
+
let entries;
|
|
84
|
+
try {
|
|
85
|
+
entries = readdirSync(cwd);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return entries.every(isSyncIgnored);
|
|
91
|
+
}
|
|
92
|
+
/** Hide-list for "Use this directory" — places where adopting cwd as a
|
|
93
|
+
* project is obviously wrong. Exact-match only; subdirectories are fine
|
|
94
|
+
* (e.g. `/tmp/scratch` is allowed, just not `/tmp` itself). */
|
|
95
|
+
export function canAdoptCwd(cwd) {
|
|
96
|
+
const norm = resolve(cwd);
|
|
97
|
+
const home = resolve(homedir());
|
|
98
|
+
// Exact root/home/system paths — adopting these would scoop the world.
|
|
99
|
+
const blocked = new Set([
|
|
100
|
+
sep,
|
|
101
|
+
home,
|
|
102
|
+
resolve(getProjectsRoot()),
|
|
103
|
+
'/tmp', '/var', '/etc', '/usr', '/opt',
|
|
104
|
+
'/mnt', '/mnt/c', '/mnt/d', '/mnt/wsl',
|
|
105
|
+
]);
|
|
106
|
+
if (blocked.has(norm))
|
|
107
|
+
return false;
|
|
108
|
+
// Workspace-parent heuristic: a directory at depth ≤1 below $HOME that
|
|
109
|
+
// contains 3+ subdirectories with their own `.git/` is almost certainly
|
|
110
|
+
// a parent like `~/Github/` — not a single project.
|
|
111
|
+
if (norm.startsWith(home + sep)) {
|
|
112
|
+
const depth = norm.slice(home.length + 1).split(sep).length;
|
|
113
|
+
if (depth <= 1 && countGitRepoChildren(norm) >= 3)
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
/** Count immediate subdirectories of `dir` that contain a `.git/` entry.
|
|
119
|
+
* Bounded to first 50 entries — enough to flag a workspace dir without
|
|
120
|
+
* walking everything. */
|
|
121
|
+
function countGitRepoChildren(dir) {
|
|
122
|
+
let entries;
|
|
123
|
+
try {
|
|
124
|
+
entries = readdirSync(dir);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
let count = 0;
|
|
130
|
+
for (const name of entries.slice(0, 50)) {
|
|
131
|
+
if (name.startsWith('.'))
|
|
132
|
+
continue;
|
|
133
|
+
const child = join(dir, name);
|
|
134
|
+
try {
|
|
135
|
+
if (!statSync(child).isDirectory())
|
|
136
|
+
continue;
|
|
137
|
+
const gitPath = join(child, '.git');
|
|
138
|
+
if (statSync(gitPath))
|
|
139
|
+
count++;
|
|
140
|
+
}
|
|
141
|
+
catch { /* not a repo */ }
|
|
142
|
+
if (count >= 3)
|
|
143
|
+
return count;
|
|
144
|
+
}
|
|
145
|
+
return count;
|
|
146
|
+
}
|
|
147
|
+
/** Format `cwd` as a short two-segment tail for picker labels:
|
|
148
|
+
* /home/steve/Github/Gipity → ~/Github/Gipity (collapse home)
|
|
149
|
+
* /tmp/scratch → /tmp/scratch
|
|
150
|
+
* Used to give the user enough context to recognize the dir without
|
|
151
|
+
* taking up the whole line. */
|
|
152
|
+
export function formatCwdLabel(cwd) {
|
|
153
|
+
const norm = resolve(cwd);
|
|
154
|
+
const home = resolve(homedir());
|
|
155
|
+
if (norm === home)
|
|
156
|
+
return '~';
|
|
157
|
+
if (norm.startsWith(home + sep)) {
|
|
158
|
+
const tail = norm.slice(home.length + 1).split(sep);
|
|
159
|
+
if (tail.length <= 2)
|
|
160
|
+
return '~/' + tail.join('/');
|
|
161
|
+
return '~/…/' + tail.slice(-2).join('/');
|
|
162
|
+
}
|
|
163
|
+
// Outside home: show parent/this for non-root paths.
|
|
164
|
+
const parts = norm.split(sep).filter(Boolean);
|
|
165
|
+
if (parts.length <= 1)
|
|
166
|
+
return norm;
|
|
167
|
+
return parts.slice(-2).join('/');
|
|
168
|
+
}
|
|
169
|
+
/** Format byte count handling KB/MB/GB. utils.formatSize tops out at MB,
|
|
170
|
+
* which prints "1024.0 MB" for the 1 GB refuse threshold. */
|
|
171
|
+
export function formatBytes(n) {
|
|
172
|
+
if (n < 1024)
|
|
173
|
+
return `${n} B`;
|
|
174
|
+
if (n < 1024 * 1024)
|
|
175
|
+
return `${(n / 1024).toFixed(1)} KB`;
|
|
176
|
+
if (n < 1024 * 1024 * 1024)
|
|
177
|
+
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
178
|
+
return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;
|
|
179
|
+
}
|
|
180
|
+
/** Adopt `cwd` as a Gipity project. Mirrors `gipity init`'s flow:
|
|
181
|
+
* 1. Slug = slugify(basename(cwd)) — provided by caller (so caller can
|
|
182
|
+
* validate/prompt as needed).
|
|
183
|
+
* 2. Try to match an existing server project by slug; adopt if found.
|
|
184
|
+
* 3. Otherwise POST /projects with relay-device wiring.
|
|
185
|
+
* 4. Fetch agent + account, then `finalizeLocalProject` to write config,
|
|
186
|
+
* sync, and install hooks/skills/gitignore.
|
|
187
|
+
* Caller is responsible for the size-tier check before calling. */
|
|
188
|
+
export async function adoptCurrentDir(opts) {
|
|
189
|
+
// Try to match an existing project by slug. Lets the user re-adopt a
|
|
190
|
+
// project they previously created from this dir on another machine.
|
|
191
|
+
let project = null;
|
|
192
|
+
try {
|
|
193
|
+
const res = await get('/projects?limit=100');
|
|
194
|
+
project = res.data.find(p => p.slug === opts.projectSlug) || null;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// List failed — fall through to POST.
|
|
198
|
+
}
|
|
199
|
+
let isNew = false;
|
|
200
|
+
if (!project) {
|
|
201
|
+
const device = relayState.getDevice();
|
|
202
|
+
const body = {
|
|
203
|
+
name: opts.projectName,
|
|
204
|
+
slug: opts.projectSlug,
|
|
205
|
+
};
|
|
206
|
+
if (device) {
|
|
207
|
+
body.autoChat = 'claude_code';
|
|
208
|
+
body.deviceGuid = device.guid;
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
const res = await post('/projects', body);
|
|
212
|
+
project = res.data;
|
|
213
|
+
isNew = true;
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
if (err instanceof ApiError && err.statusCode === 409) {
|
|
217
|
+
// Race: re-fetch and adopt the conflicting one (someone else just
|
|
218
|
+
// took the slug — likely the same user from another tab).
|
|
219
|
+
const res = await get('/projects?limit=100');
|
|
220
|
+
const found = res.data.find(p => p.slug === opts.projectSlug);
|
|
221
|
+
if (!found)
|
|
222
|
+
throw err;
|
|
223
|
+
project = found;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
throw err;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Fetch the project's agent (if any). An explicit override wins.
|
|
231
|
+
let agentGuid = opts.agentOverride ?? '';
|
|
232
|
+
if (!agentGuid) {
|
|
233
|
+
try {
|
|
234
|
+
const agents = await get(`/projects/${project.short_guid}/agents`);
|
|
235
|
+
if (agents.data.length > 0)
|
|
236
|
+
agentGuid = agents.data[0].short_guid;
|
|
237
|
+
}
|
|
238
|
+
catch { /* no agents */ }
|
|
239
|
+
}
|
|
240
|
+
const { applied } = await finalizeLocalProject({
|
|
241
|
+
dir: opts.cwd,
|
|
242
|
+
projectGuid: project.short_guid,
|
|
243
|
+
projectSlug: project.slug,
|
|
244
|
+
accountSlug: opts.accountSlug,
|
|
245
|
+
agentGuid,
|
|
246
|
+
sync: 'strict',
|
|
247
|
+
interactive: opts.confirmDeletions,
|
|
248
|
+
});
|
|
249
|
+
return { project, isNew, agentGuid, accountSlug: opts.accountSlug, applied };
|
|
250
|
+
}
|
|
251
|
+
/** Re-export so callers can unify on these constants for messaging. */
|
|
252
|
+
export const ADOPT_THRESHOLDS = {
|
|
253
|
+
EASY_FILES, EASY_BYTES, REFUSE_FILES, REFUSE_BYTES,
|
|
254
|
+
};
|
|
255
|
+
//# sourceMappingURL=adopt-cwd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt-cwd.js","sourceRoot":"","sources":["../src/adopt-cwd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAuB/C,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAQ,SAAS;AACtD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAK,OAAO;AAEpD;;qCAEqC;AACrC,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,IAAI,SAAS;YAAE,OAAO;QACtB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,IAAI,CAAC;gBAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAChD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,CAAC;iBAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvB,KAAK,EAAE,CAAC;gBACR,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;gBACjB,IAAI,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;oBACjD,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,IAAI,IAAe,CAAC;IACpB,IAAI,SAAS,IAAI,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,YAAY;QAAE,IAAI,GAAG,QAAQ,CAAC;SAC1E,IAAI,KAAK,GAAG,UAAU,IAAI,KAAK,GAAG,UAAU;QAAE,IAAI,GAAG,UAAU,CAAC;;QAChE,IAAI,GAAG,MAAM,CAAC;IAEnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED;;;gBAGgB;AAChB,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED;;gEAEgE;AAChE,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhC,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,GAAG;QACH,IAAI;QACJ,OAAO,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QACtC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU;KACvC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,uEAAuE;IACvE,wEAAwE;IACxE,oDAAoD;IACpD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC5D,IAAI,KAAK,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;0BAE0B;AAC1B,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,QAAQ,CAAC,OAAO,CAAC;gBAAE,KAAK,EAAE,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC5B,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;gCAIgC;AAChC,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,qDAAqD;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;8DAC8D;AAC9D,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1E,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAUD;;;;;;;oEAOoE;AACpE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAQrC;IACC,qEAAqE;IACrE,oEAAoE;IACpE,IAAI,OAAO,GAAuB,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAA8C,qBAAqB,CAAC,CAAC;QAC1F,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,GAAkF;YAC1F,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,IAAI,EAAE,IAAI,CAAC,WAAW;SACvB,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAAC,CAAC;QAC7E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAwB,WAAW,EAAE,IAAI,CAAC,CAAC;YACjE,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;YACnB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACtD,kEAAkE;gBAClE,0DAA0D;gBAC1D,MAAM,GAAG,GAAG,MAAM,GAAG,CAA8C,qBAAqB,CAAC,CAAC;gBAC1F,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9D,IAAI,CAAC,KAAK;oBAAE,MAAM,GAAG,CAAC;gBACtB,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAwB,aAAa,OAAO,CAAC,UAAU,SAAS,CAAC,CAAC;YAC1F,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,CAAC;QAC7C,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,WAAW,EAAE,OAAO,CAAC,UAAU;QAC/B,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS;QACT,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,IAAI,CAAC,gBAAgB;KACnC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;AAC/E,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY;CACnD,CAAC"}
|
package/dist/api.d.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
export declare class ApiError extends Error {
|
|
2
2
|
statusCode: number;
|
|
3
3
|
code: string;
|
|
4
|
-
|
|
4
|
+
/** Structured sidecar payload from the server (e.g. current_server_version on CAS 409s). */
|
|
5
|
+
data?: Record<string, unknown> | undefined;
|
|
6
|
+
constructor(statusCode: number, code: string, message: string,
|
|
7
|
+
/** Structured sidecar payload from the server (e.g. current_server_version on CAS 409s). */
|
|
8
|
+
data?: Record<string, unknown> | undefined);
|
|
5
9
|
}
|
|
6
10
|
export declare function get<T>(path: string): Promise<T>;
|
|
7
11
|
export declare function post<T>(path: string, body?: unknown): Promise<T>;
|
|
12
|
+
/** POST JSON and consume the response as a tar stream, returning each entry as
|
|
13
|
+
* { name, buffer } in arrival order. Non-2xx responses are parsed as JSON errors. */
|
|
14
|
+
export declare function postForTarEntries(path: string, body?: unknown): Promise<Array<{
|
|
15
|
+
name: string;
|
|
16
|
+
buffer: Buffer;
|
|
17
|
+
}>>;
|
|
8
18
|
export declare function put<T>(path: string, body?: unknown): Promise<T>;
|
|
9
19
|
export declare function del<T>(path: string, body?: unknown): Promise<T>;
|
|
10
20
|
/** Send a message via the conversation API, reusing or creating a conversation. Returns content string. */
|
package/dist/api.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import * as tar from 'tar-stream';
|
|
1
3
|
import { getAuth, refreshTokenIfNeeded } from './auth.js';
|
|
2
4
|
import { getConfig, getApiBaseOverride, requireConfig, saveConfig } from './config.js';
|
|
3
5
|
export class ApiError extends Error {
|
|
4
6
|
statusCode;
|
|
5
7
|
code;
|
|
6
|
-
|
|
8
|
+
data;
|
|
9
|
+
constructor(statusCode, code, message,
|
|
10
|
+
/** Structured sidecar payload from the server (e.g. current_server_version on CAS 409s). */
|
|
11
|
+
data) {
|
|
7
12
|
super(message);
|
|
8
13
|
this.statusCode = statusCode;
|
|
9
14
|
this.code = code;
|
|
15
|
+
this.data = data;
|
|
10
16
|
this.name = 'ApiError';
|
|
11
17
|
}
|
|
12
18
|
}
|
|
@@ -34,7 +40,7 @@ async function request(method, path, body) {
|
|
|
34
40
|
if (!res.ok) {
|
|
35
41
|
const json = await res.json().catch(() => ({ error: { code: 'UNKNOWN', message: res.statusText } }));
|
|
36
42
|
const err = json.error || { code: 'UNKNOWN', message: res.statusText };
|
|
37
|
-
throw new ApiError(res.status, err.code, err.message);
|
|
43
|
+
throw new ApiError(res.status, err.code, err.message, json.data);
|
|
38
44
|
}
|
|
39
45
|
return res.json();
|
|
40
46
|
}
|
|
@@ -44,6 +50,43 @@ export function get(path) {
|
|
|
44
50
|
export function post(path, body) {
|
|
45
51
|
return request('POST', path, body);
|
|
46
52
|
}
|
|
53
|
+
/** POST JSON and consume the response as a tar stream, returning each entry as
|
|
54
|
+
* { name, buffer } in arrival order. Non-2xx responses are parsed as JSON errors. */
|
|
55
|
+
export async function postForTarEntries(path, body) {
|
|
56
|
+
const headers = await getHeaders();
|
|
57
|
+
const url = `${baseUrl()}${path}`;
|
|
58
|
+
const res = await fetch(url, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers,
|
|
61
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
62
|
+
});
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
const json = await res.json().catch(() => ({ error: { code: 'UNKNOWN', message: res.statusText } }));
|
|
65
|
+
const err = json.error || { code: 'UNKNOWN', message: res.statusText };
|
|
66
|
+
throw new ApiError(res.status, err.code, err.message, json.data);
|
|
67
|
+
}
|
|
68
|
+
if (!res.body)
|
|
69
|
+
throw new ApiError(500, 'EMPTY_RESPONSE', 'Server returned no body');
|
|
70
|
+
const extract = tar.extract();
|
|
71
|
+
const entries = [];
|
|
72
|
+
const done = new Promise((resolve, reject) => {
|
|
73
|
+
extract.on('entry', (header, stream, next) => {
|
|
74
|
+
const chunks = [];
|
|
75
|
+
stream.on('data', (c) => chunks.push(c));
|
|
76
|
+
stream.on('end', () => {
|
|
77
|
+
entries.push({ name: header.name, buffer: Buffer.concat(chunks) });
|
|
78
|
+
next();
|
|
79
|
+
});
|
|
80
|
+
stream.on('error', reject);
|
|
81
|
+
stream.resume();
|
|
82
|
+
});
|
|
83
|
+
extract.on('finish', () => resolve());
|
|
84
|
+
extract.on('error', reject);
|
|
85
|
+
});
|
|
86
|
+
Readable.fromWeb(res.body).pipe(extract);
|
|
87
|
+
await done;
|
|
88
|
+
return entries;
|
|
89
|
+
}
|
|
47
90
|
export function put(path, body) {
|
|
48
91
|
return request('PUT', path, body);
|
|
49
92
|
}
|
|
@@ -146,7 +189,7 @@ export async function publicPost(path, body) {
|
|
|
146
189
|
if (!res.ok) {
|
|
147
190
|
const json = await res.json().catch(() => ({ error: { code: 'UNKNOWN', message: res.statusText } }));
|
|
148
191
|
const err = json.error || { code: 'UNKNOWN', message: res.statusText };
|
|
149
|
-
throw new ApiError(res.status, err.code, err.message);
|
|
192
|
+
throw new ApiError(res.status, err.code, err.message, json.data);
|
|
150
193
|
}
|
|
151
194
|
return res.json();
|
|
152
195
|
}
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvF,MAAM,OAAO,QAAS,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code JSONL transcript → ingest entries.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code writes one JSON object per line to
|
|
5
|
+
* ~/.claude/projects/<flattened-cwd>/<session_id>.jsonl
|
|
6
|
+
* during interactive sessions. The `transcript_path` field on every hook
|
|
7
|
+
* input points at that file. Line shapes we care about:
|
|
8
|
+
*
|
|
9
|
+
* { type: 'user', message: { content: string | Array<block> }, uuid, isSidechain, … }
|
|
10
|
+
* { type: 'assistant', message: { content: Array<block>, stop_reason, model, usage }, uuid, isSidechain, … }
|
|
11
|
+
*
|
|
12
|
+
* The inner `message.content` block schema matches stream-json's
|
|
13
|
+
* assistant/user events (text blocks, tool_use blocks, tool_result
|
|
14
|
+
* blocks), so the block-walking logic mirrors
|
|
15
|
+
* `cli/src/relay/stream-json.ts`. Only the outer envelope is new:
|
|
16
|
+
*
|
|
17
|
+
* - `queue-operation`, `summary`, and `toolUseResult` wrapper-only
|
|
18
|
+
* lines carry no primary message content and are skipped.
|
|
19
|
+
* - `isSidechain: true` lines come from Task subagent transcripts;
|
|
20
|
+
* SubagentStop fires on those separately, so we skip them here to
|
|
21
|
+
* avoid double-counting.
|
|
22
|
+
*
|
|
23
|
+
* Every emitted ingest entry is tagged with `source_uuid = line.uuid`
|
|
24
|
+
* so retried POSTs are deduplicated by the partial unique index on
|
|
25
|
+
* messages(conversation_id, source_uuid).
|
|
26
|
+
*/
|
|
27
|
+
export type IngestEntry = {
|
|
28
|
+
kind: 'attach';
|
|
29
|
+
session_id: string;
|
|
30
|
+
cwd?: string;
|
|
31
|
+
source?: 'startup' | 'resume' | 'clear' | 'compact';
|
|
32
|
+
source_uuid?: string;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'prompt';
|
|
35
|
+
prompt: string;
|
|
36
|
+
source_uuid?: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'assistant';
|
|
39
|
+
text: string;
|
|
40
|
+
blocks: any[];
|
|
41
|
+
source_uuid?: string;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'tool_use';
|
|
44
|
+
tool_use_id: string;
|
|
45
|
+
tool_name: string;
|
|
46
|
+
tool_input?: unknown;
|
|
47
|
+
source_uuid?: string;
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'tool_result';
|
|
50
|
+
tool_use_id: string;
|
|
51
|
+
content: unknown;
|
|
52
|
+
is_error?: boolean;
|
|
53
|
+
source_uuid?: string;
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'compact';
|
|
56
|
+
trigger?: string;
|
|
57
|
+
source_uuid?: string;
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'system';
|
|
60
|
+
content: string;
|
|
61
|
+
source_uuid?: string;
|
|
62
|
+
};
|
|
63
|
+
/** Map a single parsed transcript line to zero or more ingest entries. */
|
|
64
|
+
export declare function transcriptLineToEntries(line: any): IngestEntry[];
|
|
65
|
+
/** Parse the full JSONL transcript and emit every ingest entry that
|
|
66
|
+
* comes *after* the line whose `uuid === afterUuid`. Returns the
|
|
67
|
+
* entries in order plus the last processed uuid (to save as the new
|
|
68
|
+
* watermark).
|
|
69
|
+
*
|
|
70
|
+
* If `afterUuid` isn't found in the transcript — e.g. because Claude
|
|
71
|
+
* Code's `/clear` or compaction rewrote the file — the caller falls
|
|
72
|
+
* back to processing from the top; the server's `source_uuid` unique
|
|
73
|
+
* index dedupes any lines we already forwarded. */
|
|
74
|
+
export declare function parseTranscript(content: string, afterUuid: string | null): {
|
|
75
|
+
entries: IngestEntry[];
|
|
76
|
+
lastUuid: string | null;
|
|
77
|
+
foundWatermark: boolean;
|
|
78
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code JSONL transcript → ingest entries.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code writes one JSON object per line to
|
|
5
|
+
* ~/.claude/projects/<flattened-cwd>/<session_id>.jsonl
|
|
6
|
+
* during interactive sessions. The `transcript_path` field on every hook
|
|
7
|
+
* input points at that file. Line shapes we care about:
|
|
8
|
+
*
|
|
9
|
+
* { type: 'user', message: { content: string | Array<block> }, uuid, isSidechain, … }
|
|
10
|
+
* { type: 'assistant', message: { content: Array<block>, stop_reason, model, usage }, uuid, isSidechain, … }
|
|
11
|
+
*
|
|
12
|
+
* The inner `message.content` block schema matches stream-json's
|
|
13
|
+
* assistant/user events (text blocks, tool_use blocks, tool_result
|
|
14
|
+
* blocks), so the block-walking logic mirrors
|
|
15
|
+
* `cli/src/relay/stream-json.ts`. Only the outer envelope is new:
|
|
16
|
+
*
|
|
17
|
+
* - `queue-operation`, `summary`, and `toolUseResult` wrapper-only
|
|
18
|
+
* lines carry no primary message content and are skipped.
|
|
19
|
+
* - `isSidechain: true` lines come from Task subagent transcripts;
|
|
20
|
+
* SubagentStop fires on those separately, so we skip them here to
|
|
21
|
+
* avoid double-counting.
|
|
22
|
+
*
|
|
23
|
+
* Every emitted ingest entry is tagged with `source_uuid = line.uuid`
|
|
24
|
+
* so retried POSTs are deduplicated by the partial unique index on
|
|
25
|
+
* messages(conversation_id, source_uuid).
|
|
26
|
+
*/
|
|
27
|
+
/** Extract joined `{type:'text', text}` blocks into a single string.
|
|
28
|
+
* The full blocks array is emitted separately so the client can render
|
|
29
|
+
* text + tool_use in the agent's original narrative order. */
|
|
30
|
+
function joinText(content) {
|
|
31
|
+
if (!Array.isArray(content))
|
|
32
|
+
return '';
|
|
33
|
+
const parts = [];
|
|
34
|
+
for (const b of content) {
|
|
35
|
+
if (b?.type === 'text' && typeof b.text === 'string')
|
|
36
|
+
parts.push(b.text);
|
|
37
|
+
}
|
|
38
|
+
return parts.join('\n');
|
|
39
|
+
}
|
|
40
|
+
/** Map a single parsed transcript line to zero or more ingest entries. */
|
|
41
|
+
export function transcriptLineToEntries(line) {
|
|
42
|
+
if (!line || typeof line !== 'object')
|
|
43
|
+
return [];
|
|
44
|
+
if (typeof line.type !== 'string')
|
|
45
|
+
return [];
|
|
46
|
+
if (typeof line.uuid !== 'string' || !line.uuid)
|
|
47
|
+
return [];
|
|
48
|
+
if (line.isSidechain === true)
|
|
49
|
+
return [];
|
|
50
|
+
if (line.type === 'queue-operation')
|
|
51
|
+
return [];
|
|
52
|
+
if (line.type === 'summary')
|
|
53
|
+
return [];
|
|
54
|
+
if (line.toolUseResult && !line.message)
|
|
55
|
+
return [];
|
|
56
|
+
const srcUuid = line.uuid;
|
|
57
|
+
const msg = line.message ?? {};
|
|
58
|
+
if (line.type === 'user') {
|
|
59
|
+
const content = msg.content;
|
|
60
|
+
if (typeof content === 'string') {
|
|
61
|
+
if (!content)
|
|
62
|
+
return [];
|
|
63
|
+
return [{ kind: 'prompt', prompt: content, source_uuid: srcUuid }];
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(content)) {
|
|
66
|
+
const out = [];
|
|
67
|
+
for (const b of content) {
|
|
68
|
+
if (b?.type === 'tool_result' && typeof b.tool_use_id === 'string') {
|
|
69
|
+
out.push({
|
|
70
|
+
kind: 'tool_result',
|
|
71
|
+
tool_use_id: b.tool_use_id,
|
|
72
|
+
content: b.content ?? null,
|
|
73
|
+
is_error: Boolean(b.is_error),
|
|
74
|
+
source_uuid: srcUuid,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else if (b?.type === 'text' && typeof b.text === 'string' && b.text) {
|
|
78
|
+
// A user message with raw text blocks (rare — first-turn preamble
|
|
79
|
+
// is sometimes split this way). Treat like a prompt.
|
|
80
|
+
out.push({ kind: 'prompt', prompt: b.text, source_uuid: srcUuid });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
if (line.type === 'assistant') {
|
|
88
|
+
const content = Array.isArray(msg.content) ? msg.content : [];
|
|
89
|
+
const text = joinText(content);
|
|
90
|
+
const out = [];
|
|
91
|
+
if (text || content.length) {
|
|
92
|
+
out.push({ kind: 'assistant', text, blocks: content, source_uuid: srcUuid });
|
|
93
|
+
}
|
|
94
|
+
for (const block of content) {
|
|
95
|
+
if (block?.type === 'tool_use' && typeof block.id === 'string') {
|
|
96
|
+
out.push({
|
|
97
|
+
kind: 'tool_use',
|
|
98
|
+
tool_use_id: block.id,
|
|
99
|
+
tool_name: typeof block.name === 'string' ? block.name : 'tool',
|
|
100
|
+
tool_input: block.input ?? null,
|
|
101
|
+
source_uuid: srcUuid,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
// Other envelope types (system notes, hook-emitted, …) — not captured.
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
/** Parse the full JSONL transcript and emit every ingest entry that
|
|
111
|
+
* comes *after* the line whose `uuid === afterUuid`. Returns the
|
|
112
|
+
* entries in order plus the last processed uuid (to save as the new
|
|
113
|
+
* watermark).
|
|
114
|
+
*
|
|
115
|
+
* If `afterUuid` isn't found in the transcript — e.g. because Claude
|
|
116
|
+
* Code's `/clear` or compaction rewrote the file — the caller falls
|
|
117
|
+
* back to processing from the top; the server's `source_uuid` unique
|
|
118
|
+
* index dedupes any lines we already forwarded. */
|
|
119
|
+
export function parseTranscript(content, afterUuid) {
|
|
120
|
+
let seenWatermark = afterUuid === null;
|
|
121
|
+
let lastUuid = afterUuid;
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const raw of content.split('\n')) {
|
|
124
|
+
const line = raw.trim();
|
|
125
|
+
if (!line)
|
|
126
|
+
continue;
|
|
127
|
+
let parsed;
|
|
128
|
+
try {
|
|
129
|
+
parsed = JSON.parse(line);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (!seenWatermark) {
|
|
135
|
+
if (parsed?.uuid === afterUuid)
|
|
136
|
+
seenWatermark = true;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const entries = transcriptLineToEntries(parsed);
|
|
140
|
+
if (entries.length) {
|
|
141
|
+
for (const e of entries)
|
|
142
|
+
out.push(e);
|
|
143
|
+
lastUuid = parsed.uuid;
|
|
144
|
+
}
|
|
145
|
+
else if (typeof parsed?.uuid === 'string' && parsed.uuid) {
|
|
146
|
+
// Even skipped lines advance the watermark so we don't re-scan them
|
|
147
|
+
// on the next hook fire. The source_uuid index on the server guards
|
|
148
|
+
// the ingested entries; this keeps hot-path scans O(new-lines).
|
|
149
|
+
lastUuid = parsed.uuid;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
entries: out,
|
|
154
|
+
lastUuid,
|
|
155
|
+
foundWatermark: seenWatermark,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/capture/sources/claude-code.ts"],"names":[],"mappings":"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"}
|