@seawork/server 1.0.22 → 2.0.2-rc.6
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/dist/scripts/supervisor-entrypoint.js +48 -8
- package/dist/scripts/supervisor-entrypoint.js.map +1 -1
- package/dist/scripts/supervisor-native-classifier.js +77 -5
- package/dist/scripts/supervisor-native-classifier.js.map +1 -1
- package/dist/scripts/supervisor-stdio-tail.js +27 -0
- package/dist/scripts/supervisor-stdio-tail.js.map +1 -0
- package/dist/scripts/supervisor.js +12 -0
- package/dist/scripts/supervisor.js.map +1 -1
- package/dist/server/client/daemon-client.d.ts +142 -2
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +384 -3
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/agent/agent-manager.d.ts +55 -3
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +324 -45
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.d.ts +1 -0
- package/dist/server/server/agent/agent-metadata-generator.d.ts.map +1 -1
- package/dist/server/server/agent/agent-metadata-generator.js +8 -0
- package/dist/server/server/agent/agent-metadata-generator.js.map +1 -1
- package/dist/server/server/agent/agent-projections.js +7 -2
- package/dist/server/server/agent/agent-projections.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts +3 -1
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +33 -6
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts +43 -1
- package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
- package/dist/server/server/agent/claude-memory.d.ts +4 -0
- package/dist/server/server/agent/claude-memory.d.ts.map +1 -0
- package/dist/server/server/agent/claude-memory.js +97 -0
- package/dist/server/server/agent/claude-memory.js.map +1 -0
- package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
- package/dist/server/server/agent/mcp-server.js +247 -0
- package/dist/server/server/agent/mcp-server.js.map +1 -1
- package/dist/server/server/agent/mcp-shared.d.ts +2 -0
- package/dist/server/server/agent/mcp-shared.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +6 -139
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +65 -33
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-manifest.d.ts +1 -0
- package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +36 -0
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +4 -0
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts +3 -1
- package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
- package/dist/server/server/agent/provider-snapshot-manager.js +13 -0
- package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +141 -27
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js +14 -1
- package/dist/server/server/agent/providers/codex/tool-call-mapper.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +132 -4
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +2233 -163
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-binary-resolver.d.ts +9 -0
- package/dist/server/server/agent/providers/codex-binary-resolver.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-binary-resolver.js +35 -14
- package/dist/server/server/agent/providers/codex-binary-resolver.js.map +1 -1
- package/dist/server/server/agent/providers/codex-health-probe.js +1 -1
- package/dist/server/server/agent/providers/codex-health-probe.js.map +1 -1
- package/dist/server/server/agent/providers/deepseek/constants.d.ts +4 -0
- package/dist/server/server/agent/providers/deepseek/constants.d.ts.map +1 -0
- package/dist/server/server/agent/providers/deepseek/constants.js +11 -0
- package/dist/server/server/agent/providers/deepseek/constants.js.map +1 -0
- package/dist/server/server/agent/providers/deepseek/event-mapper.d.ts +21 -0
- package/dist/server/server/agent/providers/deepseek/event-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/deepseek/event-mapper.js +286 -0
- package/dist/server/server/agent/providers/deepseek/event-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/deepseek/serve-client.d.ts +94 -0
- package/dist/server/server/agent/providers/deepseek/serve-client.d.ts.map +1 -0
- package/dist/server/server/agent/providers/deepseek/serve-client.js +142 -0
- package/dist/server/server/agent/providers/deepseek/serve-client.js.map +1 -0
- package/dist/server/server/agent/providers/deepseek/serve-process.d.ts +18 -0
- package/dist/server/server/agent/providers/deepseek/serve-process.d.ts.map +1 -0
- package/dist/server/server/agent/providers/deepseek/serve-process.js +93 -0
- package/dist/server/server/agent/providers/deepseek/serve-process.js.map +1 -0
- package/dist/server/server/agent/providers/deepseek-agent.d.ts +94 -0
- package/dist/server/server/agent/providers/deepseek-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/deepseek-agent.js +811 -0
- package/dist/server/server/agent/providers/deepseek-agent.js.map +1 -0
- package/dist/server/server/agent/providers/gateway-telemetry.d.ts +9 -0
- package/dist/server/server/agent/providers/gateway-telemetry.d.ts.map +1 -0
- package/dist/server/server/agent/providers/gateway-telemetry.js +36 -0
- package/dist/server/server/agent/providers/gateway-telemetry.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent/constants.d.ts +3 -0
- package/dist/server/server/agent/providers/seaagent/constants.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent/constants.js +3 -0
- package/dist/server/server/agent/providers/seaagent/constants.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent/event-mapper.d.ts +3 -0
- package/dist/server/server/agent/providers/seaagent/event-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent/event-mapper.js +69 -0
- package/dist/server/server/agent/providers/seaagent/event-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent/rpc-client.d.ts +23 -0
- package/dist/server/server/agent/providers/seaagent/rpc-client.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent/rpc-client.js +139 -0
- package/dist/server/server/agent/providers/seaagent/rpc-client.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent/tool-call-mapper.d.ts +3 -0
- package/dist/server/server/agent/providers/seaagent/tool-call-mapper.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent/tool-call-mapper.js +38 -0
- package/dist/server/server/agent/providers/seaagent/tool-call-mapper.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent-agent.d.ts +81 -0
- package/dist/server/server/agent/providers/seaagent-agent.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent-agent.js +502 -0
- package/dist/server/server/agent/providers/seaagent-agent.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent-binary-resolver.d.ts +18 -0
- package/dist/server/server/agent/providers/seaagent-binary-resolver.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent-binary-resolver.js +46 -0
- package/dist/server/server/agent/providers/seaagent-binary-resolver.js.map +1 -0
- package/dist/server/server/agent/providers/seaagent-health-probe.d.ts +11 -0
- package/dist/server/server/agent/providers/seaagent-health-probe.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seaagent-health-probe.js +49 -0
- package/dist/server/server/agent/providers/seaagent-health-probe.js.map +1 -0
- package/dist/server/server/agent/providers/seawork-models.d.ts +8 -0
- package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -1
- package/dist/server/server/agent/providers/seawork-models.js +118 -74
- package/dist/server/server/agent/providers/seawork-models.js.map +1 -1
- package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +2 -2
- package/dist/server/server/agent/timeline-projection.d.ts +5 -1
- package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
- package/dist/server/server/agent/timeline-projection.js +20 -4
- package/dist/server/server/agent/timeline-projection.js.map +1 -1
- package/dist/server/server/agent-attention-policy.d.ts +1 -0
- package/dist/server/server/agent-attention-policy.d.ts.map +1 -1
- package/dist/server/server/agent-attention-policy.js +6 -0
- package/dist/server/server/agent-attention-policy.js.map +1 -1
- package/dist/server/server/allowed-hosts.d.ts +13 -0
- package/dist/server/server/allowed-hosts.d.ts.map +1 -1
- package/dist/server/server/allowed-hosts.js +33 -0
- package/dist/server/server/allowed-hosts.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts +2 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +200 -14
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/browser-extension-token.d.ts +23 -0
- package/dist/server/server/browser-extension-token.d.ts.map +1 -0
- package/dist/server/server/browser-extension-token.js +114 -0
- package/dist/server/server/browser-extension-token.js.map +1 -0
- package/dist/server/server/bug-report-handler.d.ts +7 -1
- package/dist/server/server/bug-report-handler.d.ts.map +1 -1
- package/dist/server/server/bug-report-handler.js +73 -5
- package/dist/server/server/bug-report-handler.js.map +1 -1
- package/dist/server/server/bug-report-redact.d.ts +25 -1
- package/dist/server/server/bug-report-redact.d.ts.map +1 -1
- package/dist/server/server/bug-report-redact.js +42 -5
- package/dist/server/server/bug-report-redact.js.map +1 -1
- package/dist/server/server/config.d.ts +1 -0
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +51 -1
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/crash-report.d.ts.map +1 -1
- package/dist/server/server/crash-report.js +18 -0
- package/dist/server/server/crash-report.js.map +1 -1
- package/dist/server/server/daemon-config-store.d.ts.map +1 -1
- package/dist/server/server/daemon-config-store.js +94 -3
- package/dist/server/server/daemon-config-store.js.map +1 -1
- package/dist/server/server/disk-full.d.ts +4 -0
- package/dist/server/server/disk-full.d.ts.map +1 -0
- package/dist/server/server/disk-full.js +46 -0
- package/dist/server/server/disk-full.js.map +1 -0
- package/dist/server/server/exports.d.ts +3 -2
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +2 -1
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/git-forge/github-client.d.ts +18 -0
- package/dist/server/server/git-forge/github-client.d.ts.map +1 -1
- package/dist/server/server/git-forge/github-client.js +88 -0
- package/dist/server/server/git-forge/github-client.js.map +1 -1
- package/dist/server/server/git-forge/parse-remote.d.ts +2 -0
- package/dist/server/server/git-forge/parse-remote.d.ts.map +1 -1
- package/dist/server/server/git-forge/parse-remote.js +71 -6
- package/dist/server/server/git-forge/parse-remote.js.map +1 -1
- package/dist/server/server/git-forge/service.d.ts +87 -0
- package/dist/server/server/git-forge/service.d.ts.map +1 -1
- package/dist/server/server/git-forge/service.js +198 -4
- package/dist/server/server/git-forge/service.js.map +1 -1
- package/dist/server/server/index.js +72 -0
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/integrations/wecom-openclaw/bridge.d.ts +88 -0
- package/dist/server/server/integrations/wecom-openclaw/bridge.d.ts.map +1 -0
- package/dist/server/server/integrations/wecom-openclaw/bridge.js +1229 -0
- package/dist/server/server/integrations/wecom-openclaw/bridge.js.map +1 -0
- package/dist/server/server/integrations/wecom-openclaw/qr.d.ts +38 -0
- package/dist/server/server/integrations/wecom-openclaw/qr.d.ts.map +1 -0
- package/dist/server/server/integrations/wecom-openclaw/qr.js +101 -0
- package/dist/server/server/integrations/wecom-openclaw/qr.js.map +1 -0
- package/dist/server/server/integrations/wecom-openclaw/workspace.d.ts +5 -0
- package/dist/server/server/integrations/wecom-openclaw/workspace.d.ts.map +1 -0
- package/dist/server/server/integrations/wecom-openclaw/workspace.js +40 -0
- package/dist/server/server/integrations/wecom-openclaw/workspace.js.map +1 -0
- package/dist/server/server/latency-proxy.d.ts.map +1 -1
- package/dist/server/server/latency-proxy.js +45 -5
- package/dist/server/server/latency-proxy.js.map +1 -1
- package/dist/server/server/library/codex-skill-discovery.d.ts +9 -0
- package/dist/server/server/library/codex-skill-discovery.d.ts.map +1 -0
- package/dist/server/server/library/codex-skill-discovery.js +49 -0
- package/dist/server/server/library/codex-skill-discovery.js.map +1 -0
- package/dist/server/server/library/hub-install.d.ts +79 -0
- package/dist/server/server/library/hub-install.d.ts.map +1 -0
- package/dist/server/server/library/hub-install.js +263 -0
- package/dist/server/server/library/hub-install.js.map +1 -0
- package/dist/server/server/library/hub-test-run.d.ts +81 -0
- package/dist/server/server/library/hub-test-run.d.ts.map +1 -0
- package/dist/server/server/library/hub-test-run.js +237 -0
- package/dist/server/server/library/hub-test-run.js.map +1 -0
- package/dist/server/server/library/library-import.d.ts +27 -0
- package/dist/server/server/library/library-import.d.ts.map +1 -0
- package/dist/server/server/library/library-import.js +227 -0
- package/dist/server/server/library/library-import.js.map +1 -0
- package/dist/server/server/library/library-injection.d.ts +16 -0
- package/dist/server/server/library/library-injection.d.ts.map +1 -0
- package/dist/server/server/library/library-injection.js +49 -0
- package/dist/server/server/library/library-injection.js.map +1 -0
- package/dist/server/server/library/library-rpc.d.ts +73 -0
- package/dist/server/server/library/library-rpc.d.ts.map +1 -0
- package/dist/server/server/library/library-rpc.js +239 -0
- package/dist/server/server/library/library-rpc.js.map +1 -0
- package/dist/server/server/library/library-store.d.ts +35 -0
- package/dist/server/server/library/library-store.d.ts.map +1 -0
- package/dist/server/server/library/library-store.js +169 -0
- package/dist/server/server/library/library-store.js.map +1 -0
- package/dist/server/server/library/library-sync.d.ts +46 -0
- package/dist/server/server/library/library-sync.d.ts.map +1 -0
- package/dist/server/server/library/library-sync.js +235 -0
- package/dist/server/server/library/library-sync.js.map +1 -0
- package/dist/server/server/library/library-types.d.ts +756 -0
- package/dist/server/server/library/library-types.d.ts.map +1 -0
- package/dist/server/server/library/library-types.js +99 -0
- package/dist/server/server/library/library-types.js.map +1 -0
- package/dist/server/server/library/worktree-dev.d.ts +14 -0
- package/dist/server/server/library/worktree-dev.d.ts.map +1 -0
- package/dist/server/server/library/worktree-dev.js +24 -0
- package/dist/server/server/library/worktree-dev.js.map +1 -0
- package/dist/server/server/log-stream-error.d.ts +2 -0
- package/dist/server/server/log-stream-error.d.ts.map +1 -0
- package/dist/server/server/log-stream-error.js +33 -0
- package/dist/server/server/log-stream-error.js.map +1 -0
- package/dist/server/server/logger.d.ts +1 -0
- package/dist/server/server/logger.d.ts.map +1 -1
- package/dist/server/server/logger.js +32 -0
- package/dist/server/server/logger.js.map +1 -1
- package/dist/server/server/loop/rpc-schemas.d.ts +96 -96
- package/dist/server/server/loop-service.d.ts +18 -18
- package/dist/server/server/messages.d.ts +4 -1
- package/dist/server/server/messages.d.ts.map +1 -1
- package/dist/server/server/messages.js +40 -2
- package/dist/server/server/messages.js.map +1 -1
- package/dist/server/server/node-pty-error.d.ts +2 -0
- package/dist/server/server/node-pty-error.d.ts.map +1 -0
- package/dist/server/server/node-pty-error.js +19 -0
- package/dist/server/server/node-pty-error.js.map +1 -0
- package/dist/server/server/persisted-config.d.ts +219 -135
- package/dist/server/server/persisted-config.d.ts.map +1 -1
- package/dist/server/server/persisted-config.js +35 -1
- package/dist/server/server/persisted-config.js.map +1 -1
- package/dist/server/server/port-in-use.d.ts +4 -0
- package/dist/server/server/port-in-use.d.ts.map +1 -0
- package/dist/server/server/port-in-use.js +35 -0
- package/dist/server/server/port-in-use.js.map +1 -0
- package/dist/server/server/provider-runtime-settings-mask.d.ts +7 -0
- package/dist/server/server/provider-runtime-settings-mask.d.ts.map +1 -0
- package/dist/server/server/provider-runtime-settings-mask.js +65 -0
- package/dist/server/server/provider-runtime-settings-mask.js.map +1 -0
- package/dist/server/server/sac/auth.d.ts +12 -0
- package/dist/server/server/sac/auth.d.ts.map +1 -1
- package/dist/server/server/sac/auth.js +19 -1
- package/dist/server/server/sac/auth.js.map +1 -1
- package/dist/server/server/sac/index.d.ts +2 -2
- package/dist/server/server/sac/index.d.ts.map +1 -1
- package/dist/server/server/sac/index.js +2 -2
- package/dist/server/server/sac/index.js.map +1 -1
- package/dist/server/server/sac/poll.d.ts +2 -0
- package/dist/server/server/sac/poll.d.ts.map +1 -1
- package/dist/server/server/sac/poll.js +7 -2
- package/dist/server/server/sac/poll.js.map +1 -1
- package/dist/server/server/schedule/cron.d.ts.map +1 -1
- package/dist/server/server/schedule/cron.js +6 -6
- package/dist/server/server/schedule/cron.js.map +1 -1
- package/dist/server/server/schedule/rpc-schemas.d.ts +895 -0
- package/dist/server/server/schedule/rpc-schemas.d.ts.map +1 -1
- package/dist/server/server/schedule/rpc-schemas.js +34 -0
- package/dist/server/server/schedule/rpc-schemas.js.map +1 -1
- package/dist/server/server/schedule/service.d.ts +5 -1
- package/dist/server/server/schedule/service.d.ts.map +1 -1
- package/dist/server/server/schedule/service.js +97 -14
- package/dist/server/server/schedule/service.js.map +1 -1
- package/dist/server/server/schedule/types.d.ts +19 -0
- package/dist/server/server/schedule/types.d.ts.map +1 -1
- package/dist/server/server/schedule/types.js +1 -0
- package/dist/server/server/schedule/types.js.map +1 -1
- package/dist/server/server/session.d.ts +83 -2
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +895 -82
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/speech/native-runtime-guard.d.ts +1 -0
- package/dist/server/server/speech/native-runtime-guard.d.ts.map +1 -1
- package/dist/server/server/speech/native-runtime-guard.js +10 -4
- package/dist/server/server/speech/native-runtime-guard.js.map +1 -1
- package/dist/server/server/websocket-server.d.ts +6 -1
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +79 -7
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-git-service.d.ts +2 -1
- package/dist/server/server/workspace-git-service.d.ts.map +1 -1
- package/dist/server/server/workspace-git-service.js +7 -3
- package/dist/server/server/workspace-git-service.js.map +1 -1
- package/dist/server/server/workspace-registry-model.d.ts +1 -0
- package/dist/server/server/workspace-registry-model.d.ts.map +1 -1
- package/dist/server/server/workspace-registry-model.js +18 -0
- package/dist/server/server/workspace-registry-model.js.map +1 -1
- package/dist/server/server/worktree-session.d.ts +3 -3
- package/dist/server/server/worktree-session.d.ts.map +1 -1
- package/dist/server/server/worktree-session.js +1 -3
- package/dist/server/server/worktree-session.js.map +1 -1
- package/dist/server/shared/messages.d.ts +59658 -21927
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +531 -3
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/provider-runtime-settings.d.ts +87 -0
- package/dist/server/shared/provider-runtime-settings.d.ts.map +1 -0
- package/dist/server/shared/provider-runtime-settings.js +33 -0
- package/dist/server/shared/provider-runtime-settings.js.map +1 -0
- package/dist/server/terminal/terminal.d.ts +9 -0
- package/dist/server/terminal/terminal.d.ts.map +1 -1
- package/dist/server/terminal/terminal.js +100 -3
- package/dist/server/terminal/terminal.js.map +1 -1
- package/dist/server/utils/checkout-git.d.ts +23 -1
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +182 -21
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
- package/dist/server/utils/directory-suggestions.js +57 -9
- package/dist/server/utils/directory-suggestions.js.map +1 -1
- package/dist/src/server/bug-report-redact.js +42 -5
- package/dist/src/server/bug-report-redact.js.map +1 -1
- package/dist/src/server/crash-report.js +18 -0
- package/dist/src/server/crash-report.js.map +1 -1
- package/dist/src/server/speech/native-runtime-guard.js +177 -0
- package/dist/src/server/speech/native-runtime-guard.js.map +1 -0
- package/dist/src/server/speech/speech-types.js +8 -0
- package/dist/src/server/speech/speech-types.js.map +1 -0
- package/package.json +16 -4
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
import { type LibraryFile, type LibraryMcpEntry, type LibrarySkillEntry, type SkillsSyncResult } from "./library-types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reads/writes the per-daemon library file at $SEAWORK_HOME/library.json.
|
|
5
|
+
* Serializes writes through an in-process queue. We don't bother with cross-
|
|
6
|
+
* process locks here — library.json is only ever written by the daemon owner
|
|
7
|
+
* of this SEAWORK_HOME.
|
|
8
|
+
*/
|
|
9
|
+
export declare class LibraryStore {
|
|
10
|
+
private readonly filePath;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
private cached;
|
|
13
|
+
private writeQueue;
|
|
14
|
+
private lastSync;
|
|
15
|
+
constructor(seaworkHome: string, logger?: Logger);
|
|
16
|
+
get path(): string;
|
|
17
|
+
exists(): Promise<boolean>;
|
|
18
|
+
load(): Promise<LibraryFile>;
|
|
19
|
+
/** Replaces the entire library file. */
|
|
20
|
+
save(library: LibraryFile): Promise<void>;
|
|
21
|
+
private update;
|
|
22
|
+
private enqueueWrite;
|
|
23
|
+
private writeNow;
|
|
24
|
+
upsertMcp(name: string, entry: LibraryMcpEntry): Promise<LibraryFile>;
|
|
25
|
+
upsertSkill(name: string, entry: LibrarySkillEntry): Promise<LibraryFile>;
|
|
26
|
+
delete(kind: "mcp" | "skill", name: string): Promise<LibraryFile>;
|
|
27
|
+
setAutoAttach(kind: "mcp" | "skill", name: string, value: boolean): Promise<LibraryFile>;
|
|
28
|
+
/** Replace whole file (used by import). */
|
|
29
|
+
replace(library: LibraryFile): Promise<LibraryFile>;
|
|
30
|
+
/** Drop the in-memory cache so the next load() re-reads from disk. */
|
|
31
|
+
invalidate(): void;
|
|
32
|
+
getLastSyncResult(): SkillsSyncResult | null;
|
|
33
|
+
setLastSyncResult(result: SkillsSyncResult | null): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=library-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-store.d.ts","sourceRoot":"","sources":["../../../../src/server/library/library-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,QAAQ,CAAiC;gBAErC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKhD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAiClC,wCAAwC;IAClC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAIjC,MAAM;YAIN,YAAY;YAgBZ,QAAQ;IAOhB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAQrE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAYzE,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBjE,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAyB9F,2CAA2C;IACrC,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAKzD,sEAAsE;IACtE,UAAU,IAAI,IAAI;IAIlB,iBAAiB,IAAI,gBAAgB,GAAG,IAAI;IAI5C,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;CAGzD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { LIBRARY_FILE_NAME, LibraryFileSchema, LibraryMcpEntrySchema, LibrarySkillEntrySchema, emptyLibrary, } from "./library-types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Reads/writes the per-daemon library file at $SEAWORK_HOME/library.json.
|
|
6
|
+
* Serializes writes through an in-process queue. We don't bother with cross-
|
|
7
|
+
* process locks here — library.json is only ever written by the daemon owner
|
|
8
|
+
* of this SEAWORK_HOME.
|
|
9
|
+
*/
|
|
10
|
+
export class LibraryStore {
|
|
11
|
+
constructor(seaworkHome, logger) {
|
|
12
|
+
this.cached = null;
|
|
13
|
+
this.writeQueue = Promise.resolve();
|
|
14
|
+
this.lastSync = null;
|
|
15
|
+
this.filePath = path.join(seaworkHome, LIBRARY_FILE_NAME);
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
}
|
|
18
|
+
get path() {
|
|
19
|
+
return this.filePath;
|
|
20
|
+
}
|
|
21
|
+
async exists() {
|
|
22
|
+
try {
|
|
23
|
+
await fs.stat(this.filePath);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async load() {
|
|
31
|
+
if (this.cached)
|
|
32
|
+
return this.cached;
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = await fs.readFile(this.filePath, "utf8");
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err.code === "ENOENT") {
|
|
39
|
+
this.cached = emptyLibrary();
|
|
40
|
+
return this.cached;
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
this.logger?.error({ err, path: this.filePath }, "library.json: invalid JSON, resetting");
|
|
50
|
+
this.cached = emptyLibrary();
|
|
51
|
+
return this.cached;
|
|
52
|
+
}
|
|
53
|
+
const result = LibraryFileSchema.safeParse(parsed);
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
this.logger?.error({ issues: result.error.issues, path: this.filePath }, "library.json: schema mismatch, resetting");
|
|
56
|
+
this.cached = emptyLibrary();
|
|
57
|
+
return this.cached;
|
|
58
|
+
}
|
|
59
|
+
this.cached = result.data;
|
|
60
|
+
return this.cached;
|
|
61
|
+
}
|
|
62
|
+
/** Replaces the entire library file. */
|
|
63
|
+
async save(library) {
|
|
64
|
+
await this.enqueueWrite(() => library);
|
|
65
|
+
}
|
|
66
|
+
async update(mutator) {
|
|
67
|
+
return this.enqueueWrite(async () => mutator(await this.load()));
|
|
68
|
+
}
|
|
69
|
+
async enqueueWrite(nextLibrary) {
|
|
70
|
+
let next = null;
|
|
71
|
+
const write = this.writeQueue.then(async () => {
|
|
72
|
+
next = await nextLibrary();
|
|
73
|
+
await this.writeNow(next);
|
|
74
|
+
this.cached = next;
|
|
75
|
+
});
|
|
76
|
+
this.writeQueue = write.catch((err) => {
|
|
77
|
+
this.logger?.error({ err, path: this.filePath }, "library.json: write failed");
|
|
78
|
+
});
|
|
79
|
+
await write;
|
|
80
|
+
return next;
|
|
81
|
+
}
|
|
82
|
+
async writeNow(library) {
|
|
83
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
84
|
+
const tmp = `${this.filePath}.tmp-${process.pid}`;
|
|
85
|
+
await fs.writeFile(tmp, JSON.stringify(library, null, 2), "utf8");
|
|
86
|
+
await fs.rename(tmp, this.filePath);
|
|
87
|
+
}
|
|
88
|
+
async upsertMcp(name, entry) {
|
|
89
|
+
const normalized = LibraryMcpEntrySchema.parse(entry);
|
|
90
|
+
return this.update((lib) => ({
|
|
91
|
+
...lib,
|
|
92
|
+
mcpServers: { ...(lib.mcpServers ?? {}), [name]: stamp(normalized) },
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
async upsertSkill(name, entry) {
|
|
96
|
+
const normalized = LibrarySkillEntrySchema.parse(entry);
|
|
97
|
+
return this.update((lib) => {
|
|
98
|
+
const { [name]: _unhide, ...hiddenSkills } = lib.hiddenSkills ?? {};
|
|
99
|
+
return {
|
|
100
|
+
...lib,
|
|
101
|
+
skills: { ...(lib.skills ?? {}), [name]: stamp(normalized) },
|
|
102
|
+
hiddenSkills,
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async delete(kind, name) {
|
|
107
|
+
return this.update((lib) => {
|
|
108
|
+
if (kind === "mcp") {
|
|
109
|
+
if (!lib.mcpServers?.[name])
|
|
110
|
+
return lib;
|
|
111
|
+
const { [name]: _drop, ...rest } = lib.mcpServers;
|
|
112
|
+
return { ...lib, mcpServers: rest };
|
|
113
|
+
}
|
|
114
|
+
if (!lib.skills?.[name])
|
|
115
|
+
return lib;
|
|
116
|
+
const { [name]: _drop, ...rest } = lib.skills;
|
|
117
|
+
return {
|
|
118
|
+
...lib,
|
|
119
|
+
skills: rest,
|
|
120
|
+
hiddenSkills: { ...(lib.hiddenSkills ?? {}), [name]: true },
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async setAutoAttach(kind, name, value) {
|
|
125
|
+
return this.update((lib) => {
|
|
126
|
+
if (kind === "mcp") {
|
|
127
|
+
const cur = lib.mcpServers?.[name];
|
|
128
|
+
if (!cur)
|
|
129
|
+
return lib;
|
|
130
|
+
return {
|
|
131
|
+
...lib,
|
|
132
|
+
mcpServers: {
|
|
133
|
+
...(lib.mcpServers ?? {}),
|
|
134
|
+
[name]: stamp(LibraryMcpEntrySchema.parse({ ...cur, autoAttach: value })),
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const cur = lib.skills?.[name];
|
|
139
|
+
if (!cur)
|
|
140
|
+
return lib;
|
|
141
|
+
return {
|
|
142
|
+
...lib,
|
|
143
|
+
skills: {
|
|
144
|
+
...(lib.skills ?? {}),
|
|
145
|
+
[name]: stamp(LibrarySkillEntrySchema.parse({ ...cur, autoAttach: value })),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** Replace whole file (used by import). */
|
|
151
|
+
async replace(library) {
|
|
152
|
+
await this.save(library);
|
|
153
|
+
return library;
|
|
154
|
+
}
|
|
155
|
+
/** Drop the in-memory cache so the next load() re-reads from disk. */
|
|
156
|
+
invalidate() {
|
|
157
|
+
this.cached = null;
|
|
158
|
+
}
|
|
159
|
+
getLastSyncResult() {
|
|
160
|
+
return this.lastSync;
|
|
161
|
+
}
|
|
162
|
+
setLastSyncResult(result) {
|
|
163
|
+
this.lastSync = result;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function stamp(entry) {
|
|
167
|
+
return { ...entry, updatedAt: new Date().toISOString() };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=library-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-store.js","sourceRoot":"","sources":["../../../../src/server/library/library-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
import { type LibraryFile, type SkillsSyncResult } from "./library-types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Syncs library skills to the on-disk locations each provider's CLI actually
|
|
5
|
+
* reads from:
|
|
6
|
+
* - Codex: ~/.codex/skills/seawork-managed-<name>/SKILL.md
|
|
7
|
+
* - Claude: ~/.claude/skills/seawork-managed-<name>/SKILL.md
|
|
8
|
+
* (the Claude SDK reads from settingSources=["user","project"])
|
|
9
|
+
*
|
|
10
|
+
* The Claude and Codex locations are global and shared across all Seawork
|
|
11
|
+
* instances on the machine. We use owner lockfiles to prevent a worktree dev
|
|
12
|
+
* daemon from stomping the production app's writes.
|
|
13
|
+
*/
|
|
14
|
+
export interface SyncOptions {
|
|
15
|
+
/** $SEAWORK_HOME. The sync manifest and stale Codex cache cleanup live underneath. */
|
|
16
|
+
seaworkHome: string;
|
|
17
|
+
/** Override ~/.claude for tests. */
|
|
18
|
+
claudeHomeDir?: string;
|
|
19
|
+
/** Override ~/.codex for tests. */
|
|
20
|
+
codexHomeDir?: string;
|
|
21
|
+
logger?: Logger;
|
|
22
|
+
}
|
|
23
|
+
export declare function syncSkillsToDisk(library: LibraryFile, opts: SyncOptions): Promise<SkillsSyncResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Sync Hub-installed skills (source: "hub") to disk — the lock-free incremental
|
|
26
|
+
* counterpart to syncSkillsToDisk. Hub install is a machine-level "add one
|
|
27
|
+
* skill" action, so it deliberately:
|
|
28
|
+
* - does NOT read or write the owner lockfile (another home's lock can't block
|
|
29
|
+
* a Hub install, and a Hub skill survives another home's full rewrite);
|
|
30
|
+
* - only touches the `seawork-hub-*` namespace — it never touches the
|
|
31
|
+
* `seawork-managed-*` dirs the owner-locked full sync manages;
|
|
32
|
+
* - is ADDITIVE: it writes/updates every Hub skill in *this* home's library,
|
|
33
|
+
* and only removes the specific dirs named in `removeSlugs` (the skills this
|
|
34
|
+
* home just uninstalled). It must NOT reconcile-delete `seawork-hub-*` dirs
|
|
35
|
+
* absent from this home's library — `~/.{claude,codex}/skills` is shared
|
|
36
|
+
* across all Seawork homes on the machine, so a worktree dev daemon (whose
|
|
37
|
+
* library has no Hub skills) would otherwise wipe the production app's
|
|
38
|
+
* Hub-installed skills on every boot.
|
|
39
|
+
* Idempotent; safe to run alongside the full sync.
|
|
40
|
+
*/
|
|
41
|
+
export declare function syncHubSkillsToDisk(library: LibraryFile, opts: SyncOptions & {
|
|
42
|
+
removeSlugs?: string[];
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
/** Cheap drift detector: returns true if on-disk state matches what library would write. */
|
|
45
|
+
export declare function isInSync(library: LibraryFile, opts: SyncOptions): Promise<boolean>;
|
|
46
|
+
//# sourceMappingURL=library-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-sync.d.ts","sourceRoot":"","sources":["../../../../src/server/library/library-sync.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAWL,KAAK,WAAW,EAEhB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAK3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,WAAW,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7C,OAAO,CAAC,IAAI,CAAC,CAaf;AA2CD,4FAA4F;AAC5F,wBAAsB,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CASxF"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { CLAUDE_HUB_SKILL_PREFIX, CLAUDE_SKILL_NAMESPACE_PREFIX, CLAUDE_SKILL_OWNER_LOCKFILE, CODEX_HUB_SKILL_PREFIX, CODEX_SKILL_NAMESPACE_PREFIX, CODEX_SKILL_OWNER_LOCKFILE, ClaudeSkillOwnerLockSchema, SKILLS_CACHE_DIRNAME, SKILLS_SYNC_MANIFEST, } from "./library-types.js";
|
|
6
|
+
export async function syncSkillsToDisk(library, opts) {
|
|
7
|
+
const { codexWritten, codexConflicts } = await syncCodexSkills(library, opts);
|
|
8
|
+
const { claudeWritten, claudeConflicts } = await syncClaudeSkills(library, opts);
|
|
9
|
+
await writeManifest(library, opts, claudeWritten, codexWritten);
|
|
10
|
+
return { claudeWritten, codexWritten, claudeConflicts, codexConflicts };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Sync Hub-installed skills (source: "hub") to disk — the lock-free incremental
|
|
14
|
+
* counterpart to syncSkillsToDisk. Hub install is a machine-level "add one
|
|
15
|
+
* skill" action, so it deliberately:
|
|
16
|
+
* - does NOT read or write the owner lockfile (another home's lock can't block
|
|
17
|
+
* a Hub install, and a Hub skill survives another home's full rewrite);
|
|
18
|
+
* - only touches the `seawork-hub-*` namespace — it never touches the
|
|
19
|
+
* `seawork-managed-*` dirs the owner-locked full sync manages;
|
|
20
|
+
* - is ADDITIVE: it writes/updates every Hub skill in *this* home's library,
|
|
21
|
+
* and only removes the specific dirs named in `removeSlugs` (the skills this
|
|
22
|
+
* home just uninstalled). It must NOT reconcile-delete `seawork-hub-*` dirs
|
|
23
|
+
* absent from this home's library — `~/.{claude,codex}/skills` is shared
|
|
24
|
+
* across all Seawork homes on the machine, so a worktree dev daemon (whose
|
|
25
|
+
* library has no Hub skills) would otherwise wipe the production app's
|
|
26
|
+
* Hub-installed skills on every boot.
|
|
27
|
+
* Idempotent; safe to run alongside the full sync.
|
|
28
|
+
*/
|
|
29
|
+
export async function syncHubSkillsToDisk(library, opts) {
|
|
30
|
+
await syncHubProvider(library, opts, {
|
|
31
|
+
provider: "codex",
|
|
32
|
+
home: opts.codexHomeDir ?? path.join(os.homedir(), ".codex"),
|
|
33
|
+
prefix: CODEX_HUB_SKILL_PREFIX,
|
|
34
|
+
content: (entry) => entry.contentCodex ?? entry.content,
|
|
35
|
+
});
|
|
36
|
+
await syncHubProvider(library, opts, {
|
|
37
|
+
provider: "claude",
|
|
38
|
+
home: opts.claudeHomeDir ?? path.join(os.homedir(), ".claude"),
|
|
39
|
+
prefix: CLAUDE_HUB_SKILL_PREFIX,
|
|
40
|
+
content: (entry) => entry.content,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async function syncHubProvider(library, opts, cfg) {
|
|
44
|
+
const skillsDir = path.join(cfg.home, "skills");
|
|
45
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
46
|
+
const hubSkills = Object.entries(library.skills ?? {}).filter(([, s]) => s.source === "hub" && s.autoAttach !== false && (s.providers ?? []).includes(cfg.provider));
|
|
47
|
+
const wanted = new Map(hubSkills.map(([name, entry]) => [skillDirName(cfg.prefix, name), entry]));
|
|
48
|
+
// Targeted removal only: delete the dirs for skills this home explicitly
|
|
49
|
+
// uninstalled. We never bulk-delete "any seawork-hub-* dir not in my library"
|
|
50
|
+
// — that would let one home clobber another home's installs (shared dir).
|
|
51
|
+
for (const slug of opts.removeSlugs ?? []) {
|
|
52
|
+
const dirName = skillDirName(cfg.prefix, slug);
|
|
53
|
+
if (!wanted.has(dirName)) {
|
|
54
|
+
await fs.rm(path.join(skillsDir, dirName), { recursive: true, force: true });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const [dirName, entry] of wanted) {
|
|
58
|
+
const dir = path.join(skillsDir, dirName);
|
|
59
|
+
await fs.mkdir(dir, { recursive: true });
|
|
60
|
+
await fs.writeFile(path.join(dir, "SKILL.md"), cfg.content(entry), "utf8");
|
|
61
|
+
}
|
|
62
|
+
opts.logger?.debug?.({ provider: cfg.provider, count: wanted.size, removed: opts.removeSlugs?.length ?? 0 }, "library: synced hub skills (lock-free)");
|
|
63
|
+
}
|
|
64
|
+
/** Cheap drift detector: returns true if on-disk state matches what library would write. */
|
|
65
|
+
export async function isInSync(library, opts) {
|
|
66
|
+
const manifestPath = path.join(opts.seaworkHome, SKILLS_SYNC_MANIFEST);
|
|
67
|
+
try {
|
|
68
|
+
const raw = await fs.readFile(manifestPath, "utf8");
|
|
69
|
+
const parsed = JSON.parse(raw);
|
|
70
|
+
return parsed?.contentHash === computeLibraryHash(library);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function syncCodexSkills(library, opts) {
|
|
77
|
+
const cacheRoot = path.join(opts.seaworkHome, SKILLS_CACHE_DIRNAME, "codex");
|
|
78
|
+
const codexHome = opts.codexHomeDir ?? path.join(os.homedir(), ".codex");
|
|
79
|
+
const skillsDir = path.join(codexHome, "skills");
|
|
80
|
+
const lockPath = path.join(skillsDir, CODEX_SKILL_OWNER_LOCKFILE);
|
|
81
|
+
// Older builds wrote Codex library skills into a daemon-private cache. The
|
|
82
|
+
// provider still scans that path during rollout, so remove it before writing
|
|
83
|
+
// the global Codex CLI location to avoid stale duplicate skills.
|
|
84
|
+
await fs.rm(cacheRoot, { recursive: true, force: true });
|
|
85
|
+
const targetSkills = filterSkills(library, "codex").filter(([, s]) => s.source !== "imported-codex" && s.source !== "imported-both");
|
|
86
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
87
|
+
const existingLock = await readOwnerLock(lockPath);
|
|
88
|
+
const owner = existingLock?.ownerSeaworkHome;
|
|
89
|
+
if (owner && owner !== opts.seaworkHome) {
|
|
90
|
+
return {
|
|
91
|
+
codexWritten: [],
|
|
92
|
+
codexConflicts: targetSkills.map(([name]) => ({ name, ownerSeaworkHome: owner })),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const entries = await safeReaddir(skillsDir);
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
if (entry.name.startsWith(CODEX_SKILL_NAMESPACE_PREFIX)) {
|
|
98
|
+
await fs.rm(path.join(skillsDir, entry.name), { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (targetSkills.length === 0) {
|
|
102
|
+
await fs.rm(lockPath, { force: true });
|
|
103
|
+
return { codexWritten: [], codexConflicts: [] };
|
|
104
|
+
}
|
|
105
|
+
const written = [];
|
|
106
|
+
for (const [name, entry] of targetSkills) {
|
|
107
|
+
const dir = path.join(skillsDir, skillDirName(CODEX_SKILL_NAMESPACE_PREFIX, name));
|
|
108
|
+
await fs.mkdir(dir, { recursive: true });
|
|
109
|
+
await fs.writeFile(path.join(dir, "SKILL.md"), entry.contentCodex ?? entry.content, "utf8");
|
|
110
|
+
written.push(name);
|
|
111
|
+
}
|
|
112
|
+
const lock = {
|
|
113
|
+
ownerSeaworkHome: opts.seaworkHome,
|
|
114
|
+
pid: process.pid,
|
|
115
|
+
writtenAt: new Date().toISOString(),
|
|
116
|
+
};
|
|
117
|
+
await fs.writeFile(lockPath, JSON.stringify(lock, null, 2), "utf8");
|
|
118
|
+
return { codexWritten: written, codexConflicts: [] };
|
|
119
|
+
}
|
|
120
|
+
async function syncClaudeSkills(library, opts) {
|
|
121
|
+
const claudeHome = opts.claudeHomeDir ?? path.join(os.homedir(), ".claude");
|
|
122
|
+
const skillsDir = path.join(claudeHome, "skills");
|
|
123
|
+
const lockPath = path.join(skillsDir, CLAUDE_SKILL_OWNER_LOCKFILE);
|
|
124
|
+
// Claude CLI auto-discovers any dir under ~/.claude/skills. Skills imported
|
|
125
|
+
// from there are already on disk under their original name — writing a
|
|
126
|
+
// seawork-managed-<name> copy would make Claude show duplicates. So only
|
|
127
|
+
// write copies for entries that don't already exist there: user-created
|
|
128
|
+
// entries and codex-only imports.
|
|
129
|
+
const targetSkills = filterSkills(library, "claude").filter(([, s]) => s.source !== "imported-claude" && s.source !== "imported-both");
|
|
130
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
131
|
+
// Read existing lock; only proceed if we own it, or if no one does.
|
|
132
|
+
const existingLock = await readOwnerLock(lockPath);
|
|
133
|
+
const owner = existingLock?.ownerSeaworkHome;
|
|
134
|
+
if (owner && owner !== opts.seaworkHome) {
|
|
135
|
+
// Someone else owns ~/.claude/skills. Don't write anything here, and
|
|
136
|
+
// report every target as a conflict so the UI can surface it.
|
|
137
|
+
return {
|
|
138
|
+
claudeWritten: [],
|
|
139
|
+
claudeConflicts: targetSkills.map(([name]) => ({ name, ownerSeaworkHome: owner })),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Remove our previously-written namespace prefix dirs, then rewrite.
|
|
143
|
+
const entries = await safeReaddir(skillsDir);
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
if (entry.name.startsWith(CLAUDE_SKILL_NAMESPACE_PREFIX)) {
|
|
146
|
+
await fs.rm(path.join(skillsDir, entry.name), { recursive: true, force: true });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (targetSkills.length === 0) {
|
|
150
|
+
// We left no skills — release the owner lock so another instance can claim it.
|
|
151
|
+
await fs.rm(lockPath, { force: true });
|
|
152
|
+
return { claudeWritten: [], claudeConflicts: [] };
|
|
153
|
+
}
|
|
154
|
+
const written = [];
|
|
155
|
+
for (const [name, entry] of targetSkills) {
|
|
156
|
+
const dir = path.join(skillsDir, skillDirName(CLAUDE_SKILL_NAMESPACE_PREFIX, name));
|
|
157
|
+
await fs.mkdir(dir, { recursive: true });
|
|
158
|
+
await fs.writeFile(path.join(dir, "SKILL.md"), entry.content, "utf8");
|
|
159
|
+
written.push(name);
|
|
160
|
+
}
|
|
161
|
+
// (Re)write owner lock claiming ownership.
|
|
162
|
+
const lock = {
|
|
163
|
+
ownerSeaworkHome: opts.seaworkHome,
|
|
164
|
+
pid: process.pid,
|
|
165
|
+
writtenAt: new Date().toISOString(),
|
|
166
|
+
};
|
|
167
|
+
await fs.writeFile(lockPath, JSON.stringify(lock, null, 2), "utf8");
|
|
168
|
+
return { claudeWritten: written, claudeConflicts: [] };
|
|
169
|
+
}
|
|
170
|
+
async function readOwnerLock(lockPath) {
|
|
171
|
+
try {
|
|
172
|
+
const raw = await fs.readFile(lockPath, "utf8");
|
|
173
|
+
const parsed = ClaudeSkillOwnerLockSchema.safeParse(JSON.parse(raw));
|
|
174
|
+
return parsed.success ? parsed.data : null;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function writeManifest(library, opts, claudeWritten, codexWritten) {
|
|
181
|
+
const manifestPath = path.join(opts.seaworkHome, SKILLS_SYNC_MANIFEST);
|
|
182
|
+
await fs.mkdir(opts.seaworkHome, { recursive: true });
|
|
183
|
+
await fs.writeFile(manifestPath, JSON.stringify({
|
|
184
|
+
contentHash: computeLibraryHash(library),
|
|
185
|
+
syncedAt: new Date().toISOString(),
|
|
186
|
+
claudeWritten,
|
|
187
|
+
codexWritten,
|
|
188
|
+
}, null, 2), "utf8");
|
|
189
|
+
}
|
|
190
|
+
function computeLibraryHash(library) {
|
|
191
|
+
// Only the skill content + provider scoping affects on-disk state. mcpServers
|
|
192
|
+
// changes don't require a resync.
|
|
193
|
+
const skills = library.skills ?? {};
|
|
194
|
+
const canonical = Object.keys(skills)
|
|
195
|
+
.sort()
|
|
196
|
+
.map((name) => {
|
|
197
|
+
const s = skills[name];
|
|
198
|
+
const providers = [...(s.providers ?? [])].sort().join(",");
|
|
199
|
+
const codex = s.contentCodex ?? "";
|
|
200
|
+
return `${name}\u0000${providers}\u0000${s.content}\u0000${codex}`;
|
|
201
|
+
})
|
|
202
|
+
.join("\u0001");
|
|
203
|
+
return createHash("sha256").update(canonical).digest("hex");
|
|
204
|
+
}
|
|
205
|
+
function filterSkills(library, provider) {
|
|
206
|
+
const skills = library.skills ?? {};
|
|
207
|
+
return Object.entries(skills).filter(([, s]) => {
|
|
208
|
+
if (s.autoAttach === false)
|
|
209
|
+
return false;
|
|
210
|
+
// Hub skills are written by the lock-free incremental path
|
|
211
|
+
// (syncHubSkillsToDisk), not this owner-locked full sync.
|
|
212
|
+
if (s.source === "hub")
|
|
213
|
+
return false;
|
|
214
|
+
return (s.providers ?? []).includes(provider);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function sanitizeDirName(name) {
|
|
218
|
+
// Restrict to a safe charset; SKILL.md frontmatter "name" can have hyphens/digits.
|
|
219
|
+
return name.replace(/[^a-zA-Z0-9._-]+/g, "-").slice(0, 80);
|
|
220
|
+
}
|
|
221
|
+
function skillDirName(prefix, name) {
|
|
222
|
+
const hash = createHash("sha256").update(name).digest("hex").slice(0, 8);
|
|
223
|
+
const maxBaseLength = Math.max(1, 80 - prefix.length - hash.length - 1);
|
|
224
|
+
const base = sanitizeDirName(name).slice(0, maxBaseLength) || "skill";
|
|
225
|
+
return `${prefix}${base}-${hash}`;
|
|
226
|
+
}
|
|
227
|
+
async function safeReaddir(dir) {
|
|
228
|
+
try {
|
|
229
|
+
return await fs.readdir(dir, { withFileTypes: true });
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=library-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library-sync.js","sourceRoot":"","sources":["../../../../src/server/library/library-sync.ts"],"names":[],"mappings":"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"}
|