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.
Files changed (95) hide show
  1. package/dist/__tests__/capture-transcript.test.d.ts +1 -0
  2. package/dist/__tests__/capture-transcript.test.js +92 -0
  3. package/dist/__tests__/capture-transcript.test.js.map +1 -0
  4. package/dist/__tests__/cli-smoke.test.js +5 -5
  5. package/dist/__tests__/cli-smoke.test.js.map +1 -1
  6. package/dist/__tests__/prompts.test.d.ts +1 -0
  7. package/dist/__tests__/prompts.test.js +129 -0
  8. package/dist/__tests__/prompts.test.js.map +1 -0
  9. package/dist/__tests__/push-cas.test.d.ts +1 -0
  10. package/dist/__tests__/push-cas.test.js +133 -0
  11. package/dist/__tests__/push-cas.test.js.map +1 -0
  12. package/dist/__tests__/sync-apply.test.d.ts +1 -0
  13. package/dist/__tests__/sync-apply.test.js +457 -0
  14. package/dist/__tests__/sync-apply.test.js.map +1 -0
  15. package/dist/__tests__/sync-lock.test.d.ts +1 -0
  16. package/dist/__tests__/sync-lock.test.js +105 -0
  17. package/dist/__tests__/sync-lock.test.js.map +1 -0
  18. package/dist/__tests__/sync.test.js +115 -151
  19. package/dist/__tests__/sync.test.js.map +1 -1
  20. package/dist/adopt-cwd.d.ts +66 -0
  21. package/dist/adopt-cwd.js +255 -0
  22. package/dist/adopt-cwd.js.map +1 -0
  23. package/dist/api.d.ts +11 -1
  24. package/dist/api.js +46 -3
  25. package/dist/api.js.map +1 -1
  26. package/dist/capture/sources/claude-code.d.ts +78 -0
  27. package/dist/capture/sources/claude-code.js +158 -0
  28. package/dist/capture/sources/claude-code.js.map +1 -0
  29. package/dist/commands/chat.js +8 -8
  30. package/dist/commands/chat.js.map +1 -1
  31. package/dist/commands/claude.js +265 -129
  32. package/dist/commands/claude.js.map +1 -1
  33. package/dist/commands/init.js +34 -59
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/location.js +1 -1
  36. package/dist/commands/location.js.map +1 -1
  37. package/dist/commands/logout.js +1 -1
  38. package/dist/commands/logout.js.map +1 -1
  39. package/dist/commands/page-inspect.js +36 -25
  40. package/dist/commands/page-inspect.js.map +1 -1
  41. package/dist/commands/page-screenshot.d.ts +2 -0
  42. package/dist/commands/page-screenshot.js +212 -0
  43. package/dist/commands/page-screenshot.js.map +1 -0
  44. package/dist/commands/project.js +71 -12
  45. package/dist/commands/project.js.map +1 -1
  46. package/dist/commands/relay.js +1 -1
  47. package/dist/commands/relay.js.map +1 -1
  48. package/dist/commands/scaffold.js +19 -13
  49. package/dist/commands/scaffold.js.map +1 -1
  50. package/dist/commands/sync.js +15 -24
  51. package/dist/commands/sync.js.map +1 -1
  52. package/dist/commands/uninstall.js +1 -1
  53. package/dist/commands/uninstall.js.map +1 -1
  54. package/dist/commands/update.js +1 -1
  55. package/dist/commands/update.js.map +1 -1
  56. package/dist/config.d.ts +9 -0
  57. package/dist/config.js +9 -0
  58. package/dist/config.js.map +1 -1
  59. package/dist/helpers/sync.d.ts +4 -2
  60. package/dist/helpers/sync.js +13 -7
  61. package/dist/helpers/sync.js.map +1 -1
  62. package/dist/hooks/capture-runner.d.ts +24 -0
  63. package/dist/hooks/capture-runner.js +233 -0
  64. package/dist/hooks/capture-runner.js.map +1 -0
  65. package/dist/index.js +17 -16
  66. package/dist/index.js.map +1 -1
  67. package/dist/project-setup.d.ts +21 -0
  68. package/dist/project-setup.js +42 -0
  69. package/dist/project-setup.js.map +1 -0
  70. package/dist/prompts.d.ts +7 -0
  71. package/dist/prompts.js +25 -2
  72. package/dist/prompts.js.map +1 -1
  73. package/dist/relay/daemon.d.ts +8 -8
  74. package/dist/relay/daemon.js +23 -61
  75. package/dist/relay/daemon.js.map +1 -1
  76. package/dist/relay/device-http.d.ts +9 -0
  77. package/dist/relay/device-http.js +58 -0
  78. package/dist/relay/device-http.js.map +1 -0
  79. package/dist/relay/onboarding.js +3 -2
  80. package/dist/relay/onboarding.js.map +1 -1
  81. package/dist/setup.d.ts +8 -0
  82. package/dist/setup.js +55 -16
  83. package/dist/setup.js.map +1 -1
  84. package/dist/sync.d.ts +55 -37
  85. package/dist/sync.js +628 -445
  86. package/dist/sync.js.map +1 -1
  87. package/dist/updater/bootstrap.d.ts +6 -1
  88. package/dist/updater/bootstrap.js +21 -13
  89. package/dist/updater/bootstrap.js.map +1 -1
  90. package/dist/updater/shim.js +12 -1
  91. package/dist/updater/shim.js.map +1 -1
  92. package/dist/upload.d.ts +13 -2
  93. package/dist/upload.js +59 -6
  94. package/dist/upload.js.map +1 -1
  95. 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":"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"}
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
- constructor(statusCode: number, code: string, message: string);
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
- constructor(statusCode, code, message) {
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;IACd;IAA2B;IAA9C,YAAmB,UAAkB,EAAS,IAAY,EAAE,OAAe;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,eAAU,GAAV,UAAU,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACnE,OAAO;QACL,eAAe,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;QAC7C,cAAc,EAAE,kBAAkB;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO;IACd,OAAO,kBAAkB,EAAE,IAAI,SAAS,EAAE,EAAE,OAAO,IAAI,qBAAqB,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;IACpE,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACrG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QACvE,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAY;IACjC,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,IAAI,CAAI,IAAY,EAAE,IAAc;IAClD,OAAO,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAY,EAAE,IAAc;IACjD,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAY,EAAE,IAAc;IACjD,OAAO,OAAO,CAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAC9C,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,kBAAkB,MAAM,CAAC,gBAAgB,WAAW;QACtD,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,IAAI,GAAG,WAAW;QACtB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE;QACtB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAEvF,MAAM,GAAG,GAAG,MAAM,IAAI,CAEnB,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEnB,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1D,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAEnE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAEnE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAA2C,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EAAE,IAAoC,EAAE,aAAqB,EAAE,WAAoB;IAE9F,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAA2B,EAAE,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IACpF,IAAI,WAAW;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;IAEvD,sEAAsE;IACtE,gDAAgD;IAChD,MAAM,QAAQ,GAAG,OAAQ,IAA8B,CAAC,IAAI,KAAK,UAAU,CAAC;IAC5E,MAAM,SAAS,GAAa,QAAQ;QAClC,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAC,IAAiC,CAA+B;QAClF,CAAC,CAAC,IAAI,UAAU,CAAC,IAAc,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,KAAK;QACb,OAAO;QACP,IAAI,EAAE,SAAS;QACf,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,MAAM,EAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,gBAAgB,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAoC,WAAW,CAAC,CAAC;IACtE,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACxC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,IAAa;IAC7D,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACrG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QACvE,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC"}
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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"}