profclaw 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +14 -2
- package/CHANGELOG.md +37 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +174 -40
- package/dist/agents/agent-summary.d.ts +44 -0
- package/dist/agents/agent-summary.js +176 -0
- package/dist/agents/auto-memory.d.ts +59 -0
- package/dist/agents/auto-memory.js +310 -0
- package/dist/agents/checkpoint-manager.d.ts +76 -0
- package/dist/agents/checkpoint-manager.js +156 -0
- package/dist/agents/circuit-breaker.d.ts +54 -0
- package/dist/agents/circuit-breaker.js +153 -0
- package/dist/agents/context-compactor.d.ts +70 -0
- package/dist/agents/context-compactor.js +361 -0
- package/dist/agents/conversation-branch.d.ts +55 -0
- package/dist/agents/conversation-branch.js +115 -0
- package/dist/agents/error-recovery.d.ts +44 -0
- package/dist/agents/error-recovery.js +197 -0
- package/dist/agents/events.d.ts +76 -0
- package/dist/agents/events.js +8 -0
- package/dist/agents/executor.d.ts +35 -1
- package/dist/agents/executor.js +573 -124
- package/dist/agents/file-snapshots.d.ts +72 -0
- package/dist/agents/file-snapshots.js +182 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/orchestrator.d.ts +183 -0
- package/dist/agents/orchestrator.js +495 -0
- package/dist/agents/permissions.d.ts +63 -0
- package/dist/agents/permissions.js +138 -0
- package/dist/agents/plan-mode.d.ts +71 -0
- package/dist/agents/plan-mode.js +186 -0
- package/dist/agents/prompt-suggestions.d.ts +33 -0
- package/dist/agents/prompt-suggestions.js +208 -0
- package/dist/agents/rate-limit-monitor.d.ts +56 -0
- package/dist/agents/rate-limit-monitor.js +224 -0
- package/dist/agents/result-store.d.ts +37 -0
- package/dist/agents/result-store.js +104 -0
- package/dist/agents/session-diff.d.ts +43 -0
- package/dist/agents/session-diff.js +258 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +253 -30
- package/dist/chat/conversations.d.ts +2 -0
- package/dist/chat/conversations.js +8 -0
- package/dist/chat/execution/executor.d.ts +8 -0
- package/dist/chat/execution/executor.js +157 -103
- package/dist/chat/execution/index.js +5 -1
- package/dist/chat/execution/tool-router.js +40 -14
- package/dist/chat/execution/tools/canvas.d.ts +2 -2
- package/dist/chat/execution/tools/code-tools.d.ts +66 -0
- package/dist/chat/execution/tools/code-tools.js +353 -0
- package/dist/chat/execution/tools/complete-task.d.ts +2 -2
- package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
- package/dist/chat/execution/tools/cron-tool.js +48 -3
- package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
- package/dist/chat/execution/tools/decompose-task.js +166 -0
- package/dist/chat/execution/tools/exec.d.ts +5 -2
- package/dist/chat/execution/tools/exec.js +294 -155
- package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
- package/dist/chat/execution/tools/feed-tools.js +142 -0
- package/dist/chat/execution/tools/file-ops.d.ts +1 -1
- package/dist/chat/execution/tools/github.d.ts +2 -2
- package/dist/chat/execution/tools/index.d.ts +14 -2
- package/dist/chat/execution/tools/index.js +86 -12
- package/dist/chat/execution/tools/integrations.d.ts +8 -8
- package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
- package/dist/chat/execution/tools/multi-patch.js +373 -0
- package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
- package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
- package/dist/chat/execution/tools/plan-tools.js +134 -0
- package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
- package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
- package/dist/chat/execution/tools/repl-tool.js +207 -0
- package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
- package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
- package/dist/chat/execution/tools/system.d.ts +4 -4
- package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
- package/dist/chat/execution/tools/todo-tool.js +152 -0
- package/dist/chat/execution/tools/tool-search.d.ts +50 -0
- package/dist/chat/execution/tools/tool-search.js +155 -0
- package/dist/chat/execution/types.d.ts +21 -14
- package/dist/chat/execution/workflows/executor.d.ts +11 -0
- package/dist/chat/execution/workflows/executor.js +99 -1
- package/dist/chat/execution/workflows/types.d.ts +35 -2
- package/dist/chat/format/index.d.ts +1 -0
- package/dist/chat/format/index.js +1 -0
- package/dist/chat/format/markdown-convert.d.ts +23 -0
- package/dist/chat/format/markdown-convert.js +149 -0
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chat/message-handler.js +58 -6
- package/dist/chat/proactive/index.d.ts +62 -0
- package/dist/chat/proactive/index.js +147 -0
- package/dist/chat/prompt-adapter.js +2 -0
- package/dist/chat/providers/irc/index.d.ts +2 -2
- package/dist/chat/providers/telegram/index.d.ts +2 -0
- package/dist/chat/providers/telegram/index.js +21 -2
- package/dist/chat/system-prompts.d.ts +3 -3
- package/dist/chat/system-prompts.js +116 -61
- package/dist/chat/tools.d.ts +6 -6
- package/dist/cli/commands/auth.js +64 -1
- package/dist/cli/commands/chat.js +1327 -138
- package/dist/cli/commands/doctor.js +222 -16
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +138 -0
- package/dist/cli/commands/import.d.ts +44 -0
- package/dist/cli/commands/import.js +526 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/onboard.js +210 -30
- package/dist/cli/commands/plan.d.ts +13 -0
- package/dist/cli/commands/plan.js +184 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.js +77 -18
- package/dist/cli/commands/setup.js +84 -3
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/tools.js +13 -13
- package/dist/cli/commands/tui.js +26 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/ink/App.d.ts +13 -0
- package/dist/cli/ink/App.js +6 -0
- package/dist/cli/ink/ChatApp.d.ts +60 -0
- package/dist/cli/ink/ChatApp.js +325 -0
- package/dist/cli/ink/DashboardApp.d.ts +3 -0
- package/dist/cli/ink/DashboardApp.js +143 -0
- package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
- package/dist/cli/ink/components/AgentStatus.js +33 -0
- package/dist/cli/ink/components/ChannelList.d.ts +17 -0
- package/dist/cli/ink/components/ChannelList.js +33 -0
- package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
- package/dist/cli/ink/components/ConnectionStatus.js +50 -0
- package/dist/cli/ink/components/CostBar.d.ts +19 -0
- package/dist/cli/ink/components/CostBar.js +35 -0
- package/dist/cli/ink/components/HookStatus.d.ts +15 -0
- package/dist/cli/ink/components/HookStatus.js +7 -0
- package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
- package/dist/cli/ink/components/PermissionPrompt.js +51 -0
- package/dist/cli/ink/components/PlanView.d.ts +23 -0
- package/dist/cli/ink/components/PlanView.js +26 -0
- package/dist/cli/ink/components/ProviderList.d.ts +16 -0
- package/dist/cli/ink/components/ProviderList.js +16 -0
- package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
- package/dist/cli/ink/components/SessionHeader.js +15 -0
- package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
- package/dist/cli/ink/components/StreamingMessage.js +27 -0
- package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
- package/dist/cli/ink/components/SuggestionBar.js +28 -0
- package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
- package/dist/cli/ink/components/SystemHealth.js +39 -0
- package/dist/cli/ink/components/TaskList.d.ts +17 -0
- package/dist/cli/ink/components/TaskList.js +59 -0
- package/dist/cli/ink/components/ToolCall.d.ts +17 -0
- package/dist/cli/ink/components/ToolCall.js +43 -0
- package/dist/cli/ink/index.d.ts +23 -0
- package/dist/cli/ink/index.js +15 -0
- package/dist/cli/ink/keybindings.d.ts +35 -0
- package/dist/cli/ink/keybindings.js +105 -0
- package/dist/cli/ink/markdown-renderer.d.ts +47 -0
- package/dist/cli/ink/markdown-renderer.js +380 -0
- package/dist/cli/ink/output-styles.d.ts +39 -0
- package/dist/cli/ink/output-styles.js +119 -0
- package/dist/cli/interactive/auto-serve.d.ts +38 -0
- package/dist/cli/interactive/auto-serve.js +209 -0
- package/dist/cli/interactive/index.d.ts +25 -0
- package/dist/cli/interactive/index.js +23 -0
- package/dist/cli/interactive/picker.d.ts +28 -0
- package/dist/cli/interactive/picker.js +153 -0
- package/dist/cli/interactive/renderer.d.ts +26 -0
- package/dist/cli/interactive/renderer.js +555 -0
- package/dist/cli/interactive/repl.d.ts +14 -0
- package/dist/cli/interactive/repl.js +1516 -0
- package/dist/cli/interactive/stream-client.d.ts +59 -0
- package/dist/cli/interactive/stream-client.js +506 -0
- package/dist/cli/interactive/types.d.ts +121 -0
- package/dist/cli/interactive/types.js +10 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/cron/natural-language.d.ts +54 -0
- package/dist/cron/natural-language.js +569 -0
- package/dist/cron/scheduler.d.ts +34 -4
- package/dist/cron/scheduler.js +141 -9
- package/dist/cron/templates.d.ts +1 -1
- package/dist/cron/templates.js +219 -0
- package/dist/feeds/feed-engine.d.ts +149 -0
- package/dist/feeds/feed-engine.js +600 -0
- package/dist/feeds/index.d.ts +9 -0
- package/dist/feeds/index.js +8 -0
- package/dist/gateway/router.js +6 -1
- package/dist/hooks/built-in/audit-log.d.ts +11 -0
- package/dist/hooks/built-in/audit-log.js +84 -0
- package/dist/hooks/built-in/cost-warning.d.ts +10 -0
- package/dist/hooks/built-in/cost-warning.js +59 -0
- package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
- package/dist/hooks/built-in/dangerous-tool.js +80 -0
- package/dist/hooks/built-in/index.d.ts +14 -0
- package/dist/hooks/built-in/index.js +20 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/loader.d.ts +17 -0
- package/dist/hooks/loader.js +142 -0
- package/dist/hooks/registry.d.ts +62 -0
- package/dist/hooks/registry.js +127 -0
- package/dist/integrations/web-search.js +6 -3
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/memory-service.js +14 -13
- package/dist/memory/observational.d.ts +62 -0
- package/dist/memory/observational.js +396 -0
- package/dist/middleware/content-filter.d.ts +22 -0
- package/dist/middleware/content-filter.js +69 -0
- package/dist/middleware/request-validator.d.ts +159 -0
- package/dist/middleware/request-validator.js +93 -0
- package/dist/plugins/sdk.d.ts +22 -0
- package/dist/plugins/sdk.js +17 -1
- package/dist/projects/types.d.ts +10 -10
- package/dist/providers/ai-sdk.d.ts +11 -0
- package/dist/providers/ai-sdk.js +78 -19
- package/dist/providers/core/models.js +67 -1
- package/dist/providers/core/types.d.ts +3 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +685 -0
- package/dist/providers/types.d.ts +16 -16
- package/dist/routes/agents.js +50 -0
- package/dist/routes/auth.js +8 -1
- package/dist/routes/chat.js +259 -14
- package/dist/routes/costs.js +32 -0
- package/dist/routes/cron.js +80 -5
- package/dist/routes/feeds.d.ts +10 -0
- package/dist/routes/feeds.js +168 -0
- package/dist/routes/mcp.js +21 -0
- package/dist/routes/memory.js +130 -0
- package/dist/routes/skills.js +129 -0
- package/dist/routes/teams.d.ts +9 -0
- package/dist/routes/teams.js +210 -0
- package/dist/routes/tools.js +14 -0
- package/dist/routes/users.js +2 -0
- package/dist/server/route-loader.js +3 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +310 -36
- package/dist/skills/marketplace.d.ts +87 -0
- package/dist/skills/marketplace.js +268 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.js +64 -3
- package/dist/storage/schema.d.ts +4 -4
- package/dist/storage/schema.js +1 -1
- package/dist/teams/index.d.ts +110 -0
- package/dist/teams/index.js +365 -0
- package/dist/tickets/types.d.ts +39 -39
- package/dist/types/summary.d.ts +5 -5
- package/dist/utils/auto-update.d.ts +23 -0
- package/dist/utils/auto-update.js +157 -0
- package/dist/utils/offline-detect.d.ts +55 -0
- package/dist/utils/offline-detect.js +121 -0
- package/dist/utils/pid-file.d.ts +36 -0
- package/dist/utils/pid-file.js +125 -0
- package/dist/utils/prevent-sleep.d.ts +27 -0
- package/dist/utils/prevent-sleep.js +95 -0
- package/dist/utils/sanitizer.d.ts +57 -0
- package/dist/utils/sanitizer.js +174 -0
- package/docker-compose.yml +13 -137
- package/package.json +31 -6
- package/skills/deploy-cloudflare/SKILL.md +62 -0
- package/skills/deploy-vercel/SKILL.md +67 -0
- package/skills/docker-deploy/SKILL.md +158 -0
- package/skills/full-stack-builder/SKILL.md +92 -0
- package/skills/humanizer/SKILL.md +488 -0
- package/skills/profclaw-assistant/SKILL.md +85 -56
- package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
- package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
- package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
- package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
- package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
- package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
- package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
- package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
- package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
- package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
- package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
- package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
- package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
- package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
- package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
- package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
- package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
- package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
- package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
- package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
- package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
- package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
- package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
- package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
- package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
- package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
- package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
- package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
- package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
- package/ui/dist/assets/index-CR8gfCHv.js +1 -0
- package/ui/dist/assets/index-DVXMpWai.js +1 -0
- package/ui/dist/assets/index-DaDJMM2v.js +1 -0
- package/ui/dist/assets/index-Djdq_0xu.js +1 -0
- package/ui/dist/assets/index-M46Gcb8K.css +1 -0
- package/ui/dist/assets/index-sEBN7w8J.js +109 -0
- package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
- package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
- package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
- package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
- package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
- package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
- package/ui/dist/assets/progress-BboUHuLf.js +1 -0
- package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
- package/ui/dist/assets/star-DhdFVidS.js +1 -0
- package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
- package/ui/dist/assets/table-BC56FVMV.js +1 -0
- package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
- package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
- package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
- package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
- package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
- package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
- package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
- package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
- package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
- package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
- package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
- package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
- package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
- package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
- package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
- package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
- package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
- package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
- package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
- package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
- package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
- package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
- package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
- package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
- package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
- package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
- package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
- package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
- package/ui/dist/assets/index-BUmnwPQr.js +0 -1
- package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
- package/ui/dist/assets/index-C8N375c2.js +0 -1
- package/ui/dist/assets/index-CuxnqVVz.css +0 -1
- package/ui/dist/assets/index-CzMM3QOk.js +0 -1
- package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
- package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
- package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
- package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
- package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
- package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
- package/ui/dist/assets/server-CVHTZB72.js +0 -1
- package/ui/dist/assets/sheet-DuQExSho.js +0 -1
- package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
- package/ui/dist/assets/switch-CAePkd6k.js +0 -1
- package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
- package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
- package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
package/dist/types/summary.d.ts
CHANGED
|
@@ -246,11 +246,11 @@ export declare const SummarySchema: z.ZodObject<{
|
|
|
246
246
|
}[];
|
|
247
247
|
taskId?: string | undefined;
|
|
248
248
|
component?: string | undefined;
|
|
249
|
+
startedAt?: Date | undefined;
|
|
249
250
|
repository?: string | undefined;
|
|
250
251
|
branch?: string | undefined;
|
|
251
252
|
metadata?: Record<string, unknown> | undefined;
|
|
252
253
|
sessionId?: string | undefined;
|
|
253
|
-
startedAt?: Date | undefined;
|
|
254
254
|
completedAt?: Date | undefined;
|
|
255
255
|
durationMs?: number | undefined;
|
|
256
256
|
model?: string | undefined;
|
|
@@ -278,12 +278,12 @@ export declare const SummarySchema: z.ZodObject<{
|
|
|
278
278
|
whatChanged: string;
|
|
279
279
|
taskId?: string | undefined;
|
|
280
280
|
component?: string | undefined;
|
|
281
|
+
startedAt?: Date | undefined;
|
|
281
282
|
repository?: string | undefined;
|
|
282
283
|
branch?: string | undefined;
|
|
283
284
|
labels?: string[] | undefined;
|
|
284
285
|
metadata?: Record<string, unknown> | undefined;
|
|
285
286
|
sessionId?: string | undefined;
|
|
286
|
-
startedAt?: Date | undefined;
|
|
287
287
|
completedAt?: Date | undefined;
|
|
288
288
|
durationMs?: number | undefined;
|
|
289
289
|
model?: string | undefined;
|
|
@@ -341,13 +341,13 @@ export type Artifact = ArtifactReference;
|
|
|
341
341
|
export declare const CreateSummaryInputSchema: z.ZodObject<{
|
|
342
342
|
taskId: z.ZodOptional<z.ZodString>;
|
|
343
343
|
component: z.ZodOptional<z.ZodString>;
|
|
344
|
+
startedAt: z.ZodOptional<z.ZodDate>;
|
|
344
345
|
title: z.ZodString;
|
|
345
346
|
repository: z.ZodOptional<z.ZodString>;
|
|
346
347
|
branch: z.ZodOptional<z.ZodString>;
|
|
347
348
|
labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString, "many">>>;
|
|
348
349
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
349
350
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
350
|
-
startedAt: z.ZodOptional<z.ZodDate>;
|
|
351
351
|
completedAt: z.ZodOptional<z.ZodDate>;
|
|
352
352
|
durationMs: z.ZodOptional<z.ZodNumber>;
|
|
353
353
|
agent: z.ZodString;
|
|
@@ -459,12 +459,12 @@ export declare const CreateSummaryInputSchema: z.ZodObject<{
|
|
|
459
459
|
whatChanged: string;
|
|
460
460
|
taskId?: string | undefined;
|
|
461
461
|
component?: string | undefined;
|
|
462
|
+
startedAt?: Date | undefined;
|
|
462
463
|
repository?: string | undefined;
|
|
463
464
|
branch?: string | undefined;
|
|
464
465
|
labels?: string[] | undefined;
|
|
465
466
|
metadata?: Record<string, unknown> | undefined;
|
|
466
467
|
sessionId?: string | undefined;
|
|
467
|
-
startedAt?: Date | undefined;
|
|
468
468
|
completedAt?: Date | undefined;
|
|
469
469
|
durationMs?: number | undefined;
|
|
470
470
|
model?: string | undefined;
|
|
@@ -516,12 +516,12 @@ export declare const CreateSummaryInputSchema: z.ZodObject<{
|
|
|
516
516
|
whatChanged: string;
|
|
517
517
|
taskId?: string | undefined;
|
|
518
518
|
component?: string | undefined;
|
|
519
|
+
startedAt?: Date | undefined;
|
|
519
520
|
repository?: string | undefined;
|
|
520
521
|
branch?: string | undefined;
|
|
521
522
|
labels?: string[] | undefined;
|
|
522
523
|
metadata?: Record<string, unknown> | undefined;
|
|
523
524
|
sessionId?: string | undefined;
|
|
524
|
-
startedAt?: Date | undefined;
|
|
525
525
|
completedAt?: Date | undefined;
|
|
526
526
|
durationMs?: number | undefined;
|
|
527
527
|
model?: string | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Update Check
|
|
3
|
+
*
|
|
4
|
+
* Checks npm registry for newer versions of profclaw and caches the result
|
|
5
|
+
* for 24 hours so startup is not meaningfully delayed.
|
|
6
|
+
* Cache file: .profclaw/update-check.json
|
|
7
|
+
*/
|
|
8
|
+
export interface UpdateInfo {
|
|
9
|
+
currentVersion: string;
|
|
10
|
+
latestVersion: string;
|
|
11
|
+
updateAvailable: boolean;
|
|
12
|
+
releaseUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check whether a newer version of `packageName` is available on npm.
|
|
16
|
+
* Results are cached for 24 hours in .profclaw/update-check.json.
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkForUpdate(packageName?: string): Promise<UpdateInfo>;
|
|
19
|
+
/**
|
|
20
|
+
* Format an update notification message suitable for printing to the terminal.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatUpdateMessage(info: UpdateInfo): string;
|
|
23
|
+
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Update Check
|
|
3
|
+
*
|
|
4
|
+
* Checks npm registry for newer versions of profclaw and caches the result
|
|
5
|
+
* for 24 hours so startup is not meaningfully delayed.
|
|
6
|
+
* Cache file: .profclaw/update-check.json
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { createRequire } from 'module';
|
|
11
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
12
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org';
|
|
13
|
+
function getCacheDir() {
|
|
14
|
+
return path.join(process.cwd(), '.profclaw');
|
|
15
|
+
}
|
|
16
|
+
function getCachePath() {
|
|
17
|
+
return path.join(getCacheDir(), 'update-check.json');
|
|
18
|
+
}
|
|
19
|
+
function readCache() {
|
|
20
|
+
try {
|
|
21
|
+
const raw = fs.readFileSync(getCachePath(), 'utf8');
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function writeCache(info) {
|
|
29
|
+
try {
|
|
30
|
+
const dir = getCacheDir();
|
|
31
|
+
if (!fs.existsSync(dir)) {
|
|
32
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
const cache = { checkedAt: Date.now(), info };
|
|
35
|
+
fs.writeFileSync(getCachePath(), JSON.stringify(cache, null, 2), 'utf8');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Non-fatal — update check is best-effort
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function isCacheValid(cache) {
|
|
42
|
+
return Date.now() - cache.checkedAt < CACHE_TTL_MS;
|
|
43
|
+
}
|
|
44
|
+
function getCurrentVersion(packageName) {
|
|
45
|
+
try {
|
|
46
|
+
// Try to read from the package.json that ships with the installed package
|
|
47
|
+
const require = createRequire(import.meta.url);
|
|
48
|
+
const pkgPath = require.resolve(`${packageName}/package.json`);
|
|
49
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
50
|
+
return pkg.version;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fallback: read from our own package.json (works in dev / monorepo)
|
|
54
|
+
try {
|
|
55
|
+
const selfPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../package.json');
|
|
56
|
+
const pkg = JSON.parse(fs.readFileSync(selfPath, 'utf8'));
|
|
57
|
+
return pkg.version;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return '0.0.0';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function getPackageName() {
|
|
65
|
+
try {
|
|
66
|
+
const selfPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../../package.json');
|
|
67
|
+
const pkg = JSON.parse(fs.readFileSync(selfPath, 'utf8'));
|
|
68
|
+
return pkg.name;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return 'profclaw';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Compare two semver strings.
|
|
76
|
+
* Returns true when `latest` is strictly newer than `current`.
|
|
77
|
+
*/
|
|
78
|
+
function isNewerVersion(current, latest) {
|
|
79
|
+
const parse = (v) => v
|
|
80
|
+
.replace(/^[^0-9]*/, '')
|
|
81
|
+
.split('.')
|
|
82
|
+
.map(n => parseInt(n, 10) || 0);
|
|
83
|
+
const [cMaj, cMin, cPatch] = parse(current);
|
|
84
|
+
const [lMaj, lMin, lPatch] = parse(latest);
|
|
85
|
+
if (lMaj !== cMaj)
|
|
86
|
+
return (lMaj ?? 0) > (cMaj ?? 0);
|
|
87
|
+
if (lMin !== cMin)
|
|
88
|
+
return (lMin ?? 0) > (cMin ?? 0);
|
|
89
|
+
return (lPatch ?? 0) > (cPatch ?? 0);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fetch the latest version from the npm registry.
|
|
93
|
+
* Throws if the network request fails.
|
|
94
|
+
*/
|
|
95
|
+
async function fetchLatestVersion(packageName) {
|
|
96
|
+
const url = `${NPM_REGISTRY}/${encodeURIComponent(packageName)}/latest`;
|
|
97
|
+
const response = await fetch(url, {
|
|
98
|
+
headers: { Accept: 'application/json' },
|
|
99
|
+
signal: AbortSignal.timeout(5000),
|
|
100
|
+
});
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
throw new Error(`npm registry returned ${response.status} for ${packageName}`);
|
|
103
|
+
}
|
|
104
|
+
const data = (await response.json());
|
|
105
|
+
return data.version;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check whether a newer version of `packageName` is available on npm.
|
|
109
|
+
* Results are cached for 24 hours in .profclaw/update-check.json.
|
|
110
|
+
*/
|
|
111
|
+
export async function checkForUpdate(packageName) {
|
|
112
|
+
const pkg = packageName ?? getPackageName();
|
|
113
|
+
const currentVersion = getCurrentVersion(pkg);
|
|
114
|
+
// Serve from cache if still fresh
|
|
115
|
+
const cached = readCache();
|
|
116
|
+
if (cached && isCacheValid(cached) && cached.info.currentVersion === currentVersion) {
|
|
117
|
+
return cached.info;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const latestVersion = await fetchLatestVersion(pkg);
|
|
121
|
+
const updateAvailable = isNewerVersion(currentVersion, latestVersion);
|
|
122
|
+
const info = {
|
|
123
|
+
currentVersion,
|
|
124
|
+
latestVersion,
|
|
125
|
+
updateAvailable,
|
|
126
|
+
releaseUrl: updateAvailable
|
|
127
|
+
? `https://www.npmjs.com/package/${pkg}/v/${latestVersion}`
|
|
128
|
+
: undefined,
|
|
129
|
+
};
|
|
130
|
+
writeCache(info);
|
|
131
|
+
return info;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Network failure — return a no-update result without caching
|
|
135
|
+
return {
|
|
136
|
+
currentVersion,
|
|
137
|
+
latestVersion: currentVersion,
|
|
138
|
+
updateAvailable: false,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Format an update notification message suitable for printing to the terminal.
|
|
144
|
+
*/
|
|
145
|
+
export function formatUpdateMessage(info) {
|
|
146
|
+
if (!info.updateAvailable)
|
|
147
|
+
return '';
|
|
148
|
+
const parts = [
|
|
149
|
+
`Update available: ${info.currentVersion} → ${info.latestVersion}.`,
|
|
150
|
+
`Run: npm i -g ${getPackageName()}`,
|
|
151
|
+
];
|
|
152
|
+
if (info.releaseUrl) {
|
|
153
|
+
parts.push(` ${info.releaseUrl}`);
|
|
154
|
+
}
|
|
155
|
+
return parts.join(' ');
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Periodically pings the server health endpoint to detect connectivity.
|
|
5
|
+
* Emits status-change notifications to registered listeners.
|
|
6
|
+
* Queues commands locally while offline and replays them on reconnect.
|
|
7
|
+
*/
|
|
8
|
+
export type OfflineStatusListener = (online: boolean) => void;
|
|
9
|
+
export interface QueuedCommand {
|
|
10
|
+
id: string;
|
|
11
|
+
payload: unknown;
|
|
12
|
+
queuedAt: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class OfflineDetector {
|
|
15
|
+
private isOnline;
|
|
16
|
+
private checkInterval;
|
|
17
|
+
private listeners;
|
|
18
|
+
private serverUrl;
|
|
19
|
+
private commandQueue;
|
|
20
|
+
/**
|
|
21
|
+
* Start polling `serverUrl + /health` every `intervalMs` milliseconds.
|
|
22
|
+
* Defaults to 10 seconds.
|
|
23
|
+
*/
|
|
24
|
+
start(serverUrl: string, intervalMs?: number): void;
|
|
25
|
+
/** Stop polling. */
|
|
26
|
+
stop(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Register a listener that is called whenever the online status changes.
|
|
29
|
+
* Returns an unsubscribe function.
|
|
30
|
+
*/
|
|
31
|
+
onStatusChange(cb: OfflineStatusListener): () => void;
|
|
32
|
+
/** Returns the current online status. */
|
|
33
|
+
getStatus(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Queue a command for later replay when the server comes back online.
|
|
36
|
+
* Returns the queued command's id.
|
|
37
|
+
*/
|
|
38
|
+
queueCommand(payload: unknown): string;
|
|
39
|
+
/**
|
|
40
|
+
* Drain and return all queued commands in FIFO order.
|
|
41
|
+
* The queue is cleared after calling this.
|
|
42
|
+
*/
|
|
43
|
+
drainQueue(): QueuedCommand[];
|
|
44
|
+
/** How many commands are currently queued. */
|
|
45
|
+
queueLength(): number;
|
|
46
|
+
private check;
|
|
47
|
+
private ping;
|
|
48
|
+
private emit;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns the shared singleton OfflineDetector.
|
|
52
|
+
* Lazily created on first call.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getOfflineDetector(): OfflineDetector;
|
|
55
|
+
//# sourceMappingURL=offline-detect.d.ts.map
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Detection Utility
|
|
3
|
+
*
|
|
4
|
+
* Periodically pings the server health endpoint to detect connectivity.
|
|
5
|
+
* Emits status-change notifications to registered listeners.
|
|
6
|
+
* Queues commands locally while offline and replays them on reconnect.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_INTERVAL_MS = 10_000;
|
|
9
|
+
const HEALTH_PATH = '/health';
|
|
10
|
+
const PING_TIMEOUT_MS = 5_000;
|
|
11
|
+
export class OfflineDetector {
|
|
12
|
+
isOnline = true;
|
|
13
|
+
checkInterval = null;
|
|
14
|
+
listeners = [];
|
|
15
|
+
serverUrl = '';
|
|
16
|
+
commandQueue = [];
|
|
17
|
+
/**
|
|
18
|
+
* Start polling `serverUrl + /health` every `intervalMs` milliseconds.
|
|
19
|
+
* Defaults to 10 seconds.
|
|
20
|
+
*/
|
|
21
|
+
start(serverUrl, intervalMs = DEFAULT_INTERVAL_MS) {
|
|
22
|
+
this.serverUrl = serverUrl;
|
|
23
|
+
this.stop(); // clear any existing interval
|
|
24
|
+
// Run an immediate check, then repeat on the interval
|
|
25
|
+
void this.check();
|
|
26
|
+
this.checkInterval = setInterval(() => { void this.check(); }, intervalMs);
|
|
27
|
+
}
|
|
28
|
+
/** Stop polling. */
|
|
29
|
+
stop() {
|
|
30
|
+
if (this.checkInterval !== null) {
|
|
31
|
+
clearInterval(this.checkInterval);
|
|
32
|
+
this.checkInterval = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Register a listener that is called whenever the online status changes.
|
|
37
|
+
* Returns an unsubscribe function.
|
|
38
|
+
*/
|
|
39
|
+
onStatusChange(cb) {
|
|
40
|
+
this.listeners.push(cb);
|
|
41
|
+
return () => {
|
|
42
|
+
this.listeners = this.listeners.filter(l => l !== cb);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Returns the current online status. */
|
|
46
|
+
getStatus() {
|
|
47
|
+
return this.isOnline;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Queue a command for later replay when the server comes back online.
|
|
51
|
+
* Returns the queued command's id.
|
|
52
|
+
*/
|
|
53
|
+
queueCommand(payload) {
|
|
54
|
+
const id = `cmd-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
55
|
+
this.commandQueue.push({ id, payload, queuedAt: Date.now() });
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Drain and return all queued commands in FIFO order.
|
|
60
|
+
* The queue is cleared after calling this.
|
|
61
|
+
*/
|
|
62
|
+
drainQueue() {
|
|
63
|
+
const drained = [...this.commandQueue];
|
|
64
|
+
this.commandQueue = [];
|
|
65
|
+
return drained;
|
|
66
|
+
}
|
|
67
|
+
/** How many commands are currently queued. */
|
|
68
|
+
queueLength() {
|
|
69
|
+
return this.commandQueue.length;
|
|
70
|
+
}
|
|
71
|
+
// ── Private ──────────────────────────────────────────────────────────────────
|
|
72
|
+
async check() {
|
|
73
|
+
const wasOnline = this.isOnline;
|
|
74
|
+
const nowOnline = await this.ping();
|
|
75
|
+
if (nowOnline !== wasOnline) {
|
|
76
|
+
this.isOnline = nowOnline;
|
|
77
|
+
this.emit(nowOnline);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async ping() {
|
|
81
|
+
const url = `${this.serverUrl}${HEALTH_PATH}`;
|
|
82
|
+
const controller = new AbortController();
|
|
83
|
+
const timer = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);
|
|
84
|
+
try {
|
|
85
|
+
const res = await fetch(url, {
|
|
86
|
+
method: 'GET',
|
|
87
|
+
signal: controller.signal,
|
|
88
|
+
});
|
|
89
|
+
return res.ok;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
emit(online) {
|
|
99
|
+
for (const listener of this.listeners) {
|
|
100
|
+
try {
|
|
101
|
+
listener(online);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Swallow listener errors to keep the detector running
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ── Singleton ──────────────────────────────────────────────────────────────────
|
|
110
|
+
let _instance = null;
|
|
111
|
+
/**
|
|
112
|
+
* Returns the shared singleton OfflineDetector.
|
|
113
|
+
* Lazily created on first call.
|
|
114
|
+
*/
|
|
115
|
+
export function getOfflineDetector() {
|
|
116
|
+
if (_instance === null) {
|
|
117
|
+
_instance = new OfflineDetector();
|
|
118
|
+
}
|
|
119
|
+
return _instance;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=offline-detect.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface PidData {
|
|
2
|
+
pid: number;
|
|
3
|
+
port: number;
|
|
4
|
+
startedAt: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Write PID file with process info.
|
|
8
|
+
* Creates .profclaw/ directory if it doesn't exist.
|
|
9
|
+
*/
|
|
10
|
+
export declare function writePidFile(port: number): void;
|
|
11
|
+
/**
|
|
12
|
+
* Read PID file.
|
|
13
|
+
* Returns null if the file doesn't exist or contains malformed data.
|
|
14
|
+
*/
|
|
15
|
+
export declare function readPidFile(): PidData | null;
|
|
16
|
+
/**
|
|
17
|
+
* Remove PID file if it exists.
|
|
18
|
+
*/
|
|
19
|
+
export declare function removePidFile(): void;
|
|
20
|
+
export interface ServerRunningResult {
|
|
21
|
+
running: boolean;
|
|
22
|
+
pid?: number;
|
|
23
|
+
port?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a server process described by the PID file is still alive.
|
|
27
|
+
* If the process is dead but the PID file exists, the stale file is cleaned up.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isServerRunning(): ServerRunningResult;
|
|
30
|
+
/**
|
|
31
|
+
* Kill the server described by the PID file using SIGTERM.
|
|
32
|
+
* Polls for up to 5 seconds waiting for the process to exit.
|
|
33
|
+
* Returns true if the process was killed (or was already gone), false on timeout.
|
|
34
|
+
*/
|
|
35
|
+
export declare function killExistingServer(): boolean;
|
|
36
|
+
//# sourceMappingURL=pid-file.d.ts.map
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const PROFCLAW_DIR = '.profclaw';
|
|
4
|
+
const PID_FILENAME = 'server.pid';
|
|
5
|
+
function getPidPath() {
|
|
6
|
+
return join(process.cwd(), PROFCLAW_DIR, PID_FILENAME);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Write PID file with process info.
|
|
10
|
+
* Creates .profclaw/ directory if it doesn't exist.
|
|
11
|
+
*/
|
|
12
|
+
export function writePidFile(port) {
|
|
13
|
+
const dir = join(process.cwd(), PROFCLAW_DIR);
|
|
14
|
+
if (!existsSync(dir)) {
|
|
15
|
+
mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
const data = {
|
|
18
|
+
pid: process.pid,
|
|
19
|
+
port,
|
|
20
|
+
startedAt: Date.now(),
|
|
21
|
+
};
|
|
22
|
+
writeFileSync(getPidPath(), JSON.stringify(data, null, 2), 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read PID file.
|
|
26
|
+
* Returns null if the file doesn't exist or contains malformed data.
|
|
27
|
+
*/
|
|
28
|
+
export function readPidFile() {
|
|
29
|
+
const pidPath = getPidPath();
|
|
30
|
+
if (!existsSync(pidPath)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const raw = readFileSync(pidPath, 'utf-8');
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
if (parsed !== null &&
|
|
37
|
+
typeof parsed === 'object' &&
|
|
38
|
+
'pid' in parsed &&
|
|
39
|
+
'port' in parsed &&
|
|
40
|
+
'startedAt' in parsed &&
|
|
41
|
+
typeof parsed.pid === 'number' &&
|
|
42
|
+
typeof parsed.port === 'number' &&
|
|
43
|
+
typeof parsed.startedAt === 'number') {
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Remove PID file if it exists.
|
|
54
|
+
*/
|
|
55
|
+
export function removePidFile() {
|
|
56
|
+
const pidPath = getPidPath();
|
|
57
|
+
if (existsSync(pidPath)) {
|
|
58
|
+
try {
|
|
59
|
+
unlinkSync(pidPath);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Best effort — ignore failures (e.g. race condition on shutdown)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a server process described by the PID file is still alive.
|
|
68
|
+
* If the process is dead but the PID file exists, the stale file is cleaned up.
|
|
69
|
+
*/
|
|
70
|
+
export function isServerRunning() {
|
|
71
|
+
const data = readPidFile();
|
|
72
|
+
if (!data) {
|
|
73
|
+
return { running: false };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
// Signal 0 checks process existence without sending a real signal
|
|
77
|
+
process.kill(data.pid, 0);
|
|
78
|
+
return { running: true, pid: data.pid, port: data.port };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Process doesn't exist — stale PID file
|
|
82
|
+
removePidFile();
|
|
83
|
+
return { running: false };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Kill the server described by the PID file using SIGTERM.
|
|
88
|
+
* Polls for up to 5 seconds waiting for the process to exit.
|
|
89
|
+
* Returns true if the process was killed (or was already gone), false on timeout.
|
|
90
|
+
*/
|
|
91
|
+
export function killExistingServer() {
|
|
92
|
+
const data = readPidFile();
|
|
93
|
+
if (!data) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
process.kill(data.pid, 'SIGTERM');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Process already gone
|
|
101
|
+
removePidFile();
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
// Poll up to 5 seconds (50 × 100 ms)
|
|
105
|
+
const MAX_WAIT_MS = 5000;
|
|
106
|
+
const POLL_INTERVAL_MS = 100;
|
|
107
|
+
const start = Date.now();
|
|
108
|
+
while (Date.now() - start < MAX_WAIT_MS) {
|
|
109
|
+
try {
|
|
110
|
+
process.kill(data.pid, 0);
|
|
111
|
+
// Still alive — busy-wait (synchronous polling, acceptable for a CLI shutdown path)
|
|
112
|
+
const pollUntil = Date.now() + POLL_INTERVAL_MS;
|
|
113
|
+
while (Date.now() < pollUntil) {
|
|
114
|
+
// spin wait
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Process gone
|
|
119
|
+
removePidFile();
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pid-file.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sleep Prevention Utility
|
|
3
|
+
*
|
|
4
|
+
* Prevents OS sleep/screensaver during long agent runs.
|
|
5
|
+
* - macOS: uses `caffeinate -i -w {pid}`
|
|
6
|
+
* - Linux: tries `systemd-inhibit` then falls back to `xdg-screensaver suspend`
|
|
7
|
+
* - Windows: no-op (PowerShell SetThreadExecutionState not exposed without ffi)
|
|
8
|
+
*/
|
|
9
|
+
export declare class SleepPreventer {
|
|
10
|
+
private _process;
|
|
11
|
+
private _active;
|
|
12
|
+
/**
|
|
13
|
+
* Start preventing OS sleep.
|
|
14
|
+
* Safe to call multiple times — subsequent calls are no-ops if already active.
|
|
15
|
+
*/
|
|
16
|
+
start(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Stop preventing sleep and release the system process.
|
|
19
|
+
*/
|
|
20
|
+
stop(): void;
|
|
21
|
+
isActive(): boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns the shared singleton SleepPreventer instance.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSleepPreventer(): SleepPreventer;
|
|
27
|
+
//# sourceMappingURL=prevent-sleep.d.ts.map
|