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.
- package/README.md +1 -1
- package/dist/__tests__/relay-daemon.test.js +6 -2
- package/dist/__tests__/relay-daemon.test.js.map +1 -1
- package/dist/__tests__/relay-ingest-contract.test.d.ts +1 -0
- package/dist/__tests__/relay-ingest-contract.test.js +76 -0
- package/dist/__tests__/relay-ingest-contract.test.js.map +1 -0
- package/dist/__tests__/relay-installers.test.js +34 -8
- package/dist/__tests__/relay-installers.test.js.map +1 -1
- package/dist/__tests__/stream-json.test.d.ts +1 -0
- package/dist/__tests__/stream-json.test.js +186 -0
- package/dist/__tests__/stream-json.test.js.map +1 -0
- package/dist/commands/claude.js +81 -43
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/page-inspect.d.ts +2 -0
- package/dist/commands/page-inspect.js +84 -0
- package/dist/commands/page-inspect.js.map +1 -0
- package/dist/commands/relay-install.js +29 -14
- package/dist/commands/relay-install.js.map +1 -1
- package/dist/commands/relay.js +18 -18
- package/dist/commands/relay.js.map +1 -1
- package/dist/commands/sandbox.js +57 -6
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/skills.js +8 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/uninstall.js +11 -7
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +28 -9
- package/dist/prompts.js +82 -220
- package/dist/prompts.js.map +1 -1
- package/dist/relay/daemon.d.ts +30 -6
- package/dist/relay/daemon.js +449 -51
- package/dist/relay/daemon.js.map +1 -1
- package/dist/relay/installers.d.ts +9 -3
- package/dist/relay/installers.js +56 -16
- package/dist/relay/installers.js.map +1 -1
- package/dist/relay/onboarding.js +11 -2
- package/dist/relay/onboarding.js.map +1 -1
- package/dist/relay/stream-json.d.ts +105 -0
- package/dist/relay/stream-json.js +158 -0
- package/dist/relay/stream-json.js.map +1 -0
- package/dist/relay/transcripts.d.ts +60 -0
- package/dist/relay/transcripts.js +119 -0
- package/dist/relay/transcripts.js.map +1 -0
- package/dist/setup.d.ts +0 -28
- package/dist/setup.js +11 -42
- package/dist/setup.js.map +1 -1
- 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
|
|
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
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;;;;;;;;;;;;iCAaiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU;IAC9D,YAAY,EAAE,WAAW;CAC1B,CAAC;AAEF;;gFAEgF;AAChF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAID,8DAA8D;AAC9D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE;QACX,KAAK,EAAE;YACL,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,yBAAyB;YACzB,2BAA2B;YAC3B,uBAAuB;YACvB,yBAAyB;YACzB,wBAAwB;YACxB,0BAA0B;YAC1B,uBAAuB;YACvB,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;;;;;;;;;;;;iCAaiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU;IAC9D,YAAY,EAAE,WAAW;CAC1B,CAAC;AAEF;;gFAEgF;AAChF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAID,8DAA8D;AAC9D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE;QACX,KAAK,EAAE;YACL,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,yBAAyB;YACzB,2BAA2B;YAC3B,uBAAuB;YACvB,yBAAyB;YACzB,wBAAwB;YACxB,0BAA0B;YAC1B,uBAAuB;YACvB,6BAA6B;YAC7B,qBAAqB;YACrB,wBAAwB;YACxB,qBAAqB;YACrB,uBAAuB;YACvB,wBAAwB;YACxB,wBAAwB;YACxB,yBAAyB;YACzB,0BAA0B;YAC1B,8BAA8B;YAC9B,wBAAwB;YACxB,mBAAmB;YACnB,qBAAqB;YACrB,sBAAsB;YACtB,yBAAyB;YACzB,yBAAyB;YACzB,yBAAyB;YACzB,sBAAsB;YACtB,wBAAwB;YACxB,sBAAsB;SACvB;KACF;CACF,CAAC;AAEF,8DAA8D;AAC9D,EAAE;AACF,0EAA0E;AAC1E,qEAAqE;AACrE,sEAAsE;AACtE,sEAAsE;AACtE,oEAAoE;AACpE,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE;QACL,UAAU,EAAE;YACV;gBACE,2DAA2D;gBAC3D,gEAAgE;gBAChE,+DAA+D;gBAC/D,gEAAgE;gBAChE,iEAAiE;gBACjE,4DAA4D;gBAC5D,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,iEAAiE;wBACjE,mEAAmE;wBACnE,iCAAiC;wBACjC,OAAO,EAAE,mNAAmN,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,wBAAwB;qBACtT,CAAC;aACH;SACF;QACD,WAAW,EAAE;YACX;gBACE,8DAA8D;gBAC9D,kDAAkD;gBAClD,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,4TAA4T;qBACtU,CAAC;aACH;SACF;QACD,gBAAgB,EAAE;YAChB;gBACE,gEAAgE;gBAChE,gCAAgC;gBAChC,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,mTAAmT;qBAC7T,CAAC;aACH;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACpD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAE3C,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IAEtC,iEAAiE;IACjE,MAAM,KAAK,GAAI,QAAgC,CAAC,WAAW,IAAI,EAAE,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACA,QAAgC,CAAC,WAAW,GAAG,KAAK,CAAC;IAEtD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE,OAAO;QACpD,aAAa,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE7C,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC7D,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gipity",
|
|
3
|
-
"version": "1.0.
|
|
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__/
|
|
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": {
|