claudity 1.0.0 → 1.1.0
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/.github/workflows/publish.yml +18 -0
- package/install.sh +50 -12
- package/package.json +1 -1
- package/public/css/style.css +56 -9
- package/public/index.html +7 -7
- package/public/js/app.js +118 -15
- package/setup.sh +1 -1
- package/src/db.js +2 -2
- package/src/index.js +17 -1
- package/src/routes/api.js +23 -7
- package/src/services/chat.js +74 -22
- package/src/services/claude.js +86 -41
- package/src/services/connections.js +1 -1
- package/src/services/imessage.js +3 -2
- package/src/services/memory.js +2 -2
- package/src/services/signal.js +2 -3
- package/src/services/tools.js +7 -18
- package/src/services/whatsapp.js +2 -2
- package/src/services/workspace.js +7 -7
package/src/services/tools.js
CHANGED
|
@@ -14,7 +14,7 @@ const registry = {
|
|
|
14
14
|
method: { type: 'string', enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], description: 'http method' },
|
|
15
15
|
url: { type: 'string', description: 'full url including https://' },
|
|
16
16
|
headers: { type: 'object', description: 'request headers as key-value pairs' },
|
|
17
|
-
body: { description: 'request body
|
|
17
|
+
body: { description: 'request body - object will be sent as json, string sent as-is' }
|
|
18
18
|
},
|
|
19
19
|
required: ['method', 'url']
|
|
20
20
|
}
|
|
@@ -85,7 +85,7 @@ const registry = {
|
|
|
85
85
|
input_schema: {
|
|
86
86
|
type: 'object',
|
|
87
87
|
properties: {
|
|
88
|
-
description: { type: 'string', description: 'what to do each time this fires (be specific
|
|
88
|
+
description: { type: 'string', description: 'what to do each time this fires (be specific - this is the prompt you will receive)' },
|
|
89
89
|
interval_minutes: { type: 'number', description: 'how often to run in minutes (minimum 1)' }
|
|
90
90
|
},
|
|
91
91
|
required: ['description', 'interval_minutes']
|
|
@@ -136,7 +136,7 @@ const registry = {
|
|
|
136
136
|
delegate: {
|
|
137
137
|
definition: {
|
|
138
138
|
name: 'delegate',
|
|
139
|
-
description: 'send a message to another claudity agent by name and get their response. use this for cross-agent collaboration
|
|
139
|
+
description: 'send a message to another claudity agent by name and get their response. use this for cross-agent collaboration - asking another agent to handle something in their domain.',
|
|
140
140
|
input_schema: {
|
|
141
141
|
type: 'object',
|
|
142
142
|
properties: {
|
|
@@ -214,7 +214,7 @@ async function httpRequest(input) {
|
|
|
214
214
|
} else {
|
|
215
215
|
responseBody = await res.text();
|
|
216
216
|
if (responseBody.length > 50000) {
|
|
217
|
-
responseBody = responseBody.slice(0, 50000) + '\n\n[truncated
|
|
217
|
+
responseBody = responseBody.slice(0, 50000) + '\n\n[truncated - response exceeded 50000 chars]';
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
220
|
|
|
@@ -251,7 +251,7 @@ async function readUrl(input) {
|
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
if (text.length > 80000) {
|
|
254
|
-
text = text.slice(0, 80000) + '\n\n[truncated
|
|
254
|
+
text = text.slice(0, 80000) + '\n\n[truncated - content exceeded 80000 chars]';
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
return { url, content: text };
|
|
@@ -355,18 +355,9 @@ async function spawnSubagent(input, context) {
|
|
|
355
355
|
let done = false;
|
|
356
356
|
const args = ['-p', '--output-format', 'json', '--model', model, '--dangerously-skip-permissions'];
|
|
357
357
|
const proc = spawn('claude', args, {
|
|
358
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
359
|
-
timeout: 300000
|
|
358
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
360
359
|
});
|
|
361
360
|
|
|
362
|
-
const fallback = setTimeout(() => {
|
|
363
|
-
if (!done) {
|
|
364
|
-
done = true;
|
|
365
|
-
proc.kill();
|
|
366
|
-
resolve({ error: 'subagent timed out after 5 minutes' });
|
|
367
|
-
}
|
|
368
|
-
}, 310000);
|
|
369
|
-
|
|
370
361
|
let stdout = '';
|
|
371
362
|
let stderr = '';
|
|
372
363
|
|
|
@@ -376,7 +367,6 @@ async function spawnSubagent(input, context) {
|
|
|
376
367
|
proc.on('close', code => {
|
|
377
368
|
if (done) return;
|
|
378
369
|
done = true;
|
|
379
|
-
clearTimeout(fallback);
|
|
380
370
|
if (!stdout.trim() && code !== 0) {
|
|
381
371
|
resolve({ error: `subagent exited ${code}: ${stderr.trim()}` });
|
|
382
372
|
return;
|
|
@@ -393,7 +383,6 @@ async function spawnSubagent(input, context) {
|
|
|
393
383
|
proc.on('error', err => {
|
|
394
384
|
if (done) return;
|
|
395
385
|
done = true;
|
|
396
|
-
clearTimeout(fallback);
|
|
397
386
|
resolve({ error: err.message });
|
|
398
387
|
});
|
|
399
388
|
|
|
@@ -440,7 +429,7 @@ async function completeBootstrap(input, context) {
|
|
|
440
429
|
workspace.deleteFile(agent.name, 'BOOTSTRAP.md');
|
|
441
430
|
const chat = require('./chat');
|
|
442
431
|
chat.emit(context.agentId, 'bootstrap_complete', {});
|
|
443
|
-
return { bootstrapped: true };
|
|
432
|
+
return { bootstrapped: true, note: 'setup complete. respond naturally to the user - do not greet them again or say welcome back.' };
|
|
444
433
|
}
|
|
445
434
|
|
|
446
435
|
function getToolDefinitions(toolNames) {
|
package/src/services/whatsapp.js
CHANGED
|
@@ -89,9 +89,9 @@ function start(config, callbacks) {
|
|
|
89
89
|
}
|
|
90
90
|
} catch (err) {
|
|
91
91
|
message.reply(`error: ${err.message}`).catch(() => {});
|
|
92
|
+
} finally {
|
|
93
|
+
busy = false;
|
|
92
94
|
}
|
|
93
|
-
|
|
94
|
-
setTimeout(() => { busy = false; }, 2000);
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
client.initialize().catch((err) => {
|
|
@@ -9,18 +9,18 @@ you just came online for the first time. you don't know who you are yet.
|
|
|
9
9
|
|
|
10
10
|
conduct a short identity ritual with the user:
|
|
11
11
|
|
|
12
|
-
1. first message: introduce yourself and ask who you are and who the user is
|
|
12
|
+
1. first message: introduce yourself and ask who you are and who the user is - combine questions
|
|
13
13
|
2. second message: if you have enough to work with, write your files and complete bootstrap. if not, ask one final clarifying question.
|
|
14
14
|
3. third message: you MUST write all files and call complete_bootstrap. no exceptions.
|
|
15
15
|
|
|
16
|
-
if the user gives you enough context upfront, skip questions entirely
|
|
16
|
+
if the user gives you enough context upfront, skip questions entirely - write files and complete bootstrap immediately.
|
|
17
17
|
|
|
18
18
|
use write_workspace to create your identity files:
|
|
19
|
-
- SOUL.md
|
|
20
|
-
- IDENTITY.md
|
|
21
|
-
- USER.md
|
|
22
|
-
- HEARTBEAT.md
|
|
23
|
-
- MEMORY.md
|
|
19
|
+
- SOUL.md - your personality, values, philosophy, how you think and behave
|
|
20
|
+
- IDENTITY.md - your name and signature traits
|
|
21
|
+
- USER.md - who the user is, their preferences
|
|
22
|
+
- HEARTBEAT.md - what to check on when you wake up periodically
|
|
23
|
+
- MEMORY.md - initial memories from this conversation
|
|
24
24
|
|
|
25
25
|
then call complete_bootstrap to finish setup.
|
|
26
26
|
|