gipity 1.0.245 → 1.0.264

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 (49) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/relay-daemon.test.js +6 -2
  3. package/dist/__tests__/relay-daemon.test.js.map +1 -1
  4. package/dist/__tests__/relay-ingest-contract.test.d.ts +1 -0
  5. package/dist/__tests__/relay-ingest-contract.test.js +76 -0
  6. package/dist/__tests__/relay-ingest-contract.test.js.map +1 -0
  7. package/dist/__tests__/relay-installers.test.js +34 -8
  8. package/dist/__tests__/relay-installers.test.js.map +1 -1
  9. package/dist/__tests__/stream-json.test.d.ts +1 -0
  10. package/dist/__tests__/stream-json.test.js +186 -0
  11. package/dist/__tests__/stream-json.test.js.map +1 -0
  12. package/dist/commands/claude.js +81 -43
  13. package/dist/commands/claude.js.map +1 -1
  14. package/dist/commands/page-inspect.d.ts +2 -0
  15. package/dist/commands/page-inspect.js +84 -0
  16. package/dist/commands/page-inspect.js.map +1 -0
  17. package/dist/commands/relay-install.js +29 -14
  18. package/dist/commands/relay-install.js.map +1 -1
  19. package/dist/commands/relay.js +18 -18
  20. package/dist/commands/relay.js.map +1 -1
  21. package/dist/commands/sandbox.js +57 -6
  22. package/dist/commands/sandbox.js.map +1 -1
  23. package/dist/commands/skills.js +8 -0
  24. package/dist/commands/skills.js.map +1 -1
  25. package/dist/commands/uninstall.js +11 -7
  26. package/dist/commands/uninstall.js.map +1 -1
  27. package/dist/index.js +2 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/prompts.d.ts +28 -9
  30. package/dist/prompts.js +82 -220
  31. package/dist/prompts.js.map +1 -1
  32. package/dist/relay/daemon.d.ts +30 -6
  33. package/dist/relay/daemon.js +449 -51
  34. package/dist/relay/daemon.js.map +1 -1
  35. package/dist/relay/installers.d.ts +9 -3
  36. package/dist/relay/installers.js +56 -16
  37. package/dist/relay/installers.js.map +1 -1
  38. package/dist/relay/onboarding.js +11 -2
  39. package/dist/relay/onboarding.js.map +1 -1
  40. package/dist/relay/stream-json.d.ts +105 -0
  41. package/dist/relay/stream-json.js +158 -0
  42. package/dist/relay/stream-json.js.map +1 -0
  43. package/dist/relay/transcripts.d.ts +60 -0
  44. package/dist/relay/transcripts.js +119 -0
  45. package/dist/relay/transcripts.js.map +1 -0
  46. package/dist/setup.d.ts +0 -28
  47. package/dist/setup.js +11 -42
  48. package/dist/setup.js.map +1 -1
  49. package/package.json +2 -2
@@ -0,0 +1,60 @@
1
+ export type IngestEntry = {
2
+ kind: 'attach';
3
+ session_id: string;
4
+ cwd?: string;
5
+ source?: 'startup' | 'resume' | 'clear' | 'compact';
6
+ } | {
7
+ kind: 'prompt';
8
+ prompt: string;
9
+ ts?: string;
10
+ } | {
11
+ kind: 'tool';
12
+ tool_name: string;
13
+ tool_input?: unknown;
14
+ tool_response?: unknown;
15
+ tool_use_id?: string;
16
+ ts?: string;
17
+ } | {
18
+ kind: 'assistant';
19
+ text: string;
20
+ blocks: any[];
21
+ ts?: string;
22
+ } | {
23
+ kind: 'compact';
24
+ trigger?: string;
25
+ ts?: string;
26
+ } | {
27
+ kind: 'end';
28
+ ts?: string;
29
+ } | {
30
+ kind: 'system';
31
+ content: string;
32
+ ts?: string;
33
+ };
34
+ export declare function offsetPath(sessionId: string): string;
35
+ export declare function readOffset(sessionId: string): number;
36
+ export declare function writeOffset(sessionId: string, offset: number): void;
37
+ export interface LatestSession {
38
+ session_id: string;
39
+ transcript_path: string;
40
+ cwd: string;
41
+ ts: string;
42
+ }
43
+ export declare function latestSessionPath(convGuid: string): string;
44
+ export declare function writeLatestSession(cwd: string, convGuid: string, rec: LatestSession): void;
45
+ export declare function readLatestSession(cwd: string, convGuid: string): LatestSession | null;
46
+ /** Parse JSONL delta from `transcriptPath` starting at the stored offset
47
+ * for `sessionId`. The caller advances the offset (via `writeOffset`)
48
+ * ONLY after the ingest POST succeeds — a failed POST leaves the offset
49
+ * behind so the next reader picks up the same delta. */
50
+ export declare function readTranscriptDelta(transcriptPath: string, sessionId: string): {
51
+ entries: any[];
52
+ newOffset: number;
53
+ };
54
+ /** Convert Claude's raw JSONL entries into our ingest format. We only
55
+ * emit `assistant` entries here — user prompts and tool calls come in via
56
+ * dedicated hooks (UserPromptSubmit, PostToolUse), so pulling them from
57
+ * the transcript would duplicate. If those hooks fail we accept partial
58
+ * recovery (the assistant turn is the main thing the user sees). */
59
+ export declare function mapEntriesToIngest(entries: any[]): IngestEntry[];
60
+ export declare function transcriptPathFor(cwd: string, sessionId: string): string;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Shared helpers for reading Claude Code's JSONL transcript and mapping its
3
+ * entries into our `/ingest` wire format. Used by:
4
+ *
5
+ * - `hook-capture.ts` (Stop hook) — streams deltas live while Claude runs
6
+ * - `daemon.ts` (post-spawn sweep) — catches anything the hook dropped
7
+ *
8
+ * Both paths share one offset file at `.gipity/transcripts/<session_id>.offset`
9
+ * so whichever path posts first owns the delta; the other sees an empty read
10
+ * and no-ops. Ordering is guaranteed: hooks run inside the `gipity claude`
11
+ * child process, the sweep runs after that child has exited.
12
+ */
13
+ import { readFileSync, writeFileSync, existsSync, statSync, mkdirSync } from 'fs';
14
+ import { resolve, join, dirname } from 'path';
15
+ import { homedir } from 'os';
16
+ // ─── offset file (shared lock-step between hook and sweep) ─────────────
17
+ export function offsetPath(sessionId) {
18
+ return resolve(process.cwd(), '.gipity', 'transcripts', `${sessionId}.offset`);
19
+ }
20
+ export function readOffset(sessionId) {
21
+ try {
22
+ return parseInt(readFileSync(offsetPath(sessionId), 'utf-8'), 10) || 0;
23
+ }
24
+ catch {
25
+ return 0;
26
+ }
27
+ }
28
+ export function writeOffset(sessionId, offset) {
29
+ const p = offsetPath(sessionId);
30
+ mkdirSync(dirname(p), { recursive: true });
31
+ writeFileSync(p, String(offset));
32
+ }
33
+ export function latestSessionPath(convGuid) {
34
+ return resolve(process.cwd(), '.gipity', 'transcripts', `latest-${convGuid}.json`);
35
+ }
36
+ export function writeLatestSession(cwd, convGuid, rec) {
37
+ const p = join(cwd, '.gipity', 'transcripts', `latest-${convGuid}.json`);
38
+ mkdirSync(dirname(p), { recursive: true });
39
+ writeFileSync(p, JSON.stringify(rec, null, 2));
40
+ }
41
+ export function readLatestSession(cwd, convGuid) {
42
+ try {
43
+ const p = join(cwd, '.gipity', 'transcripts', `latest-${convGuid}.json`);
44
+ if (!existsSync(p))
45
+ return null;
46
+ const parsed = JSON.parse(readFileSync(p, 'utf-8'));
47
+ if (typeof parsed?.session_id !== 'string')
48
+ return null;
49
+ return parsed;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ // ─── delta reader ──────────────────────────────────────────────────────
56
+ /** Parse JSONL delta from `transcriptPath` starting at the stored offset
57
+ * for `sessionId`. The caller advances the offset (via `writeOffset`)
58
+ * ONLY after the ingest POST succeeds — a failed POST leaves the offset
59
+ * behind so the next reader picks up the same delta. */
60
+ export function readTranscriptDelta(transcriptPath, sessionId) {
61
+ if (!existsSync(transcriptPath))
62
+ return { entries: [], newOffset: 0 };
63
+ const size = statSync(transcriptPath).size;
64
+ let offset = readOffset(sessionId);
65
+ if (offset > size)
66
+ offset = 0; // file regressed (rotated/truncated) — rescan
67
+ if (offset === size)
68
+ return { entries: [], newOffset: offset };
69
+ const fd = readFileSync(transcriptPath);
70
+ const slice = fd.slice(offset).toString('utf-8');
71
+ const lines = slice.split('\n').filter((l) => l.trim());
72
+ const entries = [];
73
+ for (const line of lines) {
74
+ try {
75
+ entries.push(JSON.parse(line));
76
+ }
77
+ catch { /* skip partial */ }
78
+ }
79
+ return { entries, newOffset: size };
80
+ }
81
+ // ─── JSONL → ingest mapping ────────────────────────────────────────────
82
+ /** Pull plain text out of an assistant entry's `message.content` array. */
83
+ function joinAssistantText(entry) {
84
+ const content = entry?.message?.content;
85
+ if (!Array.isArray(content))
86
+ return { text: '', blocks: null };
87
+ const parts = [];
88
+ for (const block of content) {
89
+ if (block?.type === 'text' && typeof block.text === 'string')
90
+ parts.push(block.text);
91
+ }
92
+ return { text: parts.join('\n'), blocks: content };
93
+ }
94
+ /** Convert Claude's raw JSONL entries into our ingest format. We only
95
+ * emit `assistant` entries here — user prompts and tool calls come in via
96
+ * dedicated hooks (UserPromptSubmit, PostToolUse), so pulling them from
97
+ * the transcript would duplicate. If those hooks fail we accept partial
98
+ * recovery (the assistant turn is the main thing the user sees). */
99
+ export function mapEntriesToIngest(entries) {
100
+ const out = [];
101
+ for (const entry of entries) {
102
+ if (entry?.type !== 'assistant')
103
+ continue;
104
+ const { text, blocks } = joinAssistantText(entry);
105
+ if (!text && (!blocks || blocks.length === 0))
106
+ continue;
107
+ out.push({ kind: 'assistant', text, blocks: blocks ?? [] });
108
+ }
109
+ return out;
110
+ }
111
+ // ─── transcript path resolver (mirror of daemon.ts's helper) ───────────
112
+ // Claude Code encodes the project cwd into a slug by replacing `/` with
113
+ // `-`. Kept in sync with daemon's `transcriptPathFor` — both callers
114
+ // import from here once daemon.ts is refactored.
115
+ export function transcriptPathFor(cwd, sessionId) {
116
+ const slug = cwd.replace(/\//g, '-');
117
+ return join(homedir(), '.claude', 'projects', slug, `${sessionId}.jsonl`);
118
+ }
119
+ //# sourceMappingURL=transcripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcripts.js","sourceRoot":"","sources":["../../src/relay/transcripts.ts"],"names":[],"mappings":"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"}
package/dist/setup.d.ts CHANGED
@@ -26,27 +26,6 @@ export declare const PERMISSIONS_SETTINGS: {
26
26
  };
27
27
  export declare const HOOKS_SETTINGS: {
28
28
  hooks: {
29
- SessionStart: {
30
- matcher: string;
31
- hooks: {
32
- type: string;
33
- command: string;
34
- }[];
35
- }[];
36
- SessionEnd: {
37
- matcher: string;
38
- hooks: {
39
- type: string;
40
- command: string;
41
- }[];
42
- }[];
43
- PreCompact: {
44
- matcher: string;
45
- hooks: {
46
- type: string;
47
- command: string;
48
- }[];
49
- }[];
50
29
  PreToolUse: {
51
30
  matcher: string;
52
31
  hooks: {
@@ -68,13 +47,6 @@ export declare const HOOKS_SETTINGS: {
68
47
  command: string;
69
48
  }[];
70
49
  }[];
71
- Stop: {
72
- matcher: string;
73
- hooks: {
74
- type: string;
75
- command: string;
76
- }[];
77
- }[];
78
50
  };
79
51
  };
80
52
  export declare function setupClaudeHooks(): void;
package/dist/setup.js CHANGED
@@ -51,7 +51,7 @@ export const PERMISSIONS_SETTINGS = {
51
51
  'Bash(gipity db list *)',
52
52
  'Bash(gipity db create *)',
53
53
  'Bash(gipity memory *)',
54
- 'Bash(gipity browser *)',
54
+ 'Bash(gipity page-inspect *)',
55
55
  'Bash(gipity logs *)',
56
56
  'Bash(gipity sandbox *)',
57
57
  'Bash(gipity chat *)',
@@ -76,33 +76,14 @@ export const PERMISSIONS_SETTINGS = {
76
76
  };
77
77
  // Cross-platform hooks using node -e (no bash/jq dependency).
78
78
  //
79
- // Capture hooks (start/prompt/tool/stop/end/compact) forward Claude Code hook
80
- // payloads to Gipity so the conversation is viewable in the web CLI. They pipe
81
- // stdin directly to `gipity hook-capture <event>`, which guards on
82
- // .gipity.json + auth and silently no-ops otherwise. See
83
- // docs/feature-backlog/claude-code-web-cli-bridge.md.
84
- // Buffer stdin fully before spawning the detached child and writing the
85
- // payload to its stdin. Piping stdin directly + timing out on the parent
86
- // truncates large payloads (big tool_response, long transcripts) when the
87
- // parent exits before the pipe drains. Same shape as the Write|Edit push
88
- // shim below.
89
- function captureHook(event) {
90
- return `node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{if(!require('fs').existsSync('.gipity.json'))return;const p=require('child_process').spawn('gipity',['hook-capture','${event}'],{stdio:['pipe','ignore','ignore'],detached:true,shell:true});p.stdin.end(d);p.unref()})"`;
91
- }
79
+ // All conversation capture (assistant messages, tool calls, tool results)
80
+ // now flows through the relay daemon parsing `claude --output-format
81
+ // stream-json` directly no hooks needed for that. The only hooks we
82
+ // install are project-level helpers: a scaffold reminder when editing
83
+ // code that has no scaffold yet, and a sync-on-write for Write/Edit
84
+ // tools so pushed files land in the cloud workspace too.
92
85
  export const HOOKS_SETTINGS = {
93
86
  hooks: {
94
- SessionStart: [{
95
- matcher: '',
96
- hooks: [{ type: 'command', command: captureHook('start') }],
97
- }],
98
- SessionEnd: [{
99
- matcher: '',
100
- hooks: [{ type: 'command', command: captureHook('end') }],
101
- }],
102
- PreCompact: [{
103
- matcher: '',
104
- hooks: [{ type: 'command', command: captureHook('compact') }],
105
- }],
106
87
  PreToolUse: [
107
88
  {
108
89
  // Soft scaffold reminder. If this is a Gipity project (has
@@ -123,38 +104,26 @@ export const HOOKS_SETTINGS = {
123
104
  ],
124
105
  PostToolUse: [
125
106
  {
126
- // File sync for Write/Edit (existing behavior)
107
+ // File sync for Write/Edit push any edited file back to the
108
+ // cloud workspace so web previews see the change.
127
109
  matcher: 'Write|Edit',
128
110
  hooks: [{
129
111
  type: 'command',
130
112
  command: `node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const p=JSON.parse(d).tool_input?.file_path;if(!p||!require('fs').existsSync('.gipity.json'))process.exit(0);require('child_process').spawn('gipity',['push',p,'--quiet'],{stdio:'ignore',detached:true,shell:true}).unref()}catch{}})"`,
131
113
  }],
132
114
  },
133
- {
134
- // Conversation capture for every tool call
135
- matcher: '.*',
136
- hooks: [{ type: 'command', command: captureHook('tool') }],
137
- },
138
115
  ],
139
116
  UserPromptSubmit: [
140
117
  {
141
- // Sync down + optional system-message (existing behavior)
118
+ // Pull down any cloud-side file changes before the next turn so
119
+ // the agent sees current state.
142
120
  matcher: '',
143
121
  hooks: [{
144
122
  type: 'command',
145
123
  command: `node -e "if(!require('fs').existsSync('.gipity.json'))process.exit(0);require('child_process').exec('gipity sync down --json',(e,o)=>{if(e)process.exit(0);try{const r=JSON.parse(o);if(r.pulled>0)console.log(JSON.stringify({systemMessage:'Gipity sync: '+(r.summary||'Files changed remotely.')}))}catch{}})"`,
146
124
  }],
147
125
  },
148
- {
149
- // Capture the user's prompt
150
- matcher: '',
151
- hooks: [{ type: 'command', command: captureHook('prompt') }],
152
- },
153
126
  ],
154
- Stop: [{
155
- matcher: '',
156
- hooks: [{ type: 'command', command: captureHook('stop') }],
157
- }],
158
127
  },
159
128
  };
160
129
  export function setupClaudeHooks() {
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gipity",
3
- "version": "1.0.245",
3
+ "version": "1.0.264",
4
4
  "description": "Cloud agents for builders — 90+ tools, persistent memory, app hosting, databases, deploys. Pair with Claude Code or use standalone.",
5
5
  "bin": {
6
6
  "gipity": "./dist/updater/shim.js",
@@ -12,7 +12,7 @@
12
12
  "build": "tsc && chmod +x dist/index.js dist/gipcc.js dist/gipccd.js dist/updater/shim.js dist/updater/check.js",
13
13
  "dev": "tsc --watch",
14
14
  "test": "npm run test:smoke",
15
- "test:smoke": "tsc && node --test dist/__tests__/utils.test.js dist/__tests__/config.test.js dist/__tests__/sync.test.js dist/__tests__/upload.test.js dist/__tests__/updater.test.js dist/__tests__/cli-smoke.test.js dist/__tests__/claude-noninteractive.test.js dist/__tests__/hook-capture.test.js dist/__tests__/relay-state.test.js dist/__tests__/relay-daemon.test.js dist/__tests__/relay-installers.test.js",
15
+ "test:smoke": "tsc && node --test dist/__tests__/utils.test.js dist/__tests__/config.test.js dist/__tests__/sync.test.js dist/__tests__/upload.test.js dist/__tests__/updater.test.js dist/__tests__/cli-smoke.test.js dist/__tests__/claude-noninteractive.test.js dist/__tests__/relay-state.test.js dist/__tests__/relay-daemon.test.js dist/__tests__/relay-installers.test.js dist/__tests__/stream-json.test.js dist/__tests__/relay-ingest-contract.test.js",
16
16
  "test:e2e": "tsc && GIPITY_E2E=1 node --test --test-timeout=180000 dist/__tests__/cli-e2e-live.test.js"
17
17
  },
18
18
  "dependencies": {