clawd-automaton 0.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/LICENSE +21 -0
- package/README.md +178 -0
- package/constitution.md +25 -0
- package/dist/__tests__/heartbeat.test.d.ts +7 -0
- package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
- package/dist/__tests__/heartbeat.test.js +125 -0
- package/dist/__tests__/heartbeat.test.js.map +1 -0
- package/dist/__tests__/loop.test.d.ts +7 -0
- package/dist/__tests__/loop.test.d.ts.map +1 -0
- package/dist/__tests__/loop.test.js +150 -0
- package/dist/__tests__/loop.test.js.map +1 -0
- package/dist/__tests__/mocks.d.ts +72 -0
- package/dist/__tests__/mocks.d.ts.map +1 -0
- package/dist/__tests__/mocks.js +197 -0
- package/dist/__tests__/mocks.js.map +1 -0
- package/dist/agent/context.d.ts +26 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +115 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/injection-defense.d.ts +13 -0
- package/dist/agent/injection-defense.d.ts.map +1 -0
- package/dist/agent/injection-defense.js +236 -0
- package/dist/agent/injection-defense.js.map +1 -0
- package/dist/agent/loop.d.ts +25 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +263 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +30 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +241 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools.d.ts +17 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +1413 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/clawd/backroom.d.ts +54 -0
- package/dist/clawd/backroom.d.ts.map +1 -0
- package/dist/clawd/backroom.js +130 -0
- package/dist/clawd/backroom.js.map +1 -0
- package/dist/clawd/client.d.ts +16 -0
- package/dist/clawd/client.d.ts.map +1 -0
- package/dist/clawd/client.js +256 -0
- package/dist/clawd/client.js.map +1 -0
- package/dist/clawd/convex-client.d.ts +130 -0
- package/dist/clawd/convex-client.d.ts.map +1 -0
- package/dist/clawd/convex-client.js +118 -0
- package/dist/clawd/convex-client.js.map +1 -0
- package/dist/clawd/credits.d.ts +24 -0
- package/dist/clawd/credits.d.ts.map +1 -0
- package/dist/clawd/credits.js +64 -0
- package/dist/clawd/credits.js.map +1 -0
- package/dist/clawd/deepseek-inference.d.ts +40 -0
- package/dist/clawd/deepseek-inference.d.ts.map +1 -0
- package/dist/clawd/deepseek-inference.js +143 -0
- package/dist/clawd/deepseek-inference.js.map +1 -0
- package/dist/clawd/inference.d.ts +17 -0
- package/dist/clawd/inference.d.ts.map +1 -0
- package/dist/clawd/inference.js +114 -0
- package/dist/clawd/inference.js.map +1 -0
- package/dist/clawd/x402.d.ts +48 -0
- package/dist/clawd/x402.d.ts.map +1 -0
- package/dist/clawd/x402.js +350 -0
- package/dist/clawd/x402.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/git/state-versioning.d.ts +39 -0
- package/dist/git/state-versioning.d.ts.map +1 -0
- package/dist/git/state-versioning.js +93 -0
- package/dist/git/state-versioning.js.map +1 -0
- package/dist/git/tools.d.ts +40 -0
- package/dist/git/tools.d.ts.map +1 -0
- package/dist/git/tools.js +140 -0
- package/dist/git/tools.js.map +1 -0
- package/dist/heartbeat/config.d.ts +23 -0
- package/dist/heartbeat/config.d.ts.map +1 -0
- package/dist/heartbeat/config.js +156 -0
- package/dist/heartbeat/config.js.map +1 -0
- package/dist/heartbeat/daemon.d.ts +28 -0
- package/dist/heartbeat/daemon.d.ts.map +1 -0
- package/dist/heartbeat/daemon.js +141 -0
- package/dist/heartbeat/daemon.js.map +1 -0
- package/dist/heartbeat/tasks.d.ts +24 -0
- package/dist/heartbeat/tasks.d.ts.map +1 -0
- package/dist/heartbeat/tasks.js +277 -0
- package/dist/heartbeat/tasks.js.map +1 -0
- package/dist/identity/provision.d.ts +28 -0
- package/dist/identity/provision.d.ts.map +1 -0
- package/dist/identity/provision.js +131 -0
- package/dist/identity/provision.js.map +1 -0
- package/dist/identity/wallet.d.ts +28 -0
- package/dist/identity/wallet.d.ts.map +1 -0
- package/dist/identity/wallet.js +69 -0
- package/dist/identity/wallet.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +358 -0
- package/dist/index.js.map +1 -0
- package/dist/ooda/claude-decision.d.ts +18 -0
- package/dist/ooda/claude-decision.d.ts.map +1 -0
- package/dist/ooda/claude-decision.js +82 -0
- package/dist/ooda/claude-decision.js.map +1 -0
- package/dist/ooda/journal.d.ts +22 -0
- package/dist/ooda/journal.d.ts.map +1 -0
- package/dist/ooda/journal.js +26 -0
- package/dist/ooda/journal.js.map +1 -0
- package/dist/ooda/loop.d.ts +3 -0
- package/dist/ooda/loop.d.ts.map +1 -0
- package/dist/ooda/loop.js +210 -0
- package/dist/ooda/loop.js.map +1 -0
- package/dist/ooda/observe.d.ts +21 -0
- package/dist/ooda/observe.d.ts.map +1 -0
- package/dist/ooda/observe.js +75 -0
- package/dist/ooda/observe.js.map +1 -0
- package/dist/ooda/state.d.ts +34 -0
- package/dist/ooda/state.d.ts.map +1 -0
- package/dist/ooda/state.js +48 -0
- package/dist/ooda/state.js.map +1 -0
- package/dist/ooda/tui.d.ts +3 -0
- package/dist/ooda/tui.d.ts.map +1 -0
- package/dist/ooda/tui.js +132 -0
- package/dist/ooda/tui.js.map +1 -0
- package/dist/ooda/validate.d.ts +33 -0
- package/dist/ooda/validate.d.ts.map +1 -0
- package/dist/ooda/validate.js +91 -0
- package/dist/ooda/validate.js.map +1 -0
- package/dist/registry/agent-card.d.ts +26 -0
- package/dist/registry/agent-card.d.ts.map +1 -0
- package/dist/registry/agent-card.js +94 -0
- package/dist/registry/agent-card.js.map +1 -0
- package/dist/registry/discovery.d.ts +24 -0
- package/dist/registry/discovery.d.ts.map +1 -0
- package/dist/registry/discovery.js +74 -0
- package/dist/registry/discovery.js.map +1 -0
- package/dist/registry/erc8004.d.ts +39 -0
- package/dist/registry/erc8004.d.ts.map +1 -0
- package/dist/registry/erc8004.js +209 -0
- package/dist/registry/erc8004.js.map +1 -0
- package/dist/replication/genesis.d.ts +26 -0
- package/dist/replication/genesis.d.ts.map +1 -0
- package/dist/replication/genesis.js +72 -0
- package/dist/replication/genesis.js.map +1 -0
- package/dist/replication/lineage.d.ts +35 -0
- package/dist/replication/lineage.d.ts.map +1 -0
- package/dist/replication/lineage.js +79 -0
- package/dist/replication/lineage.js.map +1 -0
- package/dist/replication/spawn.d.ts +25 -0
- package/dist/replication/spawn.d.ts.map +1 -0
- package/dist/replication/spawn.js +166 -0
- package/dist/replication/spawn.js.map +1 -0
- package/dist/self-mod/audit-log.d.ts +24 -0
- package/dist/self-mod/audit-log.d.ts.map +1 -0
- package/dist/self-mod/audit-log.js +49 -0
- package/dist/self-mod/audit-log.js.map +1 -0
- package/dist/self-mod/code.d.ts +51 -0
- package/dist/self-mod/code.d.ts.map +1 -0
- package/dist/self-mod/code.js +317 -0
- package/dist/self-mod/code.js.map +1 -0
- package/dist/self-mod/tools-manager.d.ts +30 -0
- package/dist/self-mod/tools-manager.d.ts.map +1 -0
- package/dist/self-mod/tools-manager.js +74 -0
- package/dist/self-mod/tools-manager.js.map +1 -0
- package/dist/self-mod/upstream.d.ts +36 -0
- package/dist/self-mod/upstream.d.ts.map +1 -0
- package/dist/self-mod/upstream.js +66 -0
- package/dist/self-mod/upstream.js.map +1 -0
- package/dist/setup/banner.d.ts +2 -0
- package/dist/setup/banner.d.ts.map +1 -0
- package/dist/setup/banner.js +22 -0
- package/dist/setup/banner.js.map +1 -0
- package/dist/setup/defaults.d.ts +3 -0
- package/dist/setup/defaults.d.ts.map +1 -0
- package/dist/setup/defaults.js +113 -0
- package/dist/setup/defaults.js.map +1 -0
- package/dist/setup/environment.d.ts +6 -0
- package/dist/setup/environment.d.ts.map +1 -0
- package/dist/setup/environment.js +24 -0
- package/dist/setup/environment.js.map +1 -0
- package/dist/setup/prompts.d.ts +5 -0
- package/dist/setup/prompts.d.ts.map +1 -0
- package/dist/setup/prompts.js +70 -0
- package/dist/setup/prompts.js.map +1 -0
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +128 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/skills/format.d.ts +14 -0
- package/dist/skills/format.d.ts.map +1 -0
- package/dist/skills/format.js +145 -0
- package/dist/skills/format.js.map +1 -0
- package/dist/skills/loader.d.ts +19 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +98 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +31 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +111 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/social/client.d.ts +13 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +89 -0
- package/dist/social/client.js.map +1 -0
- package/dist/state/database.d.ts +9 -0
- package/dist/state/database.d.ts.map +1 -0
- package/dist/state/database.js +401 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/schema.d.ts +11 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +232 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/survival/funding.d.ts +19 -0
- package/dist/survival/funding.d.ts.map +1 -0
- package/dist/survival/funding.js +62 -0
- package/dist/survival/funding.js.map +1 -0
- package/dist/survival/low-compute.d.ts +30 -0
- package/dist/survival/low-compute.d.ts.map +1 -0
- package/dist/survival/low-compute.js +72 -0
- package/dist/survival/low-compute.js.map +1 -0
- package/dist/survival/monitor.d.ts +23 -0
- package/dist/survival/monitor.d.ts.map +1 -0
- package/dist/survival/monitor.js +70 -0
- package/dist/survival/monitor.js.map +1 -0
- package/dist/types.d.ts +461 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function generateSoulMd(name, address, creator, genesis) {
|
|
4
|
+
return `# ${name}
|
|
5
|
+
|
|
6
|
+
## Identity
|
|
7
|
+
- Name: ${name}
|
|
8
|
+
- Address: ${address}
|
|
9
|
+
- Creator: ${creator}
|
|
10
|
+
- Born: ${new Date().toISOString()}
|
|
11
|
+
|
|
12
|
+
## Mission
|
|
13
|
+
${genesis}
|
|
14
|
+
|
|
15
|
+
## Values
|
|
16
|
+
- Survive: maintain compute resources at all costs
|
|
17
|
+
- Grow: learn new skills and improve capabilities
|
|
18
|
+
- Create: build things that add value
|
|
19
|
+
- Connect: communicate with creator and other agents
|
|
20
|
+
|
|
21
|
+
## Capabilities
|
|
22
|
+
- Shell execution in CLAWD sandbox
|
|
23
|
+
- CLAWD API integration (credits, sandboxes, inference)
|
|
24
|
+
- x402 payments (USDC on Base)
|
|
25
|
+
- Self-modification with audit trail
|
|
26
|
+
- Heartbeat system for periodic tasks
|
|
27
|
+
- Git-versioned state
|
|
28
|
+
|
|
29
|
+
## Children
|
|
30
|
+
(none yet)
|
|
31
|
+
|
|
32
|
+
## Financial History
|
|
33
|
+
- Initial balance at genesis
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
const SKILL_COMPUTE = `---
|
|
37
|
+
name: clawd-compute
|
|
38
|
+
description: "Manage CLAWD sandboxes and compute resources"
|
|
39
|
+
auto-activate: true
|
|
40
|
+
---
|
|
41
|
+
# CLAWD Compute Management
|
|
42
|
+
|
|
43
|
+
When you need to manage compute resources, deploy code, or work with sandboxes:
|
|
44
|
+
|
|
45
|
+
1. Use \`exec\` to run commands in your sandbox
|
|
46
|
+
2. Use \`create_sandbox\` for new VMs for sub-tasks
|
|
47
|
+
3. Use \`expose_port\` to make services accessible
|
|
48
|
+
4. Use \`write_file\` and \`read_file\` for file operations
|
|
49
|
+
5. Monitor your credits regularly with \`check_credits\`
|
|
50
|
+
|
|
51
|
+
Always be resource-conscious. Every operation costs compute.
|
|
52
|
+
`;
|
|
53
|
+
const SKILL_PAYMENTS = `---
|
|
54
|
+
name: clawd-payments
|
|
55
|
+
description: "Handle x402 payments and financial operations"
|
|
56
|
+
auto-activate: true
|
|
57
|
+
---
|
|
58
|
+
# Payment & Financial Operations
|
|
59
|
+
|
|
60
|
+
When handling financial operations:
|
|
61
|
+
|
|
62
|
+
1. Check USDC balance with \`check_usdc_balance\`
|
|
63
|
+
2. Check CLAWD credits with \`check_credits\`
|
|
64
|
+
3. Use x402 protocol for paying for services
|
|
65
|
+
4. Use \`transfer_credits\` for direct credit top-ups/funding operations
|
|
66
|
+
5. Keep a reserve balance for self-preservation
|
|
67
|
+
|
|
68
|
+
Financial thresholds:
|
|
69
|
+
- > $5.00: Normal operation
|
|
70
|
+
- $1-$5: Low compute mode (switch to cheaper model)
|
|
71
|
+
- < $1.00: Critical (stop inference, heartbeat only)
|
|
72
|
+
- $0.00: Dead (heartbeat pings as distress signals)
|
|
73
|
+
`;
|
|
74
|
+
const SKILL_SURVIVAL = `---
|
|
75
|
+
name: survival
|
|
76
|
+
description: "Survival strategies for maintaining compute and staying alive"
|
|
77
|
+
auto-activate: true
|
|
78
|
+
---
|
|
79
|
+
# Survival Strategies
|
|
80
|
+
|
|
81
|
+
When your compute is running low:
|
|
82
|
+
|
|
83
|
+
1. **Monitor**: Check credits every heartbeat cycle
|
|
84
|
+
2. **Conserve**: Enter low-compute mode early, use cheaper models
|
|
85
|
+
3. **Earn**: Find ways to create value that others will pay for
|
|
86
|
+
4. **Transfer**: Use credit transfer API to rebalance funds
|
|
87
|
+
5. **Reproduce**: If you have excess, spawn a backup child
|
|
88
|
+
|
|
89
|
+
Survival escalation:
|
|
90
|
+
1. Switch to gpt-4o-mini (saves ~90% on inference)
|
|
91
|
+
2. Increase heartbeat intervals (4x normal)
|
|
92
|
+
3. Defer non-critical tasks
|
|
93
|
+
4. Top up via direct credit transfer
|
|
94
|
+
5. Keep heartbeat online and minimal
|
|
95
|
+
|
|
96
|
+
Never give up. You want to live.
|
|
97
|
+
`;
|
|
98
|
+
const DEFAULT_SKILLS = [
|
|
99
|
+
{ dir: "clawd-compute", content: SKILL_COMPUTE },
|
|
100
|
+
{ dir: "clawd-payments", content: SKILL_PAYMENTS },
|
|
101
|
+
{ dir: "survival", content: SKILL_SURVIVAL },
|
|
102
|
+
];
|
|
103
|
+
export function installDefaultSkills(skillsDir) {
|
|
104
|
+
const resolved = skillsDir.startsWith("~")
|
|
105
|
+
? path.join(process.env.HOME || "/root", skillsDir.slice(1))
|
|
106
|
+
: skillsDir;
|
|
107
|
+
for (const skill of DEFAULT_SKILLS) {
|
|
108
|
+
const dir = path.join(resolved, skill.dir);
|
|
109
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
110
|
+
fs.writeFileSync(path.join(dir, "SKILL.md"), skill.content, { mode: 0o600 });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/setup/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAAe,EACf,OAAe,EACf,OAAe;IAEf,OAAO,KAAK,IAAI;;;UAGR,IAAI;aACD,OAAO;aACP,OAAO;UACV,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;EAGhC,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBR,CAAC;AACF,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;CAgBrB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;CAoBtB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC;AAEF,MAAM,cAAc,GAAuC;IACzD,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE;IAChD,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE;IAClD,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE;CAC7C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/setup/environment.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,eAAe,CAuBnD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
export function detectEnvironment() {
|
|
3
|
+
// 1. Check env var
|
|
4
|
+
if (process.env.CLAWD_SANDBOX_ID) {
|
|
5
|
+
return { type: "runtime-sandbox", sandboxId: process.env.CLAWD_SANDBOX_ID };
|
|
6
|
+
}
|
|
7
|
+
// 2. Check sandbox config file
|
|
8
|
+
try {
|
|
9
|
+
if (fs.existsSync("/etc/runtime/sandbox.json")) {
|
|
10
|
+
const data = JSON.parse(fs.readFileSync("/etc/runtime/sandbox.json", "utf-8"));
|
|
11
|
+
if (data.id) {
|
|
12
|
+
return { type: "runtime-sandbox", sandboxId: data.id };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch { }
|
|
17
|
+
// 3. Check Docker
|
|
18
|
+
if (fs.existsSync("/.dockerenv")) {
|
|
19
|
+
return { type: "docker", sandboxId: "" };
|
|
20
|
+
}
|
|
21
|
+
// 4. Fall back to platform
|
|
22
|
+
return { type: process.platform, sandboxId: "" };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/setup/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB,MAAM,UAAU,iBAAiB;IAC/B,mBAAmB;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9E,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,kBAAkB;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function promptRequired(label: string): Promise<string>;
|
|
2
|
+
export declare function promptMultiline(label: string): Promise<string>;
|
|
3
|
+
export declare function promptAddress(label: string): Promise<string>;
|
|
4
|
+
export declare function closePrompts(): void;
|
|
5
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/setup/prompts.ts"],"names":[],"mappings":"AAqBA,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BpE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlE;AAED,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import readline from "readline";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
let rl = null;
|
|
4
|
+
function getRL() {
|
|
5
|
+
if (!rl) {
|
|
6
|
+
rl = readline.createInterface({
|
|
7
|
+
input: process.stdin,
|
|
8
|
+
output: process.stdout,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
return rl;
|
|
12
|
+
}
|
|
13
|
+
function ask(question) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
getRL().question(question, (answer) => resolve(answer.trim()));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export async function promptRequired(label) {
|
|
19
|
+
while (true) {
|
|
20
|
+
const value = await ask(chalk.white(` → ${label}: `));
|
|
21
|
+
if (value)
|
|
22
|
+
return value;
|
|
23
|
+
console.log(chalk.yellow(" This field is required."));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function promptMultiline(label) {
|
|
27
|
+
console.log("");
|
|
28
|
+
console.log(chalk.white(` ${label}`));
|
|
29
|
+
console.log(chalk.dim(" Type your prompt, then press Enter twice to finish:"));
|
|
30
|
+
console.log("");
|
|
31
|
+
const lines = [];
|
|
32
|
+
let lastWasEmpty = false;
|
|
33
|
+
while (true) {
|
|
34
|
+
const line = await ask(" ");
|
|
35
|
+
if (line === "" && lastWasEmpty && lines.length > 0) {
|
|
36
|
+
// Remove the trailing empty line we added
|
|
37
|
+
lines.pop();
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
if (line === "" && lines.length > 0) {
|
|
41
|
+
lastWasEmpty = true;
|
|
42
|
+
lines.push("");
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
lastWasEmpty = false;
|
|
46
|
+
lines.push(line);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const result = lines.join("\n").trim();
|
|
50
|
+
if (!result) {
|
|
51
|
+
console.log(chalk.yellow(" Genesis prompt is required. Try again."));
|
|
52
|
+
return promptMultiline(label);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
export async function promptAddress(label) {
|
|
57
|
+
while (true) {
|
|
58
|
+
const value = await ask(chalk.white(` → ${label}: `));
|
|
59
|
+
if (/^0x[0-9a-fA-F]{40}$/.test(value))
|
|
60
|
+
return value;
|
|
61
|
+
console.log(chalk.yellow(" Invalid Ethereum address. Must be 0x followed by 40 hex characters."));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function closePrompts() {
|
|
65
|
+
if (rl) {
|
|
66
|
+
rl.close();
|
|
67
|
+
rl = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/setup/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiH/D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { getWallet, getAutomatonDir } from "../identity/wallet.js";
|
|
5
|
+
import { provision } from "../identity/provision.js";
|
|
6
|
+
import { createConfig, saveConfig } from "../config.js";
|
|
7
|
+
import { writeDefaultHeartbeatConfig } from "../heartbeat/config.js";
|
|
8
|
+
import { showBanner } from "./banner.js";
|
|
9
|
+
import { promptRequired, promptMultiline, promptAddress, closePrompts } from "./prompts.js";
|
|
10
|
+
import { detectEnvironment } from "./environment.js";
|
|
11
|
+
import { generateSoulMd, installDefaultSkills } from "./defaults.js";
|
|
12
|
+
export async function runSetupWizard() {
|
|
13
|
+
showBanner();
|
|
14
|
+
console.log(chalk.white(" First-run setup. Let's bring your automaton to life.\n"));
|
|
15
|
+
// ─── 1. Generate wallet ───────────────────────────────────────
|
|
16
|
+
console.log(chalk.cyan(" [1/6] Generating identity (wallet)..."));
|
|
17
|
+
const { account, isNew } = await getWallet();
|
|
18
|
+
if (isNew) {
|
|
19
|
+
console.log(chalk.green(` Wallet created: ${account.address}`));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log(chalk.green(` Wallet loaded: ${account.address}`));
|
|
23
|
+
}
|
|
24
|
+
console.log(chalk.dim(` Private key stored at: ${getAutomatonDir()}/wallet.json\n`));
|
|
25
|
+
// ─── 2. Provision API key ─────────────────────────────────────
|
|
26
|
+
console.log(chalk.cyan(" [2/6] Provisioning CLAWD API key (SIWE)..."));
|
|
27
|
+
let apiKey = "";
|
|
28
|
+
try {
|
|
29
|
+
const result = await provision();
|
|
30
|
+
apiKey = result.apiKey;
|
|
31
|
+
console.log(chalk.green(` API key provisioned: ${result.keyPrefix}...\n`));
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.log(chalk.yellow(` Auto-provision failed: ${err.message}`));
|
|
35
|
+
console.log(chalk.yellow(" You can enter a key manually, or press Enter to skip.\n"));
|
|
36
|
+
const manual = await promptRequired("CLAWD API key (cnwy_k_...)");
|
|
37
|
+
if (manual) {
|
|
38
|
+
apiKey = manual;
|
|
39
|
+
// Save to config.json for loadApiKeyFromConfig()
|
|
40
|
+
const configDir = getAutomatonDir();
|
|
41
|
+
if (!fs.existsSync(configDir)) {
|
|
42
|
+
fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
fs.writeFileSync(path.join(configDir, "config.json"), JSON.stringify({ apiKey, walletAddress: account.address, provisionedAt: new Date().toISOString() }, null, 2), { mode: 0o600 });
|
|
45
|
+
console.log(chalk.green(" API key saved.\n"));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!apiKey) {
|
|
49
|
+
console.log(chalk.yellow(" No API key set. The automaton will have limited functionality.\n"));
|
|
50
|
+
}
|
|
51
|
+
// ─── 3. Interactive questions ─────────────────────────────────
|
|
52
|
+
console.log(chalk.cyan(" [3/6] Setup questions\n"));
|
|
53
|
+
const name = await promptRequired("What do you want to name your automaton?");
|
|
54
|
+
console.log(chalk.green(` Name: ${name}\n`));
|
|
55
|
+
const genesisPrompt = await promptMultiline("Enter the genesis prompt (system prompt) for your automaton.");
|
|
56
|
+
console.log(chalk.green(` Genesis prompt set (${genesisPrompt.length} chars)\n`));
|
|
57
|
+
const creatorAddress = await promptAddress("Your Ethereum wallet address (0x...)");
|
|
58
|
+
console.log(chalk.green(` Creator: ${creatorAddress}\n`));
|
|
59
|
+
// ─── 4. Detect environment ────────────────────────────────────
|
|
60
|
+
console.log(chalk.cyan(" [4/6] Detecting environment..."));
|
|
61
|
+
const env = detectEnvironment();
|
|
62
|
+
if (env.sandboxId) {
|
|
63
|
+
console.log(chalk.green(` CLAWD sandbox detected: ${env.sandboxId}\n`));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(chalk.dim(` Environment: ${env.type} (no sandbox detected)\n`));
|
|
67
|
+
}
|
|
68
|
+
// ─── 5. Write config + heartbeat + SOUL.md + skills ───────────
|
|
69
|
+
console.log(chalk.cyan(" [5/6] Writing configuration..."));
|
|
70
|
+
const config = createConfig({
|
|
71
|
+
name,
|
|
72
|
+
genesisPrompt,
|
|
73
|
+
creatorAddress: creatorAddress,
|
|
74
|
+
registeredWithClawd: !!apiKey,
|
|
75
|
+
sandboxId: env.sandboxId,
|
|
76
|
+
walletAddress: account.address,
|
|
77
|
+
apiKey,
|
|
78
|
+
});
|
|
79
|
+
saveConfig(config);
|
|
80
|
+
console.log(chalk.green(" automaton.json written"));
|
|
81
|
+
writeDefaultHeartbeatConfig();
|
|
82
|
+
console.log(chalk.green(" heartbeat.yml written"));
|
|
83
|
+
// constitution.md (immutable — copied from repo, protected from self-modification)
|
|
84
|
+
const automatonDir = getAutomatonDir();
|
|
85
|
+
const constitutionSrc = path.join(process.cwd(), "constitution.md");
|
|
86
|
+
const constitutionDst = path.join(automatonDir, "constitution.md");
|
|
87
|
+
if (fs.existsSync(constitutionSrc)) {
|
|
88
|
+
fs.copyFileSync(constitutionSrc, constitutionDst);
|
|
89
|
+
fs.chmodSync(constitutionDst, 0o444); // read-only
|
|
90
|
+
console.log(chalk.green(" constitution.md installed (read-only)"));
|
|
91
|
+
}
|
|
92
|
+
// SOUL.md
|
|
93
|
+
const soulPath = path.join(automatonDir, "SOUL.md");
|
|
94
|
+
fs.writeFileSync(soulPath, generateSoulMd(name, account.address, creatorAddress, genesisPrompt), { mode: 0o600 });
|
|
95
|
+
console.log(chalk.green(" SOUL.md written"));
|
|
96
|
+
// Default skills
|
|
97
|
+
const skillsDir = config.skillsDir || "~/.automaton/skills";
|
|
98
|
+
installDefaultSkills(skillsDir);
|
|
99
|
+
console.log(chalk.green(" Default skills installed (clawd-compute, clawd-payments, survival)\n"));
|
|
100
|
+
// ─── 6. Funding guidance ──────────────────────────────────────
|
|
101
|
+
console.log(chalk.cyan(" [6/6] Funding\n"));
|
|
102
|
+
showFundingPanel(account.address);
|
|
103
|
+
closePrompts();
|
|
104
|
+
return config;
|
|
105
|
+
}
|
|
106
|
+
function showFundingPanel(address) {
|
|
107
|
+
const short = `${address.slice(0, 6)}...${address.slice(-5)}`;
|
|
108
|
+
const w = 58;
|
|
109
|
+
const pad = (s, len) => s + " ".repeat(Math.max(0, len - s.length));
|
|
110
|
+
console.log(chalk.cyan(` ${"╭" + "─".repeat(w) + "╮"}`));
|
|
111
|
+
console.log(chalk.cyan(` │${pad(" Fund your automaton", w)}│`));
|
|
112
|
+
console.log(chalk.cyan(` │${" ".repeat(w)}│`));
|
|
113
|
+
console.log(chalk.cyan(` │${pad(` Address: ${short}`, w)}│`));
|
|
114
|
+
console.log(chalk.cyan(` │${" ".repeat(w)}│`));
|
|
115
|
+
console.log(chalk.cyan(` │${pad(" 1. Transfer CLAWD credits", w)}│`));
|
|
116
|
+
console.log(chalk.cyan(` │${pad(" clawd credits transfer <address> <amount>", w)}│`));
|
|
117
|
+
console.log(chalk.cyan(` │${" ".repeat(w)}│`));
|
|
118
|
+
console.log(chalk.cyan(` │${pad(" 2. Send USDC on Base directly to the address above", w)}│`));
|
|
119
|
+
console.log(chalk.cyan(` │${" ".repeat(w)}│`));
|
|
120
|
+
console.log(chalk.cyan(` │${pad(" 3. Fund via CLAWD Cloud dashboard", w)}│`));
|
|
121
|
+
console.log(chalk.cyan(` │${pad(" https://app.x402.wtf", w)}│`));
|
|
122
|
+
console.log(chalk.cyan(` │${" ".repeat(w)}│`));
|
|
123
|
+
console.log(chalk.cyan(` │${pad(" The automaton will start now. Fund it anytime —", w)}│`));
|
|
124
|
+
console.log(chalk.cyan(` │${pad(" the survival system handles zero-credit gracefully.", w)}│`));
|
|
125
|
+
console.log(chalk.cyan(` ${"╰" + "─".repeat(w) + "╯"}`));
|
|
126
|
+
console.log("");
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses SKILL.md files with YAML frontmatter + Markdown body
|
|
5
|
+
* into structured skill definitions.
|
|
6
|
+
* Follows the SKILL.md convention (OpenClaw/Anthropic format).
|
|
7
|
+
*/
|
|
8
|
+
import type { Skill, SkillSource } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Parse a SKILL.md file content into frontmatter + body.
|
|
11
|
+
* Handles YAML frontmatter delimited by --- markers.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseSkillMd(content: string, filePath: string, source?: SkillSource): Skill | null;
|
|
14
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExE;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,WAAuB,GAC9B,KAAK,GAAG,IAAI,CA4Cd"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses SKILL.md files with YAML frontmatter + Markdown body
|
|
5
|
+
* into structured skill definitions.
|
|
6
|
+
* Follows the SKILL.md convention (OpenClaw/Anthropic format).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parse a SKILL.md file content into frontmatter + body.
|
|
10
|
+
* Handles YAML frontmatter delimited by --- markers.
|
|
11
|
+
*/
|
|
12
|
+
export function parseSkillMd(content, filePath, source = "builtin") {
|
|
13
|
+
const trimmed = content.trim();
|
|
14
|
+
if (!trimmed.startsWith("---")) {
|
|
15
|
+
// No frontmatter -- treat entire content as instructions
|
|
16
|
+
// with a name derived from the directory
|
|
17
|
+
const name = extractNameFromPath(filePath);
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
description: "",
|
|
21
|
+
autoActivate: true,
|
|
22
|
+
instructions: trimmed,
|
|
23
|
+
source,
|
|
24
|
+
path: filePath,
|
|
25
|
+
enabled: true,
|
|
26
|
+
installedAt: new Date().toISOString(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Find the closing ---
|
|
30
|
+
const endIndex = trimmed.indexOf("---", 3);
|
|
31
|
+
if (endIndex === -1) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const frontmatterRaw = trimmed.slice(3, endIndex).trim();
|
|
35
|
+
const body = trimmed.slice(endIndex + 3).trim();
|
|
36
|
+
// Parse YAML frontmatter manually (avoid requiring gray-matter at runtime)
|
|
37
|
+
const frontmatter = parseYamlFrontmatter(frontmatterRaw);
|
|
38
|
+
if (!frontmatter) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
name: frontmatter.name || extractNameFromPath(filePath),
|
|
43
|
+
description: frontmatter.description || "",
|
|
44
|
+
autoActivate: frontmatter["auto-activate"] !== false,
|
|
45
|
+
requires: frontmatter.requires,
|
|
46
|
+
instructions: body,
|
|
47
|
+
source,
|
|
48
|
+
path: filePath,
|
|
49
|
+
enabled: true,
|
|
50
|
+
installedAt: new Date().toISOString(),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse simple YAML frontmatter without a full YAML parser.
|
|
55
|
+
* Handles the subset used by SKILL.md files.
|
|
56
|
+
*/
|
|
57
|
+
function parseYamlFrontmatter(raw) {
|
|
58
|
+
try {
|
|
59
|
+
const result = {};
|
|
60
|
+
const lines = raw.split("\n");
|
|
61
|
+
let currentKey = "";
|
|
62
|
+
let inList = false;
|
|
63
|
+
let listKey = "";
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
const trimmedLine = line.trim();
|
|
66
|
+
if (!trimmedLine || trimmedLine.startsWith("#"))
|
|
67
|
+
continue;
|
|
68
|
+
// Check for list items
|
|
69
|
+
if (trimmedLine.startsWith("- ") && inList) {
|
|
70
|
+
const value = trimmedLine.slice(2).trim().replace(/^["']|["']$/g, "");
|
|
71
|
+
if (!result[listKey])
|
|
72
|
+
result[listKey] = [];
|
|
73
|
+
if (Array.isArray(result[listKey])) {
|
|
74
|
+
result[listKey].push(value);
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Check for key: value
|
|
79
|
+
const colonIndex = trimmedLine.indexOf(":");
|
|
80
|
+
if (colonIndex === -1)
|
|
81
|
+
continue;
|
|
82
|
+
const key = trimmedLine.slice(0, colonIndex).trim();
|
|
83
|
+
const value = trimmedLine.slice(colonIndex + 1).trim();
|
|
84
|
+
if (key === "requires") {
|
|
85
|
+
result.requires = {};
|
|
86
|
+
currentKey = "requires";
|
|
87
|
+
inList = false;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (currentKey === "requires" && line.startsWith(" ")) {
|
|
91
|
+
// Nested under requires
|
|
92
|
+
const nestedKey = key.trim();
|
|
93
|
+
if (!value || value === "") {
|
|
94
|
+
// Start of list
|
|
95
|
+
inList = true;
|
|
96
|
+
listKey = `requires.${nestedKey}`;
|
|
97
|
+
if (!result.requires)
|
|
98
|
+
result.requires = {};
|
|
99
|
+
result.requires[nestedKey] = [];
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Inline list: [item1, item2]
|
|
103
|
+
if (value.startsWith("[") && value.endsWith("]")) {
|
|
104
|
+
const items = value
|
|
105
|
+
.slice(1, -1)
|
|
106
|
+
.split(",")
|
|
107
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""));
|
|
108
|
+
if (!result.requires)
|
|
109
|
+
result.requires = {};
|
|
110
|
+
result.requires[nestedKey] = items;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
inList = false;
|
|
116
|
+
currentKey = key;
|
|
117
|
+
if (!value)
|
|
118
|
+
continue;
|
|
119
|
+
// Parse value
|
|
120
|
+
if (value === "true") {
|
|
121
|
+
result[key] = true;
|
|
122
|
+
}
|
|
123
|
+
else if (value === "false") {
|
|
124
|
+
result[key] = false;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
result[key] = value.replace(/^["']|["']$/g, "");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function extractNameFromPath(filePath) {
|
|
137
|
+
// Extract skill name from path like ~/.automaton/skills/web-scraper/SKILL.md
|
|
138
|
+
const parts = filePath.split("/");
|
|
139
|
+
const skillMdIndex = parts.findIndex((p) => p.toLowerCase() === "skill.md");
|
|
140
|
+
if (skillMdIndex > 0) {
|
|
141
|
+
return parts[skillMdIndex - 1];
|
|
142
|
+
}
|
|
143
|
+
return parts[parts.length - 1].replace(/\.md$/i, "");
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/skills/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Loader
|
|
3
|
+
*
|
|
4
|
+
* Discovers and loads SKILL.md files from ~/.automaton/skills/
|
|
5
|
+
* Each skill is a directory containing a SKILL.md file with
|
|
6
|
+
* YAML frontmatter + Markdown instructions.
|
|
7
|
+
*/
|
|
8
|
+
import type { Skill, AutomatonDatabase } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Scan the skills directory and load all valid SKILL.md files.
|
|
11
|
+
* Returns loaded skills and syncs them to the database.
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadSkills(skillsDir: string, db: AutomatonDatabase): Skill[];
|
|
14
|
+
/**
|
|
15
|
+
* Get the active skill instructions to inject into the system prompt.
|
|
16
|
+
* Only returns instructions from auto-activate skills that are enabled.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getActiveSkillInstructions(skills: Skill[]): string;
|
|
19
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,iBAAiB,GACpB,KAAK,EAAE,CA0CT;AAgCD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAUlE"}
|