personalclaw 0.1.0__py3-none-any.whl

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 (1049) hide show
  1. personalclaw/__init__.py +85 -0
  2. personalclaw/__main__.py +20 -0
  3. personalclaw/_sdk_deps.py +52 -0
  4. personalclaw/_ssl_compat.py +39 -0
  5. personalclaw/acp/__init__.py +31 -0
  6. personalclaw/acp/adapter.py +38 -0
  7. personalclaw/acp/cli_resolve.py +360 -0
  8. personalclaw/acp/client.py +639 -0
  9. personalclaw/acp/connection_pool.py +552 -0
  10. personalclaw/acp/dialect.py +434 -0
  11. personalclaw/acp/errors.py +32 -0
  12. personalclaw/acp/reader.py +197 -0
  13. personalclaw/acp/session.py +680 -0
  14. personalclaw/acp/translate.py +430 -0
  15. personalclaw/acp/transport.py +500 -0
  16. personalclaw/acp/types.py +163 -0
  17. personalclaw/acp_bundles/__init__.py +15 -0
  18. personalclaw/acp_bundles/_register.py +146 -0
  19. personalclaw/action_providers/__init__.py +23 -0
  20. personalclaw/action_providers/base.py +98 -0
  21. personalclaw/action_providers/bash_provider.py +184 -0
  22. personalclaw/action_providers/create_task_provider.py +76 -0
  23. personalclaw/action_providers/invoke_agent_provider.py +138 -0
  24. personalclaw/action_providers/notify_provider.py +66 -0
  25. personalclaw/action_providers/registry.py +70 -0
  26. personalclaw/action_providers/run_prompt_provider.py +245 -0
  27. personalclaw/action_providers/run_script_provider.py +100 -0
  28. personalclaw/action_providers/run_workflow_provider.py +183 -0
  29. personalclaw/action_providers/send_message_provider.py +110 -0
  30. personalclaw/action_providers/services.py +76 -0
  31. personalclaw/action_providers/template.py +37 -0
  32. personalclaw/after_turn_review.py +370 -0
  33. personalclaw/agent.py +1221 -0
  34. personalclaw/agent_metadata.py +55 -0
  35. personalclaw/agents/__init__.py +17 -0
  36. personalclaw/agents/defaults.py +410 -0
  37. personalclaw/agents/marketplace.py +332 -0
  38. personalclaw/agents/native/__init__.py +22 -0
  39. personalclaw/agents/native/approval.py +76 -0
  40. personalclaw/agents/native/builtin_tools.py +2154 -0
  41. personalclaw/agents/native/runtime.py +1110 -0
  42. personalclaw/agents/native/sdlc_tools.py +529 -0
  43. personalclaw/agents/native/tool_retrieval.py +337 -0
  44. personalclaw/agents/native/tools.py +197 -0
  45. personalclaw/agents/provider.py +228 -0
  46. personalclaw/agents/registry.py +29 -0
  47. personalclaw/app_cli.py +212 -0
  48. personalclaw/apps/__init__.py +24 -0
  49. personalclaw/apps/app_config.py +118 -0
  50. personalclaw/apps/app_crons.py +139 -0
  51. personalclaw/apps/app_manager.py +1015 -0
  52. personalclaw/apps/backend_runtime.py +341 -0
  53. personalclaw/apps/catalog.py +823 -0
  54. personalclaw/apps/dependency_ledger.py +182 -0
  55. personalclaw/apps/manager.py +234 -0
  56. personalclaw/apps/manifest.py +980 -0
  57. personalclaw/apps/mcp_bridge.py +161 -0
  58. personalclaw/apps/native/bash-action/app.json +37 -0
  59. personalclaw/apps/native/create-task-action/app.json +110 -0
  60. personalclaw/apps/native/filesystem-inbox/app.json +25 -0
  61. personalclaw/apps/native/invoke-agent-action/app.json +79 -0
  62. personalclaw/apps/native/native-agents/app.json +25 -0
  63. personalclaw/apps/native/native-knowledge/app.json +32 -0
  64. personalclaw/apps/native/native-prompts/app.json +27 -0
  65. personalclaw/apps/native/native-skills/app.json +43 -0
  66. personalclaw/apps/native/native-tasks/app.json +39 -0
  67. personalclaw/apps/native/native-vector-memory/app.json +37 -0
  68. personalclaw/apps/native/native-workflows/app.json +38 -0
  69. personalclaw/apps/native/notify-action/app.json +58 -0
  70. personalclaw/apps/native/personalclaw-artifacts/app.json +20 -0
  71. personalclaw/apps/native/personalclaw-inbox-tools/app.json +20 -0
  72. personalclaw/apps/native/personalclaw-knowledge-tools/app.json +20 -0
  73. personalclaw/apps/native/personalclaw-memory/app.json +20 -0
  74. personalclaw/apps/native/personalclaw-project-tools/app.json +20 -0
  75. personalclaw/apps/native/personalclaw-schedule-tools/app.json +20 -0
  76. personalclaw/apps/native/personalclaw-subagents/app.json +20 -0
  77. personalclaw/apps/native/personalclaw-tasks-tools/app.json +20 -0
  78. personalclaw/apps/native/personalclaw-tools/app.json +48 -0
  79. personalclaw/apps/native/personalclaw-workflows/app.json +20 -0
  80. personalclaw/apps/native/run-prompt-action/app.json +105 -0
  81. personalclaw/apps/native/run-script-action/app.json +46 -0
  82. personalclaw/apps/native/run-workflow-action/app.json +98 -0
  83. personalclaw/apps/native/send-message-action/app.json +64 -0
  84. personalclaw/apps/permissions.py +132 -0
  85. personalclaw/apps/prompt_registry.py +98 -0
  86. personalclaw/apps/prompt_seed.py +155 -0
  87. personalclaw/apps/source.py +120 -0
  88. personalclaw/artifacts/__init__.py +12 -0
  89. personalclaw/artifacts/handlers.py +492 -0
  90. personalclaw/artifacts/models.py +246 -0
  91. personalclaw/artifacts/native.py +752 -0
  92. personalclaw/artifacts/provider.py +173 -0
  93. personalclaw/artifacts/registry.py +44 -0
  94. personalclaw/atomic_write.py +91 -0
  95. personalclaw/auth/__init__.py +14 -0
  96. personalclaw/auth/modes.py +75 -0
  97. personalclaw/auth/oidc.py +240 -0
  98. personalclaw/autonomous_framing.py +56 -0
  99. personalclaw/autonudge.py +358 -0
  100. personalclaw/channel_delivery.py +175 -0
  101. personalclaw/channel_history.py +343 -0
  102. personalclaw/channel_transports/__init__.py +50 -0
  103. personalclaw/channel_transports/base.py +164 -0
  104. personalclaw/channel_transports/manager.py +99 -0
  105. personalclaw/channel_transports/reference_echo.py +103 -0
  106. personalclaw/channel_transports/webui.py +98 -0
  107. personalclaw/cli.py +1019 -0
  108. personalclaw/cli_chat.py +122 -0
  109. personalclaw/cli_commands.py +658 -0
  110. personalclaw/cli_config.py +155 -0
  111. personalclaw/cli_doctor.py +456 -0
  112. personalclaw/cli_server.py +768 -0
  113. personalclaw/cli_setup.py +412 -0
  114. personalclaw/concurrency.py +116 -0
  115. personalclaw/config/__init__.py +11 -0
  116. personalclaw/config/defaults.json +20 -0
  117. personalclaw/config/design/default-tokens.json +329 -0
  118. personalclaw/config/design/tokens.schema.json +110 -0
  119. personalclaw/config/loader.py +2127 -0
  120. personalclaw/config/prompt_snippets/agent-runtime-identity.md +3 -0
  121. personalclaw/config/prompt_snippets/agent-system-prompt-wrapper.md +3 -0
  122. personalclaw/config/prompt_snippets/agent-voice-layer.md +4 -0
  123. personalclaw/config/prompt_snippets/autonomous-turn-preamble.md +7 -0
  124. personalclaw/config/prompt_snippets/cancelled-turn-preamble.md +9 -0
  125. personalclaw/config/prompt_snippets/channel-thread-context.md +8 -0
  126. personalclaw/config/prompt_snippets/consolidation-commitments.md +1 -0
  127. personalclaw/config/prompt_snippets/consolidation-episodic.md +1 -0
  128. personalclaw/config/prompt_snippets/consolidation-history.md +1 -0
  129. personalclaw/config/prompt_snippets/consolidation-lessons.md +1 -0
  130. personalclaw/config/prompt_snippets/consolidation-new_skill.md +1 -0
  131. personalclaw/config/prompt_snippets/consolidation-preferences.md +1 -0
  132. personalclaw/config/prompt_snippets/consolidation-projects.md +1 -0
  133. personalclaw/config/prompt_snippets/consolidation-refined_skill.md +1 -0
  134. personalclaw/config/prompt_snippets/consolidation-self_persona.md +1 -0
  135. personalclaw/config/prompt_snippets/consolidation-semantic.md +1 -0
  136. personalclaw/config/prompt_snippets/critical-rules.md +5 -0
  137. personalclaw/config/prompt_snippets/cross-tab-context.md +4 -0
  138. personalclaw/config/prompt_snippets/diff-output.md +1 -0
  139. personalclaw/config/prompt_snippets/learned-corrections-header.md +2 -0
  140. personalclaw/config/prompt_snippets/loop-code-stage-directive.md +1 -0
  141. personalclaw/config/prompt_snippets/loop-goal-cycle-nudge.md +8 -0
  142. personalclaw/config/prompt_snippets/loop-goal-phase-directive.md +1 -0
  143. personalclaw/config/prompt_snippets/loop-orchestrator-directive.md +1 -0
  144. personalclaw/config/prompt_snippets/mcp-reconnect.md +1 -0
  145. personalclaw/config/prompt_snippets/memory-discipline.md +1 -0
  146. personalclaw/config/prompt_snippets/parallel-subagents.md +1 -0
  147. personalclaw/config/prompt_snippets/persona-lumon.md +46 -0
  148. personalclaw/config/prompt_snippets/project-context.md +3 -0
  149. personalclaw/config/prompt_snippets/prompt-expansion.md +6 -0
  150. personalclaw/config/prompt_snippets/safety-rules.md +4 -0
  151. personalclaw/config/prompt_snippets/session-context-wrapper.md +3 -0
  152. personalclaw/config/prompt_snippets/session-incognito.md +1 -0
  153. personalclaw/config/prompt_snippets/session-temporary.md +1 -0
  154. personalclaw/config/prompt_snippets/skills-syntax.md +1 -0
  155. personalclaw/config/prompt_snippets/subagent-orchestration.md +1 -0
  156. personalclaw/config/prompt_snippets/subagent-system-prefix.md +2 -0
  157. personalclaw/config/prompt_snippets/thread-history-header.md +2 -0
  158. personalclaw/config/prompt_snippets/widget-instructions.md +19 -0
  159. personalclaw/config/prompt_snippets/workspace-identity.md +8 -0
  160. personalclaw/config/prompts/background.md +35 -0
  161. personalclaw/config/prompts/chat.md +34 -0
  162. personalclaw/config/prompts/code.md +23 -0
  163. personalclaw/config/prompts/goal_loop.md +24 -0
  164. personalclaw/config/prompts/task-channel_title.md +7 -0
  165. personalclaw/config/prompts/task-code_classify.md +37 -0
  166. personalclaw/config/prompts/task-code_design_brief.md +25 -0
  167. personalclaw/config/prompts/task-code_step_brief.md +19 -0
  168. personalclaw/config/prompts/task-contradiction_judge.md +6 -0
  169. personalclaw/config/prompts/task-cycle_judge.md +16 -0
  170. personalclaw/config/prompts/task-cycle_judge_skeptic.md +18 -0
  171. personalclaw/config/prompts/task-design_design_brief.md +26 -0
  172. personalclaw/config/prompts/task-design_phases.md +5 -0
  173. personalclaw/config/prompts/task-design_step_brief.md +19 -0
  174. personalclaw/config/prompts/task-digest.md +37 -0
  175. personalclaw/config/prompts/task-eval_judge.md +16 -0
  176. personalclaw/config/prompts/task-folder_icon.md +1 -0
  177. personalclaw/config/prompts/task-goal_classify.md +27 -0
  178. personalclaw/config/prompts/task-goal_step_brief.md +17 -0
  179. personalclaw/config/prompts/task-grill_assess.md +3 -0
  180. personalclaw/config/prompts/task-grill_flat.md +6 -0
  181. personalclaw/config/prompts/task-grill_tree.md +10 -0
  182. personalclaw/config/prompts/task-history_compression.md +27 -0
  183. personalclaw/config/prompts/task-inbox-classify.md +21 -0
  184. personalclaw/config/prompts/task-inbox-digest.md +15 -0
  185. personalclaw/config/prompts/task-inbox-draft.md +12 -0
  186. personalclaw/config/prompts/task-memory_consolidation.md +8 -0
  187. personalclaw/config/prompts/task-nav_links.md +3 -0
  188. personalclaw/config/prompts/task-nl_to_cron.md +13 -0
  189. personalclaw/config/prompts/task-orchestrator_skill.md +42 -0
  190. personalclaw/config/prompts/task-parallel_worker_nudge.md +15 -0
  191. personalclaw/config/prompts/task-plan_consolidation.md +18 -0
  192. personalclaw/config/prompts/task-plan_rephrase.md +24 -0
  193. personalclaw/config/prompts/task-prompt_optimizer.md +34 -0
  194. personalclaw/config/prompts/task-research_step_brief.md +1 -0
  195. personalclaw/config/prompts/task-sdlc_stage_gate.md +14 -0
  196. personalclaw/config/prompts/task-side_chat.md +1 -0
  197. personalclaw/config/prompts/task-subgoal_judge.md +11 -0
  198. personalclaw/config/prompts/task-suggestions.md +17 -0
  199. personalclaw/config/prompts/task-title.md +5 -0
  200. personalclaw/config/schema.py +367 -0
  201. personalclaw/constants.py +9 -0
  202. personalclaw/context.py +1358 -0
  203. personalclaw/context_compaction.py +232 -0
  204. personalclaw/context_engine.py +260 -0
  205. personalclaw/context_management.py +620 -0
  206. personalclaw/dashboard/__init__.py +16 -0
  207. personalclaw/dashboard/_types.py +21 -0
  208. personalclaw/dashboard/attachment_extract.py +94 -0
  209. personalclaw/dashboard/chat.py +144 -0
  210. personalclaw/dashboard/chat_channel.py +151 -0
  211. personalclaw/dashboard/chat_folders.py +224 -0
  212. personalclaw/dashboard/chat_fork.py +199 -0
  213. personalclaw/dashboard/chat_handlers.py +2237 -0
  214. personalclaw/dashboard/chat_persistence.py +575 -0
  215. personalclaw/dashboard/chat_regenerate.py +271 -0
  216. personalclaw/dashboard/chat_retag.py +362 -0
  217. personalclaw/dashboard/chat_runner.py +2833 -0
  218. personalclaw/dashboard/chat_tags.py +443 -0
  219. personalclaw/dashboard/chat_title.py +363 -0
  220. personalclaw/dashboard/chat_undo.py +110 -0
  221. personalclaw/dashboard/chat_utils.py +643 -0
  222. personalclaw/dashboard/chat_voice.py +121 -0
  223. personalclaw/dashboard/embedding_reindex.py +194 -0
  224. personalclaw/dashboard/file_index.py +252 -0
  225. personalclaw/dashboard/handlers/__init__.py +321 -0
  226. personalclaw/dashboard/handlers/_shared.py +249 -0
  227. personalclaw/dashboard/handlers/agent_marketplace.py +290 -0
  228. personalclaw/dashboard/handlers/agents.py +936 -0
  229. personalclaw/dashboard/handlers/apps.py +970 -0
  230. personalclaw/dashboard/handlers/autonudge.py +172 -0
  231. personalclaw/dashboard/handlers/channels.py +57 -0
  232. personalclaw/dashboard/handlers/core.py +890 -0
  233. personalclaw/dashboard/handlers/embedding_reindex.py +135 -0
  234. personalclaw/dashboard/handlers/files.py +2803 -0
  235. personalclaw/dashboard/handlers/hooks.py +403 -0
  236. personalclaw/dashboard/handlers/knowledge.py +1699 -0
  237. personalclaw/dashboard/handlers/loop_routes.py +971 -0
  238. personalclaw/dashboard/handlers/mcp.py +1458 -0
  239. personalclaw/dashboard/handlers/memory.py +1173 -0
  240. personalclaw/dashboard/handlers/messaging.py +809 -0
  241. personalclaw/dashboard/handlers/model_downloads.py +137 -0
  242. personalclaw/dashboard/handlers/model_registry.py +443 -0
  243. personalclaw/dashboard/handlers/optimizer.py +98 -0
  244. personalclaw/dashboard/handlers/portability.py +180 -0
  245. personalclaw/dashboard/handlers/prompts.py +943 -0
  246. personalclaw/dashboard/handlers/providers.py +1067 -0
  247. personalclaw/dashboard/handlers/schedule.py +281 -0
  248. personalclaw/dashboard/handlers/search_registry.py +159 -0
  249. personalclaw/dashboard/handlers/sessions.py +596 -0
  250. personalclaw/dashboard/handlers/skills.py +695 -0
  251. personalclaw/dashboard/handlers/terminal.py +774 -0
  252. personalclaw/dashboard/handlers/tools.py +411 -0
  253. personalclaw/dashboard/handlers/triggers.py +753 -0
  254. personalclaw/dashboard/handlers/updates.py +1077 -0
  255. personalclaw/dashboard/handlers/updates_kind.py +219 -0
  256. personalclaw/dashboard/handlers/uploads.py +296 -0
  257. personalclaw/dashboard/handlers_inbox.py +510 -0
  258. personalclaw/dashboard/handlers_system.py +693 -0
  259. personalclaw/dashboard/model_downloads.py +356 -0
  260. personalclaw/dashboard/origin.py +388 -0
  261. personalclaw/dashboard/schedule_inject.py +89 -0
  262. personalclaw/dashboard/server.py +1604 -0
  263. personalclaw/dashboard/session_health.py +119 -0
  264. personalclaw/dashboard/side.py +209 -0
  265. personalclaw/dashboard/side_context.py +53 -0
  266. personalclaw/dashboard/side_prompts.py +36 -0
  267. personalclaw/dashboard/side_state.py +53 -0
  268. personalclaw/dashboard/sse.py +269 -0
  269. personalclaw/dashboard/state.py +1829 -0
  270. personalclaw/dashboard/token_auth.py +904 -0
  271. personalclaw/dashboard/ws.py +131 -0
  272. personalclaw/diarization/__init__.py +26 -0
  273. personalclaw/diarization/provider.py +74 -0
  274. personalclaw/diarization/registry.py +72 -0
  275. personalclaw/diarize.py +59 -0
  276. personalclaw/doc_parser.py +237 -0
  277. personalclaw/embedding_providers/__init__.py +5 -0
  278. personalclaw/embedding_providers/base.py +74 -0
  279. personalclaw/embedding_providers/registry.py +273 -0
  280. personalclaw/engagement_signals.py +161 -0
  281. personalclaw/env.py +25 -0
  282. personalclaw/eval/__init__.py +1 -0
  283. personalclaw/eval/judge.py +95 -0
  284. personalclaw/eval/runner.py +574 -0
  285. personalclaw/eval/scenario.py +147 -0
  286. personalclaw/eval/scenarios/context_accumulation.json +77 -0
  287. personalclaw/eval/scenarios/lesson_application.json +37 -0
  288. personalclaw/eval/scenarios/memory_recall_basic.json +64 -0
  289. personalclaw/eval/scenarios/smoke_test.json +42 -0
  290. personalclaw/event_triggers.py +250 -0
  291. personalclaw/frontend.py +206 -0
  292. personalclaw/fs_watch.py +133 -0
  293. personalclaw/gateway.py +3186 -0
  294. personalclaw/gateway_services.py +60 -0
  295. personalclaw/grill.py +231 -0
  296. personalclaw/heartbeat.py +247 -0
  297. personalclaw/history.py +1797 -0
  298. personalclaw/hooks.py +891 -0
  299. personalclaw/image_gen/__init__.py +12 -0
  300. personalclaw/image_gen/bundles/__init__.py +6 -0
  301. personalclaw/image_gen/openai_provider.py +253 -0
  302. personalclaw/image_gen/provider.py +125 -0
  303. personalclaw/image_gen/registry.py +208 -0
  304. personalclaw/image_gen/stub_provider.py +109 -0
  305. personalclaw/inbox.py +306 -0
  306. personalclaw/inbox_providers/__init__.py +30 -0
  307. personalclaw/inbox_providers/base.py +44 -0
  308. personalclaw/inbox_providers/filesystem_source.py +77 -0
  309. personalclaw/inbox_providers/native_source.py +146 -0
  310. personalclaw/inbox_service.py +444 -0
  311. personalclaw/knowledge/__init__.py +102 -0
  312. personalclaw/knowledge/connectors/__init__.py +11 -0
  313. personalclaw/knowledge/connectors/base.py +131 -0
  314. personalclaw/knowledge/connectors/web_url.py +163 -0
  315. personalclaw/knowledge/dedup.py +172 -0
  316. personalclaw/knowledge/embedder.py +126 -0
  317. personalclaw/knowledge/extract.py +112 -0
  318. personalclaw/knowledge/extractor.py +127 -0
  319. personalclaw/knowledge/ingest_queue.py +124 -0
  320. personalclaw/knowledge/insights.py +117 -0
  321. personalclaw/knowledge/intents.py +294 -0
  322. personalclaw/knowledge/llm_pool.py +234 -0
  323. personalclaw/knowledge/media.py +183 -0
  324. personalclaw/knowledge/pipeline/__init__.py +42 -0
  325. personalclaw/knowledge/pipeline/executor.py +326 -0
  326. personalclaw/knowledge/pipeline/graph.py +144 -0
  327. personalclaw/knowledge/pipeline/graphs.py +173 -0
  328. personalclaw/knowledge/pipeline/nodes/__init__.py +0 -0
  329. personalclaw/knowledge/pipeline/nodes/_llm.py +84 -0
  330. personalclaw/knowledge/pipeline/nodes/media_nodes.py +778 -0
  331. personalclaw/knowledge/pipeline/nodes/text_nodes.py +168 -0
  332. personalclaw/knowledge/pipeline/registry.py +49 -0
  333. personalclaw/knowledge/pipeline/runner.py +680 -0
  334. personalclaw/knowledge/pipeline/types.py +105 -0
  335. personalclaw/knowledge/readers.py +318 -0
  336. personalclaw/knowledge/retrieval.py +380 -0
  337. personalclaw/knowledge/store.py +1129 -0
  338. personalclaw/knowledge_providers/__init__.py +1 -0
  339. personalclaw/knowledge_providers/base.py +53 -0
  340. personalclaw/knowledge_providers/native/__init__.py +154 -0
  341. personalclaw/knowledge_providers/registry.py +62 -0
  342. personalclaw/learn.py +187 -0
  343. personalclaw/lexicon/__init__.py +24 -0
  344. personalclaw/lexicon/handlers.py +182 -0
  345. personalclaw/lexicon/phonetics.py +216 -0
  346. personalclaw/lexicon/service.py +299 -0
  347. personalclaw/lexicon/store.py +337 -0
  348. personalclaw/llm/__init__.py +51 -0
  349. personalclaw/llm/acp_agent.py +866 -0
  350. personalclaw/llm/acp_session_provider.py +255 -0
  351. personalclaw/llm/anthropic.py +562 -0
  352. personalclaw/llm/base.py +181 -0
  353. personalclaw/llm/capabilities.py +36 -0
  354. personalclaw/llm/catalog.py +435 -0
  355. personalclaw/llm/cleanup.py +26 -0
  356. personalclaw/llm/credentials.py +297 -0
  357. personalclaw/llm/events.py +79 -0
  358. personalclaw/llm/openai.py +523 -0
  359. personalclaw/llm/registry.py +418 -0
  360. personalclaw/llm/stream_tags.py +208 -0
  361. personalclaw/llm_helpers.py +395 -0
  362. personalclaw/local_models/__init__.py +36 -0
  363. personalclaw/local_models/provider.py +116 -0
  364. personalclaw/local_models/registry.py +243 -0
  365. personalclaw/loop/__init__.py +31 -0
  366. personalclaw/loop/classify.py +325 -0
  367. personalclaw/loop/code_classify.py +530 -0
  368. personalclaw/loop/code_plan_briefs.py +437 -0
  369. personalclaw/loop/design_plan_briefs.py +414 -0
  370. personalclaw/loop/design_tokens.py +220 -0
  371. personalclaw/loop/gates.py +147 -0
  372. personalclaw/loop/goal_meta.py +14 -0
  373. personalclaw/loop/goal_plan_briefs.py +165 -0
  374. personalclaw/loop/granularity.py +105 -0
  375. personalclaw/loop/instrument.py +157 -0
  376. personalclaw/loop/judge.py +422 -0
  377. personalclaw/loop/kinds/__init__.py +218 -0
  378. personalclaw/loop/kinds/design.py +551 -0
  379. personalclaw/loop/kinds/general.py +150 -0
  380. personalclaw/loop/kinds/goal.py +695 -0
  381. personalclaw/loop/kinds/research.py +287 -0
  382. personalclaw/loop/kinds/sdlc.py +1483 -0
  383. personalclaw/loop/lifecycle.py +45 -0
  384. personalclaw/loop/loop.py +270 -0
  385. personalclaw/loop/manager.py +600 -0
  386. personalclaw/loop/plan_walkthrough.py +375 -0
  387. personalclaw/loop/research_plan_briefs.py +91 -0
  388. personalclaw/loop/sdlc_meta.py +28 -0
  389. personalclaw/loop/store.py +1093 -0
  390. personalclaw/loop/tasks_link.py +439 -0
  391. personalclaw/loop/tick.py +352 -0
  392. personalclaw/loop/validation.py +229 -0
  393. personalclaw/loop/watchdog.py +638 -0
  394. personalclaw/loop/worktree.py +322 -0
  395. personalclaw/mcp_artifacts.py +737 -0
  396. personalclaw/mcp_client.py +636 -0
  397. personalclaw/mcp_core.py +966 -0
  398. personalclaw/mcp_discovery.py +941 -0
  399. personalclaw/mcp_memory.py +188 -0
  400. personalclaw/mcp_schedule.py +716 -0
  401. personalclaw/mcp_shared.py +404 -0
  402. personalclaw/mcp_subagents.py +240 -0
  403. personalclaw/mcp_workflows.py +388 -0
  404. personalclaw/media_catalogs.py +71 -0
  405. personalclaw/memory.py +370 -0
  406. personalclaw/memory_lint.py +153 -0
  407. personalclaw/memory_providers/__init__.py +5 -0
  408. personalclaw/memory_providers/base.py +135 -0
  409. personalclaw/memory_providers/filesystem.py +144 -0
  410. personalclaw/memory_providers/registry.py +47 -0
  411. personalclaw/memory_record.py +364 -0
  412. personalclaw/memory_service.py +1215 -0
  413. personalclaw/memory_vault.py +463 -0
  414. personalclaw/model_pricing.json +29 -0
  415. personalclaw/model_tokens.json +39 -0
  416. personalclaw/model_windows.py +79 -0
  417. personalclaw/net/__init__.py +38 -0
  418. personalclaw/net/client.py +211 -0
  419. personalclaw/net/guard.py +230 -0
  420. personalclaw/net/policy.py +99 -0
  421. personalclaw/nl_to_cron.py +71 -0
  422. personalclaw/orchestrator_skill.py +128 -0
  423. personalclaw/planning/__init__.py +41 -0
  424. personalclaw/planning/runner.py +210 -0
  425. personalclaw/planning/session.py +239 -0
  426. personalclaw/portability.py +314 -0
  427. personalclaw/preference_facets.py +324 -0
  428. personalclaw/pricing.py +90 -0
  429. personalclaw/projects.py +132 -0
  430. personalclaw/prompt_providers/__init__.py +56 -0
  431. personalclaw/prompt_providers/base.py +286 -0
  432. personalclaw/prompt_providers/catalog.py +1506 -0
  433. personalclaw/prompt_providers/engine.py +871 -0
  434. personalclaw/prompt_providers/native_provider.py +480 -0
  435. personalclaw/prompt_providers/registry.py +55 -0
  436. personalclaw/prompt_providers/runtime.py +119 -0
  437. personalclaw/provider_registry.py +26 -0
  438. personalclaw/providers/__init__.py +11 -0
  439. personalclaw/providers/entity_routes.py +278 -0
  440. personalclaw/providers/instance_routes.py +364 -0
  441. personalclaw/providers/instances.py +144 -0
  442. personalclaw/providers/loader.py +296 -0
  443. personalclaw/providers/mcp_instances.py +164 -0
  444. personalclaw/providers/media_scanners.py +78 -0
  445. personalclaw/providers/prompt_use_cases.py +189 -0
  446. personalclaw/providers/provider_bridge.py +939 -0
  447. personalclaw/providers/registry.py +691 -0
  448. personalclaw/providers/routes.py +228 -0
  449. personalclaw/providers/settings.py +95 -0
  450. personalclaw/providers/use_cases.py +429 -0
  451. personalclaw/py.typed +1 -0
  452. personalclaw/sandbox.py +669 -0
  453. personalclaw/schedule.py +1473 -0
  454. personalclaw/schedule_history.py +288 -0
  455. personalclaw/schedule_script.py +296 -0
  456. personalclaw/schedule_trigger.py +43 -0
  457. personalclaw/sdk/__init__.py +28 -0
  458. personalclaw/sdk/acp.py +25 -0
  459. personalclaw/sdk/action.py +13 -0
  460. personalclaw/sdk/channel.py +144 -0
  461. personalclaw/sdk/cli.py +77 -0
  462. personalclaw/sdk/credentials.py +11 -0
  463. personalclaw/sdk/diarization.py +23 -0
  464. personalclaw/sdk/embedding.py +12 -0
  465. personalclaw/sdk/image.py +23 -0
  466. personalclaw/sdk/inbox.py +12 -0
  467. personalclaw/sdk/knowledge.py +13 -0
  468. personalclaw/sdk/local_model.py +13 -0
  469. personalclaw/sdk/manifest.py +17 -0
  470. personalclaw/sdk/mcp.py +18 -0
  471. personalclaw/sdk/memory.py +11 -0
  472. personalclaw/sdk/model.py +115 -0
  473. personalclaw/sdk/net.py +44 -0
  474. personalclaw/sdk/prompt.py +21 -0
  475. personalclaw/sdk/provider_helpers.py +346 -0
  476. personalclaw/sdk/search.py +36 -0
  477. personalclaw/sdk/security.py +11 -0
  478. personalclaw/sdk/settings.py +11 -0
  479. personalclaw/sdk/skill.py +24 -0
  480. personalclaw/sdk/stt.py +26 -0
  481. personalclaw/sdk/tool.py +27 -0
  482. personalclaw/sdk/tts.py +13 -0
  483. personalclaw/sdk/util.py +19 -0
  484. personalclaw/sdk/video.py +22 -0
  485. personalclaw/search_providers/__init__.py +28 -0
  486. personalclaw/search_providers/base.py +235 -0
  487. personalclaw/search_providers/registry.py +212 -0
  488. personalclaw/search_providers/use_cases.py +101 -0
  489. personalclaw/security.py +964 -0
  490. personalclaw/seed.py +376 -0
  491. personalclaw/sel.py +448 -0
  492. personalclaw/service/__init__.py +42 -0
  493. personalclaw/service/common.py +74 -0
  494. personalclaw/service/controller.py +134 -0
  495. personalclaw/service/linux.py +255 -0
  496. personalclaw/service/macos.py +184 -0
  497. personalclaw/session.py +1833 -0
  498. personalclaw/session_map.py +217 -0
  499. personalclaw/session_pid.py +654 -0
  500. personalclaw/session_restrictions.py +62 -0
  501. personalclaw/session_workspace.py +118 -0
  502. personalclaw/skills/__init__.py +32 -0
  503. personalclaw/skills/bundled/__init__.py +6 -0
  504. personalclaw/skills/bundled/artifacts/SKILL.md +90 -0
  505. personalclaw/skills/bundled/delegation/SKILL.md +76 -0
  506. personalclaw/skills/bundled/editorial-document/SKILL.md +101 -0
  507. personalclaw/skills/bundled/grill/SKILL.md +40 -0
  508. personalclaw/skills/bundled/infographic-syntax/SKILL.md +89 -0
  509. personalclaw/skills/bundled/knowledge-grounding/SKILL.md +70 -0
  510. personalclaw/skills/bundled/loop-worker/SKILL.md +150 -0
  511. personalclaw/skills/bundled/memory-discipline/SKILL.md +83 -0
  512. personalclaw/skills/bundled/pclaw-features/SKILL.md +100 -0
  513. personalclaw/skills/bundled/task-and-project/SKILL.md +85 -0
  514. personalclaw/skills/bundled/visual-output/SKILL.md +283 -0
  515. personalclaw/skills/curator.py +219 -0
  516. personalclaw/skills/ephemeral.py +247 -0
  517. personalclaw/skills/loader.py +807 -0
  518. personalclaw/skills/marketplace.py +593 -0
  519. personalclaw/skills/native.py +130 -0
  520. personalclaw/skills/proposals.py +202 -0
  521. personalclaw/skills/surfacing.py +273 -0
  522. personalclaw/skills/usage.py +128 -0
  523. personalclaw/snapshot.py +713 -0
  524. personalclaw/static/dist/assets/AgentsSection-D2HNpK3H.js +1 -0
  525. personalclaw/static/dist/assets/AppHostPage-DUAFOu8u.js +1 -0
  526. personalclaw/static/dist/assets/AppsSection-DcuzwiZk.js +1 -0
  527. personalclaw/static/dist/assets/CockpitPromptBar-CJNPc2c-.js +2 -0
  528. personalclaw/static/dist/assets/CodeSection-BbzIcbAr.js +10 -0
  529. personalclaw/static/dist/assets/Combobox-C_YTjfW8.js +1 -0
  530. personalclaw/static/dist/assets/DagView-CcwKyxIr.js +1 -0
  531. personalclaw/static/dist/assets/DashboardPage-BXyEbQz9.js +1 -0
  532. personalclaw/static/dist/assets/DesignCockpitPage-B-RSWO5P.js +5 -0
  533. personalclaw/static/dist/assets/FilesSection-Dg8qsPgr.js +1 -0
  534. personalclaw/static/dist/assets/FilterMenu-lHdXNbj4.js +1 -0
  535. personalclaw/static/dist/assets/InboxPage-Yucf6lfs.js +1 -0
  536. personalclaw/static/dist/assets/InfographicView-P3M7GFR5.js +1 -0
  537. personalclaw/static/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  538. personalclaw/static/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  539. personalclaw/static/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  540. personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  541. personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  542. personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  543. personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  544. personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  545. personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  546. personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  547. personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  548. personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  549. personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  550. personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  551. personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  552. personalclaw/static/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  553. personalclaw/static/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  554. personalclaw/static/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  555. personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  556. personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  557. personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  558. personalclaw/static/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  559. personalclaw/static/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  560. personalclaw/static/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  561. personalclaw/static/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  562. personalclaw/static/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  563. personalclaw/static/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  564. personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  565. personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  566. personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  567. personalclaw/static/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  568. personalclaw/static/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  569. personalclaw/static/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  570. personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  571. personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  572. personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  573. personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  574. personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  575. personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  576. personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  577. personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  578. personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  579. personalclaw/static/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  580. personalclaw/static/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  581. personalclaw/static/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  582. personalclaw/static/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  583. personalclaw/static/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  584. personalclaw/static/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  585. personalclaw/static/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  586. personalclaw/static/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  587. personalclaw/static/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  588. personalclaw/static/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  589. personalclaw/static/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  590. personalclaw/static/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  591. personalclaw/static/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  592. personalclaw/static/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  593. personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  594. personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  595. personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  596. personalclaw/static/dist/assets/KnowledgeSection-DyEutiSq.js +2 -0
  597. personalclaw/static/dist/assets/ListControls-CQnCbk7R.js +1 -0
  598. personalclaw/static/dist/assets/LoopSection-D2UGH5AC.js +1 -0
  599. personalclaw/static/dist/assets/LoopsSection-BGtXgwiH.js +6 -0
  600. personalclaw/static/dist/assets/Markdown-BDVlMqTq.js +302 -0
  601. personalclaw/static/dist/assets/Markdown-ClQbWekD.css +1 -0
  602. personalclaw/static/dist/assets/Modal-Z5bGqyVe.js +1 -0
  603. personalclaw/static/dist/assets/NotificationsPage-DUTcSPVN.js +1 -0
  604. personalclaw/static/dist/assets/PlanningArtifactDoc-DJsfB5L5.js +4 -0
  605. personalclaw/static/dist/assets/Popover-Chkebw3m.js +1 -0
  606. personalclaw/static/dist/assets/ProjectsSection-Dv6qfIbT.js +1 -0
  607. personalclaw/static/dist/assets/PromptsSection-DnY8b1wQ.js +3 -0
  608. personalclaw/static/dist/assets/Segmented-CJyXjRoh.js +1 -0
  609. personalclaw/static/dist/assets/SettingsPage-D6wr5li6.js +4 -0
  610. personalclaw/static/dist/assets/SkillsPage-DAItfKJY.js +9 -0
  611. personalclaw/static/dist/assets/TasksSection-CNqdaJY9.js +2 -0
  612. personalclaw/static/dist/assets/TerminalPage-C55Q1OWK.js +1 -0
  613. personalclaw/static/dist/assets/ToolsPage-CydPomPB.js +2 -0
  614. personalclaw/static/dist/assets/TopBar-BMJKDgFq.js +1 -0
  615. personalclaw/static/dist/assets/TriggersSection-x9BE94nD.js +1 -0
  616. personalclaw/static/dist/assets/WorkbenchLayout-BbX58Jyp.js +1 -0
  617. personalclaw/static/dist/assets/WorkflowsSection-B9GBIERe.js +1 -0
  618. personalclaw/static/dist/assets/WorkspacePicker-CFgweODu.js +1 -0
  619. personalclaw/static/dist/assets/_baseClone-CgC5_fVW.js +1 -0
  620. personalclaw/static/dist/assets/abap-08VXUWAP.js +1 -0
  621. personalclaw/static/dist/assets/abnfDiagram-VRR7QNED-CeR1eIrQ.js +1 -0
  622. personalclaw/static/dist/assets/activeProject-X97a4kX5.js +1 -0
  623. personalclaw/static/dist/assets/activity-B72Ydod2.js +1 -0
  624. personalclaw/static/dist/assets/agents-BoQgSqd8.js +1 -0
  625. personalclaw/static/dist/assets/anchor-Bb1uxqwU.js +1 -0
  626. personalclaw/static/dist/assets/apex-BWPQTe0t.js +1 -0
  627. personalclaw/static/dist/assets/api-CACQRbCe.js +10 -0
  628. personalclaw/static/dist/assets/appConfigForm-CczWhwqZ.js +1 -0
  629. personalclaw/static/dist/assets/appIcon-lqagLloG.js +1 -0
  630. personalclaw/static/dist/assets/arc-Bi22H63W.js +1 -0
  631. personalclaw/static/dist/assets/architecture-TIHT7OUA-BWqzHezU.js +1 -0
  632. personalclaw/static/dist/assets/architectureDiagram-ZJ3FMSHR-BVn7mefo.js +36 -0
  633. personalclaw/static/dist/assets/array-BifhSqXX.js +1 -0
  634. personalclaw/static/dist/assets/arrow-left-DEdVu4qO.js +1 -0
  635. personalclaw/static/dist/assets/arrow-right-cpbZdypc.js +1 -0
  636. personalclaw/static/dist/assets/arrow-up-right-zqcFzg4c.js +1 -0
  637. personalclaw/static/dist/assets/azcli-Bc_sGQ0U.js +1 -0
  638. personalclaw/static/dist/assets/bat-i0X4ZdIN.js +1 -0
  639. personalclaw/static/dist/assets/bell-B8EZZbF_.js +1 -0
  640. personalclaw/static/dist/assets/bicep-B5-_aFwp.js +2 -0
  641. personalclaw/static/dist/assets/blockDiagram-677ZJIJ3-CDXmXQFa.js +132 -0
  642. personalclaw/static/dist/assets/book-open-DQTctPc5.js +1 -0
  643. personalclaw/static/dist/assets/bot-BxwpJWV5.js +1 -0
  644. personalclaw/static/dist/assets/box-CuRMP9Xp.js +1 -0
  645. personalclaw/static/dist/assets/boxes-k5hb8Rv-.js +1 -0
  646. personalclaw/static/dist/assets/c4Diagram-LMCZKHZV-OiOQafWV.js +10 -0
  647. personalclaw/static/dist/assets/cameligo-DMUM7wLl.js +1 -0
  648. personalclaw/static/dist/assets/channel-XtWxHV5d.js +1 -0
  649. personalclaw/static/dist/assets/chart-column-CY3ge8RW.js +1 -0
  650. personalclaw/static/dist/assets/check-check-C-nMRcrO.js +1 -0
  651. personalclaw/static/dist/assets/chevron-right-C9ZrDoNw.js +1 -0
  652. personalclaw/static/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  653. personalclaw/static/dist/assets/chunk-32BRIVSS-DUyytNlh.js +1 -0
  654. personalclaw/static/dist/assets/chunk-52WLFC77-E5R8UKPa.js +10 -0
  655. personalclaw/static/dist/assets/chunk-5FCAYU7R-DNtJmW0j.js +1 -0
  656. personalclaw/static/dist/assets/chunk-5HE753X5-o8-OCfIL.js +1 -0
  657. personalclaw/static/dist/assets/chunk-5JV3BV7I-DKfYBAeY.js +1 -0
  658. personalclaw/static/dist/assets/chunk-5TONJI2A-DOX2waSJ.js +2 -0
  659. personalclaw/static/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  660. personalclaw/static/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  661. personalclaw/static/dist/assets/chunk-BIQX33UG-CuPbkyWp.js +1 -0
  662. personalclaw/static/dist/assets/chunk-C7G6YPKG-By7THYkI.js +1 -0
  663. personalclaw/static/dist/assets/chunk-CQNSW5MT-BbEh_krl.js +1 -0
  664. personalclaw/static/dist/assets/chunk-CYSBUYHQ-CbOq7Rc1.js +1 -0
  665. personalclaw/static/dist/assets/chunk-EMLP6XTP-BoneA0Uo.js +1 -0
  666. personalclaw/static/dist/assets/chunk-EX3LRPZG-BVpNXdQl.js +231 -0
  667. personalclaw/static/dist/assets/chunk-FWX5IMBZ-_FzoCdFq.js +2 -0
  668. personalclaw/static/dist/assets/chunk-HOUHSVGY-CA9JB66F.js +1 -0
  669. personalclaw/static/dist/assets/chunk-ICXQ74PX-7k2dcNNp.js +2 -0
  670. personalclaw/static/dist/assets/chunk-JG7HCLWE-Dk4_aECj.js +2 -0
  671. personalclaw/static/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  672. personalclaw/static/dist/assets/chunk-KEIR6QF5-Dj-OpFgW.js +161 -0
  673. personalclaw/static/dist/assets/chunk-MOJQB5TN-UrNo9Dl9.js +88 -0
  674. personalclaw/static/dist/assets/chunk-MOZMSUNE-BgA8jCvb.js +1 -0
  675. personalclaw/static/dist/assets/chunk-OGEWGWER-8nh2CNLl.js +1 -0
  676. personalclaw/static/dist/assets/chunk-OSBZ3O6U-CX9EQ5t2.js +1 -0
  677. personalclaw/static/dist/assets/chunk-PUDLZKDR-DHnl7Vbn.js +156 -0
  678. personalclaw/static/dist/assets/chunk-Q4XR5HBZ-BNAup0DB.js +70 -0
  679. personalclaw/static/dist/assets/chunk-QBLGF6JB-C9zGMqvP.js +1 -0
  680. personalclaw/static/dist/assets/chunk-R7FJI6CG-BpBhcF6R.js +1 -0
  681. personalclaw/static/dist/assets/chunk-RYQCIY6F-wIahH7Y2.js +1 -0
  682. personalclaw/static/dist/assets/chunk-U6XO7XAA-CR0BSRFR.js +2 -0
  683. personalclaw/static/dist/assets/chunk-V7JOEXUC-BwRjI2ve.js +206 -0
  684. personalclaw/static/dist/assets/chunk-VAUOI2AC-DQS1S8BI.js +1 -0
  685. personalclaw/static/dist/assets/chunk-VR4S4FIN-5LkGPPTo.js +1 -0
  686. personalclaw/static/dist/assets/chunk-WYO6CB5R-CvPO17RH.js +127 -0
  687. personalclaw/static/dist/assets/chunk-X3CZISLH-ojMe8fWI.js +1 -0
  688. personalclaw/static/dist/assets/chunk-XXDRQBXY-Bf8QdBI1.js +1 -0
  689. personalclaw/static/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  690. personalclaw/static/dist/assets/chunk-YOTPTUD7-CjHV8V6f.js +1 -0
  691. personalclaw/static/dist/assets/chunk-ZGVPDNZ5-Dq9tgF8F.js +62 -0
  692. personalclaw/static/dist/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
  693. personalclaw/static/dist/assets/chunkedUpload-8_bGV0pg.js +1 -0
  694. personalclaw/static/dist/assets/circle-CyhPObT_.js +1 -0
  695. personalclaw/static/dist/assets/circle-check-D2FbfCh0.js +1 -0
  696. personalclaw/static/dist/assets/circle-question-mark-BIpy_bwO.js +1 -0
  697. personalclaw/static/dist/assets/circle-slash-BqxQ1K2m.js +1 -0
  698. personalclaw/static/dist/assets/circle-x-CyHlcywd.js +1 -0
  699. personalclaw/static/dist/assets/classDiagram-OUVF2IWQ-bwJJ-BcI.js +1 -0
  700. personalclaw/static/dist/assets/classDiagram-v2-EOCWNBFH-bwJJ-BcI.js +1 -0
  701. personalclaw/static/dist/assets/clock-H9P_EVQD.js +1 -0
  702. personalclaw/static/dist/assets/clojure-Cm7r79vr.js +1 -0
  703. personalclaw/static/dist/assets/code-xml-zRCJsUiW.js +1 -0
  704. personalclaw/static/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  705. personalclaw/static/dist/assets/coffee-Ba7i2nA0.js +1 -0
  706. personalclaw/static/dist/assets/contentTypes-ZqeuxEnU.js +1 -0
  707. personalclaw/static/dist/assets/copy-COewHhMx.js +1 -0
  708. personalclaw/static/dist/assets/corner-down-left-DViVpu4S.js +1 -0
  709. personalclaw/static/dist/assets/corner-down-right-BfJQ4oRS.js +1 -0
  710. personalclaw/static/dist/assets/cose-bilkent-JH36ORCC-BXt3jwU7.js +1 -0
  711. personalclaw/static/dist/assets/cpp-C7h46wYY.js +1 -0
  712. personalclaw/static/dist/assets/cpu-Bb2_4j_A.js +1 -0
  713. personalclaw/static/dist/assets/csharp-BKxtCVv1.js +1 -0
  714. personalclaw/static/dist/assets/csp-bTuwJoIa.js +1 -0
  715. personalclaw/static/dist/assets/css-DIMkf-bt.js +3 -0
  716. personalclaw/static/dist/assets/css.worker-yKcq13f2.js +89 -0
  717. personalclaw/static/dist/assets/cssMode-DEsrBFiI.js +1 -0
  718. personalclaw/static/dist/assets/cynefin-VYW2F7L2-4m18BxUG.js +1 -0
  719. personalclaw/static/dist/assets/cynefinDiagram-TSTJHNR4-Cc660zMB.js +62 -0
  720. personalclaw/static/dist/assets/cypher-CVaqCwHa.js +1 -0
  721. personalclaw/static/dist/assets/cytoscape.esm-CQFVGiJu.js +321 -0
  722. personalclaw/static/dist/assets/dagre-BGeTjBId.js +1 -0
  723. personalclaw/static/dist/assets/dagre-VKFMJZFB-ry8Xesg8.js +4 -0
  724. personalclaw/static/dist/assets/dart-onAF5SnQ.js +1 -0
  725. personalclaw/static/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
  726. personalclaw/static/dist/assets/diagram-FQU43EPY-CjwH52DD.js +3 -0
  727. personalclaw/static/dist/assets/diagram-G47NLZAW-C5mVN3-R.js +24 -0
  728. personalclaw/static/dist/assets/diagram-NH7WQ7WH-k4VKpPeF.js +24 -0
  729. personalclaw/static/dist/assets/diagram-OA4YK3LP-CM7K4mor.js +30 -0
  730. personalclaw/static/dist/assets/diagram-WEI45ONY-De1xw6DL.js +41 -0
  731. personalclaw/static/dist/assets/dialog-BahzhVcv.js +1 -0
  732. personalclaw/static/dist/assets/dialogStore-BEZvW6c8.js +1 -0
  733. personalclaw/static/dist/assets/dist-CjNnd4gY.js +1 -0
  734. personalclaw/static/dist/assets/dist-DLiMshR7.js +11 -0
  735. personalclaw/static/dist/assets/dockerfile-DZFCIeNp.js +1 -0
  736. personalclaw/static/dist/assets/download-B5zzl5uZ.js +1 -0
  737. personalclaw/static/dist/assets/download-z7ADXQw_.js +1 -0
  738. personalclaw/static/dist/assets/ebnfDiagram-CCIWWBDH-BJD6kZPa.js +1 -0
  739. personalclaw/static/dist/assets/ecl-D05T4iGw.js +1 -0
  740. personalclaw/static/dist/assets/editor-Br_kD0ds.css +1 -0
  741. personalclaw/static/dist/assets/editor.api2-4ndOupAA.js +872 -0
  742. personalclaw/static/dist/assets/editor.worker-tytyn86m.js +26 -0
  743. personalclaw/static/dist/assets/elixir-6RTg0lbw.js +1 -0
  744. personalclaw/static/dist/assets/ellipsis-BAF3NCVx.js +1 -0
  745. personalclaw/static/dist/assets/erDiagram-Q63AITRT-BURNYK88.js +85 -0
  746. personalclaw/static/dist/assets/esm-nNdQxdC0.js +596 -0
  747. personalclaw/static/dist/assets/eventmodeling-45OFAUF4-Dp0gpjhg.js +1 -0
  748. personalclaw/static/dist/assets/external-link-BFMb3_Mp.js +1 -0
  749. personalclaw/static/dist/assets/eye-TdldIA27.js +1 -0
  750. personalclaw/static/dist/assets/file-BEKmT1PY.js +1 -0
  751. personalclaw/static/dist/assets/file-box-Bl1VI3Ye.js +1 -0
  752. personalclaw/static/dist/assets/file-code-corner-QupU9_qt.js +1 -0
  753. personalclaw/static/dist/assets/file-plus-corner-CO5vspMV.js +1 -0
  754. personalclaw/static/dist/assets/file-text-x9wkcuEf.js +1 -0
  755. personalclaw/static/dist/assets/files-CqnUOG-O.js +1 -0
  756. personalclaw/static/dist/assets/filesData-Cey9VAFK.js +1 -0
  757. personalclaw/static/dist/assets/flow9-C5_-GSwl.js +1 -0
  758. personalclaw/static/dist/assets/flowDiagram-23GEKE2U-DJULeRHJ.js +1 -0
  759. personalclaw/static/dist/assets/folder-BegDsmu3.js +1 -0
  760. personalclaw/static/dist/assets/folder-kanban-CtQWqQ8-.js +1 -0
  761. personalclaw/static/dist/assets/folder-open-DUEh06xk.js +1 -0
  762. personalclaw/static/dist/assets/folder-plus-Bio_dTbt.js +1 -0
  763. personalclaw/static/dist/assets/folder-tree-CyuoHQPR.js +1 -0
  764. personalclaw/static/dist/assets/freemarker2-CELlTDJ2.js +3 -0
  765. personalclaw/static/dist/assets/fsharp-C8Ef5oNN.js +1 -0
  766. personalclaw/static/dist/assets/ganttDiagram-NO4QXBWP-BuqshviA.js +292 -0
  767. personalclaw/static/dist/assets/gauge-Yx9eA7LL.js +1 -0
  768. personalclaw/static/dist/assets/git-branch-xBpxiFXO.js +1 -0
  769. personalclaw/static/dist/assets/gitGraph-TEB2WS4Q-Do0SQOtM.js +1 -0
  770. personalclaw/static/dist/assets/gitGraphDiagram-IHSO6WYX-CKjwC-Eh.js +106 -0
  771. personalclaw/static/dist/assets/go-C-y9NEjX.js +1 -0
  772. personalclaw/static/dist/assets/graphlib-C9B6zziv.js +1 -0
  773. personalclaw/static/dist/assets/graphql-fmXr3nnJ.js +1 -0
  774. personalclaw/static/dist/assets/grip-vertical-C8pqE5eO.js +1 -0
  775. personalclaw/static/dist/assets/handlebars-NEjHJ7o_.js +1 -0
  776. personalclaw/static/dist/assets/hash-Bs9Rl_OS.js +1 -0
  777. personalclaw/static/dist/assets/hcl-CpzslTdj.js +1 -0
  778. personalclaw/static/dist/assets/hierarchy-CqMyrAty.js +1 -0
  779. personalclaw/static/dist/assets/html-CA10zN5A.js +1 -0
  780. personalclaw/static/dist/assets/html.worker-DSJ9zmd7.js +502 -0
  781. personalclaw/static/dist/assets/htmlMode-TrYTXwZp.js +1 -0
  782. personalclaw/static/dist/assets/image-C9polQzp.js +1 -0
  783. personalclaw/static/dist/assets/image-off-BMFKtweh.js +1 -0
  784. personalclaw/static/dist/assets/inbox-D5YaLjhA.js +1 -0
  785. personalclaw/static/dist/assets/index-BYyVBFnD.css +2 -0
  786. personalclaw/static/dist/assets/index-BnqfrCeD.js +270 -0
  787. personalclaw/static/dist/assets/info-Cssn46_l.js +1 -0
  788. personalclaw/static/dist/assets/info-DKCQHKI2-DIc7uC4I.js +1 -0
  789. personalclaw/static/dist/assets/infoDiagram-FWYZ7A6U-aDwx_tBf.js +2 -0
  790. personalclaw/static/dist/assets/ini-sBoK_t0W.js +1 -0
  791. personalclaw/static/dist/assets/init-D6jRqBbL.js +1 -0
  792. personalclaw/static/dist/assets/isArrayLikeObject-DAE2nXMg.js +1 -0
  793. personalclaw/static/dist/assets/ishikawaDiagram-FXEZZL3T-BL-cQm7s.js +70 -0
  794. personalclaw/static/dist/assets/java-BEtHBSE6.js +1 -0
  795. personalclaw/static/dist/assets/javascript-B1gDmwzS.js +1 -0
  796. personalclaw/static/dist/assets/journeyDiagram-5HDEW3XC-CM5TyC5t.js +139 -0
  797. personalclaw/static/dist/assets/json.worker-Oa9UrkKE.js +58 -0
  798. personalclaw/static/dist/assets/jsonMode-CoFNTEgP.js +7 -0
  799. personalclaw/static/dist/assets/jsx-runtime-DkSmJVHh.js +1 -0
  800. personalclaw/static/dist/assets/julia-Bri6UV-V.js +1 -0
  801. personalclaw/static/dist/assets/kanban-definition-HUTT4EX6-lXFNSEO-.js +89 -0
  802. personalclaw/static/dist/assets/katex-B7rAX3Vi.js +257 -0
  803. personalclaw/static/dist/assets/kotlin-BOotOW0E.js +1 -0
  804. personalclaw/static/dist/assets/less-B9JPFI3C.js +2 -0
  805. personalclaw/static/dist/assets/lexon-CfSJPG6W.js +1 -0
  806. personalclaw/static/dist/assets/lightbulb-hxqtxQSr.js +1 -0
  807. personalclaw/static/dist/assets/line-CyKHd6T7.js +1 -0
  808. personalclaw/static/dist/assets/linear-1zh3NrGZ.js +1 -0
  809. personalclaw/static/dist/assets/linear-BuJiVv47.js +1 -0
  810. personalclaw/static/dist/assets/link-2-DhS_lcQM.js +1 -0
  811. personalclaw/static/dist/assets/link-CoAbfcu_.js +1 -0
  812. personalclaw/static/dist/assets/liquid-BY6hCUXG.js +1 -0
  813. personalclaw/static/dist/assets/list-checks-CXSudmRo.js +1 -0
  814. personalclaw/static/dist/assets/list-ordered-DbvnvdzZ.js +1 -0
  815. personalclaw/static/dist/assets/loader-circle-DHWKh5M0.js +1 -0
  816. personalclaw/static/dist/assets/lock-DXTiRPy-.js +1 -0
  817. personalclaw/static/dist/assets/loopKind-Dodoh8fQ.js +1 -0
  818. personalclaw/static/dist/assets/loopStatus-DWXaenKM.js +1 -0
  819. personalclaw/static/dist/assets/loopStatusMeta-CODHi2sz.js +1 -0
  820. personalclaw/static/dist/assets/lspLanguageFeatures-ira2aEJh.js +4 -0
  821. personalclaw/static/dist/assets/lua-CsQS60Ue.js +1 -0
  822. personalclaw/static/dist/assets/m3-D-oSqn_W.js +1 -0
  823. personalclaw/static/dist/assets/map-sKxWa81l.js +1 -0
  824. personalclaw/static/dist/assets/markdown-Cimd5fb3.js +1 -0
  825. personalclaw/static/dist/assets/math-Bi_r_ZWc.js +1 -0
  826. personalclaw/static/dist/assets/mdx-BNx0xr3N.js +1 -0
  827. personalclaw/static/dist/assets/merge-Ci_rv-un.js +1 -0
  828. personalclaw/static/dist/assets/mermaid-parser.core-CMbO70Iy.js +4 -0
  829. personalclaw/static/dist/assets/mermaid.core-CU3bi7fi.js +11 -0
  830. personalclaw/static/dist/assets/message-square-D9ze_qUH.js +1 -0
  831. personalclaw/static/dist/assets/message-square-plus-Ds5jn1qm.js +1 -0
  832. personalclaw/static/dist/assets/messages-square-C8EXqqSr.js +1 -0
  833. personalclaw/static/dist/assets/mic-OMC8qktP.js +1 -0
  834. personalclaw/static/dist/assets/mindmap-definition-LN4V7U3C-BlIo3lVQ.js +96 -0
  835. personalclaw/static/dist/assets/minimize-2-BYtwlrCh.js +1 -0
  836. personalclaw/static/dist/assets/mips-CIPQ_RoX.js +1 -0
  837. personalclaw/static/dist/assets/motion-DA2L2I0W.js +1 -0
  838. personalclaw/static/dist/assets/msdax-DauUninz.js +1 -0
  839. personalclaw/static/dist/assets/mysql-SOo6toE5.js +1 -0
  840. personalclaw/static/dist/assets/objective-c-FvmIjYaQ.js +1 -0
  841. personalclaw/static/dist/assets/ordinal-hYBb2elL.js +1 -0
  842. personalclaw/static/dist/assets/packet-7NZHBO7P-D2duWGIK.js +1 -0
  843. personalclaw/static/dist/assets/palette--haKdu99.js +1 -0
  844. personalclaw/static/dist/assets/panel-right-C3LrrPlj.js +1 -0
  845. personalclaw/static/dist/assets/panel-right-open-9Yb9cjHO.js +1 -0
  846. personalclaw/static/dist/assets/pascal-DrH0SRf2.js +1 -0
  847. personalclaw/static/dist/assets/pascaligo-D-ptJ9y-.js +1 -0
  848. personalclaw/static/dist/assets/path-BWPyau1x.js +1 -0
  849. personalclaw/static/dist/assets/pause-BGbidogR.js +1 -0
  850. personalclaw/static/dist/assets/pegDiagram-2B236MQR-Cbw1axx9.js +1 -0
  851. personalclaw/static/dist/assets/pencil-K9CB5__b.js +1 -0
  852. personalclaw/static/dist/assets/perl-oz_6vUea.js +1 -0
  853. personalclaw/static/dist/assets/pgsql-DTj74zXo.js +1 -0
  854. personalclaw/static/dist/assets/php-nr791fC2.js +1 -0
  855. personalclaw/static/dist/assets/pie-BgBEsAQg.js +1 -0
  856. personalclaw/static/dist/assets/pie-RZYD4A2V-CynqTUkZ.js +1 -0
  857. personalclaw/static/dist/assets/pieDiagram-ENE6RG2P-B6x-pnpe.js +39 -0
  858. personalclaw/static/dist/assets/pla-CopQ2nXW.js +1 -0
  859. personalclaw/static/dist/assets/play-BTCrmbn0.js +1 -0
  860. personalclaw/static/dist/assets/plug-DEp4tSQG.js +1 -0
  861. personalclaw/static/dist/assets/plus-ln0ZZUVd.js +1 -0
  862. personalclaw/static/dist/assets/postiats-43DmfD33.js +1 -0
  863. personalclaw/static/dist/assets/powerquery-D3hlyOfw.js +1 -0
  864. personalclaw/static/dist/assets/powershell-DmHpPYUd.js +1 -0
  865. personalclaw/static/dist/assets/preload-helper-Czpn1I53.js +1 -0
  866. personalclaw/static/dist/assets/protobuf-C531GsRP.js +2 -0
  867. personalclaw/static/dist/assets/pug-Z5eAx3Zn.js +1 -0
  868. personalclaw/static/dist/assets/python-DLdbtmNw.js +1 -0
  869. personalclaw/static/dist/assets/qsharp-DkqhCAOL.js +1 -0
  870. personalclaw/static/dist/assets/quadrantDiagram-ABIIQ3AL-SynMu_Dr.js +7 -0
  871. personalclaw/static/dist/assets/r-BwWrilGY.js +1 -0
  872. personalclaw/static/dist/assets/radar-I7S5WNFK-fIKE12aT.js +1 -0
  873. personalclaw/static/dist/assets/railroad-3IZDKUUU-Bgx8HJTj.js +1 -0
  874. personalclaw/static/dist/assets/railroad-abnf-AHOZXSZD-Nh6k60mH.js +1 -0
  875. personalclaw/static/dist/assets/railroad-ebnf-EBAXGLYW-C74h3s_I.js +1 -0
  876. personalclaw/static/dist/assets/railroad-peg-LSFZ7HO6-0hT-lN-u.js +1 -0
  877. personalclaw/static/dist/assets/railroadDiagram-RFXS5EU6-CYcZMCNE.js +1 -0
  878. personalclaw/static/dist/assets/razor-B9gdhAbR.js +1 -0
  879. personalclaw/static/dist/assets/react-Augu_vA3.js +1 -0
  880. personalclaw/static/dist/assets/redis-ClamHrr6.js +1 -0
  881. personalclaw/static/dist/assets/redshift-DT7zqm-g.js +1 -0
  882. personalclaw/static/dist/assets/refresh-cw-C8O1GKy3.js +1 -0
  883. personalclaw/static/dist/assets/renderers-DjtPj68j.js +3 -0
  884. personalclaw/static/dist/assets/repeat-DByY8U_U.js +1 -0
  885. personalclaw/static/dist/assets/requirementDiagram-TGXJPOKE-Dm7sDAlQ.js +84 -0
  886. personalclaw/static/dist/assets/restructuredtext-BYgofb2h.js +1 -0
  887. personalclaw/static/dist/assets/rocket-DOmNFtdM.js +1 -0
  888. personalclaw/static/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  889. personalclaw/static/dist/assets/rotate-ccw-CthZ29rh.js +1 -0
  890. personalclaw/static/dist/assets/rotate-cw--4225WRk.js +1 -0
  891. personalclaw/static/dist/assets/rough.esm-CSKSodPl.js +1 -0
  892. personalclaw/static/dist/assets/route-CzTsyL8c.js +1 -0
  893. personalclaw/static/dist/assets/ruby-DezsRK8O.js +1 -0
  894. personalclaw/static/dist/assets/runFold-DUbhN5VF.js +1 -0
  895. personalclaw/static/dist/assets/rust-DdL9SqIa.js +1 -0
  896. personalclaw/static/dist/assets/sankeyDiagram-HTMAVEWB-Dix3Bpzb.js +40 -0
  897. personalclaw/static/dist/assets/save-BUEpt5QU.js +1 -0
  898. personalclaw/static/dist/assets/sb-CcwsVR0C.js +1 -0
  899. personalclaw/static/dist/assets/scala-DHpiXF5c.js +1 -0
  900. personalclaw/static/dist/assets/schema-D_MgGOja.js +1 -0
  901. personalclaw/static/dist/assets/scheme-BeGwcela.js +1 -0
  902. personalclaw/static/dist/assets/scroll-text-Bk6LAWwc.js +1 -0
  903. personalclaw/static/dist/assets/scss-gp-XZpBa.js +3 -0
  904. personalclaw/static/dist/assets/send-BmJrZ-YS.js +1 -0
  905. personalclaw/static/dist/assets/sequenceDiagram-DBY2YBRQ-TMZlQYHp.js +162 -0
  906. personalclaw/static/dist/assets/server-C7E4ajUJ.js +1 -0
  907. personalclaw/static/dist/assets/settings-2-DQV3qEOG.js +1 -0
  908. personalclaw/static/dist/assets/settings-CGVc5_1Y.js +1 -0
  909. personalclaw/static/dist/assets/settingsUI--T9KZk-9.js +1 -0
  910. personalclaw/static/dist/assets/shell-CC2rA5mh.js +1 -0
  911. personalclaw/static/dist/assets/shield-alert-CoSWpfv8.js +1 -0
  912. personalclaw/static/dist/assets/shield-check-BEJumkg5.js +1 -0
  913. personalclaw/static/dist/assets/shield-question-mark-OYEo4GOa.js +1 -0
  914. personalclaw/static/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  915. personalclaw/static/dist/assets/slash-F4HNShMo.js +1 -0
  916. personalclaw/static/dist/assets/sliders-horizontal-DzfDrd1G.js +1 -0
  917. personalclaw/static/dist/assets/solidity-BEEn4gHE.js +1 -0
  918. personalclaw/static/dist/assets/sophia-CRfGWb83.js +1 -0
  919. personalclaw/static/dist/assets/sparkle-BT02FlB7.js +1 -0
  920. personalclaw/static/dist/assets/sparkles-BBJm1DsM.js +1 -0
  921. personalclaw/static/dist/assets/sparql-D_Lu-MrJ.js +1 -0
  922. personalclaw/static/dist/assets/sql-NEE52Syq.js +1 -0
  923. personalclaw/static/dist/assets/square-Bi3pzOph.js +1 -0
  924. personalclaw/static/dist/assets/square-terminal-Cm97L47M.js +1 -0
  925. personalclaw/static/dist/assets/src-B7FMst6f.js +1 -0
  926. personalclaw/static/dist/assets/st-DbInun42.js +1 -0
  927. personalclaw/static/dist/assets/star-yiQz9yK1.js +1 -0
  928. personalclaw/static/dist/assets/stateDiagram-2N3HPSRC-SLpHy26q.js +1 -0
  929. personalclaw/static/dist/assets/stateDiagram-v2-6OUMAXLB-CxFGN2fy.js +1 -0
  930. personalclaw/static/dist/assets/store-MzxkCY0r.js +1 -0
  931. personalclaw/static/dist/assets/swift-Bxkupp3x.js +1 -0
  932. personalclaw/static/dist/assets/swimlanes-5IMT3BWC-awrYHeLT.js +2 -0
  933. personalclaw/static/dist/assets/swimlanesDiagram-G3AALYLV-D12MzgX2.js +8 -0
  934. personalclaw/static/dist/assets/systemverilog-Bz4Y3fRF.js +1 -0
  935. personalclaw/static/dist/assets/table-DvsnaAqM.js +1 -0
  936. personalclaw/static/dist/assets/tag-EV82YiLs.js +1 -0
  937. personalclaw/static/dist/assets/target-UW-0tTFS.js +1 -0
  938. personalclaw/static/dist/assets/tcl-DISqw1ZD.js +1 -0
  939. personalclaw/static/dist/assets/telescope-BdBMzAB5.js +1 -0
  940. personalclaw/static/dist/assets/terminal-C1iWLdbV.js +1 -0
  941. personalclaw/static/dist/assets/terminalBridge-DPYmSg2J.js +3 -0
  942. personalclaw/static/dist/assets/text-wrap-Dpl4nqII.js +1 -0
  943. personalclaw/static/dist/assets/timeline-definition-FHXFAJF6-BlrsykJ0.js +120 -0
  944. personalclaw/static/dist/assets/trash-2-2bFoF0VR.js +1 -0
  945. personalclaw/static/dist/assets/treeView-QDETBFTQ-CygwzEgj.js +1 -0
  946. personalclaw/static/dist/assets/treemap-6X3UGDF4-BbCXbaXr.js +1 -0
  947. personalclaw/static/dist/assets/triangle-alert-BWT3LMHk.js +1 -0
  948. personalclaw/static/dist/assets/ts.worker-BtjBFNHX.js +67734 -0
  949. personalclaw/static/dist/assets/tsMode-yQhLaacG.js +11 -0
  950. personalclaw/static/dist/assets/twig-De2hgUGE.js +1 -0
  951. personalclaw/static/dist/assets/type-koFtxoIo.js +1 -0
  952. personalclaw/static/dist/assets/typescript-CRRnD2Ts.js +1 -0
  953. personalclaw/static/dist/assets/typespec-B8J7ngcE.js +1 -0
  954. personalclaw/static/dist/assets/undo-2-CDJPQNhd.js +1 -0
  955. personalclaw/static/dist/assets/upload-DfZqclRJ.js +1 -0
  956. personalclaw/static/dist/assets/useCachedData-BIQrgq6_.js +1 -0
  957. personalclaw/static/dist/assets/useGuardedInstall-DHCIXlaw.js +1 -0
  958. personalclaw/static/dist/assets/useIsMobile-fpdKrHpJ.js +1 -0
  959. personalclaw/static/dist/assets/user-DswXNoCg.js +1 -0
  960. personalclaw/static/dist/assets/users-8dGmvnpT.js +1 -0
  961. personalclaw/static/dist/assets/vb-DV3o63ZY.js +1 -0
  962. personalclaw/static/dist/assets/vennDiagram-L72KCM5P-CllHp1wQ.js +34 -0
  963. personalclaw/static/dist/assets/video-BZDv1HvB.js +1 -0
  964. personalclaw/static/dist/assets/wand-sparkles-Dm6h6-C_.js +1 -0
  965. personalclaw/static/dist/assets/wardley-OPB4EBWU-BjXxCRf_.js +1 -0
  966. personalclaw/static/dist/assets/wardleyDiagram-EHGQE667-DWoNiq8-.js +78 -0
  967. personalclaw/static/dist/assets/webhook-BMlzomTH.js +1 -0
  968. personalclaw/static/dist/assets/wgsl-DpFanUEy.js +298 -0
  969. personalclaw/static/dist/assets/wifi-BeOsvsLl.js +1 -0
  970. personalclaw/static/dist/assets/wifi-off-DuGLl9EJ.js +1 -0
  971. personalclaw/static/dist/assets/workflow-lfMbPV8i.js +1 -0
  972. personalclaw/static/dist/assets/wrench-D8016U7k.js +1 -0
  973. personalclaw/static/dist/assets/xml-EDREH2X7.js +1 -0
  974. personalclaw/static/dist/assets/xychartDiagram-FW5EYKEG-BRuYpzPW.js +7 -0
  975. personalclaw/static/dist/assets/yaml-BjaDVX1E.js +1 -0
  976. personalclaw/static/dist/assets/zap-i0jeCEf8.js +1 -0
  977. personalclaw/static/dist/claw.svg +11 -0
  978. personalclaw/static/dist/fonts/dm-sans.woff2 +0 -0
  979. personalclaw/static/dist/fonts/google-sans-code.woff2 +0 -0
  980. personalclaw/static/dist/fonts/google-sans-flex.woff2 +0 -0
  981. personalclaw/static/dist/fonts/inter.woff2 +0 -0
  982. personalclaw/static/dist/fonts/jetbrains-mono.woff2 +0 -0
  983. personalclaw/static/dist/index.html +151 -0
  984. personalclaw/stats.py +185 -0
  985. personalclaw/stt/__init__.py +5 -0
  986. personalclaw/stt/handlers.py +18 -0
  987. personalclaw/stt/openai_provider.py +126 -0
  988. personalclaw/stt/provider.py +137 -0
  989. personalclaw/stt/registry.py +131 -0
  990. personalclaw/subagent.py +1673 -0
  991. personalclaw/subagent_persistence.py +276 -0
  992. personalclaw/suggestions.py +275 -0
  993. personalclaw/supply_chain.py +422 -0
  994. personalclaw/sync_bridge.py +183 -0
  995. personalclaw/task.py +89 -0
  996. personalclaw/task_modes.py +350 -0
  997. personalclaw/tasks/__init__.py +23 -0
  998. personalclaw/tasks/handlers.py +305 -0
  999. personalclaw/tasks/hierarchy.py +364 -0
  1000. personalclaw/tasks/hierarchy_handlers.py +383 -0
  1001. personalclaw/tasks/models.py +399 -0
  1002. personalclaw/tasks/native.py +375 -0
  1003. personalclaw/tasks/provider.py +55 -0
  1004. personalclaw/tasks/reconcile.py +304 -0
  1005. personalclaw/tasks/registry.py +233 -0
  1006. personalclaw/tests_fixtures/empty/fixture.yaml +1 -0
  1007. personalclaw/textfmt.py +49 -0
  1008. personalclaw/tool_providers/__init__.py +15 -0
  1009. personalclaw/tool_providers/base.py +160 -0
  1010. personalclaw/tool_providers/projection.py +382 -0
  1011. personalclaw/tool_providers/registry.py +143 -0
  1012. personalclaw/tool_providers/result_store.py +203 -0
  1013. personalclaw/tool_providers/tool_prefs.py +181 -0
  1014. personalclaw/transcribe.py +345 -0
  1015. personalclaw/trust_mode.py +145 -0
  1016. personalclaw/tts/__init__.py +1 -0
  1017. personalclaw/tts/openai_provider.py +167 -0
  1018. personalclaw/tts/provider.py +105 -0
  1019. personalclaw/tts/registry.py +160 -0
  1020. personalclaw/uploads/__init__.py +28 -0
  1021. personalclaw/uploads/policy.py +178 -0
  1022. personalclaw/uploads/store.py +285 -0
  1023. personalclaw/validation.py +900 -0
  1024. personalclaw/vector_memory.py +2508 -0
  1025. personalclaw/video_gen/__init__.py +6 -0
  1026. personalclaw/video_gen/provider.py +93 -0
  1027. personalclaw/video_gen/registry.py +140 -0
  1028. personalclaw/voice_reply.py +305 -0
  1029. personalclaw/web/__init__.py +31 -0
  1030. personalclaw/web/extract.py +117 -0
  1031. personalclaw/web/fetch.py +338 -0
  1032. personalclaw/web/render.py +122 -0
  1033. personalclaw/workflows/__init__.py +6 -0
  1034. personalclaw/workflows/bundled/commit-changes/WORKFLOW.md +25 -0
  1035. personalclaw/workflows/bundled/debug-failing-test/WORKFLOW.md +27 -0
  1036. personalclaw/workflows/composition.py +232 -0
  1037. personalclaw/workflows/handlers.py +240 -0
  1038. personalclaw/workflows/lifecycle.py +42 -0
  1039. personalclaw/workflows/models.py +97 -0
  1040. personalclaw/workflows/native.py +478 -0
  1041. personalclaw/workflows/provider.py +43 -0
  1042. personalclaw/workflows/registry.py +272 -0
  1043. personalclaw/workflows/surfacing.py +333 -0
  1044. personalclaw-0.1.0.dist-info/METADATA +86 -0
  1045. personalclaw-0.1.0.dist-info/RECORD +1049 -0
  1046. personalclaw-0.1.0.dist-info/WHEEL +5 -0
  1047. personalclaw-0.1.0.dist-info/entry_points.txt +5 -0
  1048. personalclaw-0.1.0.dist-info/licenses/LICENSE +21 -0
  1049. personalclaw-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,85 @@
1
+ """PersonalClaw — personal AI agent with pluggable LLM providers."""
2
+
3
+ import asyncio
4
+ from importlib.metadata import PackageNotFoundError
5
+ from importlib.metadata import version as _pkg_version
6
+
7
+ # Version single-sourcing (plan 34 T1.2): pyproject.toml is the single source of
8
+ # truth. An installed package reports its version via importlib.metadata; a raw
9
+ # source-tree run (no dist-info, e.g. `python -m personalclaw` from a checkout
10
+ # without `pip install -e .`) falls back to the literal below. The consistency
11
+ # test (tests/test_version_consistency.py) asserts the three agree at release time.
12
+ _FALLBACK_VERSION = "0.1.0"
13
+ try:
14
+ __version__ = _pkg_version("personalclaw")
15
+ except PackageNotFoundError: # running from an uninstalled source tree
16
+ __version__ = _FALLBACK_VERSION
17
+
18
+
19
+ class _ShutdownEvent:
20
+ """Process-wide shutdown signal that rebinds to the running event loop.
21
+
22
+ A plain module-level ``asyncio.Event()`` binds to whichever loop first
23
+ touches it; awaiting it later from a different loop (e.g. the fresh loop
24
+ ``asyncio.run()`` creates for the gateway, or a loop after an in-process
25
+ restart) raises ``RuntimeError: got Future attached to a different loop``
26
+ and crashes the gateway in a restart spiral.
27
+
28
+ This proxy lazily (re)creates the underlying :class:`asyncio.Event` on the
29
+ *current* running loop, so each ``asyncio.run()`` gets a fresh, correctly
30
+ bound Event. A ``set()`` issued with no loop running is remembered and
31
+ applied to the next Event built. Background loops use
32
+ ``await shutdown_event.wait()`` (with a timeout) instead of plain
33
+ ``asyncio.sleep()`` so they wake instantly on Ctrl-C.
34
+ """
35
+
36
+ def __init__(self) -> None:
37
+ self._event: asyncio.Event | None = None
38
+ self._loop: asyncio.AbstractEventLoop | None = None
39
+ self._pending_set: bool = False
40
+
41
+ def _get(self) -> asyncio.Event:
42
+ """Return the Event bound to the running loop, rebuilding on loop change.
43
+
44
+ Raises ``RuntimeError`` when called without a running event loop.
45
+ """
46
+ try:
47
+ loop = asyncio.get_running_loop()
48
+ except RuntimeError as exc:
49
+ raise RuntimeError(
50
+ "shutdown_event cannot be accessed without a running event loop"
51
+ ) from exc
52
+ if self._event is None or self._loop is not loop:
53
+ self._event = asyncio.Event()
54
+ self._loop = loop
55
+ if self._pending_set:
56
+ self._event.set()
57
+ return self._event
58
+
59
+ async def wait(self) -> bool:
60
+ return await self._get().wait()
61
+
62
+ def set(self) -> None:
63
+ """Set the event. Safe to call with no running loop (remembered)."""
64
+ self._pending_set = True
65
+ try:
66
+ self._get().set()
67
+ except RuntimeError:
68
+ # No running loop yet — the pending flag applies it on next build.
69
+ pass
70
+
71
+ def clear(self) -> None:
72
+ self._pending_set = False
73
+ if self._event is not None:
74
+ self._event.clear()
75
+
76
+ def is_set(self) -> bool:
77
+ if self._event is not None:
78
+ return self._event.is_set()
79
+ return self._pending_set
80
+
81
+
82
+ # Process-wide shutdown signal. Any background loop should use
83
+ # ``await shutdown_event.wait()`` (with a timeout) instead of plain
84
+ # ``asyncio.sleep()`` so it wakes instantly on Ctrl-C.
85
+ shutdown_event = _ShutdownEvent()
@@ -0,0 +1,20 @@
1
+ """Entry point for ``python -m personalclaw``.
2
+
3
+ ``_ensure_ssl_certs()`` MUST run before ``from personalclaw.cli import main``
4
+ because that import triggers ``aiohttp`` (via ``dashboard.origin`` →
5
+ ``dashboard.__init__`` → ``dashboard.server`` → ``from aiohttp import web``).
6
+
7
+ aiohttp caches its default SSL context at import time
8
+ (``aiohttp.connector._SSL_CONTEXT_VERIFIED``). On some systems the
9
+ cafile may be missing, so the cached context ends up with zero CA
10
+ certs and every HTTPS connection fails with CERTIFICATE_VERIFY_FAILED.
11
+ """
12
+
13
+ from personalclaw._ssl_compat import _ensure_ssl_certs
14
+
15
+ _ensure_ssl_certs()
16
+
17
+ if __name__ == "__main__":
18
+ from personalclaw.cli import main # noqa: E402
19
+
20
+ main()
@@ -0,0 +1,52 @@
1
+ """Optional-SDK import guard (plan 34 T1.4).
2
+
3
+ Provider adapters for hosted vendors (OpenAI, Anthropic) import their SDK
4
+ *lazily* so that a bare ``pip install personalclaw`` stays lean — the SDKs are
5
+ demoted to the ``[openai]`` / ``[anthropic]`` extras and also ship via the
6
+ branded provider apps' manifest ``pythonDependencies``. When such an adapter is
7
+ actually constructed/used without its SDK present, the raw
8
+ ``ModuleNotFoundError`` is unhelpful; ``require_sdk`` replaces it with a
9
+ ``MissingSDKError`` that names the exact remedy and the doctor hint.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import importlib
15
+ from types import ModuleType
16
+
17
+
18
+ class MissingSDKError(ImportError):
19
+ """An optional provider SDK is not installed.
20
+
21
+ The message names the exact ``pip install personalclaw[<extra>]`` remedy so a
22
+ user hitting a hosted provider without its SDK knows precisely what to run.
23
+ Subclasses ``ImportError`` so existing ``except ImportError`` guards (the STT/
24
+ TTS ``is_available`` probes) keep treating it as "SDK absent".
25
+ """
26
+
27
+
28
+ def require_sdk(module: str, extra: str, *, feature: str | None = None) -> ModuleType:
29
+ """Import *module*, or raise :class:`MissingSDKError` with the remedy.
30
+
31
+ Args:
32
+ module: the importable module name (e.g. ``"openai"``).
33
+ extra: the packaging extra that provides it (e.g. ``"openai"``), used in
34
+ the ``pip install personalclaw[<extra>]`` remedy.
35
+ feature: optional human phrase for what needed it (e.g. ``"the OpenAI
36
+ chat provider"``) — sharpens the error when several adapters share an
37
+ SDK.
38
+
39
+ Returns:
40
+ The imported module.
41
+ """
42
+ try:
43
+ return importlib.import_module(module)
44
+ except ModuleNotFoundError as exc:
45
+ needed_by = f" required by {feature}" if feature else ""
46
+ raise MissingSDKError(
47
+ f"The {module!r} SDK is not installed{needed_by}. Install it with "
48
+ f"`pip install 'personalclaw[{extra}]'` (or `uv pip install "
49
+ f"'personalclaw[{extra}]'`). If you installed a branded provider app, "
50
+ f"reinstalling the app will pull it in. Run `personalclaw doctor` to "
51
+ f"check provider dependencies."
52
+ ) from exc
@@ -0,0 +1,39 @@
1
+ """Ensure the system CA bundle is visible to OpenSSL on RPM-based distros.
2
+
3
+ Must run before any library (aiohttp, slack_sdk, requests) caches its
4
+ default SSL context, otherwise every HTTPS call fails with
5
+ CERTIFICATE_VERIFY_FAILED on systems where mise-installed Python looks
6
+ for certs at ``/etc/ssl/`` but the distro stores them at
7
+ ``/etc/pki/tls/`` (Fedora, RHEL, CentOS, openSUSE, …).
8
+ """
9
+
10
+ import os
11
+ from pathlib import Path
12
+
13
+ _CA_CANDIDATES = (
14
+ "/etc/pki/tls/cert.pem",
15
+ "/etc/pki/tls/certs/ca-bundle.crt",
16
+ "/etc/ssl/certs/ca-certificates.crt",
17
+ )
18
+
19
+
20
+ def _ensure_ssl_certs() -> None:
21
+ """Point OpenSSL at the system CA bundle before any library caches it.
22
+
23
+ Sets both ``SSL_CERT_FILE`` (used by OpenSSL / aiohttp) and
24
+ ``REQUESTS_CA_BUNDLE`` (used by the ``requests`` library / slack_sdk).
25
+ """
26
+ if os.environ.get("SSL_CERT_FILE"):
27
+ return
28
+
29
+ import ssl
30
+
31
+ defaults = ssl.get_default_verify_paths()
32
+ if defaults.cafile and Path(defaults.cafile).exists():
33
+ return
34
+
35
+ for candidate in _CA_CANDIDATES:
36
+ if Path(candidate).exists():
37
+ os.environ["SSL_CERT_FILE"] = candidate
38
+ os.environ.setdefault("REQUESTS_CA_BUNDLE", candidate)
39
+ return
@@ -0,0 +1,31 @@
1
+ """ACP package — vendor-neutral Agent Client Protocol primitives.
2
+
3
+ Implements the open `Agent Client Protocol
4
+ <https://github.com/zed-industries/agent-client-protocol>`__
5
+ (JSON-RPC 2.0 over stdio). The package is intentionally agent-agnostic:
6
+ :class:`AcpClient` and :class:`AcpProcessDied` are protocol primitives
7
+ usable against any ACP-compliant agent. This package contains no
8
+ agent-specific defaults; callers that need backend-specific launch
9
+ helpers import them from a dedicated module.
10
+ """
11
+
12
+ from personalclaw.acp.client import (
13
+ AcpClient,
14
+ AcpError,
15
+ AcpPermissionNeeded,
16
+ AcpProcessDied,
17
+ AcpTimeoutError,
18
+ )
19
+ from personalclaw.acp.types import AcpEvent, AcpPromptStats, JsonRpcMessage, JsonRpcRequest
20
+
21
+ __all__ = [
22
+ "AcpClient",
23
+ "AcpError",
24
+ "AcpPermissionNeeded",
25
+ "AcpProcessDied",
26
+ "AcpTimeoutError",
27
+ "AcpEvent",
28
+ "AcpPromptStats",
29
+ "JsonRpcMessage",
30
+ "JsonRpcRequest",
31
+ ]
@@ -0,0 +1,38 @@
1
+ """ACP ⇄ neutral-event translation.
2
+
3
+ The only place that knows both the ACP-internal :class:`AcpEvent` shape and the
4
+ neutral :class:`AgentEvent` shape. The ACP layer keeps owning ``AcpEvent``
5
+ (``acp/types.py``); everything downstream consumes ``AgentEvent``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from personalclaw.acp.types import AcpEvent
11
+ from personalclaw.llm.events import AgentEvent
12
+
13
+
14
+ def acp_event_to_agent_event(e: AcpEvent) -> AgentEvent:
15
+ """Map an ACP stream event to the neutral agent event (field-for-field)."""
16
+ return AgentEvent(
17
+ kind=e.kind,
18
+ text=e.text,
19
+ tool_call_id=e.tool_call_id,
20
+ title=e.title,
21
+ tool_kind=e.tool_kind,
22
+ tool_purpose=e.tool_purpose,
23
+ context_usage_pct=e.context_usage_pct,
24
+ stop_reason=e.stop_reason,
25
+ request_id=e.request_id,
26
+ options=e.options,
27
+ tool_input=e.tool_input,
28
+ tool_output=e.tool_output,
29
+ input_tokens=e.input_tokens,
30
+ output_tokens=e.output_tokens,
31
+ cache_creation_tokens=e.cache_creation_tokens,
32
+ cache_read_tokens=e.cache_read_tokens,
33
+ cost_usd=e.cost_usd,
34
+ num_turns=e.num_turns,
35
+ duration_ms=e.duration_ms,
36
+ event_count=e.event_count,
37
+ tool_call_count=e.tool_call_count,
38
+ )
@@ -0,0 +1,360 @@
1
+ """Vendor-neutral launch-argv resolution for ACP CLI adapters.
2
+
3
+ An ACP provider bundle (``acp:<cli>``) needs to turn "the name of a CLI" into a
4
+ concrete launch ``argv`` that works inside the gateway daemon — where ``$PATH``
5
+ is often the minimal one the supervisor inherited, not the user's interactive
6
+ shell PATH (so a CLI installed via nvm/mise/volta or ``npm i -g`` is invisible to
7
+ a bare :func:`shutil.which`). This module owns that resolution **mechanism**; it
8
+ is parameterised by env-var name, bin names, and an optional npm-package fallback
9
+ so it carries **zero** knowledge of any specific CLI. The vendor-specific values
10
+ (env-var name, bin names, npm package) live in the per-CLI bundles that call this.
11
+
12
+ Resolution order (first hit wins):
13
+
14
+ 1. ``$<ENV_VAR>`` — an explicit operator override (absolute path or argv;
15
+ honoured verbatim, never re-validated against PATH).
16
+ 2. :func:`shutil.which` for each bin name (the daemon's PATH).
17
+ 3. Common node-version-manager install roots (nvm / mise / asdf / volta / fnm)
18
+ and the global ``npm root -g`` bin dir — globbed for each bin name. This is
19
+ what makes a ``npm i -g`` CLI resolvable from a daemon with a minimal PATH.
20
+ 4. ``npx -y <npm_pkg>`` as a last resort, when an npm package name is supplied
21
+ (lets a never-installed adapter still run, at the cost of a cold ``npx`` fetch).
22
+
23
+ A ``.js`` entry script is returned as ``[node, script, ...]`` rather than
24
+ ``[script, ...]`` so it does not depend on the shebang resolving a ``node`` that
25
+ may not be on the daemon PATH.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import logging
31
+ import os
32
+ import shutil
33
+ import subprocess
34
+ from glob import glob
35
+ from pathlib import Path
36
+
37
+ __all__ = [
38
+ "resolve_acp_cli",
39
+ "node_argv_for_script",
40
+ "is_npx_fallback",
41
+ "resolve_node_ge",
42
+ "provision_acp_adapter",
43
+ ]
44
+
45
+ logger = logging.getLogger(__name__)
46
+
47
+ # Minimum Node major the ACP adapters (@agentclientprotocol/*) require. Provisioning
48
+ # picks an interpreter at least this new; a lower one (e.g. a mise-pinned Node 18)
49
+ # is skipped so the install/run can't fail with EBADENGINE.
50
+ _MIN_NODE_MAJOR = 20
51
+
52
+
53
+ def node_argv_for_script(path: str) -> list[str]:
54
+ """Return a launch argv for *path*, prefixing ``node`` for ``.js`` entries.
55
+
56
+ A ``.js`` script relies on its shebang (``#!/usr/bin/env node``) to find an
57
+ interpreter; in a daemon with a minimal PATH that shebang can fail. Prefixing
58
+ the resolved ``node`` (falling back to the literal ``node`` if none is found)
59
+ sidesteps it. Non-``.js`` entries (native binaries, extension-less shims) are
60
+ returned unchanged.
61
+ """
62
+ if path.endswith(".js"):
63
+ node = shutil.which("node") or "node"
64
+ return [node, path]
65
+ return [path]
66
+
67
+
68
+ def _node_manager_bin_globs() -> list[str]:
69
+ """Glob patterns for bin dirs created by common node version managers.
70
+
71
+ Patterns are expanded against ``$HOME`` and a few well-known prefixes so a
72
+ CLI installed under nvm/mise/asdf/volta/fnm — or globally via npm — is
73
+ findable even when the daemon PATH omits those dirs.
74
+
75
+ A deployment whose CLIs live elsewhere (e.g. an enterprise package manager
76
+ that installs to a non-standard prefix) can add colon-separated bin dirs via
77
+ the ``PERSONALCLAW_EXTRA_BIN_PATHS`` env var without editing core.
78
+ """
79
+ home = Path(os.path.expanduser("~"))
80
+ globs = [
81
+ # nvm: ~/.nvm/versions/node/<ver>/bin
82
+ str(home / ".nvm" / "versions" / "node" / "*" / "bin"),
83
+ # mise / rtx: ~/.local/share/{mise,rtx}/installs/node/<ver>/bin
84
+ str(home / ".local" / "share" / "mise" / "installs" / "node" / "*" / "bin"),
85
+ str(home / ".local" / "share" / "rtx" / "installs" / "node" / "*" / "bin"),
86
+ # asdf: ~/.asdf/installs/nodejs/<ver>/bin
87
+ str(home / ".asdf" / "installs" / "nodejs" / "*" / "bin"),
88
+ # volta: ~/.volta/bin
89
+ str(home / ".volta" / "bin"),
90
+ # fnm: ~/.fnm/node-versions/<ver>/installation/bin
91
+ str(home / ".fnm" / "node-versions" / "*" / "installation" / "bin"),
92
+ # Common global npm prefixes.
93
+ str(home / ".npm-global" / "bin"),
94
+ "/usr/local/bin",
95
+ "/opt/homebrew/bin",
96
+ ]
97
+ # PersonalClaw-managed adapter prefix — where auto-provisioned ACP adapters
98
+ # land (see provision_acp_adapter). Searched so a provisioned adapter resolves
99
+ # as a real binary on the next resolve, never via npx. Uses config_dir() so it
100
+ # tracks a custom PERSONALCLAW_HOME (best-effort; skipped if it can't resolve).
101
+ try:
102
+ from personalclaw.config.loader import config_dir
103
+
104
+ globs.append(str(config_dir() / "acp-adapters" / "node_modules" / ".bin"))
105
+ except Exception:
106
+ pass
107
+ extra = os.environ.get("PERSONALCLAW_EXTRA_BIN_PATHS", "")
108
+ globs.extend(p for p in (s.strip() for s in extra.split(os.pathsep)) if p)
109
+ return globs
110
+
111
+
112
+ # Public alias for the SDK surface (sdk.acp) — ACP-bundle apps (e.g. codex) need the
113
+ # node-manager bin globs to locate their CLI; expose it without the leading underscore.
114
+ node_manager_bin_globs = _node_manager_bin_globs
115
+
116
+
117
+ def _npm_root_global_bin() -> str | None:
118
+ """Return the global npm ``bin`` dir (``$(npm root -g)/../.bin``) if resolvable.
119
+
120
+ ``npm root -g`` prints the global ``node_modules`` dir; its sibling ``.bin``
121
+ holds the global CLI shims. Best-effort and fast-timeout — never raises.
122
+ """
123
+ npm = shutil.which("npm")
124
+ if not npm:
125
+ return None
126
+ try:
127
+ import subprocess
128
+
129
+ out = subprocess.run(
130
+ [npm, "root", "-g"],
131
+ capture_output=True,
132
+ text=True,
133
+ timeout=5,
134
+ )
135
+ except Exception:
136
+ return None
137
+ root = (out.stdout or "").strip()
138
+ if not root:
139
+ return None
140
+ bin_dir = Path(root).parent / ".bin"
141
+ return str(bin_dir) if bin_dir.is_dir() else None
142
+
143
+
144
+ def resolve_acp_cli(
145
+ *,
146
+ env_var: str,
147
+ bin_names: list[str],
148
+ npm_pkg: str | None = None,
149
+ subcommand: list[str] | None = None,
150
+ ) -> list[str] | None:
151
+ """Resolve a launch argv for an ACP CLI adapter, or ``None`` if unresolved.
152
+
153
+ Parameters
154
+ ----------
155
+ env_var:
156
+ Name of an environment variable an operator can set to override
157
+ resolution. Its value may be an absolute path to the entry OR a full
158
+ argv (whitespace-split). Honoured verbatim — ``subcommand`` is NOT
159
+ appended to an override (the operator supplies the complete argv).
160
+ bin_names:
161
+ Candidate executable basenames to look for on PATH / in node-manager
162
+ bin dirs, in priority order (e.g. ``["claude-code-acp"]``).
163
+ npm_pkg:
164
+ Optional npm package name; when supplied and nothing else resolves,
165
+ returns ``["npx", "-y", <npm_pkg>, *subcommand]`` as a last resort.
166
+ subcommand:
167
+ Optional args appended to the resolved binary to put it into ACP
168
+ stdio-protocol mode (e.g. ``["acp"]`` for ``<cli> acp``). Appended to
169
+ the PATH/glob/npx resolutions, but NOT to an explicit env override.
170
+
171
+ Returns
172
+ -------
173
+ A launch argv (``list[str]``) ready to spawn, or ``None`` when no candidate
174
+ is found and no ``npm_pkg`` fallback is available. ``.js`` entries are
175
+ returned in ``[node, script]`` form.
176
+ """
177
+ extra = list(subcommand or [])
178
+
179
+ # 1. Explicit operator override — complete argv, no subcommand appended.
180
+ override = os.environ.get(env_var, "").strip()
181
+ if override:
182
+ parts = override.split()
183
+ if len(parts) == 1:
184
+ return node_argv_for_script(parts[0])
185
+ # A full argv was supplied — honour it verbatim.
186
+ return parts
187
+
188
+ # 2. PATH lookup for each bin name.
189
+ for name in bin_names:
190
+ found = shutil.which(name)
191
+ if found:
192
+ return node_argv_for_script(found) + extra
193
+
194
+ # 3. Node-version-manager + global-npm bin dirs.
195
+ search_dirs = list(_node_manager_bin_globs())
196
+ npm_bin = _npm_root_global_bin()
197
+ if npm_bin:
198
+ search_dirs.append(npm_bin)
199
+ for name in bin_names:
200
+ for pattern in search_dirs:
201
+ # Join the bin name on and glob the whole thing so version
202
+ # wildcards in the dir pattern expand.
203
+ for hit in sorted(glob(str(Path(pattern) / name))):
204
+ if not os.path.isdir(hit) and os.access(hit, os.X_OK):
205
+ return node_argv_for_script(hit) + extra
206
+
207
+ # 4. npx last resort.
208
+ if npm_pkg:
209
+ npx = shutil.which("npx") or "npx"
210
+ return [npx, "-y", npm_pkg, *extra]
211
+
212
+ return None
213
+
214
+
215
+ def is_npx_fallback(argv: list[str] | None) -> bool:
216
+ """True when *argv* is the ``npx -y <pkg>`` last-resort, not a real adapter.
217
+
218
+ A resolved argv is the npx fallback iff its first element's basename is
219
+ ``npx``. Callers use this to tell "the adapter is installed on disk" (steps
220
+ 1-3 of :func:`resolve_acp_cli`) from "nothing is installed, we'd fetch-and-run
221
+ it transiently" (step 4) — the latter is fragile (needs a good, ≥20 Node + a
222
+ clean npx cache) and is what auto-provisioning + the readiness gate act on.
223
+ """
224
+ if not argv:
225
+ return False
226
+ return Path(argv[0]).name.lower() in ("npx", "npx.cmd")
227
+
228
+
229
+ def resolve_node_ge(min_major: int = _MIN_NODE_MAJOR) -> str | None:
230
+ """Return a ``node`` executable whose major version is ≥ *min_major*, or None.
231
+
232
+ Searches PATH then the node-version-manager bin dirs (newest first), so a
233
+ machine whose default ``node`` is too old (e.g. a mise-pinned Node 18) still
234
+ yields a usable interpreter if a newer one is installed anywhere. Best-effort;
235
+ never raises. This is what lets provisioning avoid the ``EBADENGINE`` wall
236
+ that a bare ``npx`` under the pinned-old Node hits.
237
+ """
238
+ candidates: list[str] = []
239
+ on_path = shutil.which("node")
240
+ if on_path:
241
+ candidates.append(on_path)
242
+ # node-manager dirs, newest version dir first (reverse-sorted glob).
243
+ for pattern in _node_manager_bin_globs():
244
+ for hit in sorted(glob(str(Path(pattern) / "node")), reverse=True):
245
+ if not os.path.isdir(hit) and os.access(hit, os.X_OK):
246
+ candidates.append(hit)
247
+ for node in candidates:
248
+ try:
249
+ out = subprocess.run(
250
+ [node, "--version"],
251
+ capture_output=True,
252
+ text=True,
253
+ timeout=5,
254
+ )
255
+ except Exception:
256
+ continue
257
+ ver = (out.stdout or "").strip().lstrip("v")
258
+ major = ver.split(".", 1)[0]
259
+ if major.isdigit() and int(major) >= min_major:
260
+ return node
261
+ return None
262
+
263
+
264
+ def _managed_bin_dir() -> Path:
265
+ """The PersonalClaw-managed dir where auto-provisioned adapters are installed.
266
+
267
+ Under ``~/.personalclaw/acp-adapters`` (an ``npm --prefix`` root); its
268
+ ``node_modules/.bin`` is added to the resolver's search dirs, so an adapter
269
+ installed here is found by :func:`resolve_acp_cli` on the next resolve — no
270
+ reliance on the shared, corruption-prone npx cache.
271
+ """
272
+ from personalclaw.config.loader import config_dir
273
+
274
+ return config_dir() / "acp-adapters"
275
+
276
+
277
+ def provision_acp_adapter(npm_pkg: str, bin_names: list[str]) -> str | None:
278
+ """Install *npm_pkg* under a Node ≥20 interpreter into the managed prefix.
279
+
280
+ Returns the resolved adapter binary path on success, else None. Idempotent:
281
+ if the adapter is already present in the managed prefix it is returned without
282
+ re-installing. The install runs ``npm install --prefix <managed>`` with a
283
+ Node ≥20 on PATH (:func:`resolve_node_ge`) so it never trips ``EBADENGINE``,
284
+ and writes to a private prefix so a wedged global/npx cache can't block it.
285
+
286
+ This is the "an adapter provisions its own dependency" path: a bundle whose
287
+ only resolution would be the npx fallback calls this once to turn the transient
288
+ fetch-and-run into a durable on-disk install. Best-effort; never raises.
289
+
290
+ Set ``PERSONALCLAW_ACP_NO_PROVISION=1`` to disable — for tests/CI (no network
291
+ installs as a side effect) and frozen/desktop builds (a locked environment
292
+ where a runtime ``npm install`` is undesirable). When disabled, an already-
293
+ provisioned adapter is still returned (idempotent read), but nothing installs.
294
+ """
295
+ prefix = _managed_bin_dir()
296
+ bin_dir = prefix / "node_modules" / ".bin"
297
+
298
+ # Already provisioned? Return it (idempotent) — even when installs are disabled.
299
+ for name in bin_names:
300
+ cand = bin_dir / name
301
+ if cand.exists() and os.access(cand, os.X_OK):
302
+ return str(cand)
303
+
304
+ if os.environ.get("PERSONALCLAW_ACP_NO_PROVISION") == "1":
305
+ logger.debug(
306
+ "acp adapter %s: provisioning disabled (PERSONALCLAW_ACP_NO_PROVISION)", npm_pkg
307
+ )
308
+ return None
309
+
310
+ node = resolve_node_ge()
311
+ if not node:
312
+ logger.warning(
313
+ "acp adapter %s: cannot auto-provision — no Node >= %d found "
314
+ "(install a newer Node or set the adapter's *_ACP_BIN override)",
315
+ npm_pkg,
316
+ _MIN_NODE_MAJOR,
317
+ )
318
+ return None
319
+ npm = shutil.which(
320
+ "npm", path=os.pathsep.join([str(Path(node).parent), os.environ.get("PATH", "")])
321
+ )
322
+ if not npm:
323
+ logger.warning("acp adapter %s: npm not found alongside %s", npm_pkg, node)
324
+ return None
325
+
326
+ try:
327
+ prefix.mkdir(parents=True, exist_ok=True)
328
+ # Put the chosen Node first on PATH so npm's engine check + any lifecycle
329
+ # scripts run under it, not the (possibly too-old) default node.
330
+ env = {
331
+ **os.environ,
332
+ "PATH": os.pathsep.join([str(Path(node).parent), os.environ.get("PATH", "")]),
333
+ }
334
+ logger.info("acp adapter %s: provisioning under %s into %s", npm_pkg, node, prefix)
335
+ proc = subprocess.run(
336
+ [npm, "install", "--prefix", str(prefix), "--no-fund", "--no-audit", npm_pkg],
337
+ capture_output=True,
338
+ text=True,
339
+ timeout=180,
340
+ env=env,
341
+ )
342
+ if proc.returncode != 0:
343
+ logger.warning(
344
+ "acp adapter %s: provisioning failed (rc=%d): %s",
345
+ npm_pkg,
346
+ proc.returncode,
347
+ (proc.stderr or "")[-400:],
348
+ )
349
+ return None
350
+ except Exception:
351
+ logger.warning("acp adapter %s: provisioning errored", npm_pkg, exc_info=True)
352
+ return None
353
+
354
+ for name in bin_names:
355
+ cand = bin_dir / name
356
+ if cand.exists() and os.access(cand, os.X_OK):
357
+ logger.info("acp adapter %s: provisioned → %s", npm_pkg, cand)
358
+ return str(cand)
359
+ logger.warning("acp adapter %s: installed but no bin found in %s", npm_pkg, bin_dir)
360
+ return None