@xopcai/xopc 0.0.82 → 0.0.83
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/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
- package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/plugin.d.ts +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +3 -3
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-1mcKh5Rh.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-uRAuhiUo.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-O2Q_ruV6.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-By09AQD-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-BpQxde0t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-CY27wj_p.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-C-Ed5ZmP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-raLux7E7.js} +1 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
- package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-fa_hiQcX.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
- package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-Y-iqo-gL.js} +94 -85
- package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-BdH2n7ZW.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-Kk1yAGBl.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-DpTxN4AF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
- package/dist/gateway/static/root/index.html +4 -4
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
- package/dist/src/agent/agent-instance-gateway.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +20 -14
- package/dist/src/agent/agent-manager.js +74 -186
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +61 -0
- package/dist/src/agent/background-review/coordinator.js +120 -0
- package/dist/src/agent/background-review/coordinator.js.map +1 -0
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +14 -0
- package/dist/src/agent/child-agent-factory.js +2 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/embedded/index.d.ts +1 -2
- package/dist/src/agent/embedded/index.js +2 -3
- package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/runs.d.ts +32 -0
- package/dist/src/agent/embedded/runs.js +79 -19
- package/dist/src/agent/embedded/runs.js.map +1 -1
- package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
- package/dist/src/agent/embedded/session-manager-cache.js +32 -11
- package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.d.ts +37 -7
- package/dist/src/agent/embedded/session-runner.js +184 -153
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
- package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
- package/dist/src/agent/goals/persistent-goal-service.js +139 -0
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/goals/state.d.ts +1 -1
- package/dist/src/agent/goals/state.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
- package/dist/src/agent/inbound/inbound-loop.js +226 -0
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/manager.d.ts +1 -1
- package/dist/src/agent/lifecycle/manager.js.map +1 -1
- package/dist/src/agent/lifecycle/types.d.ts +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
- package/dist/src/agent/memory/index.js +3 -3
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
- package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
- package/dist/src/agent/messaging/command-handler.d.ts +5 -1
- package/dist/src/agent/messaging/command-handler.js +24 -96
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/messaging/index.d.ts +1 -0
- package/dist/src/agent/messaging/index.js +2 -1
- package/dist/src/agent/messaging/message-router.d.ts +1 -1
- package/dist/src/agent/messaging/message-router.js.map +1 -1
- package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
- package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
- package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
- package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +1 -1
- package/dist/src/agent/service/async-queue.d.ts +20 -0
- package/dist/src/agent/service/async-queue.js +53 -0
- package/dist/src/agent/service/async-queue.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
- package/dist/src/agent/service/direct-turn-helpers.js +90 -0
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
- package/dist/src/agent/service/process-direct-one-shot.js +17 -34
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +122 -168
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +2 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +62 -167
- package/dist/src/agent/service.js +177 -786
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/index.d.ts +4 -0
- package/dist/src/agent/session/index.js +5 -1
- package/dist/src/agent/session/session-config-service.d.ts +68 -0
- package/dist/src/agent/session/session-config-service.js +172 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -0
- package/dist/src/agent/session/session-context.d.ts +27 -19
- package/dist/src/agent/session/session-context.js +39 -24
- package/dist/src/agent/session/session-context.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.d.ts +42 -0
- package/dist/src/agent/session/session-hydrator.js +66 -0
- package/dist/src/agent/session/session-hydrator.js.map +1 -0
- package/dist/src/agent/session/session-inspector.d.ts +80 -0
- package/dist/src/agent/session/session-inspector.js +119 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -0
- package/dist/src/agent/session/session-state-bag.d.ts +83 -0
- package/dist/src/agent/session/session-state-bag.js +192 -0
- package/dist/src/agent/session/session-state-bag.js.map +1 -0
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.d.ts +0 -2
- package/dist/src/agent/skills/index.js +3 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
- package/dist/src/agent/tools/delegate-tool.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/executor.d.ts +34 -15
- package/dist/src/agent/tools/executor.js +44 -79
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +6 -0
- package/dist/src/agent/tools/factory.js +63 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +1 -1
- package/dist/src/agent/tools/tts-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
- package/dist/src/agent/workspace-runtime/registry.js +59 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +4 -3
- package/dist/src/browser/cdp-local-launcher.js.map +1 -1
- package/dist/src/browser/index.d.ts +1 -0
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/manager.js +3 -2
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/browser-use.js +2 -1
- package/dist/src/browser/providers/browser-use.js.map +1 -1
- package/dist/src/browser/providers/browserbase.js +2 -1
- package/dist/src/browser/providers/browserbase.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +7 -6
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
- package/dist/src/browser/providers/playwright-doctor.js +7 -3
- package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
- package/dist/src/browser/readiness.d.ts +33 -0
- package/dist/src/browser/readiness.js +138 -0
- package/dist/src/browser/readiness.js.map +1 -0
- package/dist/src/browser/stealth.js +2 -2
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/channel-domain.d.ts +1 -1
- package/dist/src/channels/config-helpers.d.ts +1 -1
- package/dist/src/channels/config-helpers.js.map +1 -1
- package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
- package/dist/src/channels/heartbeat-scheduler.js +94 -0
- package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
- package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
- package/dist/src/channels/lifecycle-supervisor.js +263 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
- package/dist/src/channels/manager.d.ts +34 -68
- package/dist/src/channels/manager.js +107 -477
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/outbound/deliver.d.ts +1 -1
- package/dist/src/channels/outbound/deliver.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/outbound-sender.d.ts +51 -0
- package/dist/src/channels/outbound-sender.js +125 -0
- package/dist/src/channels/outbound-sender.js.map +1 -0
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
- package/dist/src/channels/pairing/pairing-types.js +1 -0
- package/dist/src/channels/plugin-registry.d.ts +22 -0
- package/dist/src/channels/plugin-registry.js +44 -0
- package/dist/src/channels/plugin-registry.js.map +1 -0
- package/dist/src/channels/plugin-types.d.ts +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/channels/security-helpers.d.ts +1 -1
- package/dist/src/channels/security-helpers.js.map +1 -1
- package/dist/src/channels/setup-wizard.d.ts +1 -1
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -4
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/call.js +1 -1
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/health.js +1 -1
- package/dist/src/cli/commands/gateway/health.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
- package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
- package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
- package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/gateway/probe.js +1 -1
- package/dist/src/cli/commands/gateway/probe.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
- package/dist/src/cli/commands/gateway/restart-health.js +45 -1
- package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart.js +3 -3
- package/dist/src/cli/commands/gateway/restart.js.map +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/gateway/service.js +1 -1
- package/dist/src/cli/commands/gateway/service.js.map +1 -1
- package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
- package/dist/src/cli/commands/gateway/shared.js +54 -0
- package/dist/src/cli/commands/gateway/shared.js.map +1 -0
- package/dist/src/cli/commands/gateway/status.js +1 -1
- package/dist/src/cli/commands/gateway/status.js.map +1 -1
- package/dist/src/cli/commands/gateway/stop.js +2 -2
- package/dist/src/cli/commands/gateway/stop.js.map +1 -1
- package/dist/src/cli/commands/gateway/token.js +1 -1
- package/dist/src/cli/commands/gateway/token.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +5 -5
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/image.js +2 -2
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +4 -4
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
- package/dist/src/cli/commands/onboard/gateway.js +48 -49
- package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +9 -64
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/skills.js +1 -1
- package/dist/src/cli/commands/tailscale.js +1 -1
- package/dist/src/cli/commands/tailscale.js.map +1 -1
- package/dist/src/cli/context.d.ts +20 -0
- package/dist/src/cli/context.js +23 -0
- package/dist/src/cli/context.js.map +1 -0
- package/dist/src/cli/extension-cli-register.js +3 -3
- package/dist/src/cli/gateway-run-argv.js +1 -4
- package/dist/src/cli/gateway-run-argv.js.map +1 -1
- package/dist/src/cli/gateway-run-fast-path.js +1 -1
- package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -7
- package/dist/src/cli/index.js +4 -6
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/commands.flags.d.ts +3 -0
- package/dist/src/config/commands.flags.js +11 -0
- package/dist/src/config/commands.flags.js.map +1 -0
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +6 -5
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +11 -4
- package/dist/src/config/schema.js +13 -12
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +15 -0
- package/dist/src/config/workspace-path-helpers.js +14 -0
- package/dist/src/config/workspace-path-helpers.js.map +1 -0
- package/dist/src/cron/executor.js +4 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/index.d.ts +0 -1
- package/dist/src/daemon/index.js +1 -2
- package/dist/src/daemon/install-plan.js +3 -2
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/types.d.ts +0 -6
- package/dist/src/extensions/api.d.ts +1 -1
- package/dist/src/extensions/api.js +2 -2
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
- package/dist/src/extensions/extension-registry-impl.js +117 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -0
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/index.js +3 -2
- package/dist/src/extensions/loader.d.ts +3 -43
- package/dist/src/extensions/loader.js +3 -110
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/sdk/index.js +2 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/events.d.ts +7 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +2 -2
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +5 -53
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
- package/dist/src/gateway/hono/middleware/auth.js +89 -126
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.js +1 -1
- package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
- package/dist/src/gateway/hono/routes/browser.js +626 -0
- package/dist/src/gateway/hono/routes/browser.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
- package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
- package/dist/src/gateway/hono/routes/config.js +20 -1764
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +2 -3
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -2
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +32 -32
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +4 -4
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +6 -7
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/index.d.ts +1 -1
- package/dist/src/gateway/index.js +4 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
- package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
- package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
- package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
- package/dist/src/gateway/rate-limit/buckets.js +143 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
- package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
- package/dist/src/gateway/rate-limit/env-flags.js +16 -0
- package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
- package/dist/src/gateway/rate-limit/index.d.ts +3 -0
- package/dist/src/gateway/rate-limit/index.js +4 -0
- package/dist/src/gateway/run-loop.d.ts +1 -1
- package/dist/src/gateway/run-loop.js +24 -4
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/runtime-config.js +2 -1
- package/dist/src/gateway/runtime-config.js.map +1 -1
- package/dist/src/gateway/security/audit.js +2 -1
- package/dist/src/gateway/security/audit.js.map +1 -1
- package/dist/src/gateway/security/index.d.ts +0 -1
- package/dist/src/gateway/security/index.js +1 -2
- package/dist/src/gateway/security/loopback.d.ts +13 -0
- package/dist/src/gateway/security/loopback.js +45 -0
- package/dist/src/gateway/security/loopback.js.map +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +108 -0
- package/dist/src/gateway/service/agent-runner.js +184 -0
- package/dist/src/gateway/service/agent-runner.js.map +1 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
- package/dist/src/gateway/service/config-coordinator.js +351 -0
- package/dist/src/gateway/service/config-coordinator.js.map +1 -0
- package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
- package/dist/src/gateway/service/marketplace-service.js +239 -0
- package/dist/src/gateway/service/marketplace-service.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +5 -5
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +125 -0
- package/dist/src/gateway/service/sessions-api.js +135 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -0
- package/dist/src/gateway/service.d.ts +30 -360
- package/dist/src/gateway/service.js +121 -903
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
- package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/gateway-process-argv.d.ts +4 -0
- package/dist/src/infra/gateway-process-argv.js +26 -0
- package/dist/src/infra/gateway-process-argv.js.map +1 -0
- package/dist/src/infra/gateway-processes.d.ts +5 -0
- package/dist/src/infra/gateway-processes.js +65 -0
- package/dist/src/infra/gateway-processes.js.map +1 -0
- package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
- package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
- package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
- package/dist/src/infra/rate-limit/index.d.ts +5 -0
- package/dist/src/infra/rate-limit/index.js +3 -0
- package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
- package/dist/src/infra/rate-limit/keyed-store.js +44 -0
- package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
- package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
- package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
- package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
- package/dist/src/infra/restart.d.ts +21 -0
- package/dist/src/infra/restart.js +122 -0
- package/dist/src/infra/restart.js.map +1 -0
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/mcp/channel-bridge.d.ts +0 -6
- package/dist/src/mcp/channel-bridge.js +1 -5
- package/dist/src/mcp/channel-bridge.js.map +1 -1
- package/dist/src/media-shared/http/ssrf-guard.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
- package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +5 -5
- package/dist/src/share/share-rate-limit.d.ts +10 -2
- package/dist/src/share/share-rate-limit.js +33 -42
- package/dist/src/share/share-rate-limit.js.map +1 -1
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/tui/backends/embedded-backend.js +16 -12
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +2 -2
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +1 -1
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui.js +1 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js +1 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +2 -2
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
- package/dist/src/tunnel/pairing-rate-limit.js +19 -15
- package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
- package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
- package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/factory.js +1 -1
- package/dist/src/voice/tts/index.js +2 -2
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/dist/src/voice/tts/service.js +1 -1
- package/dist/src/voice/tts/service.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
- package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
- package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-key brute-force protection limiter.
|
|
3
|
+
*
|
|
4
|
+
* Semantics:
|
|
5
|
+
* - `fail(key)` records a failed attempt; reaching `maxFailures` within
|
|
6
|
+
* `windowMs` triggers a `blockDurationMs` lockout.
|
|
7
|
+
* - `succeed(key)` clears all state for the key (a successful auth wipes the
|
|
8
|
+
* bucket so legitimate users aren't punished for prior typos).
|
|
9
|
+
* - `check(key)` is read-only — returns the current block status.
|
|
10
|
+
* - Failures from the same key within `burstCoalesceMs` collapse to a single
|
|
11
|
+
* attempt. This absorbs SPA fan-out / SDK auto-retry storms without
|
|
12
|
+
* weakening protection: a deliberate attacker is rate-limited to ~1
|
|
13
|
+
* attempt/s per key, still astronomically slow against any token of
|
|
14
|
+
* meaningful entropy.
|
|
15
|
+
*
|
|
16
|
+
* Pure counter — no policy knowledge (loopback exemption, key formatting,
|
|
17
|
+
* etc. all live in the policy layer that calls into this limiter).
|
|
18
|
+
*/
|
|
19
|
+
import { type Clock } from './keyed-store.js';
|
|
20
|
+
export type FailureLimiterConfig = {
|
|
21
|
+
maxFailures: number;
|
|
22
|
+
windowMs: number;
|
|
23
|
+
blockDurationMs: number;
|
|
24
|
+
/** @default 1000 */
|
|
25
|
+
burstCoalesceMs?: number;
|
|
26
|
+
/** Retain idle keys for this long. @default `windowMs + blockDurationMs` */
|
|
27
|
+
staleAfterMs?: number;
|
|
28
|
+
clock?: Clock;
|
|
29
|
+
};
|
|
30
|
+
export type FailureCheck = {
|
|
31
|
+
blocked: false;
|
|
32
|
+
} | {
|
|
33
|
+
blocked: true;
|
|
34
|
+
retryAfterSec: number;
|
|
35
|
+
};
|
|
36
|
+
export declare class FailureLimiter {
|
|
37
|
+
private readonly store;
|
|
38
|
+
private readonly clock;
|
|
39
|
+
private readonly maxFailures;
|
|
40
|
+
private readonly windowMs;
|
|
41
|
+
private readonly blockDurationMs;
|
|
42
|
+
private readonly burstCoalesceMs;
|
|
43
|
+
constructor(cfg: FailureLimiterConfig);
|
|
44
|
+
check(key: string): FailureCheck;
|
|
45
|
+
fail(key: string): void;
|
|
46
|
+
succeed(key: string): void;
|
|
47
|
+
/** @internal Test hook. */
|
|
48
|
+
resetForTests(): void;
|
|
49
|
+
destroy(): void;
|
|
50
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { KeyedStore } from "./keyed-store.js";
|
|
2
|
+
//#region src/infra/rate-limit/failure-limiter.ts
|
|
3
|
+
/**
|
|
4
|
+
* Per-key brute-force protection limiter.
|
|
5
|
+
*
|
|
6
|
+
* Semantics:
|
|
7
|
+
* - `fail(key)` records a failed attempt; reaching `maxFailures` within
|
|
8
|
+
* `windowMs` triggers a `blockDurationMs` lockout.
|
|
9
|
+
* - `succeed(key)` clears all state for the key (a successful auth wipes the
|
|
10
|
+
* bucket so legitimate users aren't punished for prior typos).
|
|
11
|
+
* - `check(key)` is read-only — returns the current block status.
|
|
12
|
+
* - Failures from the same key within `burstCoalesceMs` collapse to a single
|
|
13
|
+
* attempt. This absorbs SPA fan-out / SDK auto-retry storms without
|
|
14
|
+
* weakening protection: a deliberate attacker is rate-limited to ~1
|
|
15
|
+
* attempt/s per key, still astronomically slow against any token of
|
|
16
|
+
* meaningful entropy.
|
|
17
|
+
*
|
|
18
|
+
* Pure counter — no policy knowledge (loopback exemption, key formatting,
|
|
19
|
+
* etc. all live in the policy layer that calls into this limiter).
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_BURST_COALESCE_MS = 1e3;
|
|
22
|
+
var FailureLimiter = class {
|
|
23
|
+
store;
|
|
24
|
+
clock;
|
|
25
|
+
maxFailures;
|
|
26
|
+
windowMs;
|
|
27
|
+
blockDurationMs;
|
|
28
|
+
burstCoalesceMs;
|
|
29
|
+
constructor(cfg) {
|
|
30
|
+
this.maxFailures = Math.max(1, Math.floor(cfg.maxFailures));
|
|
31
|
+
this.windowMs = Math.max(1e3, Math.floor(cfg.windowMs));
|
|
32
|
+
this.blockDurationMs = Math.max(1e3, Math.floor(cfg.blockDurationMs));
|
|
33
|
+
this.burstCoalesceMs = Math.max(0, Math.floor(cfg.burstCoalesceMs ?? DEFAULT_BURST_COALESCE_MS));
|
|
34
|
+
this.clock = cfg.clock ?? Date.now;
|
|
35
|
+
this.store = new KeyedStore({
|
|
36
|
+
staleAfterMs: cfg.staleAfterMs ?? this.windowMs + this.blockDurationMs,
|
|
37
|
+
clock: this.clock
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
check(key) {
|
|
41
|
+
const now = this.clock();
|
|
42
|
+
const state = this.store.get(key);
|
|
43
|
+
if (!state?.blockedUntil) return { blocked: false };
|
|
44
|
+
if (now >= state.blockedUntil) {
|
|
45
|
+
state.blockedUntil = void 0;
|
|
46
|
+
state.count = 0;
|
|
47
|
+
state.windowStart = now;
|
|
48
|
+
state.lastTouchedMs = now;
|
|
49
|
+
return { blocked: false };
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
blocked: true,
|
|
53
|
+
retryAfterSec: Math.max(1, Math.ceil((state.blockedUntil - now) / 1e3))
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
fail(key) {
|
|
57
|
+
const now = this.clock();
|
|
58
|
+
let state = this.store.get(key);
|
|
59
|
+
if (!state) {
|
|
60
|
+
state = {
|
|
61
|
+
windowStart: now,
|
|
62
|
+
count: 0,
|
|
63
|
+
lastTouchedMs: now
|
|
64
|
+
};
|
|
65
|
+
this.store.set(key, state);
|
|
66
|
+
}
|
|
67
|
+
state.lastTouchedMs = now;
|
|
68
|
+
if (state.blockedUntil && now < state.blockedUntil) return;
|
|
69
|
+
if (state.blockedUntil && now >= state.blockedUntil) {
|
|
70
|
+
state.blockedUntil = void 0;
|
|
71
|
+
state.count = 0;
|
|
72
|
+
state.windowStart = now;
|
|
73
|
+
}
|
|
74
|
+
if (now - state.windowStart > this.windowMs) {
|
|
75
|
+
state.count = 0;
|
|
76
|
+
state.windowStart = now;
|
|
77
|
+
}
|
|
78
|
+
if (state.lastFailureAtMs !== void 0 && now - state.lastFailureAtMs < this.burstCoalesceMs) {
|
|
79
|
+
state.lastFailureAtMs = now;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
state.lastFailureAtMs = now;
|
|
83
|
+
state.count += 1;
|
|
84
|
+
if (state.count >= this.maxFailures) state.blockedUntil = now + this.blockDurationMs;
|
|
85
|
+
}
|
|
86
|
+
succeed(key) {
|
|
87
|
+
this.store.delete(key);
|
|
88
|
+
}
|
|
89
|
+
/** @internal Test hook. */
|
|
90
|
+
resetForTests() {
|
|
91
|
+
this.store.clear();
|
|
92
|
+
}
|
|
93
|
+
destroy() {
|
|
94
|
+
this.store.destroy();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
//#endregion
|
|
98
|
+
export { FailureLimiter };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=failure-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-limiter.js","names":[],"sources":["../../../../src/infra/rate-limit/failure-limiter.ts"],"sourcesContent":["/**\n * Per-key brute-force protection limiter.\n *\n * Semantics:\n * - `fail(key)` records a failed attempt; reaching `maxFailures` within\n * `windowMs` triggers a `blockDurationMs` lockout.\n * - `succeed(key)` clears all state for the key (a successful auth wipes the\n * bucket so legitimate users aren't punished for prior typos).\n * - `check(key)` is read-only — returns the current block status.\n * - Failures from the same key within `burstCoalesceMs` collapse to a single\n * attempt. This absorbs SPA fan-out / SDK auto-retry storms without\n * weakening protection: a deliberate attacker is rate-limited to ~1\n * attempt/s per key, still astronomically slow against any token of\n * meaningful entropy.\n *\n * Pure counter — no policy knowledge (loopback exemption, key formatting,\n * etc. all live in the policy layer that calls into this limiter).\n */\n\nimport { KeyedStore, type Clock } from './keyed-store.js';\n\nexport type FailureLimiterConfig = {\n maxFailures: number;\n windowMs: number;\n blockDurationMs: number;\n /** @default 1000 */\n burstCoalesceMs?: number;\n /** Retain idle keys for this long. @default `windowMs + blockDurationMs` */\n staleAfterMs?: number;\n clock?: Clock;\n};\n\nexport type FailureCheck =\n | { blocked: false }\n | { blocked: true; retryAfterSec: number };\n\ntype State = {\n windowStart: number;\n count: number;\n blockedUntil?: number;\n lastFailureAtMs?: number;\n lastTouchedMs: number;\n};\n\nconst DEFAULT_BURST_COALESCE_MS = 1000;\n\nexport class FailureLimiter {\n private readonly store: KeyedStore<State>;\n private readonly clock: Clock;\n private readonly maxFailures: number;\n private readonly windowMs: number;\n private readonly blockDurationMs: number;\n private readonly burstCoalesceMs: number;\n\n constructor(cfg: FailureLimiterConfig) {\n this.maxFailures = Math.max(1, Math.floor(cfg.maxFailures));\n this.windowMs = Math.max(1000, Math.floor(cfg.windowMs));\n this.blockDurationMs = Math.max(1000, Math.floor(cfg.blockDurationMs));\n this.burstCoalesceMs = Math.max(0, Math.floor(cfg.burstCoalesceMs ?? DEFAULT_BURST_COALESCE_MS));\n this.clock = cfg.clock ?? Date.now;\n this.store = new KeyedStore<State>({\n staleAfterMs: cfg.staleAfterMs ?? this.windowMs + this.blockDurationMs,\n clock: this.clock,\n });\n }\n\n check(key: string): FailureCheck {\n const now = this.clock();\n const state = this.store.get(key);\n if (!state?.blockedUntil) return { blocked: false };\n if (now >= state.blockedUntil) {\n state.blockedUntil = undefined;\n state.count = 0;\n state.windowStart = now;\n state.lastTouchedMs = now;\n return { blocked: false };\n }\n return {\n blocked: true,\n retryAfterSec: Math.max(1, Math.ceil((state.blockedUntil - now) / 1000)),\n };\n }\n\n fail(key: string): void {\n const now = this.clock();\n let state = this.store.get(key);\n if (!state) {\n state = { windowStart: now, count: 0, lastTouchedMs: now };\n this.store.set(key, state);\n }\n\n state.lastTouchedMs = now;\n\n if (state.blockedUntil && now < state.blockedUntil) return;\n if (state.blockedUntil && now >= state.blockedUntil) {\n state.blockedUntil = undefined;\n state.count = 0;\n state.windowStart = now;\n }\n\n if (now - state.windowStart > this.windowMs) {\n state.count = 0;\n state.windowStart = now;\n }\n\n if (\n state.lastFailureAtMs !== undefined &&\n now - state.lastFailureAtMs < this.burstCoalesceMs\n ) {\n state.lastFailureAtMs = now;\n return;\n }\n\n state.lastFailureAtMs = now;\n state.count += 1;\n if (state.count >= this.maxFailures) {\n state.blockedUntil = now + this.blockDurationMs;\n }\n }\n\n succeed(key: string): void {\n this.store.delete(key);\n }\n\n /** @internal Test hook. */\n resetForTests(): void {\n this.store.clear();\n }\n\n destroy(): void {\n this.store.destroy();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,4BAA4B;AAElC,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,KAA2B;AACrC,OAAK,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,YAAY,CAAC;AAC3D,OAAK,WAAW,KAAK,IAAI,KAAM,KAAK,MAAM,IAAI,SAAS,CAAC;AACxD,OAAK,kBAAkB,KAAK,IAAI,KAAM,KAAK,MAAM,IAAI,gBAAgB,CAAC;AACtE,OAAK,kBAAkB,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,mBAAmB,0BAA0B,CAAC;AAChG,OAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,OAAK,QAAQ,IAAI,WAAkB;GACjC,cAAc,IAAI,gBAAgB,KAAK,WAAW,KAAK;GACvD,OAAO,KAAK;GACb,CAAC;;CAGJ,MAAM,KAA2B;EAC/B,MAAM,MAAM,KAAK,OAAO;EACxB,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,MAAI,CAAC,OAAO,aAAc,QAAO,EAAE,SAAS,OAAO;AACnD,MAAI,OAAO,MAAM,cAAc;AAC7B,SAAM,eAAe,KAAA;AACrB,SAAM,QAAQ;AACd,SAAM,cAAc;AACpB,SAAM,gBAAgB;AACtB,UAAO,EAAE,SAAS,OAAO;;AAE3B,SAAO;GACL,SAAS;GACT,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,OAAO,IAAK,CAAC;GACzE;;CAGH,KAAK,KAAmB;EACtB,MAAM,MAAM,KAAK,OAAO;EACxB,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI;AAC/B,MAAI,CAAC,OAAO;AACV,WAAQ;IAAE,aAAa;IAAK,OAAO;IAAG,eAAe;IAAK;AAC1D,QAAK,MAAM,IAAI,KAAK,MAAM;;AAG5B,QAAM,gBAAgB;AAEtB,MAAI,MAAM,gBAAgB,MAAM,MAAM,aAAc;AACpD,MAAI,MAAM,gBAAgB,OAAO,MAAM,cAAc;AACnD,SAAM,eAAe,KAAA;AACrB,SAAM,QAAQ;AACd,SAAM,cAAc;;AAGtB,MAAI,MAAM,MAAM,cAAc,KAAK,UAAU;AAC3C,SAAM,QAAQ;AACd,SAAM,cAAc;;AAGtB,MACE,MAAM,oBAAoB,KAAA,KAC1B,MAAM,MAAM,kBAAkB,KAAK,iBACnC;AACA,SAAM,kBAAkB;AACxB;;AAGF,QAAM,kBAAkB;AACxB,QAAM,SAAS;AACf,MAAI,MAAM,SAAS,KAAK,YACtB,OAAM,eAAe,MAAM,KAAK;;CAIpC,QAAQ,KAAmB;AACzB,OAAK,MAAM,OAAO,IAAI;;;CAIxB,gBAAsB;AACpB,OAAK,MAAM,OAAO;;CAGpB,UAAgB;AACd,OAAK,MAAM,SAAS"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { RateLimiter } from './rate-limiter.js';
|
|
2
|
+
export type { RateLimiterConfig, RateLimitDecision } from './rate-limiter.js';
|
|
3
|
+
export { FailureLimiter } from './failure-limiter.js';
|
|
4
|
+
export type { FailureLimiterConfig, FailureCheck } from './failure-limiter.js';
|
|
5
|
+
export type { Clock } from './keyed-store.js';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyed in-memory store with periodic stale-entry sweep. Internal helper for
|
|
3
|
+
* the rate-limit primitives — keep it package-private (re-export only via
|
|
4
|
+
* `infra/rate-limit/index.ts` if a real consumer appears).
|
|
5
|
+
*
|
|
6
|
+
* Lifecycle: `new` → use → `destroy()`. Buckets created from this store are
|
|
7
|
+
* registered in the gateway's bucket registry, which calls `destroy()` on
|
|
8
|
+
* graceful shutdown so the cleanup timer doesn't leak.
|
|
9
|
+
*/
|
|
10
|
+
export type Clock = () => number;
|
|
11
|
+
export type KeyedStoreOptions = {
|
|
12
|
+
/** Drop entries whose `lastTouchedMs` is older than this. */
|
|
13
|
+
staleAfterMs: number;
|
|
14
|
+
/** How often the sweep runs. Defaults to `staleAfterMs / 4` (capped at 10min). */
|
|
15
|
+
cleanupIntervalMs?: number;
|
|
16
|
+
/** Injected clock for deterministic tests. */
|
|
17
|
+
clock?: Clock;
|
|
18
|
+
};
|
|
19
|
+
export declare class KeyedStore<V extends {
|
|
20
|
+
lastTouchedMs: number;
|
|
21
|
+
}> {
|
|
22
|
+
private readonly map;
|
|
23
|
+
private readonly clock;
|
|
24
|
+
private readonly staleAfterMs;
|
|
25
|
+
private cleanupTimer?;
|
|
26
|
+
constructor(opts: KeyedStoreOptions);
|
|
27
|
+
get(key: string): V | undefined;
|
|
28
|
+
set(key: string, value: V): void;
|
|
29
|
+
delete(key: string): void;
|
|
30
|
+
size(): number;
|
|
31
|
+
clear(): void;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
private sweep;
|
|
34
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/infra/rate-limit/keyed-store.ts
|
|
2
|
+
var KeyedStore = class {
|
|
3
|
+
map = /* @__PURE__ */ new Map();
|
|
4
|
+
clock;
|
|
5
|
+
staleAfterMs;
|
|
6
|
+
cleanupTimer;
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
this.clock = opts.clock ?? Date.now;
|
|
9
|
+
this.staleAfterMs = Math.max(1e3, opts.staleAfterMs);
|
|
10
|
+
const interval = Math.min(600 * 1e3, Math.max(1e3, opts.cleanupIntervalMs ?? Math.floor(this.staleAfterMs / 4)));
|
|
11
|
+
this.cleanupTimer = setInterval(() => this.sweep(), interval);
|
|
12
|
+
this.cleanupTimer.unref?.();
|
|
13
|
+
}
|
|
14
|
+
get(key) {
|
|
15
|
+
return this.map.get(key);
|
|
16
|
+
}
|
|
17
|
+
set(key, value) {
|
|
18
|
+
this.map.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
delete(key) {
|
|
21
|
+
this.map.delete(key);
|
|
22
|
+
}
|
|
23
|
+
size() {
|
|
24
|
+
return this.map.size;
|
|
25
|
+
}
|
|
26
|
+
clear() {
|
|
27
|
+
this.map.clear();
|
|
28
|
+
}
|
|
29
|
+
destroy() {
|
|
30
|
+
if (this.cleanupTimer) {
|
|
31
|
+
clearInterval(this.cleanupTimer);
|
|
32
|
+
this.cleanupTimer = void 0;
|
|
33
|
+
}
|
|
34
|
+
this.map.clear();
|
|
35
|
+
}
|
|
36
|
+
sweep() {
|
|
37
|
+
const now = this.clock();
|
|
38
|
+
for (const [k, v] of this.map.entries()) if (now - v.lastTouchedMs > this.staleAfterMs) this.map.delete(k);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { KeyedStore };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=keyed-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyed-store.js","names":[],"sources":["../../../../src/infra/rate-limit/keyed-store.ts"],"sourcesContent":["/**\n * Keyed in-memory store with periodic stale-entry sweep. Internal helper for\n * the rate-limit primitives — keep it package-private (re-export only via\n * `infra/rate-limit/index.ts` if a real consumer appears).\n *\n * Lifecycle: `new` → use → `destroy()`. Buckets created from this store are\n * registered in the gateway's bucket registry, which calls `destroy()` on\n * graceful shutdown so the cleanup timer doesn't leak.\n */\n\nexport type Clock = () => number;\n\nexport type KeyedStoreOptions = {\n /** Drop entries whose `lastTouchedMs` is older than this. */\n staleAfterMs: number;\n /** How often the sweep runs. Defaults to `staleAfterMs / 4` (capped at 10min). */\n cleanupIntervalMs?: number;\n /** Injected clock for deterministic tests. */\n clock?: Clock;\n};\n\nexport class KeyedStore<V extends { lastTouchedMs: number }> {\n private readonly map = new Map<string, V>();\n private readonly clock: Clock;\n private readonly staleAfterMs: number;\n private cleanupTimer?: NodeJS.Timeout;\n\n constructor(opts: KeyedStoreOptions) {\n this.clock = opts.clock ?? Date.now;\n this.staleAfterMs = Math.max(1000, opts.staleAfterMs);\n const interval = Math.min(\n 10 * 60 * 1000,\n Math.max(1000, opts.cleanupIntervalMs ?? Math.floor(this.staleAfterMs / 4)),\n );\n this.cleanupTimer = setInterval(() => this.sweep(), interval);\n this.cleanupTimer.unref?.();\n }\n\n get(key: string): V | undefined {\n return this.map.get(key);\n }\n\n set(key: string, value: V): void {\n this.map.set(key, value);\n }\n\n delete(key: string): void {\n this.map.delete(key);\n }\n\n size(): number {\n return this.map.size;\n }\n\n clear(): void {\n this.map.clear();\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n this.map.clear();\n }\n\n private sweep(): void {\n const now = this.clock();\n for (const [k, v] of this.map.entries()) {\n if (now - v.lastTouchedMs > this.staleAfterMs) {\n this.map.delete(k);\n }\n }\n }\n}\n"],"mappings":";AAqBA,IAAa,aAAb,MAA6D;CAC3D,sBAAuB,IAAI,KAAgB;CAC3C;CACA;CACA;CAEA,YAAY,MAAyB;AACnC,OAAK,QAAQ,KAAK,SAAS,KAAK;AAChC,OAAK,eAAe,KAAK,IAAI,KAAM,KAAK,aAAa;EACrD,MAAM,WAAW,KAAK,IACpB,MAAU,KACV,KAAK,IAAI,KAAM,KAAK,qBAAqB,KAAK,MAAM,KAAK,eAAe,EAAE,CAAC,CAC5E;AACD,OAAK,eAAe,kBAAkB,KAAK,OAAO,EAAE,SAAS;AAC7D,OAAK,aAAa,SAAS;;CAG7B,IAAI,KAA4B;AAC9B,SAAO,KAAK,IAAI,IAAI,IAAI;;CAG1B,IAAI,KAAa,OAAgB;AAC/B,OAAK,IAAI,IAAI,KAAK,MAAM;;CAG1B,OAAO,KAAmB;AACxB,OAAK,IAAI,OAAO,IAAI;;CAGtB,OAAe;AACb,SAAO,KAAK,IAAI;;CAGlB,QAAc;AACZ,OAAK,IAAI,OAAO;;CAGlB,UAAgB;AACd,MAAI,KAAK,cAAc;AACrB,iBAAc,KAAK,aAAa;AAChC,QAAK,eAAe,KAAA;;AAEtB,OAAK,IAAI,OAAO;;CAGlB,QAAsB;EACpB,MAAM,MAAM,KAAK,OAAO;AACxB,OAAK,MAAM,CAAC,GAAG,MAAM,KAAK,IAAI,SAAS,CACrC,KAAI,MAAM,EAAE,gBAAgB,KAAK,aAC/B,MAAK,IAAI,OAAO,EAAE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-key fixed-window request-rate limiter. Every `consume()` counts toward
|
|
3
|
+
* the limit; once the window's count hits `maxRequests`, subsequent consumes
|
|
4
|
+
* return `allowed: false` until the window rolls over.
|
|
5
|
+
*
|
|
6
|
+
* Use this for *throughput* limiting (e.g. "15 req/min on /admin"). For
|
|
7
|
+
* *failure-rate* limiting with lockout (e.g. brute-force protection), use
|
|
8
|
+
* {@link FailureLimiter} instead.
|
|
9
|
+
*/
|
|
10
|
+
import { type Clock } from './keyed-store.js';
|
|
11
|
+
export type RateLimiterConfig = {
|
|
12
|
+
maxRequests: number;
|
|
13
|
+
windowMs: number;
|
|
14
|
+
/** How long to retain idle keys before sweep. Defaults to 4× windowMs. */
|
|
15
|
+
staleAfterMs?: number;
|
|
16
|
+
clock?: Clock;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Flat rather than tagged-union: project's tsconfig has `strict: false`, which
|
|
20
|
+
* disables boolean discriminator narrowing through `if (!x.allowed)`. Both
|
|
21
|
+
* fields are always populated — `retryAfterMs` is 0 on success, `remaining`
|
|
22
|
+
* is 0 on block.
|
|
23
|
+
*/
|
|
24
|
+
export type RateLimitDecision = {
|
|
25
|
+
allowed: boolean;
|
|
26
|
+
remaining: number;
|
|
27
|
+
retryAfterMs: number;
|
|
28
|
+
};
|
|
29
|
+
export declare class RateLimiter {
|
|
30
|
+
private readonly store;
|
|
31
|
+
private readonly clock;
|
|
32
|
+
private readonly maxRequests;
|
|
33
|
+
private readonly windowMs;
|
|
34
|
+
constructor(cfg: RateLimiterConfig);
|
|
35
|
+
consume(key: string): RateLimitDecision;
|
|
36
|
+
/** @internal Test hook. */
|
|
37
|
+
resetForTests(): void;
|
|
38
|
+
destroy(): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { KeyedStore } from "./keyed-store.js";
|
|
2
|
+
//#region src/infra/rate-limit/rate-limiter.ts
|
|
3
|
+
/**
|
|
4
|
+
* Per-key fixed-window request-rate limiter. Every `consume()` counts toward
|
|
5
|
+
* the limit; once the window's count hits `maxRequests`, subsequent consumes
|
|
6
|
+
* return `allowed: false` until the window rolls over.
|
|
7
|
+
*
|
|
8
|
+
* Use this for *throughput* limiting (e.g. "15 req/min on /admin"). For
|
|
9
|
+
* *failure-rate* limiting with lockout (e.g. brute-force protection), use
|
|
10
|
+
* {@link FailureLimiter} instead.
|
|
11
|
+
*/
|
|
12
|
+
var RateLimiter = class {
|
|
13
|
+
store;
|
|
14
|
+
clock;
|
|
15
|
+
maxRequests;
|
|
16
|
+
windowMs;
|
|
17
|
+
constructor(cfg) {
|
|
18
|
+
this.maxRequests = Math.max(1, Math.floor(cfg.maxRequests));
|
|
19
|
+
this.windowMs = Math.max(1, Math.floor(cfg.windowMs));
|
|
20
|
+
this.clock = cfg.clock ?? Date.now;
|
|
21
|
+
this.store = new KeyedStore({
|
|
22
|
+
staleAfterMs: cfg.staleAfterMs ?? this.windowMs * 4,
|
|
23
|
+
clock: this.clock
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
consume(key) {
|
|
27
|
+
const now = this.clock();
|
|
28
|
+
let state = this.store.get(key);
|
|
29
|
+
if (!state) {
|
|
30
|
+
state = {
|
|
31
|
+
windowStart: now,
|
|
32
|
+
count: 0,
|
|
33
|
+
lastTouchedMs: now
|
|
34
|
+
};
|
|
35
|
+
this.store.set(key, state);
|
|
36
|
+
}
|
|
37
|
+
if (now - state.windowStart >= this.windowMs) {
|
|
38
|
+
state.windowStart = now;
|
|
39
|
+
state.count = 0;
|
|
40
|
+
}
|
|
41
|
+
state.lastTouchedMs = now;
|
|
42
|
+
if (state.count >= this.maxRequests) return {
|
|
43
|
+
allowed: false,
|
|
44
|
+
remaining: 0,
|
|
45
|
+
retryAfterMs: Math.max(0, state.windowStart + this.windowMs - now)
|
|
46
|
+
};
|
|
47
|
+
state.count += 1;
|
|
48
|
+
return {
|
|
49
|
+
allowed: true,
|
|
50
|
+
remaining: this.maxRequests - state.count,
|
|
51
|
+
retryAfterMs: 0
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** @internal Test hook. */
|
|
55
|
+
resetForTests() {
|
|
56
|
+
this.store.clear();
|
|
57
|
+
}
|
|
58
|
+
destroy() {
|
|
59
|
+
this.store.destroy();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { RateLimiter };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","names":[],"sources":["../../../../src/infra/rate-limit/rate-limiter.ts"],"sourcesContent":["/**\n * Per-key fixed-window request-rate limiter. Every `consume()` counts toward\n * the limit; once the window's count hits `maxRequests`, subsequent consumes\n * return `allowed: false` until the window rolls over.\n *\n * Use this for *throughput* limiting (e.g. \"15 req/min on /admin\"). For\n * *failure-rate* limiting with lockout (e.g. brute-force protection), use\n * {@link FailureLimiter} instead.\n */\n\nimport { KeyedStore, type Clock } from './keyed-store.js';\n\nexport type RateLimiterConfig = {\n maxRequests: number;\n windowMs: number;\n /** How long to retain idle keys before sweep. Defaults to 4× windowMs. */\n staleAfterMs?: number;\n clock?: Clock;\n};\n\n/**\n * Flat rather than tagged-union: project's tsconfig has `strict: false`, which\n * disables boolean discriminator narrowing through `if (!x.allowed)`. Both\n * fields are always populated — `retryAfterMs` is 0 on success, `remaining`\n * is 0 on block.\n */\nexport type RateLimitDecision = {\n allowed: boolean;\n remaining: number;\n retryAfterMs: number;\n};\n\ntype State = {\n windowStart: number;\n count: number;\n lastTouchedMs: number;\n};\n\nexport class RateLimiter {\n private readonly store: KeyedStore<State>;\n private readonly clock: Clock;\n private readonly maxRequests: number;\n private readonly windowMs: number;\n\n constructor(cfg: RateLimiterConfig) {\n this.maxRequests = Math.max(1, Math.floor(cfg.maxRequests));\n this.windowMs = Math.max(1, Math.floor(cfg.windowMs));\n this.clock = cfg.clock ?? Date.now;\n this.store = new KeyedStore<State>({\n staleAfterMs: cfg.staleAfterMs ?? this.windowMs * 4,\n clock: this.clock,\n });\n }\n\n consume(key: string): RateLimitDecision {\n const now = this.clock();\n let state = this.store.get(key);\n if (!state) {\n state = { windowStart: now, count: 0, lastTouchedMs: now };\n this.store.set(key, state);\n }\n\n if (now - state.windowStart >= this.windowMs) {\n state.windowStart = now;\n state.count = 0;\n }\n\n state.lastTouchedMs = now;\n\n if (state.count >= this.maxRequests) {\n return {\n allowed: false,\n remaining: 0,\n retryAfterMs: Math.max(0, state.windowStart + this.windowMs - now),\n };\n }\n\n state.count += 1;\n return { allowed: true, remaining: this.maxRequests - state.count, retryAfterMs: 0 };\n }\n\n /** @internal Test hook. */\n resetForTests(): void {\n this.store.clear();\n }\n\n destroy(): void {\n this.store.destroy();\n }\n}\n"],"mappings":";;;;;;;;;;;AAsCA,IAAa,cAAb,MAAyB;CACvB;CACA;CACA;CACA;CAEA,YAAY,KAAwB;AAClC,OAAK,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,YAAY,CAAC;AAC3D,OAAK,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,SAAS,CAAC;AACrD,OAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,OAAK,QAAQ,IAAI,WAAkB;GACjC,cAAc,IAAI,gBAAgB,KAAK,WAAW;GAClD,OAAO,KAAK;GACb,CAAC;;CAGJ,QAAQ,KAAgC;EACtC,MAAM,MAAM,KAAK,OAAO;EACxB,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI;AAC/B,MAAI,CAAC,OAAO;AACV,WAAQ;IAAE,aAAa;IAAK,OAAO;IAAG,eAAe;IAAK;AAC1D,QAAK,MAAM,IAAI,KAAK,MAAM;;AAG5B,MAAI,MAAM,MAAM,eAAe,KAAK,UAAU;AAC5C,SAAM,cAAc;AACpB,SAAM,QAAQ;;AAGhB,QAAM,gBAAgB;AAEtB,MAAI,MAAM,SAAS,KAAK,YACtB,QAAO;GACL,SAAS;GACT,WAAW;GACX,cAAc,KAAK,IAAI,GAAG,MAAM,cAAc,KAAK,WAAW,IAAI;GACnE;AAGH,QAAM,SAAS;AACf,SAAO;GAAE,SAAS;GAAM,WAAW,KAAK,cAAc,MAAM;GAAO,cAAc;GAAG;;;CAItF,gBAAsB;AACpB,OAAK,MAAM,OAAO;;CAGpB,UAAgB;AACd,OAAK,MAAM,SAAS"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.
|
|
3
|
+
*/
|
|
4
|
+
export declare function writeGatewayRestartIntentSync(opts?: {
|
|
5
|
+
env?: NodeJS.ProcessEnv;
|
|
6
|
+
targetPid?: number;
|
|
7
|
+
}): boolean;
|
|
8
|
+
export declare function clearGatewayRestartIntentSync(env?: NodeJS.ProcessEnv): void;
|
|
9
|
+
export declare function consumeGatewayRestartIntentSync(env?: NodeJS.ProcessEnv, now?: number): boolean;
|
|
10
|
+
export declare function setGatewaySigusr1RestartPolicy(opts?: {
|
|
11
|
+
allowExternal?: boolean;
|
|
12
|
+
}): void;
|
|
13
|
+
export declare function isGatewaySigusr1RestartExternallyAllowed(): boolean;
|
|
14
|
+
export declare function authorizeGatewaySigusr1Restart(delayMs?: number): void;
|
|
15
|
+
export declare function consumeGatewaySigusr1RestartAuthorization(): boolean;
|
|
16
|
+
export declare function resetGatewayRestartStateForInProcessRestart(): void;
|
|
17
|
+
export declare function scheduleGatewaySigusr1Restart(params: {
|
|
18
|
+
delayMs?: number;
|
|
19
|
+
reason?: string;
|
|
20
|
+
onRestart: () => void;
|
|
21
|
+
}): void;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
4
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
//#region src/infra/restart.ts
|
|
7
|
+
/**
|
|
8
|
+
* Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.
|
|
9
|
+
*/
|
|
10
|
+
init_paths_state();
|
|
11
|
+
init_logger();
|
|
12
|
+
const log = createLogger("Restart");
|
|
13
|
+
const SIGUSR1_AUTH_GRACE_MS = 5e3;
|
|
14
|
+
const GATEWAY_RESTART_INTENT_FILENAME = "gateway-restart-intent.json";
|
|
15
|
+
const GATEWAY_RESTART_INTENT_TTL_MS = 6e4;
|
|
16
|
+
let sigusr1AuthorizedCount = 0;
|
|
17
|
+
let sigusr1AuthorizedUntil = 0;
|
|
18
|
+
let sigusr1ExternalAllowed = false;
|
|
19
|
+
let pendingRestartTimer = null;
|
|
20
|
+
let pendingRestartCallback = null;
|
|
21
|
+
function resolveGatewayRestartIntentPath(env = process.env) {
|
|
22
|
+
const stateDir = env.XOPC_STATE_DIR?.trim() || resolveStateDir();
|
|
23
|
+
return path.join(stateDir, GATEWAY_RESTART_INTENT_FILENAME);
|
|
24
|
+
}
|
|
25
|
+
function normalizeRestartIntentPid(pid) {
|
|
26
|
+
return typeof pid === "number" && Number.isSafeInteger(pid) && pid > 0 ? pid : null;
|
|
27
|
+
}
|
|
28
|
+
function writeGatewayRestartIntentSync(opts = {}) {
|
|
29
|
+
const targetPid = normalizeRestartIntentPid(opts.targetPid);
|
|
30
|
+
if (targetPid === null) return false;
|
|
31
|
+
const intentPath = resolveGatewayRestartIntentPath(opts.env ?? process.env);
|
|
32
|
+
const payload = {
|
|
33
|
+
kind: "gateway-restart",
|
|
34
|
+
pid: targetPid,
|
|
35
|
+
createdAt: Date.now()
|
|
36
|
+
};
|
|
37
|
+
try {
|
|
38
|
+
mkdirSync(path.dirname(intentPath), { recursive: true });
|
|
39
|
+
writeFileSync(intentPath, `${JSON.stringify(payload)}\n`, "utf8");
|
|
40
|
+
return true;
|
|
41
|
+
} catch (err) {
|
|
42
|
+
log.warn({ err }, "Failed to write gateway restart intent");
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function clearGatewayRestartIntentSync(env = process.env) {
|
|
47
|
+
try {
|
|
48
|
+
rmSync(resolveGatewayRestartIntentPath(env));
|
|
49
|
+
} catch {}
|
|
50
|
+
}
|
|
51
|
+
function parseGatewayRestartIntent(raw) {
|
|
52
|
+
try {
|
|
53
|
+
const parsed = JSON.parse(raw);
|
|
54
|
+
if (parsed.kind === "gateway-restart" && typeof parsed.pid === "number" && Number.isFinite(parsed.pid) && typeof parsed.createdAt === "number" && Number.isFinite(parsed.createdAt)) return parsed;
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function consumeGatewayRestartIntentSync(env = process.env, now = Date.now()) {
|
|
61
|
+
const intentPath = resolveGatewayRestartIntentPath(env);
|
|
62
|
+
let raw;
|
|
63
|
+
try {
|
|
64
|
+
raw = readFileSync(intentPath, "utf8");
|
|
65
|
+
} catch {
|
|
66
|
+
return false;
|
|
67
|
+
} finally {
|
|
68
|
+
clearGatewayRestartIntentSync(env);
|
|
69
|
+
}
|
|
70
|
+
const payload = parseGatewayRestartIntent(raw);
|
|
71
|
+
if (!payload) return false;
|
|
72
|
+
if (payload.pid !== process.pid) return false;
|
|
73
|
+
const ageMs = now - payload.createdAt;
|
|
74
|
+
return ageMs >= 0 && ageMs <= GATEWAY_RESTART_INTENT_TTL_MS;
|
|
75
|
+
}
|
|
76
|
+
function setGatewaySigusr1RestartPolicy(opts) {
|
|
77
|
+
sigusr1ExternalAllowed = opts?.allowExternal === true;
|
|
78
|
+
}
|
|
79
|
+
function isGatewaySigusr1RestartExternallyAllowed() {
|
|
80
|
+
return sigusr1ExternalAllowed;
|
|
81
|
+
}
|
|
82
|
+
function resetSigusr1AuthorizationIfExpired(now = Date.now()) {
|
|
83
|
+
if (sigusr1AuthorizedCount <= 0) return;
|
|
84
|
+
if (now <= sigusr1AuthorizedUntil) return;
|
|
85
|
+
sigusr1AuthorizedCount = 0;
|
|
86
|
+
sigusr1AuthorizedUntil = 0;
|
|
87
|
+
}
|
|
88
|
+
function authorizeGatewaySigusr1Restart(delayMs = 0) {
|
|
89
|
+
const delay = Math.max(0, Math.floor(delayMs));
|
|
90
|
+
const expiresAt = Date.now() + delay + SIGUSR1_AUTH_GRACE_MS;
|
|
91
|
+
sigusr1AuthorizedCount += 1;
|
|
92
|
+
if (expiresAt > sigusr1AuthorizedUntil) sigusr1AuthorizedUntil = expiresAt;
|
|
93
|
+
}
|
|
94
|
+
function consumeGatewaySigusr1RestartAuthorization() {
|
|
95
|
+
resetSigusr1AuthorizationIfExpired();
|
|
96
|
+
if (sigusr1AuthorizedCount <= 0) return false;
|
|
97
|
+
sigusr1AuthorizedCount -= 1;
|
|
98
|
+
if (sigusr1AuthorizedCount <= 0) sigusr1AuthorizedUntil = 0;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
function resetGatewayRestartStateForInProcessRestart() {
|
|
102
|
+
if (pendingRestartTimer) {
|
|
103
|
+
clearTimeout(pendingRestartTimer);
|
|
104
|
+
pendingRestartTimer = null;
|
|
105
|
+
}
|
|
106
|
+
pendingRestartCallback = null;
|
|
107
|
+
}
|
|
108
|
+
function scheduleGatewaySigusr1Restart(params) {
|
|
109
|
+
if (pendingRestartTimer) clearTimeout(pendingRestartTimer);
|
|
110
|
+
pendingRestartCallback = params.onRestart;
|
|
111
|
+
const delayMs = Math.max(0, params.delayMs ?? 0);
|
|
112
|
+
pendingRestartTimer = setTimeout(() => {
|
|
113
|
+
pendingRestartTimer = null;
|
|
114
|
+
const callback = pendingRestartCallback;
|
|
115
|
+
pendingRestartCallback = null;
|
|
116
|
+
callback?.();
|
|
117
|
+
}, delayMs);
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { authorizeGatewaySigusr1Restart, clearGatewayRestartIntentSync, consumeGatewayRestartIntentSync, consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, resetGatewayRestartStateForInProcessRestart, scheduleGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy, writeGatewayRestartIntentSync };
|
|
121
|
+
|
|
122
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","names":[],"sources":["../../../src/infra/restart.ts"],"sourcesContent":["/**\n * Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.\n */\n\nimport { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('Restart');\n\nconst SIGUSR1_AUTH_GRACE_MS = 5000;\nconst GATEWAY_RESTART_INTENT_FILENAME = 'gateway-restart-intent.json';\nconst GATEWAY_RESTART_INTENT_TTL_MS = 60_000;\n\ntype GatewayRestartIntentPayload = {\n kind: 'gateway-restart';\n pid: number;\n createdAt: number;\n};\n\nlet sigusr1AuthorizedCount = 0;\nlet sigusr1AuthorizedUntil = 0;\nlet sigusr1ExternalAllowed = false;\nlet pendingRestartTimer: ReturnType<typeof setTimeout> | null = null;\nlet pendingRestartCallback: (() => void) | null = null;\n\nfunction resolveGatewayRestartIntentPath(env: NodeJS.ProcessEnv = process.env): string {\n const stateDir = env.XOPC_STATE_DIR?.trim() || resolveStateDir();\n return path.join(stateDir, GATEWAY_RESTART_INTENT_FILENAME);\n}\n\nfunction normalizeRestartIntentPid(pid: number | undefined): number | null {\n return typeof pid === 'number' && Number.isSafeInteger(pid) && pid > 0 ? pid : null;\n}\n\nexport function writeGatewayRestartIntentSync(opts: {\n env?: NodeJS.ProcessEnv;\n targetPid?: number;\n} = {}): boolean {\n const targetPid = normalizeRestartIntentPid(opts.targetPid);\n if (targetPid === null) {\n return false;\n }\n const env = opts.env ?? process.env;\n const intentPath = resolveGatewayRestartIntentPath(env);\n const payload: GatewayRestartIntentPayload = {\n kind: 'gateway-restart',\n pid: targetPid,\n createdAt: Date.now(),\n };\n try {\n mkdirSync(path.dirname(intentPath), { recursive: true });\n writeFileSync(intentPath, `${JSON.stringify(payload)}\\n`, 'utf8');\n return true;\n } catch (err) {\n log.warn({ err }, 'Failed to write gateway restart intent');\n return false;\n }\n}\n\nexport function clearGatewayRestartIntentSync(env: NodeJS.ProcessEnv = process.env): void {\n try {\n rmSync(resolveGatewayRestartIntentPath(env));\n } catch {\n // File may not exist\n }\n}\n\nfunction parseGatewayRestartIntent(raw: string): GatewayRestartIntentPayload | null {\n try {\n const parsed = JSON.parse(raw) as Partial<GatewayRestartIntentPayload>;\n if (\n parsed.kind === 'gateway-restart' &&\n typeof parsed.pid === 'number' &&\n Number.isFinite(parsed.pid) &&\n typeof parsed.createdAt === 'number' &&\n Number.isFinite(parsed.createdAt)\n ) {\n return parsed as GatewayRestartIntentPayload;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport function consumeGatewayRestartIntentSync(\n env: NodeJS.ProcessEnv = process.env,\n now = Date.now(),\n): boolean {\n const intentPath = resolveGatewayRestartIntentPath(env);\n let raw: string;\n try {\n raw = readFileSync(intentPath, 'utf8');\n } catch {\n return false;\n } finally {\n clearGatewayRestartIntentSync(env);\n }\n const payload = parseGatewayRestartIntent(raw);\n if (!payload) {\n return false;\n }\n if (payload.pid !== process.pid) {\n return false;\n }\n const ageMs = now - payload.createdAt;\n return ageMs >= 0 && ageMs <= GATEWAY_RESTART_INTENT_TTL_MS;\n}\n\nexport function setGatewaySigusr1RestartPolicy(opts?: { allowExternal?: boolean }): void {\n sigusr1ExternalAllowed = opts?.allowExternal === true;\n}\n\nexport function isGatewaySigusr1RestartExternallyAllowed(): boolean {\n return sigusr1ExternalAllowed;\n}\n\nfunction resetSigusr1AuthorizationIfExpired(now = Date.now()): void {\n if (sigusr1AuthorizedCount <= 0) {\n return;\n }\n if (now <= sigusr1AuthorizedUntil) {\n return;\n }\n sigusr1AuthorizedCount = 0;\n sigusr1AuthorizedUntil = 0;\n}\n\nexport function authorizeGatewaySigusr1Restart(delayMs = 0): void {\n const delay = Math.max(0, Math.floor(delayMs));\n const expiresAt = Date.now() + delay + SIGUSR1_AUTH_GRACE_MS;\n sigusr1AuthorizedCount += 1;\n if (expiresAt > sigusr1AuthorizedUntil) {\n sigusr1AuthorizedUntil = expiresAt;\n }\n}\n\nexport function consumeGatewaySigusr1RestartAuthorization(): boolean {\n resetSigusr1AuthorizationIfExpired();\n if (sigusr1AuthorizedCount <= 0) {\n return false;\n }\n sigusr1AuthorizedCount -= 1;\n if (sigusr1AuthorizedCount <= 0) {\n sigusr1AuthorizedUntil = 0;\n }\n return true;\n}\n\nexport function resetGatewayRestartStateForInProcessRestart(): void {\n if (pendingRestartTimer) {\n clearTimeout(pendingRestartTimer);\n pendingRestartTimer = null;\n }\n pendingRestartCallback = null;\n}\n\nexport function scheduleGatewaySigusr1Restart(params: {\n delayMs?: number;\n reason?: string;\n onRestart: () => void;\n}): void {\n if (pendingRestartTimer) {\n clearTimeout(pendingRestartTimer);\n }\n pendingRestartCallback = params.onRestart;\n const delayMs = Math.max(0, params.delayMs ?? 0);\n pendingRestartTimer = setTimeout(() => {\n pendingRestartTimer = null;\n const callback = pendingRestartCallback;\n pendingRestartCallback = null;\n callback?.();\n }, delayMs);\n}\n"],"mappings":";;;;;;;;;kBAM2D;aACT;AAElD,MAAM,MAAM,aAAa,UAAU;AAEnC,MAAM,wBAAwB;AAC9B,MAAM,kCAAkC;AACxC,MAAM,gCAAgC;AAQtC,IAAI,yBAAyB;AAC7B,IAAI,yBAAyB;AAC7B,IAAI,yBAAyB;AAC7B,IAAI,sBAA4D;AAChE,IAAI,yBAA8C;AAElD,SAAS,gCAAgC,MAAyB,QAAQ,KAAa;CACrF,MAAM,WAAW,IAAI,gBAAgB,MAAM,IAAI,iBAAiB;AAChE,QAAO,KAAK,KAAK,UAAU,gCAAgC;;AAG7D,SAAS,0BAA0B,KAAwC;AACzE,QAAO,OAAO,QAAQ,YAAY,OAAO,cAAc,IAAI,IAAI,MAAM,IAAI,MAAM;;AAGjF,SAAgB,8BAA8B,OAG1C,EAAE,EAAW;CACf,MAAM,YAAY,0BAA0B,KAAK,UAAU;AAC3D,KAAI,cAAc,KAChB,QAAO;CAGT,MAAM,aAAa,gCADP,KAAK,OAAO,QAAQ,IACuB;CACvD,MAAM,UAAuC;EAC3C,MAAM;EACN,KAAK;EACL,WAAW,KAAK,KAAK;EACtB;AACD,KAAI;AACF,YAAU,KAAK,QAAQ,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;AACxD,gBAAc,YAAY,GAAG,KAAK,UAAU,QAAQ,CAAC,KAAK,OAAO;AACjE,SAAO;UACA,KAAK;AACZ,MAAI,KAAK,EAAE,KAAK,EAAE,yCAAyC;AAC3D,SAAO;;;AAIX,SAAgB,8BAA8B,MAAyB,QAAQ,KAAW;AACxF,KAAI;AACF,SAAO,gCAAgC,IAAI,CAAC;SACtC;;AAKV,SAAS,0BAA0B,KAAiD;AAClF,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MACE,OAAO,SAAS,qBAChB,OAAO,OAAO,QAAQ,YACtB,OAAO,SAAS,OAAO,IAAI,IAC3B,OAAO,OAAO,cAAc,YAC5B,OAAO,SAAS,OAAO,UAAU,CAEjC,QAAO;SAEH;AACN,SAAO;;AAET,QAAO;;AAGT,SAAgB,gCACd,MAAyB,QAAQ,KACjC,MAAM,KAAK,KAAK,EACP;CACT,MAAM,aAAa,gCAAgC,IAAI;CACvD,IAAI;AACJ,KAAI;AACF,QAAM,aAAa,YAAY,OAAO;SAChC;AACN,SAAO;WACC;AACR,gCAA8B,IAAI;;CAEpC,MAAM,UAAU,0BAA0B,IAAI;AAC9C,KAAI,CAAC,QACH,QAAO;AAET,KAAI,QAAQ,QAAQ,QAAQ,IAC1B,QAAO;CAET,MAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAO,SAAS,KAAK,SAAS;;AAGhC,SAAgB,+BAA+B,MAA0C;AACvF,0BAAyB,MAAM,kBAAkB;;AAGnD,SAAgB,2CAAoD;AAClE,QAAO;;AAGT,SAAS,mCAAmC,MAAM,KAAK,KAAK,EAAQ;AAClE,KAAI,0BAA0B,EAC5B;AAEF,KAAI,OAAO,uBACT;AAEF,0BAAyB;AACzB,0BAAyB;;AAG3B,SAAgB,+BAA+B,UAAU,GAAS;CAChE,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC;CAC9C,MAAM,YAAY,KAAK,KAAK,GAAG,QAAQ;AACvC,2BAA0B;AAC1B,KAAI,YAAY,uBACd,0BAAyB;;AAI7B,SAAgB,4CAAqD;AACnE,qCAAoC;AACpC,KAAI,0BAA0B,EAC5B,QAAO;AAET,2BAA0B;AAC1B,KAAI,0BAA0B,EAC5B,0BAAyB;AAE3B,QAAO;;AAGT,SAAgB,8CAAoD;AAClE,KAAI,qBAAqB;AACvB,eAAa,oBAAoB;AACjC,wBAAsB;;AAExB,0BAAyB;;AAG3B,SAAgB,8BAA8B,QAIrC;AACP,KAAI,oBACF,cAAa,oBAAoB;AAEnC,0BAAyB,OAAO;CAChC,MAAM,UAAU,KAAK,IAAI,GAAG,OAAO,WAAW,EAAE;AAChD,uBAAsB,iBAAiB;AACrC,wBAAsB;EACtB,MAAM,WAAW;AACjB,2BAAyB;AACzB,cAAY;IACX,QAAQ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
2
|
import { channelToNpmTag } from "./update-channels.js";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
4
3
|
import { access, readFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
//#region src/infra/update-check.ts
|
|
7
7
|
init_package_version();
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import {
|
|
5
|
-
import { dirname } from "node:path";
|
|
4
|
+
import { init_paths_state, resolveUpdateLockPath } from "../config/paths-state.js";
|
|
6
5
|
import { mkdir, readFile, unlink } from "node:fs/promises";
|
|
6
|
+
import { dirname } from "node:path";
|
|
7
7
|
//#region src/infra/update-lock.ts
|
|
8
8
|
init_write_file_atomic();
|
|
9
9
|
init_paths_state();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { join } from "node:path";
|
|
4
3
|
import { access, readdir, unlink } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
5
|
import { spawn } from "node:child_process";
|
|
6
6
|
//#region src/infra/update-runner.ts
|
|
7
7
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
|
-
import {
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
3
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../utils/logger.js";
|
|
5
|
-
import {
|
|
5
|
+
import { init_paths_state, resolveUpdateCheckStatePath } from "../config/paths-state.js";
|
|
6
6
|
import { acquireUpdateLock } from "./update-lock.js";
|
|
7
7
|
import { normalizeUpdateChannel } from "./update-channels.js";
|
|
8
8
|
import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "./update-check.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { chmodSync, closeSync, copyFileSync, fsyncSync, mkdirSync, openSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
4
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { chmodSync, closeSync, copyFileSync, fsyncSync, mkdirSync, openSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
5
4
|
import { chmod, copyFile, mkdir, open, rename, rm } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
6
|
//#region src/infra/write-file-atomic.ts
|
|
7
7
|
/**
|
|
8
8
|
* Durable single-file writes: temp file → fsync → rename to target.
|
|
@@ -52,10 +52,4 @@ export declare class XopcChannelBridge {
|
|
|
52
52
|
inputPreview: string;
|
|
53
53
|
}): Promise<void>;
|
|
54
54
|
}
|
|
55
|
-
export declare function serveXopcChannelMcp(opts: {
|
|
56
|
-
gatewayUrl?: string;
|
|
57
|
-
gatewayToken?: string;
|
|
58
|
-
claudeChannelMode?: ClaudeChannelMode;
|
|
59
|
-
verbose?: boolean;
|
|
60
|
-
}): Promise<void>;
|
|
61
55
|
export declare function loadMcpServeConfig(): Config;
|
|
@@ -153,14 +153,10 @@ var XopcChannelBridge = class {
|
|
|
153
153
|
}
|
|
154
154
|
async handleClaudePermissionRequest(_params) {}
|
|
155
155
|
};
|
|
156
|
-
async function serveXopcChannelMcp(opts) {
|
|
157
|
-
const { serveXopcChannelMcpImpl } = await import("./channel-server.js");
|
|
158
|
-
await serveXopcChannelMcpImpl(opts);
|
|
159
|
-
}
|
|
160
156
|
function loadMcpServeConfig() {
|
|
161
157
|
return loadConfig();
|
|
162
158
|
}
|
|
163
159
|
//#endregion
|
|
164
|
-
export { XopcChannelBridge, loadMcpServeConfig
|
|
160
|
+
export { XopcChannelBridge, loadMcpServeConfig };
|
|
165
161
|
|
|
166
162
|
//# sourceMappingURL=channel-bridge.js.map
|