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.
- personalclaw/__init__.py +85 -0
- personalclaw/__main__.py +20 -0
- personalclaw/_sdk_deps.py +52 -0
- personalclaw/_ssl_compat.py +39 -0
- personalclaw/acp/__init__.py +31 -0
- personalclaw/acp/adapter.py +38 -0
- personalclaw/acp/cli_resolve.py +360 -0
- personalclaw/acp/client.py +639 -0
- personalclaw/acp/connection_pool.py +552 -0
- personalclaw/acp/dialect.py +434 -0
- personalclaw/acp/errors.py +32 -0
- personalclaw/acp/reader.py +197 -0
- personalclaw/acp/session.py +680 -0
- personalclaw/acp/translate.py +430 -0
- personalclaw/acp/transport.py +500 -0
- personalclaw/acp/types.py +163 -0
- personalclaw/acp_bundles/__init__.py +15 -0
- personalclaw/acp_bundles/_register.py +146 -0
- personalclaw/action_providers/__init__.py +23 -0
- personalclaw/action_providers/base.py +98 -0
- personalclaw/action_providers/bash_provider.py +184 -0
- personalclaw/action_providers/create_task_provider.py +76 -0
- personalclaw/action_providers/invoke_agent_provider.py +138 -0
- personalclaw/action_providers/notify_provider.py +66 -0
- personalclaw/action_providers/registry.py +70 -0
- personalclaw/action_providers/run_prompt_provider.py +245 -0
- personalclaw/action_providers/run_script_provider.py +100 -0
- personalclaw/action_providers/run_workflow_provider.py +183 -0
- personalclaw/action_providers/send_message_provider.py +110 -0
- personalclaw/action_providers/services.py +76 -0
- personalclaw/action_providers/template.py +37 -0
- personalclaw/after_turn_review.py +370 -0
- personalclaw/agent.py +1221 -0
- personalclaw/agent_metadata.py +55 -0
- personalclaw/agents/__init__.py +17 -0
- personalclaw/agents/defaults.py +410 -0
- personalclaw/agents/marketplace.py +332 -0
- personalclaw/agents/native/__init__.py +22 -0
- personalclaw/agents/native/approval.py +76 -0
- personalclaw/agents/native/builtin_tools.py +2154 -0
- personalclaw/agents/native/runtime.py +1110 -0
- personalclaw/agents/native/sdlc_tools.py +529 -0
- personalclaw/agents/native/tool_retrieval.py +337 -0
- personalclaw/agents/native/tools.py +197 -0
- personalclaw/agents/provider.py +228 -0
- personalclaw/agents/registry.py +29 -0
- personalclaw/app_cli.py +212 -0
- personalclaw/apps/__init__.py +24 -0
- personalclaw/apps/app_config.py +118 -0
- personalclaw/apps/app_crons.py +139 -0
- personalclaw/apps/app_manager.py +1015 -0
- personalclaw/apps/backend_runtime.py +341 -0
- personalclaw/apps/catalog.py +823 -0
- personalclaw/apps/dependency_ledger.py +182 -0
- personalclaw/apps/manager.py +234 -0
- personalclaw/apps/manifest.py +980 -0
- personalclaw/apps/mcp_bridge.py +161 -0
- personalclaw/apps/native/bash-action/app.json +37 -0
- personalclaw/apps/native/create-task-action/app.json +110 -0
- personalclaw/apps/native/filesystem-inbox/app.json +25 -0
- personalclaw/apps/native/invoke-agent-action/app.json +79 -0
- personalclaw/apps/native/native-agents/app.json +25 -0
- personalclaw/apps/native/native-knowledge/app.json +32 -0
- personalclaw/apps/native/native-prompts/app.json +27 -0
- personalclaw/apps/native/native-skills/app.json +43 -0
- personalclaw/apps/native/native-tasks/app.json +39 -0
- personalclaw/apps/native/native-vector-memory/app.json +37 -0
- personalclaw/apps/native/native-workflows/app.json +38 -0
- personalclaw/apps/native/notify-action/app.json +58 -0
- personalclaw/apps/native/personalclaw-artifacts/app.json +20 -0
- personalclaw/apps/native/personalclaw-inbox-tools/app.json +20 -0
- personalclaw/apps/native/personalclaw-knowledge-tools/app.json +20 -0
- personalclaw/apps/native/personalclaw-memory/app.json +20 -0
- personalclaw/apps/native/personalclaw-project-tools/app.json +20 -0
- personalclaw/apps/native/personalclaw-schedule-tools/app.json +20 -0
- personalclaw/apps/native/personalclaw-subagents/app.json +20 -0
- personalclaw/apps/native/personalclaw-tasks-tools/app.json +20 -0
- personalclaw/apps/native/personalclaw-tools/app.json +48 -0
- personalclaw/apps/native/personalclaw-workflows/app.json +20 -0
- personalclaw/apps/native/run-prompt-action/app.json +105 -0
- personalclaw/apps/native/run-script-action/app.json +46 -0
- personalclaw/apps/native/run-workflow-action/app.json +98 -0
- personalclaw/apps/native/send-message-action/app.json +64 -0
- personalclaw/apps/permissions.py +132 -0
- personalclaw/apps/prompt_registry.py +98 -0
- personalclaw/apps/prompt_seed.py +155 -0
- personalclaw/apps/source.py +120 -0
- personalclaw/artifacts/__init__.py +12 -0
- personalclaw/artifacts/handlers.py +492 -0
- personalclaw/artifacts/models.py +246 -0
- personalclaw/artifacts/native.py +752 -0
- personalclaw/artifacts/provider.py +173 -0
- personalclaw/artifacts/registry.py +44 -0
- personalclaw/atomic_write.py +91 -0
- personalclaw/auth/__init__.py +14 -0
- personalclaw/auth/modes.py +75 -0
- personalclaw/auth/oidc.py +240 -0
- personalclaw/autonomous_framing.py +56 -0
- personalclaw/autonudge.py +358 -0
- personalclaw/channel_delivery.py +175 -0
- personalclaw/channel_history.py +343 -0
- personalclaw/channel_transports/__init__.py +50 -0
- personalclaw/channel_transports/base.py +164 -0
- personalclaw/channel_transports/manager.py +99 -0
- personalclaw/channel_transports/reference_echo.py +103 -0
- personalclaw/channel_transports/webui.py +98 -0
- personalclaw/cli.py +1019 -0
- personalclaw/cli_chat.py +122 -0
- personalclaw/cli_commands.py +658 -0
- personalclaw/cli_config.py +155 -0
- personalclaw/cli_doctor.py +456 -0
- personalclaw/cli_server.py +768 -0
- personalclaw/cli_setup.py +412 -0
- personalclaw/concurrency.py +116 -0
- personalclaw/config/__init__.py +11 -0
- personalclaw/config/defaults.json +20 -0
- personalclaw/config/design/default-tokens.json +329 -0
- personalclaw/config/design/tokens.schema.json +110 -0
- personalclaw/config/loader.py +2127 -0
- personalclaw/config/prompt_snippets/agent-runtime-identity.md +3 -0
- personalclaw/config/prompt_snippets/agent-system-prompt-wrapper.md +3 -0
- personalclaw/config/prompt_snippets/agent-voice-layer.md +4 -0
- personalclaw/config/prompt_snippets/autonomous-turn-preamble.md +7 -0
- personalclaw/config/prompt_snippets/cancelled-turn-preamble.md +9 -0
- personalclaw/config/prompt_snippets/channel-thread-context.md +8 -0
- personalclaw/config/prompt_snippets/consolidation-commitments.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-episodic.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-history.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-lessons.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-new_skill.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-preferences.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-projects.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-refined_skill.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-self_persona.md +1 -0
- personalclaw/config/prompt_snippets/consolidation-semantic.md +1 -0
- personalclaw/config/prompt_snippets/critical-rules.md +5 -0
- personalclaw/config/prompt_snippets/cross-tab-context.md +4 -0
- personalclaw/config/prompt_snippets/diff-output.md +1 -0
- personalclaw/config/prompt_snippets/learned-corrections-header.md +2 -0
- personalclaw/config/prompt_snippets/loop-code-stage-directive.md +1 -0
- personalclaw/config/prompt_snippets/loop-goal-cycle-nudge.md +8 -0
- personalclaw/config/prompt_snippets/loop-goal-phase-directive.md +1 -0
- personalclaw/config/prompt_snippets/loop-orchestrator-directive.md +1 -0
- personalclaw/config/prompt_snippets/mcp-reconnect.md +1 -0
- personalclaw/config/prompt_snippets/memory-discipline.md +1 -0
- personalclaw/config/prompt_snippets/parallel-subagents.md +1 -0
- personalclaw/config/prompt_snippets/persona-lumon.md +46 -0
- personalclaw/config/prompt_snippets/project-context.md +3 -0
- personalclaw/config/prompt_snippets/prompt-expansion.md +6 -0
- personalclaw/config/prompt_snippets/safety-rules.md +4 -0
- personalclaw/config/prompt_snippets/session-context-wrapper.md +3 -0
- personalclaw/config/prompt_snippets/session-incognito.md +1 -0
- personalclaw/config/prompt_snippets/session-temporary.md +1 -0
- personalclaw/config/prompt_snippets/skills-syntax.md +1 -0
- personalclaw/config/prompt_snippets/subagent-orchestration.md +1 -0
- personalclaw/config/prompt_snippets/subagent-system-prefix.md +2 -0
- personalclaw/config/prompt_snippets/thread-history-header.md +2 -0
- personalclaw/config/prompt_snippets/widget-instructions.md +19 -0
- personalclaw/config/prompt_snippets/workspace-identity.md +8 -0
- personalclaw/config/prompts/background.md +35 -0
- personalclaw/config/prompts/chat.md +34 -0
- personalclaw/config/prompts/code.md +23 -0
- personalclaw/config/prompts/goal_loop.md +24 -0
- personalclaw/config/prompts/task-channel_title.md +7 -0
- personalclaw/config/prompts/task-code_classify.md +37 -0
- personalclaw/config/prompts/task-code_design_brief.md +25 -0
- personalclaw/config/prompts/task-code_step_brief.md +19 -0
- personalclaw/config/prompts/task-contradiction_judge.md +6 -0
- personalclaw/config/prompts/task-cycle_judge.md +16 -0
- personalclaw/config/prompts/task-cycle_judge_skeptic.md +18 -0
- personalclaw/config/prompts/task-design_design_brief.md +26 -0
- personalclaw/config/prompts/task-design_phases.md +5 -0
- personalclaw/config/prompts/task-design_step_brief.md +19 -0
- personalclaw/config/prompts/task-digest.md +37 -0
- personalclaw/config/prompts/task-eval_judge.md +16 -0
- personalclaw/config/prompts/task-folder_icon.md +1 -0
- personalclaw/config/prompts/task-goal_classify.md +27 -0
- personalclaw/config/prompts/task-goal_step_brief.md +17 -0
- personalclaw/config/prompts/task-grill_assess.md +3 -0
- personalclaw/config/prompts/task-grill_flat.md +6 -0
- personalclaw/config/prompts/task-grill_tree.md +10 -0
- personalclaw/config/prompts/task-history_compression.md +27 -0
- personalclaw/config/prompts/task-inbox-classify.md +21 -0
- personalclaw/config/prompts/task-inbox-digest.md +15 -0
- personalclaw/config/prompts/task-inbox-draft.md +12 -0
- personalclaw/config/prompts/task-memory_consolidation.md +8 -0
- personalclaw/config/prompts/task-nav_links.md +3 -0
- personalclaw/config/prompts/task-nl_to_cron.md +13 -0
- personalclaw/config/prompts/task-orchestrator_skill.md +42 -0
- personalclaw/config/prompts/task-parallel_worker_nudge.md +15 -0
- personalclaw/config/prompts/task-plan_consolidation.md +18 -0
- personalclaw/config/prompts/task-plan_rephrase.md +24 -0
- personalclaw/config/prompts/task-prompt_optimizer.md +34 -0
- personalclaw/config/prompts/task-research_step_brief.md +1 -0
- personalclaw/config/prompts/task-sdlc_stage_gate.md +14 -0
- personalclaw/config/prompts/task-side_chat.md +1 -0
- personalclaw/config/prompts/task-subgoal_judge.md +11 -0
- personalclaw/config/prompts/task-suggestions.md +17 -0
- personalclaw/config/prompts/task-title.md +5 -0
- personalclaw/config/schema.py +367 -0
- personalclaw/constants.py +9 -0
- personalclaw/context.py +1358 -0
- personalclaw/context_compaction.py +232 -0
- personalclaw/context_engine.py +260 -0
- personalclaw/context_management.py +620 -0
- personalclaw/dashboard/__init__.py +16 -0
- personalclaw/dashboard/_types.py +21 -0
- personalclaw/dashboard/attachment_extract.py +94 -0
- personalclaw/dashboard/chat.py +144 -0
- personalclaw/dashboard/chat_channel.py +151 -0
- personalclaw/dashboard/chat_folders.py +224 -0
- personalclaw/dashboard/chat_fork.py +199 -0
- personalclaw/dashboard/chat_handlers.py +2237 -0
- personalclaw/dashboard/chat_persistence.py +575 -0
- personalclaw/dashboard/chat_regenerate.py +271 -0
- personalclaw/dashboard/chat_retag.py +362 -0
- personalclaw/dashboard/chat_runner.py +2833 -0
- personalclaw/dashboard/chat_tags.py +443 -0
- personalclaw/dashboard/chat_title.py +363 -0
- personalclaw/dashboard/chat_undo.py +110 -0
- personalclaw/dashboard/chat_utils.py +643 -0
- personalclaw/dashboard/chat_voice.py +121 -0
- personalclaw/dashboard/embedding_reindex.py +194 -0
- personalclaw/dashboard/file_index.py +252 -0
- personalclaw/dashboard/handlers/__init__.py +321 -0
- personalclaw/dashboard/handlers/_shared.py +249 -0
- personalclaw/dashboard/handlers/agent_marketplace.py +290 -0
- personalclaw/dashboard/handlers/agents.py +936 -0
- personalclaw/dashboard/handlers/apps.py +970 -0
- personalclaw/dashboard/handlers/autonudge.py +172 -0
- personalclaw/dashboard/handlers/channels.py +57 -0
- personalclaw/dashboard/handlers/core.py +890 -0
- personalclaw/dashboard/handlers/embedding_reindex.py +135 -0
- personalclaw/dashboard/handlers/files.py +2803 -0
- personalclaw/dashboard/handlers/hooks.py +403 -0
- personalclaw/dashboard/handlers/knowledge.py +1699 -0
- personalclaw/dashboard/handlers/loop_routes.py +971 -0
- personalclaw/dashboard/handlers/mcp.py +1458 -0
- personalclaw/dashboard/handlers/memory.py +1173 -0
- personalclaw/dashboard/handlers/messaging.py +809 -0
- personalclaw/dashboard/handlers/model_downloads.py +137 -0
- personalclaw/dashboard/handlers/model_registry.py +443 -0
- personalclaw/dashboard/handlers/optimizer.py +98 -0
- personalclaw/dashboard/handlers/portability.py +180 -0
- personalclaw/dashboard/handlers/prompts.py +943 -0
- personalclaw/dashboard/handlers/providers.py +1067 -0
- personalclaw/dashboard/handlers/schedule.py +281 -0
- personalclaw/dashboard/handlers/search_registry.py +159 -0
- personalclaw/dashboard/handlers/sessions.py +596 -0
- personalclaw/dashboard/handlers/skills.py +695 -0
- personalclaw/dashboard/handlers/terminal.py +774 -0
- personalclaw/dashboard/handlers/tools.py +411 -0
- personalclaw/dashboard/handlers/triggers.py +753 -0
- personalclaw/dashboard/handlers/updates.py +1077 -0
- personalclaw/dashboard/handlers/updates_kind.py +219 -0
- personalclaw/dashboard/handlers/uploads.py +296 -0
- personalclaw/dashboard/handlers_inbox.py +510 -0
- personalclaw/dashboard/handlers_system.py +693 -0
- personalclaw/dashboard/model_downloads.py +356 -0
- personalclaw/dashboard/origin.py +388 -0
- personalclaw/dashboard/schedule_inject.py +89 -0
- personalclaw/dashboard/server.py +1604 -0
- personalclaw/dashboard/session_health.py +119 -0
- personalclaw/dashboard/side.py +209 -0
- personalclaw/dashboard/side_context.py +53 -0
- personalclaw/dashboard/side_prompts.py +36 -0
- personalclaw/dashboard/side_state.py +53 -0
- personalclaw/dashboard/sse.py +269 -0
- personalclaw/dashboard/state.py +1829 -0
- personalclaw/dashboard/token_auth.py +904 -0
- personalclaw/dashboard/ws.py +131 -0
- personalclaw/diarization/__init__.py +26 -0
- personalclaw/diarization/provider.py +74 -0
- personalclaw/diarization/registry.py +72 -0
- personalclaw/diarize.py +59 -0
- personalclaw/doc_parser.py +237 -0
- personalclaw/embedding_providers/__init__.py +5 -0
- personalclaw/embedding_providers/base.py +74 -0
- personalclaw/embedding_providers/registry.py +273 -0
- personalclaw/engagement_signals.py +161 -0
- personalclaw/env.py +25 -0
- personalclaw/eval/__init__.py +1 -0
- personalclaw/eval/judge.py +95 -0
- personalclaw/eval/runner.py +574 -0
- personalclaw/eval/scenario.py +147 -0
- personalclaw/eval/scenarios/context_accumulation.json +77 -0
- personalclaw/eval/scenarios/lesson_application.json +37 -0
- personalclaw/eval/scenarios/memory_recall_basic.json +64 -0
- personalclaw/eval/scenarios/smoke_test.json +42 -0
- personalclaw/event_triggers.py +250 -0
- personalclaw/frontend.py +206 -0
- personalclaw/fs_watch.py +133 -0
- personalclaw/gateway.py +3186 -0
- personalclaw/gateway_services.py +60 -0
- personalclaw/grill.py +231 -0
- personalclaw/heartbeat.py +247 -0
- personalclaw/history.py +1797 -0
- personalclaw/hooks.py +891 -0
- personalclaw/image_gen/__init__.py +12 -0
- personalclaw/image_gen/bundles/__init__.py +6 -0
- personalclaw/image_gen/openai_provider.py +253 -0
- personalclaw/image_gen/provider.py +125 -0
- personalclaw/image_gen/registry.py +208 -0
- personalclaw/image_gen/stub_provider.py +109 -0
- personalclaw/inbox.py +306 -0
- personalclaw/inbox_providers/__init__.py +30 -0
- personalclaw/inbox_providers/base.py +44 -0
- personalclaw/inbox_providers/filesystem_source.py +77 -0
- personalclaw/inbox_providers/native_source.py +146 -0
- personalclaw/inbox_service.py +444 -0
- personalclaw/knowledge/__init__.py +102 -0
- personalclaw/knowledge/connectors/__init__.py +11 -0
- personalclaw/knowledge/connectors/base.py +131 -0
- personalclaw/knowledge/connectors/web_url.py +163 -0
- personalclaw/knowledge/dedup.py +172 -0
- personalclaw/knowledge/embedder.py +126 -0
- personalclaw/knowledge/extract.py +112 -0
- personalclaw/knowledge/extractor.py +127 -0
- personalclaw/knowledge/ingest_queue.py +124 -0
- personalclaw/knowledge/insights.py +117 -0
- personalclaw/knowledge/intents.py +294 -0
- personalclaw/knowledge/llm_pool.py +234 -0
- personalclaw/knowledge/media.py +183 -0
- personalclaw/knowledge/pipeline/__init__.py +42 -0
- personalclaw/knowledge/pipeline/executor.py +326 -0
- personalclaw/knowledge/pipeline/graph.py +144 -0
- personalclaw/knowledge/pipeline/graphs.py +173 -0
- personalclaw/knowledge/pipeline/nodes/__init__.py +0 -0
- personalclaw/knowledge/pipeline/nodes/_llm.py +84 -0
- personalclaw/knowledge/pipeline/nodes/media_nodes.py +778 -0
- personalclaw/knowledge/pipeline/nodes/text_nodes.py +168 -0
- personalclaw/knowledge/pipeline/registry.py +49 -0
- personalclaw/knowledge/pipeline/runner.py +680 -0
- personalclaw/knowledge/pipeline/types.py +105 -0
- personalclaw/knowledge/readers.py +318 -0
- personalclaw/knowledge/retrieval.py +380 -0
- personalclaw/knowledge/store.py +1129 -0
- personalclaw/knowledge_providers/__init__.py +1 -0
- personalclaw/knowledge_providers/base.py +53 -0
- personalclaw/knowledge_providers/native/__init__.py +154 -0
- personalclaw/knowledge_providers/registry.py +62 -0
- personalclaw/learn.py +187 -0
- personalclaw/lexicon/__init__.py +24 -0
- personalclaw/lexicon/handlers.py +182 -0
- personalclaw/lexicon/phonetics.py +216 -0
- personalclaw/lexicon/service.py +299 -0
- personalclaw/lexicon/store.py +337 -0
- personalclaw/llm/__init__.py +51 -0
- personalclaw/llm/acp_agent.py +866 -0
- personalclaw/llm/acp_session_provider.py +255 -0
- personalclaw/llm/anthropic.py +562 -0
- personalclaw/llm/base.py +181 -0
- personalclaw/llm/capabilities.py +36 -0
- personalclaw/llm/catalog.py +435 -0
- personalclaw/llm/cleanup.py +26 -0
- personalclaw/llm/credentials.py +297 -0
- personalclaw/llm/events.py +79 -0
- personalclaw/llm/openai.py +523 -0
- personalclaw/llm/registry.py +418 -0
- personalclaw/llm/stream_tags.py +208 -0
- personalclaw/llm_helpers.py +395 -0
- personalclaw/local_models/__init__.py +36 -0
- personalclaw/local_models/provider.py +116 -0
- personalclaw/local_models/registry.py +243 -0
- personalclaw/loop/__init__.py +31 -0
- personalclaw/loop/classify.py +325 -0
- personalclaw/loop/code_classify.py +530 -0
- personalclaw/loop/code_plan_briefs.py +437 -0
- personalclaw/loop/design_plan_briefs.py +414 -0
- personalclaw/loop/design_tokens.py +220 -0
- personalclaw/loop/gates.py +147 -0
- personalclaw/loop/goal_meta.py +14 -0
- personalclaw/loop/goal_plan_briefs.py +165 -0
- personalclaw/loop/granularity.py +105 -0
- personalclaw/loop/instrument.py +157 -0
- personalclaw/loop/judge.py +422 -0
- personalclaw/loop/kinds/__init__.py +218 -0
- personalclaw/loop/kinds/design.py +551 -0
- personalclaw/loop/kinds/general.py +150 -0
- personalclaw/loop/kinds/goal.py +695 -0
- personalclaw/loop/kinds/research.py +287 -0
- personalclaw/loop/kinds/sdlc.py +1483 -0
- personalclaw/loop/lifecycle.py +45 -0
- personalclaw/loop/loop.py +270 -0
- personalclaw/loop/manager.py +600 -0
- personalclaw/loop/plan_walkthrough.py +375 -0
- personalclaw/loop/research_plan_briefs.py +91 -0
- personalclaw/loop/sdlc_meta.py +28 -0
- personalclaw/loop/store.py +1093 -0
- personalclaw/loop/tasks_link.py +439 -0
- personalclaw/loop/tick.py +352 -0
- personalclaw/loop/validation.py +229 -0
- personalclaw/loop/watchdog.py +638 -0
- personalclaw/loop/worktree.py +322 -0
- personalclaw/mcp_artifacts.py +737 -0
- personalclaw/mcp_client.py +636 -0
- personalclaw/mcp_core.py +966 -0
- personalclaw/mcp_discovery.py +941 -0
- personalclaw/mcp_memory.py +188 -0
- personalclaw/mcp_schedule.py +716 -0
- personalclaw/mcp_shared.py +404 -0
- personalclaw/mcp_subagents.py +240 -0
- personalclaw/mcp_workflows.py +388 -0
- personalclaw/media_catalogs.py +71 -0
- personalclaw/memory.py +370 -0
- personalclaw/memory_lint.py +153 -0
- personalclaw/memory_providers/__init__.py +5 -0
- personalclaw/memory_providers/base.py +135 -0
- personalclaw/memory_providers/filesystem.py +144 -0
- personalclaw/memory_providers/registry.py +47 -0
- personalclaw/memory_record.py +364 -0
- personalclaw/memory_service.py +1215 -0
- personalclaw/memory_vault.py +463 -0
- personalclaw/model_pricing.json +29 -0
- personalclaw/model_tokens.json +39 -0
- personalclaw/model_windows.py +79 -0
- personalclaw/net/__init__.py +38 -0
- personalclaw/net/client.py +211 -0
- personalclaw/net/guard.py +230 -0
- personalclaw/net/policy.py +99 -0
- personalclaw/nl_to_cron.py +71 -0
- personalclaw/orchestrator_skill.py +128 -0
- personalclaw/planning/__init__.py +41 -0
- personalclaw/planning/runner.py +210 -0
- personalclaw/planning/session.py +239 -0
- personalclaw/portability.py +314 -0
- personalclaw/preference_facets.py +324 -0
- personalclaw/pricing.py +90 -0
- personalclaw/projects.py +132 -0
- personalclaw/prompt_providers/__init__.py +56 -0
- personalclaw/prompt_providers/base.py +286 -0
- personalclaw/prompt_providers/catalog.py +1506 -0
- personalclaw/prompt_providers/engine.py +871 -0
- personalclaw/prompt_providers/native_provider.py +480 -0
- personalclaw/prompt_providers/registry.py +55 -0
- personalclaw/prompt_providers/runtime.py +119 -0
- personalclaw/provider_registry.py +26 -0
- personalclaw/providers/__init__.py +11 -0
- personalclaw/providers/entity_routes.py +278 -0
- personalclaw/providers/instance_routes.py +364 -0
- personalclaw/providers/instances.py +144 -0
- personalclaw/providers/loader.py +296 -0
- personalclaw/providers/mcp_instances.py +164 -0
- personalclaw/providers/media_scanners.py +78 -0
- personalclaw/providers/prompt_use_cases.py +189 -0
- personalclaw/providers/provider_bridge.py +939 -0
- personalclaw/providers/registry.py +691 -0
- personalclaw/providers/routes.py +228 -0
- personalclaw/providers/settings.py +95 -0
- personalclaw/providers/use_cases.py +429 -0
- personalclaw/py.typed +1 -0
- personalclaw/sandbox.py +669 -0
- personalclaw/schedule.py +1473 -0
- personalclaw/schedule_history.py +288 -0
- personalclaw/schedule_script.py +296 -0
- personalclaw/schedule_trigger.py +43 -0
- personalclaw/sdk/__init__.py +28 -0
- personalclaw/sdk/acp.py +25 -0
- personalclaw/sdk/action.py +13 -0
- personalclaw/sdk/channel.py +144 -0
- personalclaw/sdk/cli.py +77 -0
- personalclaw/sdk/credentials.py +11 -0
- personalclaw/sdk/diarization.py +23 -0
- personalclaw/sdk/embedding.py +12 -0
- personalclaw/sdk/image.py +23 -0
- personalclaw/sdk/inbox.py +12 -0
- personalclaw/sdk/knowledge.py +13 -0
- personalclaw/sdk/local_model.py +13 -0
- personalclaw/sdk/manifest.py +17 -0
- personalclaw/sdk/mcp.py +18 -0
- personalclaw/sdk/memory.py +11 -0
- personalclaw/sdk/model.py +115 -0
- personalclaw/sdk/net.py +44 -0
- personalclaw/sdk/prompt.py +21 -0
- personalclaw/sdk/provider_helpers.py +346 -0
- personalclaw/sdk/search.py +36 -0
- personalclaw/sdk/security.py +11 -0
- personalclaw/sdk/settings.py +11 -0
- personalclaw/sdk/skill.py +24 -0
- personalclaw/sdk/stt.py +26 -0
- personalclaw/sdk/tool.py +27 -0
- personalclaw/sdk/tts.py +13 -0
- personalclaw/sdk/util.py +19 -0
- personalclaw/sdk/video.py +22 -0
- personalclaw/search_providers/__init__.py +28 -0
- personalclaw/search_providers/base.py +235 -0
- personalclaw/search_providers/registry.py +212 -0
- personalclaw/search_providers/use_cases.py +101 -0
- personalclaw/security.py +964 -0
- personalclaw/seed.py +376 -0
- personalclaw/sel.py +448 -0
- personalclaw/service/__init__.py +42 -0
- personalclaw/service/common.py +74 -0
- personalclaw/service/controller.py +134 -0
- personalclaw/service/linux.py +255 -0
- personalclaw/service/macos.py +184 -0
- personalclaw/session.py +1833 -0
- personalclaw/session_map.py +217 -0
- personalclaw/session_pid.py +654 -0
- personalclaw/session_restrictions.py +62 -0
- personalclaw/session_workspace.py +118 -0
- personalclaw/skills/__init__.py +32 -0
- personalclaw/skills/bundled/__init__.py +6 -0
- personalclaw/skills/bundled/artifacts/SKILL.md +90 -0
- personalclaw/skills/bundled/delegation/SKILL.md +76 -0
- personalclaw/skills/bundled/editorial-document/SKILL.md +101 -0
- personalclaw/skills/bundled/grill/SKILL.md +40 -0
- personalclaw/skills/bundled/infographic-syntax/SKILL.md +89 -0
- personalclaw/skills/bundled/knowledge-grounding/SKILL.md +70 -0
- personalclaw/skills/bundled/loop-worker/SKILL.md +150 -0
- personalclaw/skills/bundled/memory-discipline/SKILL.md +83 -0
- personalclaw/skills/bundled/pclaw-features/SKILL.md +100 -0
- personalclaw/skills/bundled/task-and-project/SKILL.md +85 -0
- personalclaw/skills/bundled/visual-output/SKILL.md +283 -0
- personalclaw/skills/curator.py +219 -0
- personalclaw/skills/ephemeral.py +247 -0
- personalclaw/skills/loader.py +807 -0
- personalclaw/skills/marketplace.py +593 -0
- personalclaw/skills/native.py +130 -0
- personalclaw/skills/proposals.py +202 -0
- personalclaw/skills/surfacing.py +273 -0
- personalclaw/skills/usage.py +128 -0
- personalclaw/snapshot.py +713 -0
- personalclaw/static/dist/assets/AgentsSection-D2HNpK3H.js +1 -0
- personalclaw/static/dist/assets/AppHostPage-DUAFOu8u.js +1 -0
- personalclaw/static/dist/assets/AppsSection-DcuzwiZk.js +1 -0
- personalclaw/static/dist/assets/CockpitPromptBar-CJNPc2c-.js +2 -0
- personalclaw/static/dist/assets/CodeSection-BbzIcbAr.js +10 -0
- personalclaw/static/dist/assets/Combobox-C_YTjfW8.js +1 -0
- personalclaw/static/dist/assets/DagView-CcwKyxIr.js +1 -0
- personalclaw/static/dist/assets/DashboardPage-BXyEbQz9.js +1 -0
- personalclaw/static/dist/assets/DesignCockpitPage-B-RSWO5P.js +5 -0
- personalclaw/static/dist/assets/FilesSection-Dg8qsPgr.js +1 -0
- personalclaw/static/dist/assets/FilterMenu-lHdXNbj4.js +1 -0
- personalclaw/static/dist/assets/InboxPage-Yucf6lfs.js +1 -0
- personalclaw/static/dist/assets/InfographicView-P3M7GFR5.js +1 -0
- personalclaw/static/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- personalclaw/static/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- personalclaw/static/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- personalclaw/static/dist/assets/KnowledgeSection-DyEutiSq.js +2 -0
- personalclaw/static/dist/assets/ListControls-CQnCbk7R.js +1 -0
- personalclaw/static/dist/assets/LoopSection-D2UGH5AC.js +1 -0
- personalclaw/static/dist/assets/LoopsSection-BGtXgwiH.js +6 -0
- personalclaw/static/dist/assets/Markdown-BDVlMqTq.js +302 -0
- personalclaw/static/dist/assets/Markdown-ClQbWekD.css +1 -0
- personalclaw/static/dist/assets/Modal-Z5bGqyVe.js +1 -0
- personalclaw/static/dist/assets/NotificationsPage-DUTcSPVN.js +1 -0
- personalclaw/static/dist/assets/PlanningArtifactDoc-DJsfB5L5.js +4 -0
- personalclaw/static/dist/assets/Popover-Chkebw3m.js +1 -0
- personalclaw/static/dist/assets/ProjectsSection-Dv6qfIbT.js +1 -0
- personalclaw/static/dist/assets/PromptsSection-DnY8b1wQ.js +3 -0
- personalclaw/static/dist/assets/Segmented-CJyXjRoh.js +1 -0
- personalclaw/static/dist/assets/SettingsPage-D6wr5li6.js +4 -0
- personalclaw/static/dist/assets/SkillsPage-DAItfKJY.js +9 -0
- personalclaw/static/dist/assets/TasksSection-CNqdaJY9.js +2 -0
- personalclaw/static/dist/assets/TerminalPage-C55Q1OWK.js +1 -0
- personalclaw/static/dist/assets/ToolsPage-CydPomPB.js +2 -0
- personalclaw/static/dist/assets/TopBar-BMJKDgFq.js +1 -0
- personalclaw/static/dist/assets/TriggersSection-x9BE94nD.js +1 -0
- personalclaw/static/dist/assets/WorkbenchLayout-BbX58Jyp.js +1 -0
- personalclaw/static/dist/assets/WorkflowsSection-B9GBIERe.js +1 -0
- personalclaw/static/dist/assets/WorkspacePicker-CFgweODu.js +1 -0
- personalclaw/static/dist/assets/_baseClone-CgC5_fVW.js +1 -0
- personalclaw/static/dist/assets/abap-08VXUWAP.js +1 -0
- personalclaw/static/dist/assets/abnfDiagram-VRR7QNED-CeR1eIrQ.js +1 -0
- personalclaw/static/dist/assets/activeProject-X97a4kX5.js +1 -0
- personalclaw/static/dist/assets/activity-B72Ydod2.js +1 -0
- personalclaw/static/dist/assets/agents-BoQgSqd8.js +1 -0
- personalclaw/static/dist/assets/anchor-Bb1uxqwU.js +1 -0
- personalclaw/static/dist/assets/apex-BWPQTe0t.js +1 -0
- personalclaw/static/dist/assets/api-CACQRbCe.js +10 -0
- personalclaw/static/dist/assets/appConfigForm-CczWhwqZ.js +1 -0
- personalclaw/static/dist/assets/appIcon-lqagLloG.js +1 -0
- personalclaw/static/dist/assets/arc-Bi22H63W.js +1 -0
- personalclaw/static/dist/assets/architecture-TIHT7OUA-BWqzHezU.js +1 -0
- personalclaw/static/dist/assets/architectureDiagram-ZJ3FMSHR-BVn7mefo.js +36 -0
- personalclaw/static/dist/assets/array-BifhSqXX.js +1 -0
- personalclaw/static/dist/assets/arrow-left-DEdVu4qO.js +1 -0
- personalclaw/static/dist/assets/arrow-right-cpbZdypc.js +1 -0
- personalclaw/static/dist/assets/arrow-up-right-zqcFzg4c.js +1 -0
- personalclaw/static/dist/assets/azcli-Bc_sGQ0U.js +1 -0
- personalclaw/static/dist/assets/bat-i0X4ZdIN.js +1 -0
- personalclaw/static/dist/assets/bell-B8EZZbF_.js +1 -0
- personalclaw/static/dist/assets/bicep-B5-_aFwp.js +2 -0
- personalclaw/static/dist/assets/blockDiagram-677ZJIJ3-CDXmXQFa.js +132 -0
- personalclaw/static/dist/assets/book-open-DQTctPc5.js +1 -0
- personalclaw/static/dist/assets/bot-BxwpJWV5.js +1 -0
- personalclaw/static/dist/assets/box-CuRMP9Xp.js +1 -0
- personalclaw/static/dist/assets/boxes-k5hb8Rv-.js +1 -0
- personalclaw/static/dist/assets/c4Diagram-LMCZKHZV-OiOQafWV.js +10 -0
- personalclaw/static/dist/assets/cameligo-DMUM7wLl.js +1 -0
- personalclaw/static/dist/assets/channel-XtWxHV5d.js +1 -0
- personalclaw/static/dist/assets/chart-column-CY3ge8RW.js +1 -0
- personalclaw/static/dist/assets/check-check-C-nMRcrO.js +1 -0
- personalclaw/static/dist/assets/chevron-right-C9ZrDoNw.js +1 -0
- personalclaw/static/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- personalclaw/static/dist/assets/chunk-32BRIVSS-DUyytNlh.js +1 -0
- personalclaw/static/dist/assets/chunk-52WLFC77-E5R8UKPa.js +10 -0
- personalclaw/static/dist/assets/chunk-5FCAYU7R-DNtJmW0j.js +1 -0
- personalclaw/static/dist/assets/chunk-5HE753X5-o8-OCfIL.js +1 -0
- personalclaw/static/dist/assets/chunk-5JV3BV7I-DKfYBAeY.js +1 -0
- personalclaw/static/dist/assets/chunk-5TONJI2A-DOX2waSJ.js +2 -0
- personalclaw/static/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- personalclaw/static/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- personalclaw/static/dist/assets/chunk-BIQX33UG-CuPbkyWp.js +1 -0
- personalclaw/static/dist/assets/chunk-C7G6YPKG-By7THYkI.js +1 -0
- personalclaw/static/dist/assets/chunk-CQNSW5MT-BbEh_krl.js +1 -0
- personalclaw/static/dist/assets/chunk-CYSBUYHQ-CbOq7Rc1.js +1 -0
- personalclaw/static/dist/assets/chunk-EMLP6XTP-BoneA0Uo.js +1 -0
- personalclaw/static/dist/assets/chunk-EX3LRPZG-BVpNXdQl.js +231 -0
- personalclaw/static/dist/assets/chunk-FWX5IMBZ-_FzoCdFq.js +2 -0
- personalclaw/static/dist/assets/chunk-HOUHSVGY-CA9JB66F.js +1 -0
- personalclaw/static/dist/assets/chunk-ICXQ74PX-7k2dcNNp.js +2 -0
- personalclaw/static/dist/assets/chunk-JG7HCLWE-Dk4_aECj.js +2 -0
- personalclaw/static/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- personalclaw/static/dist/assets/chunk-KEIR6QF5-Dj-OpFgW.js +161 -0
- personalclaw/static/dist/assets/chunk-MOJQB5TN-UrNo9Dl9.js +88 -0
- personalclaw/static/dist/assets/chunk-MOZMSUNE-BgA8jCvb.js +1 -0
- personalclaw/static/dist/assets/chunk-OGEWGWER-8nh2CNLl.js +1 -0
- personalclaw/static/dist/assets/chunk-OSBZ3O6U-CX9EQ5t2.js +1 -0
- personalclaw/static/dist/assets/chunk-PUDLZKDR-DHnl7Vbn.js +156 -0
- personalclaw/static/dist/assets/chunk-Q4XR5HBZ-BNAup0DB.js +70 -0
- personalclaw/static/dist/assets/chunk-QBLGF6JB-C9zGMqvP.js +1 -0
- personalclaw/static/dist/assets/chunk-R7FJI6CG-BpBhcF6R.js +1 -0
- personalclaw/static/dist/assets/chunk-RYQCIY6F-wIahH7Y2.js +1 -0
- personalclaw/static/dist/assets/chunk-U6XO7XAA-CR0BSRFR.js +2 -0
- personalclaw/static/dist/assets/chunk-V7JOEXUC-BwRjI2ve.js +206 -0
- personalclaw/static/dist/assets/chunk-VAUOI2AC-DQS1S8BI.js +1 -0
- personalclaw/static/dist/assets/chunk-VR4S4FIN-5LkGPPTo.js +1 -0
- personalclaw/static/dist/assets/chunk-WYO6CB5R-CvPO17RH.js +127 -0
- personalclaw/static/dist/assets/chunk-X3CZISLH-ojMe8fWI.js +1 -0
- personalclaw/static/dist/assets/chunk-XXDRQBXY-Bf8QdBI1.js +1 -0
- personalclaw/static/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- personalclaw/static/dist/assets/chunk-YOTPTUD7-CjHV8V6f.js +1 -0
- personalclaw/static/dist/assets/chunk-ZGVPDNZ5-Dq9tgF8F.js +62 -0
- personalclaw/static/dist/assets/chunk-ZIRB5QZD-C6fEPe3t.js +32 -0
- personalclaw/static/dist/assets/chunkedUpload-8_bGV0pg.js +1 -0
- personalclaw/static/dist/assets/circle-CyhPObT_.js +1 -0
- personalclaw/static/dist/assets/circle-check-D2FbfCh0.js +1 -0
- personalclaw/static/dist/assets/circle-question-mark-BIpy_bwO.js +1 -0
- personalclaw/static/dist/assets/circle-slash-BqxQ1K2m.js +1 -0
- personalclaw/static/dist/assets/circle-x-CyHlcywd.js +1 -0
- personalclaw/static/dist/assets/classDiagram-OUVF2IWQ-bwJJ-BcI.js +1 -0
- personalclaw/static/dist/assets/classDiagram-v2-EOCWNBFH-bwJJ-BcI.js +1 -0
- personalclaw/static/dist/assets/clock-H9P_EVQD.js +1 -0
- personalclaw/static/dist/assets/clojure-Cm7r79vr.js +1 -0
- personalclaw/static/dist/assets/code-xml-zRCJsUiW.js +1 -0
- personalclaw/static/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- personalclaw/static/dist/assets/coffee-Ba7i2nA0.js +1 -0
- personalclaw/static/dist/assets/contentTypes-ZqeuxEnU.js +1 -0
- personalclaw/static/dist/assets/copy-COewHhMx.js +1 -0
- personalclaw/static/dist/assets/corner-down-left-DViVpu4S.js +1 -0
- personalclaw/static/dist/assets/corner-down-right-BfJQ4oRS.js +1 -0
- personalclaw/static/dist/assets/cose-bilkent-JH36ORCC-BXt3jwU7.js +1 -0
- personalclaw/static/dist/assets/cpp-C7h46wYY.js +1 -0
- personalclaw/static/dist/assets/cpu-Bb2_4j_A.js +1 -0
- personalclaw/static/dist/assets/csharp-BKxtCVv1.js +1 -0
- personalclaw/static/dist/assets/csp-bTuwJoIa.js +1 -0
- personalclaw/static/dist/assets/css-DIMkf-bt.js +3 -0
- personalclaw/static/dist/assets/css.worker-yKcq13f2.js +89 -0
- personalclaw/static/dist/assets/cssMode-DEsrBFiI.js +1 -0
- personalclaw/static/dist/assets/cynefin-VYW2F7L2-4m18BxUG.js +1 -0
- personalclaw/static/dist/assets/cynefinDiagram-TSTJHNR4-Cc660zMB.js +62 -0
- personalclaw/static/dist/assets/cypher-CVaqCwHa.js +1 -0
- personalclaw/static/dist/assets/cytoscape.esm-CQFVGiJu.js +321 -0
- personalclaw/static/dist/assets/dagre-BGeTjBId.js +1 -0
- personalclaw/static/dist/assets/dagre-VKFMJZFB-ry8Xesg8.js +4 -0
- personalclaw/static/dist/assets/dart-onAF5SnQ.js +1 -0
- personalclaw/static/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
- personalclaw/static/dist/assets/diagram-FQU43EPY-CjwH52DD.js +3 -0
- personalclaw/static/dist/assets/diagram-G47NLZAW-C5mVN3-R.js +24 -0
- personalclaw/static/dist/assets/diagram-NH7WQ7WH-k4VKpPeF.js +24 -0
- personalclaw/static/dist/assets/diagram-OA4YK3LP-CM7K4mor.js +30 -0
- personalclaw/static/dist/assets/diagram-WEI45ONY-De1xw6DL.js +41 -0
- personalclaw/static/dist/assets/dialog-BahzhVcv.js +1 -0
- personalclaw/static/dist/assets/dialogStore-BEZvW6c8.js +1 -0
- personalclaw/static/dist/assets/dist-CjNnd4gY.js +1 -0
- personalclaw/static/dist/assets/dist-DLiMshR7.js +11 -0
- personalclaw/static/dist/assets/dockerfile-DZFCIeNp.js +1 -0
- personalclaw/static/dist/assets/download-B5zzl5uZ.js +1 -0
- personalclaw/static/dist/assets/download-z7ADXQw_.js +1 -0
- personalclaw/static/dist/assets/ebnfDiagram-CCIWWBDH-BJD6kZPa.js +1 -0
- personalclaw/static/dist/assets/ecl-D05T4iGw.js +1 -0
- personalclaw/static/dist/assets/editor-Br_kD0ds.css +1 -0
- personalclaw/static/dist/assets/editor.api2-4ndOupAA.js +872 -0
- personalclaw/static/dist/assets/editor.worker-tytyn86m.js +26 -0
- personalclaw/static/dist/assets/elixir-6RTg0lbw.js +1 -0
- personalclaw/static/dist/assets/ellipsis-BAF3NCVx.js +1 -0
- personalclaw/static/dist/assets/erDiagram-Q63AITRT-BURNYK88.js +85 -0
- personalclaw/static/dist/assets/esm-nNdQxdC0.js +596 -0
- personalclaw/static/dist/assets/eventmodeling-45OFAUF4-Dp0gpjhg.js +1 -0
- personalclaw/static/dist/assets/external-link-BFMb3_Mp.js +1 -0
- personalclaw/static/dist/assets/eye-TdldIA27.js +1 -0
- personalclaw/static/dist/assets/file-BEKmT1PY.js +1 -0
- personalclaw/static/dist/assets/file-box-Bl1VI3Ye.js +1 -0
- personalclaw/static/dist/assets/file-code-corner-QupU9_qt.js +1 -0
- personalclaw/static/dist/assets/file-plus-corner-CO5vspMV.js +1 -0
- personalclaw/static/dist/assets/file-text-x9wkcuEf.js +1 -0
- personalclaw/static/dist/assets/files-CqnUOG-O.js +1 -0
- personalclaw/static/dist/assets/filesData-Cey9VAFK.js +1 -0
- personalclaw/static/dist/assets/flow9-C5_-GSwl.js +1 -0
- personalclaw/static/dist/assets/flowDiagram-23GEKE2U-DJULeRHJ.js +1 -0
- personalclaw/static/dist/assets/folder-BegDsmu3.js +1 -0
- personalclaw/static/dist/assets/folder-kanban-CtQWqQ8-.js +1 -0
- personalclaw/static/dist/assets/folder-open-DUEh06xk.js +1 -0
- personalclaw/static/dist/assets/folder-plus-Bio_dTbt.js +1 -0
- personalclaw/static/dist/assets/folder-tree-CyuoHQPR.js +1 -0
- personalclaw/static/dist/assets/freemarker2-CELlTDJ2.js +3 -0
- personalclaw/static/dist/assets/fsharp-C8Ef5oNN.js +1 -0
- personalclaw/static/dist/assets/ganttDiagram-NO4QXBWP-BuqshviA.js +292 -0
- personalclaw/static/dist/assets/gauge-Yx9eA7LL.js +1 -0
- personalclaw/static/dist/assets/git-branch-xBpxiFXO.js +1 -0
- personalclaw/static/dist/assets/gitGraph-TEB2WS4Q-Do0SQOtM.js +1 -0
- personalclaw/static/dist/assets/gitGraphDiagram-IHSO6WYX-CKjwC-Eh.js +106 -0
- personalclaw/static/dist/assets/go-C-y9NEjX.js +1 -0
- personalclaw/static/dist/assets/graphlib-C9B6zziv.js +1 -0
- personalclaw/static/dist/assets/graphql-fmXr3nnJ.js +1 -0
- personalclaw/static/dist/assets/grip-vertical-C8pqE5eO.js +1 -0
- personalclaw/static/dist/assets/handlebars-NEjHJ7o_.js +1 -0
- personalclaw/static/dist/assets/hash-Bs9Rl_OS.js +1 -0
- personalclaw/static/dist/assets/hcl-CpzslTdj.js +1 -0
- personalclaw/static/dist/assets/hierarchy-CqMyrAty.js +1 -0
- personalclaw/static/dist/assets/html-CA10zN5A.js +1 -0
- personalclaw/static/dist/assets/html.worker-DSJ9zmd7.js +502 -0
- personalclaw/static/dist/assets/htmlMode-TrYTXwZp.js +1 -0
- personalclaw/static/dist/assets/image-C9polQzp.js +1 -0
- personalclaw/static/dist/assets/image-off-BMFKtweh.js +1 -0
- personalclaw/static/dist/assets/inbox-D5YaLjhA.js +1 -0
- personalclaw/static/dist/assets/index-BYyVBFnD.css +2 -0
- personalclaw/static/dist/assets/index-BnqfrCeD.js +270 -0
- personalclaw/static/dist/assets/info-Cssn46_l.js +1 -0
- personalclaw/static/dist/assets/info-DKCQHKI2-DIc7uC4I.js +1 -0
- personalclaw/static/dist/assets/infoDiagram-FWYZ7A6U-aDwx_tBf.js +2 -0
- personalclaw/static/dist/assets/ini-sBoK_t0W.js +1 -0
- personalclaw/static/dist/assets/init-D6jRqBbL.js +1 -0
- personalclaw/static/dist/assets/isArrayLikeObject-DAE2nXMg.js +1 -0
- personalclaw/static/dist/assets/ishikawaDiagram-FXEZZL3T-BL-cQm7s.js +70 -0
- personalclaw/static/dist/assets/java-BEtHBSE6.js +1 -0
- personalclaw/static/dist/assets/javascript-B1gDmwzS.js +1 -0
- personalclaw/static/dist/assets/journeyDiagram-5HDEW3XC-CM5TyC5t.js +139 -0
- personalclaw/static/dist/assets/json.worker-Oa9UrkKE.js +58 -0
- personalclaw/static/dist/assets/jsonMode-CoFNTEgP.js +7 -0
- personalclaw/static/dist/assets/jsx-runtime-DkSmJVHh.js +1 -0
- personalclaw/static/dist/assets/julia-Bri6UV-V.js +1 -0
- personalclaw/static/dist/assets/kanban-definition-HUTT4EX6-lXFNSEO-.js +89 -0
- personalclaw/static/dist/assets/katex-B7rAX3Vi.js +257 -0
- personalclaw/static/dist/assets/kotlin-BOotOW0E.js +1 -0
- personalclaw/static/dist/assets/less-B9JPFI3C.js +2 -0
- personalclaw/static/dist/assets/lexon-CfSJPG6W.js +1 -0
- personalclaw/static/dist/assets/lightbulb-hxqtxQSr.js +1 -0
- personalclaw/static/dist/assets/line-CyKHd6T7.js +1 -0
- personalclaw/static/dist/assets/linear-1zh3NrGZ.js +1 -0
- personalclaw/static/dist/assets/linear-BuJiVv47.js +1 -0
- personalclaw/static/dist/assets/link-2-DhS_lcQM.js +1 -0
- personalclaw/static/dist/assets/link-CoAbfcu_.js +1 -0
- personalclaw/static/dist/assets/liquid-BY6hCUXG.js +1 -0
- personalclaw/static/dist/assets/list-checks-CXSudmRo.js +1 -0
- personalclaw/static/dist/assets/list-ordered-DbvnvdzZ.js +1 -0
- personalclaw/static/dist/assets/loader-circle-DHWKh5M0.js +1 -0
- personalclaw/static/dist/assets/lock-DXTiRPy-.js +1 -0
- personalclaw/static/dist/assets/loopKind-Dodoh8fQ.js +1 -0
- personalclaw/static/dist/assets/loopStatus-DWXaenKM.js +1 -0
- personalclaw/static/dist/assets/loopStatusMeta-CODHi2sz.js +1 -0
- personalclaw/static/dist/assets/lspLanguageFeatures-ira2aEJh.js +4 -0
- personalclaw/static/dist/assets/lua-CsQS60Ue.js +1 -0
- personalclaw/static/dist/assets/m3-D-oSqn_W.js +1 -0
- personalclaw/static/dist/assets/map-sKxWa81l.js +1 -0
- personalclaw/static/dist/assets/markdown-Cimd5fb3.js +1 -0
- personalclaw/static/dist/assets/math-Bi_r_ZWc.js +1 -0
- personalclaw/static/dist/assets/mdx-BNx0xr3N.js +1 -0
- personalclaw/static/dist/assets/merge-Ci_rv-un.js +1 -0
- personalclaw/static/dist/assets/mermaid-parser.core-CMbO70Iy.js +4 -0
- personalclaw/static/dist/assets/mermaid.core-CU3bi7fi.js +11 -0
- personalclaw/static/dist/assets/message-square-D9ze_qUH.js +1 -0
- personalclaw/static/dist/assets/message-square-plus-Ds5jn1qm.js +1 -0
- personalclaw/static/dist/assets/messages-square-C8EXqqSr.js +1 -0
- personalclaw/static/dist/assets/mic-OMC8qktP.js +1 -0
- personalclaw/static/dist/assets/mindmap-definition-LN4V7U3C-BlIo3lVQ.js +96 -0
- personalclaw/static/dist/assets/minimize-2-BYtwlrCh.js +1 -0
- personalclaw/static/dist/assets/mips-CIPQ_RoX.js +1 -0
- personalclaw/static/dist/assets/motion-DA2L2I0W.js +1 -0
- personalclaw/static/dist/assets/msdax-DauUninz.js +1 -0
- personalclaw/static/dist/assets/mysql-SOo6toE5.js +1 -0
- personalclaw/static/dist/assets/objective-c-FvmIjYaQ.js +1 -0
- personalclaw/static/dist/assets/ordinal-hYBb2elL.js +1 -0
- personalclaw/static/dist/assets/packet-7NZHBO7P-D2duWGIK.js +1 -0
- personalclaw/static/dist/assets/palette--haKdu99.js +1 -0
- personalclaw/static/dist/assets/panel-right-C3LrrPlj.js +1 -0
- personalclaw/static/dist/assets/panel-right-open-9Yb9cjHO.js +1 -0
- personalclaw/static/dist/assets/pascal-DrH0SRf2.js +1 -0
- personalclaw/static/dist/assets/pascaligo-D-ptJ9y-.js +1 -0
- personalclaw/static/dist/assets/path-BWPyau1x.js +1 -0
- personalclaw/static/dist/assets/pause-BGbidogR.js +1 -0
- personalclaw/static/dist/assets/pegDiagram-2B236MQR-Cbw1axx9.js +1 -0
- personalclaw/static/dist/assets/pencil-K9CB5__b.js +1 -0
- personalclaw/static/dist/assets/perl-oz_6vUea.js +1 -0
- personalclaw/static/dist/assets/pgsql-DTj74zXo.js +1 -0
- personalclaw/static/dist/assets/php-nr791fC2.js +1 -0
- personalclaw/static/dist/assets/pie-BgBEsAQg.js +1 -0
- personalclaw/static/dist/assets/pie-RZYD4A2V-CynqTUkZ.js +1 -0
- personalclaw/static/dist/assets/pieDiagram-ENE6RG2P-B6x-pnpe.js +39 -0
- personalclaw/static/dist/assets/pla-CopQ2nXW.js +1 -0
- personalclaw/static/dist/assets/play-BTCrmbn0.js +1 -0
- personalclaw/static/dist/assets/plug-DEp4tSQG.js +1 -0
- personalclaw/static/dist/assets/plus-ln0ZZUVd.js +1 -0
- personalclaw/static/dist/assets/postiats-43DmfD33.js +1 -0
- personalclaw/static/dist/assets/powerquery-D3hlyOfw.js +1 -0
- personalclaw/static/dist/assets/powershell-DmHpPYUd.js +1 -0
- personalclaw/static/dist/assets/preload-helper-Czpn1I53.js +1 -0
- personalclaw/static/dist/assets/protobuf-C531GsRP.js +2 -0
- personalclaw/static/dist/assets/pug-Z5eAx3Zn.js +1 -0
- personalclaw/static/dist/assets/python-DLdbtmNw.js +1 -0
- personalclaw/static/dist/assets/qsharp-DkqhCAOL.js +1 -0
- personalclaw/static/dist/assets/quadrantDiagram-ABIIQ3AL-SynMu_Dr.js +7 -0
- personalclaw/static/dist/assets/r-BwWrilGY.js +1 -0
- personalclaw/static/dist/assets/radar-I7S5WNFK-fIKE12aT.js +1 -0
- personalclaw/static/dist/assets/railroad-3IZDKUUU-Bgx8HJTj.js +1 -0
- personalclaw/static/dist/assets/railroad-abnf-AHOZXSZD-Nh6k60mH.js +1 -0
- personalclaw/static/dist/assets/railroad-ebnf-EBAXGLYW-C74h3s_I.js +1 -0
- personalclaw/static/dist/assets/railroad-peg-LSFZ7HO6-0hT-lN-u.js +1 -0
- personalclaw/static/dist/assets/railroadDiagram-RFXS5EU6-CYcZMCNE.js +1 -0
- personalclaw/static/dist/assets/razor-B9gdhAbR.js +1 -0
- personalclaw/static/dist/assets/react-Augu_vA3.js +1 -0
- personalclaw/static/dist/assets/redis-ClamHrr6.js +1 -0
- personalclaw/static/dist/assets/redshift-DT7zqm-g.js +1 -0
- personalclaw/static/dist/assets/refresh-cw-C8O1GKy3.js +1 -0
- personalclaw/static/dist/assets/renderers-DjtPj68j.js +3 -0
- personalclaw/static/dist/assets/repeat-DByY8U_U.js +1 -0
- personalclaw/static/dist/assets/requirementDiagram-TGXJPOKE-Dm7sDAlQ.js +84 -0
- personalclaw/static/dist/assets/restructuredtext-BYgofb2h.js +1 -0
- personalclaw/static/dist/assets/rocket-DOmNFtdM.js +1 -0
- personalclaw/static/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- personalclaw/static/dist/assets/rotate-ccw-CthZ29rh.js +1 -0
- personalclaw/static/dist/assets/rotate-cw--4225WRk.js +1 -0
- personalclaw/static/dist/assets/rough.esm-CSKSodPl.js +1 -0
- personalclaw/static/dist/assets/route-CzTsyL8c.js +1 -0
- personalclaw/static/dist/assets/ruby-DezsRK8O.js +1 -0
- personalclaw/static/dist/assets/runFold-DUbhN5VF.js +1 -0
- personalclaw/static/dist/assets/rust-DdL9SqIa.js +1 -0
- personalclaw/static/dist/assets/sankeyDiagram-HTMAVEWB-Dix3Bpzb.js +40 -0
- personalclaw/static/dist/assets/save-BUEpt5QU.js +1 -0
- personalclaw/static/dist/assets/sb-CcwsVR0C.js +1 -0
- personalclaw/static/dist/assets/scala-DHpiXF5c.js +1 -0
- personalclaw/static/dist/assets/schema-D_MgGOja.js +1 -0
- personalclaw/static/dist/assets/scheme-BeGwcela.js +1 -0
- personalclaw/static/dist/assets/scroll-text-Bk6LAWwc.js +1 -0
- personalclaw/static/dist/assets/scss-gp-XZpBa.js +3 -0
- personalclaw/static/dist/assets/send-BmJrZ-YS.js +1 -0
- personalclaw/static/dist/assets/sequenceDiagram-DBY2YBRQ-TMZlQYHp.js +162 -0
- personalclaw/static/dist/assets/server-C7E4ajUJ.js +1 -0
- personalclaw/static/dist/assets/settings-2-DQV3qEOG.js +1 -0
- personalclaw/static/dist/assets/settings-CGVc5_1Y.js +1 -0
- personalclaw/static/dist/assets/settingsUI--T9KZk-9.js +1 -0
- personalclaw/static/dist/assets/shell-CC2rA5mh.js +1 -0
- personalclaw/static/dist/assets/shield-alert-CoSWpfv8.js +1 -0
- personalclaw/static/dist/assets/shield-check-BEJumkg5.js +1 -0
- personalclaw/static/dist/assets/shield-question-mark-OYEo4GOa.js +1 -0
- personalclaw/static/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- personalclaw/static/dist/assets/slash-F4HNShMo.js +1 -0
- personalclaw/static/dist/assets/sliders-horizontal-DzfDrd1G.js +1 -0
- personalclaw/static/dist/assets/solidity-BEEn4gHE.js +1 -0
- personalclaw/static/dist/assets/sophia-CRfGWb83.js +1 -0
- personalclaw/static/dist/assets/sparkle-BT02FlB7.js +1 -0
- personalclaw/static/dist/assets/sparkles-BBJm1DsM.js +1 -0
- personalclaw/static/dist/assets/sparql-D_Lu-MrJ.js +1 -0
- personalclaw/static/dist/assets/sql-NEE52Syq.js +1 -0
- personalclaw/static/dist/assets/square-Bi3pzOph.js +1 -0
- personalclaw/static/dist/assets/square-terminal-Cm97L47M.js +1 -0
- personalclaw/static/dist/assets/src-B7FMst6f.js +1 -0
- personalclaw/static/dist/assets/st-DbInun42.js +1 -0
- personalclaw/static/dist/assets/star-yiQz9yK1.js +1 -0
- personalclaw/static/dist/assets/stateDiagram-2N3HPSRC-SLpHy26q.js +1 -0
- personalclaw/static/dist/assets/stateDiagram-v2-6OUMAXLB-CxFGN2fy.js +1 -0
- personalclaw/static/dist/assets/store-MzxkCY0r.js +1 -0
- personalclaw/static/dist/assets/swift-Bxkupp3x.js +1 -0
- personalclaw/static/dist/assets/swimlanes-5IMT3BWC-awrYHeLT.js +2 -0
- personalclaw/static/dist/assets/swimlanesDiagram-G3AALYLV-D12MzgX2.js +8 -0
- personalclaw/static/dist/assets/systemverilog-Bz4Y3fRF.js +1 -0
- personalclaw/static/dist/assets/table-DvsnaAqM.js +1 -0
- personalclaw/static/dist/assets/tag-EV82YiLs.js +1 -0
- personalclaw/static/dist/assets/target-UW-0tTFS.js +1 -0
- personalclaw/static/dist/assets/tcl-DISqw1ZD.js +1 -0
- personalclaw/static/dist/assets/telescope-BdBMzAB5.js +1 -0
- personalclaw/static/dist/assets/terminal-C1iWLdbV.js +1 -0
- personalclaw/static/dist/assets/terminalBridge-DPYmSg2J.js +3 -0
- personalclaw/static/dist/assets/text-wrap-Dpl4nqII.js +1 -0
- personalclaw/static/dist/assets/timeline-definition-FHXFAJF6-BlrsykJ0.js +120 -0
- personalclaw/static/dist/assets/trash-2-2bFoF0VR.js +1 -0
- personalclaw/static/dist/assets/treeView-QDETBFTQ-CygwzEgj.js +1 -0
- personalclaw/static/dist/assets/treemap-6X3UGDF4-BbCXbaXr.js +1 -0
- personalclaw/static/dist/assets/triangle-alert-BWT3LMHk.js +1 -0
- personalclaw/static/dist/assets/ts.worker-BtjBFNHX.js +67734 -0
- personalclaw/static/dist/assets/tsMode-yQhLaacG.js +11 -0
- personalclaw/static/dist/assets/twig-De2hgUGE.js +1 -0
- personalclaw/static/dist/assets/type-koFtxoIo.js +1 -0
- personalclaw/static/dist/assets/typescript-CRRnD2Ts.js +1 -0
- personalclaw/static/dist/assets/typespec-B8J7ngcE.js +1 -0
- personalclaw/static/dist/assets/undo-2-CDJPQNhd.js +1 -0
- personalclaw/static/dist/assets/upload-DfZqclRJ.js +1 -0
- personalclaw/static/dist/assets/useCachedData-BIQrgq6_.js +1 -0
- personalclaw/static/dist/assets/useGuardedInstall-DHCIXlaw.js +1 -0
- personalclaw/static/dist/assets/useIsMobile-fpdKrHpJ.js +1 -0
- personalclaw/static/dist/assets/user-DswXNoCg.js +1 -0
- personalclaw/static/dist/assets/users-8dGmvnpT.js +1 -0
- personalclaw/static/dist/assets/vb-DV3o63ZY.js +1 -0
- personalclaw/static/dist/assets/vennDiagram-L72KCM5P-CllHp1wQ.js +34 -0
- personalclaw/static/dist/assets/video-BZDv1HvB.js +1 -0
- personalclaw/static/dist/assets/wand-sparkles-Dm6h6-C_.js +1 -0
- personalclaw/static/dist/assets/wardley-OPB4EBWU-BjXxCRf_.js +1 -0
- personalclaw/static/dist/assets/wardleyDiagram-EHGQE667-DWoNiq8-.js +78 -0
- personalclaw/static/dist/assets/webhook-BMlzomTH.js +1 -0
- personalclaw/static/dist/assets/wgsl-DpFanUEy.js +298 -0
- personalclaw/static/dist/assets/wifi-BeOsvsLl.js +1 -0
- personalclaw/static/dist/assets/wifi-off-DuGLl9EJ.js +1 -0
- personalclaw/static/dist/assets/workflow-lfMbPV8i.js +1 -0
- personalclaw/static/dist/assets/wrench-D8016U7k.js +1 -0
- personalclaw/static/dist/assets/xml-EDREH2X7.js +1 -0
- personalclaw/static/dist/assets/xychartDiagram-FW5EYKEG-BRuYpzPW.js +7 -0
- personalclaw/static/dist/assets/yaml-BjaDVX1E.js +1 -0
- personalclaw/static/dist/assets/zap-i0jeCEf8.js +1 -0
- personalclaw/static/dist/claw.svg +11 -0
- personalclaw/static/dist/fonts/dm-sans.woff2 +0 -0
- personalclaw/static/dist/fonts/google-sans-code.woff2 +0 -0
- personalclaw/static/dist/fonts/google-sans-flex.woff2 +0 -0
- personalclaw/static/dist/fonts/inter.woff2 +0 -0
- personalclaw/static/dist/fonts/jetbrains-mono.woff2 +0 -0
- personalclaw/static/dist/index.html +151 -0
- personalclaw/stats.py +185 -0
- personalclaw/stt/__init__.py +5 -0
- personalclaw/stt/handlers.py +18 -0
- personalclaw/stt/openai_provider.py +126 -0
- personalclaw/stt/provider.py +137 -0
- personalclaw/stt/registry.py +131 -0
- personalclaw/subagent.py +1673 -0
- personalclaw/subagent_persistence.py +276 -0
- personalclaw/suggestions.py +275 -0
- personalclaw/supply_chain.py +422 -0
- personalclaw/sync_bridge.py +183 -0
- personalclaw/task.py +89 -0
- personalclaw/task_modes.py +350 -0
- personalclaw/tasks/__init__.py +23 -0
- personalclaw/tasks/handlers.py +305 -0
- personalclaw/tasks/hierarchy.py +364 -0
- personalclaw/tasks/hierarchy_handlers.py +383 -0
- personalclaw/tasks/models.py +399 -0
- personalclaw/tasks/native.py +375 -0
- personalclaw/tasks/provider.py +55 -0
- personalclaw/tasks/reconcile.py +304 -0
- personalclaw/tasks/registry.py +233 -0
- personalclaw/tests_fixtures/empty/fixture.yaml +1 -0
- personalclaw/textfmt.py +49 -0
- personalclaw/tool_providers/__init__.py +15 -0
- personalclaw/tool_providers/base.py +160 -0
- personalclaw/tool_providers/projection.py +382 -0
- personalclaw/tool_providers/registry.py +143 -0
- personalclaw/tool_providers/result_store.py +203 -0
- personalclaw/tool_providers/tool_prefs.py +181 -0
- personalclaw/transcribe.py +345 -0
- personalclaw/trust_mode.py +145 -0
- personalclaw/tts/__init__.py +1 -0
- personalclaw/tts/openai_provider.py +167 -0
- personalclaw/tts/provider.py +105 -0
- personalclaw/tts/registry.py +160 -0
- personalclaw/uploads/__init__.py +28 -0
- personalclaw/uploads/policy.py +178 -0
- personalclaw/uploads/store.py +285 -0
- personalclaw/validation.py +900 -0
- personalclaw/vector_memory.py +2508 -0
- personalclaw/video_gen/__init__.py +6 -0
- personalclaw/video_gen/provider.py +93 -0
- personalclaw/video_gen/registry.py +140 -0
- personalclaw/voice_reply.py +305 -0
- personalclaw/web/__init__.py +31 -0
- personalclaw/web/extract.py +117 -0
- personalclaw/web/fetch.py +338 -0
- personalclaw/web/render.py +122 -0
- personalclaw/workflows/__init__.py +6 -0
- personalclaw/workflows/bundled/commit-changes/WORKFLOW.md +25 -0
- personalclaw/workflows/bundled/debug-failing-test/WORKFLOW.md +27 -0
- personalclaw/workflows/composition.py +232 -0
- personalclaw/workflows/handlers.py +240 -0
- personalclaw/workflows/lifecycle.py +42 -0
- personalclaw/workflows/models.py +97 -0
- personalclaw/workflows/native.py +478 -0
- personalclaw/workflows/provider.py +43 -0
- personalclaw/workflows/registry.py +272 -0
- personalclaw/workflows/surfacing.py +333 -0
- personalclaw-0.1.0.dist-info/METADATA +86 -0
- personalclaw-0.1.0.dist-info/RECORD +1049 -0
- personalclaw-0.1.0.dist-info/WHEEL +5 -0
- personalclaw-0.1.0.dist-info/entry_points.txt +5 -0
- personalclaw-0.1.0.dist-info/licenses/LICENSE +21 -0
- personalclaw-0.1.0.dist-info/top_level.txt +1 -0
personalclaw/__init__.py
ADDED
|
@@ -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()
|
personalclaw/__main__.py
ADDED
|
@@ -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
|