@dotsetlabs/dotclaw 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.
Files changed (170) hide show
  1. package/.env.example +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +111 -0
  4. package/config-examples/groups/global/CLAUDE.md +21 -0
  5. package/config-examples/groups/main/CLAUDE.md +47 -0
  6. package/config-examples/mount-allowlist.json +25 -0
  7. package/config-examples/plugin-http.json +18 -0
  8. package/config-examples/runtime.json +30 -0
  9. package/config-examples/tool-budgets.json +24 -0
  10. package/config-examples/tool-policy.json +51 -0
  11. package/container/.dockerignore +6 -0
  12. package/container/Dockerfile +74 -0
  13. package/container/agent-runner/package-lock.json +92 -0
  14. package/container/agent-runner/package.json +20 -0
  15. package/container/agent-runner/src/agent-config.ts +295 -0
  16. package/container/agent-runner/src/container-protocol.ts +73 -0
  17. package/container/agent-runner/src/daemon.ts +91 -0
  18. package/container/agent-runner/src/index.ts +1428 -0
  19. package/container/agent-runner/src/ipc.ts +321 -0
  20. package/container/agent-runner/src/memory.ts +336 -0
  21. package/container/agent-runner/src/prompt-packs.ts +341 -0
  22. package/container/agent-runner/src/tools.ts +1720 -0
  23. package/container/agent-runner/tsconfig.json +19 -0
  24. package/container/build.sh +23 -0
  25. package/container/skills/agent-browser.md +159 -0
  26. package/dist/admin-commands.d.ts +7 -0
  27. package/dist/admin-commands.d.ts.map +1 -0
  28. package/dist/admin-commands.js +87 -0
  29. package/dist/admin-commands.js.map +1 -0
  30. package/dist/agent-context.d.ts +42 -0
  31. package/dist/agent-context.d.ts.map +1 -0
  32. package/dist/agent-context.js +92 -0
  33. package/dist/agent-context.js.map +1 -0
  34. package/dist/agent-execution.d.ts +68 -0
  35. package/dist/agent-execution.d.ts.map +1 -0
  36. package/dist/agent-execution.js +169 -0
  37. package/dist/agent-execution.js.map +1 -0
  38. package/dist/agent-semaphore.d.ts +2 -0
  39. package/dist/agent-semaphore.d.ts.map +1 -0
  40. package/dist/agent-semaphore.js +52 -0
  41. package/dist/agent-semaphore.js.map +1 -0
  42. package/dist/behavior-config.d.ts +14 -0
  43. package/dist/behavior-config.d.ts.map +1 -0
  44. package/dist/behavior-config.js +52 -0
  45. package/dist/behavior-config.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +626 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/config.d.ts +31 -0
  51. package/dist/config.d.ts.map +1 -0
  52. package/dist/config.js +38 -0
  53. package/dist/config.js.map +1 -0
  54. package/dist/container-protocol.d.ts +72 -0
  55. package/dist/container-protocol.d.ts.map +1 -0
  56. package/dist/container-protocol.js +3 -0
  57. package/dist/container-protocol.js.map +1 -0
  58. package/dist/container-runner.d.ts +59 -0
  59. package/dist/container-runner.d.ts.map +1 -0
  60. package/dist/container-runner.js +813 -0
  61. package/dist/container-runner.js.map +1 -0
  62. package/dist/cost.d.ts +9 -0
  63. package/dist/cost.d.ts.map +1 -0
  64. package/dist/cost.js +11 -0
  65. package/dist/cost.js.map +1 -0
  66. package/dist/dashboard.d.ts +58 -0
  67. package/dist/dashboard.d.ts.map +1 -0
  68. package/dist/dashboard.js +471 -0
  69. package/dist/dashboard.js.map +1 -0
  70. package/dist/db.d.ts +99 -0
  71. package/dist/db.d.ts.map +1 -0
  72. package/dist/db.js +423 -0
  73. package/dist/db.js.map +1 -0
  74. package/dist/error-messages.d.ts +17 -0
  75. package/dist/error-messages.d.ts.map +1 -0
  76. package/dist/error-messages.js +109 -0
  77. package/dist/error-messages.js.map +1 -0
  78. package/dist/index.d.ts +2 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +2072 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/locks.d.ts +2 -0
  83. package/dist/locks.d.ts.map +1 -0
  84. package/dist/locks.js +26 -0
  85. package/dist/locks.js.map +1 -0
  86. package/dist/logger.d.ts +4 -0
  87. package/dist/logger.d.ts.map +1 -0
  88. package/dist/logger.js +15 -0
  89. package/dist/logger.js.map +1 -0
  90. package/dist/maintenance.d.ts +13 -0
  91. package/dist/maintenance.d.ts.map +1 -0
  92. package/dist/maintenance.js +151 -0
  93. package/dist/maintenance.js.map +1 -0
  94. package/dist/memory-embeddings.d.ts +13 -0
  95. package/dist/memory-embeddings.d.ts.map +1 -0
  96. package/dist/memory-embeddings.js +126 -0
  97. package/dist/memory-embeddings.js.map +1 -0
  98. package/dist/memory-recall.d.ts +8 -0
  99. package/dist/memory-recall.d.ts.map +1 -0
  100. package/dist/memory-recall.js +127 -0
  101. package/dist/memory-recall.js.map +1 -0
  102. package/dist/memory-store.d.ts +149 -0
  103. package/dist/memory-store.d.ts.map +1 -0
  104. package/dist/memory-store.js +787 -0
  105. package/dist/memory-store.js.map +1 -0
  106. package/dist/metrics.d.ts +12 -0
  107. package/dist/metrics.d.ts.map +1 -0
  108. package/dist/metrics.js +134 -0
  109. package/dist/metrics.js.map +1 -0
  110. package/dist/model-registry.d.ts +67 -0
  111. package/dist/model-registry.d.ts.map +1 -0
  112. package/dist/model-registry.js +230 -0
  113. package/dist/model-registry.js.map +1 -0
  114. package/dist/mount-security.d.ts +37 -0
  115. package/dist/mount-security.d.ts.map +1 -0
  116. package/dist/mount-security.js +284 -0
  117. package/dist/mount-security.js.map +1 -0
  118. package/dist/paths.d.ts +80 -0
  119. package/dist/paths.d.ts.map +1 -0
  120. package/dist/paths.js +149 -0
  121. package/dist/paths.js.map +1 -0
  122. package/dist/personalization.d.ts +6 -0
  123. package/dist/personalization.d.ts.map +1 -0
  124. package/dist/personalization.js +180 -0
  125. package/dist/personalization.js.map +1 -0
  126. package/dist/progress.d.ts +15 -0
  127. package/dist/progress.d.ts.map +1 -0
  128. package/dist/progress.js +92 -0
  129. package/dist/progress.js.map +1 -0
  130. package/dist/runtime-config.d.ts +227 -0
  131. package/dist/runtime-config.d.ts.map +1 -0
  132. package/dist/runtime-config.js +297 -0
  133. package/dist/runtime-config.js.map +1 -0
  134. package/dist/task-scheduler.d.ts +9 -0
  135. package/dist/task-scheduler.d.ts.map +1 -0
  136. package/dist/task-scheduler.js +195 -0
  137. package/dist/task-scheduler.js.map +1 -0
  138. package/dist/telegram-format.d.ts +3 -0
  139. package/dist/telegram-format.d.ts.map +1 -0
  140. package/dist/telegram-format.js +200 -0
  141. package/dist/telegram-format.js.map +1 -0
  142. package/dist/tool-budgets.d.ts +16 -0
  143. package/dist/tool-budgets.d.ts.map +1 -0
  144. package/dist/tool-budgets.js +83 -0
  145. package/dist/tool-budgets.js.map +1 -0
  146. package/dist/tool-policy.d.ts +18 -0
  147. package/dist/tool-policy.d.ts.map +1 -0
  148. package/dist/tool-policy.js +84 -0
  149. package/dist/tool-policy.js.map +1 -0
  150. package/dist/trace-writer.d.ts +39 -0
  151. package/dist/trace-writer.d.ts.map +1 -0
  152. package/dist/trace-writer.js +27 -0
  153. package/dist/trace-writer.js.map +1 -0
  154. package/dist/types.d.ts +81 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +2 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/utils.d.ts +4 -0
  159. package/dist/utils.d.ts.map +1 -0
  160. package/dist/utils.js +30 -0
  161. package/dist/utils.js.map +1 -0
  162. package/launchd/com.dotclaw.plist +32 -0
  163. package/package.json +89 -0
  164. package/scripts/autotune.js +53 -0
  165. package/scripts/bootstrap.js +348 -0
  166. package/scripts/configure.js +200 -0
  167. package/scripts/doctor.js +164 -0
  168. package/scripts/init.js +209 -0
  169. package/scripts/install.sh +219 -0
  170. package/systemd/dotclaw.service +22 -0
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ log() {
5
+ echo "[dotclaw-install] $*"
6
+ }
7
+
8
+ warn() {
9
+ echo "[dotclaw-install] WARN: $*" >&2
10
+ }
11
+
12
+ die() {
13
+ echo "[dotclaw-install] ERROR: $*" >&2
14
+ exit 1
15
+ }
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
19
+ TARGET_USER="${SUDO_USER:-$USER}"
20
+ TARGET_HOME=""
21
+ if command -v getent >/dev/null 2>&1; then
22
+ TARGET_HOME="$(getent passwd "$TARGET_USER" | cut -d: -f6 || true)"
23
+ fi
24
+ if [[ -z "$TARGET_HOME" ]]; then
25
+ TARGET_HOME="$(eval echo "~$TARGET_USER" 2>/dev/null || true)"
26
+ fi
27
+ if [[ -z "$TARGET_HOME" || "$TARGET_HOME" == "~"* ]]; then
28
+ TARGET_HOME="$HOME"
29
+ fi
30
+
31
+ run_as_user() {
32
+ local cmd="$1"
33
+ if [[ "$USER" == "$TARGET_USER" ]]; then
34
+ bash -lc "$cmd"
35
+ else
36
+ sudo -u "$TARGET_USER" bash -lc "$cmd"
37
+ fi
38
+ }
39
+
40
+ NODE_PATH=""
41
+ if [[ "$USER" == "root" && -n "${SUDO_USER:-}" ]]; then
42
+ NODE_PATH="$(sudo -u "$TARGET_USER" bash -lc 'command -v node' || true)"
43
+ else
44
+ NODE_PATH="$(command -v node || true)"
45
+ fi
46
+
47
+ if [[ -z "$NODE_PATH" ]]; then
48
+ die "node not found in PATH. Install Node 20+ and rerun."
49
+ fi
50
+
51
+ DOTCLAW_HOME="$TARGET_HOME/.dotclaw"
52
+ CONFIG_DIR="$DOTCLAW_HOME/config"
53
+ DATA_DIR="$DOTCLAW_HOME/data"
54
+ GROUPS_DIR="$DOTCLAW_HOME/groups"
55
+ PROMPTS_DIR="$DOTCLAW_HOME/prompts"
56
+ TRACES_DIR="$DOTCLAW_HOME/traces"
57
+ LOGS_DIR="$DOTCLAW_HOME/logs"
58
+ ENV_FILE="$DOTCLAW_HOME/.env"
59
+
60
+ log "Project root: $PROJECT_ROOT"
61
+ log "DotClaw home: $DOTCLAW_HOME"
62
+ log "User: $TARGET_USER"
63
+ log "Home: $TARGET_HOME"
64
+ log "Node: $NODE_PATH"
65
+
66
+ mkdir -p "$CONFIG_DIR" "$DATA_DIR" "$GROUPS_DIR" "$PROMPTS_DIR" "$TRACES_DIR" "$LOGS_DIR"
67
+
68
+ log "Initializing runtime directories"
69
+ run_as_user "$NODE_PATH $PROJECT_ROOT/scripts/init.js"
70
+
71
+ if [[ ! -f "$CONFIG_DIR/tool-budgets.json" ]]; then
72
+ cp "$PROJECT_ROOT/config-examples/tool-budgets.json" "$CONFIG_DIR/tool-budgets.json"
73
+ fi
74
+
75
+ log "Installing DotClaw dependencies"
76
+ run_as_user "cd $PROJECT_ROOT && npm install"
77
+ log "Building DotClaw"
78
+ run_as_user "cd $PROJECT_ROOT && npm run build"
79
+
80
+ if command -v docker >/dev/null 2>&1; then
81
+ if docker info >/dev/null 2>&1; then
82
+ log "Building DotClaw container image"
83
+ run_as_user "cd $PROJECT_ROOT && ./container/build.sh" || warn "Container build failed"
84
+ else
85
+ warn "Docker is not running; skipping container build"
86
+ fi
87
+ else
88
+ warn "Docker not found; skipping container build"
89
+ fi
90
+
91
+ AUTOTUNE_DIR="${AUTOTUNE_DIR:-}"
92
+ AUTOTUNE_NODE_MODULES_DIR="$PROJECT_ROOT/node_modules/@dotsetlabs/autotune"
93
+ if [[ -z "$AUTOTUNE_DIR" ]]; then
94
+ if [[ -d "$AUTOTUNE_NODE_MODULES_DIR" ]]; then
95
+ AUTOTUNE_DIR="$AUTOTUNE_NODE_MODULES_DIR"
96
+ else
97
+ AUTOTUNE_DIR="$PROJECT_ROOT/../autotune"
98
+ fi
99
+ fi
100
+ if [[ -d "$AUTOTUNE_DIR" ]]; then
101
+ AUTOTUNE_DIR="$(cd "$AUTOTUNE_DIR" && pwd)"
102
+ log "Autotune directory found: $AUTOTUNE_DIR"
103
+ if [[ -d "$AUTOTUNE_DIR/src" ]]; then
104
+ run_as_user "cd $AUTOTUNE_DIR && npm install"
105
+ run_as_user "cd $AUTOTUNE_DIR && npm run build"
106
+ fi
107
+ else
108
+ warn "Autotune directory not found at $AUTOTUNE_DIR"
109
+ if [[ -d "$AUTOTUNE_NODE_MODULES_DIR" ]]; then
110
+ warn "Autotune is installed under node_modules."
111
+ warn "Set AUTOTUNE_DIR=$AUTOTUNE_NODE_MODULES_DIR to enable the systemd timer."
112
+ else
113
+ warn "Clone it beside DotClaw to enable automatic self-improvement"
114
+ fi
115
+ fi
116
+
117
+ AUTOTUNE_ENV="$CONFIG_DIR/autotune.env"
118
+ OPENROUTER_KEY="$(grep -E '^OPENROUTER_API_KEY=' "$ENV_FILE" 2>/dev/null | head -n1 | cut -d= -f2- || true)"
119
+ OPENROUTER_SITE_URL="$($NODE_PATH -e "const fs=require('fs');const p='$CONFIG_DIR/runtime.json';if(fs.existsSync(p)){const c=JSON.parse(fs.readFileSync(p,'utf8'));process.stdout.write(c?.agent?.openrouter?.siteUrl||'');}")"
120
+ OPENROUTER_SITE_NAME="$($NODE_PATH -e "const fs=require('fs');const p='$CONFIG_DIR/runtime.json';if(fs.existsSync(p)){const c=JSON.parse(fs.readFileSync(p,'utf8'));process.stdout.write(c?.agent?.openrouter?.siteName||'');}")"
121
+
122
+ if [[ -d "$AUTOTUNE_DIR" ]]; then
123
+ cat > "$AUTOTUNE_ENV" <<EOF_ENV
124
+ OPENROUTER_API_KEY=$OPENROUTER_KEY
125
+ OPENROUTER_SITE_URL=$OPENROUTER_SITE_URL
126
+ OPENROUTER_SITE_NAME=${OPENROUTER_SITE_NAME:-DotClaw}
127
+ AUTOTUNE_OUTPUT_DIR=$PROMPTS_DIR
128
+ AUTOTUNE_TRACE_DIR=$TRACES_DIR
129
+ AUTOTUNE_BEHAVIOR_ENABLED=1
130
+ AUTOTUNE_BEHAVIOR_CONFIG_PATH=$CONFIG_DIR/behavior.json
131
+ AUTOTUNE_BEHAVIOR_REPORT_DIR=$DATA_DIR
132
+ EOF_ENV
133
+ chmod 600 "$AUTOTUNE_ENV" || true
134
+ if [[ -z "$OPENROUTER_KEY" ]]; then
135
+ warn "OPENROUTER_API_KEY missing; Autotune will not evaluate or optimize"
136
+ fi
137
+ fi
138
+
139
+ if ! command -v systemctl >/dev/null 2>&1; then
140
+ warn "systemctl not found; skipping systemd setup"
141
+ exit 0
142
+ fi
143
+
144
+ DOTCLAW_SERVICE_CONTENT="[Unit]
145
+ Description=DotClaw Telegram Assistant
146
+ After=network-online.target docker.service
147
+ Wants=network-online.target docker.service
148
+
149
+ [Service]
150
+ Type=simple
151
+ User=$TARGET_USER
152
+ WorkingDirectory=$PROJECT_ROOT
153
+ Environment=NODE_ENV=production
154
+ Environment=HOME=$TARGET_HOME
155
+ Environment=DOTCLAW_HOME=$DOTCLAW_HOME
156
+ EnvironmentFile=$ENV_FILE
157
+ ExecStart=$NODE_PATH $PROJECT_ROOT/dist/index.js
158
+ Restart=on-failure
159
+ RestartSec=5
160
+ TimeoutStopSec=15
161
+ KillMode=mixed
162
+ KillSignal=SIGINT
163
+ StandardOutput=append:$LOGS_DIR/dotclaw.log
164
+ StandardError=append:$LOGS_DIR/dotclaw.error.log
165
+
166
+ [Install]
167
+ WantedBy=multi-user.target"
168
+
169
+ sudo tee /etc/systemd/system/dotclaw.service >/dev/null <<< "$DOTCLAW_SERVICE_CONTENT"
170
+
171
+ if [[ -d "$AUTOTUNE_DIR" ]]; then
172
+ AUTOTUNE_SERVICE_CONTENT="[Unit]
173
+ Description=Autotune Self-Improvement Pipeline
174
+ After=network-online.target
175
+
176
+ [Service]
177
+ Type=oneshot
178
+ User=$TARGET_USER
179
+ WorkingDirectory=$AUTOTUNE_DIR
180
+ Environment=NODE_ENV=production
181
+ Environment=HOME=$TARGET_HOME
182
+ EnvironmentFile=-$AUTOTUNE_ENV
183
+ ExecStart=$NODE_PATH $AUTOTUNE_DIR/dist/cli.js once
184
+
185
+ [Install]
186
+ WantedBy=multi-user.target"
187
+
188
+ AUTOTUNE_TIMER_CONTENT="[Unit]
189
+ Description=Run Autotune hourly
190
+
191
+ [Timer]
192
+ OnBootSec=5m
193
+ OnUnitActiveSec=1h
194
+ Persistent=true
195
+
196
+ [Install]
197
+ WantedBy=timers.target"
198
+
199
+ sudo tee /etc/systemd/system/autotune.service >/dev/null <<< "$AUTOTUNE_SERVICE_CONTENT"
200
+ sudo tee /etc/systemd/system/autotune.timer >/dev/null <<< "$AUTOTUNE_TIMER_CONTENT"
201
+ fi
202
+
203
+ sudo systemctl daemon-reload
204
+ sudo systemctl enable --now dotclaw.service
205
+
206
+ if [[ -d "$AUTOTUNE_DIR" ]]; then
207
+ sudo systemctl enable --now autotune.timer
208
+ if [[ -n "$OPENROUTER_KEY" ]]; then
209
+ sudo systemctl start autotune.service || true
210
+ fi
211
+ fi
212
+
213
+ log "Install complete"
214
+ log "DotClaw status:"
215
+ systemctl status dotclaw.service --no-pager || true
216
+ if [[ -d "$AUTOTUNE_DIR" ]]; then
217
+ log "Autotune timer status:"
218
+ systemctl status autotune.timer --no-pager || true
219
+ fi
@@ -0,0 +1,22 @@
1
+ [Unit]
2
+ Description=DotClaw Telegram Assistant
3
+ After=network-online.target docker.service
4
+ Wants=network-online.target docker.service
5
+
6
+ [Service]
7
+ Type=simple
8
+ User={{USER}}
9
+ WorkingDirectory={{DOTCLAW_HOME}}
10
+ Environment=NODE_ENV=production
11
+ Environment=DOTCLAW_HOME={{DOTCLAW_HOME}}
12
+ EnvironmentFile={{DOTCLAW_HOME}}/.env
13
+ ExecStart={{NODE_PATH}} {{PROJECT_ROOT}}/dist/index.js
14
+ Restart=on-failure
15
+ RestartSec=5
16
+ TimeoutStopSec=30
17
+ KillMode=process
18
+ StandardOutput=append:{{DOTCLAW_HOME}}/logs/dotclaw.log
19
+ StandardError=append:{{DOTCLAW_HOME}}/logs/dotclaw.error.log
20
+
21
+ [Install]
22
+ WantedBy=multi-user.target