gipity 1.0.48
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/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +31 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/sync.test.d.ts +1 -0
- package/dist/__tests__/sync.test.js +89 -0
- package/dist/__tests__/sync.test.js.map +1 -0
- package/dist/__tests__/utils.test.d.ts +1 -0
- package/dist/__tests__/utils.test.js +69 -0
- package/dist/__tests__/utils.test.js.map +1 -0
- package/dist/api.d.ts +13 -0
- package/dist/api.js +85 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +12 -0
- package/dist/auth.js +90 -0
- package/dist/auth.js.map +1 -0
- package/dist/coding-guidelines.d.ts +9 -0
- package/dist/coding-guidelines.js +52 -0
- package/dist/coding-guidelines.js.map +1 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +164 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/api.d.ts +2 -0
- package/dist/commands/api.js +137 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.js +70 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/browser.d.ts +2 -0
- package/dist/commands/browser.js +88 -0
- package/dist/commands/browser.js.map +1 -0
- package/dist/commands/chat.d.ts +2 -0
- package/dist/commands/chat.js +68 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +2 -0
- package/dist/commands/checkpoint.js +67 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/credits.d.ts +2 -0
- package/dist/commands/credits.js +57 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/db.d.ts +2 -0
- package/dist/commands/db.js +102 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.js +49 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/file.d.ts +2 -0
- package/dist/commands/file.js +85 -0
- package/dist/commands/file.js.map +1 -0
- package/dist/commands/fn.d.ts +2 -0
- package/dist/commands/fn.js +87 -0
- package/dist/commands/fn.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +107 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +62 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.js +14 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.js +39 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/memory.d.ts +2 -0
- package/dist/commands/memory.js +114 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.js +132 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +34 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/rbac.d.ts +2 -0
- package/dist/commands/rbac.js +89 -0
- package/dist/commands/rbac.js.map +1 -0
- package/dist/commands/records.d.ts +2 -0
- package/dist/commands/records.js +131 -0
- package/dist/commands/records.js.map +1 -0
- package/dist/commands/sandbox.d.ts +2 -0
- package/dist/commands/sandbox.js +53 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/scaffold.d.ts +2 -0
- package/dist/commands/scaffold.js +38 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/start-cc.d.ts +2 -0
- package/dist/commands/start-cc.js +201 -0
- package/dist/commands/start-cc.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +43 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.js +42 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/workflow.d.ts +2 -0
- package/dist/commands/workflow.js +163 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/setup.d.ts +23 -0
- package/dist/setup.js +168 -0
- package/dist/setup.js.map +1 -0
- package/dist/sync.d.ts +34 -0
- package/dist/sync.js +234 -0
- package/dist/sync.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +57 -0
- package/dist/utils.js.map +1 -0
- package/hooks/post-write.sh +17 -0
- package/hooks/pre-turn.sh +20 -0
- package/package.json +29 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { get, post } from '../api.js';
|
|
3
|
+
import { requireConfig } from '../config.js';
|
|
4
|
+
export const fnCommand = new Command('fn')
|
|
5
|
+
.description('Manage sandboxed functions');
|
|
6
|
+
fnCommand
|
|
7
|
+
.command('list')
|
|
8
|
+
.description('List functions')
|
|
9
|
+
.option('--json', 'Output as JSON')
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
try {
|
|
12
|
+
const config = requireConfig();
|
|
13
|
+
const res = await get(`/projects/${config.projectGuid}/functions`);
|
|
14
|
+
if (opts.json) {
|
|
15
|
+
console.log(JSON.stringify(res.data));
|
|
16
|
+
}
|
|
17
|
+
else if (res.data.length === 0) {
|
|
18
|
+
console.log('No functions defined.');
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
for (const f of res.data) {
|
|
22
|
+
console.log(`${f.name} v${f.version} ${f.auth_level} timeout=${f.timeout_ms}ms`);
|
|
23
|
+
if (f.description)
|
|
24
|
+
console.log(` ${f.description}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error(`List failed: ${err.message}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
fnCommand
|
|
34
|
+
.command('logs <name>')
|
|
35
|
+
.description('Show recent execution logs')
|
|
36
|
+
.option('--limit <n>', 'Max entries', '20')
|
|
37
|
+
.option('--json', 'Output as JSON')
|
|
38
|
+
.action(async (name, opts) => {
|
|
39
|
+
try {
|
|
40
|
+
const config = requireConfig();
|
|
41
|
+
const res = await get(`/projects/${config.projectGuid}/functions/${name}/logs?limit=${opts.limit}`);
|
|
42
|
+
if (opts.json) {
|
|
43
|
+
console.log(JSON.stringify(res.data));
|
|
44
|
+
}
|
|
45
|
+
else if (res.data.length === 0) {
|
|
46
|
+
console.log('No execution logs.');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
for (const log of res.data) {
|
|
50
|
+
const dur = log.duration_ms != null ? `${log.duration_ms}ms` : '?';
|
|
51
|
+
const ts = new Date(log.created_at).toLocaleString();
|
|
52
|
+
console.log(`${log.status} ${dur} ${log.trigger_type || 'http'} ${ts}`);
|
|
53
|
+
if (log.error_message)
|
|
54
|
+
console.log(` error: ${log.error_message}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.error(`Logs failed: ${err.message}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
fnCommand
|
|
64
|
+
.command('call <name>')
|
|
65
|
+
.description('Call a function directly')
|
|
66
|
+
.option('--data <json>', 'JSON request body', '{}')
|
|
67
|
+
.option('--json', 'Output as JSON')
|
|
68
|
+
.action(async (name, opts) => {
|
|
69
|
+
try {
|
|
70
|
+
const config = requireConfig();
|
|
71
|
+
const body = JSON.parse(opts.data);
|
|
72
|
+
// Call via the conversation/chat endpoint (agent-mediated)
|
|
73
|
+
// Direct function calls require an app token, so use the agent
|
|
74
|
+
const res = await post(`/conversations`, {
|
|
75
|
+
agentGuid: config.agentGuid,
|
|
76
|
+
projectGuid: config.projectGuid,
|
|
77
|
+
content: `Call function "${name}" with this payload: ${JSON.stringify(body)}`,
|
|
78
|
+
currentPath: '/',
|
|
79
|
+
});
|
|
80
|
+
console.log(opts.json ? JSON.stringify(res.data) : res.data.content);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error(`Call failed: ${err.message}`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=fn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fn.js","sourceRoot":"","sources":["../../src/commands/fn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { basename } from 'path';
|
|
3
|
+
import { get, post } from '../api.js';
|
|
4
|
+
import { saveConfig, getConfig } from '../config.js';
|
|
5
|
+
import { syncDown } from '../sync.js';
|
|
6
|
+
import { getAuth } from '../auth.js';
|
|
7
|
+
import { slugify, setupClaudeHooks, setupClaudeMd, setupGitignore } from '../setup.js';
|
|
8
|
+
export const initCommand = new Command('init')
|
|
9
|
+
.description('Initialize a Gipity project (new or existing)')
|
|
10
|
+
.argument('[name]', 'Project name/slug (defaults to current directory name)')
|
|
11
|
+
.option('--agent <guid>', 'Agent GUID to use')
|
|
12
|
+
.option('--api-base <url>', 'API base URL', 'https://a.gipity.ai')
|
|
13
|
+
.action(async (name, opts) => {
|
|
14
|
+
try {
|
|
15
|
+
// Check auth
|
|
16
|
+
const auth = getAuth();
|
|
17
|
+
if (!auth) {
|
|
18
|
+
console.error('Not logged in. Run: gipity login');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
// Check if already initialized
|
|
22
|
+
const existing = getConfig();
|
|
23
|
+
if (existing) {
|
|
24
|
+
console.log(`Already linked to "${existing.projectSlug}" (${existing.projectGuid})`);
|
|
25
|
+
// Re-run setup in case hooks/skills are missing
|
|
26
|
+
setupClaudeHooks();
|
|
27
|
+
setupClaudeMd();
|
|
28
|
+
setupGitignore();
|
|
29
|
+
console.log('Configuring Claude Code... done.');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Resolve project name
|
|
33
|
+
const projectName = name || basename(process.cwd());
|
|
34
|
+
const projectSlug = slugify(projectName);
|
|
35
|
+
if (!projectSlug) {
|
|
36
|
+
console.error('Could not derive a valid project slug. Provide a name: gipity init my-app');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// Search for existing project by slug
|
|
40
|
+
let project = null;
|
|
41
|
+
let accountSlug = '';
|
|
42
|
+
try {
|
|
43
|
+
const res = await get('/projects?limit=100');
|
|
44
|
+
project = res.data.find(p => p.slug === projectSlug) || null;
|
|
45
|
+
if (project) {
|
|
46
|
+
accountSlug = project.user?.account_slug || '';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// List failed — we'll create a new project
|
|
51
|
+
}
|
|
52
|
+
if (project) {
|
|
53
|
+
console.log(`Found existing project "${project.name}" (${project.slug})`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Create new project
|
|
57
|
+
const res = await post('/projects', {
|
|
58
|
+
name: projectName,
|
|
59
|
+
slug: projectSlug,
|
|
60
|
+
});
|
|
61
|
+
project = res.data;
|
|
62
|
+
accountSlug = project.user?.account_slug || '';
|
|
63
|
+
console.log(`Created project "${project.name}" (${project.slug})`);
|
|
64
|
+
}
|
|
65
|
+
// Find agent for the project
|
|
66
|
+
let agentGuid = opts.agent || '';
|
|
67
|
+
if (!agentGuid) {
|
|
68
|
+
try {
|
|
69
|
+
const agents = await get(`/projects/${project.short_guid}/agents`);
|
|
70
|
+
if (agents.data.length > 0) {
|
|
71
|
+
agentGuid = agents.data[0].short_guid;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// No agents — that's fine
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// 1. Write .gipity.json
|
|
79
|
+
saveConfig({
|
|
80
|
+
projectGuid: project.short_guid,
|
|
81
|
+
projectSlug: project.slug,
|
|
82
|
+
accountSlug,
|
|
83
|
+
agentGuid,
|
|
84
|
+
conversationGuid: null,
|
|
85
|
+
apiBase: opts.apiBase,
|
|
86
|
+
ignore: ['node_modules', '.git', '.gipity.json', '.gipity/', '.claude/', '.gitignore', 'CLAUDE.md', '*.log'],
|
|
87
|
+
});
|
|
88
|
+
// 2. Pull existing files
|
|
89
|
+
const result = await syncDown();
|
|
90
|
+
if (result.pulled > 0) {
|
|
91
|
+
console.log(`Pulled ${result.pulled} file${result.pulled > 1 ? 's' : ''}.`);
|
|
92
|
+
}
|
|
93
|
+
// 3. Write .claude/settings.json (CC hooks)
|
|
94
|
+
setupClaudeHooks();
|
|
95
|
+
// 4. Write CLAUDE.md (skills)
|
|
96
|
+
setupClaudeMd();
|
|
97
|
+
// 5. Update .gitignore
|
|
98
|
+
setupGitignore();
|
|
99
|
+
console.log('Configuring Claude Code... done.');
|
|
100
|
+
console.log('Ready! Run `claude` to start.');
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error(`Init failed: ${err.message}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { saveAuth, getAuth } from '../auth.js';
|
|
3
|
+
import { publicPost } from '../api.js';
|
|
4
|
+
import { prompt, decodeJwtExp } from '../utils.js';
|
|
5
|
+
export const loginCommand = new Command('login')
|
|
6
|
+
.description('Authenticate with Gipity')
|
|
7
|
+
.option('--email <email>', 'Email address')
|
|
8
|
+
.option('--code <code>', 'Verification code')
|
|
9
|
+
.option('--api-base <url>', 'API base URL', 'https://a.gipity.ai')
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
try {
|
|
12
|
+
let email = opts.email;
|
|
13
|
+
let code = opts.code;
|
|
14
|
+
// Both provided → verify immediately (non-interactive, ideal for scripts/CC)
|
|
15
|
+
if (email && code) {
|
|
16
|
+
await verify(email, code);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Email only → send code and exit (non-interactive step 1)
|
|
20
|
+
if (email && !code) {
|
|
21
|
+
await publicPost('/auth/login', { email });
|
|
22
|
+
console.log(`Code sent to ${email}. Run: gipity login --email ${email} --code <code>`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Fully interactive flow
|
|
26
|
+
if (!email) {
|
|
27
|
+
const existing = getAuth();
|
|
28
|
+
email = await prompt(existing ? `Email [${existing.email}]: ` : 'Email: ');
|
|
29
|
+
if (!email && existing)
|
|
30
|
+
email = existing.email;
|
|
31
|
+
if (!email) {
|
|
32
|
+
console.error('Email required.');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
await publicPost('/auth/login', { email });
|
|
37
|
+
console.log('Check your email for a 6-digit code.');
|
|
38
|
+
code = await prompt('Code: ');
|
|
39
|
+
await verify(email, code);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.error(`Login failed: ${err.message}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
async function verify(email, code) {
|
|
47
|
+
const res = await publicPost('/auth/verify', { email, code });
|
|
48
|
+
const exp = decodeJwtExp(res.accessToken);
|
|
49
|
+
if (!exp) {
|
|
50
|
+
console.error('Invalid token received.');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const expiresAt = new Date(exp * 1000).toISOString();
|
|
54
|
+
saveAuth({
|
|
55
|
+
accessToken: res.accessToken,
|
|
56
|
+
refreshToken: res.refreshToken,
|
|
57
|
+
email,
|
|
58
|
+
expiresAt,
|
|
59
|
+
});
|
|
60
|
+
console.log(`Authenticated as ${email}`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { getAuth, clearAuth } from '../auth.js';
|
|
3
|
+
export const logoutCommand = new Command('logout')
|
|
4
|
+
.description('Log out and clear stored credentials')
|
|
5
|
+
.action(() => {
|
|
6
|
+
const auth = getAuth();
|
|
7
|
+
if (!auth) {
|
|
8
|
+
console.log('Not logged in.');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
clearAuth();
|
|
12
|
+
console.log(`Logged out (${auth.email}).`);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { get } from '../api.js';
|
|
3
|
+
import { requireConfig } from '../config.js';
|
|
4
|
+
export const logsCommand = new Command('logs')
|
|
5
|
+
.description('View execution logs');
|
|
6
|
+
logsCommand
|
|
7
|
+
.command('fn <name>')
|
|
8
|
+
.description('Show function execution logs')
|
|
9
|
+
.option('--limit <n>', 'Max entries', '20')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.action(async (name, opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const config = requireConfig();
|
|
14
|
+
const limit = parseInt(opts.limit, 10) || 20;
|
|
15
|
+
const res = await get(`/projects/${config.projectGuid}/functions/${encodeURIComponent(name)}/logs?limit=${limit}`);
|
|
16
|
+
if (opts.json) {
|
|
17
|
+
console.log(JSON.stringify(res.data));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (res.data.length === 0) {
|
|
21
|
+
console.log(`No logs for function "${name}".`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(`Logs for "${name}" (last ${res.data.length}):`);
|
|
25
|
+
for (const log of res.data) {
|
|
26
|
+
const time = new Date(log.created_at).toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' });
|
|
27
|
+
const dur = log.duration_ms !== null ? `${log.duration_ms}ms`.padEnd(8) : ''.padEnd(8);
|
|
28
|
+
const status = log.status.padEnd(8);
|
|
29
|
+
const trigger = log.trigger_type.padEnd(8);
|
|
30
|
+
const err = log.error ? ` "${log.error}"` : '';
|
|
31
|
+
console.log(` ${time} ${status} ${dur} ${trigger}${err}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error(`Logs failed: ${err.message}`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAY7C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAEtC,WAAW;KACR,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;KAC1C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,aAAa,MAAM,CAAC,WAAW,cAAc,kBAAkB,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,CAC5F,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,IAAI,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACzH,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { get, put, del } from '../api.js';
|
|
3
|
+
import { requireConfig } from '../config.js';
|
|
4
|
+
export const memoryCommand = new Command('memory')
|
|
5
|
+
.description('Read/write agent and project memory');
|
|
6
|
+
memoryCommand
|
|
7
|
+
.command('list')
|
|
8
|
+
.description('List memory topics')
|
|
9
|
+
.option('--project', 'List project memory (default is agent memory)')
|
|
10
|
+
.option('--json', 'Output as JSON')
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const config = requireConfig();
|
|
14
|
+
const endpoint = opts.project
|
|
15
|
+
? `/projects/${config.projectGuid}/memory`
|
|
16
|
+
: `/agents/${config.agentGuid}/memory`;
|
|
17
|
+
const res = await get(endpoint);
|
|
18
|
+
if (opts.json) {
|
|
19
|
+
console.log(JSON.stringify(res.data));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
if (res.data.length === 0) {
|
|
23
|
+
console.log('No memory topics.');
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
for (const m of res.data) {
|
|
27
|
+
console.log(`${m.topic} (${new Date(m.updated_at).toLocaleDateString()})`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error(`List failed: ${err.message}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
memoryCommand
|
|
38
|
+
.command('read <topic>')
|
|
39
|
+
.description('Read a memory topic')
|
|
40
|
+
.option('--project', 'Read project memory')
|
|
41
|
+
.option('--json', 'Output as JSON')
|
|
42
|
+
.action(async (topic, opts) => {
|
|
43
|
+
try {
|
|
44
|
+
const config = requireConfig();
|
|
45
|
+
const endpoint = opts.project
|
|
46
|
+
? `/projects/${config.projectGuid}/memory`
|
|
47
|
+
: `/agents/${config.agentGuid}/memory`;
|
|
48
|
+
const res = await get(endpoint);
|
|
49
|
+
const match = res.data.find(m => m.topic === topic);
|
|
50
|
+
if (!match) {
|
|
51
|
+
console.error(`Topic "${topic}" not found.`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
console.log(JSON.stringify(match));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(match.content);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.error(`Read failed: ${err.message}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
memoryCommand
|
|
67
|
+
.command('write <topic> <content>')
|
|
68
|
+
.description('Write a memory topic')
|
|
69
|
+
.option('--project', 'Write to project memory')
|
|
70
|
+
.option('--json', 'Output as JSON')
|
|
71
|
+
.action(async (topic, content, opts) => {
|
|
72
|
+
try {
|
|
73
|
+
const config = requireConfig();
|
|
74
|
+
const endpoint = opts.project
|
|
75
|
+
? `/projects/${config.projectGuid}/memory/${encodeURIComponent(topic)}`
|
|
76
|
+
: `/agents/${config.agentGuid}/memory/${encodeURIComponent(topic)}`;
|
|
77
|
+
await put(endpoint, { content });
|
|
78
|
+
if (opts.json) {
|
|
79
|
+
console.log(JSON.stringify({ success: true, topic }));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(`Wrote "${topic}".`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error(`Write failed: ${err.message}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
memoryCommand
|
|
91
|
+
.command('delete <topic>')
|
|
92
|
+
.description('Delete a memory topic')
|
|
93
|
+
.option('--project', 'Delete project memory')
|
|
94
|
+
.option('--json', 'Output as JSON')
|
|
95
|
+
.action(async (topic, opts) => {
|
|
96
|
+
try {
|
|
97
|
+
const config = requireConfig();
|
|
98
|
+
const endpoint = opts.project
|
|
99
|
+
? `/projects/${config.projectGuid}/memory/${encodeURIComponent(topic)}`
|
|
100
|
+
: `/agents/${config.agentGuid}/memory/${encodeURIComponent(topic)}`;
|
|
101
|
+
await del(endpoint);
|
|
102
|
+
if (opts.json) {
|
|
103
|
+
console.log(JSON.stringify({ success: true, topic }));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(`Deleted "${topic}".`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.error(`Delete failed: ${err.message}`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { get, post, del } from '../api.js';
|
|
3
|
+
import { requireConfig, saveConfig } from '../config.js';
|
|
4
|
+
import { slugify } from '../setup.js';
|
|
5
|
+
export const projectCommand = new Command('project')
|
|
6
|
+
.description('Manage projects')
|
|
7
|
+
.argument('[name]', 'Switch to project by name/slug')
|
|
8
|
+
.option('--json', 'Output as JSON')
|
|
9
|
+
.action(async (name, opts) => {
|
|
10
|
+
try {
|
|
11
|
+
const config = requireConfig();
|
|
12
|
+
if (name) {
|
|
13
|
+
// Switch to project
|
|
14
|
+
const res = await get('/projects?limit=100');
|
|
15
|
+
const match = res.data.find(p => p.slug === name || p.name === name || p.short_guid === name);
|
|
16
|
+
if (!match) {
|
|
17
|
+
console.error(`Project "${name}" not found.`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
saveConfig({ ...config, projectGuid: match.short_guid, projectSlug: match.slug, conversationGuid: null });
|
|
21
|
+
if (opts.json) {
|
|
22
|
+
console.log(JSON.stringify({ switched: match.slug, guid: match.short_guid }));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.log(`Switched to ${match.name} (${match.slug})`);
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// List projects
|
|
30
|
+
const res = await get('/projects?limit=100');
|
|
31
|
+
if (opts.json) {
|
|
32
|
+
console.log(JSON.stringify(res.data));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (res.data.length === 0) {
|
|
36
|
+
console.log('No projects.');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const p of res.data) {
|
|
40
|
+
const active = p.short_guid === config.projectGuid ? ' *' : '';
|
|
41
|
+
const def = p.is_default ? ' (default)' : '';
|
|
42
|
+
console.log(`${p.slug}${active}${def}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error(`Failed: ${err.message}`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
projectCommand
|
|
53
|
+
.command('create <name>')
|
|
54
|
+
.description('Create a new project')
|
|
55
|
+
.option('--slug <slug>', 'Project slug')
|
|
56
|
+
.option('--switch', 'Switch to new project after creation')
|
|
57
|
+
.option('--json', 'Output as JSON')
|
|
58
|
+
.action(async (name, opts) => {
|
|
59
|
+
try {
|
|
60
|
+
const slug = opts.slug || slugify(name);
|
|
61
|
+
const res = await post('/projects', { name, slug });
|
|
62
|
+
if (opts.switch) {
|
|
63
|
+
const config = requireConfig();
|
|
64
|
+
saveConfig({ ...config, projectGuid: res.data.short_guid, projectSlug: res.data.slug, conversationGuid: null });
|
|
65
|
+
}
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(JSON.stringify(res.data));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(`Created "${res.data.name}" (${res.data.slug})`);
|
|
71
|
+
if (opts.switch)
|
|
72
|
+
console.log('Switched.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error(`Create failed: ${err.message}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
projectCommand
|
|
81
|
+
.command('delete <name>')
|
|
82
|
+
.description('Delete a project')
|
|
83
|
+
.option('--json', 'Output as JSON')
|
|
84
|
+
.action(async (name, opts) => {
|
|
85
|
+
try {
|
|
86
|
+
// Resolve name to guid
|
|
87
|
+
const res = await get('/projects?limit=100');
|
|
88
|
+
const match = res.data.find(p => p.slug === name || p.name === name || p.short_guid === name);
|
|
89
|
+
if (!match) {
|
|
90
|
+
console.error(`Project "${name}" not found.`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
await del(`/projects/${match.short_guid}`);
|
|
94
|
+
if (opts.json) {
|
|
95
|
+
console.log(JSON.stringify({ deleted: match.slug }));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(`Deleted "${match.name}".`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error(`Delete failed: ${err.message}`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
projectCommand
|
|
107
|
+
.command('info')
|
|
108
|
+
.description('Show current project details')
|
|
109
|
+
.option('--json', 'Output as JSON')
|
|
110
|
+
.action(async (opts) => {
|
|
111
|
+
try {
|
|
112
|
+
const config = requireConfig();
|
|
113
|
+
const res = await get(`/projects/${config.projectGuid}`);
|
|
114
|
+
if (opts.json) {
|
|
115
|
+
console.log(JSON.stringify(res.data));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const p = res.data;
|
|
119
|
+
console.log(`Name: ${p.name}`);
|
|
120
|
+
console.log(`Slug: ${p.slug}`);
|
|
121
|
+
console.log(`GUID: ${p.short_guid}`);
|
|
122
|
+
console.log(`Created: ${new Date(p.created_at).toLocaleDateString()}`);
|
|
123
|
+
if (p.description)
|
|
124
|
+
console.log(`Desc: ${p.description}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.error(`Info failed: ${err.message}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|